Imported Upstream version 4.3 upstream/4.3
authorJinWang An <jinwang.an@samsung.com>
Tue, 28 Dec 2021 06:15:18 +0000 (15:15 +0900)
committerJinWang An <jinwang.an@samsung.com>
Tue, 28 Dec 2021 06:15:18 +0000 (15:15 +0900)
506 files changed:
AUTHORS
Basic.mk [new file with mode: 0644]
ChangeLog
INSTALL [deleted file]
Makefile.DOS [deleted file]
Makefile.am
Makefile.ami [deleted file]
Makefile.in
NEWS
NMakefile [deleted file]
README
README.Amiga
README.DOS
README.OS2
README.W32
README.customs
SCOPTIONS
SMakefile [deleted file]
acinclude.m4 [deleted file]
aclocal.m4
alloca.c [deleted file]
amiga.c [deleted file]
amiga.h [deleted file]
ar.c [deleted file]
arscan.c [deleted file]
build-aux/compile [new file with mode: 0755]
build-aux/config.guess [new file with mode: 0755]
build-aux/config.rpath [new file with mode: 0755]
build-aux/config.sub [new file with mode: 0755]
build-aux/depcomp [new file with mode: 0755]
build-aux/install-sh [new file with mode: 0755]
build-aux/mdate-sh [new file with mode: 0755]
build-aux/missing [new file with mode: 0755]
build-aux/texinfo.tex [new file with mode: 0644]
build.cfg.in [new file with mode: 0644]
build.sh [new file with mode: 0755]
build.sh.in [deleted file]
build_w32.bat
builddos.bat [new file with mode: 0644]
commands.c [deleted file]
commands.h [deleted file]
config.ami [deleted file]
config.h-vms [deleted file]
config.h.W32 [deleted file]
config.h.in [deleted file]
config/Makefile.am [deleted file]
config/Makefile.in [deleted file]
config/ar-lib [deleted file]
config/compile [deleted file]
config/config.guess [deleted file]
config/config.rpath [deleted file]
config/config.sub [deleted file]
config/depcomp [deleted file]
config/dospaths.m4 [deleted file]
config/gettext.m4 [deleted file]
config/iconv.m4 [deleted file]
config/install-sh [deleted file]
config/intlmacosx.m4 [deleted file]
config/lib-ld.m4 [deleted file]
config/lib-link.m4 [deleted file]
config/lib-prefix.m4 [deleted file]
config/longlong.m4 [deleted file]
config/mdate-sh [deleted file]
config/missing [deleted file]
config/nls.m4 [deleted file]
config/po.m4 [deleted file]
config/progtest.m4 [deleted file]
config/texinfo.tex [deleted file]
configh.dos [deleted file]
configure
configure.ac
configure.bat [deleted file]
debug.h [deleted file]
default.c [deleted file]
dep.h [deleted file]
dir.c [deleted file]
doc/Makefile.am
doc/Makefile.in
doc/fdl.texi
doc/make.1 [new file with mode: 0644]
doc/make.info
doc/make.info-1
doc/make.info-2
doc/make.texi
doc/stamp-vti
doc/version.texi
dosbuild.bat [deleted file]
expand.c [deleted file]
file.c [deleted file]
filedef.h [deleted file]
function.c [deleted file]
getloadavg.c [deleted file]
getopt.c [deleted file]
getopt.h [deleted file]
getopt1.c [deleted file]
gettext.h [deleted file]
glob/COPYING.LIB [deleted file]
glob/ChangeLog [deleted file]
glob/Makefile.am [deleted file]
glob/Makefile.ami [deleted file]
glob/Makefile.in [deleted file]
glob/SCOPTIONS [deleted file]
glob/SMakefile [deleted file]
glob/configure.bat [deleted file]
glob/fnmatch.c [deleted file]
glob/fnmatch.h [deleted file]
glob/glob.c [deleted file]
glob/glob.h [deleted file]
gmk-default.h [deleted file]
gmk-default.scm [deleted file]
gnumake.h [deleted file]
guile.c [deleted file]
hash.c [deleted file]
hash.h [deleted file]
implicit.c [deleted file]
job.c [deleted file]
job.h [deleted file]
lib/Makefile.am [new file with mode: 0644]
lib/Makefile.in [new file with mode: 0644]
lib/_Noreturn.h [new file with mode: 0644]
lib/access.c [new file with mode: 0644]
lib/alloca.c [new file with mode: 0644]
lib/alloca.in.h [new file with mode: 0644]
lib/arg-nonnull.h [new file with mode: 0644]
lib/basename-lgpl.c [new file with mode: 0644]
lib/c++defs.h [new file with mode: 0644]
lib/close.c [new file with mode: 0644]
lib/concat-filename.c [new file with mode: 0644]
lib/concat-filename.h [new file with mode: 0644]
lib/dirname-lgpl.c [new file with mode: 0644]
lib/dirname.h [new file with mode: 0644]
lib/dosname.h [new file with mode: 0644]
lib/dup2.c [new file with mode: 0644]
lib/errno.in.h [new file with mode: 0644]
lib/error.c [new file with mode: 0644]
lib/error.h [new file with mode: 0644]
lib/exitfail.c [new file with mode: 0644]
lib/exitfail.h [new file with mode: 0644]
lib/fcntl.c [new file with mode: 0644]
lib/fcntl.in.h [new file with mode: 0644]
lib/fd-hook.c [new file with mode: 0644]
lib/fd-hook.h [new file with mode: 0644]
lib/filename.h [new file with mode: 0644]
lib/findprog-in.c [new file with mode: 0644]
lib/findprog.h [new file with mode: 0644]
lib/fnmatch.c [new file with mode: 0644]
lib/fnmatch.in.h [new file with mode: 0644]
lib/getdtablesize.c [new file with mode: 0644]
lib/getloadavg.c [new file with mode: 0644]
lib/getprogname.c [new file with mode: 0644]
lib/getprogname.h [new file with mode: 0644]
lib/gettext.h [new file with mode: 0644]
lib/glob.c [new file with mode: 0644]
lib/glob.in.h [new file with mode: 0644]
lib/intprops.h [new file with mode: 0644]
lib/limits.in.h [new file with mode: 0644]
lib/malloc.c [new file with mode: 0644]
lib/msvc-inval.c [new file with mode: 0644]
lib/msvc-inval.h [new file with mode: 0644]
lib/msvc-nothrow.c [new file with mode: 0644]
lib/msvc-nothrow.h [new file with mode: 0644]
lib/stdbool.in.h [new file with mode: 0644]
lib/stddef.in.h [new file with mode: 0644]
lib/stdint.in.h [new file with mode: 0644]
lib/stdio.in.h [new file with mode: 0644]
lib/stdlib.in.h [new file with mode: 0644]
lib/stpcpy.c [new file with mode: 0644]
lib/strerror-override.c [new file with mode: 0644]
lib/strerror-override.h [new file with mode: 0644]
lib/strerror.c [new file with mode: 0644]
lib/string.in.h [new file with mode: 0644]
lib/stripslash.c [new file with mode: 0644]
lib/sys_types.in.h [new file with mode: 0644]
lib/unistd.c [new file with mode: 0644]
lib/unistd.in.h [new file with mode: 0644]
lib/verify.h [new file with mode: 0644]
lib/warn-on-use.h [new file with mode: 0644]
lib/xalloc-die.c [new file with mode: 0644]
lib/xalloc-oversized.h [new file with mode: 0644]
lib/xalloc.h [new file with mode: 0644]
lib/xconcat-filename.c [new file with mode: 0644]
lib/xmalloc.c [new file with mode: 0644]
load.c [deleted file]
loadapi.c [deleted file]
m4/00gnulib.m4 [new file with mode: 0644]
m4/absolute-header.m4 [new file with mode: 0644]
m4/access.m4 [new file with mode: 0644]
m4/acinclude.m4 [new file with mode: 0644]
m4/alloca.m4 [new file with mode: 0644]
m4/asm-underscore.m4 [new file with mode: 0644]
m4/close.m4 [new file with mode: 0644]
m4/dirname.m4 [new file with mode: 0644]
m4/dospaths.m4 [new file with mode: 0644]
m4/double-slash-root.m4 [new file with mode: 0644]
m4/dup2.m4 [new file with mode: 0644]
m4/eaccess.m4 [new file with mode: 0644]
m4/errno_h.m4 [new file with mode: 0644]
m4/error.m4 [new file with mode: 0644]
m4/extensions.m4 [new file with mode: 0644]
m4/extern-inline.m4 [new file with mode: 0644]
m4/fcntl-o.m4 [new file with mode: 0644]
m4/fcntl.m4 [new file with mode: 0644]
m4/fcntl_h.m4 [new file with mode: 0644]
m4/findprog-in.m4 [new file with mode: 0644]
m4/getdtablesize.m4 [new file with mode: 0644]
m4/getloadavg.m4 [new file with mode: 0644]
m4/getprogname.m4 [new file with mode: 0644]
m4/gettext.m4 [new file with mode: 0644]
m4/gnulib-cache.m4 [new file with mode: 0644]
m4/gnulib-common.m4 [new file with mode: 0644]
m4/gnulib-comp.m4 [new file with mode: 0644]
m4/host-cpu-c-abi.m4 [new file with mode: 0644]
m4/iconv.m4 [new file with mode: 0644]
m4/include_next.m4 [new file with mode: 0644]
m4/intlmacosx.m4 [new file with mode: 0644]
m4/lib-ld.m4 [new file with mode: 0644]
m4/lib-link.m4 [new file with mode: 0644]
m4/lib-prefix.m4 [new file with mode: 0644]
m4/limits-h.m4 [new file with mode: 0644]
m4/longlong.m4 [new file with mode: 0644]
m4/malloc.m4 [new file with mode: 0644]
m4/msvc-inval.m4 [new file with mode: 0644]
m4/msvc-nothrow.m4 [new file with mode: 0644]
m4/multiarch.m4 [new file with mode: 0644]
m4/nls.m4 [new file with mode: 0644]
m4/off_t.m4 [new file with mode: 0644]
m4/po.m4 [new file with mode: 0644]
m4/progtest.m4 [new file with mode: 0644]
m4/ssize_t.m4 [new file with mode: 0644]
m4/stdbool.m4 [new file with mode: 0644]
m4/stddef_h.m4 [new file with mode: 0644]
m4/stdint.m4 [new file with mode: 0644]
m4/stdio_h.m4 [new file with mode: 0644]
m4/stdlib_h.m4 [new file with mode: 0644]
m4/stpcpy.m4 [new file with mode: 0644]
m4/strerror.m4 [new file with mode: 0644]
m4/string_h.m4 [new file with mode: 0644]
m4/sys_socket_h.m4 [new file with mode: 0644]
m4/sys_types_h.m4 [new file with mode: 0644]
m4/unistd_h.m4 [new file with mode: 0644]
m4/warn-on-use.m4 [new file with mode: 0644]
m4/wchar_t.m4 [new file with mode: 0644]
m4/wint_t.m4 [new file with mode: 0644]
m4/xalloc.m4 [new file with mode: 0644]
main.c [deleted file]
make.1 [deleted file]
make.lnk [deleted file]
make_msvc_net2003.sln [deleted file]
make_msvc_net2003.vcproj [deleted file]
makefile.com
makefile.vms [deleted file]
makeint.h [deleted file]
misc.c [deleted file]
mk/Amiga.mk [new file with mode: 0644]
mk/VMS.mk [new file with mode: 0644]
mk/Windows32.mk [new file with mode: 0644]
mk/msdosdjgpp.mk [new file with mode: 0644]
os.h [deleted file]
output.c [deleted file]
output.h [deleted file]
po/LINGUAS
po/Makevars
po/POTFILES.in
po/be.gmo
po/be.po
po/bg.gmo [new file with mode: 0644]
po/bg.po [new file with mode: 0644]
po/cs.gmo
po/cs.po
po/da.gmo
po/da.po
po/de.gmo
po/de.po
po/es.gmo
po/es.po
po/fi.gmo
po/fi.po
po/fr.gmo
po/fr.po
po/ga.gmo
po/ga.po
po/gl.gmo
po/gl.po
po/he.gmo
po/he.po
po/hr.gmo
po/hr.po
po/id.gmo
po/id.po
po/it.gmo
po/it.po
po/ja.gmo
po/ja.po
po/ko.gmo
po/ko.po
po/lt.gmo
po/lt.po
po/make.pot
po/nl.gmo
po/nl.po
po/pl.gmo
po/pl.po
po/pt.gmo [new file with mode: 0644]
po/pt.po [new file with mode: 0644]
po/pt_BR.gmo
po/pt_BR.po
po/ru.gmo
po/ru.po
po/sr.gmo [new file with mode: 0644]
po/sr.po [new file with mode: 0644]
po/sv.gmo
po/sv.po
po/tr.gmo
po/tr.po
po/uk.gmo
po/uk.po
po/vi.gmo
po/vi.po
po/zh_CN.gmo
po/zh_CN.po
po/zh_TW.gmo [new file with mode: 0644]
po/zh_TW.po [new file with mode: 0644]
posixos.c [deleted file]
read.c [deleted file]
remake.c [deleted file]
remote-cstms.c [deleted file]
remote-stub.c [deleted file]
rule.c [deleted file]
rule.h [deleted file]
signame.c [deleted file]
src/amiga.c [new file with mode: 0644]
src/amiga.h [new file with mode: 0644]
src/ar.c [new file with mode: 0644]
src/arscan.c [new file with mode: 0644]
src/commands.c [new file with mode: 0644]
src/commands.h [new file with mode: 0644]
src/config.ami [new file with mode: 0644]
src/config.h-vms [new file with mode: 0644]
src/config.h.W32 [new file with mode: 0644]
src/config.h.in [new file with mode: 0644]
src/configh.dos [new file with mode: 0644]
src/debug.h [new file with mode: 0644]
src/default.c [new file with mode: 0644]
src/dep.h [new file with mode: 0644]
src/dir.c [new file with mode: 0644]
src/expand.c [new file with mode: 0644]
src/file.c [new file with mode: 0644]
src/filedef.h [new file with mode: 0644]
src/function.c [new file with mode: 0644]
src/getopt.c [new file with mode: 0644]
src/getopt.h [new file with mode: 0644]
src/getopt1.c [new file with mode: 0644]
src/gettext.h [new file with mode: 0644]
src/gmk-default.h [new file with mode: 0644]
src/gmk-default.scm [new file with mode: 0644]
src/gnumake.h [new file with mode: 0644]
src/guile.c [new file with mode: 0644]
src/hash.c [new file with mode: 0644]
src/hash.h [new file with mode: 0644]
src/implicit.c [new file with mode: 0644]
src/job.c [new file with mode: 0644]
src/job.h [new file with mode: 0644]
src/load.c [new file with mode: 0644]
src/loadapi.c [new file with mode: 0644]
src/main.c [new file with mode: 0644]
src/makeint.h [new file with mode: 0644]
src/misc.c [new file with mode: 0644]
src/os.h [new file with mode: 0644]
src/output.c [new file with mode: 0644]
src/output.h [new file with mode: 0644]
src/posixos.c [new file with mode: 0644]
src/read.c [new file with mode: 0644]
src/remake.c [new file with mode: 0644]
src/remote-cstms.c [new file with mode: 0644]
src/remote-stub.c [new file with mode: 0644]
src/rule.c [new file with mode: 0644]
src/rule.h [new file with mode: 0644]
src/signame.c [new file with mode: 0644]
src/strcache.c [new file with mode: 0644]
src/variable.c [new file with mode: 0644]
src/variable.h [new file with mode: 0644]
src/version.c [new file with mode: 0644]
src/vms_exit.c [new file with mode: 0644]
src/vms_export_symbol.c [new file with mode: 0644]
src/vms_progname.c [new file with mode: 0644]
src/vmsdir.h [new file with mode: 0644]
src/vmsfunctions.c [new file with mode: 0644]
src/vmsify.c [new file with mode: 0644]
src/vmsjobs.c [new file with mode: 0644]
src/vpath.c [new file with mode: 0644]
src/w32/compat/dirent.c [new file with mode: 0644]
src/w32/compat/posixfcn.c [new file with mode: 0644]
src/w32/include/dirent.h [new file with mode: 0644]
src/w32/include/dlfcn.h [new file with mode: 0644]
src/w32/include/pathstuff.h [new file with mode: 0644]
src/w32/include/sub_proc.h [new file with mode: 0644]
src/w32/include/w32err.h [new file with mode: 0644]
src/w32/pathstuff.c [new file with mode: 0644]
src/w32/subproc/misc.c [new file with mode: 0644]
src/w32/subproc/proc.h [new file with mode: 0644]
src/w32/subproc/sub_proc.c [new file with mode: 0644]
src/w32/subproc/w32err.c [new file with mode: 0644]
src/w32/w32os.c [new file with mode: 0644]
strcache.c [deleted file]
subproc.bat [deleted file]
tests/COPYING [deleted file]
tests/ChangeLog.1 [deleted file]
tests/NEWS [deleted file]
tests/README
tests/config-flags.pm [deleted file]
tests/config-flags.pm.W32 [new file with mode: 0644]
tests/config-flags.pm.in
tests/config_flags_pm.com
tests/mkshadow
tests/run_make_tests.bat [new file with mode: 0644]
tests/run_make_tests.com [deleted file]
tests/run_make_tests.pl
tests/scripts/features/archives
tests/scripts/features/echoing
tests/scripts/features/errors
tests/scripts/features/escape
tests/scripts/features/exec [new file with mode: 0644]
tests/scripts/features/grouped_targets [new file with mode: 0644]
tests/scripts/features/include
tests/scripts/features/jobserver
tests/scripts/features/load
tests/scripts/features/loadapi
tests/scripts/features/output-sync
tests/scripts/features/parallelism
tests/scripts/features/patternrules
tests/scripts/features/quoting
tests/scripts/features/recursion
tests/scripts/features/reinvoke
tests/scripts/features/se_explicit
tests/scripts/features/se_implicit
tests/scripts/features/suffixrules [new file with mode: 0644]
tests/scripts/features/targetvars
tests/scripts/features/vpath2
tests/scripts/features/vpathplus
tests/scripts/functions/abspath
tests/scripts/functions/file
tests/scripts/functions/foreach
tests/scripts/functions/guile
tests/scripts/functions/realpath
tests/scripts/functions/shell
tests/scripts/functions/wildcard
tests/scripts/misc/bs-nl
tests/scripts/misc/close_stdout
tests/scripts/misc/general3
tests/scripts/misc/general4
tests/scripts/options/dash-C
tests/scripts/options/dash-I
tests/scripts/options/dash-k
tests/scripts/options/dash-l
tests/scripts/options/dash-n
tests/scripts/options/dash-s [new file with mode: 0644]
tests/scripts/options/eval
tests/scripts/options/general
tests/scripts/options/symlinks
tests/scripts/targets/DEFAULT
tests/scripts/targets/FORCE
tests/scripts/targets/INTERMEDIATE
tests/scripts/targets/ONESHELL
tests/scripts/targets/PHONY
tests/scripts/targets/POSIX
tests/scripts/targets/SECONDARY
tests/scripts/targets/SILENT
tests/scripts/targets/clean
tests/scripts/variables/CURDIR
tests/scripts/variables/EXTRA_PREREQS [new file with mode: 0644]
tests/scripts/variables/MAKEFILES
tests/scripts/variables/MFILE_LIST
tests/scripts/variables/SHELL
tests/scripts/variables/automatic
tests/scripts/variables/flavors
tests/scripts/variables/negative
tests/scripts/vms/library
tests/test_driver.pl
tests/thelp.pl [new file with mode: 0755]
variable.c [deleted file]
variable.h [deleted file]
version.c [deleted file]
vms_exit.c [deleted file]
vms_export_symbol.c [deleted file]
vms_progname.c [deleted file]
vmsdir.h [deleted file]
vmsfunctions.c [deleted file]
vmsify.c [deleted file]
vmsjobs.c [deleted file]
vpath.c [deleted file]
w32/Makefile.am [deleted file]
w32/Makefile.in [deleted file]
w32/compat/dirent.c [deleted file]
w32/compat/posixfcn.c [deleted file]
w32/include/dirent.h [deleted file]
w32/include/dlfcn.h [deleted file]
w32/include/pathstuff.h [deleted file]
w32/include/sub_proc.h [deleted file]
w32/include/w32err.h [deleted file]
w32/pathstuff.c [deleted file]
w32/subproc/NMakefile [deleted file]
w32/subproc/misc.c [deleted file]
w32/subproc/proc.h [deleted file]
w32/subproc/sub_proc.c [deleted file]
w32/subproc/w32err.c [deleted file]
w32/w32os.c [deleted file]

diff --git a/AUTHORS b/AUTHORS
index 9b6212f33cbd7fce47b07861e177e595fac06c1f..dc9127e468eca691ae18c2901884d8ca2bd0ce41 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -67,12 +67,14 @@ Other contributors:
   David A. Wheeler <dwheeler@dwheeler.com>
   David Boyce <dsb@boyski.com>
   Frank Heckenbach <f.heckenbach@fh-soft.de>
+  Kaz Kylheku <kaz@kylheku.com>
+  Christof Warlich <cwarlich@gmx.de>
 
 With suggestions/comments/bug reports from a cast of ... well ...
 hundreds, anyway :)
 
 -------------------------------------------------------------------------------
-Copyright (C) 1997-2016 Free Software Foundation, Inc.
+Copyright (C) 1997-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
diff --git a/Basic.mk b/Basic.mk
new file mode 100644 (file)
index 0000000..3de3d3f
--- /dev/null
+++ b/Basic.mk
@@ -0,0 +1,246 @@
+# Basic GNU -*-Makefile-*- to build GNU make
+#
+# NOTE:
+# If you have no 'make' program at all to process this makefile:
+#   * On Windows, run ".\buildw32.bat" to bootstrap one.
+#   * On MS-DOS, run ".\builddos.bat" to bootstrap one.
+#
+# Once you have a GNU make program created, you can use it with this makefile
+# to keep it up to date if you make changes, as:
+#
+#   make.exe -f Basic.mk
+#
+# Copyright (C) 2017-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+all:
+
+src = src/
+lib = lib/
+
+make_SOURCES = $(src)ar.c $(src)arscan.c $(src)commands.c $(src)default.c $(src)dir.c $(src)expand.c $(src)file.c $(src)function.c $(src)getopt.c $(src)getopt1.c $(src)guile.c $(src)hash.c $(src)implicit.c $(src)job.c $(src)load.c $(src)loadapi.c $(src)main.c $(src)misc.c $(src)output.c $(src)read.c $(src)remake.c $(src)rule.c $(src)signame.c $(src)strcache.c $(src)variable.c $(src)version.c $(src)vpath.c
+glob_SOURCES = $(lib)fnmatch.c $(lib)glob.c
+loadavg_SOURCES = $(lib)getloadavg.c
+alloca_SOURCES = $(lib)alloca.c
+w32_SOURCES = $(src)w32/pathstuff.c $(src)w32/w32os.c $(src)w32/compat/dirent.c $(src)w32/compat/posixfcn.c $(src)w32/subproc/misc.c $(src)w32/subproc/sub_proc.c $(src)w32/subproc/w32err.c
+vms_SOURCES = $(src)vms_exit.c $(src)vms_export_symbol.c $(src)vms_progname.c $(src)vmsfunctions.c $(src)vmsify.c
+amiga_SOURCES = $(src)amiga.c
+
+posix_SOURCES = $(src)posixos.c
+remote_SOURCES = $(src)remote-stub.c
+
+OUTDIR =
+SRCDIR = .
+
+OBJEXT = o
+EXEEXT =
+
+PREFIX = /usr/local
+INCLUDEDIR = $(PREFIX)/include
+LIBDIR = $(PREFIX)/lib
+LOCALEDIR = $(PREFIX)/share
+
+PROG = $(OUTDIR)make$(EXEEXT)
+
+prog_SOURCES = $(make_SOURCES) $(remote_SOURCES)
+
+BUILT_SOURCES =
+
+OBJECTS = $(patsubst %.c,$(OUTDIR)%.$(OBJEXT),$(prog_SOURCES))
+
+OBJDIRS = $(addsuffix .,$(sort $(dir $(OBJECTS))))
+
+# Use the default value of CC
+LD = $(CC)
+
+# Reserved for command-line override
+CPPFLAGS =
+CFLAGS = -g -O2
+LDFLAGS =
+
+extra_CPPFLAGS = -DHAVE_CONFIG_H -I$(OUTDIR)src -I$(SRCDIR)/src -I$(OUTDIR)lib -I$(SRCDIR)/lib \
+       -DLIBDIR=\"$(LIBDIR)\" -DINCLUDEDIR=\"$(INCLUDEDIR)\" -DLOCALEDIR=\"$(LOCALDIR)\"
+extra_CFLAGS =
+extra_LDFLAGS = $(extra_CFLAGS) $(CFLAGS)
+
+C_SOURCE = -c
+OUTPUT_OPTION = -o $@
+LINK_OUTPUT = -o $@
+
+# Command lines
+
+# $(call COMPILE.cmd,<src>,<tgt>)
+COMPILE.cmd = $(CC) $(extra_CFLAGS) $(CFLAGS) $(extra_CPPFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $(OUTPUT_OPTION) $(C_SOURCE) $1
+
+# $(call LINK.cmd,<objectlist>)
+LINK.cmd = $(LD) $(extra_LDFLAGS) $(LDFLAGS) $(TARGET_ARCH) $1 $(LDLIBS) $(LINK_OUTPUT)
+
+# $(CHECK.cmd)
+CHECK.cmd = cd $(SRCDIR)/tests && ./run_make_tests -make $(shell cd $(<D) && pwd)/$(<F)
+
+# $(call MKDIR.cmd,<dirlist>)
+MKDIR.cmd = mkdir -p $1
+
+# $(call RM.cmd,<filelist>)
+RM.cmd = rm -f $1
+
+# $(call CP.cmd,<from>,<to>)
+CP.cmd = cp $1 $2
+
+CLEANSPACE = $(call RM.cmd,$(OBJECTS) $(PROG) $(BUILT_SOURCES))
+
+# Load overrides for the above variables.
+include $(firstword $(wildcard $(SRCDIR)/mk/$(lastword $(subst -, ,$(MAKE_HOST)).mk) $(OUTDIR)mk/Posix.mk $(SRCDIR)/mk/Posix.mk))
+
+VERSION = 4.3
+
+VPATH = $(SRCDIR)
+
+all: $(PROG)
+
+$(PROG): $(OBJECTS)
+       $(call LINK.cmd,$^)
+
+$(OBJECTS): $(OUTDIR)%.$(OBJEXT): %.c
+       $(call COMPILE.cmd,$<)
+
+$(OBJECTS): | $(OBJDIRS) $(BUILT_SOURCES)
+
+$(OBJDIRS):
+       $(call MKDIR.cmd,$@)
+
+check:
+       $(CHECK.cmd)
+
+clean:
+       $(CLEANSPACE)
+
+$(filter %.h,$(BUILT_SOURCES)): %.h : %.in.h
+       $(call RM.cmd,$@)
+       $(call CP.cmd,$<,$@)
+
+.PHONY: all check clean
+
+# --------------- DEPENDENCIES
+#
+
+# src/.deps/amiga.Po
+# dummy
+
+# src/.deps/ar.Po
+# dummy
+
+# src/.deps/arscan.Po
+# dummy
+
+# src/.deps/commands.Po
+# dummy
+
+# src/.deps/default.Po
+# dummy
+
+# src/.deps/dir.Po
+# dummy
+
+# src/.deps/expand.Po
+# dummy
+
+# src/.deps/file.Po
+# dummy
+
+# src/.deps/function.Po
+# dummy
+
+# src/.deps/getopt.Po
+# dummy
+
+# src/.deps/getopt1.Po
+# dummy
+
+# src/.deps/guile.Po
+# dummy
+
+# src/.deps/hash.Po
+# dummy
+
+# src/.deps/implicit.Po
+# dummy
+
+# src/.deps/job.Po
+# dummy
+
+# src/.deps/load.Po
+# dummy
+
+# src/.deps/loadapi.Po
+# dummy
+
+# src/.deps/main.Po
+# dummy
+
+# src/.deps/misc.Po
+# dummy
+
+# src/.deps/output.Po
+# dummy
+
+# src/.deps/posixos.Po
+# dummy
+
+# src/.deps/read.Po
+# dummy
+
+# src/.deps/remake.Po
+# dummy
+
+# src/.deps/remote-cstms.Po
+# dummy
+
+# src/.deps/remote-stub.Po
+# dummy
+
+# src/.deps/rule.Po
+# dummy
+
+# src/.deps/signame.Po
+# dummy
+
+# src/.deps/strcache.Po
+# dummy
+
+# src/.deps/variable.Po
+# dummy
+
+# src/.deps/version.Po
+# dummy
+
+# src/.deps/vms_exit.Po
+# dummy
+
+# src/.deps/vms_export_symbol.Po
+# dummy
+
+# src/.deps/vms_progname.Po
+# dummy
+
+# src/.deps/vmsfunctions.Po
+# dummy
+
+# src/.deps/vmsify.Po
+# dummy
+
+# src/.deps/vpath.Po
+# dummy
index 3dee3b6339e1b73efb9cff1f758b4fa64f28d5ca..dce824b09cd6924dc91292844c7c1e263aeb359b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
+2020-01-19  Paul Smith  <psmith@gnu.org>
+
+       GNU Make release 4.3
+       * NEWS: Update for the release
+       * configure.ac: New release number
+       * doc/make.texi: New edition number
+
+       * configure.ac (guile): Check for Guile 3.0 installations
+
+       * src/job.c (sh_cmds): [SV 57625] Update builtin shell command list
+
+       Resolve some documentation issues
+       * doc/make.texi (Interrupts): [SV 46193] Recommend defensive recipes
+       * doc/make.texi: [SV 49262] Clarify interaction of prerequisites and
+       non-terminal match-anything rules.
+
+2020-01-19  Paul Smith  <psmith@gnu.org>
+
+       [SV 40657] Reinstate old behavior for suffix rules with prereqs
+       POSIX says that suffix rules cannot have prerequisites, but after
+       making this change we observed a number of makefiles "in the wild"
+       that were relying on this behavior and failed.
+
+       For .POSIX: makefiles, obey POSIX.  Otherwise preserve the old
+       behavior.  However, generate a warning so users know this is a
+       problem.  In a future version we will change all behavior to be
+       POSIX-conforming.
+
+       * NEWS: describe the change
+       * src/rule.c (convert_to_pattern): If posix_pedantic don't make a
+       pattern rule if prereqs exist.  Otherwise show a warning.
+       * tests/scripts/features/suffixrules: Add tests for the new behavior
+       including .POSIX vs. non-.POSIX.
+
+2020-01-05  Dmitry Goncharov  <dgoncharov@users.sf.net>
+
+       * tests/test_driver.pl: Enhance error messages
+
+2020-01-04  Paul Smith  <psmith@gnu.org>
+
+       * doc/make.texi: Change the GFDL to an Appendix
+
+       * NEWS: Clarify authorship of new features.
+
+       Enable compilation with C90 compilers
+       * configure.ac: Try compiling Guile headers: they don't work with C90.
+       * maintMakefile: Simplify config checks via target-specific variables.
+       * src/makeint.h: Use ATTRIBUTE rather than defining __attribute__,
+       as that causes compile issues with system headers.
+       (ENUM_BITFIELD): Don't use enum bitfields in ANSI mode.
+       * src/main.c: Use ATTRIBUTE instead of __attribute__.
+       * src/job.h: Ditto.
+       * src/file.c: Don't define variables inside for loops.
+       * src/rule.c: Ditto.
+       * src/dep.h (SI): Only use static inline in non-ANSI mode.
+
+2020-01-03  Paul Smith  <psmith@gnu.org>
+
+       * bootstrap: Update to the latest gnulib version
+
+       Release GNU make 4.2.93
+       * NEWS: Update the release and date
+       * configure.ac: Update the release number
+
+       Update copyright statements for 2020
+
+2020-01-03  Paul Smith  <psmith@gnu.org>
+
+       Support the .EXTRA_PREREQS special variable
+       Initial implementation by Christof Warlich <cwarlich@gmx.de>
+
+       * NEWS: Announce the new feature.
+       * doc/make.texi (Other Special Variables): Document .EXTRA_PREREQS.
+       * src/dep.h (struct dep): New flag to note extra prereq deps.
+       * src/filedef.h (expand_extra_prereqs): Declare a function to expand
+       the value of .EXTRA_PREREQS.
+       * src/file.c (expand_extra_prereqs): Given a struct variable lookup
+       of .EXTRA_PREREQS, convert it into a list of deps and for each one
+       make sure it has a struct file and has the new flag set.
+       (snap_file): A new function invoked by hash_map that will perform
+       per-file operations: set up second expansion, intermediate, and also
+       .EXTRA_PREREQS.  Manage circular dependencies by ignoring them.
+       (snap_deps): Defer per-file operations until the end.  Look up the
+       global .EXTRA_PREREQS and pass it along to snap_file for each file.
+       * src/implicit.c (struct patdeps): Remember the extra prereqs flag.
+       (pattern_search): Transfer extra prereqs flag settings into the
+       matched pattern rule.
+       * src/rule.h (snap_implicit_rules): Rename count_implicit_rules to
+       snap_implicit_rules since we now do more than count.
+       * src/rule.c (snap_implicit_rules): As we walk through all the pattern
+       rules, add in any global .EXTRA_PREREQS to the dep list.  Ensure we
+       take them into account for the max number of prereqs and name length.
+       * src/main.c (main): Add extra-prereqs to .FEATURES.
+       Call the renamed snap_implicit_rules.
+       * tests/scripts/variables/EXTRA_PREREQS: Add tests.
+
+2020-01-03  Paul Smith  <psmith@gnu.org>
+
+       * tests/scripts/features/patternrules: Use Windows-compatible quoting
+
+       * tests/test_driver.pl: Compute full path to Perl interpreter
+
+       * tests/scripts/features/exec: Don't use $ENV in the description
+
+       * src/makeint.h: Add a declaration for memrchr()
+
+2019-12-27  Paul Smith  <psmith@gnu.org>
+
+       * NEWS: Remove info about disabled /proc/loadavg usage.
+
+2019-12-27  Paul Smith  <psmith@gnu.org>
+
+       [SV 57022] Avoid posix_spawn which fails asynchronously
+       Avoid using posix_spawn implementations that fail asynchronously when
+       the spawned program can't be invoked: this means instead of getting
+       an error such as "No such file or directory" we get just "Exit 127".
+
+       Original implementation of the configure.ac macro provided by
+       Martin Dorey <martin.dorey@hds.com>
+
+       Original implementation of the regression tests provided by
+       Dmitry Goncharov <dgoncharov@users.sf.net>
+
+       * configure.ac: Test whether posix_spawn fails asynchronously.  In a
+       cross-compilation environment, assume that it does not.  If we detect
+       that it does, fall back to fork/exec.
+       * tests/scripts/features/exec: Add regression tests for different
+       shebang invocation methods.
+
+2019-12-26  Paul Smith  <psmith@gnu.org>
+
+       [SV 56655] Allow pattern expansion to contain spaces
+       * src/dep.h: Add a new flag PARSEFS_ONEWORD
+       * src/read.c (parse_file_seq): If PARSEFS_ONEWORD is given, treat the
+       entire incoming string as a single pattern.
+       * src/implicit.c (pattern_search): Pass PARSEFS_ONEWORD when parsing
+       patterns for wildcards.
+       * tests/scripts/features/patternrules: Add a new test.
+
+2019-12-18  Ben Wijen  <ben@wijen.net>
+
+       * src/misc.c (spin): On WINDOWS32 use Sleep() instead of sleep()
+
+       * bootstrap.bat: Fix typo in batch file name
+
+2019-12-18  Paul Smith  <psmith@gnu.org>
+
+       * src/config.h.W32.template: [SV 57152] MinGW32 doesn't support d_type
+
+2019-12-18  Jouke Witteveen  <j.witteveen@gmail.com>
+
+       [SV 54161] Fix second expansion of $* for paths
+       If the stem matches a path containing a directory not just a
+       filename, make sure the second expansion of $* in the
+       prerequisites matches $* in the recipe.  This requires using
+       $(*F) when replacing % in the first expansion to preserve the
+       simple filename.
+
+       * src/implicit.c (pattern_search): If lastslash is set prepend
+       the directory onto the stem.  Then use $(*F) when expanding %.
+       * tests/scripts/features/se_implicit: Add a test case
+
+2019-12-17  Jouke Witteveen  <j.witteveen@gmail.com>
+
+       * src/implicit.c (pattern_search): Set lastslash correctly
+       If filename contained multiple slashes lastslash is wrongly set to 0.
+       * configure.ac: Check for the GNU memrchr() extension function.
+       * src/misc.c (memrchr): Supply memrchr() if not available.
+
+       * src/implicit.c (pattern-search): Remove unneeded 'dir' variable
+
+2019-12-17  Paul Smith  <psmith@gnu.org>
+
+       * Makefile.am: Build lzip package instead of bzip2
+       * README.git: Mention changed requirements.
+
+       * src/job.c (load_too_high): Disable Linux /proc/loadavg for now
+       This new feature has a problem: if you provide a load which is
+       larger than the number of cores then it will always run every job.
+       Before we can enable it we need to at the least learn how to clamp
+       this value to the number of cores.  To experiment with it, set
+       PROC_FD_INIT to -2 in job.c to re-enable the feature.
+
+       * tests/run_make_tests.pl (set_more_defaults): Fix typo
+
+2019-12-16  Paul Smith  <psmith@gnu.org>
+
+       * tests/run_make_tests.pl (subst_make_string): Force use of /
+       On Windows the path to the helper tool will contain '\': this will
+       fail if recipes are run with a POSIX shell.  Convert '\' to '/'
+       on Windows.  While here, escape any spaces in the path as well.
+
+       Rename jhelp.pl to thelp.pl and make it a generic test helper.
+       * tests/thelp.pl: Rename from tests/jhelp.pl.
+       (op): Use names instead of options for the operations.
+       (op): Add new operations for sleep, mkdir, and rm.
+       (op): Enhance wait to time out
+       * tests/run_make_tests.pl: Add a new #HELPER# replacement
+       (subst_make_string): Use fully-qualified path to thelp.pl
+       * tests/scripts/features/parallelism: Update to use thelp.pl
+       and the new named operations.  Use thelp.pl sleep instead of
+       system-specific sleep commands.
+       * tests/scripts/features/output-sync: Update to use thelp.pl
+       instead of complex shell scripts.
+       * Makefile.am: Distribute tests/thelp.pl instead of tests/jhelp.pl
+
+2019-10-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Port functions/shell test to Solaris 10
+       * tests/scripts/functions/shell: Port exit-status calculation
+       to Solaris 10 with Perl 5.8.4.
+
+2019-10-08  Paul Smith  <psmith@gnu.org>
+
+       Release GNU make 4.2.92
+       * NEWS: Update the release and date
+       * configure.ac: Update the release number
+
+2019-10-06  Paul Smith  <psmith@gnu.org>
+
+       * doc/make.text (Reading Makefiles): Rewrite to be more clear.
+
+2019-10-05  Paul Smith  <psmith@gnu.org>
+
+       * Makefile.am (check-regression): Use PERLFLAGS when running Perl
+       * maintMakefile: Set PERLFLAGS to enable warnings.
+       * tests/run_make_tests.pl: Clean up issues pointed out by perl -w.
+
+       * tests/scripts/functions/wildcard: Skip slash tests for local glob.
+
+       tests: Convert %CONFIG_FLAGS to get_config()
+       * tests/config-flags.pm.W32: Create a predefined Windows file.
+       * Makefile.am (test_FILES): Add it to the distribution.
+       * build_w32.bat: Install tests/config-flags.pm if not existing.
+       * tests/run_make_tests.pl (get_config): Create new function.
+       * tests/scripts/features/archives: Call get_config() rather than
+       using %CONFIG_FLAGS directly.
+       * tests/scripts/features/load: Ditto.
+       * tests/scripts/features/loadapi: Ditto.
+       * tests/scripts/functions/wildcard: Ditto.
+
+       * src/hash.c (jhash_string): Don't read past end of string.
+       Original patch from Dmitry Goncharov <dgoncharov@users.sf.net>.
+
+       * tests/run_make_tests.pl (valid_option): Add missing File::Spec
+
+2019-09-23  Paul Smith  <psmith@gnu.org>
+
+       * src/function.c (func_realpath) [AIX]: Remove trailing slashes.
+
+2019-09-22  Paul Smith  <psmith@gnu.org>
+
+       * tests/scripts/features/vpathplus: Fix output for big-endian systems.
+       Our hashing algorithm gives different ordering on LE vs BE systems.
+       Patch from Dmitry Goncharov <dgoncharov@users.sf.net>.
+
+2019-09-22  Florian Weimer  <fweimer@redhat.com>  (tiny change)
+
+       * configure.ac (HAVE_GETTIMEOFDAY): Avoid undeclared exit function.
+
+2019-09-22  Paul Smith  <psmith@gnu.org>
+
+       * test/test_driver.el (_run_with_timeout): Show error message.
+
+       * job.c (child_error): Modify error message string.
+       This reverts commit 6264deece3bb77798240a906ceed79097adbcf48.
+       Further investigation discovers that the real issue is that
+       GNU Emacs compile mode doesn't have a matching regex for GNU
+       make error messages generated when targets fail.  I submitted
+       a patch to GNU Emacs adding a matcher for compile mode.
+
+2019-09-21  Paul Smith  <psmith@gnu.org>
+
+       * tests: Convert from File::Spec::Functions to File::Spec.
+       Users report the Functions version doesn't work correctly for some
+       older versions of Perl.
+
+       * tests/scripts/function/guile: Valgrind doesn't work with Guile.
+
+       * src/job.c (child_execute_job): Allocate space for argv NULL.
+
+2019-09-21  Paul Smith  <psmith@gnu.org>
+
+       [SV 56918] Compute job slots properly on failing command
+       Ensure we properly reduce job_slots_used if a command fails because
+       it doesn't exist/can't be started.
+
+       * src/job.h (struct child): Add a field jobslot to be set when using
+       a job slot.
+       * src/job.c (start_waiting_job): Remember if we are using a job slot.
+       (reap_children): Reduce number of job slots used by jobslot.
+
+2019-09-21  Paul Smith  <psmith@gnu.org>
+
+       * src/arscan.c (ar_scan): Restrict length for sscanf of ar_mode.
+
+       * tests/scripts/functions/shell: Detect correct SHELLSTATUS code.
+
+       * tests/run_make_test.pl: Fix support for valgrind.
+       Change the variable holding the make command to be a list that can
+       hold extra commands and options, not just a string.
+
+       * tests/run_make_tests.pl (find_prog): Fix syntax error.
+
+2019-09-16  Paul Smith  <psmith@gnu.org>
+
+       * NEWS: Update date and clarify -l change.
+
+       * tests/run_make_tests.pl: Create $scriptsuffix for Windows/VMS.
+       * tests/scripts/features/targetvars: Add a suffix to scripts.
+       * tests/scripts/misc/general4: Ditto.
+
+2019-09-16  Paul Smith  <psmith@gnu.org>
+
+       Refresh the test suite framework implementation.
+       Go through both run_make_tests.pl and test_driver.pl and slightly
+       modernize the Perl and clean up indentation etc.  Fix a number of
+       warnings in the test scripts detected by running with -w.
+
+       * tests/test_driver.pl: Move make error string detection out of the
+       base test driver.
+       (run_all_tests): Ensure that we always look for tests in the cwd.
+       * tests/run_make_tests.pl: Use File::Spec for path manipulations.
+       Correctly use setlocale() when detecting error strings.
+       Get configuration from the config-flags.pm file not config.status.
+       * tests/scripts/features/archives: Use new $cwddir variable.
+       * tests/scripts/features/reinvoke: Add missing semicolon.
+       * tests/scripts/features/vpath2: Avoid non-existent variable.
+       * tests/scripts/functions/foreach: Escape variables.
+       * tests/scripts/misc/bs-nl: Remove non-existing \v escape sequence.
+       * tests/scripts/misc/general4: Use handy create_file().
+       * tests/scripts/options/dash-C: Use Cwd/$cwddir.
+       * tests/scripts/options/dash-I: Use subst_make_string() and #PWD#.
+       * tests/scripts/options/symlinks: Use File::Spec.
+       * tests/scripts/targets/DEFAULT: Use create_file and run_make_test.
+       * tests/scripts/variables/CURDIR: Use run_make_test.
+       * tests/scripts/variables/automatic: Remove extraneous "\".
+       * tests/scripts/vms/library: Remove extra "my" and extraneous "\".
+
+2019-09-16  Paul Smith  <psmith@gnu.org>
+
+       * tests/config-flags.pm.in: Add USE_SYSTEM_GLOB.
+       * tests/config_flags_pm.com [VMS]: Ditto.
+
+       * README.git: [SV 56895] Provide more info about "maintainer mode".
+       * src/read.c (get_next_mword) [HAVE_DOS_PATHS]: Don't fall through to
+       parsing variable references if we find a drivespec in a word!
+
+       * tests/test_driver.pl: Remember error for "running" a directory.
+       * tests/scripts/features/errors: Check errors "running" a directory.
+
+       * src/job.c (child_execute_job): Use errno from find_in_given_path().
+       * tests/test_driver.pl: Determine non-executable error message.
+       * tests/scripts/features/errors: Use the local non-executable error.
+
+       * src/job.c (child_execute_job): Use newer gnulib findprog version.
+
+2019-09-10  Eli Zaretskii  <eliz@gnu.org>
+
+       Revert "[SV 56449] (Windows) Use slow path if '%' appears in the command"
+       This reverts commit 38e96eadea6e2cd42a0f414959bac327de9f468a.
+       Per discussion on Savannah, the modified behavior matches
+       the way % is handled in batch files, but not in cmd command
+       lines.  And since Make mostly tries to emulate the command
+       line, the new behavior is unexpected and backward-incompatible.
+
+2019-09-09  Paul Smith  <psmith@gnu.org>
+
+       Rework the creation of build.sh so it's not a template.
+       * build.sh: Rename from build.template.  Get the list of objects
+       from the Makefile.  Move configure-replaced variables ...
+       * build.cfg.in: to this new .in file.
+       * configure.ac: Remove special handling of build.sh.in and add
+       build.cfg as a generated file.
+       * Makefile.am (EXTRA_DIST): Remove build.sh.in and add build.sh
+       and build.cfg.in for build.sh.in.
+       * maintMakefile: Remove handling for build.template.  Treat
+       build.sh as a source file, not a generated file.
+       * .gitignore: Ignore generated build.cfg file.
+
+2019-09-08  Paul Smith  <psmith@gnu.org>
+
+       * gl/modules/make-glob: Move local glob configure.ac to here
+       * configure.ac: from here.
+
+2019-09-08  Paul Smith  <psmith@gnu.org>
+
+       [SV 56834] Support local PATH search with posix_spawnp
+       When using exec we install the child's environment before invoking
+       execlp(), so commands are found on the child's PATH.  posix_spawnp
+       searches on the parent's PATH, which we don't want.
+
+       Import gnulib's findprog-in module and use it to search the child's
+       PATH, then use posix_spawn() to run it.
+
+       Also, posix_spawn() does not fall back to trying sh on ENOEXEC, as
+       execlp() does, so implement that as well.
+
+       * bootstrap.conf: Add the findprog-in gnulib module
+       * src/job.c: Include findprog.h if we're using posix_spawn.
+       (start_job_command): Remove the handling of child->cmd_name,
+       (child_execute_job): and add it here.  Look up the command to be
+       run in the child's path and invoke it if found.  If it fails with
+       ENOEXEC then retry it as an argument to the default shell.
+       * tests/scripts/misc/general4: Test makefile PATH assignments.
+       * tests/scripts/features/targetvars: Ditto, for target variables.
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       * doc/make.texi (Recipe Execution): Correct example to use $(<[DF])
+
+       * configure.ac: Check whether struct dirent has a d_type field
+       * src/dir.c (dir_contents_file_exists_p): Use the autoconf macro
+       HAVE_STRUCT_DIRENT_D_TYPE rather than relying on the GNU libc-
+       specific _DIRENT_HAVE_D_TYPE.
+       * lib/glob.c: Set HAVE_D_TYPE if HAVE_STRUCT_DIRENT_D_TYPE.
+
+       * src/config.h.W32.template [W32]: Add support for dirent.d_type
+       * src/w32/include/dirent.h: Add DT_* values for dirent.d_type
+       (struct dirent): Add d_type
+       * src/w32/compat/durent.c (readdir): Set dirent.d_type based on
+       Windows file attributes.
+
+       * src/makeint.h: Add typedef for mode_t if !HAVE_UMASK
+
+       * build.template: Rewrite to allow gnulib support.
+
+       * doc/make.texi: Clarify that the jobserver pipe is "blocking"
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       Align child_execute_job among different ports
+       Create a struct childbase which is the basics of struct child needed
+       to invoke child_execute_job(), and can be cast back and forth to a
+       struct child.  Ensure all implementations of child_execute_job() take
+       the same arguments.
+
+       * src/job.h (CHILDBASE): Create a macro to hold the base parts.
+       (struct childbase): A structure containing CHILDBASE.
+       (struct child): Use CHILDBASE as the initial part of child.
+       [VMS]: Remove declaration of VMS version of child_execute_job.
+       * src/job.c (start_job_command): Use new child_execute_job() call.
+       (child_execute_job) [__EMX__]: Implement new calling signature.
+       (child_execute_job): Implement new calling signature.
+       * src/main.c (main) [__EMX__]: Use new child_execute_job() call.
+       * src/function.c (func_shell_base): Use new child_execute_job() call.
+       * src/vmsjobs.c (vmsHandleChildTerm): Accept struct childbase.
+       * src/vmsjobs.c (child_execute_job): Implement new calling signature.
+       Modify the return value to be pid_t, not a boolean, and return the
+       PID rather than setting it in the child.  This is OK because our only
+       caller immediately reset PID to -1 anyway if we return 0.
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       * doc/make.tex (Substitution Refs): Clarify patsubst relationship.
+
+       * src/job.c (start_job_command) [VMS]: Correct VMS comment.
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       Show useful errors when posix_spawn() doesn't do so
+       The posix_spawn() function may not detect that the command to run is
+       invalid when it's invoked.  Instead, it will run then exit with
+       error code 127.  If that happens do our best to present the user
+       with a useful error message.
+
+       * src/job.h (struct child): Add cmd_name to hold the command we ran.
+       * src/job.c (start_job_command): On success, remember the cmd_name.
+       (reap_children): On exit 127, stat cmd_name and show a useful error.
+       (free_child): Free cmd_name.
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       * README.git: Describe GCC and GNU make requirements
+       * maintMakefile: Put custom C flags into a separate variable
+       so they can be overridden more easily on the command line.
+
+       * tests/scripts/features/archives: Fix expected long ar name output.
+
+       * tetss/run_make_test.pl: Avoid 'sh -c' for Windows portability.
+
+       Update to GNU make release candidate 4.2.91
+
+       * tests/scripts/functions/wildcard: Skip dangling symlink test.
+       The built-in glob implementation does not correctly handle dangling
+       symlinks.  This needs to be fixed by switching to the latest glob
+       implementation from gnulib but that's a big job: for now avoid the
+       test if we know it will fail.
+
+       * maintMakefile: Use check-local when testing build.sh.
+       Running 'make check' will rebuild 'make' so we're not testing the
+       build.sh-generated make binary.
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       Don't reset stack size when using posix_spawn()
+       There's no way to run setrlimit() from posix_spawn() so we can't reset
+       the stack limit in children; thus, don't change it in the parent.
+
+       * src/makeint.h (SET_STACK_SIZE): Don't set this when HAVE_POSIX_SPAWN.
+       * src/job.c (child_execute_job): Remove useless comment.
+
+2019-09-07  Paul Smith  <psmith@gnu.org>
+
+       * configure.ac: Remove redundant getloadavg gnulib support
+
+       * src/dir.c (dir_setup_glob): Initialize unused gl_offs.
+       * tests/scripts/functions/wildcard: Add trailing slash tests.
+       Initial changes by Dmitry Goncharov <dgoncharov@users.sf.net>
+
+2019-09-02  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Pacify Oracle Studio c99
+       * src/dep.h (DEP):
+       * src/function.c (struct function_table_entry):
+       Use unsigned int, not unsigned short.  Without this patch, c99
+       complains ‘warning: nonportable bit-field type’.
+
+       Port grouped_targets test to Solaris 10
+       * tests/scripts/features/grouped_targets: Use ‘printf ''’
+       instead of ‘echo -n’, as POSIX says the latter is not portable.
+
+       Remove useless code in eval
+       * src/read.c (eval): Remove useless code.  Without this patch,
+       Oracle Studio 12.6 complains ‘"src/read.c", line 1405: warning:
+       loop not entered at top’.
+
+       Pacify Oracle Studio 12.6 in init_switches
+       * src/main.c (init_switches): Use a cast to convert char const *
+       to char *.  Without this patch, the compiler complains
+       ‘"src/main.c", line 2643: warning: assignment type mismatch:
+       pointer to char "=" pointer to const char’.
+
+       Pacify Oracle Studio 12.6
+       * src/arscan.c [VMS]: Use ‘#if !defined LBR$_HDRTRUNC’ instead
+       of ‘#ifndef LBR$_HDRTRUNC’ to pacify Oracle Studio 12.6, which
+       looks inside unused #if branches for preprocessor syntax errors.
+       Without this patch it complains ‘"src/arscan.c", line 43: warning:
+       tokens ignored at end of directive line’.
+
+2019-09-02  Paul Smith  <psmith@gnu.org>
+
+       * NEWS: Fix incorrect notes.
+
+       * src/read.c (parse_file_seq): [SV 52076] Don't reverse glob() results.
+
+2019-08-28  Eli Zaretskii  <eliz@gnu.org>
+
+       Fix MS-Windows MinGW build
+       * src/w32/subproc/sub_proc.c (process_wait_for_multiple_objects):
+       Fix format specifier for GetLastError's value.
+
+       * src/job.c (reap_children): Define the 'remote_status_lose' label
+       only for Posix platforms, to avoid compiler warning.
+
+       * build_w32.bat (LNKOUT): New variable, using forward slashes.
+       Use forward slashes in calls to :Compile, so that linking with GNU
+       ld works.
+
+       * src/makeint.h [!HAVE_UMASK]: Prototype for 'umask'.
+       (UMASK, MODE_T): Don't define.
+
+       * src/misc.c (get_tmpfile): Don't call UMASK, call umask, to
+       avoid compilation warning on !HAVE_UMASK platforms.
+       * src/output.c (output_tmpfd): Likewise.
+
+       * src/misc.c (umask) [!HAVE_UMASK]: New no-op function.
+
+       * src/config.h.W32.template (__USE_MINGW_ANSI_STDIO)
+       [__MINGW32__]: Define to 1, to force Make use ANSI-compatible
+       stdio functions, which also support the non-standard 'Id' and 'Ix'
+       specifiers.
+       (HAVE_UMASK) [__MINGW32__]: Define to 1.
+
+       * src/arscan.c (ar_member_touch): Type-cast argument of strlen to
+       avoid compiler warnings.
+
+2019-08-26  Paul Smith  <psmith@gnu.org>
+
+       * NEWS: Update for pre-release
+
+2019-08-26  Paul Smith  <psmith@gnu.org>
+
+       Update maintainer mode to support debug wait points.
+       Make a spin() method available when compiled in maintainer mode.
+       If a file exists in the working directory with a specific name,
+       make will sleep until the file is deleted.
+
+       Ensure that maintainer mode is enabled on Windows, using the same
+       algorithm we use on POSIX / autoconf systems.
+
+       * build_w32.bat: If maintMakefile exists, enable maintainer mode.
+       * src/main.c (main): Replace Windows-only suspend flag with spin().
+       * src/makeint.h: A SPIN() macro calls spin() in maintainer mode.
+       * src/misc.c (spin): If a spin file exists sleep until it's deleted.
+
+2019-08-26  Paul Smith  <psmith@gnu.org>
+
+       * tests/scripts/features/archives: [SV 54395] Support non-GNU ar.
+
+       * tests/scripts/misc/general3: Add more tests for SHELL/.SHELLFLAGS
+
+2019-08-25  Paul Smith  <psmith@gnu.org>
+
+       * src/job.c (construct_command_argv): Remove unused VMS code
+
+       * src/job.c (child_execute_job): Set pid to -1 on posix_spawn failure.
+
+2019-08-24  Paul Smith  <psmith@gnu.org>
+
+       * bootstrap: Update from latest gnulib version
+
+       * scripts/copyright-update: Use git ls-files for controlled files
+
+       * po/LINGUAS: Add a translation for Bulgarian.
+
+2019-07-14  Christian Eggers  <ceggers@arri.de>  (tiny change)
+
+       [SV 56449] (Windows) Use slow path if '%' appears in the command
+       * src/job.c (sh_chars_dos): Add '%' as a special character
+       * src/job.c (construct_command_argv_internal): Check for '%' in quotes
+
+       For the windows version of make, a recipe line cannot be executed
+       diretly by make (without a shell) if a '%' character is present. This
+       character starts a cmd.exe escape sequence.
+
+2019-07-14  Paul Smith  <psmith@gnu.org>
+
+       * src/read.c (parse_file_seq): Update comments.
+
+2019-07-13  Mike Haboustak  <haboustak@gmail.com>  (tiny change)
+
+       [SV 28456] Don't override $< when no default rule has been defined
+       The check for matching a file's command to the default rule's command
+       does not account for null. If no .DEFAULT is defined a rule with no
+       recipe has it's $< variable set to the value of $@. This breaks second
+       expansion, particularly when used with pattern rules.
+
+       * src/commands.c [set_file_variables]: Check that cmds is set
+       * tests/scripts/features/se_explicit: Test case
+       * tests/scripts/features/se_implicit: Test case
+
+2019-07-13  Paul Smith  <psmith@gnu.org>
+
+       Switch to the gnulib version of strerror()
+       * bootstrap.conf: Add strerror module
+       * configure.ac: Remove strerror check
+       * src/misc.c: Remove local strerror() implementation
+       * src/config.ami.template: Remove HAVE_STRERROR
+       * src/config.h-vms.template: Ditto.
+       * src/config.h.W32.template: Ditto.
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       * doc/make.texi: [SV 51974] Clarify makefile parsing operations.
+
+       * doc/make.texi: [SV 54116] Document whitespace removal trick.
+       Discovered and explained by Michael Henry <gnu@drmikehenry.com>
+       * tests/scripts/variables/flavors: Add a test to preserve the behavior.
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       [SV 46013] Allow recursive variable overrides from Makefiles
+       Ensure that variable overrides are passed to recursive make instances
+       even if no overrides were provided on the command line.
+       Fix suggested by Rici Lake <ricilake@gmail.com>
+
+       * src/main.c (define_makeflags): Add overrides without respect to the
+       value of command_variables.
+       * tests/scripts/features/recursion: Add a test.
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       Update developer customizations
+       * .ccls: Remove -std=c99: it disables __attribute__ causing warnings.
+       * .dir-locals.el: Force the C coding style to "gnu".
+       * make-gdb.py: Add GDB macros for pretty-printing GNU make structs.
+       * scripts/copyright-update: Use GNULIB_SRCDIR to find update-copyright.
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       [SV 54549] Don't free used set_lists during merge
+       When merging the variable_set_lists for two targets it could be
+       that the "from" set list is a subset of the "to" set list: check
+       for this situation to avoid freeing used memory.
+
+       * src/variable.c (merge_variable_set_lists): Walk the "to" list and
+       if the "from" list is contained in it, nothing to do.
+       * tests/scripts/features/se_explicit: Add a test.
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       * src/hash.c (jash_string): [SV 54980] Avoid ASAN error
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       [SV 54740] Ensure .SILENT settings do not leak into sub-makes
+       Create a new variable run_silent to hold the current instance's global
+       silence setting, allowing silent_flag to represent only whether the -s
+       option was provided on the command line.
+
+       * src/makeint.h: Change silent_flag variable to run_silent.
+       * src/job.c: Ditto.
+       * src/remake.c: Ditto.
+       * src/file.c: Ditto.
+       * src/main.c: Add a new global variable run_silent.
+       (decode_switches): After switches are decoded, initialize run_silent.
+       * tests/scripts/targets/SILENT: Add a test for recursive behavior.
+
+2019-05-19  Paul Smith  <psmith@gnu.org>
+
+       Update copyright statements for 2019
+
+2019-05-12  Kaz Kylheku  <kaz@kylheku.com>
+
+       [SV 8297] Implement "grouped targets" for explicit rules.
+       This patch allows "grouped targets" using the &: syntax:
+
+         tgt1 tgt2 ... tgtn &: pre1 pre2 ...
+               recipe
+
+       When the &: separator is used (in single or double colon forms), all
+       the targets are understood to be built by a single invocation of the
+       recipe.  This is accomplished by piggy-backing on the already-existing
+       pattern rule feature, using the file's "also_make" list.
+
+       * NEWS: Add information about grouped targets.
+       * doc/make.texi (Multiple Targets): Add information on grouped targets.
+       (Pattern Intro): Refer to the new section to discuss multiple patterns.
+       * src/main.c (main): Add "grouped-targets" to .FEATURES
+       * src/read.c (make_word_type): Add new types for &: and &::.
+       (eval): Recognize the &: and &:: separator and remember when used.
+       (record_files): Accept an indicator of whether the rule is grouped.
+       If so, update also_make for each file to depend on the other files.
+       (get_next_mword): Recognize the &: and &:: word types.
+       * tests/scripts/features/grouped_targets: New test script.
+       * AUTHORS: Add Kaz Kylheku
+
+2019-05-12  Paul Smith  <psmith@gnu.org>
+
+       * variable.c (define_variable_in_set): Clear new structs
+
+       * po/LINGUAS: Add Portuguese translation
+
+       Add developer customizations
+       * .ccls: Configure the ccls LSP server
+       * .dir-locals.el: Reset some parameters for ccls and lsp-mode
+       * .gitignore: Update for GTAGS and ccls
+       * maintMakefile: Don't search hidden directories for sources
+
+2018-09-16  Paul Smith  <psmith@gnu.org>
+
+       * src/arscan.c (ar_member_touch): [SV 54533] Stop \0 in archive headers
+
+       Change output_write() to writebuf(), add readbuf() helper.
+       * src/misc.c (writebuf, readbuf): Create helper functions that will
+       reliably write a buffer to a file descriptor in the face of EINTR
+       causing short writes, and read from a file descriptor into a buffer
+       in the face of EINTR causing short reads.
+       * src/makeint.h: Declare these functions.
+       * src/output.c: Remove output_write() and replace with writebuf().
+       (_outputs, out_of_memory): Call writebuf(), not output_write().
+       * src/arscan.c (ar_scan): Call readbuf() instead of read(2).
+       (ar_member_touch): Remove duplicate header write, call writebuf()
+       instead of output_write(), and readbuf() instead of read(2).
+
+2018-09-15  Paul Smith  <psmith@gnu.org>
+
+       * doc/make.texi (Remaking Makefiles): [SV 52273] Note MAKE_RESTARTS
+
+       * src/main.c (main): Set jobserver permissions before re-execing
+       Fixes an issue seen in the Linux kernel build system, reported by
+       Masahiro Yamada <yamada.masahiro@socionext.com>.  Fix suggested
+       on the bug-make mailing list by Mike Shal <marfey@gmail.com>.
+       * tests/scripts/features/parallelism: Add a test to verify this.
+
+       * doc/make.texi: [SV 48970] Clarify the value of $?
+
+       * doc/make.text: [SV 54360] Weaken "obsolete" language in the manual.
+       There's no need to frighten users away from capabilities which are
+       perfectly reasonable and definitely not going away, by calling them
+       obsolete or discouraged in the manual.
+
+       [SV 40657] Don't create pattern rules for suffix rules with deps.
+       * NEWS: Update with a backward-compatibility warning.
+       * src/rule.c (convert_to_pattern): If a suffix rule has dependencies,
+       do not create a pattern rule for it.  According to the manual suffix
+       rules with prerequisites are treated as normal targets.
+       * tests/scrips/features/suffixrules: Create some regression tests for
+       .SUFFIXES and suffix rules.
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       * NEWS: Update for the latest changes.
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       [SV 54233] Preserve higher command_state values on also_make targets.
+       If multiple pattern rules have the same pattern as also-make targets
+       and we attempt to run them at the same time, we might downgrade the
+       command state from 'running' to 'deps_running'; this will prevent
+       that also_make from being considered complete causing make to wait
+       forever for it to finish.
+
+       Ensure that set_command_state never downgrades the state of a target.
+
+       * src/file.c (set_command_state): Don't downgrade command_state.
+       * src/filedef.h (struct file): Document the order prerequisite.
+       * test/scripts/features/patternrules: Test the behavior.
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       * src/job.c (reap_children): Fix inverted win/lose message.
+
+       * tests/scripts/functions/wildcard: [SV 52018] Test dangling symlink.
+
+2018-08-04  Bernhard M. Wiedemann  <bwiedemann@suse.de>
+
+       * src/read.c (parse_file_seq): [SV 52076] Sort wildcard results.
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       * tests/scripts/features/archives: [SV 54395] Test long archive names.
+
+2018-08-04  Ben Hutchings  <ben@decadent.org.uk>
+
+       * src/arscan.c (ar_scan): [SV 54395] Allow long names in archives.
+       Commit bc9d72beb0cb "Resolve issues discovered by static code
+       analysis." added range checks on archive member name length.  However,
+       on non-AIX systems it also checked BSD-style long names against the
+       short name limits and and checked the *offset* for GNU-style long
+       names against the short name limits.  This caused valid long names to
+       be rejected.
+
+       * Record the size of the GNU name map and validate offsets against it
+       * Ensure that the last entry in the name map is null-terminated
+       * Apply a maximum length of INT_MAX for element sizes
+
+       Reported-by: Philipp Wolski <philipp.wolski@kisters.de>
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       * lib/glob.c (glob_in_dir): [SV 53465] Allow symlinks to directories.
+       Fix from Rich Felker <bugdal@aerifal.cx> on the musl mailing list.
+       * tests/scripts/functions/wildcard: Create a regression test for this.
+
+       * configure.ac: Add --disable-posix-spawn option
+       * maintMakefile: Add a test for the option
+       * src/job.c: Change HAVE_* preprocessor checks to USE_POSIX_SPAWN
+
+       * src/job.c (child_execute_job): Clean up posix_spawn invocation
+
+2018-08-04  Aron Barath  <baratharon@caesar.elte.hu>
+
+       * job.c (child_execute_job): Prefer posix_spawn() over fork()/exec()
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       Clean up errors for invalid commands and add regression tests.
+       * src/function.c (func_shell_base): Use error() instead of recreating
+       the error output.
+       * src/job.c (exec_command): Show more standard error messages.
+       * src/load.c (unload_file): Fix whitespace in the error message.
+       * tests/scripts/features/errors: Add tests for starting non-
+       existent commands and new error message formats.
+       * tests/scripts/features/output-sync: New error message formats.
+       * tests/scripts/functions/shell: Ditto.
+
+2018-08-04  Paul Smith  <psmith@gnu.org>
+
+       Queue failed fork() (etc.) to be handled like any other failed job.
+       If we failed to fork() we were essentially exiting make immediately
+       without respect to ignore flags, etc.  On one hand that makes sense
+       because if you can't fork you're in real trouble, but it doesn't
+       work so well on systems where we don't fork at all.  Instead, treat
+       a fork error like any other error by delaying the handling until
+       the next call to reap_children().  Any child with a PID of -1 is
+       considered to have died before starting so check these first without
+       waiting for them.
+
+       * src/commands.c (fatal_error_signal): Don't kill children that
+       never started.
+       * src/function.c (func_shell_base): Handle cleanup properly if the
+       child doesn't start.
+       * src/job.c (reap_children): Check for children that died before
+       starting and handle them without waiting for the PID.
+       (start_job_command): Free memory when the child doesn't start.
+       (start_waiting_job): Don't manage children who never started.
+       (child_execute_job): If the fork fails return PID -1.
+       * src/vmsjobs.c: Check for children that never started.
+       * tests/run_make_tests.pl: Parse config.status to get all options.
+
+2018-08-02  Aron Barath  <baratharon@caesar.elte.hu>
+
+       * configure.ac: Check for posix_spawnattr_setsigmask
+
+       * configure.ac: Check for spawn.h and posix_spawn()
+
+       * src/makeint.h: Use pid_t to store PIDs, of int.
+       * src/commands.c (getpid): Ditto.
+       * src/job.h (*): Ditto.
+       * src/job.c (*): Ditto.
+       * src/main.c (main): Ditto.
+       * src/remote-cstms.c (start_remote_job): Ditto.
+       * src/remote-stub.c (start_remote_job): Ditto.
+
+2018-08-02  spagoveanu@gmail.com  <spagoveanu@gmail.com>  (tiny change)
+
+       * src/dir.c: Preserve glob d_type field
+       When using GNU make on a system with glibc glob a pattern ending in
+       a slash is also matching regular files, but only in subdirectories:
+
+       $ mkdir -p dir/subdir
+       $ cd dir
+       $ touch file1 subdir/file2
+       $ echo 'test:; @echo $(wildcard */ */*/)' | make -f -
+       subdir/ subdir/file2
+       $ echo 'test: */ */*/; @echo "$?" != */ */*/' | make -f -
+       subdir/ subdir/file2 != subdir/ */*/
+
+       It happens because in the gl->gl_readdir callback supplied to glob(),
+       dirent->d_type is set to DT_UNKNOWN, and the glob() implementation
+       in glibc assumes that such a directory entry *cannot* possibly be a
+       regular file.
+
+       Pass the actual d_type down to glob(); this is the right thing to do
+       even if glibc is fixed, because it saves an extra stat() syscall for
+       each dirent.
+
+2018-08-02  Paul Smith  <psmith@gnu.org>
+
+       * src/read.c(unescape_char): Use C comments not C++ comments.
+       * src/posixos.c(set_blocking): Ditto.
+       * src/w32/subproc/sub_proc.c(process_init): Ditto
+
+       Enhance the Basic.mk environment to work with Gnulib
+       * maintMakefile: Omit generated headers from Basic.mk prerequisites.
+       * Basic.mk.template: Rework commands to use with $(call ...) macros.
+       * mk/Amiga.mk: Ditto.
+       * mk/VMS.mk: Ditto.
+       * mk/Windows32.mk: Ditto, plus P2W to convert POSIX to Windows paths.
+       * mk/msdosdjgpp.mk: Ditto.
+
+2018-07-02  Paul Smith  <psmith@gnu.org>
+
+       Resolve most of the Windows Visual Studio warnings.
+       * Convert integer types to size_t where necessary.
+       * Align other integral types to avoid casts and type warnings.
+
+2018-07-02  Paul Smith  <psmith@nuodb.com>
+
+       Update regression tests for Windows.
+       * tests/scripts/features/jobserver: Windows doesn't use pipes
+       * tests/scripts/functions/shell: Don't test kill -2 on Windows
+       * tests/scripts/misc/bs-nl: Windows doesn't handle single quotes
+       * tests/scripts/misc/general3: Ditto.
+
+       * maintMakefile: Preserve comments during compilation
+
+       * function.c(abspath): Use memcpy() to avoid GCC 8.1 warnings
+
+2018-07-02  Paul Smith  <psmith@nuodb.com>
+
+       Convert GNU make to use the gnulib portability library
+       Move content from glob/* and config/* into standard GNU directory
+       locations lib/* and m4/*.
+
+       Install the gnulib bootstrap script and its configuration file, and
+       create a bootstrap.bat file for Windows.  Update the README.git file
+       with new requirements and instructions for building from Git.
+
+       At this point we only install the alloca, getloadavg, and FDL modules
+       from gnulib.  We keep our old glob/fnmatch implementation since the
+       gnulib versions require significant amounts of infrastructure which
+       doesn't exist on Windows yet.  Further work is required here.
+
+       Due to a problem with gnulib's version of getloadavg, we need to bump
+       the minimum required version of automake to 1.16.1 unfortunately.
+
+       * README.git: Update instructions
+       * NEWS: Move developer news to a separate section
+       * configure.ac: Update for use with gnulib modules
+
+       * bootstrap: Bootstrap from Git workspace (import from gnulib)
+       * bootstrap.conf: Bootstrap configuration for GNU make
+       * bootstrap.bat: Bootstrap from Git workspace for Windows
+       * gl/modules/make-glob: Support our local fnmatch/glob implementation
+
+       * config/acinclude.m4: Move to m4/
+       * config/dospaths.m4: Move to m4/
+       * glob/fnmatch.c: Move to lib/
+       * glob/fnmatch.h.in: Move to lib/
+       * glob/glob.c: Move to lib/
+       * glob/glob.h.in: Move to lib/
+
+       * Makefile.am: Update for new directories
+       * build.template: Update for new directories
+       * build_w32.bat: Update for new directories
+       * builddos.bat: Update for new directories
+       * maintMakefile: Update for new directories
+       * makefile.com: Update for new directories
+       * mk/Amiga.mk: Update for new directories
+       * mk/Posix.mk.in: Update for new directories
+       * mk/VMS.mk: Update for new directories
+       * mk/Windows32.mk: Update for new directories
+       * mk/msdosdjgpp.mk: Update for new directories
+
+       * po/LINGUAS: One language per line (needed by gnulib)
+
+       * INSTALL: Remove (obtained from gnulib)
+       * src/alloca.c: Remove (obtained from gnulib)
+       * src/getloadavg.c: Remove (obtained from gnulib)
+       * po/Makevars: Remove (created by bootstrap)
+       * config/*: Remove leftover files
+       * glob/*: Remove leftover files
+
+2018-07-01  Paul Smith  <psmith@nuodb.com>
+
+       * Makefile.ami, glob/Makefile.ami: Remove obsolete files
+
+2018-07-01  Ola Olsson  <ola1olsson@gmail.com>
+
+       * doc/make.texi: Updated language
+
+2018-07-01  Paul Smith  <psmith@gnu.org>
+
+       * all: Update Copyright statements for 2018
+
+       * scripts/copyright-update: Maintainer's script for copyright mgmt
+
+2018-02-10  Paul Smith  <psmith@gnu.org>
+
+       * build_w32.bat: Support Visual Studio 17.
+
+2017-11-19  Paul Smith  <psmith@gnu.org>
+
+       * configure.ac: Support GLIBC glob interface version 2
+
+2017-11-19  Paul Smith  <psmith@gnu.org>
+
+       Rework directory structure to use GNU-recommended "src" directory.
+       Move the source code (other than glob) into the "src" subdirectory.
+       Update all scripting and recommendations to support this change.
+
+       * *.c, *.h, w32/*: Move to src/
+       * configure.ac, Makefile.am, maintMakefile: Locate new source files.
+       * Basic.mk.template, mk/*: Update for new source file locations.
+       * NEWS, README.DOS.template: Update for new locations.
+       * build.template, build_w32.bat, builddos.bat: Ditto.
+       * po/POTFILES.in: Ditto
+       * tests/run_make_tests.pl, tests/scripts/features/load*: Ditto.
+       * make.1: Move to doc.
+       * mk/VMS.mk: Add support for building on VMS (hopefully).
+       * makefile.vms, prepare_w32.bat: Remove.
+       * SCOPTIONS: Update to define HAVE_CONFIG_H
+
+2017-11-18  Paul Smith  <psmith@gnu.org>
+
+       * job.c: Add "command" as a known shell built-in.
+       This is not a POSIX shell built-in but it's common in UNIX shells.
+       Reported by Nick Bowler <nbowler@draconx.ca>.
+
+       * tests/scripts/features/output-sync: Revert bad change in 0c5a9f9b92a
+
+2017-11-18  Paul Smith  <psmith@gnu.org>
+
+       Remove unsupported build facilities.
+       Over time the non-standard build and install systems (nmake files,
+       smake files, Visual Studio project files, etc.) have atrophied and
+       maintaining them is not worth the effort, for such a simple utility
+       as make.  Remove all the non-standard build tool support and unify
+       OS-specific build rules under a basic set of (GNU make) makefiles.
+
+       Preserve the existing bootstrapping scripts (for POSIX, Windows,
+       and MS-DOS).  Also the existing VMS build scripts are left unchanged:
+       I don't have enough experience with VMS to venture into this area.
+       Perhaps one of the VMS maintainers might like to determine whether
+       conversion would be appropriate.
+
+       Rather than create libraries for w32 and glob (non-POSIX), simply
+       link the object files directly to remove the complexity.
+
+       * NEWS: Update with user-facing notes.
+       * Makefile.am: Clean up to use the latest automake best practices.
+       Build Windows code directly from the root makefile to avoid recursion.
+       * README.Amiga, README.DOS.template, README.W32.template: Updated.
+       * INSTALL: Point readers at the README.git file.
+       * maintMakefile: Remove obsolete files.  Create Basic.mk file.
+       * Basic.mk.template, mk/*.mk: Create basic GNU make-based makefiles.
+       * build_w32.bat: Copy Basic.mk to Makefile
+       * configure.ac: We no longer need AM_PROG_AR.
+       * dosbuild.bat: Rename to builddos.bat.  Incorporate configure.bat.
+       * Makefile.DOS.template: Remove.
+       * NMakefile.template, w32/subproc/NMakefile: Remove.
+       * SMakefile.template, glob/SMakefile, glob/SCOPTIONS, make.lnk: Remove.
+       * configure.bat, glob/configure.bat: Remove.
+       * w32/Makefile.am: Remove.
+       * make_msvc_net2003.sln, make_msvc_net2003.vcproj: Remove.
+
+2017-11-11  Paul Smith  <psmith@gnu.org>
+
+       * Makefile.am: Add jhelp.pl to remote test setup.
+
+2017-11-11  Paolo Bonzini  <pbonzini@redhat.com>
+
+       Do not use STOP_SET for singleton compares.
+       Compare against '$' directly rather than using MAP_VARIABLE.
+       This saves ~10% for find_map_function, which is the top hotspot in
+       QEMU's no-op build.  The build is sped up overall by about 1.5%
+       more (from 11.1s to 10.95s).
+
+       * read.c (find_map_function): Do not compare against singleton sets.
+
+2017-11-11  Paolo Bonzini  <pbonzini@redhat.com>
+
+       Speedup parsing of functions.
+       Use the stopchar map to quickly jump over everything that is
+       not an open/close brace, an open/close parenthesis or a comma.
+
+       This saves 1% on QEMU's noop build (from 11.23s to 11.1s).
+
+       * function.c (find_next_argument, handle_function): Check
+       with STOP_SET before comparing against individual characters.
+       * main.c (initialize_stopchar_map): Initialize MAP_VARSEP
+       mappings in stopchar_map.
+       * makeint.h (MAP_VARSEP): New.
+
+2017-11-11  Paolo Bonzini  <pbonzini@redhat.com>
+
+       Remove MAP_PERCENT as strchr is faster.
+       * read.c (find_percent_cached): Use strchr instead of STOP_SET
+       to find % or nul.
+       * makeint.h (MAP_PERCENT): Remove.
+       * main.c (initialize_stopchar_map): Remove.
+
+2017-11-11  Paolo Bonzini  <pbonzini@redhat.com>
+
+       Use Jenkins hash.
+       This is about twice as fast as the current hash, and removes the
+       need for double hashing (improving locality of reference).  The
+       hash function is based on Bob Jenkins' design, slightly adapted
+       wherever Make needs to hash NUL-terminated strings.  The old hash
+       function is kept for case-insensitive hashing.
+
+       This saves 8.5% on QEMU's no-op build (from 12.87s to 11.78s).
+
+       * configure.ac: Check endianness.
+       * hash.c (rol32, jhash_mix, jhash_final, JHASH_INITVAL,
+       sum_get_unaligned_32, jhash): New.
+       * hash.h (STRING_HASH_1, STRING_N_HASH_1): Use jhash.
+       (STRING_HASH_2, STRING_N_HASH_2): Return a dummy value.
+       (STRING_N_COMPARE, return_STRING_N_COMPARE): Prefer memcmp to strncmp.
+
+2017-11-11  Paolo Bonzini  <pbonzini@redhat.com>
+
+       Use strchr for simple case of find_char_unquote.
+       In most cases, find_char_unquote has a single stopchar.  In that
+       case we can look for it using strchr's optimized implementation.
+
+       This saves 3.5% on QEMU's noop build (from 11.78s to 11.37s).
+
+       * read.c (find_char_unquote): Rename to find_map_unquote.  Replace
+       with an implementation optimized for the case where the stopchar
+       is a singleton.  Adjust all callers.
+
+2017-11-11  Paolo Bonzini  <pbonzini@redhat.com>
+
+       Use strchr/memmove in collapse_continuations.
+       collapse_continuations is already using strchr to speed up the
+       common case of no backslash-newline sequence, but on modern
+       processors it is faster to scan the string twice with
+       strchr+memmove (or strlen+memmove) than to move bytes manually.
+
+       Saves about 1.5% on QEMU's no-op build (from 11.37s to 11.23s).
+
+       * misc.c (collapse_continuations): Rewrite the scanning of LINE.
+
+2017-10-31  Paul Smith  <psmith@gnu.org>
+
+       * main.c (main): [SV 48274] Allow -j in makefile MAKEFLAGS variable.
+       * tests/jhelp.pl: New file to allow testing parallelism without sleep.
+       * tests/scripts/features/parallelism: Test this.
+       * tests/scripts/features/jobserver: Update tests.
+       * tests/scripts/features/output-sync: Remove useless rm command.
+
+2017-10-30  Paul Smith  <psmith@gnu.org>
+
+       * job.c (child_error): Modify error message string.
+       Ensure Emacs compile-mode's next-error doesn't match target failure
+       messages.  Syntax errors in makefiles are still matched.
+
+       * function.c (func_if): Check the first character of condition.
+       Reported by Rob W <robw9739@gmail.com>
+
+2017-10-30  Paul Eggert  <eggert@cs.ucla.edu>
+
+       glob: Do not assume glibc glob internals.
+       It has been proposed that glibc glob start using gl_lstat,
+       which the API allows it to do.  GNU 'make' should not get in
+       the way of this.  See:
+       https://sourceware.org/ml/libc-alpha/2017-09/msg00409.html
+
+       * dir.c (local_lstat): New function, like local_stat.
+       (dir_setup_glob): Use it to initialize gl_lstat too, as the API
+       requires.
+
+2017-10-30  Paul Smith  <psmith@gnu.org>
+
+       Compute load from number of running processes.
+       * job.c (load_too_high): If /proc/loadavg is available, compare the
+       maximum load against the number of processes currently running.  If
+       we can't parse /proc/loadavg, use the previous algorithm.
+
+       Concept and initial patch from Sven C. Dack <sven.c.dack@sky.com>
+
+2017-09-30  Eli Zaretskii  <eliz@gnu.org>
+
+       Fix checking existence of directories on MS-Windows
+       * remake.c (name_mtime) [WINDOWS32]: Emulate Posix behavior of
+       'stat' with the likes of "foo/" and "foo/.".
+
+2017-07-09  Paul Smith  <psmith@gnu.org>
+
+       Update copyright statements for 2017.
+
+       Remove uses of unnecessary "register" keyword.
+
+       * variable.c (create_pattern_var): [SV 51266] Create with xcalloc().
+       Reported by Chris Metcalf <cmetcalf@mellanox.com>
+
+       [SV 51400] Only unblock fatal signals after child invocation
+       * job.c (unblock_sigs): Only unblock fatal signals not all signals.
+       (unblock_all_sigs): Unblock all signals not just fatal signals.
+       (child_execute_job): Call unblock_all_sigs() in child process.
+       * job.h: Remove unused function definitions.
+       * remote-cstms.c (start_remote_job): Call unblock_all_sigs() in
+       child process.
+       Reported by Koen Van Hoof <koen.van_hoof@nokia.com>
+
+2017-07-01  Paul Smith  <psmith@gnu.org>
+
+       * function.c (shell_completed): [SV 51014] Add signal to .SHELLSTATUS
+       * tests/scripts/functions/shell: Verify that .SHELLSTATUS contains
+       a non-0 value when the shell exits due to a signal.
+
+2017-06-07  Eli Zaretskii  <eliz@gnu.org>
+
+       Avoid crashes when SHELL=abcde is specified on the command line
+       * variable.c (do_variable_definition): If $SHELL was not found,
+       process "SHELL=foo" as any other variable definition.  This avoids
+       segfaults when SHELL=foo is specified on the Make command line.
+       Reported by Orgad Shaneh <orgads@gmail.com>.
+
+2017-06-04  Paul Smith  <psmith@gnu.org>
+
+       [SV 51159] Use a non-blocking read with pselect to avoid hangs.
+       * posixos.c (set_blocking): Set blocking on a file descriptor.
+       (jobserver_setup): Set non-blocking on the jobserver read side.
+       (jobserver_parse_auth): Ditto.
+       (jobserver_acquire_all): Set blocking to avoid a busy-wait loop.
+       (jobserver_acquire): If the non-blocking read() returns without
+       taking a token then try again.
+
+       [SV 50823] Support filenames containing '$' in MAKEFILE_LIST
+       * variable.h (enum variable_flavor: Add a new flavor for appended
+       values that shouldn't be expanded.
+       * variable.c (do_variable_definition): If given this new flavor,
+       do not expand the value before appending it.
+       * read.c (eval_makefile): Use this new flavor for MAKEFILE_LIST
+       * tests/scripts/variables/MFILE_LIST: Test filenames containing '$'.
+
+       * tests/test_driver.pl: Useful error if given an invalid test name.
+
+       * NEWS: Do not insert a space during '+=' if the value is empty.
+       * doc/make.texi (Appending): Document this behavior.
+       * variable.c (do_variable_definition): Only add a space if the variable
+       value is not empty.
+       * tests/scripts/variables/flavors: Test this behavior.
+
+2017-06-04  Enrique Olaizola  <enrique_olaizola16@hotmail.com>  (tiny change)
+
+       * read.c (read_all_makefiles): [SV 50909] Add MAKEFILES to strcache
+
+2017-06-04  Paul Smith  <psmith@gnu.org>
+
+       * po/LINGUAS: Add support for traditional Chinese (zh_TW)
+
+       Rename output_tmpfile() to a misc function get_tmpfile()
+       * output.c: Remove output_tmpfile() and umask handling.
+       * output.h: Ditto.
+       * misc.c: Add get_tmpfile() and umask handling.
+       * makeint.h: Ditto.
+       * function.c: Rename output_tmpfile() to get_tmpfile().
+       * main.c: Ditto.
+       * vmsjobs.c: Ditto.
+
+       [SV 13651] Handle out-of-memory conditions slightly more gracefully.
+       * makeint.h: Change OUT_OF_MEM() macro to out_of_memory() function.
+       * output.h, job.h: Move FD_* macros from job.h to output.h.
+       * output.c (output_write): Write a buffer to an FD directly.
+       (out_of_memory): Use output_write() to avoid allocating more
+       memory while writing the error, and call exit() instead of die().
+       This does mean we can't translate the error string, though.
+       * misc.c (xmalloc, xcalloc, xrealloc, xstrdup, xstrndup): Call new
+       out_of_memory() rather than OUT_OF_MEM().
+       * read.c (parse_file_seq): Ditto.
+
+       Clean up close-on-exec, particularly with jobserver pipes.
+       * configure.ac: Check sys/file.h and assume fileno() always exists.
+       * output.h: Move output-specific content from job.h to output.h.
+       * os.h (fd_inherit, fd_noinherit): New functions manage FD inheritance.
+       * posixos.c (fd_inherit, fd_noinherit): Implement for POSIX systems.
+       (jobserver_setup): Force jobserver FDs to not be inherited by default.
+       (jobserver_pre_child): Enable inheritance in recursive invocations.
+       (jobserver_post_child): Disable inheritance after recursive invocations.
+       * w32/w32os.c (fd_inherit, fd_noinherit): Implement for W32 systems.
+       * job.h (CLOSE_ON_EXEC): Remove macro in deference to new fd_noinherit.
+       * function.c (func_shell_base): Convert CLOSE_ON_EXEC to fd_noinherit.
+       * job.c (child_execute_job): Ditto.
+       * output.c (setup_tmpfile): Ditto.
+       * read.c (eval_makefile): Ditto, plus remove HAVE_FILENO check.
+       * w32/include/sub_proc.h: Remove process_noinherit for fd_noinherit.
+       * w32/subproc/sub_proc.c: Ditto.
+
+       [SV 50300] Use CFLAGS value of "-O1" in POSIX mode.
+       * read.c (record_files): Use "-O1" not "-O" for CFLAGS and FFLAGS.
+       * tests/scripts/targets/POSIX: Test for the new value.
+
+       * configure.ac: [SV 50648] Detect Guile 2.2 packages.
+
+       * doc/make.texi: [SV 50304] Add missing close parenthesis.
+
+       Add test suite support to Windows
+       * main.c (main): Sanitize program name detection on Windows.
+       * makeint.h: 'program' is a const string on all platforms now.
+       * tests/run_make_tests.bat: Windows bat file to invoke tests
+       * tests/test_driver.pl: Obtain system-specific error messages.
+       (get_osname): Compute the $port_type here.  Add more $osname checks
+       for different Windows Perl ports.
+       (_run_command): Rewrite the timeout capability to work properly
+       with Windows.  Don't use Perl fork/exec; instead use system(1,...)
+       which allows a more reliable/proper kill operation.
+       Also, allow options to be given as a list instead of a string, to
+       allow more complex quoting of command-line arguments.
+       * tests/run_make_tests.pl (run_make_with_options): Allow options
+       to be provided as a list in addition to a simple string.
+       (set_more_defaults): Write sample makefiles and run make on them
+       instead of trying to run echo and invoking make with -f-, to avoid
+       relying on shell and echo to get basic configuration values.  Also
+       create a $sh_name variable instead of hard-coding /bin/sh.
+       * tests/scripts/features/archives: Skip on Windows.
+       * tests/scripts/features/escape: Use list method for passing options.
+       * tests/scripts/features/include: Use system-specific error messages.
+       * tests/scripts/features/output-sync: "Command not found" errors
+       generate very different / odd output on Windows.  This needs to be
+       addressed but for now disable these tests on Windows.
+       * tests/scripts/functions/abspath: Disable on Windows.
+       * tests/scripts/functions/file: Use system-specific error messages.
+       * tests/scripts/functions/shell: "Command not found" errors generate
+       very different / odd output on Windows.  This needs to be addressed
+       but for now disable these tests on Windows.
+       * tests/scripts/misc/close_stdout: Disable on Windows.
+       * tests/scripts/options/dash-k: Use system-specific error messages.
+       * tests/scripts/options/dash-l: Disable on Windows.
+       * tests/scripts/options/eval: Use list method for passing options.
+       * tests/scripts/options/general: Skip some non-portable tests.
+       * tests/scripts/targets/ONESHELL: Skip some non-portable tests.
+       * tests/scripts/targets/POSIX: Skip some non-portable tests.
+       * tests/scripts/variables/MAKEFILES: Skip some non-portable tests.
+       * tests/scripts/variables/SHELL: Use a makefile not -f- for testing.
+
+2017-06-04  Enrique Olaizola  <enrique_olaizola16@hotmail.com>
+
+       * tests/run_make_tests.pl: [SV 50902] Find Perl modules
+
+2017-01-11  Eli Zaretskii  <eliz@gnu.org>
+
+       [SV 50021] Avoid infloop on MS-Windows with short scripts
+       * job.c (reap_children) [WINDOWS32]: Avoid recursive call to
+       reap_children when the argument passed to
+       map_windows32_error_to_string is negative or too large.
+
+2016-12-28  Paul Smith  <psmith@gnu.org>
+
+       * main.c (switches): Add -E as an alias for --eval.
+       * make.1: Document the -E and --eval options.
+       * doc/make.texi: Document the -E option.
+       * tests/scripts/options/eval: Test the -E option and MAKEFILES.
+       * NEWS: Add information about the new option.
+
+       * main.c (switches): Add --no-silent to undo -s options.
+       * make.1: Document the new flag.
+       * doc/make.texi: Document the new flag.  Remove suggestions that the
+       .SILENT special target is deprecated or should not be used.
+       * tests/scripts/options/dash-s: Test the -s and --no-silent options.
+       * NEWS: Add information about the new option.
+
+2016-12-26  Martin Dorey  <martin.dorey@hds.com>
+
+       * job.c (child_execute_job): [SV 49938] Avoid spurious GCC warning.
+
+       * main.c (main): [SV 49935] Fix uninitialized variable.
+
+2016-12-26  Paul Smith  <psmith@gnu.org>
+
+       [SV 40236] Handle included file open failures properly.
+       * read.c (eval_makefile): Set deps->error if we discovered any
+       error reading makefiles, and set NONEXISTENT_MTIME so we know
+       it needs to be rebuilt.
+       * main.c (main): Clean up management of makefile_mtimes.
+       * tests/scripts/features/include: Add open failure testcases.
+
+       Portability changes for the test suite.
+       * tests/test_driver.pl: Save error strings for later comparison.
+       * tests/run_make_tests.pl: Create portable commands for later use.
+       * tests/*: Use these new variables.
+
+       [SV 20513] Un-escaped # are not comments in function invocations
+       * NEWS: Document the change, as a backward-incompatible change.
+       * main.c (main): Add 'nocomment' to the .FEATURES variable.
+       * read.c (remove_comments): Skip variable references during remove.
+       (find_char_unquote): Fix comments for new STOPMAP support.
+       * tests/scripts/features/escape: Test new escape syntax.
+       * tests/scripts/functions/guile: Ditto.
+       * tests/scripts/functions/shell: Ditto.
+
+       * main.c (main): [SV 40234] Show correct error message.
+
+2016-12-26  Christoph Schulz  <develop@kristov.de>
+
+       * main.c (switches): [SV 48809] Accept obsolete jobserver flag.
+
+2016-12-26  Paul Smith  <psmith@gnu.org>
+
+       * read.c (get_next_mword): [SV 49865] Make fallthrough explicit.
+
+       [SV 49114] Remove support for the NO_FLOAT compile flag.
+       * makeint.h (max_load_average): Always a double.
+       * main.c (max_load_average, default_load_average): Always doubles.
+       (switches): -l option is a "floating" format.
+       (decode_switches, define_makeflags): Support "floating" format.
+       * remake.c (f_mtime): Show time skew as double.
+       * rule.c (print_rule_data_base): Show percentages as double.
+       * Makefile.ami, README.DOS.template, SMakefile.template: Remove
+       references to NO_FLOAT.
+       * SCOPTIONS, glob/SCOPTIONS: Remove NO_FLOAT settings.
+
+       [SV 45477] [SV 49115] Parse DOS/Windows drivespecs correctly.
+       * read.c (parse_file_seq) [WINDOWS32]: Only consider a colon part of
+       a path if it's in a valid Windows drivespec.
+
+2016-12-25  Paul Smith  <psmith@gnu.org>
+
+       [SV 49116] Check potential null pointer dereference.
+       * w32/subproc/sub_proc.c (make_command_line): Simplify cygwin shell
+       check for correctness.
+
+2016-12-25  Jaak Ristioja  <jaak@ristioja.ee>
+
+       * expand.c (variable_append): [SV 49113] Possible null ptr deref
+
+       * w32/*/dirent.*: [SV 49111] Remove unused telldir()
+
+2016-12-25  Paul Smith  <psmith@gnu.org>
+
+       Add more GCC warnings to the maintainer build.
+       * arscan.c: [SV 49112] Correct TEST printf() formatting.
+       Recommended by Jaak Ristioja <jaak@ristioja.ee>
+       * hash.c: Correct fprintf() formatting.
+       * maintMakefile: Add extra GCC warning flags.
+
+       * po/Makevars, makeint.h, debug.h: Add xgettext C format flags.
+
+       * po/LINGUAS: Added Serbian translation.
+
+       * README.template: Clarify some items in the README
+
+       * doc/make.texi: [SV 48951] Fix documentation typo.
+
+       * maintMakefile: Update default GPG ID for new key.
+
+2016-12-14  Paul Smith  <psmith@gnu.org>
+
+       Resolve issues discovered by static code analysis.
+       * maintMakefile: Add a rule to submit code for analysis.
+       * configure.ac: Check for availability of the umask() function.
+       * output.c (output_tmpfd, output_tmpfile): Use umask on temp files.
+       * makeint.h (PATH_VAR): Reserve an extra character for nul bytes.
+       * function.c (func_error): Initialize buffer to empty string.
+       * job.c (child_execute_job): Verify validity of fdin.
+       * main.c (main): Simplify code for makefile updating algorithm.
+       * arscan.c (ar_scan): Verify member name length before reading.
+       * read.c (readline): Cast pointer arithmetic to avoid warnings.
+       * remake.c (update_file): Remove unreachable code.
+       (name_mtime): Verify symlink name length.
+
+2016-11-12  Eli Zaretskii  <eliz@gnu.org>
+
+       * NEWS: Mention the extended support for -jN on MS-Windows.
+
+2016-11-12  Marc Ullman  <marc@mathworks.com>
+
+       Support more than 63 jobs on MS-Windows
+       * job.c (start_waiting_job, load_too_high):
+       * w32/w32os.c (jobserver_setup, jobserver_acquire): Abstracted out
+       MAXIMUM_WAIT_OBJECTS.  Call process_table_full instead.
+       * w32/include/sub_proc.h: Update and add prototypes.
+       * w32/subproc/sub_proc.c (GMAKE_MAXIMUM_WAIT_OBJECTS): New macro.
+       (process_wait_for_multiple_objects): Drop-in replacement for Windows
+       API WaitForMultipleOjects.
+       (process_wait_for_any_private): Replaced MAXIMUM_WAIT_OBJECTS with
+       GMAKE_MAXIMUM_WAIT_OBJECTS.
+       (process_table_full): Replacement for process_used_slots.
+       (process_used_slots): Removed, as no longer needed.
+       (process_table_usable_size): Returns maximum usable size of process
+       table.
+       (process_table_actual_size): Returns actual size of process table.
+       (process_register): Added assertion.
+       (process_easy): Abstracted out MAXIMUM_WAIT_OBJECTS.
+
+2016-10-09  Eli Zaretskii  <eliz@gnu.org>
+
+       Only include strings.h in MinGW builds
+       * main.c:
+       * job.c: Include strings.h only if HAVE_STRINGS_H is defined.
+
+       * config.h.W32.template (HAVE_STRINGS_H): Define only for MinGW,
+       as MSVC doesn't have this header.
+
+2016-10-06  Eli Zaretskii  <eliz@gnu.org>
+
+       Update the Guile version tested with the MS-Windows build.
+
+       Avoid compiler warnings with MinGW runtime 3.22.2
+       * main.c:
+       * job.c: Include strings.h, to get the prototypes of strcasecmp
+       and strncasecmp with latest MinGW runtime versions.
+       * config.h.W32.template (HAVE_STRINGS_H): Define.
+
+2016-06-24  Paul Smith  <psmith@gnu.org>
+
+       * README.W32.template: Update the build documentation.
+       * build_w32.bat: Fix issues with Visual Studio builds.  Fix an error
+       that always created Debug builds.  Support 32bit and 64bit builds.
+
+       * Update to pre-release version 4.2.90.
+
 2016-06-10  Paul Smith  <psmith@gnu.org>
 
        GNU Make release 4.2.1.
diff --git a/INSTALL b/INSTALL
deleted file mode 100644 (file)
index 095b1eb..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,231 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free
-Software Foundation, Inc.
-
-This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
-
-Basic Installation
-==================
-
-These are generic installation instructions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  (Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.)
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You only need
-`configure.ac' if you want to change it or regenerate `configure' using
-a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.  If you're
-     using `csh' on an old version of System V, you might need to type
-     `sh ./configure' instead to prevent `csh' from trying to execute
-     `configure' itself.
-
-     Running `configure' takes awhile.  While running, it prints some
-     messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-Compilers and Options
-=====================
-
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
-   If you have to use a `make' that does not support the `VPATH'
-variable, you have to compile the package for one architecture at a
-time in the source code directory.  After you have installed the
-package for one architecture, use `make distclean' before reconfiguring
-for another architecture.
-
-Installation Names
-==================
-
-By default, `make install' will install the package's files in
-`/usr/local/bin', `/usr/local/man', etc.  You can specify an
-installation prefix other than `/usr/local' by giving `configure' the
-option `--prefix=PREFIX'.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-give `configure' the option `--exec-prefix=PREFIX', the package will
-use PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
-Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the `--target=TYPE' option to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-will cause the specified gcc to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-`configure' Invocation
-======================
-
-`configure' recognizes the following options to control how it operates.
-
-`--help'
-`-h'
-     Print a summary of the options to `configure', and exit.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/Makefile.DOS b/Makefile.DOS
deleted file mode 100644 (file)
index d05acd4..0000000
+++ /dev/null
@@ -1,819 +0,0 @@
-# -*-Makefile-*- template for DJGPP
-# Makefile.in generated automatically by automake 1.2 from Makefile.am
-#
-# Copyright (C) 1994-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-SHELL = /bin/sh
-
-srcdir = .
-VPATH = $(srcdir)
-# $DJDIR is defined automatically by DJGPP to point
-# to the root of the DJGPP installation tree.
-prefix = /dev/env/DJDIR
-exec_prefix = ${prefix}
-
-bindir = /bin
-datadir = /share
-libdir = /lib
-infodir = /info
-mandir = /man
-includedir = /include
-oldincludedir = c:/djgpp/include
-
-DESTDIR = /dev/env/DJDIR
-
-pkgdatadir = $(datadir)/make
-pkglibdir = $(libdir)/make
-pkgincludedir = $(includedir)/make
-localedir = $(datadir)/locale
-
-INSTALL = ${exec_prefix}/bin/ginstall -c
-INSTALL_PROGRAM = ${exec_prefix}/bin/ginstall -c
-INSTALL_DATA = ${exec_prefix}/bin/ginstall -c -m 644
-INSTALL_SCRIPT = ${exec_prefix}/bin/ginstall -c
-transform = s,x,x,
-
-# This will fail even if they don't have a Unix-like shell (stock DOS
-# shell doesn't know about `false').  The only difference is that they
-# get "Error -1" instead of "Error 1".
-EXIT_FAIL = false
-
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-EXEEXT = .exe
-OBJEXT = o
-
-AR = ar
-AWK = gawk
-CC = gcc
-CPP = gcc -E
-LIBOBJS =
-MAKEINFO = ${exec_prefix}/bin/makeinfo
-PACKAGE = make
-PERL = perl
-RANLIB = ranlib
-REMOTE = stub
-VERSION = 4.2.1
-
-AUTOMAKE_OPTIONS = 1.2
-
-bin_PROGRAMS = make$(EXEEXT)
-
-make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c function.c getopt.c getopt1.c guile.c implicit.c job.c load.c loadapi.c main.c misc.c posixos.c output.c read.c remake.c rule.c signame.c strcache.c variable.c version.c vpath.c hash.c remote-$(REMOTE).c
-# This should include the glob/ prefix
-libglob_a_SOURCES =    glob/fnmatch.c glob/glob.c glob/fnmatch.h glob/glob.h
-make_LDADD =     glob/libglob.a
-
-man_MANS =     make.1
-
-INCLUDES =     -I$(srcdir)/glob -DLIBDIR=\"$(prefix)$(libdir)\" -DINCLUDEDIR=\"$(prefix)$(includedir)\" -DLOCALEDIR=\"$(prefix)$(localedir)\"
-
-BUILT_SOURCES =        README build.sh-in
-
-EXTRA_DIST =   $(BUILT_SOURCES) $(man_MANS) README.customs remote-cstms.c  make-stds.texi texinfo.tex SCOPTIONS SMakefile  Makefile.ami README.Amiga config.ami amiga.c amiga.h  NMakefile README.DOS configh.dos configure.bat makefile.com  README.W32 build_w32.bat config.h-W32 subproc.bat make.lnk  config.h-vms makefile.vms README.VMS vmsdir.h vmsfunctions.c  vmsify.c gmk-default.scm gmk-default.h
-
-SUBDIRS =      glob doc
-mkinstalldirs = ${exec_prefix}/bin/gmkdir -p
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =  build.sh
-PROGRAMS =  $(bin_PROGRAMS)
-
-MAKE_HOST = i386-pc-msdosdjgpp
-
-
-DEFS =  -I. -I$(srcdir) -I.
-CPPFLAGS = -DHAVE_CONFIG_H
-LDFLAGS =
-LIBS =
-make_OBJECTS =  ar.o arscan.o commands.o default.o dir.o expand.o file.o function.o getopt.o getopt1.o guile.o implicit.o job.o load.o loadapi.o main.o misc.o posixos.o output.o read.o remake.o rule.o signame.o strcache.o variable.o version.o vpath.o hash.o remote-$(REMOTE).o
-make_DEPENDENCIES =    glob/libglob.a
-make_LDFLAGS =
-libglob_a_LIBADD =
-libglob_a_OBJECTS =  fnmatch.o glob.o
-noinst_LIBRARIES =     glob/libglob.a
-CFLAGS = -O2 -g
-COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
-LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
-TEXI2DVI = texi2dvi
-TEXINFO_TEX = $(srcdir)/config/texinfo.tex
-INFO_DEPS = doc/make.info
-DVIS = doc/make.dvi
-TEXINFOS = doc/make.texi
-noinst_TEXINFOS = doc/fdl.texi doc/make-stds.texi
-man1dir = $(mandir)/man1
-MANS = $(man_MANS)
-
-NROFF = nroff
-DIST_COMMON =  README ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL Makefile.am  Makefile.in NEWS acconfig.h aclocal.m4 alloca.c build.sh-in config.h-in  configure configure.ac getloadavg.c
-
-DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
-
-TAR = gtar
-GZIP = --best
-SOURCES = $(make_SOURCES)
-OBJECTS = $(make_OBJECTS)
-HEADERS = $(wildcard $(srcdir)/*.h)
-
-default: all
-
-.SUFFIXES:
-.SUFFIXES: .c .dvi .info .o .obj .ps .texi .tex .html
-
-mostlyclean-hdr:
-
-clean-hdr:
-
-distclean-hdr:
-       -rm -f config.h
-
-maintainer-clean-hdr:
-
-mostlyclean-binPROGRAMS:
-
-clean-binPROGRAMS:
-       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-
-distclean-binPROGRAMS:
-
-maintainer-clean-binPROGRAMS:
-
-install-binPROGRAMS: $(bin_PROGRAMS)
-       @$(NORMAL_INSTALL)
-       $(mkinstalldirs) $(DESTDIR)$(bindir)
-       @list='$(bin_PROGRAMS)'; for p in $$list; do    if test -f $$p; then      echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`";       $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p | sed '$(transform)'`;    else :; fi;  done
-
-uninstall-binPROGRAMS:
-       $(NORMAL_UNINSTALL)
-       list='$(bin_PROGRAMS)'; for p in $$list; do    rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`.exe;  done
-
-.c.o:
-       $(COMPILE) -c $<
-
-clean-noinstLIBRARIES:
-       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-
-mostlyclean-compile:
-       -rm -f *.$(OBJEXT) *$(EXEEXT) make.new core
-
-clean-compile:
-
-distclean-compile:
-       -rm -f *.tab.c *_tab.c
-
-maintainer-clean-compile:
-
-make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES)
-       @command.com /c if exist make del make
-       @command.com /c if exist make.exe del make.exe
-       $(LINK) $(make_LDFLAGS) $(make_OBJECTS) $(make_LDADD) $(LIBS)
-
-# Documentation
-
-make.info: make.texi
-make.dvi: make.texi
-make.ps: make.dvi make.texi
-make.html: make.texi
-
-
-DVIPS = dvips
-
-.texi.info:
-       @command.com /c if exist make.info* del make.info*
-       @command.com /c if exist make.i* del make.i*
-       $(MAKEINFO) -I$(srcdir) --no-split $< -o ./$@
-
-.texi:
-       @command.com /c if exist make.info* del make.info*
-       @command.com /c if exist make.i* del make.i*
-       $(MAKEINFO) -I$(srcdir) --no-split $< -o ./$@
-
-.texi.dvi:
-       TEXINPUTS="$(srcdir);$$TEXINPUTS"    MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $<
-
-.dvi.ps:
-       $(DVIPS) $< -o $@
-
-# Other documentation formats
-
-html: html-recursive
-
-.texi.html:
-       @command.com /c if exist make.html* del make.html*
-       $(MAKEINFO) --html -I$(srcdir) --no-split $< -o ./$@
-
-install-info-am: $(INFO_DEPS)
-       @$(NORMAL_INSTALL)
-       $(mkinstalldirs) $(DESTDIR)$(infodir)
-       @for file in $(INFO_DEPS); do    iifile=`echo $$file | sed "s|doc/||"`;    d=$(srcdir);    for ifile in `cd $$d && echo $$file`; do      if test -f $$d/$$ifile; then        echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$iifile"; $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$iifile; else : ; fi;    done;  done
-       @$(POST_INSTALL)
-       @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then    for file in $(INFO_DEPS); do    iifile=`echo $$file | sed "s|doc/||"`;      echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$iifile";     install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$iifile || :;   done;  else : ; fi
-
-uninstall-info:
-       $(PRE_UNINSTALL)
-       @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then    ii=yes;  else ii=; fi;  for file in $(INFO_DEPS); do    test -z $ii || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file;  done
-       $(NORMAL_UNINSTALL)
-       for file in $(INFO_DEPS); do (cd $(DESTDIR)$(infodir) && rm -f $$file);  done
-
-dist-info: $(INFO_DEPS)
-       for base in $(INFO_DEPS); do    d=$(srcdir);    for file in `cd $$d && eval echo $$base*`; do      test -f $(distdir)/$$file      || ln $$d/$$file $(distdir)/$$file 2> /dev/null      || cp -p $$d/$$file $(distdir)/$$file;    done;  done
-
-mostlyclean-aminfo:
-       -rm -f $(srcdir)/doc/make.aux $(srcdir)/doc/make.cp $(srcdir)/doc/make.cps $(srcdir)/doc/make.dvi \
-         $(srcdir)/doc/make.fn $(srcdir)/doc/make.fns $(srcdir)/doc/make.ky $(srcdir)/doc/make.kys \
-         $(srcdir)/doc/make.ps $(srcdir)/doc/make.log $(srcdir)/doc/make.pg $(srcdir)/doc/make.toc \
-         $(srcdir)/doc/make.tp $(srcdir)/doc/make.tps $(srcdir)/doc/make.vr $(srcdir)/doc/make.vrs \
-         $(srcdir)/doc/make.op $(srcdir)/doc/make.tr $(srcdir)/doc/make.cv $(srcdir)/doc/make.cn \
-         $(srcdir)/doc/make.html
-
-clean-aminfo:
-
-distclean-aminfo:
-
-maintainer-clean-aminfo:
-       for i in $(INFO_DEPS); do rm -f $$i*; done
-
-install-man1:
-       $(mkinstalldirs) $(DESTDIR)$(man1dir)
-       @list='$(man1_MANS)'; \
-       l2='$(man_MANS)'; for i in $$l2; do \
-         case "$$i" in \
-           *.1*) list="$$list $$i" ;; \
-         esac; \
-       done; \
-       for i in $$list; do \
-         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
-         else file=$$i; fi; \
-         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-         echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
-         $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
-       done
-
-uninstall-man1:
-       @list='$(man1_MANS)'; \
-       l2='$(man_MANS)'; for i in $$l2; do \
-         case "$$i" in \
-           *.1*) list="$$list $$i" ;; \
-         esac; \
-       done; \
-       for i in $$list; do \
-         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
-         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
-         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
-         echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
-         rm -f $(DESTDIR)$(man1dir)/$$inst; \
-       done
-install-man: $(MANS)
-       @$(NORMAL_INSTALL)
-       $(MAKE) install-man1
-uninstall-man:
-       @$(NORMAL_UNINSTALL)
-       $(MAKE) uninstall-man1
-
-# Assume that the only thing to do in glob is to build libglob.a,
-# but do a sanity check: if $SUBDIRS will ever have more than
-# a single directory, yell bloody murder.
-all-recursive:
-ifeq ($(findstring glob, $(SUBDIRS)), glob)
-       @command.com /c if not exist glob\\nul md glob
-       @echo Making all in glob
-       $(MAKE) -C glob -f ../Makefile INCLUDES='-I$(srcdir) -I$(srcdir)/glob' DEFS='-I.. -I$(srcdir)' VPATH=$(srcdir)/glob libglob.a
-endif
-
-$(SUBDIRS):
-       command.com /c md $@
-
-libglob.a: $(libglob_a_OBJECTS)
-       command.com /c if exist libglob.a del libglob.a
-       $(AR) cru libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD)
-       $(RANLIB) libglob.a
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive check-recursive:
-ifeq ($(words $(SUBDIRS)), 2)
-       @echo Making $(shell echo $@ | sed s/-recursive//) in glob
-       $(MAKE) -C glob -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am
-       @echo Making $(shell echo $@ | sed s/-recursive//) in doc
-       $(MAKE) -C doc -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am
-else
-       @echo FATAL: There is more than two directory in "($(SUBDIRS))"
-       @$(EXIT_FAIL)
-endif
-
-tags-in-glob: $(libglob_a_SOURCES)
-       etags $(addprefix $(srcdir)/,$^) -o ./glob/TAGS
-
-tags-recursive:
-ifeq ($(words $(SUBDIRS)), 2)
-       $(MAKE) tags-in-glob
-else
-       @echo FATAL: There is more than two directory in "($(SUBDIRS))"
-       @$(EXIT_FAIL)
-endif
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES)
-       mkid $(srcdir)/$(SOURCES) $(srcdir)/$(libglob_a_SOURCES) ./config.h $(HEADERS)
-
-TAGS: tags-recursive $(HEADERS) $(srcdir)/$(SOURCES) config.h $(TAGS_DEPENDENCIES)
-       etags -i ./glob/TAGS $(ETAGS_ARGS) $(srcdir)/$(SOURCES) ./config.h $(HEADERS)
-
-mostlyclean-tags:
-
-clean-tags:
-
-distclean-tags:
-       -rm -f TAGS ID
-
-maintainer-clean-tags:
-
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-       rm -rf $(distdir)
-       GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz
-       mkdir $(distdir)/=build
-       mkdir $(distdir)/=inst
-       dc_install_base=`cd $(distdir)/=inst && pwd`;  cd $(distdir)/=build    && ../configure --srcdir=.. --prefix=$$dc_install_base    && $(MAKE)    && $(MAKE) dvi    && $(MAKE) check    && $(MAKE) install    && $(MAKE) installcheck    && $(MAKE) dist
-       rm -rf $(distdir)
-       @echo "========================";  echo "$(distdir).tar.gz is ready for distribution";  echo "========================"
-dist: distdir
-       -chmod -R a+r $(distdir)
-       GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
-       rm -rf $(distdir)
-dist-all: distdir
-       -chmod -R a+r $(distdir)
-       GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
-       rm -rf $(distdir)
-distdir: $(DISTFILES)
-       rm -rf $(distdir)
-       mkdir $(distdir)
-       -chmod 777 $(distdir)
-       @for file in $(DISTFILES); do d=$(srcdir); test -f $(distdir)/$$file || ln $$d/$$file $(distdir)/$$file 2> /dev/null || cp -p $$d/$$file $(distdir)/$$file; done; for subdir in $(SUBDIRS); do test -d $(distdir)/$$subdir || mkdir $(distdir)/$$subdir || exit 1; chmod 777 $(distdir)/$$subdir; (cd $$subdir && $(MAKE) top_distdir=../$(top_distdir)/$$subdir distdir=../$(distdir)/$$subdir distdir) || exit 1; done
-       $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info
-       $(MAKE) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook
-
-info: info-recursive
-info-recursive:
-ifeq ($(findstring doc, $(SUBDIRS)), doc)
-       @command.com /c if not exist doc\\nul md doc
-       @echo Making all in doc
-       $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.info
-endif
-
-dvi: dvi-recursive
-dvi-recursive:
-ifeq ($(findstring doc, $(SUBDIRS)), doc)
-       @command.com /c if not exist doc\\nul md doc
-       @echo Making all in doc
-       $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.dvi
-endif
-
-ps: ps-recursive
-ps-recursive:
-ifeq ($(findstring doc, $(SUBDIRS)), doc)
-       @command.com /c if not exist doc\\nul md doc
-       @echo Making all in doc
-       $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.ps
-endif
-
-html-recursive:
-ifeq ($(findstring doc, $(SUBDIRS)), doc)
-       @command.com /c if not exist doc\\nul md doc
-       @echo Making all in doc
-       $(MAKE) -C doc -f ../Makefile VPATH=$(srcdir)/doc make.html
-endif
-
-check: all-am check-recursive check-local
-       @:
-installcheck: installcheck-recursive
-all-recursive-am: config.h
-       $(MAKE) all-recursive
-
-all-am: Makefile $(PROGRAMS) config.h info
-
-install-exec-am: install-binPROGRAMS
-
-install-data-am: install-info-am
-
-uninstall-am: uninstall-binPROGRAMS uninstall-info
-
-install-exec: install-exec-recursive install-exec-am
-       @$(NORMAL_INSTALL)
-
-install-data: install-data-recursive install-data-am
-       @$(NORMAL_INSTALL)
-
-install-recursive uninstall-recursive:
-       @:
-
-install: install-recursive install-exec-am install-data-am
-       @:
-
-uninstall: uninstall-recursive uninstall-am
-
-all: all-recursive-am all-am
-
-install-strip:
-       $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
-installdirs: installdirs-recursive
-       $(mkinstalldirs)  $(bindir) $(infodir)
-
-
-mostlyclean-generic:
-       -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
-
-clean-generic:
-       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
-       -rm -f Makefile $(DISTCLEANFILES)
-       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-mostlyclean-am:  mostlyclean-hdr mostlyclean-binPROGRAMS  mostlyclean-compile mostlyclean-aminfo mostlyclean-tags  mostlyclean-generic
-
-clean-am:  clean-hdr clean-binPROGRAMS clean-compile clean-aminfo  clean-tags clean-generic mostlyclean-am
-
-distclean-am:  distclean-hdr distclean-binPROGRAMS distclean-compile  distclean-aminfo distclean-tags distclean-generic  clean-am
-
-maintainer-clean-am:  maintainer-clean-hdr maintainer-clean-binPROGRAMS  maintainer-clean-compile maintainer-clean-aminfo  maintainer-clean-tags maintainer-clean-generic  distclean-am
-
-mostlyclean:  mostlyclean-recursive mostlyclean-am
-
-clean: clean-noinstLIBRARIES clean-recursive clean-am
-
-distclean:  distclean-recursive distclean-am
-       rm -f config.status
-
-maintainer-clean:  maintainer-clean-recursive maintainer-clean-am
-       @echo "This command is intended for maintainers to use;"
-       @echo "it deletes files that may require special tools to rebuild."
-       rm -f config.status
-
-.PHONY: default mostlyclean-hdr distclean-hdr clean-hdr \
-maintainer-clean-hdr mostlyclean-binPROGRAMS distclean-binPROGRAMS \
-clean-binPROGRAMS maintainer-clean-binPROGRAMS uninstall-binPROGRAMS \
-install-binPROGRAMS mostlyclean-compile distclean-compile clean-compile \
-maintainer-clean-compile install-info-am uninstall-info \
-mostlyclean-aminfo distclean-aminfo clean-aminfo \
-maintainer-clean-aminfo install-data-recursive uninstall-data-recursive \
-install-exec-recursive uninstall-exec-recursive installdirs-recursive \
-uninstalldirs-recursive all-recursive check-recursive check-am \
-installcheck-recursive info-recursive dvi-recursive \
-mostlyclean-recursive distclean-recursive clean-recursive \
-maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
-distclean-tags clean-tags maintainer-clean-tags distdir \
-mostlyclean-depend distclean-depend clean-depend \
-maintainer-clean-depend info dvi check-local installcheck \
-all-recursive-am all-am install-exec-am install-data-am uninstall-am \
-install-exec install-data install uninstall all installdirs \
-mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean \
-html
-
-
-# --------------- Local DIST Section
-
-# Install the w32 subdirectory
-#
-dist-hook:
-       (cd $(srcdir); \
-        w32=`find w32 -follow \( -name .git -prune \) -o -type f -print`; \
-        tar chf - $$w32) \
-       | (cd $(distdir); tar xfBp -)
-
-# --------------- Local CHECK Section
-
-# Note: check-loadavg is NOT a prerequisite of check-local, since
-# there's no uptime utility, and the test it does doesn't make sense
-# on MSDOS anyway.
-check-local: check-shell check-regression
-       @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \
-       dashes=`echo "$$banner" | sed s/./=/g`; \
-       echo; \
-       echo "$$dashes"; \
-       echo "$$banner"; \
-       echo "$$dashes"; \
-       echo
-
-.PHONY: check-loadavg check-shell check-regression
-
-# > check-shell
-#
-# check-shell is designed to fail if they don't have a Unixy shell
-# installed.  The test suite requires such a shell.
-check-shell:
-       @echo If Make says Error -1, you do not have Unix-style shell installed
-       @foo=bar.exe :
-
-# > check-loadavg
-#
-loadavg: loadavg.c config.h
-       @rm -f loadavg
-       $(LINK) -DTEST $(make_LDFLAGS) loadavg.c $(LIBS)
-# We copy getloadavg.c into a different file rather than compiling it
-# directly because some compilers clobber getloadavg.o in the process.
-loadavg.c: getloadavg.c
-       ln $(srcdir)/getloadavg.c loadavg.c || \
-       cp $(srcdir)/getloadavg.c loadavg.c
-check-loadavg: loadavg
-       @echo The system uptime program believes the load average to be:
-       -uptime
-       @echo The GNU load average checking code believes:
-       -./loadavg
-
-# > check-regression
-#
-# Look for the make test suite, and run it if found.  Look in MAKE_TEST if
-# specified, or else in the srcdir or the distdir, their parents, and _their_
-# parents.
-#
-check-regression:
-       @if test -f "$(srcdir)/tests/run_make_tests"; then \
-         if $(PERL) -v >/dev/null 2>&1; then \
-           case `cd $(srcdir); pwd` in `pwd`) : ;; \
-             *) test -d tests || mkdir tests; \
-                for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \
-                  rm -rf tests/$$f; cp -pr $(srcdir)/tests/$$f tests; \
-                done ;; \
-           esac; \
-           echo "cd tests && $(PERL) ./run_make_tests.pl -make ../make.exe $(MAKETESTFLAGS)"; \
-           cd tests && $(PERL) ./run_make_tests.pl -make ../make.exe $(MAKETESTFLAGS); \
-         else \
-           echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \
-         fi; \
-        else \
-         echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \
-        fi
-
-# --------------- Maintainer's Section
-
-# Note this requires GNU make.  Not to worry, since it will only be included
-# in the Makefile if we're in the maintainer's environment.
-#include $(srcdir)/maintMakefile
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
-
-# --------------- DEPENDENCIES
-
-# --------------- DEPENDENCIES
-#
-
-# .deps/alloca.Po
-# dummy
-
-# .deps/ar.Po
-ar.o: ar.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h
-
-# .deps/arscan.Po
-arscan.o: arscan.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
-
-# .deps/commands.Po
-commands.o: commands.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h variable.h job.h output.h \
- commands.h
-
-# .deps/default.Po
-default.o: default.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h rule.h dep.h job.h \
- output.h \
- commands.h
-
-# .deps/dir.Po
-dir.o: dir.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h \
- filedef.h dep.h \
-
-# .deps/expand.Po
-expand.o: expand.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/file.Po
-file.o: file.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h \
- debug.h
-
-# .deps/function.Po
-function.o: function.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h dep.h job.h output.h \
- commands.h debug.h
-
-# .deps/getloadavg.Po
-# dummy
-
-# .deps/getopt.Po
-getopt.o: getopt.c config.h \
-
-# .deps/getopt1.Po
-getopt1.o: getopt1.c config.h getopt.h \
-
-# .deps/guile.Po
-guile.o: guile.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h filedef.h hash.h dep.h variable.h \
- gmk-default.h
-
-# .deps/hash.Po
-hash.o: hash.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h
-
-# .deps/implicit.Po
-implicit.o: implicit.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h rule.h dep.h debug.h variable.h job.h output.h \
- commands.h
-
-# .deps/job.Po
-job.o: job.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- job.h output.h \
- debug.h filedef.h hash.h \
- commands.h variable.h os.h
-
-# .deps/load.Po
-load.o: load.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h \
- filedef.h hash.h variable.h
-
-# .deps/loadapi.Po
-loadapi.o: loadapi.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h dep.h
-
-# .deps/loadavg-getloadavg.Po
-# dummy
-
-# .deps/main.Po
-main.o: main.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- os.h \
- filedef.h hash.h dep.h variable.h job.h output.h \
- commands.h rule.h debug.h \
- getopt.h
-
-# .deps/misc.Po
-misc.o: misc.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h debug.h \
-
-# .deps/output.Po
-output.o: output.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- job.h \
- output.h \
-
-# .deps/posixos.Po
-posixos.o: posixos.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h job.h output.h os.h
-
-# .deps/read.Po
-read.o: read.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h \
- debug.h
-
-# .deps/remake.Po
-remake.o: remake.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h dep.h variable.h \
- debug.h
-
-# .deps/remote-cstms.Po
-# dummy
-
-# .deps/remote-stub.Po
-remote-stub.o: remote-stub.c makeint.h \
- config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h
-
-# .deps/rule.Po
-rule.o: rule.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/signame.Po
-signame.o: signame.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
-
-# .deps/strcache.Po
-strcache.o: strcache.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h
-
-# .deps/variable.Po
-variable.o: variable.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/version.Po
-version.o: version.c config.h
-
-# .deps/vmsjobs.Po
-# dummy
-
-# .deps/vpath.Po
-vpath.o: vpath.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h
index c88c465e35739655045fb4db77549933e53111d1..8cc39c92b4fe186597ac65969c1fd57ca5039bcc 100644 (file)
@@ -1,6 +1,6 @@
 # This is a -*-Makefile-*-, or close enough
 #
-# Copyright (C) 1997-2016 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
 # You should have received a copy of the GNU General Public License along with
 # this program.  If not, see <http://www.gnu.org/licenses/>.
 
-AUTOMAKE_OPTIONS = dist-bzip2 silent-rules std-options
-ACLOCAL_AMFLAGS = -I config
+AUTOMAKE_OPTIONS = dist-lzip silent-rules std-options subdir-objects nostdinc
+ACLOCAL_AMFLAGS = -I m4
 
 MAKE_HOST =    @MAKE_HOST@
 
-# Only process if target is MS-Windows
-if WINDOWSENV
-  MAYBE_W32 =  w32
-  W32INC =     -I $(top_srcdir)/w32/include
-  W32LIB =     -Lw32 -lw32
-  ossrc =
-else
-  ossrc =      posixos.c
-endif
-
-SUBDIRS =      glob config po doc $(MAYBE_W32)
+SUBDIRS =      lib po doc
 
 bin_PROGRAMS = make
-include_HEADERS = gnumake.h
+include_HEADERS = src/gnumake.h
 
-if USE_CUSTOMS
-  remote =     remote-cstms.c
-else
-  remote =     remote-stub.c
-endif
+man_MANS =     doc/make.1
 
-make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c \
-               function.c getopt.c getopt1.c guile.c implicit.c job.c load.c \
-               loadapi.c main.c misc.c $(ossrc) output.c read.c remake.c \
-               rule.c signame.c strcache.c variable.c version.c vpath.c \
-               hash.c $(remote)
+make_SRCS =    src/ar.c src/arscan.c src/commands.c src/commands.h \
+               src/debug.h src/default.c src/dep.h src/dir.c src/expand.c \
+               src/file.c src/filedef.h src/function.c src/getopt.c \
+               src/getopt.h src/getopt1.c src/gettext.h src/guile.c \
+               src/hash.c src/hash.h src/implicit.c src/job.c src/job.h \
+               src/load.c src/loadapi.c src/main.c src/makeint.h src/misc.c \
+               src/os.h src/output.c src/output.h src/read.c src/remake.c \
+               src/rule.c src/rule.h src/signame.c src/strcache.c \
+               src/variable.c src/variable.h src/version.c src/vpath.c
 
-EXTRA_make_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c
+w32_SRCS =     src/w32/pathstuff.c src/w32/w32os.c src/w32/compat/dirent.c \
+               src/w32/compat/posixfcn.c src/w32/include/dirent.h \
+               src/w32/include/dlfcn.h src/w32/include/pathstuff.h \
+               src/w32/include/sub_proc.h src/w32/include/w32err.h \
+               src/w32/subproc/misc.c src/w32/subproc/proc.h \
+               src/w32/subproc/sub_proc.c src/w32/subproc/w32err.c
 
-noinst_HEADERS = commands.h dep.h filedef.h job.h makeint.h rule.h variable.h \
-               debug.h getopt.h gettext.h hash.h output.h os.h
+vms_SRCS =     src/vms_exit.c src/vms_export_symbol.c src/vms_progname.c \
+               src/vmsdir.h src/vmsfunctions.c src/vmsify.c
 
-make_LDADD =   @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ \
-               $(GUILE_LIBS)
-# Only process if target is MS-Windows
-if WINDOWSENV
-    make_LDADD += $(W32LIB)
-endif
+amiga_SRCS =   src/amiga.c src/amiga.h
 
-man_MANS =     make.1
+glob_SRCS =    lib/fnmatch.c lib/fnmatch.h lib/glob.c lib/glob.h
 
-DEFS =         -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@
+alloca_SRCS =  lib/alloca.c
 
-AM_CPPFLAGS =  $(GLOBINC)
-AM_CFLAGS =    $(GUILE_CFLAGS)
-# Only process if target is MS-Windows
-if WINDOWSENV
-    AM_CPPFLAGS +=     $(W32INC)
-endif
+loadavg_SRCS = lib/getloadavg.c
 
+make_SOURCES = $(make_SRCS)
+EXTRA_make_SOURCES = $(amiga_SRCS) $(vms_SRCS)
 
-# Extra stuff to include in the distribution.
+make_LDADD =   $(LIBOBJS) $(GUILE_LIBS) lib/libgnu.a $(GETLOADAVG_LIBS) \
+               @LIBINTL@
 
-EXTRA_DIST =   ChangeLog README build.sh.in $(man_MANS) \
-               README.customs README.OS2 \
-               SCOPTIONS SMakefile \
-               README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h \
-               README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\
-               README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat \
-               make_msvc_net2003.sln make_msvc_net2003.vcproj \
-               README.VMS makefile.vms makefile.com config.h-vms \
-               vmsdir.h vmsfunctions.c vmsify.c vms_exit.c vms_progname.c \
-               vms_export_symbol.c vms_export_symbol_test.com \
-               gmk-default.scm gmk-default.h
+localedir =    $(datadir)/locale
 
-# This is built during configure, but behind configure's back
+AM_CPPFLAGS =  -Isrc -I$(top_srcdir)/src -Ilib -I$(top_srcdir)/lib \
+               -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" \
+               -DLOCALEDIR=\"$(localedir)\"
 
-DISTCLEANFILES = build.sh
+AM_CFLAGS =    $(GUILE_CFLAGS)
 
-# --------------- Internationalization Section
+if WINDOWSENV
+  make_SOURCES += $(w32_SRCS)
+  AM_CPPFLAGS  += -I $(top_srcdir)/src/w32/include
+else
+  make_SOURCES += src/posixos.c
+endif
 
-localedir =    $(datadir)/locale
+if USE_CUSTOMS
+  make_SOURCES += src/remote-cstms.c
+else
+  make_SOURCES += src/remote-stub.c
+endif
 
-# --------------- Local INSTALL Section
+# Extra stuff to include in the distribution.
 
-# If necessary, change the gid of the app and turn on the setgid flag.
-#
+mk_FILES =     Basic.mk mk/msdosdjgpp.mk mk/Amiga.mk mk/VMS.mk mk/Windows32.mk
+# We don't need this, since the standard automake output will do.
+#mk/Posix.mk.in
 
-# Whether or not make needs to be installed setgid.
-# The value should be either 'true' or 'false'.
-# On many systems, the getloadavg function (used to implement the '-l'
-# switch) will not work unless make is installed setgid kmem.
-#
-inst_setgid = @NEED_SETGID@
+m4_FILES =     m4/gnulib-cache.m4
 
-# Install make setgid to this group so it can get the load average.
-#
-inst_group = @KMEM_GROUP@
-
-install-exec-local:
-       @if $(inst_setgid); then \
-          app=$(DESTDIR)$(bindir)/`echo $(bin_PROGRAMS)|sed '$(transform)'`; \
-          if chgrp $(inst_group) $$app && chmod g+s $$app; then \
-            echo "chgrp $(inst_group) $$app && chmod g+s $$app"; \
-          else \
-            echo "$$app needs to be owned by group $(inst_group) and setgid;"; \
-            echo "otherwise the '-l' option will probably not work."; \
-            echo "You may need special privileges to complete the installation"; \
-            echo "of $$app."; \
-          fi; \
-        else true; fi
+test_FILES =   tests/run_make_tests tests/run_make_tests.bat \
+               tests/run_make_tests.pl tests/test_driver.pl \
+               tests/config-flags.pm.in tests/config_flags_pm.com \
+               tests/config-flags.pm.W32 \
+               tests/mkshadow tests/thelp.pl tests/guile.supp tests/README
+# test/scripts are added via dist-hook below.
+
+EXTRA_DIST =   ChangeLog README build.sh build.cfg.in $(man_MANS) \
+               README.customs README.OS2 \
+               README.Amiga SCOPTIONS src/config.ami \
+               README.DOS builddos.bat src/configh.dos \
+               README.W32 build_w32.bat src/config.h.W32 \
+               README.VMS makefile.com src/config.h-vms src/vmsjobs.c \
+               vms_export_symbol_test.com \
+               src/gmk-default.scm src/gmk-default.h \
+               $(mk_FILES) $(m4_FILES) $(test_FILES)
 
 # --------------- Generate the Guile default module content
 
-guile.$(OBJEXT): gmk-default.h
-gmk-default.h: $(srcdir)/gmk-default.scm
+src/guile.$(OBJEXT): src/gmk-default.h
+src/gmk-default.h: $(top_srcdir)/src/gmk-default.scm
        (echo 'static const char *const GUILE_module_defn = " '\\ \
          && sed -e 's/;.*//' -e '/^[ \t]*$$/d' -e 's/"/\\"/g' -e 's/$$/ \\/' \
-                $(srcdir)/gmk-default.scm \
-         && echo '";') > $@
+                $(top_srcdir)/src/gmk-default.scm \
+         && echo '";') > src/gmk-default.h
 
 # --------------- Local DIST Section
 
-# Install the w32 and tests subdirectories
+# Install the mk and tests subdirectories
 #
 dist-hook:
-       (cd $(srcdir); \
-        sub=`find w32 tests -follow \( -name .git -o -name .deps -o -name work -o -name .gitignore -o -name \*.orig -o -name \*.rej -o -name \*~ -o -name Makefile \) -prune -o -type f -print`; \
+       (cd $(top_srcdir); \
+        sub=`find tests/scripts -follow \( -name .git -o -name .deps -o -name work -o -name .gitignore -o -name \*.orig -o -name \*.rej -o -name \*~ -o -name \*.out -o -name Makefile \) -prune -o -type f -print`; \
         tar chf - $$sub) \
        | (cd $(distdir); tar xfBp -)
 
 
 # --------------- Local CHECK Section
 
-check-local: check-regression check-loadavg
+check-local: check-regression
        @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \
        dashes=`echo "$$banner" | sed s/./=/g`; \
        echo; \
@@ -154,20 +139,6 @@ check-local: check-regression check-loadavg
        echo "$$dashes"; \
        echo
 
-.PHONY: check-loadavg check-regression
-
-check-loadavg: loadavg$(EXEEXT)
-       @echo The system uptime program believes the load average to be:
-       -uptime
-       @echo The GNU load average checking code thinks:
-       -./loadavg$(EXEEXT)
-
-# The loadavg function is invoked during "make check" to test getloadavg.
-check_PROGRAMS = loadavg
-nodist_loadavg_SOURCES = getloadavg.c
-loadavg_CPPFLAGS = -DTEST
-loadavg_LDADD = @GETLOADAVG_LIBS@
-
 # > check-regression
 #
 # Look for the make test suite, and run it if found and we can find perl.
@@ -176,25 +147,27 @@ loadavg_LDADD = @GETLOADAVG_LIBS@
 #
 MAKETESTFLAGS =
 
+.PHONY: check-regression
+
 check-regression: tests/config-flags.pm
-       @if test -f '$(srcdir)/tests/run_make_tests'; then \
+       @if test -f '$(top_srcdir)/tests/run_make_tests'; then \
          ulimit -n 128; \
          if $(PERL) -v >/dev/null 2>&1; then \
-           case `cd '$(srcdir)'; pwd` in `pwd`) : ;; \
+           case `cd '$(top_srcdir)'; pwd` in `pwd`) : ;; \
              *) test -d tests || mkdir tests; \
                 rm -f srctests; \
-                if ln -s '$(srcdir)/tests' srctests; then \
-                  for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \
+                if ln -s '$(top_srcdir)/tests' srctests; then \
+                  for f in run_make_tests run_make_tests.pl test_driver.pl scripts jhelp.pl; do \
                     rm -f tests/$$f; ln -s ../srctests/$$f tests; \
                   done; fi ;; \
            esac; \
-           echo "cd tests && $(PERL) ./run_make_tests.pl -srcdir $(abs_srcdir) -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \
-           cd tests && $(PERL) ./run_make_tests.pl -srcdir '$(abs_srcdir)' -make '../make$(EXEEXT)' $(MAKETESTFLAGS); \
+           echo "cd tests && $(PERL) $(PERLFLAGS) ./run_make_tests.pl -srcdir $(abs_top_srcdir) -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \
+           cd tests && $(PERL) $(PERLFLAGS) ./run_make_tests.pl -srcdir '$(abs_top_srcdir)' -make '../make$(EXEEXT)' $(MAKETESTFLAGS); \
          else \
            echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \
          fi; \
        else \
-         echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \
+         echo "Can't find the GNU Make test suite ($(top_srcdir)/tests)."; \
        fi
 
 
diff --git a/Makefile.ami b/Makefile.ami
deleted file mode 100644 (file)
index 39a9788..0000000
+++ /dev/null
@@ -1,308 +0,0 @@
-# -*-Makefile-*- for GNU make on Amiga
-#
-# NOTE: If you have no 'make' program at all to process this makefile, run
-# 'build.sh' instead.
-#
-# Copyright (C) 1995-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-#
-#      Makefile for GNU Make
-#
-
-CC = sc
-RM = delete
-
-CFLAGS =
-CPPFLAGS =
-LDFLAGS =
-
-# Define these for your system as follows:
-#      -DNO_ARCHIVES           To disable 'ar' archive support.
-#      -DNO_FLOAT              To avoid using floating-point numbers.
-#      -DENUM_BITFIELDS        If the compiler isn't GCC but groks enum foo:2.
-#                              Some compilers apparently accept this
-#                              without complaint but produce losing code,
-#                              so beware.
-# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
-# See also 'config.h'.
-defines =
-
-# Which flavor of remote job execution support to use.
-# The code is found in 'remote-$(REMOTE).c'.
-REMOTE = stub
-
-# If you are using the GNU C library, or have the GNU getopt functions in
-# your C library, you can comment these out.
-GETOPT = getopt.o getopt1.o
-GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h
-
-# If you are using the GNU C library, or have the GNU glob functions in
-# your C library, you can comment this out.  GNU make uses special hooks
-# into the glob functions to be more efficient (by using make's directory
-# cache for globbing), so you must use the GNU functions even if your
-# system's C library has the 1003.2 glob functions already.  Also, the glob
-# functions in the AIX and HPUX C libraries are said to be buggy.
-GLOB = glob/glob.lib
-
-# If your system doesn't have alloca, or the one provided is bad, define this.
-ALLOCA = alloca.o
-ALLOCA_SRC = $(srcdir)alloca.c
-
-# If your system needs extra libraries loaded in, define them here.
-# System V probably need -lPW for alloca.  HP-UX 7.0's alloca in
-# libPW.a is broken on HP9000s300 and HP9000s400 machines.  Use
-# alloca.c instead on those machines.
-LOADLIBES =
-
-# Any extra object files your system needs.
-extras = amiga.o
-
-# Common prefix for machine-independent installed files.
-prefix =
-# Common prefix for machine-dependent installed files.
-exec_prefix =
-
-# Directory to install 'make' in.
-bindir = sc:c
-# Directory to find libraries in for '-lXXX'.
-libdir = lib:
-# Directory to search by default for included makefiles.
-includedir = include:
-# Directory to install the Info files in.
-infodir = doc:
-# Directory to install the man page in.
-mandir = t:
-# Number to put on the man page filename.
-manext = 1
-# Prefix to put on installed 'make' binary file name.
-binprefix =
-# Prefix to put on installed 'make' man page file name.
-manprefix = $(binprefix)
-
-# Whether or not make needs to be installed setgid.
-# The value should be either 'true' or 'false'.
-# On many systems, the getloadavg function (used to implement the '-l'
-# switch) will not work unless make is installed setgid kmem.
-install_setgid = false
-# Install make setgid to this group so it can read /dev/kmem.
-group = sys
-
-# Program to install 'make'.
-INSTALL_PROGRAM = copy
-# Program to install the man page.
-INSTALL_DATA = copy
-# Generic install program.
-INSTALL = copy
-
-# Program to format Texinfo source into Info files.
-MAKEINFO = makeinfo
-# Program to format Texinfo source into DVI files.
-TEXI2DVI = texi2dvi
-
-# Programs to make tags files.
-ETAGS = etags -w
-CTAGS = ctags -w
-
-#guile = guile.o
-
-objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o   \
-       rule.o implicit.o default.o variable.o expand.o function.o    \
-       vpath.o version.o ar.o arscan.o signame.o strcache.o hash.o   \
-       remote-$(REMOTE).o $(GETOPT) $(ALLOCA) $(extras) $(guile)
-
-srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c             \
-       $(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c         \
-       $(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c             \
-       $(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c        \
-       $(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c     \
-       $(srcdir)vpath.c $(srcdir)version.c $(srcdir)hash.c           \
-       $(srcdir)guile.c $(srcdir)remote-$(REMOTE).c                  \
-       $(srcdir)ar.c $(srcdir)arscan.c $(srcdir)strcache.c           \
-       $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC)           \
-       $(srcdir)commands.h $(srcdir)dep.h $(srcdir)filedep.h         \
-       $(srcdir)job.h $(srcdir)makeint.h $(srcdir)rule.h             \
-       $(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in
-
-
-.SUFFIXES:
-.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
-
-all: make
-info: make.info
-dvi: make.dvi
-# Some makes apparently use .PHONY as the default goal if it is before 'all'.
-.PHONY: all check info dvi
-
-make.info: make.texinfo
-       $(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info
-
-make.dvi: make.texinfo
-       $(TEXI2DVI) $(srcdir)make.texinfo
-
-make.ps: make.dvi
-       dvi2ps make.dvi > make.ps
-
-make: $(objs) $(GLOB)
-       $(CC) Link $(LDFLAGS) $(objs) Lib $(GLOB) $(LOADLIBES) To make.new
-       -delete make
-       rename make.new make
-
-TMPFILE = t:Make$$
-
-$(GLOB):
-       cd glob @@\
-       $(MAKE) -$(MAKEFLAGS) -f Makefile
-
-# -I. is needed to find config.h in the build directory.
-OUTPUT_OPTION =
-.c.o:
-       $(CC) $(defines) IDir "" IDir glob \
-             $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
-
-# For some losing Unix makes.
-SHELL = /bin/sh
-#@SET_MAKE@
-
-glob/libglob.a: FORCE config.h
-       cd glob; $(MAKE) libglob.a
-FORCE:
-
-.PHONY: install installdirs
-install: installdirs \
-        $(bindir)$(binprefix)make $(infodir)make.info \
-        $(mandir)$(manprefix)make.$(manext)
-
-installdirs:
-       $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir)
-
-$(bindir)$(binprefix)make: make
-       $(INSTALL_PROGRAM) make $@.new
-       @if $(install_setgid); then \
-          if chgrp $(group) $@.new && chmod g+s $@.new; then \
-            echo "chgrp $(group) $@.new && chmod g+s $@.new"; \
-          else \
-            echo "$@ needs to be owned by group $(group) and setgid;"; \
-            echo "otherwise the '-l' option will probably not work."; \
-            echo "You may need special privileges to install $@."; \
-          fi; \
-        else true; fi
-# Some systems can't deal with renaming onto a running binary.
-       -$(RM) $@.old
-       -mv $@ $@.old
-       mv $@.new $@
-
-$(infodir)make.info: make.info
-       if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \
-       for file in $${dir}/make.info*; do \
-         name="`basename $$file`"; \
-         $(INSTALL_DATA) $$file \
-           `echo $@ | sed "s,make.info\$$,$$name,"`; \
-       done
-# Run install-info only if it exists.
-# Use 'if' instead of just prepending '-' to the
-# line so we notice real errors from install-info.
-# We use '$(SHELL) -c' because some shells do not
-# fail gracefully when there is an unknown command.
-       if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
-         if [ -r ./make.info ]; then dir=.; else dir=$(srcdir); fi; \
-         install-info --infodir=$(infodir) $$dir/make.info; \
-       else true; fi
-
-$(mandir)$(manprefix)make.$(manext): make.man
-       $(INSTALL_DATA) $(srcdir)make.man $@
-
-
-loadavg: loadavg.c config.h
-       $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \
-             loadavg.c $(LOADLIBES) -o $@
-# We copy getloadavg.c into a different file rather than compiling it
-# directly because some compilers clobber getloadavg.o in the process.
-loadavg.c: getloadavg.c
-       ln $(srcdir)getloadavg.c loadavg.c || \
-       cp $(srcdir)getloadavg.c loadavg.c
-check-loadavg: loadavg
-       @echo The system uptime program believes the load average to be:
-       -uptime
-       @echo The GNU load average checking code believes:
-       ./loadavg
-check: check-loadavg
-
-
-.PHONY: clean realclean distclean mostlyclean
-clean: glob-clean
-       -$(RM) make loadavg "#?.o" core make.dvi
-
-distclean: clean glob-realclean
-       -$(RM) Makefile config.h config.status build.sh
-       -$(RM) config.log config.cache
-       -$(RM) TAGS tags
-       -$(RM) make.?? make.??s make.log make.toc make.*aux
-       -$(RM) loadavg.c
-
-realclean: distclean
-       -$(RM) make.info*
-mostlyclean: clean
-
-.PHONY: glob-clean glob-realclean
-glob-clean glob-realclean:
-       cd glob @@\
-       $(MAKE) $@
-
-# This tells versions [3.59,3.63) of GNU make not to export all variables.
-.NOEXPORT:
-
-# The automatically generated dependencies below may omit config.h
-# because it is included with '#include <config.h>' rather than
-# '#include "config.h"'.  So we add the explicit dependency to make sure.
-$(objs): config.h
-
-# Automatically generated dependencies will be put at the end of the file.
-
-# Automatically generated dependencies.
-commands.o: commands.c makeint.h dep.h filedef.h variable.h job.h \
- commands.h
-job.o: job.c makeint.h job.h filedef.h commands.h variable.h
-dir.o: dir.c makeint.h
-file.o: file.c makeint.h dep.h filedef.h job.h commands.h variable.h
-misc.o: misc.c makeint.h dep.h
-main.o: main.c makeint.h dep.h filedef.h variable.h job.h commands.h \
- getopt.h
-guile.o: guile.c makeint.h dep.h debug.h variable.h gmk-default.h
-read.o: read.c makeint.h dep.h filedef.h job.h commands.h variable.h \
- glob/glob.h
-remake.o: remake.c makeint.h filedef.h job.h commands.h dep.h
-rule.o: rule.c makeint.h dep.h filedef.h job.h commands.h variable.h \
- rule.h
-implicit.o: implicit.c makeint.h rule.h dep.h filedef.h
-default.o: default.c makeint.h rule.h dep.h filedef.h job.h commands.h \
- variable.h
-variable.o: variable.c makeint.h dep.h filedef.h job.h commands.h \
- variable.h
-expand.o: expand.c makeint.h filedef.h job.h commands.h variable.h
-function.o: function.c makeint.h filedef.h variable.h dep.h job.h \
- commands.h amiga.h
-vpath.o: vpath.c makeint.h filedef.h variable.h
-strcache.o: strcache.c makeint.h hash.h
-version.o: version.c
-ar.o: ar.c makeint.h filedef.h dep.h
-arscan.o: arscan.c makeint.h
-signame.o: signame.c signame.h
-remote-stub.o: remote-stub.c makeint.h filedef.h job.h commands.h
-getopt.o: getopt.c
-getopt1.o : getopt1.c getopt.h
-getloadavg.o: getloadavg.c
-amiga.o: amiga.c makeint.h variable.h amiga.h
index 67b7616fd8fb6ecbf307c9bcd40b153d7f3cc2b6..9535058f0accb7c49fef7199a2799eecf433c031 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -16,7 +16,7 @@
 
 # This is a -*-Makefile-*-, or close enough
 #
-# Copyright (C) 1997-2016 Free Software Foundation, Inc.
+# Copyright (C) 1997-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
@@ -108,63 +108,103 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 bin_PROGRAMS = make$(EXEEXT)
-# Only process if target is MS-Windows
-@WINDOWSENV_TRUE@am__append_1 = $(W32LIB)
-# Only process if target is MS-Windows
-@WINDOWSENV_TRUE@am__append_2 = $(W32INC)
-check_PROGRAMS = loadavg$(EXEEXT)
+@WINDOWSENV_TRUE@am__append_1 = $(w32_SRCS)
+@WINDOWSENV_TRUE@am__append_2 = -I $(top_srcdir)/src/w32/include
+@WINDOWSENV_FALSE@am__append_3 = src/posixos.c
+@USE_CUSTOMS_TRUE@am__append_4 = src/remote-cstms.c
+@USE_CUSTOMS_FALSE@am__append_5 = src/remote-stub.c
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \
-       $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \
-       $(top_srcdir)/config/intlmacosx.m4 \
-       $(top_srcdir)/config/lib-ld.m4 \
-       $(top_srcdir)/config/lib-link.m4 \
-       $(top_srcdir)/config/lib-prefix.m4 \
-       $(top_srcdir)/config/longlong.m4 $(top_srcdir)/config/nls.m4 \
-       $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \
-       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+       $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+       $(top_srcdir)/m4/acinclude.m4 $(top_srcdir)/m4/alloca.m4 \
+       $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/close.m4 \
+       $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dospaths.m4 \
+       $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \
+       $(top_srcdir)/m4/eaccess.m4 $(top_srcdir)/m4/errno_h.m4 \
+       $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/extensions.m4 \
+       $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fcntl-o.m4 \
+       $(top_srcdir)/m4/fcntl.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+       $(top_srcdir)/m4/findprog-in.m4 \
+       $(top_srcdir)/m4/getdtablesize.m4 \
+       $(top_srcdir)/m4/getloadavg.m4 $(top_srcdir)/m4/getprogname.m4 \
+       $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+       $(top_srcdir)/m4/gnulib-comp.m4 \
+       $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/include_next.m4 \
+       $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \
+       $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+       $(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/longlong.m4 \
+       $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+       $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/off_t.m4 \
+       $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \
+       $(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdint.m4 \
+       $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+       $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strerror.m4 \
+       $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/sys_socket_h.m4 \
+       $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/unistd_h.m4 \
+       $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
-       $(am__configure_deps) $(include_HEADERS) $(noinst_HEADERS) \
-       $(am__DIST_COMMON)
+       $(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = tests/config-flags.pm
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES = build.cfg tests/config-flags.pm
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
        "$(DESTDIR)$(includedir)"
 PROGRAMS = $(bin_PROGRAMS)
-nodist_loadavg_OBJECTS = loadavg-getloadavg.$(OBJEXT)
-loadavg_OBJECTS = $(nodist_loadavg_OBJECTS)
-loadavg_DEPENDENCIES =
-am__make_SOURCES_DIST = ar.c arscan.c commands.c default.c dir.c \
-       expand.c file.c function.c getopt.c getopt1.c guile.c \
-       implicit.c job.c load.c loadapi.c main.c misc.c posixos.c \
-       output.c read.c remake.c rule.c signame.c strcache.c \
-       variable.c version.c vpath.c hash.c remote-stub.c \
-       remote-cstms.c
-@WINDOWSENV_FALSE@am__objects_1 = posixos.$(OBJEXT)
-@USE_CUSTOMS_FALSE@am__objects_2 = remote-stub.$(OBJEXT)
-@USE_CUSTOMS_TRUE@am__objects_2 = remote-cstms.$(OBJEXT)
-am_make_OBJECTS = ar.$(OBJEXT) arscan.$(OBJEXT) commands.$(OBJEXT) \
-       default.$(OBJEXT) dir.$(OBJEXT) expand.$(OBJEXT) \
-       file.$(OBJEXT) function.$(OBJEXT) getopt.$(OBJEXT) \
-       getopt1.$(OBJEXT) guile.$(OBJEXT) implicit.$(OBJEXT) \
-       job.$(OBJEXT) load.$(OBJEXT) loadapi.$(OBJEXT) main.$(OBJEXT) \
-       misc.$(OBJEXT) $(am__objects_1) output.$(OBJEXT) \
-       read.$(OBJEXT) remake.$(OBJEXT) rule.$(OBJEXT) \
-       signame.$(OBJEXT) strcache.$(OBJEXT) variable.$(OBJEXT) \
-       version.$(OBJEXT) vpath.$(OBJEXT) hash.$(OBJEXT) \
-       $(am__objects_2)
+am__make_SOURCES_DIST = src/ar.c src/arscan.c src/commands.c \
+       src/commands.h src/debug.h src/default.c src/dep.h src/dir.c \
+       src/expand.c src/file.c src/filedef.h src/function.c \
+       src/getopt.c src/getopt.h src/getopt1.c src/gettext.h \
+       src/guile.c src/hash.c src/hash.h src/implicit.c src/job.c \
+       src/job.h src/load.c src/loadapi.c src/main.c src/makeint.h \
+       src/misc.c src/os.h src/output.c src/output.h src/read.c \
+       src/remake.c src/rule.c src/rule.h src/signame.c \
+       src/strcache.c src/variable.c src/variable.h src/version.c \
+       src/vpath.c src/w32/pathstuff.c src/w32/w32os.c \
+       src/w32/compat/dirent.c src/w32/compat/posixfcn.c \
+       src/w32/include/dirent.h src/w32/include/dlfcn.h \
+       src/w32/include/pathstuff.h src/w32/include/sub_proc.h \
+       src/w32/include/w32err.h src/w32/subproc/misc.c \
+       src/w32/subproc/proc.h src/w32/subproc/sub_proc.c \
+       src/w32/subproc/w32err.c src/posixos.c src/remote-cstms.c \
+       src/remote-stub.c
+am__dirstamp = $(am__leading_dot)dirstamp
+am__objects_1 = src/ar.$(OBJEXT) src/arscan.$(OBJEXT) \
+       src/commands.$(OBJEXT) src/default.$(OBJEXT) src/dir.$(OBJEXT) \
+       src/expand.$(OBJEXT) src/file.$(OBJEXT) src/function.$(OBJEXT) \
+       src/getopt.$(OBJEXT) src/getopt1.$(OBJEXT) src/guile.$(OBJEXT) \
+       src/hash.$(OBJEXT) src/implicit.$(OBJEXT) src/job.$(OBJEXT) \
+       src/load.$(OBJEXT) src/loadapi.$(OBJEXT) src/main.$(OBJEXT) \
+       src/misc.$(OBJEXT) src/output.$(OBJEXT) src/read.$(OBJEXT) \
+       src/remake.$(OBJEXT) src/rule.$(OBJEXT) src/signame.$(OBJEXT) \
+       src/strcache.$(OBJEXT) src/variable.$(OBJEXT) \
+       src/version.$(OBJEXT) src/vpath.$(OBJEXT)
+am__objects_2 = src/w32/pathstuff.$(OBJEXT) src/w32/w32os.$(OBJEXT) \
+       src/w32/compat/dirent.$(OBJEXT) \
+       src/w32/compat/posixfcn.$(OBJEXT) \
+       src/w32/subproc/misc.$(OBJEXT) \
+       src/w32/subproc/sub_proc.$(OBJEXT) \
+       src/w32/subproc/w32err.$(OBJEXT)
+@WINDOWSENV_TRUE@am__objects_3 = $(am__objects_2)
+@WINDOWSENV_FALSE@am__objects_4 = src/posixos.$(OBJEXT)
+@USE_CUSTOMS_TRUE@am__objects_5 = src/remote-cstms.$(OBJEXT)
+@USE_CUSTOMS_FALSE@am__objects_6 = src/remote-stub.$(OBJEXT)
+am_make_OBJECTS = $(am__objects_1) $(am__objects_3) $(am__objects_4) \
+       $(am__objects_5) $(am__objects_6)
 make_OBJECTS = $(am_make_OBJECTS)
 am__DEPENDENCIES_1 =
-@WINDOWSENV_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
-make_DEPENDENCIES = @LIBOBJS@ @ALLOCA@ $(am__DEPENDENCIES_1) \
-       $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+make_DEPENDENCIES = $(LIBOBJS) $(am__DEPENDENCIES_1) lib/libgnu.a \
+       $(am__DEPENDENCIES_1)
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -177,14 +217,34 @@ AM_V_at = $(am__v_at_@AM_V@)
 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/config/depcomp
-am__depfiles_maybe = depfiles
+DEFAULT_INCLUDES = 
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = src/$(DEPDIR)/amiga.Po src/$(DEPDIR)/ar.Po \
+       src/$(DEPDIR)/arscan.Po src/$(DEPDIR)/commands.Po \
+       src/$(DEPDIR)/default.Po src/$(DEPDIR)/dir.Po \
+       src/$(DEPDIR)/expand.Po src/$(DEPDIR)/file.Po \
+       src/$(DEPDIR)/function.Po src/$(DEPDIR)/getopt.Po \
+       src/$(DEPDIR)/getopt1.Po src/$(DEPDIR)/guile.Po \
+       src/$(DEPDIR)/hash.Po src/$(DEPDIR)/implicit.Po \
+       src/$(DEPDIR)/job.Po src/$(DEPDIR)/load.Po \
+       src/$(DEPDIR)/loadapi.Po src/$(DEPDIR)/main.Po \
+       src/$(DEPDIR)/misc.Po src/$(DEPDIR)/output.Po \
+       src/$(DEPDIR)/posixos.Po src/$(DEPDIR)/read.Po \
+       src/$(DEPDIR)/remake.Po src/$(DEPDIR)/remote-cstms.Po \
+       src/$(DEPDIR)/remote-stub.Po src/$(DEPDIR)/rule.Po \
+       src/$(DEPDIR)/signame.Po src/$(DEPDIR)/strcache.Po \
+       src/$(DEPDIR)/variable.Po src/$(DEPDIR)/version.Po \
+       src/$(DEPDIR)/vms_exit.Po src/$(DEPDIR)/vms_export_symbol.Po \
+       src/$(DEPDIR)/vms_progname.Po src/$(DEPDIR)/vmsfunctions.Po \
+       src/$(DEPDIR)/vmsify.Po src/$(DEPDIR)/vpath.Po \
+       src/w32/$(DEPDIR)/pathstuff.Po src/w32/$(DEPDIR)/w32os.Po \
+       src/w32/compat/$(DEPDIR)/dirent.Po \
+       src/w32/compat/$(DEPDIR)/posixfcn.Po \
+       src/w32/subproc/$(DEPDIR)/misc.Po \
+       src/w32/subproc/$(DEPDIR)/sub_proc.Po \
+       src/w32/subproc/$(DEPDIR)/w32err.Po
 am__mv = mv -f
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 = 
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 AM_V_CC = $(am__v_CC_@AM_V@)
@@ -197,8 +257,7 @@ AM_V_CCLD = $(am__v_CCLD_@AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(nodist_loadavg_SOURCES) $(make_SOURCES) \
-       $(EXTRA_make_SOURCES)
+SOURCES = $(make_SOURCES) $(EXTRA_make_SOURCES)
 DIST_SOURCES = $(am__make_SOURCES_DIST) $(EXTRA_make_SOURCES)
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
        ctags-recursive dvi-recursive html-recursive info-recursive \
@@ -243,7 +302,7 @@ am__uninstall_files_from_dir = { \
 man1dir = $(mandir)/man1
 NROFF = nroff
 MANS = $(man_MANS)
-HEADERS = $(include_HEADERS) $(noinst_HEADERS)
+HEADERS = $(include_HEADERS)
 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
   distclean-recursive maintainer-clean-recursive
 am__recursive_targets = \
@@ -251,9 +310,8 @@ am__recursive_targets = \
   $(RECURSIVE_CLEAN_TARGETS) \
   $(am__extra_recursive_targets)
 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
-       cscope distdir dist dist-all distcheck
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
-       $(LISP)config.h.in
+       cscope distdir distdir-am dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
 # *not* preserved.
@@ -273,15 +331,19 @@ am__define_uniq_tagged_files = \
 ETAGS = etags
 CTAGS = ctags
 CSCOPE = cscope
-DIST_SUBDIRS = glob config po doc w32
-am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
-       $(top_srcdir)/config/ar-lib $(top_srcdir)/config/compile \
-       $(top_srcdir)/config/config.guess \
-       $(top_srcdir)/config/config.rpath \
-       $(top_srcdir)/config/config.sub $(top_srcdir)/config/depcomp \
-       $(top_srcdir)/config/install-sh $(top_srcdir)/config/missing \
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/build.cfg.in \
+       $(top_srcdir)/build-aux/compile \
+       $(top_srcdir)/build-aux/config.guess \
+       $(top_srcdir)/build-aux/config.rpath \
+       $(top_srcdir)/build-aux/config.sub \
+       $(top_srcdir)/build-aux/depcomp \
+       $(top_srcdir)/build-aux/install-sh \
+       $(top_srcdir)/build-aux/missing $(top_srcdir)/src/config.h.in \
        $(top_srcdir)/tests/config-flags.pm.in ABOUT-NLS AUTHORS \
-       COPYING INSTALL NEWS README alloca.c getloadavg.c
+       COPYING NEWS README build-aux/compile build-aux/config.guess \
+       build-aux/config.rpath build-aux/config.sub build-aux/depcomp \
+       build-aux/install-sh build-aux/missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -317,45 +379,386 @@ am__relativize = \
     dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
   done; \
   reldir="$$dir2"
-DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.lz
 GZIP_ENV = --best
-DIST_TARGETS = dist-bzip2 dist-gzip
+DIST_TARGETS = dist-lzip dist-gzip
 distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
 distcleancheck_listfiles = find . -type f -print
 ACLOCAL = @ACLOCAL@
 ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_LDFLAGS = @AM_LDFLAGS@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
 AR = @AR@
+ARFLAGS = @ARFLAGS@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
 CYGPATH_W = @CYGPATH_W@
-DEFS = -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@
+DEFS = @DEFS@
 DEPDIR = @DEPDIR@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
 EXEEXT = @EXEEXT@
 GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
-GLOBINC = @GLOBINC@
-GLOBLIB = @GLOBLIB@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
 GREP = @GREP@
 GUILE_CFLAGS = @GUILE_CFLAGS@
 GUILE_LIBS = @GUILE_LIBS@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMCHR = @HAVE_MEMCHR@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOST_CPU = @HOST_CPU@
+HOST_CPU_C_ABI = @HOST_CPU_C_ABI@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -363,12 +766,14 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INTLLIBS = @INTLLIBS@
 INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-KMEM_GROUP = @KMEM_GROUP@
 LDFLAGS = @LDFLAGS@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
 LIBICONV = @LIBICONV@
 LIBINTL = @LIBINTL@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIMITS_H = @LIMITS_H@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
@@ -378,7 +783,26 @@ MKDIR_P = @MKDIR_P@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
-NEED_SETGID = @NEED_SETGID@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -393,14 +817,136 @@ PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
 RANLIB = @RANLIB@
 REMOTE = @REMOTE@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WRITE = @REPLACE_WRITE@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
 STRIP = @STRIP@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
 USE_NLS = @USE_NLS@
+USE_SYSTEM_GLOB = @USE_SYSTEM_GLOB@
 VERSION = @VERSION@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
 XGETTEXT = @XGETTEXT@
 XGETTEXT_015 = @XGETTEXT_015@
 XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
@@ -408,7 +954,6 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -427,6 +972,11 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -438,8 +988,6 @@ infodir = @infodir@
 install_sh = @install_sh@
 libdir = @libdir@
 libexecdir = @libexecdir@
-
-# --------------- Internationalization Section
 localedir = $(datadir)/locale
 localstatedir = @localstatedir@
 mandir = @mandir@
@@ -458,70 +1006,68 @@ target_alias = @target_alias@
 top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = dist-bzip2 silent-rules std-options
-ACLOCAL_AMFLAGS = -I config
-
-# Only process if target is MS-Windows
-@WINDOWSENV_TRUE@MAYBE_W32 = w32
-@WINDOWSENV_TRUE@W32INC = -I $(top_srcdir)/w32/include
-@WINDOWSENV_TRUE@W32LIB = -Lw32 -lw32
-@WINDOWSENV_FALSE@ossrc = posixos.c
-@WINDOWSENV_TRUE@ossrc = 
-SUBDIRS = glob config po doc $(MAYBE_W32)
-include_HEADERS = gnumake.h
-@USE_CUSTOMS_FALSE@remote = remote-stub.c
-@USE_CUSTOMS_TRUE@remote = remote-cstms.c
-make_SOURCES = ar.c arscan.c commands.c default.c dir.c expand.c file.c \
-               function.c getopt.c getopt1.c guile.c implicit.c job.c load.c \
-               loadapi.c main.c misc.c $(ossrc) output.c read.c remake.c \
-               rule.c signame.c strcache.c variable.c version.c vpath.c \
-               hash.c $(remote)
-
-EXTRA_make_SOURCES = vmsjobs.c remote-stub.c remote-cstms.c
-noinst_HEADERS = commands.h dep.h filedef.h job.h makeint.h rule.h variable.h \
-               debug.h getopt.h gettext.h hash.h output.h os.h
-
-make_LDADD = @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ \
-       $(GUILE_LIBS) $(am__append_1)
-man_MANS = make.1
-AM_CPPFLAGS = $(GLOBINC) $(am__append_2)
+AUTOMAKE_OPTIONS = dist-lzip silent-rules std-options subdir-objects nostdinc
+ACLOCAL_AMFLAGS = -I m4
+SUBDIRS = lib po doc
+include_HEADERS = src/gnumake.h
+man_MANS = doc/make.1
+make_SRCS = src/ar.c src/arscan.c src/commands.c src/commands.h \
+               src/debug.h src/default.c src/dep.h src/dir.c src/expand.c \
+               src/file.c src/filedef.h src/function.c src/getopt.c \
+               src/getopt.h src/getopt1.c src/gettext.h src/guile.c \
+               src/hash.c src/hash.h src/implicit.c src/job.c src/job.h \
+               src/load.c src/loadapi.c src/main.c src/makeint.h src/misc.c \
+               src/os.h src/output.c src/output.h src/read.c src/remake.c \
+               src/rule.c src/rule.h src/signame.c src/strcache.c \
+               src/variable.c src/variable.h src/version.c src/vpath.c
+
+w32_SRCS = src/w32/pathstuff.c src/w32/w32os.c src/w32/compat/dirent.c \
+               src/w32/compat/posixfcn.c src/w32/include/dirent.h \
+               src/w32/include/dlfcn.h src/w32/include/pathstuff.h \
+               src/w32/include/sub_proc.h src/w32/include/w32err.h \
+               src/w32/subproc/misc.c src/w32/subproc/proc.h \
+               src/w32/subproc/sub_proc.c src/w32/subproc/w32err.c
+
+vms_SRCS = src/vms_exit.c src/vms_export_symbol.c src/vms_progname.c \
+               src/vmsdir.h src/vmsfunctions.c src/vmsify.c
+
+amiga_SRCS = src/amiga.c src/amiga.h
+glob_SRCS = lib/fnmatch.c lib/fnmatch.h lib/glob.c lib/glob.h
+alloca_SRCS = lib/alloca.c
+loadavg_SRCS = lib/getloadavg.c
+make_SOURCES = $(make_SRCS) $(am__append_1) $(am__append_3) \
+       $(am__append_4) $(am__append_5)
+EXTRA_make_SOURCES = $(amiga_SRCS) $(vms_SRCS)
+make_LDADD = $(LIBOBJS) $(GUILE_LIBS) lib/libgnu.a $(GETLOADAVG_LIBS) \
+               @LIBINTL@
+
+AM_CPPFLAGS = -Isrc -I$(top_srcdir)/src -Ilib -I$(top_srcdir)/lib \
+       -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" \
+       -DLOCALEDIR=\"$(localedir)\" $(am__append_2)
 AM_CFLAGS = $(GUILE_CFLAGS)
 
 # Extra stuff to include in the distribution.
-EXTRA_DIST = ChangeLog README build.sh.in $(man_MANS) \
+mk_FILES = Basic.mk mk/msdosdjgpp.mk mk/Amiga.mk mk/VMS.mk mk/Windows32.mk
+# We don't need this, since the standard automake output will do.
+#mk/Posix.mk.in
+m4_FILES = m4/gnulib-cache.m4
+test_FILES = tests/run_make_tests tests/run_make_tests.bat \
+               tests/run_make_tests.pl tests/test_driver.pl \
+               tests/config-flags.pm.in tests/config_flags_pm.com \
+               tests/config-flags.pm.W32 \
+               tests/mkshadow tests/thelp.pl tests/guile.supp tests/README
+
+# test/scripts are added via dist-hook below.
+EXTRA_DIST = ChangeLog README build.sh build.cfg.in $(man_MANS) \
                README.customs README.OS2 \
-               SCOPTIONS SMakefile \
-               README.Amiga Makefile.ami config.ami make.lnk amiga.c amiga.h \
-               README.DOS Makefile.DOS configure.bat dosbuild.bat configh.dos\
-               README.W32 NMakefile config.h.W32 build_w32.bat subproc.bat \
-               make_msvc_net2003.sln make_msvc_net2003.vcproj \
-               README.VMS makefile.vms makefile.com config.h-vms \
-               vmsdir.h vmsfunctions.c vmsify.c vms_exit.c vms_progname.c \
-               vms_export_symbol.c vms_export_symbol_test.com \
-               gmk-default.scm gmk-default.h
-
-
-# This is built during configure, but behind configure's back
-DISTCLEANFILES = build.sh
+               README.Amiga SCOPTIONS src/config.ami \
+               README.DOS builddos.bat src/configh.dos \
+               README.W32 build_w32.bat src/config.h.W32 \
+               README.VMS makefile.com src/config.h-vms src/vmsjobs.c \
+               vms_export_symbol_test.com \
+               src/gmk-default.scm src/gmk-default.h \
+               $(mk_FILES) $(m4_FILES) $(test_FILES)
 
-# --------------- Local INSTALL Section
-
-# If necessary, change the gid of the app and turn on the setgid flag.
-#
-
-# Whether or not make needs to be installed setgid.
-# The value should be either 'true' or 'false'.
-# On many systems, the getloadavg function (used to implement the '-l'
-# switch) will not work unless make is installed setgid kmem.
-#
-inst_setgid = @NEED_SETGID@
-
-# Install make setgid to this group so it can get the load average.
-#
-inst_group = @KMEM_GROUP@
-nodist_loadavg_SOURCES = getloadavg.c
-loadavg_CPPFLAGS = -DTEST
-loadavg_LDADD = @GETLOADAVG_LIBS@
 
 # > check-regression
 #
@@ -530,8 +1076,7 @@ loadavg_LDADD = @GETLOADAVG_LIBS@
 # the test suite.  Unfortunately the test suite itself isn't localizable yet.
 #
 MAKETESTFLAGS = 
-all: config.h
-       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+all: all-recursive
 
 .SUFFIXES:
 .SUFFIXES: .c .o .obj
@@ -556,8 +1101,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
            echo ' $(SHELL) ./config.status'; \
            $(SHELL) ./config.status;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -569,20 +1114,22 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
        $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
 $(am__aclocal_m4_deps):
 
-config.h: stamp-h1
-       @test -f $@ || rm -f stamp-h1
-       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+src/config.h: src/stamp-h1
+       @test -f $@ || rm -f src/stamp-h1
+       @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1
 
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-       @rm -f stamp-h1
-       cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
+src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status
+       @rm -f src/stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+$(top_srcdir)/src/config.h.in:  $(am__configure_deps) 
        ($(am__cd) $(top_srcdir) && $(AUTOHEADER))
-       rm -f stamp-h1
+       rm -f src/stamp-h1
        touch $@
 
 distclean-hdr:
-       -rm -f config.h stamp-h1
+       -rm -f src/config.h src/stamp-h1
+build.cfg: $(top_builddir)/config.status $(srcdir)/build.cfg.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
 tests/config-flags.pm: $(top_builddir)/config.status $(top_srcdir)/tests/config-flags.pm.in
        cd $(top_builddir) && $(SHELL) ./config.status $@
 install-binPROGRAMS: $(bin_PROGRAMS)
@@ -643,13 +1190,103 @@ installcheck-binPROGRAMS: $(bin_PROGRAMS)
            else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
          done; \
        done; rm -f c$${pid}_.???; exit $$bad
-
-clean-checkPROGRAMS:
-       -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
-
-loadavg$(EXEEXT): $(loadavg_OBJECTS) $(loadavg_DEPENDENCIES) $(EXTRA_loadavg_DEPENDENCIES) 
-       @rm -f loadavg$(EXEEXT)
-       $(AM_V_CCLD)$(LINK) $(loadavg_OBJECTS) $(loadavg_LDADD) $(LIBS)
+src/$(am__dirstamp):
+       @$(MKDIR_P) src
+       @: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/$(DEPDIR)
+       @: > src/$(DEPDIR)/$(am__dirstamp)
+src/ar.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/arscan.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/commands.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/default.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/dir.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/expand.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/file.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/function.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/getopt.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/getopt1.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/guile.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/hash.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/implicit.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/job.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/load.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/loadapi.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/main.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/misc.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/output.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/read.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/remake.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/rule.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/signame.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/strcache.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/variable.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/version.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vpath.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/w32/$(am__dirstamp):
+       @$(MKDIR_P) src/w32
+       @: > src/w32/$(am__dirstamp)
+src/w32/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/w32/$(DEPDIR)
+       @: > src/w32/$(DEPDIR)/$(am__dirstamp)
+src/w32/pathstuff.$(OBJEXT): src/w32/$(am__dirstamp) \
+       src/w32/$(DEPDIR)/$(am__dirstamp)
+src/w32/w32os.$(OBJEXT): src/w32/$(am__dirstamp) \
+       src/w32/$(DEPDIR)/$(am__dirstamp)
+src/w32/compat/$(am__dirstamp):
+       @$(MKDIR_P) src/w32/compat
+       @: > src/w32/compat/$(am__dirstamp)
+src/w32/compat/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/w32/compat/$(DEPDIR)
+       @: > src/w32/compat/$(DEPDIR)/$(am__dirstamp)
+src/w32/compat/dirent.$(OBJEXT): src/w32/compat/$(am__dirstamp) \
+       src/w32/compat/$(DEPDIR)/$(am__dirstamp)
+src/w32/compat/posixfcn.$(OBJEXT): src/w32/compat/$(am__dirstamp) \
+       src/w32/compat/$(DEPDIR)/$(am__dirstamp)
+src/w32/subproc/$(am__dirstamp):
+       @$(MKDIR_P) src/w32/subproc
+       @: > src/w32/subproc/$(am__dirstamp)
+src/w32/subproc/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) src/w32/subproc/$(DEPDIR)
+       @: > src/w32/subproc/$(DEPDIR)/$(am__dirstamp)
+src/w32/subproc/misc.$(OBJEXT): src/w32/subproc/$(am__dirstamp) \
+       src/w32/subproc/$(DEPDIR)/$(am__dirstamp)
+src/w32/subproc/sub_proc.$(OBJEXT): src/w32/subproc/$(am__dirstamp) \
+       src/w32/subproc/$(DEPDIR)/$(am__dirstamp)
+src/w32/subproc/w32err.$(OBJEXT): src/w32/subproc/$(am__dirstamp) \
+       src/w32/subproc/$(DEPDIR)/$(am__dirstamp)
+src/posixos.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/remote-cstms.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/remote-stub.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/amiga.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/vms_exit.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vms_export_symbol.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vms_progname.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vmsfunctions.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
+src/vmsify.$(OBJEXT): src/$(am__dirstamp) \
+       src/$(DEPDIR)/$(am__dirstamp)
 
 make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES) $(EXTRA_make_DEPENDENCIES) 
        @rm -f make$(EXEEXT)
@@ -657,72 +1294,79 @@ make$(EXEEXT): $(make_OBJECTS) $(make_DEPENDENCIES) $(EXTRA_make_DEPENDENCIES)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
+       -rm -f src/*.$(OBJEXT)
+       -rm -f src/w32/*.$(OBJEXT)
+       -rm -f src/w32/compat/*.$(OBJEXT)
+       -rm -f src/w32/subproc/*.$(OBJEXT)
 
 distclean-compile:
        -rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getloadavg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ar.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/arscan.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commands.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/expand.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/function.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guile.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/implicit.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/job.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loadapi.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loadavg-getloadavg.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posixos.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remake.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-cstms.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-stub.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rule.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signame.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcache.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/variable.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vmsjobs.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vpath.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/amiga.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ar.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/arscan.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/commands.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dir.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/expand.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/function.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/getopt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/getopt1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/guile.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/hash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/implicit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/job.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/load.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/loadapi.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/misc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/output.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/posixos.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/read.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/remake.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/remote-cstms.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/remote-stub.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/rule.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/signame.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/strcache.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/variable.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/version.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vms_exit.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vms_export_symbol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vms_progname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vmsfunctions.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vmsify.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/vpath.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/$(DEPDIR)/pathstuff.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/$(DEPDIR)/w32os.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/compat/$(DEPDIR)/dirent.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/compat/$(DEPDIR)/posixfcn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/subproc/$(DEPDIR)/misc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/subproc/$(DEPDIR)/sub_proc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@src/w32/subproc/$(DEPDIR)/w32err.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
 
 .c.o:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
 
 .c.obj:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-loadavg-getloadavg.o: getloadavg.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loadavg-getloadavg.o -MD -MP -MF $(DEPDIR)/loadavg-getloadavg.Tpo -c -o loadavg-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/loadavg-getloadavg.Tpo $(DEPDIR)/loadavg-getloadavg.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='getloadavg.c' object='loadavg-getloadavg.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loadavg-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c
-
-loadavg-getloadavg.obj: getloadavg.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT loadavg-getloadavg.obj -MD -MP -MF $(DEPDIR)/loadavg-getloadavg.Tpo -c -o loadavg-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/loadavg-getloadavg.Tpo $(DEPDIR)/loadavg-getloadavg.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='getloadavg.c' object='loadavg-getloadavg.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(loadavg_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o loadavg-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi`
 install-man1: $(man_MANS)
        @$(NORMAL_INSTALL)
        @list1=''; \
@@ -894,7 +1538,10 @@ distclean-tags:
        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
        -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        $(am__remove_distdir)
        test -d "$(distdir)" || mkdir "$(distdir)"
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
@@ -962,12 +1609,12 @@ distdir: $(DISTFILES)
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
        $(am__post_remove_distdir)
+
 dist-bzip2: distdir
        tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
        $(am__post_remove_distdir)
-
 dist-lzip: distdir
        tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
        $(am__post_remove_distdir)
@@ -987,7 +1634,7 @@ dist-shar: distdir
        @echo WARNING: "Support for shar distribution archives is" \
                       "deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
        $(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -1005,7 +1652,7 @@ dist dist-all:
 distcheck: dist
        case '$(DIST_ARCHIVES)' in \
        *.tar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
        *.tar.lz*) \
@@ -1015,7 +1662,7 @@ distcheck: dist
        *.tar.Z*) \
          uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
        *.shar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
@@ -1085,10 +1732,9 @@ distcleancheck: distclean
               $(distcleancheck_listfiles) ; \
               exit 1; } >&2
 check-am: all-am
-       $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
        $(MAKE) $(AM_MAKEFLAGS) check-local
 check: check-recursive
-all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) config.h
+all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS)
 installdirs: installdirs-recursive
 installdirs-am:
        for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)"; do \
@@ -1120,19 +1766,67 @@ clean-generic:
 distclean-generic:
        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+       -rm -f src/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/$(am__dirstamp)
+       -rm -f src/w32/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/w32/$(am__dirstamp)
+       -rm -f src/w32/compat/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/w32/compat/$(am__dirstamp)
+       -rm -f src/w32/subproc/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/w32/subproc/$(am__dirstamp)
 
 maintainer-clean-generic:
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
 clean: clean-recursive
 
-clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
-       mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
 
 distclean: distclean-recursive
        -rm -f $(am__CONFIG_DISTCLEAN_FILES)
-       -rm -rf $(DEPDIR) ./$(DEPDIR)
+               -rm -f src/$(DEPDIR)/amiga.Po
+       -rm -f src/$(DEPDIR)/ar.Po
+       -rm -f src/$(DEPDIR)/arscan.Po
+       -rm -f src/$(DEPDIR)/commands.Po
+       -rm -f src/$(DEPDIR)/default.Po
+       -rm -f src/$(DEPDIR)/dir.Po
+       -rm -f src/$(DEPDIR)/expand.Po
+       -rm -f src/$(DEPDIR)/file.Po
+       -rm -f src/$(DEPDIR)/function.Po
+       -rm -f src/$(DEPDIR)/getopt.Po
+       -rm -f src/$(DEPDIR)/getopt1.Po
+       -rm -f src/$(DEPDIR)/guile.Po
+       -rm -f src/$(DEPDIR)/hash.Po
+       -rm -f src/$(DEPDIR)/implicit.Po
+       -rm -f src/$(DEPDIR)/job.Po
+       -rm -f src/$(DEPDIR)/load.Po
+       -rm -f src/$(DEPDIR)/loadapi.Po
+       -rm -f src/$(DEPDIR)/main.Po
+       -rm -f src/$(DEPDIR)/misc.Po
+       -rm -f src/$(DEPDIR)/output.Po
+       -rm -f src/$(DEPDIR)/posixos.Po
+       -rm -f src/$(DEPDIR)/read.Po
+       -rm -f src/$(DEPDIR)/remake.Po
+       -rm -f src/$(DEPDIR)/remote-cstms.Po
+       -rm -f src/$(DEPDIR)/remote-stub.Po
+       -rm -f src/$(DEPDIR)/rule.Po
+       -rm -f src/$(DEPDIR)/signame.Po
+       -rm -f src/$(DEPDIR)/strcache.Po
+       -rm -f src/$(DEPDIR)/variable.Po
+       -rm -f src/$(DEPDIR)/version.Po
+       -rm -f src/$(DEPDIR)/vms_exit.Po
+       -rm -f src/$(DEPDIR)/vms_export_symbol.Po
+       -rm -f src/$(DEPDIR)/vms_progname.Po
+       -rm -f src/$(DEPDIR)/vmsfunctions.Po
+       -rm -f src/$(DEPDIR)/vmsify.Po
+       -rm -f src/$(DEPDIR)/vpath.Po
+       -rm -f src/w32/$(DEPDIR)/pathstuff.Po
+       -rm -f src/w32/$(DEPDIR)/w32os.Po
+       -rm -f src/w32/compat/$(DEPDIR)/dirent.Po
+       -rm -f src/w32/compat/$(DEPDIR)/posixfcn.Po
+       -rm -f src/w32/subproc/$(DEPDIR)/misc.Po
+       -rm -f src/w32/subproc/$(DEPDIR)/sub_proc.Po
+       -rm -f src/w32/subproc/$(DEPDIR)/w32err.Po
        -rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
        distclean-hdr distclean-tags
@@ -1155,7 +1849,7 @@ install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
-install-exec-am: install-binPROGRAMS install-exec-local
+install-exec-am: install-binPROGRAMS
 
 install-html: install-html-recursive
 
@@ -1180,7 +1874,49 @@ installcheck-am: installcheck-binPROGRAMS
 maintainer-clean: maintainer-clean-recursive
        -rm -f $(am__CONFIG_DISTCLEAN_FILES)
        -rm -rf $(top_srcdir)/autom4te.cache
-       -rm -rf $(DEPDIR) ./$(DEPDIR)
+               -rm -f src/$(DEPDIR)/amiga.Po
+       -rm -f src/$(DEPDIR)/ar.Po
+       -rm -f src/$(DEPDIR)/arscan.Po
+       -rm -f src/$(DEPDIR)/commands.Po
+       -rm -f src/$(DEPDIR)/default.Po
+       -rm -f src/$(DEPDIR)/dir.Po
+       -rm -f src/$(DEPDIR)/expand.Po
+       -rm -f src/$(DEPDIR)/file.Po
+       -rm -f src/$(DEPDIR)/function.Po
+       -rm -f src/$(DEPDIR)/getopt.Po
+       -rm -f src/$(DEPDIR)/getopt1.Po
+       -rm -f src/$(DEPDIR)/guile.Po
+       -rm -f src/$(DEPDIR)/hash.Po
+       -rm -f src/$(DEPDIR)/implicit.Po
+       -rm -f src/$(DEPDIR)/job.Po
+       -rm -f src/$(DEPDIR)/load.Po
+       -rm -f src/$(DEPDIR)/loadapi.Po
+       -rm -f src/$(DEPDIR)/main.Po
+       -rm -f src/$(DEPDIR)/misc.Po
+       -rm -f src/$(DEPDIR)/output.Po
+       -rm -f src/$(DEPDIR)/posixos.Po
+       -rm -f src/$(DEPDIR)/read.Po
+       -rm -f src/$(DEPDIR)/remake.Po
+       -rm -f src/$(DEPDIR)/remote-cstms.Po
+       -rm -f src/$(DEPDIR)/remote-stub.Po
+       -rm -f src/$(DEPDIR)/rule.Po
+       -rm -f src/$(DEPDIR)/signame.Po
+       -rm -f src/$(DEPDIR)/strcache.Po
+       -rm -f src/$(DEPDIR)/variable.Po
+       -rm -f src/$(DEPDIR)/version.Po
+       -rm -f src/$(DEPDIR)/vms_exit.Po
+       -rm -f src/$(DEPDIR)/vms_export_symbol.Po
+       -rm -f src/$(DEPDIR)/vms_progname.Po
+       -rm -f src/$(DEPDIR)/vmsfunctions.Po
+       -rm -f src/$(DEPDIR)/vmsify.Po
+       -rm -f src/$(DEPDIR)/vpath.Po
+       -rm -f src/w32/$(DEPDIR)/pathstuff.Po
+       -rm -f src/w32/$(DEPDIR)/w32os.Po
+       -rm -f src/w32/compat/$(DEPDIR)/dirent.Po
+       -rm -f src/w32/compat/$(DEPDIR)/posixfcn.Po
+       -rm -f src/w32/subproc/$(DEPDIR)/misc.Po
+       -rm -f src/w32/subproc/$(DEPDIR)/sub_proc.Po
+       -rm -f src/w32/subproc/$(DEPDIR)/w32err.Po
        -rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -1201,11 +1937,11 @@ uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \
 
 uninstall-man: uninstall-man1
 
-.MAKE: $(am__recursive_targets) all check-am install-am install-strip
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
 
 .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
-       am--refresh check check-am check-local clean clean-binPROGRAMS \
-       clean-checkPROGRAMS clean-cscope clean-generic cscope \
+       am--depfiles am--refresh check check-am check-local clean \
+       clean-binPROGRAMS clean-cscope clean-generic cscope \
        cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
        dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \
        dist-zip distcheck distclean distclean-compile \
@@ -1213,55 +1949,41 @@ uninstall-man: uninstall-man1
        distdir distuninstallcheck dvi dvi-am html html-am info \
        info-am install install-am install-binPROGRAMS install-data \
        install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-exec-local install-html \
-       install-html-am install-includeHEADERS install-info \
-       install-info-am install-man install-man1 install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installcheck-binPROGRAMS \
-       installdirs installdirs-am maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
-       uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS \
-       uninstall-man uninstall-man1
+       install-exec-am install-html install-html-am \
+       install-includeHEADERS install-info install-info-am \
+       install-man install-man1 install-pdf install-pdf-am install-ps \
+       install-ps-am install-strip installcheck installcheck-am \
+       installcheck-binPROGRAMS installdirs installdirs-am \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
+       uninstall-includeHEADERS uninstall-man uninstall-man1
 
 .PRECIOUS: Makefile
 
 
-install-exec-local:
-       @if $(inst_setgid); then \
-          app=$(DESTDIR)$(bindir)/`echo $(bin_PROGRAMS)|sed '$(transform)'`; \
-          if chgrp $(inst_group) $$app && chmod g+s $$app; then \
-            echo "chgrp $(inst_group) $$app && chmod g+s $$app"; \
-          else \
-            echo "$$app needs to be owned by group $(inst_group) and setgid;"; \
-            echo "otherwise the '-l' option will probably not work."; \
-            echo "You may need special privileges to complete the installation"; \
-            echo "of $$app."; \
-          fi; \
-        else true; fi
-
 # --------------- Generate the Guile default module content
 
-guile.$(OBJEXT): gmk-default.h
-gmk-default.h: $(srcdir)/gmk-default.scm
+src/guile.$(OBJEXT): src/gmk-default.h
+src/gmk-default.h: $(top_srcdir)/src/gmk-default.scm
        (echo 'static const char *const GUILE_module_defn = " '\\ \
          && sed -e 's/;.*//' -e '/^[ \t]*$$/d' -e 's/"/\\"/g' -e 's/$$/ \\/' \
-                $(srcdir)/gmk-default.scm \
-         && echo '";') > $@
+                $(top_srcdir)/src/gmk-default.scm \
+         && echo '";') > src/gmk-default.h
 
 # --------------- Local DIST Section
 
-# Install the w32 and tests subdirectories
+# Install the mk and tests subdirectories
 #
 dist-hook:
-       (cd $(srcdir); \
-        sub=`find w32 tests -follow \( -name .git -o -name .deps -o -name work -o -name .gitignore -o -name \*.orig -o -name \*.rej -o -name \*~ -o -name Makefile \) -prune -o -type f -print`; \
+       (cd $(top_srcdir); \
+        sub=`find tests/scripts -follow \( -name .git -o -name .deps -o -name work -o -name .gitignore -o -name \*.orig -o -name \*.rej -o -name \*~ -o -name \*.out -o -name Makefile \) -prune -o -type f -print`; \
         tar chf - $$sub) \
        | (cd $(distdir); tar xfBp -)
 
 # --------------- Local CHECK Section
 
-check-local: check-regression check-loadavg
+check-local: check-regression
        @banner=" Regression PASSED: GNU Make $(VERSION) ($(MAKE_HOST)) built with $(CC) "; \
        dashes=`echo "$$banner" | sed s/./=/g`; \
        echo; \
@@ -1270,33 +1992,27 @@ check-local: check-regression check-loadavg
        echo "$$dashes"; \
        echo
 
-.PHONY: check-loadavg check-regression
-
-check-loadavg: loadavg$(EXEEXT)
-       @echo The system uptime program believes the load average to be:
-       -uptime
-       @echo The GNU load average checking code thinks:
-       -./loadavg$(EXEEXT)
+.PHONY: check-regression
 
 check-regression: tests/config-flags.pm
-       @if test -f '$(srcdir)/tests/run_make_tests'; then \
+       @if test -f '$(top_srcdir)/tests/run_make_tests'; then \
          ulimit -n 128; \
          if $(PERL) -v >/dev/null 2>&1; then \
-           case `cd '$(srcdir)'; pwd` in `pwd`) : ;; \
+           case `cd '$(top_srcdir)'; pwd` in `pwd`) : ;; \
              *) test -d tests || mkdir tests; \
                 rm -f srctests; \
-                if ln -s '$(srcdir)/tests' srctests; then \
-                  for f in run_make_tests run_make_tests.pl test_driver.pl scripts; do \
+                if ln -s '$(top_srcdir)/tests' srctests; then \
+                  for f in run_make_tests run_make_tests.pl test_driver.pl scripts jhelp.pl; do \
                     rm -f tests/$$f; ln -s ../srctests/$$f tests; \
                   done; fi ;; \
            esac; \
-           echo "cd tests && $(PERL) ./run_make_tests.pl -srcdir $(abs_srcdir) -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \
-           cd tests && $(PERL) ./run_make_tests.pl -srcdir '$(abs_srcdir)' -make '../make$(EXEEXT)' $(MAKETESTFLAGS); \
+           echo "cd tests && $(PERL) $(PERLFLAGS) ./run_make_tests.pl -srcdir $(abs_top_srcdir) -make ../make$(EXEEXT) $(MAKETESTFLAGS)"; \
+           cd tests && $(PERL) $(PERLFLAGS) ./run_make_tests.pl -srcdir '$(abs_top_srcdir)' -make '../make$(EXEEXT)' $(MAKETESTFLAGS); \
          else \
            echo "Can't find a working Perl ($(PERL)); the test suite requires Perl."; \
          fi; \
        else \
-         echo "Can't find the GNU Make test suite ($(srcdir)/tests)."; \
+         echo "Can't find the GNU Make test suite ($(top_srcdir)/tests)."; \
        fi
 
 # --------------- Maintainer's Section
diff --git a/NEWS b/NEWS
index 0b042456e3b205428143e75aef34edf3144b40f0..e884df17e2f52043d9cd8a361e40e73546081acb 100644 (file)
--- a/NEWS
+++ b/NEWS
 GNU make NEWS                                               -*-indented-text-*-
   History of user-visible changes.
-  10 June 2016
+  19 January 2020
 
 See the end of this file for copyrights and conditions.
 
-All changes mentioned here are more fully described in the GNU make
-manual, which is contained in this distribution as the file doc/make.texi.
+All user-visible changes are more fully described in the GNU make manual,
+which is contained in this distribution as the file doc/make.texi.
 See the README file and the GNU make manual for instructions for
 reporting bugs.
+\f
+Version 4.3 (19 Jan 2020)
+
+A complete list of bugs fixed in this version is available here:
+
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=108&set=custom
+
+* WARNING: Backward-incompatibility!
+  Number signs (#) appearing inside a macro reference or function invocation
+  no longer introduce comments and should not be escaped with backslashes:
+  thus a call such as:
+    foo := $(shell echo '#')
+  is legal.  Previously the number sign needed to be escaped, for example:
+    foo := $(shell echo '\#')
+  Now this latter will resolve to "\#".  If you want to write makefiles
+  portable to both versions, assign the number sign to a variable:
+    H := \#
+    foo := $(shell echo '$H')
+  This was claimed to be fixed in 3.81, but wasn't, for some reason.
+  To detect this change search for 'nocomment' in the .FEATURES variable.
+
+* WARNING: Backward-incompatibility!
+  Previously appending using '+=' to an empty variable would result in a value
+  starting with a space.  Now the initial space is only added if the variable
+  already contains some value.  Similarly, appending an empty string does not
+  add a trailing space.
+
+* NOTE: Deprecated behavior.
+  Contrary to the documentation, suffix rules with prerequisites are being
+  treated BOTH as simple targets AND as pattern rules.  Further, the
+  prerequisites are ignored by the pattern rules.  POSIX specifies that in
+  order to be a suffix rule there can be no prerequisites defined.  In this
+  release if POSIX mode is enabled then rules with prerequisites cannot be
+  suffix rules.  If POSIX mode is not enabled then the previous behavior is
+  preserved (a pattern rule with no extra prerequisites is created) AND a
+  warning about this behavior is generated:
+    warning: ignoring prerequisites on suffix rule definition
+  The POSIX behavior will be adopted as the only behavior in a future release
+  of GNU make so please resolve any warnings.
+
+* New feature: Grouped explicit targets
+  Pattern rules have always had the ability to generate multiple targets with
+  a single invocation of the recipe.  It's now possible to declare that an
+  explicit rule generates multiple targets with a single invocation.  To use
+  this, replace the ":" token with "&:" in the rule.  To detect this feature
+  search for 'grouped-target' in the .FEATURES special variable.
+  Implementation contributed by Kaz Kylheku <kaz@kylheku.com>
+
+* New feature: .EXTRA_PREREQS variable
+  Words in this variable are considered prerequisites of targets but they are
+  not added to any of the automatic variable values when expanding the
+  recipe.  This variable can either be global (applies to all targets) or
+  a target-specific variable.  To detect this feature search for 'extra-prereqs'
+  in the .FEATURES special variable.
+  Implementation contributed by Christof Warlich <cwarlich@gmx.de>
+
+* Makefiles can now specify the '-j' option in their MAKEFLAGS variable and
+  this will cause make to enable that parallelism mode.
+
+* GNU make will now use posix_spawn() on systems where it is available.
+  If you prefer to use fork/exec even on systems where posix_spawn() is
+  present, you can use the --disable-posix-spawn option to configure.
+  Implementation contributed by Aron Barath <baratharon@caesar.elte.hu>
+
+* Error messages printed when invoking non-existent commands have been cleaned
+  up and made consistent.
+
+* The previous limit of 63 jobs under -jN on MS-Windows is now
+  increased to 4095.  That limit includes the subprocess started by
+  the $(shell) function.
+
+* A new option --no-silent has been added, that cancels the effect of the
+  -s/--silent/--quiet flag.
+
+* A new option -E has been added as a short alias for --eval.
+
+* All wildcard expansion within GNU make, including $(wildcard ...), will sort
+  the results.  See https://savannah.gnu.org/bugs/index.php?52076
+
+* Interoperate with newer GNU libc and musl C runtime libraries.
+
+* Performance improvements provided by Paolo Bonzini <pbonzini@redhat.com>
+
+GNU make Developer News
+
+* Import the GNU standard bootstrap script to replace the hand-rolled
+  "make update" method for building code from a GNU make Git repository.
+
+* Rework the source distribution to move source files into the src/*
+  subdirectory.  This aligns with modern best practices in GNU.
+
+* Replace local portability code with Gnulib content.  Unfortunately due to a
+  problem with Gnulib support for getloadavg, this forces a requirement on
+  Automake 1.16 or above in order to build from Git.  See README.git.
+
 \f
 Version 4.2.1 (10 Jun 2016)
 
 A complete list of bugs fixed in this version is available here:
-h
-ttp://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=107&set=custom
+
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=107&set=custom
 
 This release is a bug-fix release.
 
@@ -22,7 +117,7 @@ Version 4.2 (22 May 2016)
 
 A complete list of bugs fixed in this version is available here:
 
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=106&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=106&set=custom
 
 * New variable: $(.SHELLSTATUS) is set to the exit status of the last != or
   $(shell ...) function invoked in this instance of make.  This will be "0" if
@@ -61,7 +156,7 @@ Version 4.1 (05 Oct 2014)
 
 A complete list of bugs fixed in this version is available here:
 
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=105&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=105&set=custom
 
 * New variables: $(MAKE_TERMOUT) and $(MAKE_TERMERR) are set to non-empty
   values if stdout or stderr, respectively, are believed to be writing to a
@@ -109,7 +204,7 @@ Version 4.0 (09 Oct 2013)
 
 A complete list of bugs fixed in this version is available here:
 
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=101&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=101&set=custom
 
 * WARNING: Backward-incompatibility!
   If .POSIX is specified, then make adheres to the POSIX backslash/newline
@@ -213,7 +308,7 @@ Version 3.82 (28 Jul 2010)
 
 A complete list of bugs fixed in this version is available here:
 
-http://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=104&set=custom
+https://sv.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=104&set=custom
 
 * Compiling GNU make now requires a conforming ISO C 1989 compiler and
   standard runtime library.
@@ -378,7 +473,7 @@ Version 3.81 (01 Apr 2006)
   might have caused the target to rebuild.  Starting with the _next_
   release of GNU make, '$?' will contain all prerequisites that caused
   the target to be considered out of date.
-  See http://savannah.gnu.org/bugs/?16051
+  See https://savannah.gnu.org/bugs/?16051
 
 * WARNING: Backward-incompatibility!
   GNU make now implements a generic "second expansion" feature on the
@@ -502,7 +597,7 @@ Version 3.81 (01 Apr 2006)
 
 A complete list of bugs fixed in this version is available here:
 
-  http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=103
+  https://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=103
 
 \f
 Version 3.80 (03 Oct 2002)
@@ -620,7 +715,7 @@ Version 3.80 (03 Oct 2002)
 
 A complete list of bugs fixed in this version is available here:
 
-  http://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102
+  https://savannah.gnu.org/bugs/index.php?group=make&report_id=111&fix_release_id=102
 
 \f
 Version 3.79.1 (23 Jun 2000)
@@ -1524,7 +1619,7 @@ Version 3.05
 (Changes from versions 1 through 3.05 were never recorded.  Sorry.)
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
diff --git a/NMakefile b/NMakefile
deleted file mode 100644 (file)
index 8bd55fe..0000000
--- a/NMakefile
+++ /dev/null
@@ -1,364 +0,0 @@
-# -*-Makefile-*- to build GNU make with nmake
-#
-# NOTE: If you have no 'make' program at all to process this makefile,
-# run 'build_w32.bat' instead.
-#
-# Copyright (C) 1996-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-LINK = link
-CC = cl
-MAKE = nmake
-
-OUTDIR=.
-MAKEFILE=NMakefile
-SUBPROC_MAKEFILE=NMakefile
-
-CFLAGS_any = /nologo /MT /W4 /GX /Zi /YX /I . /I glob /I w32/include /D WIN32 /D WINDOWS32 /D _CONSOLE /D HAVE_CONFIG_H
-CFLAGS_debug = $(CFLAGS_any) /Od /D DEBUG /D _DEBUG /FR.\WinDebug/ /Fp.\WinDebug/make.pch /Fo.\WinDebug/ /Fd.\WinDebug/make.pdb
-CFLAGS_release = $(CFLAGS_any) /O2 /D NDEBUG /FR.\WinRel/ /Fp.\WinRel/make.pch /Fo.\WinRel/
-
-LDFLAGS_debug = w32\subproc\WinDebug\subproc.lib /NOLOGO /SUBSYSTEM:console\
-       /STACK:0x400000 /INCREMENTAL:no /PDB:WinDebug/make.pdb /OUT:WinDebug/make.exe /DEBUG
-LDFLAGS_release = w32\subproc\WinRel\subproc.lib /NOLOGO /SUBSYSTEM:console\
-       /STACK:0x400000 /INCREMENTAL:no /OUT:WinRel/make.exe
-
-all: config.h subproc Release Debug
-
-#
-# Make sure we build the subproc library first. It has it's own
-# makefile. To be portable to Windows 95, we put the instructions
-# on how to build the library into a batch file. On NT, we could
-# simply have done foo && bar && dog, but this doesn't port.
-#
-subproc: w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib
-
-w32/subproc/WinDebug/subproc.lib w32/subproc/WinRel/subproc.lib: w32/subproc/misc.c w32/subproc/sub_proc.c w32/subproc/w32err.c
-       subproc.bat $(SUBPROC_MAKEFILE) $(MAKE)
-       if exist WinDebug\make.exe erase WinDebug\make.exe
-       if exist WinRel\make.exe erase WinRel\make.exe
-
-config.h: config.h.W32
-       copy $? $@
-
-Release:
-       $(MAKE) /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_release)" CFLAGS="$(CFLAGS_release)" OUTDIR=WinRel WinRel/make.exe
-Debug:
-       $(MAKE) /f $(MAKEFILE) LDFLAGS="$(LDFLAGS_debug)" CFLAGS="$(CFLAGS_debug)" OUTDIR=WinDebug WinDebug/make.exe
-
-clean:
-       if exist WinDebug\nul rmdir /s /q WinDebug
-       if exist WinRel\nul rmdir /s /q WinRel
-       if exist w32\subproc\WinDebug\nul rmdir /s /q w32\subproc\WinDebug
-       if exist w32\subproc\WinRel\nul rmdir /s /q w32\subproc\WinRel
-       if exist config.h erase config.h
-       erase *.pdb
-
-$(OUTDIR):
-       if not exist .\$@\nul mkdir .\$@
-
-LIBS = kernel32.lib user32.lib advapi32.lib
-
-guile = $(OUTDIR)/guile.obj
-
-OBJS = \
-       $(OUTDIR)/ar.obj \
-       $(OUTDIR)/arscan.obj \
-       $(OUTDIR)/commands.obj \
-       $(OUTDIR)/default.obj \
-       $(OUTDIR)/dir.obj \
-       $(OUTDIR)/expand.obj \
-       $(OUTDIR)/file.obj \
-       $(OUTDIR)/function.obj \
-       $(OUTDIR)/getloadavg.obj \
-       $(OUTDIR)/getopt.obj \
-       $(OUTDIR)/getopt1.obj \
-       $(OUTDIR)/hash.obj \
-       $(OUTDIR)/implicit.obj \
-       $(OUTDIR)/job.obj \
-       $(OUTDIR)/load.obj \
-       $(OUTDIR)/main.obj \
-       $(OUTDIR)/misc.obj \
-       $(OUTDIR)/output.obj \
-       $(OUTDIR)/read.obj \
-       $(OUTDIR)/remake.obj \
-       $(OUTDIR)/remote-stub.obj \
-       $(OUTDIR)/rule.obj \
-       $(OUTDIR)/signame.obj \
-       $(OUTDIR)/strcache.obj \
-       $(OUTDIR)/variable.obj \
-       $(OUTDIR)/version.obj \
-       $(OUTDIR)/vpath.obj \
-       $(OUTDIR)/glob.obj \
-       $(OUTDIR)/fnmatch.obj \
-       $(OUTDIR)/dirent.obj \
-       $(OUTDIR)/pathstuff.obj \
-       $(OUTDIR)/posixfcn.obj \
-       $(OUTDIR)/w32os.obj \
-       $(guile)
-
-$(OUTDIR)/make.exe: $(OUTDIR) $(OBJS)
-       $(LINK) @<<
-               $(LDFLAGS) $(LIBS) $(OBJS)
-<<
-
-.c{$(OUTDIR)}.obj:
-       $(CC) $(CFLAGS) /c $<
-
-$(OUTDIR)/glob.obj : glob/glob.c
-       $(CC) $(CFLAGS) /c $?
-$(OUTDIR)/fnmatch.obj : glob/fnmatch.c
-       $(CC) $(CFLAGS) /c $?
-$(OUTDIR)/dirent.obj : w32/compat/dirent.c
-       $(CC) $(CFLAGS) /c $?
-$(OUTDIR)/posixfcn.obj : w32/compat/posixfcn.c
-       $(CC) $(CFLAGS) /c $?
-$(OUTDIR)/pathstuff.obj : w32/pathstuff.c
-       $(CC) $(CFLAGS) /c $?
-$(OUTDIR)/w32os.obj : w32/w32os.c
-       $(CC) $(CFLAGS) /c $?
-
-# --------------- DEPENDENCIES
-#
-
-# .deps/alloca.Po
-# dummy
-
-# .deps/ar.Po
-$(OUTDIR)/ar.obj: ar.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h
-
-# .deps/arscan.Po
-$(OUTDIR)/arscan.obj: arscan.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
-
-# .deps/commands.Po
-$(OUTDIR)/commands.obj: commands.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h variable.h job.h output.h \
- commands.h
-
-# .deps/default.Po
-$(OUTDIR)/default.obj: default.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h rule.h dep.h job.h \
- output.h \
- commands.h
-
-# .deps/dir.Po
-$(OUTDIR)/dir.obj: dir.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h \
- filedef.h dep.h \
-
-# .deps/expand.Po
-$(OUTDIR)/expand.obj: expand.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/file.Po
-$(OUTDIR)/file.obj: file.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h \
- debug.h
-
-# .deps/function.Po
-$(OUTDIR)/function.obj: function.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h dep.h job.h output.h \
- commands.h debug.h
-
-# .deps/getloadavg.Po
-# dummy
-
-# .deps/getopt.Po
-$(OUTDIR)/getopt.obj: getopt.c config.h \
-
-# .deps/getopt1.Po
-$(OUTDIR)/getopt1.obj: getopt1.c config.h getopt.h \
-
-# .deps/guile.Po
-$(OUTDIR)/guile.obj: guile.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h filedef.h hash.h dep.h variable.h \
- gmk-default.h
-
-# .deps/hash.Po
-$(OUTDIR)/hash.obj: hash.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h
-
-# .deps/implicit.Po
-$(OUTDIR)/implicit.obj: implicit.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h rule.h dep.h debug.h variable.h job.h output.h \
- commands.h
-
-# .deps/job.Po
-$(OUTDIR)/job.obj: job.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- job.h output.h \
- debug.h filedef.h hash.h \
- commands.h variable.h os.h
-
-# .deps/load.Po
-$(OUTDIR)/load.obj: load.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h \
- filedef.h hash.h variable.h
-
-# .deps/loadapi.Po
-$(OUTDIR)/loadapi.obj: loadapi.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h dep.h
-
-# .deps/loadavg-getloadavg.Po
-# dummy
-
-# .deps/main.Po
-$(OUTDIR)/main.obj: main.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- os.h \
- filedef.h hash.h dep.h variable.h job.h output.h \
- commands.h rule.h debug.h \
- getopt.h
-
-# .deps/misc.Po
-$(OUTDIR)/misc.obj: misc.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h debug.h \
-
-# .deps/output.Po
-$(OUTDIR)/output.obj: output.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- job.h \
- output.h \
-
-# .deps/posixos.Po
-$(OUTDIR)/posixos.obj: posixos.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h job.h output.h os.h
-
-# .deps/read.Po
-$(OUTDIR)/read.obj: read.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h \
- debug.h
-
-# .deps/remake.Po
-$(OUTDIR)/remake.obj: remake.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h dep.h variable.h \
- debug.h
-
-# .deps/remote-cstms.Po
-# dummy
-
-# .deps/remote-stub.Po
-$(OUTDIR)/remote-stub.obj: remote-stub.c makeint.h \
- config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h
-
-# .deps/rule.Po
-$(OUTDIR)/rule.obj: rule.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/signame.Po
-$(OUTDIR)/signame.obj: signame.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
-
-# .deps/strcache.Po
-$(OUTDIR)/strcache.obj: strcache.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h
-
-# .deps/variable.Po
-$(OUTDIR)/variable.obj: variable.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/version.Po
-$(OUTDIR)/version.obj: version.c config.h
-
-# .deps/vmsjobs.Po
-# dummy
-
-# .deps/vpath.Po
-$(OUTDIR)/vpath.obj: vpath.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h
diff --git a/README b/README
index 88630da13bdeb848cb8a87055526c80a767ef06b..9449748aa0fc9ad8e3014454a6fefb5341749d68 100644 (file)
--- a/README
+++ b/README
@@ -1,23 +1,27 @@
-This directory contains the 4.2.1 release of GNU Make.
+This directory contains the 4.3 release of GNU Make.
 
 See the file NEWS for the user-visible changes from previous releases.
 In addition, there have been bugs fixed.
 
-Please check the system-specific notes below for any caveats related to
-your operating system.
+Please check the system-specific notes below for any caveats related to your
+operating system.
 
-For general building and installation instructions, see the file INSTALL.
+If you are trying to build GNU make from a Git clone rather than a downloaded
+source distribution, see the README.git file for instructions.
 
-If you need to build GNU Make and have no other 'make' program to use,
-you can use the shell script 'build.sh' instead.  To do this, first run
-'configure' as described in INSTALL.  Then, instead of typing 'make' to
-build the program, type 'sh build.sh'.  This should compile the program
-in the current directory.  Then you will have a Make program that you can
-use for './make install', or whatever else.
+For source distribution building and installation instructions, see the file
+INSTALL.
 
-Some systems' Make programs are broken and cannot process the Makefile for
-GNU Make.  If you get errors from your system's Make when building GNU
-Make, try using 'build.sh' instead.
+If you need to build GNU Make and have no other 'make' program to use, you can
+use the shell script 'build.sh' instead.  To do this, first run 'configure' as
+described in INSTALL.  Then, instead of typing 'make' to build the program,
+type 'sh build.sh'.  This should compile the program in the current directory.
+Then you will have a Make program that you can use for './make install', or
+whatever else.
+
+Some systems' Make programs cannot process the Makefile for GNU Make.  If you
+get errors from your system's Make when building GNU Make, try using
+'build.sh' instead.
 
 
 GNU Make is free software.  See the file COPYING for copying conditions.
@@ -85,18 +89,19 @@ If you need help using GNU make, try these forums:
 Git Access
 ----------
 
-The GNU make source repository is available via Git from the
-GNU Savannah Git server; look here for details:
+The GNU make source repository is available via Git from the GNU Savannah Git
+server; look here for details:
 
   http://savannah.gnu.org/git/?group=make
 
-Please note: you won't be able to build GNU make from Git without
-installing appropriate maintainer's tools, such as GNU m4, automake,
-autoconf, Perl, GNU make, and GCC.  See the README.git file for hints on
-how to build GNU make once these tools are available.  We make no
-guarantees about the contents or quality of the latest code in the Git
-repository: it is not unheard of for code that is known to be broken to
-be checked in.  Use at your own risk.
+Please note: you won't be able to build GNU make from Git without installing
+appropriate maintainer's tools, such as GNU m4, automake, autoconf, Perl, GNU
+make, and GCC.
+
+See the README.git file for instructions on how to build GNU make once these
+tools are available.  We make no guarantees about the contents or quality of
+the latest code in the Git repository: it is not unheard of for code that is
+known to be broken to be checked in.  Use at your own risk.
 
 
 System-specific Notes
@@ -155,6 +160,11 @@ Ports
     of DJGPP; see the WWW page http://www.delorie.com/djgpp/ for more
     information.
 
+    The Cygwin project maintains its own port of GNU make.  That port may have
+    patches which are not present in this version.  If you are using Cygwin
+    you should use their version of GNU make, and if you have questions about
+    it you should start by asking on those mailing lists and forums.
+
 Please note there are two _separate_ ports of GNU make for Microsoft
 systems: a native Windows tool built with (for example) MSVC or Cygwin,
 and a DOS-based tool built with DJGPP.  Please be sure you are looking
@@ -162,7 +172,7 @@ at the right README!
 
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
index 68d3ea74eb32692c914ba6e908fcb949dde47a34..b941da3820f0e87126e5c01288e34881886f1b95 100644 (file)
@@ -42,15 +42,18 @@ place). You have to use "$(wildcard src/*.c)" instead.
 COMPILING FROM SCRATCH
 ----------------------
 
-To recompile, you need SAS/C 6.51. make itself is not necessary, there
-is an smakefile.
+To recompile, you need SAS/C 6.51.
 
-1. Copy config.ami to config.h
-2. If you use make to compile, copy Makefile.ami to Makefile and
-    glob/Makefile.ami to glob/Makefile. Copy make into the current
-    directory.
+As of GNU make 4.3, the build environment has been cleaned up and alternate
+make files (including smakefiles) have been removed.  If you have an existing
+version of GNU make available you _should_ be able to run:
 
-3. Run smake/make
+   make -f Basic.mk
+
+However this is untested.
+
+If you have an Amiga system and would like to collaborate on getting
+bootstrapping to work properly please contact bug-make@gnu.org.
 
 INSTALLATION
 
@@ -61,7 +64,7 @@ If you plan to use recursive makes, install make resident:
 
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1995-2016 Free Software Foundation, Inc.
+Copyright (C) 1995-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
index 5419d3d1bd97798b6fa276502fd17b1600b0c351..fbb563ec87e571363ab6c55c19251e7b793aed1e 100644 (file)
@@ -27,8 +27,8 @@ New (since 3.74) DOS-specific features:
    8. Can be built without (a previous version of) Make.
 
    9. The build process requires only standard tools.  (Optional
-      targets like "install:" and "clean:" still need additional
-      programs, though, see below.)
+      targets like "check:" still need additional programs, though,
+      see below.)
 
   10. Beginning with v3.78, the test suite works in the DJGPP
       environment (requires Perl and auxiliary tools; see below).
@@ -55,78 +55,34 @@ To build from sources:
       either DJTAR (which is part of the DJGPP development
       environment), or the DJGPP port of GNU Tar.
 
-   2. Invoke the 'configure.bat' batch file.
+   2. If you have a working Make already, you can run:
 
-      If you are building Make in-place, i.e. in the same directory
-      where its sources are kept, just type "configure.bat" and press
-      [Enter].  Otherwise, you need to supply the path to the source
-      directory as an argument to the batch file, like this:
+          make -f Basic.mk
 
-        c:\djgpp\gnu\make-4.2.1\configure.bat c:/djgpp/gnu/make-4.2.1
+   3. If you don't have a working Make already you can bootstrap one
+      by running:
 
-      Note the forward slashes in the source path argument: you MUST
-      use them here.
+          .\builddos.bat
 
-   3. If configure.bat doesn't find a working Make, it will suggest to
-      use the 'dosbuild.bat' batch file to build Make.  Either do as it
-      suggests or install another Make program (a pre-compiled binary
-      should be available from the usual DJGPP sites) and rerun
-      configure.bat.
-
-   4. If you will need to run Make on machines without an FPU, you
-      might consider building a version of Make which doesn't issue
-      floating-point instructions (they don't help much on MSDOS
-      anyway).  To this end, edit the Makefile created by
-      configure.bat and add -DNO_FLOAT to the value of CPPFLAGS.
-
-   5. Invoke Make.
-
-      If you are building from outside of the source directory, you
+   4. If you are building from outside of the source directory, you
       need to tell Make where the sources are, like this:
 
-                make srcdir=c:/djgpp/gnu/make-4.2.1
-
-      (configure.bat will tell you this when it finishes).  You MUST
-      use a full, not relative, name of the source directory here, or
-      else Make might fail.
-
-   6. After Make finishes, if you have a Unix-style shell installed,
-      you can use the 'install' target to install the package.  You
-      will also need GNU Fileutils and GNU Sed for this (they should
-      be available from the DJGPP sites).
-
-      By default, GNU make will install into your DJGPP installation
-      area.  If you wish to use a different directory, override the
-      DESTDIR variable when invoking "make install", like this:
-
-                make install DESTDIR=c:/other/dir
+          make -f c:/djgpp/gnu/make/Basic.mk SRCDIR=c:/djgpp/gnu/make
 
-      This causes the make executable to be placed in c:/other/dir/bin,
-      the man pages in c:/other/dir/man, etc.
+      or:
 
-      Without a Unix-style shell, you will have to install programs
-      and the docs manually.  Copy make.exe to a directory on your
-      PATH, make.i* info files to your Info directory, and update the
-      file 'dir' in your Info directory by adding the following item
-      to the main menu:
+          c:/djgpp/gnu/make/builddos.bat c:/djgpp/gnu/make
 
-        * Make: (make.info).           The GNU make utility.
-
-      If you have the 'install-info' program (from the GNU Texinfo
-      package), it will do that for you if you invoke it like this:
-
-        install-info --info-dir=c:/djgpp/info c:/djgpp/info/make.info
-
-      (If your Info directory is other than C:\DJGPP\INFO, change this
-      command accordingly.)
-
-   7. The 'clean' targets also require Unix-style shell, and GNU Sed
-      and 'rm' programs (the latter from Fileutils).
-
-   8. To run the test suite, type "make check".  This requires a Unix
+   5. To run the test suite, type "make check".  This requires a Unix
       shell (I used the DJGPP port of Bash 2.03), Perl, Sed, Fileutils
       and Sh-utils.
 
+   6. To install copy make.exe to the preferred location.
+
+      Since GNU make 4.3, support for customized platform installations
+      has been removed.  If you'd like to collaborate on reinstating
+      these capabilities, contact bug-make@gnu.org.
+
 
 Notes:
 -----
@@ -324,7 +280,7 @@ Bug reports:
 
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
index 0ce81b442b40f7b7db5f6de455fe0020c175f8c8..54450d95b4555b4320bbfff359babe00c5f4e7d5 100644 (file)
@@ -160,7 +160,7 @@ from the make source tree.
 
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 2003-2016 Free Software Foundation, Inc.
+Copyright (C) 2003-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
index 1bdce48c3ad3b90ef3d1ee6ae65d4aac8cabdcb2..fe88a7719189e861f791a4af457001f6e5378d2e 100644 (file)
@@ -5,16 +5,15 @@ It has also been used on Windows 95/98/NT, and on OS/2.
 It builds with the MinGW port of GCC (tested with GCC 3.4.2, 4.8.1,
 and 4.9.3).
 
-It also builds with MSVC 2.x, 4.x, 5.x, 6.x, 2003, and 14 (2015) as
-well as with .NET 7.x and .NET 2003.
+It also builds with MSVC 2.x, 4.x, 5.x, 6.x, 2005, 2008, 2010, 2012,
+2013, and 2015 as well as with .NET 7.x and .NET 2003.
 
-As of version 4.0, a build with Guile is supported (tested with Guile
-2.0.3).  To build with Guile, you will need, in addition to Guile
-itself, its dependency libraries and the pkg-config program.  The
-latter is used to figure out which compilation and link switches and
-libraries need to be mentioned on the compiler command lines to
-correctly link with Guile.  A Windows port of pkg-config can be found
-on ezwinports site:
+Building with Guile is supported (tested with Guile 2.0.x).  To build
+with Guile, you will need, in addition to Guile itself, its dependency
+libraries and the pkg-config program.  The latter is used to figure out
+which compilation and link switches and libraries need to be mentioned
+on the compiler command lines to correctly link with Guile.  A Windows
+port of pkg-config can be found on ezwinports site:
 
   http://sourceforge.net/projects/ezwinports/
 
@@ -42,59 +41,116 @@ Do this first, regardless of the build method you choose:
     case, while Makefile rules are written for lower-case versions.)
 
 
-Using make_msvc_net2003.vcproj
-------------------------------
-
- 2. Open make_msvc_net2003.vcproj in MSVS71 or MSVC71 or any compatible IDE,
-    then build this project as usual.  There's also a solution file for
-    Studio 2003.
-
-
 Building with (MinGW-)GCC using build_w32.bat
 ---------------------------------------------
 
  2. Open a W32 command prompt for your installed (MinGW-)GCC, setup a
     correct PATH and other environment variables for it, then execute ...
 
-        build_w32.bat gcc
+        .\build_w32.bat gcc
 
     This produces gnumake.exe in the GccRel directory.
+
     If you want a version of GNU make built with debugging enabled,
-    add the --debug option.
+    add the --debug option.  Output goes into the GccDebug directory.
 
     The batch file will probe for Guile installation, and will build
     gnumake.exe with Guile if it finds it.  If you have Guile
     installed, but want to build Make without Guile support, type
 
-        build_w32.bat --without-guile gcc
+        .\build_w32.bat --without-guile gcc
+
+
+Building with (MSVC++-)cl using build_w32.bat
+---------------------------------------------
+
+ 2. Open a command shell, then execute ...
+
+        .\build_w32.bat
 
+    This produces a 64bit Release build of gnumake.exe in .\WinRel, using
+    the compiler found on the %Path%.  If no compiler is found, the batch
+    file will probe your system and choose the newest MSVC version it can
+    find.
 
-Building with (MSVC++-)cl using build_w32.bat or NMakefile
-----------------------------------------------------------
+    If you want a 32bit version of GNU make, add the --x86 option.
 
- 2. Open a W32 command prompt for your installed (MSVC++-)cl, setup a
-    correct PATH and other environment variables for it (usually via
-    executing vcvars32.bat or vsvars32.bat from the cl-installation,
-    e.g. "%VS71COMNTOOLS%vsvars32.bat"; or using a corresponding start
-    menue entry from the cl-installation), then execute EITHER ...
+    If you want a Debug build of GNU make, add the --debug option.  Output
+    will go into the .\WinDebug directory.
 
-        build_w32.bat
+    The batch file will probe for Guile installation, and will build
+    gnumake.exe with Guile if it finds it.  If Guile is installed,
+    but you prefer to build GNU make without Guile support, add the
+    --without-guile option.
+
+
+Building with (MinGW-)GCC using GNU make
+----------------------------------------
+
+ 2. If you already have a version of GNU make available you can use it
+    to build this version.  Open a W32 command prompt for your installed
+    (MinGW-)GCC, setup a correct PATH and other environment variables
+    for it, then execute ...
+
+        make -f Basic.mk TOOLCHAIN=gcc
 
-    This produces gnumake.exe in the WinRel directory.
+    This produces GccRel\gnumake.exe.
     If you want a version of GNU make built with debugging enabled,
-    add the --debug option.
+    add the TARGET_TYPE=debug option:
 
-    ... OR ...
+        make -f Basic.mk TOOLCHAIN=gcc TARGET_TYPE=debug
 
-        nmake /f NMakefile
+    The makefile doesn't support Guile integration.  Use build_w32.bat
+    if you want to build with Guile support.
 
-    (this produces WinDebug/make.exe and WinRel/make.exe).
 
-    The batch file will probe for Guile installation, and will build
-    gnumake.exe with Guile if it finds it.  If you have Guile
-    installed, but want to build Make without Guile support, type
+Building with (MSVC++-)cl using GNU make
+----------------------------------------
+
+ 2. If you already have a version of GNU make available you can use it
+    to build this version.  Open a W32 command prompt for your installed
+    (MSVC++-)cl, setup a correct PATH and other environment variables
+    for it (usually via executing vcvars32.bat or vsvars32.bat from the
+    cl-installation, or using a corresponding start menu entry from the
+    cl-installation), then execute ...
+
+        make -f Basic.mk
+
+    This produces an optimized WinRel/gnumake.exe.
+    If you want a version of GNU make built with debugging enabled,
+    add the TARGET_TYPE=debug option:
+
+        make -f Basic.mk TARGET_TYPE=debug
+
+    The makefile doesn't support Guile integration.  Use build_w32.bat
+    if you want to build with Guile support.
+
+
+Running the test suite
+----------------------
+
+ 3. You will need an installation of Perl.  Be sure to use a relatively
+    modern version: older versions will sometimes throw spurious errors.
+
+    To run the suite after building using GNU make, use:
+
+        make -f Basic.mk check
+
+    Alternatively if you'd like to run tests by hand, use:
+
+        cd tests
+        .\run_make_tests.bat -make <path-to-make>
+
+    I've found <path-to-make> seems to want forward-slashes in the path.
+    For example if building with .\build_w32.bat non-debug, use:
+
+        cd tests
+        .\run_make_tests.bat -make ../WinRel/gnumake.exe
+
+    I've tested this with the MSYS2 shell and POSIX tools installation
+    that you get by installing Git for Windows.
+
 
-        build_w32.bat --without-guile
 
 -------------------
 -- Notes/Caveats --
@@ -152,10 +208,8 @@ GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL):
 
 Support for parallel builds
 
-        Parallel builds (-jN) are supported in this port, with 1
-        limitation: The number of concurrent processes has a hard
-        limit of 64, due to the way this port implements waiting for
-        its subprocesses.
+        Parallel builds (-jN) are supported in this port.  The number of
+        concurrent processes has a hard limit of 4095.
 
 GNU make and Cygnus GNU Windows32 tools:
 
@@ -209,13 +263,6 @@ GNU make handling of drive letters in pathnames (PATH, vpath, VPATH):
         both Unix and Windows systems, then no ifdef'ing will be
         necessary in the makefile source.
 
-GNU make test suite:
-
-        I verified all functionality with a slightly modified version
-        of make-test-4.2.1 (modifications to get test suite to run
-        on Windows NT). All tests pass in an environment that includes
-        sh.exe.  Tests were performed on both Windows NT and Windows 95.
-
 Pathnames and white space:
 
         Unlike Unix, Windows 95/NT systems encourage pathnames which
@@ -298,7 +345,7 @@ Bug reports:
         is described in the GNU make manual and the base README.
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
index 67e1252b63e3c32a7958ace2fcfd1743d59d4632..a62e003bd68ba9b4704eb134d9317bba796b5f85 100644 (file)
@@ -96,7 +96,7 @@ SunOS 4.1.x:
 
 \f
 -------------------------------------------------------------------------------
-Copyright (C) 1998-2016 Free Software Foundation, Inc.
+Copyright (C) 1998-2020 Free Software Foundation, Inc.
 This file is part of GNU Make.
 
 GNU Make is free software; you can redistribute it and/or modify it under the
index f89daae12f7737b4f3fe6414d8a224874fc66907..758f82f93ecaea8e88f41facf2f54a011cd0a4c4 100644 (file)
--- a/SCOPTIONS
+++ b/SCOPTIONS
@@ -3,10 +3,10 @@ OPTIMIZE
 NOVERSION
 OPTIMIZERTIME
 OPTIMIZERALIAS
+DEFINE HAVE_CONFIG_H
 DEFINE INCLUDEDIR="include:"
 DEFINE LIBDIR="lib:"
 DEFINE NO_ALLOCA
-DEFINE NO_FLOAT
 DEFINE NO_ARCHIVES
 IGNORE=161
 IGNORE=100
diff --git a/SMakefile b/SMakefile
deleted file mode 100644 (file)
index 159d489..0000000
--- a/SMakefile
+++ /dev/null
@@ -1,450 +0,0 @@
-# -*-Makefile-*- for building GNU make with smake
-#
-# NOTE: If you have no 'make' program at all to process this makefile,
-# run 'build.sh' instead.
-#
-# Copyright (C) 1995-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-#
-#      Makefile for GNU Make
-#
-
-# Ultrix 2.2 make doesn't expand the value of VPATH.
-VPATH = /make-4.2.1/
-# This must repeat the value, because configure will remove 'VPATH = .'.
-srcdir = /make-4.2.1/
-
-CC = sc
-RM = delete
-MAKE = smake
-
-CFLAGS =
-CPPFLAGS =
-LDFLAGS =
-
-# Define these for your system as follows:
-#      -DNO_ARCHIVES           To disable 'ar' archive support.
-#      -DNO_FLOAT              To avoid using floating-point numbers.
-#      -DENUM_BITFIELDS        If the compiler isn't GCC but groks enum foo:2.
-#                              Some compilers apparently accept this
-#                              without complaint but produce losing code,
-#                              so beware.
-# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
-# See also 'config.h'.
-defines =
-
-# Which flavor of remote job execution support to use.
-# The code is found in 'remote-$(REMOTE).c'.
-REMOTE = stub
-
-# If you are using the GNU C library, or have the GNU getopt functions in
-# your C library, you can comment these out.
-GETOPT = getopt.o getopt1.o
-GETOPT_SRC = $(srcdir)getopt.c $(srcdir)getopt1.c $(srcdir)getopt.h
-
-# If you are using the GNU C library, or have the GNU glob functions in
-# your C library, you can comment this out.  GNU make uses special hooks
-# into the glob functions to be more efficient (by using make's directory
-# cache for globbing), so you must use the GNU functions even if your
-# system's C library has the 1003.2 glob functions already.  Also, the glob
-# functions in the AIX and HPUX C libraries are said to be buggy.
-GLOB = Lib glob/glob.lib
-
-# If your system doesn't have alloca, or the one provided is bad, define this.
-ALLOCA = alloca.o
-ALLOCA_SRC = $(srcdir)alloca.c
-
-# If your system needs extra libraries loaded in, define them here.
-# System V probably need -lPW for alloca.  HP-UX 7.0's alloca in
-# libPW.a is broken on HP9000s300 and HP9000s400 machines.  Use
-# alloca.c instead on those machines.
-LOADLIBES =
-
-# Any extra object files your system needs.
-extras = amiga.o
-
-# Common prefix for machine-independent installed files.
-prefix =
-# Common prefix for machine-dependent installed files.
-exec_prefix =
-
-# Directory to install 'make' in.
-bindir = sc:c
-# Directory to find libraries in for '-lXXX'.
-libdir = lib:
-# Directory to search by default for included makefiles.
-includedir = include:
-# Directory to install the Info files in.
-infodir = doc:
-# Directory to install the man page in.
-mandir = t:
-# Number to put on the man page filename.
-manext = 1
-# Prefix to put on installed 'make' binary file name.
-binprefix =
-# Prefix to put on installed 'make' man page file name.
-manprefix = $(binprefix)
-
-# Whether or not make needs to be installed setgid.
-# The value should be either 'true' or 'false'.
-# On many systems, the getloadavg function (used to implement the '-l'
-# switch) will not work unless make is installed setgid kmem.
-install_setgid = false
-# Install make setgid to this group so it can read /dev/kmem.
-group = sys
-
-# Program to install 'make'.
-INSTALL_PROGRAM = copy
-# Program to install the man page.
-INSTALL_DATA = copy
-# Generic install program.
-INSTALL = copy
-
-# Program to format Texinfo source into Info files.
-MAKEINFO = makeinfo
-# Program to format Texinfo source into DVI files.
-TEXI2DVI = texi2dvi
-
-# Programs to make tags files.
-ETAGS = etags -w
-CTAGS = ctags -w
-
-#guile = guile.o
-
-objs = commands.o job.o dir.o file.o misc.o main.o read.o remake.o   \
-       rule.o implicit.o default.o variable.o expand.o function.o    \
-       vpath.o version.o ar.o arscan.o signame.o strcache.o hash.o   \
-       output.o remote-$(REMOTE).o $(GLOB) $(GETOPT) $(ALLOCA)       \
-       $(extras) $(guile)
-
-srcs = $(srcdir)commands.c $(srcdir)job.c $(srcdir)dir.c             \
-       $(srcdir)file.c $(srcdir)getloadavg.c $(srcdir)misc.c         \
-       $(srcdir)main.c $(srcdir)read.c $(srcdir)remake.c             \
-       $(srcdir)rule.c $(srcdir)implicit.c $(srcdir)default.c        \
-       $(srcdir)variable.c $(srcdir)expand.c $(srcdir)function.c     \
-       $(srcdir)vpath.c $(srcdir)version.c $(srcdir)hash.c           \
-       $(srcdir)guile.c $(srcdir)remote-$(REMOTE).c                  \
-       $(srcdir)ar.c $(srcdir)arscan.c $(srcdir)strcache.c           \
-       $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC)           \
-       $(srcdir)commands.h $(srcdir)dep.h $(srcdir)file.h            \
-       $(srcdir)job.h $(srcdir)makeint.h $(srcdir)rule.h             \
-       $(srcdir)output.c $(srcdir)output.h                           \
-       $(srcdir)variable.h $(ALLOCA_SRC) $(srcdir)config.h.in
-
-
-.SUFFIXES:
-.SUFFIXES: .o .c .h .ps .dvi .info .texinfo
-
-all: make
-info: make.info
-dvi: make.dvi
-# Some makes apparently use .PHONY as the default goal if it is before 'all'.
-.PHONY: all check info dvi
-
-make.info: make.texinfo
-       $(MAKEINFO) -I$(srcdir) $(srcdir)make.texinfo -o make.info
-
-make.dvi: make.texinfo
-       $(TEXI2DVI) $(srcdir)make.texinfo
-
-make.ps: make.dvi
-       dvi2ps make.dvi > make.ps
-
-make: $(objs) glob/glob.lib
-       $(CC) Link $(LDFLAGS) $(objs) $(LOADLIBES) To make.new
-       -delete quiet make
-       rename make.new make
-
-# -I. is needed to find config.h in the build directory.
-.c.o:
-       $(CC) $(defines) IDir "" IDir $(srcdir)glob \
-             $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
-
-glob/glob.lib:
-       execute <<
-           cd glob
-           smake
-<
-
-tagsrcs = $(srcs) $(srcdir)remote-*.c
-TAGS: $(tagsrcs)
-       $(ETAGS) $(tagsrcs)
-tags: $(tagsrcs)
-       $(CTAGS) $(tagsrcs)
-
-.PHONY: install installdirs
-install:
-       copy make sc:c
-
-loadavg: loadavg.c config.h
-       $(CC) $(defines) -DTEST -I. -I$(srcdir) $(CFLAGS) $(LDFLAGS) \
-             loadavg.c $(LOADLIBES) -o $@
-
-clean: glob-clean
-       -$(RM) -f make loadavg *.o core make.dvi
-
-distclean: clean glob-realclean
-       -$(RM) -f Makefile config.h config.status build.sh
-       -$(RM) -f config.log config.cache
-       -$(RM) -f TAGS tags
-       -$(RM) -f make.?? make.??s make.log make.toc make.*aux
-       -$(RM) -f loadavg.c
-
-realclean: distclean
-       -$(RM) -f make.info*
-
-mostlyclean: clean
-
-.PHONY: glob-clean glob-realclean
-
-glob-clean glob-realclean:
-       execute <<
-       cd glob
-       smake $@
-<
-
-# --------------- DEPENDENCIES
-#
-
-# .deps/alloca.Po
-# dummy
-
-# .deps/ar.Po
-ar.o: ar.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h
-
-# .deps/arscan.Po
-arscan.o: arscan.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
-
-# .deps/commands.Po
-commands.o: commands.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h variable.h job.h output.h \
- commands.h
-
-# .deps/default.Po
-default.o: default.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h rule.h dep.h job.h \
- output.h \
- commands.h
-
-# .deps/dir.Po
-dir.o: dir.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h \
- filedef.h dep.h \
-
-# .deps/expand.Po
-expand.o: expand.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/file.Po
-file.o: file.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h \
- debug.h
-
-# .deps/function.Po
-function.o: function.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h dep.h job.h output.h \
- commands.h debug.h
-
-# .deps/getloadavg.Po
-# dummy
-
-# .deps/getopt.Po
-getopt.o: getopt.c config.h \
-
-# .deps/getopt1.Po
-getopt1.o: getopt1.c config.h getopt.h \
-
-# .deps/guile.Po
-guile.o: guile.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h filedef.h hash.h dep.h variable.h \
- gmk-default.h
-
-# .deps/hash.Po
-hash.o: hash.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h
-
-# .deps/implicit.Po
-implicit.o: implicit.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h rule.h dep.h debug.h variable.h job.h output.h \
- commands.h
-
-# .deps/job.Po
-job.o: job.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- job.h output.h \
- debug.h filedef.h hash.h \
- commands.h variable.h os.h
-
-# .deps/load.Po
-load.o: load.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h \
- filedef.h hash.h variable.h
-
-# .deps/loadapi.Po
-loadapi.o: loadapi.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h dep.h
-
-# .deps/loadavg-getloadavg.Po
-# dummy
-
-# .deps/main.Po
-main.o: main.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- os.h \
- filedef.h hash.h dep.h variable.h job.h output.h \
- commands.h rule.h debug.h \
- getopt.h
-
-# .deps/misc.Po
-misc.o: misc.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h debug.h \
-
-# .deps/output.Po
-output.o: output.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- job.h \
- output.h \
-
-# .deps/posixos.Po
-posixos.o: posixos.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- debug.h job.h output.h os.h
-
-# .deps/read.Po
-read.o: read.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h \
- debug.h
-
-# .deps/remake.Po
-remake.o: remake.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h dep.h variable.h \
- debug.h
-
-# .deps/remote-cstms.Po
-# dummy
-
-# .deps/remote-stub.Po
-remote-stub.o: remote-stub.c makeint.h \
- config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h job.h output.h \
- commands.h
-
-# .deps/rule.Po
-rule.o: rule.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/signame.Po
-signame.o: signame.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
-
-# .deps/strcache.Po
-strcache.o: strcache.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- hash.h
-
-# .deps/variable.Po
-variable.o: variable.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h dep.h job.h output.h \
- commands.h variable.h rule.h
-
-# .deps/version.Po
-version.o: version.c config.h
-
-# .deps/vmsjobs.Po
-# dummy
-
-# .deps/vpath.Po
-vpath.o: vpath.c makeint.h config.h \
- gnumake.h \
- getopt.h \
- gettext.h \
- filedef.h hash.h variable.h
diff --git a/acinclude.m4 b/acinclude.m4
deleted file mode 100644 (file)
index 0ac68aa..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-dnl acinclude.m4 -- Extra macros needed for GNU make.
-dnl
-dnl Automake will incorporate this into its generated aclocal.m4.
-dnl Copyright (C) 1998-2016 Free Software Foundation, Inc.
-dnl This file is part of GNU Make.
-dnl
-dnl GNU Make is free software; you can redistribute it and/or modify it under
-dnl the terms of the GNU General Public License as published by the Free
-dnl Software Foundation; either version 3 of the License, or (at your option)
-dnl any later version.
-dnl
-dnl GNU Make is distributed in the hope that it will be useful, but WITHOUT
-dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.
-dnl more details.
-dnl
-dnl You should have received a copy of the GNU General Public License along
-dnl with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-dnl ---------------------------------------------------------------------------
-dnl Got this from the lynx 2.8 distribution.
-dnl by T.E.Dickey <dickey@clark.net>
-dnl and Jim Spath <jspath@mail.bcpl.lib.md.us>
-dnl and Philippe De Muyter <phdm@macqel.be>
-dnl
-dnl Created: 1997/1/28
-dnl Updated: 1997/12/23
-dnl ---------------------------------------------------------------------------
-dnl After checking for functions in the default $LIBS, make a further check
-dnl for the functions that are netlib-related (these aren't always in the
-dnl libc, etc., and have to be handled specially because there are conflicting
-dnl and broken implementations.
-dnl Common library requirements (in order):
-dnl    -lresolv -lsocket -lnsl
-dnl    -lnsl -lsocket
-dnl    -lsocket
-dnl    -lbsd
-AC_DEFUN([CF_NETLIBS],[
-cf_test_netlibs=no
-AC_MSG_CHECKING(for network libraries)
-AC_CACHE_VAL(cf_cv_netlibs,[
-AC_MSG_RESULT(working...)
-cf_cv_netlibs=""
-cf_test_netlibs=yes
-AC_CHECK_FUNCS(gethostname,,[
-       CF_RECHECK_FUNC(gethostname,nsl,cf_cv_netlibs,[
-               CF_RECHECK_FUNC(gethostname,socket,cf_cv_netlibs)])])
-#
-# FIXME:  sequent needs this library (i.e., -lsocket -linet -lnsl), but
-# I don't know the entrypoints - 97/7/22 TD
-AC_CHECK_LIB(inet,main,cf_cv_netlibs="-linet $cf_cv_netlibs")
-#
-if test "$ac_cv_func_lsocket" != no ; then
-AC_CHECK_FUNCS(socket,,[
-       CF_RECHECK_FUNC(socket,socket,cf_cv_netlibs,[
-               CF_RECHECK_FUNC(socket,bsd,cf_cv_netlibs)])])
-fi
-#
-AC_CHECK_FUNCS(gethostbyname,,[
-       CF_RECHECK_FUNC(gethostbyname,nsl,cf_cv_netlibs)])
-])
-LIBS="$LIBS $cf_cv_netlibs"
-test $cf_test_netlibs = no && echo "$cf_cv_netlibs" >&AC_FD_MSG
-])dnl
-dnl ---------------------------------------------------------------------------
-dnl Re-check on a function to see if we can pick it up by adding a library.
-dnl    $1 = function to check
-dnl    $2 = library to check in
-dnl    $3 = environment to update (e.g., $LIBS)
-dnl    $4 = what to do if this fails
-dnl
-dnl This uses 'unset' if the shell happens to support it, but leaves the
-dnl configuration variable set to 'unknown' if not.  This is a little better
-dnl than the normal autoconf test, which gives misleading results if a test
-dnl for the function is made (e.g., with AC_CHECK_FUNC) after this macro is
-dnl used (autoconf does not distinguish between a null token and one that is
-dnl set to 'no').
-AC_DEFUN([CF_RECHECK_FUNC],[
-AC_CHECK_LIB($2,$1,[
-       CF_UPPER(cf_tr_func,$1)
-       AC_DEFINE_UNQUOTED(HAVE_$cf_tr_func,1,[Define if you have function $1])
-       ac_cv_func_$1=yes
-       $3="-l$2 [$]$3"],[
-       ac_cv_func_$1=unknown
-       unset ac_cv_func_$1 2>/dev/null
-       $4],
-       [[$]$3])
-])dnl
-dnl ---------------------------------------------------------------------------
-dnl Make an uppercase version of a variable
-dnl $1=uppercase($2)
-AC_DEFUN([CF_UPPER],
-[
-changequote(,)dnl
-$1=`echo $2 | tr '[a-z]' '[A-Z]'`
-changequote([,])dnl
-])dnl
-
-
-dnl ---------------------------------------------------------------------------
-dnl From Paul Eggert <eggert@twinsun.com>
-dnl Update for Darwin by Troy Runkel <Troy.Runkel@mathworks.com>
-dnl Update for AIX by Olexiy Buyanskyy (Savannah bug 32485)
-
-AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC],
- [AC_CACHE_CHECK([for nanoseconds field of struct stat],
-   ac_cv_struct_st_mtim_nsec,
-   [ac_save_CPPFLAGS="$CPPFLAGS"
-    ac_cv_struct_st_mtim_nsec=no
-    # st_mtim.tv_nsec -- the usual case
-    # st_mtim._tv_nsec -- Solaris 2.6, if
-    #  (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1
-    #   && !defined __EXTENSIONS__)
-    # st_mtim.st__tim.tv_nsec -- UnixWare 2.1.2
-    # st_mtime_n -- AIX 5.2 and above
-    # st_mtimespec.tv_nsec -- Darwin (Mac OSX)
-    for ac_val in st_mtim.tv_nsec st_mtim._tv_nsec st_mtim.st__tim.tv_nsec st_mtime_n st_mtimespec.tv_nsec; do
-      CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val"
-      AC_TRY_COMPILE([#include <sys/types.h>
-#include <sys/stat.h>
-       ], [struct stat s; s.ST_MTIM_NSEC;],
-        [ac_cv_struct_st_mtim_nsec=$ac_val; break])
-    done
-    CPPFLAGS="$ac_save_CPPFLAGS"
-   ])
-
-  if test $ac_cv_struct_st_mtim_nsec != no; then
-    AC_DEFINE_UNQUOTED([ST_MTIM_NSEC], [$ac_cv_struct_st_mtim_nsec],
-       [Define if struct stat contains a nanoseconds field])
-  fi
- ]
-)
index 5389934fca8c7fa7d3668780d6577f6e63fdc3ea..32969478d60f5d1f20ef41cc028dd227cb4cc1c0 100644 (file)
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -296,7 +296,7 @@ AS_VAR_COPY([$1], [pkg_cv_][$1])
 AS_VAR_IF([$1], [""], [$5], [$4])dnl
 ])dnl PKG_CHECK_VAR
 
-# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -308,10 +308,10 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.15'
+[am__api_version='1.16'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15], [],
+m4_if([$1], [1.16.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -327,74 +327,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15])dnl
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
-# Copyright (C) 2011-2014 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_AR([ACT-IF-FAIL])
-# -------------------------
-# Try to determine the archiver interface, and trigger the ar-lib wrapper
-# if it is needed.  If the detection of archiver interface fails, run
-# ACT-IF-FAIL (default is to abort configure with a proper error message).
-AC_DEFUN([AM_PROG_AR],
-[AC_BEFORE([$0], [LT_INIT])dnl
-AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([ar-lib])dnl
-AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
-: ${AR=ar}
-
-AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
-  [AC_LANG_PUSH([C])
-   am_cv_ar_interface=ar
-   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
-     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
-      AC_TRY_EVAL([am_ar_try])
-      if test "$ac_status" -eq 0; then
-        am_cv_ar_interface=ar
-      else
-        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
-        AC_TRY_EVAL([am_ar_try])
-        if test "$ac_status" -eq 0; then
-          am_cv_ar_interface=lib
-        else
-          am_cv_ar_interface=unknown
-        fi
-      fi
-      rm -f conftest.lib libconftest.a
-     ])
-   AC_LANG_POP([C])])
-
-case $am_cv_ar_interface in
-ar)
-  ;;
-lib)
-  # Microsoft lib, so override with the ar-lib wrapper script.
-  # FIXME: It is wrong to rewrite AR.
-  # But if we don't then we get into trouble of one sort or another.
-  # A longer-term fix would be to have automake use am__AR in this case,
-  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
-  # similar.
-  AR="$am_aux_dir/ar-lib $AR"
-  ;;
-unknown)
-  m4_default([$1],
-             [AC_MSG_ERROR([could not determine $AR interface])])
-  ;;
-esac
-AC_SUBST([AR])dnl
-])
-
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -446,7 +386,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -477,7 +417,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -668,13 +608,12 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
@@ -682,49 +621,41 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
   # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  AS_CASE([$CONFIG_FILES],
+          [*\'*], [eval set x "$CONFIG_FILES"],
+          [*], [set x $CONFIG_FILES])
   shift
-  for mf
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
   do
     # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
+    am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
     # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`AS_DIRNAME("$mf")`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "$am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`AS_DIRNAME(["$file"])`
-      AS_MKDIR_P([$dirpart/$fdir])
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`AS_DIRNAME(["$am_mf"])`
+    am_filepart=`AS_BASENAME(["$am_mf"])`
+    AM_RUN_LOG([cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles]) || am_rc=$?
   done
+  if test $am_rc -ne 0; then
+    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).])
+  fi
+  AS_UNSET([am_dirpart])
+  AS_UNSET([am_filepart])
+  AS_UNSET([am_mf])
+  AS_UNSET([am_rc])
+  rm -f conftest-deps.mk
 }
 ])# _AM_OUTPUT_DEPENDENCY_COMMANDS
 
@@ -733,17 +664,16 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
 # -----------------------------
 # This macro should only be invoked once -- use via AC_REQUIRE.
 #
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each '.P' file that we will
-# need in order to bootstrap the dependency handling code.
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 [AC_CONFIG_COMMANDS([depfiles],
      [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
+     [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
 
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -767,7 +697,7 @@ fi], [AC_MSG_RESULT([no])])
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -854,8 +784,8 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
 AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # For better backward compatibility.  To be removed once Automake 1.9.x
 # dies out for good.  For more background, see:
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
 # We need awk for the "check" target (and possibly the TAP driver).  The
 # system "awk" is bad on some platforms.
@@ -922,7 +852,7 @@ END
 Aborting the configuration process, to ensure you take notice of the issue.
 
 You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <http://www.gnu.org/software/coreutils/>.
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
 
 If you want to complete the configuration process using your problematic
 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
@@ -964,7 +894,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -985,7 +915,7 @@ if test x"${install_sh+set}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1006,7 +936,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1014,49 +944,42 @@ AC_SUBST([am__leading_dot])])
 
 # AM_MAKE_INCLUDE()
 # -----------------
-# Check to see how make treats includes.
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
 AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
 am__doit:
-       @echo this is the am__doit target
+       @echo this is the am__doit target >confinc.out
 .PHONY: am__doit
 END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
 am__include="#"
 am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
-     ;;
-   esac
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+  AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+      ['0:this is the am__doit target'],
+      [AS_CASE([$s],
+          [BSD], [am__include='.include' am__quote='"'],
+          [am__include='include' am__quote=''])])
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1095,7 +1018,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1124,7 +1047,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1171,7 +1094,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1190,7 +1113,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1271,7 +1194,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1331,7 +1254,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1359,7 +1282,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1378,7 +1301,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1509,15 +1432,62 @@ AC_SUBST([am__tar])
 AC_SUBST([am__untar])
 ]) # _AM_PROG_TAR
 
-m4_include([config/dospaths.m4])
-m4_include([config/gettext.m4])
-m4_include([config/iconv.m4])
-m4_include([config/intlmacosx.m4])
-m4_include([config/lib-ld.m4])
-m4_include([config/lib-link.m4])
-m4_include([config/lib-prefix.m4])
-m4_include([config/longlong.m4])
-m4_include([config/nls.m4])
-m4_include([config/po.m4])
-m4_include([config/progtest.m4])
-m4_include([acinclude.m4])
+m4_include([m4/00gnulib.m4])
+m4_include([m4/absolute-header.m4])
+m4_include([m4/access.m4])
+m4_include([m4/acinclude.m4])
+m4_include([m4/alloca.m4])
+m4_include([m4/asm-underscore.m4])
+m4_include([m4/close.m4])
+m4_include([m4/dirname.m4])
+m4_include([m4/dospaths.m4])
+m4_include([m4/double-slash-root.m4])
+m4_include([m4/dup2.m4])
+m4_include([m4/eaccess.m4])
+m4_include([m4/errno_h.m4])
+m4_include([m4/error.m4])
+m4_include([m4/extensions.m4])
+m4_include([m4/extern-inline.m4])
+m4_include([m4/fcntl-o.m4])
+m4_include([m4/fcntl.m4])
+m4_include([m4/fcntl_h.m4])
+m4_include([m4/findprog-in.m4])
+m4_include([m4/getdtablesize.m4])
+m4_include([m4/getloadavg.m4])
+m4_include([m4/getprogname.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/gnulib-common.m4])
+m4_include([m4/gnulib-comp.m4])
+m4_include([m4/host-cpu-c-abi.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/include_next.m4])
+m4_include([m4/intlmacosx.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/limits-h.m4])
+m4_include([m4/longlong.m4])
+m4_include([m4/malloc.m4])
+m4_include([m4/msvc-inval.m4])
+m4_include([m4/msvc-nothrow.m4])
+m4_include([m4/multiarch.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/off_t.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
+m4_include([m4/ssize_t.m4])
+m4_include([m4/stdbool.m4])
+m4_include([m4/stddef_h.m4])
+m4_include([m4/stdint.m4])
+m4_include([m4/stdio_h.m4])
+m4_include([m4/stdlib_h.m4])
+m4_include([m4/stpcpy.m4])
+m4_include([m4/strerror.m4])
+m4_include([m4/string_h.m4])
+m4_include([m4/sys_socket_h.m4])
+m4_include([m4/sys_types_h.m4])
+m4_include([m4/unistd_h.m4])
+m4_include([m4/warn-on-use.m4])
+m4_include([m4/wchar_t.m4])
+m4_include([m4/wint_t.m4])
+m4_include([m4/xalloc.m4])
diff --git a/alloca.c b/alloca.c
deleted file mode 100644 (file)
index 02ac921..0000000
--- a/alloca.c
+++ /dev/null
@@ -1,503 +0,0 @@
-/* alloca.c -- allocate automatically reclaimed memory
-   (Mostly) portable public-domain implementation -- D A Gwyn
-
-   This implementation of the PWB library alloca function,
-   which is used to allocate space off the run-time stack so
-   that it is automatically reclaimed upon procedure exit,
-   was inspired by discussions with J. Q. Johnson of Cornell.
-   J.Otto Tennant <jot@cray.com> contributed the Cray support.
-
-   There are some preprocessor constants that can
-   be defined when compiling for your specific system, for
-   improved efficiency; however, the defaults should be okay.
-
-   The general concept of this implementation is to keep
-   track of all alloca-allocated blocks, and reclaim any
-   that are found to be deeper in the stack than the current
-   invocation.  This heuristic does not reclaim storage as
-   soon as it becomes invalid, but it will do so eventually.
-
-   As a special case, alloca(0) reclaims storage without
-   allocating any.  It is a good idea to use alloca(0) in
-   your main control loop, etc. to force garbage collection.  */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
-#ifdef emacs
-#include "blockinput.h"
-#endif
-
-/* If compiling with GCC 2, this file's not needed.  */
-#if !defined (__GNUC__) || __GNUC__ < 2
-
-/* If someone has defined alloca as a macro,
-   there must be some other way alloca is supposed to work.  */
-#ifndef alloca
-
-#ifdef emacs
-#ifdef static
-/* actually, only want this if static is defined as ""
-   -- this is for usg, in which emacs must undefine static
-   in order to make unexec workable
-   */
-#ifndef STACK_DIRECTION
-you
-lose
--- must know STACK_DIRECTION at compile-time
-#endif /* STACK_DIRECTION undefined */
-#endif /* static */
-#endif /* emacs */
-
-/* If your stack is a linked list of frames, you have to
-   provide an "address metric" ADDRESS_FUNCTION macro.  */
-
-#if defined (CRAY) && defined (CRAY_STACKSEG_END)
-long i00afunc ();
-#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
-#else
-#define ADDRESS_FUNCTION(arg) &(arg)
-#endif
-
-#if __STDC__
-typedef void *pointer;
-#else
-typedef char *pointer;
-#endif
-
-#ifndef NULL
-#define        NULL    0
-#endif
-
-/* Different portions of Emacs need to call different versions of
-   malloc.  The Emacs executable needs alloca to call xmalloc, because
-   ordinary malloc isn't protected from input signals.  On the other
-   hand, the utilities in lib-src need alloca to call malloc; some of
-   them are very simple, and don't have an xmalloc routine.
-
-   Non-Emacs programs expect this to call use xmalloc.
-
-   Callers below should use malloc.  */
-
-#ifndef emacs
-#define malloc xmalloc
-#endif
-extern pointer malloc ();
-
-/* Define STACK_DIRECTION if you know the direction of stack
-   growth for your system; otherwise it will be automatically
-   deduced at run-time.
-
-   STACK_DIRECTION > 0 => grows toward higher addresses
-   STACK_DIRECTION < 0 => grows toward lower addresses
-   STACK_DIRECTION = 0 => direction of growth unknown  */
-
-#ifndef STACK_DIRECTION
-#define        STACK_DIRECTION 0       /* Direction unknown.  */
-#endif
-
-#if STACK_DIRECTION != 0
-
-#define        STACK_DIR       STACK_DIRECTION /* Known at compile-time.  */
-
-#else /* STACK_DIRECTION == 0; need run-time code.  */
-
-static int stack_dir;          /* 1 or -1 once known.  */
-#define        STACK_DIR       stack_dir
-
-static void
-find_stack_direction (void)
-{
-  static char *addr = NULL;    /* Address of first 'dummy', once known.  */
-  auto char dummy;             /* To get stack address.  */
-
-  if (addr == NULL)
-    {                          /* Initial entry.  */
-      addr = ADDRESS_FUNCTION (dummy);
-
-      find_stack_direction (); /* Recurse once.  */
-    }
-  else
-    {
-      /* Second entry.  */
-      if (ADDRESS_FUNCTION (dummy) > addr)
-       stack_dir = 1;          /* Stack grew upward.  */
-      else
-       stack_dir = -1;         /* Stack grew downward.  */
-    }
-}
-
-#endif /* STACK_DIRECTION == 0 */
-
-/* An "alloca header" is used to:
-   (a) chain together all alloca'ed blocks;
-   (b) keep track of stack depth.
-
-   It is very important that sizeof(header) agree with malloc
-   alignment chunk size.  The following default should work okay.  */
-
-#ifndef        ALIGN_SIZE
-#define        ALIGN_SIZE      sizeof(double)
-#endif
-
-typedef union hdr
-{
-  char align[ALIGN_SIZE];      /* To force sizeof(header).  */
-  struct
-    {
-      union hdr *next;         /* For chaining headers.  */
-      char *deep;              /* For stack depth measure.  */
-    } h;
-} header;
-
-static header *last_alloca_header = NULL;      /* -> last alloca header.  */
-
-/* Return a pointer to at least SIZE bytes of storage,
-   which will be automatically reclaimed upon exit from
-   the procedure that called alloca.  Originally, this space
-   was supposed to be taken from the current stack frame of the
-   caller, but that method cannot be made to work for some
-   implementations of C, for example under Gould's UTX/32.  */
-
-pointer
-alloca (unsigned size)
-{
-  auto char probe;             /* Probes stack depth: */
-  register char *depth = ADDRESS_FUNCTION (probe);
-
-#if STACK_DIRECTION == 0
-  if (STACK_DIR == 0)          /* Unknown growth direction.  */
-    find_stack_direction ();
-#endif
-
-  /* Reclaim garbage, defined as all alloca'd storage that
-     was allocated from deeper in the stack than currently.  */
-
-  {
-    register header *hp;       /* Traverses linked list.  */
-
-#ifdef emacs
-    BLOCK_INPUT;
-#endif
-
-    for (hp = last_alloca_header; hp != NULL;)
-      if ((STACK_DIR > 0 && hp->h.deep > depth)
-         || (STACK_DIR < 0 && hp->h.deep < depth))
-       {
-         register header *np = hp->h.next;
-
-         free ((pointer) hp);  /* Collect garbage.  */
-
-         hp = np;              /* -> next header.  */
-       }
-      else
-       break;                  /* Rest are not deeper.  */
-
-    last_alloca_header = hp;   /* -> last valid storage.  */
-
-#ifdef emacs
-    UNBLOCK_INPUT;
-#endif
-  }
-
-  if (size == 0)
-    return NULL;               /* No allocation required.  */
-
-  /* Allocate combined header + user data storage.  */
-
-  {
-    register pointer new = malloc (sizeof (header) + size);
-    /* Address of header.  */
-
-    if (new == 0)
-      abort();
-
-    ((header *) new)->h.next = last_alloca_header;
-    ((header *) new)->h.deep = depth;
-
-    last_alloca_header = (header *) new;
-
-    /* User storage begins just after header.  */
-
-    return (pointer) ((char *) new + sizeof (header));
-  }
-}
-
-#if defined (CRAY) && defined (CRAY_STACKSEG_END)
-
-#ifdef DEBUG_I00AFUNC
-#include <stdio.h>
-#endif
-
-#ifndef CRAY_STACK
-#define CRAY_STACK
-#ifndef CRAY2
-/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
-struct stack_control_header
-  {
-    long shgrow:32;            /* Number of times stack has grown.  */
-    long shaseg:32;            /* Size of increments to stack.  */
-    long shhwm:32;             /* High water mark of stack.  */
-    long shsize:32;            /* Current size of stack (all segments).  */
-  };
-
-/* The stack segment linkage control information occurs at
-   the high-address end of a stack segment.  (The stack
-   grows from low addresses to high addresses.)  The initial
-   part of the stack segment linkage control information is
-   0200 (octal) words.  This provides for register storage
-   for the routine which overflows the stack.  */
-
-struct stack_segment_linkage
-  {
-    long ss[0200];             /* 0200 overflow words.  */
-    long sssize:32;            /* Number of words in this segment.  */
-    long ssbase:32;            /* Offset to stack base.  */
-    long:32;
-    long sspseg:32;            /* Offset to linkage control of previous
-                                  segment of stack.  */
-    long:32;
-    long sstcpt:32;            /* Pointer to task common address block.  */
-    long sscsnm;               /* Private control structure number for
-                                  microtasking.  */
-    long ssusr1;               /* Reserved for user.  */
-    long ssusr2;               /* Reserved for user.  */
-    long sstpid;               /* Process ID for pid based multi-tasking.  */
-    long ssgvup;               /* Pointer to multitasking thread giveup.  */
-    long sscray[7];            /* Reserved for Cray Research.  */
-    long ssa0;
-    long ssa1;
-    long ssa2;
-    long ssa3;
-    long ssa4;
-    long ssa5;
-    long ssa6;
-    long ssa7;
-    long sss0;
-    long sss1;
-    long sss2;
-    long sss3;
-    long sss4;
-    long sss5;
-    long sss6;
-    long sss7;
-  };
-
-#else /* CRAY2 */
-/* The following structure defines the vector of words
-   returned by the STKSTAT library routine.  */
-struct stk_stat
-  {
-    long now;                  /* Current total stack size.  */
-    long maxc;                 /* Amount of contiguous space which would
-                                  be required to satisfy the maximum
-                                  stack demand to date.  */
-    long high_water;           /* Stack high-water mark.  */
-    long overflows;            /* Number of stack overflow ($STKOFEN) calls.  */
-    long hits;                 /* Number of internal buffer hits.  */
-    long extends;              /* Number of block extensions.  */
-    long stko_mallocs;         /* Block allocations by $STKOFEN.  */
-    long underflows;           /* Number of stack underflow calls ($STKRETN).  */
-    long stko_free;            /* Number of deallocations by $STKRETN.  */
-    long stkm_free;            /* Number of deallocations by $STKMRET.  */
-    long segments;             /* Current number of stack segments.  */
-    long maxs;                 /* Maximum number of stack segments so far.  */
-    long pad_size;             /* Stack pad size.  */
-    long current_address;      /* Current stack segment address.  */
-    long current_size;         /* Current stack segment size.  This
-                                  number is actually corrupted by STKSTAT to
-                                  include the fifteen word trailer area.  */
-    long initial_address;      /* Address of initial segment.  */
-    long initial_size;         /* Size of initial segment.  */
-  };
-
-/* The following structure describes the data structure which trails
-   any stack segment.  I think that the description in 'asdef' is
-   out of date.  I only describe the parts that I am sure about.  */
-
-struct stk_trailer
-  {
-    long this_address;         /* Address of this block.  */
-    long this_size;            /* Size of this block (does not include
-                                  this trailer).  */
-    long unknown2;
-    long unknown3;
-    long link;                 /* Address of trailer block of previous
-                                  segment.  */
-    long unknown5;
-    long unknown6;
-    long unknown7;
-    long unknown8;
-    long unknown9;
-    long unknown10;
-    long unknown11;
-    long unknown12;
-    long unknown13;
-    long unknown14;
-  };
-
-#endif /* CRAY2 */
-#endif /* not CRAY_STACK */
-
-#ifdef CRAY2
-/* Determine a "stack measure" for an arbitrary ADDRESS.
-   I doubt that "lint" will like this much.  */
-
-static long
-i00afunc (long *address)
-{
-  struct stk_stat status;
-  struct stk_trailer *trailer;
-  long *block, size;
-  long result = 0;
-
-  /* We want to iterate through all of the segments.  The first
-     step is to get the stack status structure.  We could do this
-     more quickly and more directly, perhaps, by referencing the
-     $LM00 common block, but I know that this works.  */
-
-  STKSTAT (&status);
-
-  /* Set up the iteration.  */
-
-  trailer = (struct stk_trailer *) (status.current_address
-                                   + status.current_size
-                                   - 15);
-
-  /* There must be at least one stack segment.  Therefore it is
-     a fatal error if "trailer" is null.  */
-
-  if (trailer == 0)
-    abort ();
-
-  /* Discard segments that do not contain our argument address.  */
-
-  while (trailer != 0)
-    {
-      block = (long *) trailer->this_address;
-      size = trailer->this_size;
-      if (block == 0 || size == 0)
-       abort ();
-      trailer = (struct stk_trailer *) trailer->link;
-      if ((block <= address) && (address < (block + size)))
-       break;
-    }
-
-  /* Set the result to the offset in this segment and add the sizes
-     of all predecessor segments.  */
-
-  result = address - block;
-
-  if (trailer == 0)
-    {
-      return result;
-    }
-
-  do
-    {
-      if (trailer->this_size <= 0)
-       abort ();
-      result += trailer->this_size;
-      trailer = (struct stk_trailer *) trailer->link;
-    }
-  while (trailer != 0);
-
-  /* We are done.  Note that if you present a bogus address (one
-     not in any segment), you will get a different number back, formed
-     from subtracting the address of the first block.  This is probably
-     not what you want.  */
-
-  return (result);
-}
-
-#else /* not CRAY2 */
-/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
-   Determine the number of the cell within the stack,
-   given the address of the cell.  The purpose of this
-   routine is to linearize, in some sense, stack addresses
-   for alloca.  */
-
-static long
-i00afunc (long address)
-{
-  long stkl = 0;
-
-  long size, pseg, this_segment, stack;
-  long result = 0;
-
-  struct stack_segment_linkage *ssptr;
-
-  /* Register B67 contains the address of the end of the
-     current stack segment.  If you (as a subprogram) store
-     your registers on the stack and find that you are past
-     the contents of B67, you have overflowed the segment.
-
-     B67 also points to the stack segment linkage control
-     area, which is what we are really interested in.  */
-
-  stkl = CRAY_STACKSEG_END ();
-  ssptr = (struct stack_segment_linkage *) stkl;
-
-  /* If one subtracts 'size' from the end of the segment,
-     one has the address of the first word of the segment.
-
-     If this is not the first segment, 'pseg' will be
-     nonzero.  */
-
-  pseg = ssptr->sspseg;
-  size = ssptr->sssize;
-
-  this_segment = stkl - size;
-
-  /* It is possible that calling this routine itself caused
-     a stack overflow.  Discard stack segments which do not
-     contain the target address.  */
-
-  while (!(this_segment <= address && address <= stkl))
-    {
-#ifdef DEBUG_I00AFUNC
-      fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
-#endif
-      if (pseg == 0)
-       break;
-      stkl = stkl - pseg;
-      ssptr = (struct stack_segment_linkage *) stkl;
-      size = ssptr->sssize;
-      pseg = ssptr->sspseg;
-      this_segment = stkl - size;
-    }
-
-  result = address - this_segment;
-
-  /* If you subtract pseg from the current end of the stack,
-     you get the address of the previous stack segment's end.
-     This seems a little convoluted to me, but I'll bet you save
-     a cycle somewhere.  */
-
-  while (pseg != 0)
-    {
-#ifdef DEBUG_I00AFUNC
-      fprintf (stderr, "%011o %011o\n", pseg, size);
-#endif
-      stkl = stkl - pseg;
-      ssptr = (struct stack_segment_linkage *) stkl;
-      size = ssptr->sssize;
-      pseg = ssptr->sspseg;
-      result += size;
-    }
-  return (result);
-}
-
-#endif /* not CRAY2 */
-#endif /* CRAY */
-
-#endif /* no alloca */
-#endif /* not GCC version 2 */
diff --git a/amiga.c b/amiga.c
deleted file mode 100644 (file)
index cfd0d08..0000000
--- a/amiga.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* Running commands on Amiga
-Copyright (C) 1995-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "variable.h"
-#include "amiga.h"
-#include <assert.h>
-#include <exec/memory.h>
-#include <dos/dostags.h>
-#include <proto/exec.h>
-#include <proto/dos.h>
-
-static const char Amiga_version[] = "$VER: Make 3.74.3 (12.05.96) \n"
-                    "Amiga Port by A. Digulla (digulla@home.lake.de)";
-
-int
-MyExecute (char **argv)
-{
-    char * buffer, * ptr;
-    char ** aptr;
-    int len = 0;
-    int status;
-
-    for (aptr=argv; *aptr; aptr++)
-    {
-        len += strlen (*aptr) + 4;
-    }
-
-    buffer = AllocMem (len, MEMF_ANY);
-
-    if (!buffer)
-      O (fatal, NILF, "MyExecute: Cannot allocate space for calling a command\n");
-
-    ptr = buffer;
-
-    for (aptr=argv; *aptr; aptr++)
-    {
-        if (((*aptr)[0] == ';' && !(*aptr)[1]))
-        {
-            *ptr ++ = '"';
-            strcpy (ptr, *aptr);
-            ptr += strlen (ptr);
-            *ptr ++ = '"';
-        }
-        else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2])
-        {
-            *ptr ++ = '\n';
-            continue;
-        }
-        else
-        {
-            strcpy (ptr, *aptr);
-            ptr += strlen (ptr);
-        }
-        *ptr ++ = ' ';
-        *ptr = 0;
-    }
-
-    ptr[-1] = '\n';
-
-    status = SystemTags (buffer,
-        SYS_UserShell, TRUE,
-        TAG_END);
-
-    FreeMem (buffer, len);
-
-    if (SetSignal (0L,0L) & SIGBREAKF_CTRL_C)
-        status = 20;
-
-    /* Warnings don't count */
-    if (status == 5)
-        status = 0;
-
-    return status;
-}
-
-char *
-wildcard_expansion (char *wc, char *o)
-{
-#   define PATH_SIZE    1024
-    struct AnchorPath * apath;
-
-    if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE,
-            MEMF_CLEAR))
-        )
-    {
-        apath->ap_Strlen = PATH_SIZE;
-
-        if (MatchFirst (wc, apath) == 0)
-        {
-            do
-            {
-                o = variable_buffer_output (o, apath->ap_Buf,
-                        strlen (apath->ap_Buf));
-                o = variable_buffer_output (o, " ",1);
-            } while (MatchNext (apath) == 0);
-        }
-
-        MatchEnd (apath);
-        FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE);
-    }
-
-    return o;
-}
diff --git a/amiga.h b/amiga.h
deleted file mode 100644 (file)
index afc910a..0000000
--- a/amiga.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* Definitions for amiga specific things
-Copyright (C) 1995-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-int MyExecute (char ** argv);
-char * wildcard_expansion (char * wc, char * o);
diff --git a/ar.c b/ar.c
deleted file mode 100644 (file)
index b9c1cf7..0000000
--- a/ar.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/* Interface to 'ar' archives for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#ifndef NO_ARCHIVES
-
-#include "filedef.h"
-#include "dep.h"
-#include <fnmatch.h>
-
-/* Return nonzero if NAME is an archive-member reference, zero if not.  An
-   archive-member reference is a name like 'lib(member)' where member is a
-   non-empty string.
-   If a name like 'lib((entry))' is used, a fatal error is signaled at
-   the attempt to use this unsupported feature.  */
-
-int
-ar_name (const char *name)
-{
-  const char *p = strchr (name, '(');
-  const char *end;
-
-  if (p == 0 || p == name)
-    return 0;
-
-  end = p + strlen (p) - 1;
-  if (*end != ')' || end == p + 1)
-    return 0;
-
-  if (p[1] == '(' && end[-1] == ')')
-    OS (fatal, NILF, _("attempt to use unsupported feature: '%s'"), name);
-
-  return 1;
-}
-
-
-/* Parse the archive-member reference NAME into the archive and member names.
-   Creates one allocated string containing both names, pointed to by ARNAME_P.
-   MEMNAME_P points to the member.  */
-
-void
-ar_parse_name (const char *name, char **arname_p, char **memname_p)
-{
-  char *p;
-
-  *arname_p = xstrdup (name);
-  p = strchr (*arname_p, '(');
-  *(p++) = '\0';
-  p[strlen (p) - 1] = '\0';
-  *memname_p = p;
-}
-\f
-
-/* This function is called by 'ar_scan' to find which member to look at.  */
-
-/* ARGSUSED */
-static long int
-ar_member_date_1 (int desc UNUSED, const char *mem, int truncated,
-                  long int hdrpos UNUSED, long int datapos UNUSED,
-                  long int size UNUSED, long int date,
-                  int uid UNUSED, int gid UNUSED, unsigned int mode UNUSED,
-                  const void *name)
-{
-  return ar_name_equal (name, mem, truncated) ? date : 0;
-}
-
-/* Return the modtime of NAME.  */
-
-time_t
-ar_member_date (const char *name)
-{
-  char *arname;
-  char *memname;
-  long int val;
-
-  ar_parse_name (name, &arname, &memname);
-
-  /* Make sure we know the modtime of the archive itself because we are
-     likely to be called just before commands to remake a member are run,
-     and they will change the archive itself.
-
-     But we must be careful not to enter_file the archive itself if it does
-     not exist, because pattern_search assumes that files found in the data
-     base exist or can be made.  */
-  {
-    struct file *arfile;
-    arfile = lookup_file (arname);
-    if (arfile == 0 && file_exists_p (arname))
-      arfile = enter_file (strcache_add (arname));
-
-    if (arfile != 0)
-      (void) f_mtime (arfile, 0);
-  }
-
-  val = ar_scan (arname, ar_member_date_1, memname);
-
-  free (arname);
-
-  return (val <= 0 ? (time_t) -1 : (time_t) val);
-}
-\f
-/* Set the archive-member NAME's modtime to now.  */
-
-#ifdef VMS
-int
-ar_touch (const char *name)
-{
-  O (error, NILF, _("touch archive member is not available on VMS"));
-  return -1;
-}
-#else
-int
-ar_touch (const char *name)
-{
-  char *arname, *memname;
-  int val;
-
-  ar_parse_name (name, &arname, &memname);
-
-  /* Make sure we know the modtime of the archive itself before we
-     touch the member, since this will change the archive modtime.  */
-  {
-    struct file *arfile;
-    arfile = enter_file (strcache_add (arname));
-    f_mtime (arfile, 0);
-  }
-
-  val = 1;
-  switch (ar_member_touch (arname, memname))
-    {
-    case -1:
-      OS (error, NILF, _("touch: Archive '%s' does not exist"), arname);
-      break;
-    case -2:
-      OS (error, NILF, _("touch: '%s' is not a valid archive"), arname);
-      break;
-    case -3:
-      perror_with_name ("touch: ", arname);
-      break;
-    case 1:
-      OSS (error, NILF,
-           _("touch: Member '%s' does not exist in '%s'"), memname, arname);
-      break;
-    case 0:
-      val = 0;
-      break;
-    default:
-      OS (error, NILF,
-          _("touch: Bad return code from ar_member_touch on '%s'"), name);
-    }
-
-  free (arname);
-
-  return val;
-}
-#endif /* !VMS */
-\f
-/* State of an 'ar_glob' run, passed to 'ar_glob_match'.  */
-
-/* On VMS, (object) modules in libraries do not have suffixes. That is, to
-   find a match for a pattern, the pattern must not have any suffix. So the
-   suffix of the pattern is saved and the pattern is stripped (ar_glob).
-   If there is a match and the match, which is a module name, is added to
-   the chain, the saved suffix is added back to construct a source filename
-   (ar_glob_match). */
-
-struct ar_glob_state
-  {
-    const char *arname;
-    const char *pattern;
-#ifdef VMS
-    char *suffix;
-#endif
-    unsigned int size;
-    struct nameseq *chain;
-    unsigned int n;
-  };
-
-/* This function is called by 'ar_scan' to match one archive
-   element against the pattern in STATE.  */
-
-static long int
-ar_glob_match (int desc UNUSED, const char *mem, int truncated UNUSED,
-               long int hdrpos UNUSED, long int datapos UNUSED,
-               long int size UNUSED, long int date UNUSED, int uid UNUSED,
-               int gid UNUSED, unsigned int mode UNUSED, const void *arg)
-{
-  struct ar_glob_state *state = (struct ar_glob_state *)arg;
-
-  if (fnmatch (state->pattern, mem, FNM_PATHNAME|FNM_PERIOD) == 0)
-    {
-      /* We have a match.  Add it to the chain.  */
-      struct nameseq *new = xcalloc (state->size);
-#ifdef VMS
-      if (state->suffix)
-        new->name = strcache_add(
-            concat(5, state->arname, "(", mem, state->suffix, ")"));
-      else
-#endif
-        new->name = strcache_add(concat(4, state->arname, "(", mem, ")"));
-      new->next = state->chain;
-      state->chain = new;
-      ++state->n;
-    }
-
-  return 0L;
-}
-
-/* Return nonzero if PATTERN contains any metacharacters.
-   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
-static int
-ar_glob_pattern_p (const char *pattern, int quote)
-{
-  const char *p;
-  int opened = 0;
-
-  for (p = pattern; *p != '\0'; ++p)
-    switch (*p)
-      {
-      case '?':
-      case '*':
-        return 1;
-
-      case '\\':
-        if (quote)
-          ++p;
-        break;
-
-      case '[':
-        opened = 1;
-        break;
-
-      case ']':
-        if (opened)
-          return 1;
-        break;
-      }
-
-  return 0;
-}
-
-/* Glob for MEMBER_PATTERN in archive ARNAME.
-   Return a malloc'd chain of matching elements (or nil if none).  */
-
-struct nameseq *
-ar_glob (const char *arname, const char *member_pattern, unsigned int size)
-{
-  struct ar_glob_state state;
-  struct nameseq *n;
-  const char **names;
-  unsigned int i;
-#ifdef VMS
-  char *vms_member_pattern;
-#endif
-  if (! ar_glob_pattern_p (member_pattern, 1))
-    return 0;
-
-  /* Scan the archive for matches.
-     ar_glob_match will accumulate them in STATE.chain.  */
-  state.arname = arname;
-  state.pattern = member_pattern;
-#ifdef VMS
-    {
-      /* In a copy of the pattern, find the suffix, save it and  remove it from
-         the pattern */
-      char *lastdot;
-      vms_member_pattern = xstrdup(member_pattern);
-      lastdot = strrchr(vms_member_pattern, '.');
-      state.suffix = lastdot;
-      if (lastdot)
-        {
-          state.suffix = xstrdup(lastdot);
-          *lastdot = 0;
-        }
-      state.pattern = vms_member_pattern;
-    }
-#endif
-  state.size = size;
-  state.chain = 0;
-  state.n = 0;
-  ar_scan (arname, ar_glob_match, &state);
-
-#ifdef VMS
-  /* Deallocate any duplicated string */
-  free(vms_member_pattern);
-  if (state.suffix)
-    {
-      free(state.suffix);
-    }
-#endif
-
-  if (state.chain == 0)
-    return 0;
-
-  /* Now put the names into a vector for sorting.  */
-  names = alloca (state.n * sizeof (const char *));
-  i = 0;
-  for (n = state.chain; n != 0; n = n->next)
-    names[i++] = n->name;
-
-  /* Sort them alphabetically.  */
-  /* MSVC erroneously warns without a cast here.  */
-  qsort ((void *)names, i, sizeof (*names), alpha_compare);
-
-  /* Put them back into the chain in the sorted order.  */
-  i = 0;
-  for (n = state.chain; n != 0; n = n->next)
-    n->name = names[i++];
-
-  return state.chain;
-}
-
-#endif  /* Not NO_ARCHIVES.  */
diff --git a/arscan.c b/arscan.c
deleted file mode 100644 (file)
index 549fe1e..0000000
--- a/arscan.c
+++ /dev/null
@@ -1,982 +0,0 @@
-/* Library function for scanning an archive file.
-Copyright (C) 1987-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#ifdef TEST
-/* Hack, the real error() routine eventually pulls in die from main.c */
-#define error(a, b, c, d)
-#endif
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#else
-#include <sys/file.h>
-#endif
-
-#ifndef NO_ARCHIVES
-
-#ifdef VMS
-#include <lbrdef.h>
-#include <mhddef.h>
-#include <credef.h>
-#include <descrip.h>
-#include <ctype.h>
-#include <ssdef.h>
-#include <stsdef.h>
-#include <rmsdef.h>
-
-/* This symbol should be present in lbrdef.h. */
-#ifndef LBR$_HDRTRUNC
-#pragma extern_model save
-#pragma extern_model globalvalue
-extern unsigned int LBR$_HDRTRUNC;
-#pragma extern_model restore
-#endif
-
-#include <unixlib.h>
-#include <lbr$routines.h>
-
-const char *
-vmsify (const char *name, int type);
-
-/* Time conversion from VMS to Unix
-   Conversion from local time (stored in library) to GMT (needed for gmake)
-   Note: The tm_gmtoff element is a VMS extension to the ANSI standard. */
-static time_t
-vms_time_to_unix(void *vms_time)
-{
-  struct tm *tmp;
-  time_t unix_time;
-
-  unix_time = decc$fix_time(vms_time);
-  tmp = localtime(&unix_time);
-  unix_time -= tmp->tm_gmtoff;
-
-  return unix_time;
-}
-
-
-/* VMS library routines need static variables for callback */
-static void *VMS_lib_idx;
-
-static const void *VMS_saved_arg;
-
-static long int (*VMS_function) ();
-
-static long int VMS_function_ret;
-
-
-/* This is a callback procedure for lib$get_index */
-static int
-VMS_get_member_info(struct dsc$descriptor_s *module, unsigned long *rfa)
-{
-  int status, i;
-  const int truncated = 0; /* Member name may be truncated */
-  time_t member_date; /* Member date */
-  char *filename;
-  unsigned int buffer_length; /* Actual buffer length */
-
-  /* Unused constants - Make does not actually use most of these */
-  const int file_desc = -1; /* archive file descriptor for reading the data */
-  const int header_position = 0; /* Header position */
-  const int data_position = 0; /* Data position in file */
-  const int data_size = 0; /* Data size */
-  const int uid = 0; /* member gid */
-  const int gid = 0; /* member gid */
-  const int mode = 0; /* member protection mode */
-  /* End of unused constants */
-
-  static struct dsc$descriptor_s bufdesc =
-    { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
-
-  /* Only need the module definition */
-  struct mhddef *mhd;
-
-  /* If a previous callback is non-zero, just return that status */
-  if (VMS_function_ret)
-    {
-      return SS$_NORMAL;
-    }
-
-  /* lbr_set_module returns more than just the module header. So allocate
-     a buffer which is big enough: the maximum LBR$C_MAXHDRSIZ. That's at
-     least bigger than the size of struct mhddef.
-     If the request is too small, a buffer truncated warning is issued so
-     it can be reissued with a larger buffer.
-     We do not care if the buffer is truncated, so that is still a success. */
-  mhd = xmalloc(LBR$C_MAXHDRSIZ);
-  bufdesc.dsc$a_pointer = (char *) mhd;
-  bufdesc.dsc$w_length = LBR$C_MAXHDRSIZ;
-
-  status = lbr$set_module(&VMS_lib_idx, rfa, &bufdesc, &buffer_length, 0);
-
-  if ((status != LBR$_HDRTRUNC) && !$VMS_STATUS_SUCCESS(status))
-    {
-      ON(error, NILF,
-          _("lbr$set_module() failed to extract module info, status = %d"),
-          status);
-
-      lbr$close(&VMS_lib_idx);
-
-      return status;
-    }
-
-#ifdef TEST
-  /* When testing this code, it is useful to know the length returned */
-  printf("Input length = %d, actual = %d\n",
-      bufdesc.dsc$w_length, buffer_length);
-#endif
-
-  /* Conversion from VMS time to C time.
-     VMS defectlet - mhddef is sub-optimal, for the time, it has a 32 bit
-     longword, mhd$l_datim, and a 32 bit fill instead of two longwords, or
-     equivalent. */
-  member_date = vms_time_to_unix(&mhd->mhd$l_datim);
-  free(mhd);
-
-  /* Here we have a problem.  The module name on VMS does not have
-     a file type, but the filename pattern in the "VMS_saved_arg"
-     may have one.
-     But only the method being called knows how to interpret the
-     filename pattern.
-     There are currently two different formats being used.
-     This means that we need a VMS specific code in those methods
-     to handle it. */
-  filename = xmalloc(module->dsc$w_length + 1);
-
-  /* TODO: We may need an option to preserve the case of the module
-     For now force the module name to lower case */
-  for (i = 0; i < module->dsc$w_length; i++)
-    filename[i] = _tolower((unsigned char )module->dsc$a_pointer[i]);
-
-  filename[i] = '\0';
-
-  VMS_function_ret = (*VMS_function)(file_desc, filename, truncated,
-      header_position, data_position, data_size, member_date, uid, gid, mode,
-      VMS_saved_arg);
-
-  free(filename);
-  return SS$_NORMAL;
-}
-
-
-/* Takes three arguments ARCHIVE, FUNCTION and ARG.
-
-   Open the archive named ARCHIVE, find its members one by one,
-   and for each one call FUNCTION with the following arguments:
-     archive file descriptor for reading the data,
-     member name,
-     member name might be truncated flag,
-     member header position in file,
-     member data position in file,
-     member data size,
-     member date,
-     member uid,
-     member gid,
-     member protection mode,
-     ARG.
-
-   NOTE: on VMS systems, only name, date, and arg are meaningful!
-
-   The descriptor is poised to read the data of the member
-   when FUNCTION is called.  It does not matter how much
-   data FUNCTION reads.
-
-   If FUNCTION returns nonzero, we immediately return
-   what FUNCTION returned.
-
-   Returns -1 if archive does not exist,
-   Returns -2 if archive has invalid format.
-   Returns 0 if have scanned successfully.  */
-
-long int
-ar_scan (const char *archive, ar_member_func_t function, const void *varg)
-{
-  char *vms_archive;
-
-  static struct dsc$descriptor_s libdesc =
-    { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
-
-  const unsigned long func = LBR$C_READ;
-  const unsigned long type = LBR$C_TYP_UNK;
-  const unsigned long index = 1;
-  unsigned long lib_idx;
-  int status;
-
-  VMS_saved_arg = varg;
-
-  /* Null archive string can show up in test and cause an access violation */
-  if (archive == NULL)
-    {
-      /* Null filenames do not exist */
-      return -1;
-    }
-
-  /* archive path name must be in VMS format */
-  vms_archive = (char *) vmsify(archive, 0);
-
-  status = lbr$ini_control(&VMS_lib_idx, &func, &type, 0);
-
-  if (!$VMS_STATUS_SUCCESS(status))
-    {
-      ON(error, NILF, _("lbr$ini_control() failed with status = %d"), status);
-      return -2;
-    }
-
-  libdesc.dsc$a_pointer = vms_archive;
-  libdesc.dsc$w_length = strlen(vms_archive);
-
-  status = lbr$open(&VMS_lib_idx, &libdesc, 0, NULL, 0, NULL, 0);
-
-  if (!$VMS_STATUS_SUCCESS(status))
-    {
-
-      /* TODO: A library format failure could mean that this is a file
-         generated by the GNU AR utility and in that case, we need to
-         take the UNIX codepath.  This will also take a change to the
-         GNV AR wrapper program. */
-
-      switch (status)
-        {
-      case RMS$_FNF:
-        /* Archive does not exist */
-        return -1;
-      default:
-#ifndef TEST
-        OSN(error, NILF,
-            _("unable to open library '%s' to lookup member status %d"),
-            archive, status);
-#endif
-        /* For library format errors, specification says to return -2 */
-        return -2;
-        }
-    }
-
-  VMS_function = function;
-
-  /* Clear the return status, as we are supposed to stop calling the
-     callback function if it becomes non-zero, and this is a static
-     variable. */
-  VMS_function_ret = 0;
-
-  status = lbr$get_index(&VMS_lib_idx, &index, VMS_get_member_info, NULL, 0);
-
-  lbr$close(&VMS_lib_idx);
-
-  /* Unless a failure occurred in the lbr$ routines, return the
-     the status from the 'function' routine. */
-  if ($VMS_STATUS_SUCCESS(status))
-    {
-      return VMS_function_ret;
-    }
-
-  /* This must be something wrong with the library and an error
-     message should already have been printed. */
-  return -2;
-}
-
-#else /* !VMS */
-
-/* SCO Unix's compiler defines both of these.  */
-#ifdef  M_UNIX
-#undef  M_XENIX
-#endif
-
-/* On the sun386i and in System V rel 3, ar.h defines two different archive
-   formats depending upon whether you have defined PORTAR (normal) or PORT5AR
-   (System V Release 1).  There is no default, one or the other must be defined
-   to have a nonzero value.  */
-
-#if (!defined (PORTAR) || PORTAR == 0) && (!defined (PORT5AR) || PORT5AR == 0)
-#undef  PORTAR
-#ifdef M_XENIX
-/* According to Jim Sievert <jas1@rsvl.unisys.com>, for SCO XENIX defining
-   PORTAR to 1 gets the wrong archive format, and defining it to 0 gets the
-   right one.  */
-#define PORTAR 0
-#else
-#define PORTAR 1
-#endif
-#endif
-
-/* On AIX, define these symbols to be sure to get both archive formats.
-   AIX 4.3 introduced the "big" archive format to support 64-bit object
-   files, so on AIX 4.3 systems we need to support both the "normal" and
-   "big" archive formats.  An archive's format is indicated in the
-   "fl_magic" field of the "FL_HDR" structure.  For a normal archive,
-   this field will be the string defined by the AIAMAG symbol.  For a
-   "big" archive, it will be the string defined by the AIAMAGBIG symbol
-   (at least on AIX it works this way).
-
-   Note: we'll define these symbols regardless of which AIX version
-   we're compiling on, but this is okay since we'll use the new symbols
-   only if they're present.  */
-#ifdef _AIX
-# define __AR_SMALL__
-# define __AR_BIG__
-#endif
-
-#ifndef WINDOWS32
-# if !defined (__ANDROID__) && !defined (__BEOS__)
-#  include <ar.h>
-# else
-   /* These platforms don't have <ar.h> but have archives in the same format
-    * as many other Unices.  This was taken from GNU binutils for BeOS.
-    */
-#  define ARMAG "!<arch>\n"     /* String that begins an archive file.  */
-#  define SARMAG 8              /* Size of that string.  */
-#  define ARFMAG "`\n"          /* String in ar_fmag at end of each header.  */
-struct ar_hdr
-  {
-    char ar_name[16];           /* Member file name, sometimes / terminated. */
-    char ar_date[12];           /* File date, decimal seconds since Epoch.  */
-    char ar_uid[6], ar_gid[6];  /* User and group IDs, in ASCII decimal.  */
-    char ar_mode[8];            /* File mode, in ASCII octal.  */
-    char ar_size[10];           /* File size, in ASCII decimal.  */
-    char ar_fmag[2];            /* Always contains ARFMAG.  */
-  };
-# endif
-# define TOCHAR(_m)     (_m)
-#else
-/* These should allow us to read Windows (VC++) libraries (according to Frank
- * Libbrecht <frankl@abzx.belgium.hp.com>)
- */
-# include <windows.h>
-# include <windef.h>
-# include <io.h>
-# define ARMAG      IMAGE_ARCHIVE_START
-# define SARMAG     IMAGE_ARCHIVE_START_SIZE
-# define ar_hdr     _IMAGE_ARCHIVE_MEMBER_HEADER
-# define ar_name    Name
-# define ar_mode    Mode
-# define ar_size    Size
-# define ar_date    Date
-# define ar_uid     UserID
-# define ar_gid     GroupID
-/* In Windows the member names have type BYTE so we must cast them.  */
-# define TOCHAR(_m)     ((char *)(_m))
-#endif
-
-/* Cray's <ar.h> apparently defines this.  */
-#ifndef AR_HDR_SIZE
-# define   AR_HDR_SIZE  (sizeof (struct ar_hdr))
-#endif
-\f
-/* Takes three arguments ARCHIVE, FUNCTION and ARG.
-
-   Open the archive named ARCHIVE, find its members one by one,
-   and for each one call FUNCTION with the following arguments:
-     archive file descriptor for reading the data,
-     member name,
-     member name might be truncated flag,
-     member header position in file,
-     member data position in file,
-     member data size,
-     member date,
-     member uid,
-     member gid,
-     member protection mode,
-     ARG.
-
-   The descriptor is poised to read the data of the member
-   when FUNCTION is called.  It does not matter how much
-   data FUNCTION reads.
-
-   If FUNCTION returns nonzero, we immediately return
-   what FUNCTION returned.
-
-   Returns -1 if archive does not exist,
-   Returns -2 if archive has invalid format.
-   Returns 0 if have scanned successfully.  */
-
-long int
-ar_scan (const char *archive, ar_member_func_t function, const void *arg)
-{
-#ifdef AIAMAG
-  FL_HDR fl_header;
-# ifdef AIAMAGBIG
-  int big_archive = 0;
-  FL_HDR_BIG fl_header_big;
-# endif
-#endif
-  char *namemap = 0;
-  int desc = open (archive, O_RDONLY, 0);
-  if (desc < 0)
-    return -1;
-#ifdef SARMAG
-  {
-    char buf[SARMAG];
-    int nread;
-    EINTRLOOP (nread, read (desc, buf, SARMAG));
-    if (nread != SARMAG || memcmp (buf, ARMAG, SARMAG))
-      {
-        (void) close (desc);
-        return -2;
-      }
-  }
-#else
-#ifdef AIAMAG
-  {
-    int nread;
-    EINTRLOOP (nread, read (desc, &fl_header, FL_HSZ));
-    if (nread != FL_HSZ)
-      {
-        (void) close (desc);
-        return -2;
-      }
-#ifdef AIAMAGBIG
-    /* If this is a "big" archive, then set the flag and
-       re-read the header into the "big" structure. */
-    if (!memcmp (fl_header.fl_magic, AIAMAGBIG, SAIAMAG))
-      {
-        off_t o;
-
-        big_archive = 1;
-
-        /* seek back to beginning of archive */
-        EINTRLOOP (o, lseek (desc, 0, 0));
-        if (o < 0)
-          {
-            (void) close (desc);
-            return -2;
-          }
-
-        /* re-read the header into the "big" structure */
-        EINTRLOOP (nread, read (desc, &fl_header_big, FL_HSZ_BIG));
-        if (nread != FL_HSZ_BIG)
-          {
-            (void) close (desc);
-            return -2;
-          }
-      }
-    else
-#endif
-       /* Check to make sure this is a "normal" archive. */
-      if (memcmp (fl_header.fl_magic, AIAMAG, SAIAMAG))
-        {
-          (void) close (desc);
-          return -2;
-        }
-  }
-#else
-  {
-#ifndef M_XENIX
-    int buf;
-#else
-    unsigned short int buf;
-#endif
-    int nread;
-    EINTRLOOP (nread, read (desc, &buf, sizeof (buf)));
-    if (nread != sizeof (buf) || buf != ARMAG)
-      {
-        (void) close (desc);
-        return -2;
-      }
-  }
-#endif
-#endif
-
-  /* Now find the members one by one.  */
-  {
-#ifdef SARMAG
-    register long int member_offset = SARMAG;
-#else
-#ifdef AIAMAG
-    long int member_offset;
-    long int last_member_offset;
-
-#ifdef AIAMAGBIG
-    if ( big_archive )
-      {
-        sscanf (fl_header_big.fl_fstmoff, "%20ld", &member_offset);
-        sscanf (fl_header_big.fl_lstmoff, "%20ld", &last_member_offset);
-      }
-    else
-#endif
-      {
-        sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset);
-        sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset);
-      }
-
-    if (member_offset == 0)
-      {
-        /* Empty archive.  */
-        close (desc);
-        return 0;
-      }
-#else
-#ifndef M_XENIX
-    register long int member_offset = sizeof (int);
-#else   /* Xenix.  */
-    register long int member_offset = sizeof (unsigned short int);
-#endif  /* Not Xenix.  */
-#endif
-#endif
-
-    while (1)
-      {
-        register int nread;
-        struct ar_hdr member_header;
-#ifdef AIAMAGBIG
-        struct ar_hdr_big member_header_big;
-#endif
-#ifdef AIAMAG
-        char name[256];
-        int name_len;
-        long int dateval;
-        int uidval, gidval;
-        long int data_offset;
-#else
-        char namebuf[sizeof member_header.ar_name + 1];
-        char *name;
-        int is_namemap;         /* Nonzero if this entry maps long names.  */
-        int long_name = 0;
-#endif
-        long int eltsize;
-        unsigned int eltmode;
-        long int fnval;
-        off_t o;
-
-        EINTRLOOP (o, lseek (desc, member_offset, 0));
-        if (o < 0)
-          {
-            (void) close (desc);
-            return -2;
-          }
-
-#ifdef AIAMAG
-#define       AR_MEMHDR_SZ(x) (sizeof(x) - sizeof (x._ar_name))
-
-#ifdef AIAMAGBIG
-        if (big_archive)
-          {
-            EINTRLOOP (nread, read (desc, &member_header_big,
-                                    AR_MEMHDR_SZ(member_header_big)));
-
-            if (nread != AR_MEMHDR_SZ(member_header_big))
-              {
-                (void) close (desc);
-                return -2;
-              }
-
-            sscanf (member_header_big.ar_namlen, "%4d", &name_len);
-            EINTRLOOP (nread, read (desc, name, name_len));
-
-            if (nread != name_len)
-              {
-                (void) close (desc);
-                return -2;
-              }
-
-            name[name_len] = 0;
-
-            sscanf (member_header_big.ar_date, "%12ld", &dateval);
-            sscanf (member_header_big.ar_uid, "%12d", &uidval);
-            sscanf (member_header_big.ar_gid, "%12d", &gidval);
-            sscanf (member_header_big.ar_mode, "%12o", &eltmode);
-            sscanf (member_header_big.ar_size, "%20ld", &eltsize);
-
-            data_offset = (member_offset + AR_MEMHDR_SZ(member_header_big)
-                           + name_len + 2);
-          }
-        else
-#endif
-          {
-            EINTRLOOP (nread, read (desc, &member_header,
-                                    AR_MEMHDR_SZ(member_header)));
-
-            if (nread != AR_MEMHDR_SZ(member_header))
-              {
-                (void) close (desc);
-                return -2;
-              }
-
-            sscanf (member_header.ar_namlen, "%4d", &name_len);
-            EINTRLOOP (nread, read (desc, name, name_len));
-
-            if (nread != name_len)
-              {
-                (void) close (desc);
-                return -2;
-              }
-
-            name[name_len] = 0;
-
-            sscanf (member_header.ar_date, "%12ld", &dateval);
-            sscanf (member_header.ar_uid, "%12d", &uidval);
-            sscanf (member_header.ar_gid, "%12d", &gidval);
-            sscanf (member_header.ar_mode, "%12o", &eltmode);
-            sscanf (member_header.ar_size, "%12ld", &eltsize);
-
-            data_offset = (member_offset + AR_MEMHDR_SZ(member_header)
-                           + name_len + 2);
-          }
-        data_offset += data_offset % 2;
-
-        fnval =
-          (*function) (desc, name, 0,
-                       member_offset, data_offset, eltsize,
-                       dateval, uidval, gidval,
-                       eltmode, arg);
-
-#else   /* Not AIAMAG.  */
-        EINTRLOOP (nread, read (desc, &member_header, AR_HDR_SIZE));
-        if (nread == 0)
-          /* No data left means end of file; that is OK.  */
-          break;
-
-        if (nread != AR_HDR_SIZE
-#if defined(ARFMAG) || defined(ARFZMAG)
-            || (
-# ifdef ARFMAG
-                memcmp (member_header.ar_fmag, ARFMAG, 2)
-# else
-                1
-# endif
-                &&
-# ifdef ARFZMAG
-                memcmp (member_header.ar_fmag, ARFZMAG, 2)
-# else
-                1
-# endif
-               )
-#endif
-            )
-          {
-            (void) close (desc);
-            return -2;
-          }
-
-        name = namebuf;
-        memcpy (name, member_header.ar_name, sizeof member_header.ar_name);
-        {
-          register char *p = name + sizeof member_header.ar_name;
-          do
-            *p = '\0';
-          while (p > name && *--p == ' ');
-
-#ifndef AIAMAG
-          /* If the member name is "//" or "ARFILENAMES/" this may be
-             a list of file name mappings.  The maximum file name
-             length supported by the standard archive format is 14
-             characters.  This member will actually always be the
-             first or second entry in the archive, but we don't check
-             that.  */
-          is_namemap = (!strcmp (name, "//")
-                        || !strcmp (name, "ARFILENAMES/"));
-#endif  /* Not AIAMAG. */
-          /* On some systems, there is a slash after each member name.  */
-          if (*p == '/')
-            *p = '\0';
-
-#ifndef AIAMAG
-          /* If the member name starts with a space or a slash, this
-             is an index into the file name mappings (used by GNU ar).
-             Otherwise if the member name looks like #1/NUMBER the
-             real member name appears in the element data (used by
-             4.4BSD).  */
-          if (! is_namemap
-              && (name[0] == ' ' || name[0] == '/')
-              && namemap != 0)
-            {
-              name = namemap + atoi (name + 1);
-              long_name = 1;
-            }
-          else if (name[0] == '#'
-                   && name[1] == '1'
-                   && name[2] == '/')
-            {
-              int namesize = atoi (name + 3);
-
-              name = alloca (namesize + 1);
-              EINTRLOOP (nread, read (desc, name, namesize));
-              if (nread != namesize)
-                {
-                  close (desc);
-                  return -2;
-                }
-              name[namesize] = '\0';
-
-              long_name = 1;
-            }
-#endif /* Not AIAMAG. */
-        }
-
-#ifndef M_XENIX
-        sscanf (TOCHAR (member_header.ar_mode), "%o", &eltmode);
-        eltsize = atol (TOCHAR (member_header.ar_size));
-#else   /* Xenix.  */
-        eltmode = (unsigned short int) member_header.ar_mode;
-        eltsize = member_header.ar_size;
-#endif  /* Not Xenix.  */
-
-        fnval =
-          (*function) (desc, name, ! long_name, member_offset,
-                       member_offset + AR_HDR_SIZE, eltsize,
-#ifndef M_XENIX
-                       atol (TOCHAR (member_header.ar_date)),
-                       atoi (TOCHAR (member_header.ar_uid)),
-                       atoi (TOCHAR (member_header.ar_gid)),
-#else   /* Xenix.  */
-                       member_header.ar_date,
-                       member_header.ar_uid,
-                       member_header.ar_gid,
-#endif  /* Not Xenix.  */
-                       eltmode, arg);
-
-#endif  /* AIAMAG.  */
-
-        if (fnval)
-          {
-            (void) close (desc);
-            return fnval;
-          }
-
-#ifdef AIAMAG
-        if (member_offset == last_member_offset)
-          /* End of the chain.  */
-          break;
-
-#ifdef AIAMAGBIG
-        if (big_archive)
-         sscanf (member_header_big.ar_nxtmem, "%20ld", &member_offset);
-        else
-#endif
-          sscanf (member_header.ar_nxtmem, "%12ld", &member_offset);
-
-        if (lseek (desc, member_offset, 0) != member_offset)
-          {
-            (void) close (desc);
-            return -2;
-          }
-#else
-
-        /* If this member maps archive names, we must read it in.  The
-           name map will always precede any members whose names must
-           be mapped.  */
-        if (is_namemap)
-          {
-            char *clear;
-            char *limit;
-
-            namemap = alloca (eltsize);
-            EINTRLOOP (nread, read (desc, namemap, eltsize));
-            if (nread != eltsize)
-              {
-                (void) close (desc);
-                return -2;
-              }
-
-            /* The names are separated by newlines.  Some formats have
-               a trailing slash.  Null terminate the strings for
-               convenience.  */
-            limit = namemap + eltsize;
-            for (clear = namemap; clear < limit; clear++)
-              {
-                if (*clear == '\n')
-                  {
-                    *clear = '\0';
-                    if (clear[-1] == '/')
-                      clear[-1] = '\0';
-                  }
-              }
-
-            is_namemap = 0;
-          }
-
-        member_offset += AR_HDR_SIZE + eltsize;
-        if (member_offset % 2 != 0)
-          member_offset++;
-#endif
-      }
-  }
-
-  close (desc);
-  return 0;
-}
-#endif /* !VMS */
-\f
-/* Return nonzero iff NAME matches MEM.
-   If TRUNCATED is nonzero, MEM may be truncated to
-   sizeof (struct ar_hdr.ar_name) - 1.  */
-
-int
-ar_name_equal (const char *name, const char *mem, int truncated)
-{
-  const char *p;
-
-  p = strrchr (name, '/');
-  if (p != 0)
-    name = p + 1;
-
-#ifndef VMS
-  if (truncated)
-    {
-#ifdef AIAMAG
-      /* TRUNCATED should never be set on this system.  */
-      abort ();
-#else
-      struct ar_hdr hdr;
-#if !defined (__hpux) && !defined (cray)
-      return strneq (name, mem, sizeof (hdr.ar_name) - 1);
-#else
-      return strneq (name, mem, sizeof (hdr.ar_name) - 2);
-#endif /* !__hpux && !cray */
-#endif /* !AIAMAG */
-    }
-
-  return !strcmp (name, mem);
-#else
-  /* VMS members do not have suffixes, but the filenames usually
-     have.
-     Do we need to strip VMS disk/directory format paths?
-
-     Most VMS compilers etc. by default are case insensitive
-     but produce uppercase external names, incl. module names.
-     However the VMS librarian (ar) and the linker by default
-     are case sensitive: they take what they get, usually
-     uppercase names. So for the non-default settings of the
-     compilers etc. there is a need to have a case sensitive
-     mode. */
-  {
-    int len;
-    len = strlen(mem);
-    int match;
-    char *dot;
-    if ((dot=strrchr(name,'.')))
-      match = (len == dot - name) && !strncasecmp(name, mem, len);
-    else
-      match = !strcasecmp (name, mem);
-    return match;
-  }
-#endif /* !VMS */
-}
-\f
-#ifndef VMS
-/* ARGSUSED */
-static long int
-ar_member_pos (int desc UNUSED, const char *mem, int truncated,
-               long int hdrpos, long int datapos UNUSED, long int size UNUSED,
-               long int date UNUSED, int uid UNUSED, int gid UNUSED,
-               unsigned int mode UNUSED, const void *name)
-{
-  if (!ar_name_equal (name, mem, truncated))
-    return 0;
-  return hdrpos;
-}
-
-/* Set date of member MEMNAME in archive ARNAME to current time.
-   Returns 0 if successful,
-   -1 if file ARNAME does not exist,
-   -2 if not a valid archive,
-   -3 if other random system call error (including file read-only),
-   1 if valid but member MEMNAME does not exist.  */
-
-int
-ar_member_touch (const char *arname, const char *memname)
-{
-  long int pos = ar_scan (arname, ar_member_pos, memname);
-  int fd;
-  struct ar_hdr ar_hdr;
-  off_t o;
-  int r;
-  unsigned int ui;
-  struct stat statbuf;
-
-  if (pos < 0)
-    return (int) pos;
-  if (!pos)
-    return 1;
-
-  EINTRLOOP (fd, open (arname, O_RDWR, 0666));
-  if (fd < 0)
-    return -3;
-  /* Read in this member's header */
-  EINTRLOOP (o, lseek (fd, pos, 0));
-  if (o < 0)
-    goto lose;
-  EINTRLOOP (r, read (fd, &ar_hdr, AR_HDR_SIZE));
-  if (r != AR_HDR_SIZE)
-    goto lose;
-  /* Write back the header, thus touching the archive file.  */
-  EINTRLOOP (o, lseek (fd, pos, 0));
-  if (o < 0)
-    goto lose;
-  EINTRLOOP (r, write (fd, &ar_hdr, AR_HDR_SIZE));
-  if (r != AR_HDR_SIZE)
-    goto lose;
-  /* The file's mtime is the time we we want.  */
-  EINTRLOOP (r, fstat (fd, &statbuf));
-  if (r < 0)
-    goto lose;
-#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG) || defined(WINDOWS32)
-  /* Advance member's time to that time */
-  for (ui = 0; ui < sizeof ar_hdr.ar_date; ui++)
-    ar_hdr.ar_date[ui] = ' ';
-  sprintf (TOCHAR (ar_hdr.ar_date), "%lu", (long unsigned) statbuf.st_mtime);
-#ifdef AIAMAG
-  ar_hdr.ar_date[strlen (ar_hdr.ar_date)] = ' ';
-#endif
-#else
-  ar_hdr.ar_date = statbuf.st_mtime;
-#endif
-  /* Write back this member's header */
-  EINTRLOOP (o, lseek (fd, pos, 0));
-  if (o < 0)
-    goto lose;
-  EINTRLOOP (r, write (fd, &ar_hdr, AR_HDR_SIZE));
-  if (r != AR_HDR_SIZE)
-    goto lose;
-  close (fd);
-  return 0;
-
- lose:
-  r = errno;
-  close (fd);
-  errno = r;
-  return -3;
-}
-#endif
-\f
-#ifdef TEST
-
-long int
-describe_member (int desc, const char *name, int truncated,
-                 long int hdrpos, long int datapos, long int size,
-                 long int date, int uid, int gid, unsigned int mode,
-                 const void *arg)
-{
-  extern char *ctime ();
-
-  printf (_("Member '%s'%s: %ld bytes at %ld (%ld).\n"),
-          name, truncated ? _(" (name might be truncated)") : "",
-          size, hdrpos, datapos);
-  printf (_("  Date %s"), ctime (&date));
-  printf (_("  uid = %d, gid = %d, mode = 0%o.\n"), uid, gid, mode);
-
-  return 0;
-}
-
-int
-main (int argc, char **argv)
-{
-  ar_scan (argv[1], describe_member, NULL);
-  return 0;
-}
-
-#endif  /* TEST.  */
-#endif  /* NO_ARCHIVES.  */
diff --git a/build-aux/compile b/build-aux/compile
new file mode 100755 (executable)
index 0000000..99e5052
--- /dev/null
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/config.guess b/build-aux/config.guess
new file mode 100755 (executable)
index 0000000..95b16c7
--- /dev/null
@@ -0,0 +1,1667 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2019 Free Software Foundation, Inc.
+
+timestamp='2019-12-21'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2019 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    # prevent multiple calls if $tmp is already set
+    test "$tmp" && return 0
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039
+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+       { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+       { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+       { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+       ,,)    echo "int x;" > "$dummy.c"
+              for driver in cc gcc c89 c99 ; do
+                  if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+                      CC_FOR_BUILD="$driver"
+                      break
+                  fi
+              done
+              if test x"$CC_FOR_BUILD" = x ; then
+                  CC_FOR_BUILD=no_compiler_found
+              fi
+              ;;
+       ,,*)   CC_FOR_BUILD=$CC ;;
+       ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "$UNAME_SYSTEM" in
+Linux|GNU|GNU/*)
+       # If the system lacks a compiler, then just pick glibc.
+       # We could probably try harder.
+       LIBC=gnu
+
+       set_cc_for_build
+       cat <<-EOF > "$dummy.c"
+       #include <features.h>
+       #if defined(__UCLIBC__)
+       LIBC=uclibc
+       #elif defined(__dietlibc__)
+       LIBC=dietlibc
+       #else
+       LIBC=gnu
+       #endif
+       EOF
+       eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
+
+       # If ldd exists, use it to detect musl libc.
+       if command -v ldd >/dev/null && \
+               ldd --version 2>&1 | grep -q ^musl
+       then
+           LIBC=musl
+       fi
+       ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+           "/sbin/$sysctl" 2>/dev/null || \
+           "/usr/sbin/$sysctl" 2>/dev/null || \
+           echo unknown)`
+       case "$UNAME_MACHINE_ARCH" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           sh5el) machine=sh5le-unknown ;;
+           earmv*)
+               arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+               endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+               machine="${arch}${endian}"-unknown
+               ;;
+           *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently (or will in the future) and ABI.
+       case "$UNAME_MACHINE_ARCH" in
+           earm*)
+               os=netbsdelf
+               ;;
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep -q __ELF__
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # Determine ABI tags.
+       case "$UNAME_MACHINE_ARCH" in
+           earm*)
+               expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+               abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "$UNAME_VERSION" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "$machine-${os}${release}${abi-}"
+       exit ;;
+    *:Bitrig:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+       echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
+       exit ;;
+    *:LibertyBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+       echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
+       exit ;;
+    *:MidnightBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
+       exit ;;
+    *:SolidBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
+       exit ;;
+    *:OS108:*:*)
+       echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
+       exit ;;
+    *:MirBSD:*:*)
+       echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
+       exit ;;
+    *:Sortix:*:*)
+       echo "$UNAME_MACHINE"-unknown-sortix
+       exit ;;
+    *:Twizzler:*:*)
+       echo "$UNAME_MACHINE"-unknown-twizzler
+       exit ;;
+    *:Redox:*:*)
+       echo "$UNAME_MACHINE"-unknown-redox
+       exit ;;
+    mips:OSF1:*.*)
+       echo mips-dec-osf1
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE=alpha ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE=alpha ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE=alpha ;;
+           "EV5 (21164)")
+               UNAME_MACHINE=alphaev5 ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE=alphaev56 ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE=alphapca56 ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE=alphapca57 ;;
+           "EV6 (21264)")
+               UNAME_MACHINE=alphaev6 ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE=alphaev67 ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE=alphaev68 ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE=alphaev68 ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE=alphaev68 ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE=alphaev69 ;;
+           "EV7 (21364)")
+               UNAME_MACHINE=alphaev7 ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE=alphaev79 ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
+       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+       exitcode=$?
+       trap '' 0
+       exit $exitcode ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo "$UNAME_MACHINE"-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo "$UNAME_MACHINE"-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+       echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix"$UNAME_RELEASE"
+       exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    s390x:SunOS:*:*)
+       echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+       exit ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+       exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+       echo i386-pc-auroraux"$UNAME_RELEASE"
+       exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+       set_cc_for_build
+       SUN_ARCH=i386
+       # If there is a compiler, see if it is configured for 64-bit objects.
+       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+       # This test works for both compilers.
+       if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+               (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+               grep IS_64BIT_ARCH >/dev/null
+           then
+               SUN_ARCH=x86_64
+           fi
+       fi
+       echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos"$UNAME_RELEASE"
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos"$UNAME_RELEASE"
+               ;;
+           sun4)
+               echo sparc-sun-sunos"$UNAME_RELEASE"
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos"$UNAME_RELEASE"
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint"$UNAME_RELEASE"
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint"$UNAME_RELEASE"
+       exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+       echo m68k-atari-mint"$UNAME_RELEASE"
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+       echo m68k-milan-mint"$UNAME_RELEASE"
+       exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+       echo m68k-hades-mint"$UNAME_RELEASE"
+       exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+       echo m68k-unknown-mint"$UNAME_RELEASE"
+       exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten"$UNAME_RELEASE"
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten"$UNAME_RELEASE"
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix"$UNAME_RELEASE"
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix"$UNAME_RELEASE"
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix"$UNAME_RELEASE"
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       set_cc_for_build
+       sed 's/^        //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+         dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos"$UNAME_RELEASE"
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+       # DG/UX returns AViiON for all architectures
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+       then
+           if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
+              [ "$TARGET_BINARY_INTERFACE"x = x ]
+           then
+               echo m88k-dg-dgux"$UNAME_RELEASE"
+           else
+               echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+           fi
+       else
+           echo i586-dg-dgux"$UNAME_RELEASE"
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+       fi
+       echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               set_cc_for_build
+               sed 's/^                //' << EOF > "$dummy.c"
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[4567])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/lslpp ] ; then
+               IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+                          awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+       else
+               IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+       fi
+       echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+       case "$UNAME_MACHINE" in
+           9000/31?)            HP_ARCH=m68000 ;;
+           9000/[34]??)         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                   case "$sc_cpu_version" in
+                     523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+                     528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+                     532)                      # CPU_PA_RISC2_0
+                       case "$sc_kernel_bits" in
+                         32) HP_ARCH=hppa2.0n ;;
+                         64) HP_ARCH=hppa2.0w ;;
+                         '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+                       esac ;;
+                   esac
+               fi
+               if [ "$HP_ARCH" = "" ]; then
+                   set_cc_for_build
+                   sed 's/^            //' << EOF > "$dummy.c"
+
+               #define _HPUX_SOURCE
+               #include <stdlib.h>
+               #include <unistd.h>
+
+               int main ()
+               {
+               #if defined(_SC_KERNEL_BITS)
+                   long bits = sysconf(_SC_KERNEL_BITS);
+               #endif
+                   long cpu  = sysconf (_SC_CPU_VERSION);
+
+                   switch (cpu)
+                       {
+                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+                       case CPU_PA_RISC2_0:
+               #if defined(_SC_KERNEL_BITS)
+                           switch (bits)
+                               {
+                               case 64: puts ("hppa2.0w"); break;
+                               case 32: puts ("hppa2.0n"); break;
+                               default: puts ("hppa2.0"); break;
+                               } break;
+               #else  /* !defined(_SC_KERNEL_BITS) */
+                           puts ("hppa2.0"); break;
+               #endif
+                       default: puts ("hppa1.0"); break;
+                       }
+                   exit (0);
+               }
+EOF
+                   (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ "$HP_ARCH" = hppa2.0w ]
+       then
+           set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep -q __LP64__
+           then
+               HP_ARCH=hppa2.0w
+           else
+               HP_ARCH=hppa64
+           fi
+       fi
+       echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux"$HPUX_REV"
+       exit ;;
+    3050*:HI-UX:*:*)
+       set_cc_for_build
+       sed 's/^        //' << EOF > "$dummy.c"
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo "$UNAME_MACHINE"-unknown-osf1mk
+       else
+           echo "$UNAME_MACHINE"-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+       exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+       exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+       exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+       exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+       FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+       FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    5000:UNIX_System_V:4.*:*)
+       FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+       FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi"$UNAME_RELEASE"
+       exit ;;
+    *:BSD/OS:*:*)
+       echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
+       exit ;;
+    arm:FreeBSD:*:*)
+       UNAME_PROCESSOR=`uname -p`
+       set_cc_for_build
+       if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_PCS_VFP
+       then
+           echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
+       else
+           echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
+       fi
+       exit ;;
+    *:FreeBSD:*:*)
+       UNAME_PROCESSOR=`/usr/bin/uname -p`
+       case "$UNAME_PROCESSOR" in
+           amd64)
+               UNAME_PROCESSOR=x86_64 ;;
+           i386)
+               UNAME_PROCESSOR=i586 ;;
+       esac
+       echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+       exit ;;
+    i*:CYGWIN*:*)
+       echo "$UNAME_MACHINE"-pc-cygwin
+       exit ;;
+    *:MINGW64*:*)
+       echo "$UNAME_MACHINE"-pc-mingw64
+       exit ;;
+    *:MINGW*:*)
+       echo "$UNAME_MACHINE"-pc-mingw32
+       exit ;;
+    *:MSYS*:*)
+       echo "$UNAME_MACHINE"-pc-msys
+       exit ;;
+    i*:PW*:*)
+       echo "$UNAME_MACHINE"-pc-pw32
+       exit ;;
+    *:Interix*:*)
+       case "$UNAME_MACHINE" in
+           x86)
+               echo i586-pc-interix"$UNAME_RELEASE"
+               exit ;;
+           authenticamd | genuineintel | EM64T)
+               echo x86_64-unknown-interix"$UNAME_RELEASE"
+               exit ;;
+           IA64)
+               echo ia64-unknown-interix"$UNAME_RELEASE"
+               exit ;;
+       esac ;;
+    i*:UWIN*:*)
+       echo "$UNAME_MACHINE"-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-pc-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
+       exit ;;
+    *:Minix:*:*)
+       echo "$UNAME_MACHINE"-unknown-minix
+       exit ;;
+    aarch64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    aarch64_be:Linux:*:*)
+       UNAME_MACHINE=aarch64_be
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+       esac
+       objdump --private-headers /bin/sh | grep -q ld.so.1
+       if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    arm*:Linux:*:*)
+       set_cc_for_build
+       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+           | grep -q __ARM_EABI__
+       then
+           echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       else
+           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+               | grep -q __ARM_PCS_VFP
+           then
+               echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+           else
+               echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+           fi
+       fi
+       exit ;;
+    avr32*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    cris:Linux:*:*)
+       echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+       exit ;;
+    crisv32:Linux:*:*)
+       echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+       exit ;;
+    e2k:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    frv:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    hexagon:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    i*86:Linux:*:*)
+       echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+       exit ;;
+    ia64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    k1om:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    m32r*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    m68*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+       set_cc_for_build
+       IS_GLIBC=0
+       test x"${LIBC}" = xgnu && IS_GLIBC=1
+       sed 's/^        //' << EOF > "$dummy.c"
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #undef mips64
+       #undef mips64el
+       #if ${IS_GLIBC} && defined(_ABI64)
+       LIBCABI=gnuabi64
+       #else
+       #if ${IS_GLIBC} && defined(_ABIN32)
+       LIBCABI=gnuabin32
+       #else
+       LIBCABI=${LIBC}
+       #endif
+       #endif
+
+       #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+       CPU=mipsisa64r6
+       #else
+       #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+       CPU=mipsisa32r6
+       #else
+       #if defined(__mips64)
+       CPU=mips64
+       #else
+       CPU=mips
+       #endif
+       #endif
+       #endif
+
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       MIPS_ENDIAN=el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       MIPS_ENDIAN=
+       #else
+       MIPS_ENDIAN=
+       #endif
+       #endif
+EOF
+       eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
+       test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+       ;;
+    mips64el:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    openrisc*:Linux:*:*)
+       echo or1k-unknown-linux-"$LIBC"
+       exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    padre:Linux:*:*)
+       echo sparc-unknown-linux-"$LIBC"
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-"$LIBC"
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
+         PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
+         *)    echo hppa-unknown-linux-"$LIBC" ;;
+       esac
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-"$LIBC"
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-"$LIBC"
+       exit ;;
+    ppc64le:Linux:*:*)
+       echo powerpc64le-unknown-linux-"$LIBC"
+       exit ;;
+    ppcle:Linux:*:*)
+       echo powerpcle-unknown-linux-"$LIBC"
+       exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
+       exit ;;
+    sh64*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    sh*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    tile*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    vax:Linux:*:*)
+       echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
+       exit ;;
+    x86_64:Linux:*:*)
+       echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+       exit ;;
+    xtensa*:Linux:*:*)
+       echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+       exit ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+       # Unixware is an offshoot of SVR4, but it has its own version
+       # number series starting with 2...
+       # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+       # Use sysv4.2uw... so that sysv4* matches it.
+       echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo "$UNAME_MACHINE"-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo "$UNAME_MACHINE"-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo "$UNAME_MACHINE"-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo "$UNAME_MACHINE"-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+       echo i386-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    i*86:*DOS:*:*)
+       echo "$UNAME_MACHINE"-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:*)
+       UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+       else
+               echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+       else
+               echo "$UNAME_MACHINE"-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+       # uname -m prints for DJGPP always 'pc', but it prints nothing about
+       # the processor, so we play safe by assuming i586.
+       # Note: whatever this is, it MUST be the same as what config.sub
+       # prints for the "djgpp" host, or else GDB configure will decide that
+       # this is a cross-build.
+       echo i586-pc-msdosdjgpp
+       exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+       OS_REL='.3'
+       test -r /etc/.relid \
+           && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+           && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+           && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+           && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+       echo powerpc-unknown-lynxos"$UNAME_RELEASE"
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv"$UNAME_RELEASE"
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo "$UNAME_MACHINE"-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                       # says <Richard.M.Bartel@ccMail.Census.GOV>
+       echo i586-unisys-sysv4
+       exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo "$UNAME_MACHINE"-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux"$UNAME_RELEASE"
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv"$UNAME_RELEASE"
+       else
+               echo mips-unknown-sysv"$UNAME_RELEASE"
+       fi
+       exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
+       echo i586-pc-haiku
+       exit ;;
+    x86_64:Haiku:*:*)
+       echo x86_64-unknown-haiku
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-7:SUPER-UX:*:*)
+       echo sx7-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-8:SUPER-UX:*:*)
+       echo sx8-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-8R:SUPER-UX:*:*)
+       echo sx8r-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    SX-ACE:SUPER-UX:*:*)
+       echo sxace-nec-superux"$UNAME_RELEASE"
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody"$UNAME_RELEASE"
+       exit ;;
+    *:Rhapsody:*:*)
+       echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=`uname -p`
+       case $UNAME_PROCESSOR in
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       if command -v xcode-select > /dev/null 2> /dev/null && \
+               ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+           # Avoid executing cc if there is no toolchain installed as
+           # cc will be a stub that puts up a graphical alert
+           # prompting the user to install developer tools.
+           CC_FOR_BUILD=no_compiler_found
+       else
+           set_cc_for_build
+       fi
+       if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+           if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+                  (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                  grep IS_64BIT_ARCH >/dev/null
+           then
+               case $UNAME_PROCESSOR in
+                   i386) UNAME_PROCESSOR=x86_64 ;;
+                   powerpc) UNAME_PROCESSOR=powerpc64 ;;
+               esac
+           fi
+           # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+           if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+                  (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                  grep IS_PPC >/dev/null
+           then
+               UNAME_PROCESSOR=powerpc
+           fi
+       elif test "$UNAME_PROCESSOR" = i386 ; then
+           # uname -m returns i386 or x86_64
+           UNAME_PROCESSOR=$UNAME_MACHINE
+       fi
+       echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = x86; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+       echo neo-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+       echo nsv-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+       echo nsx-tandem-nsk"$UNAME_RELEASE"
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       # shellcheck disable=SC2154
+       if test "$cputype" = 386; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo "$UNAME_MACHINE"-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+       echo mips-sei-seiux"$UNAME_RELEASE"
+       exit ;;
+    *:DragonFly:*:*)
+       echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       case "$UNAME_MACHINE" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
+       exit ;;
+    i*86:rdos:*:*)
+       echo "$UNAME_MACHINE"-pc-rdos
+       exit ;;
+    i*86:AROS:*:*)
+       echo "$UNAME_MACHINE"-pc-aros
+       exit ;;
+    x86_64:VMkernel:*:*)
+       echo "$UNAME_MACHINE"-unknown-esx
+       exit ;;
+    amd64:Isilon\ OneFS:*:*)
+       echo x86_64-unknown-onefs
+       exit ;;
+    *:Unleashed:*:*)
+       echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
+       exit ;;
+esac
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname un;
+  uname (&un);
+  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname *un;
+  uname (&un);
+  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+    mips:Linux | mips64:Linux)
+       # If we got here on MIPS GNU/Linux, output extra information.
+       cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+       ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+and
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/config.rpath b/build-aux/config.rpath
new file mode 100755 (executable)
index 0000000..b625621
--- /dev/null
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2014 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   This file is free software; the Free Software Foundation gives
+#   unlimited permission to copy and/or distribute it, with or without
+#   modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+        ecc*)
+          wl='-Wl,'
+          ;;
+        icc* | ifort*)
+          wl='-Wl,'
+          ;;
+        lf95*)
+          wl='-Wl,'
+          ;;
+        nagfor*)
+          wl='-Wl,-Wl,,'
+          ;;
+        pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+          wl='-Wl,'
+          ;;
+        ccc*)
+          wl='-Wl,'
+          ;;
+        xl* | bgxl* | bgf* | mpixl*)
+          wl='-Wl,'
+          ;;
+        como)
+          wl='-lopt='
+          ;;
+        *)
+          case `$CC -V 2>&1 | sed 5q` in
+            *Sun\ F* | *Sun*Fortran*)
+              wl=
+              ;;
+            *Sun\ C*)
+              wl='-Wl,'
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+    newsos6)
+      ;;
+    *nto* | *qnx*)
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    rdos*)
+      ;;
+    solaris*)
+      case $cc_basename in
+        f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+          wl='-Qoption ld '
+          ;;
+        *)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      wl='-Wl,'
+      ;;
+    unicos*)
+      wl='-Wl,'
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # Set some defaults for GNU ld with shared library support. These
+  # are reset later if shared libraries are not supported. Putting them
+  # here allows them to be overridden if necessary.
+  # Unlike libtool, we use -rpath here, not --rpath, since the documented
+  # option of GNU ld is called -rpath, not --rpath.
+  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  case "$host_os" in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      case "$host_cpu" in
+        powerpc)
+          ;;
+        m68k)
+          hardcode_libdir_flag_spec='-L$libdir'
+          hardcode_minus_L=yes
+          ;;
+      esac
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    haiku*)
+      ;;
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      ;;
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+          ld_shlibs=no
+          ;;
+        *)
+          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+          else
+            ld_shlibs=no
+          fi
+          ;;
+      esac
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = no; then
+    hardcode_libdir_flag_spec=
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+          ;;
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            :
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+          ;;
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      case "$host_cpu" in
+        powerpc)
+          ;;
+        m68k)
+          hardcode_libdir_flag_spec='-L$libdir'
+          hardcode_minus_L=yes
+          ;;
+      esac
+      ;;
+    bsdi[45]*)
+      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      hardcode_direct=no
+      if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd2.[01]*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd* | dragonfly*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        hardcode_direct=yes
+        # hardcode_minus_L: Not really in the search PATH,
+        # but as the default location of the library.
+        hardcode_minus_L=yes
+      fi
+      ;;
+    hpux11*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct=no
+            ;;
+          *)
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    *nto* | *qnx*)
+      ;;
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+        hardcode_direct=yes
+        if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+          hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        else
+          case "$host_os" in
+            openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+              hardcode_libdir_flag_spec='-R$libdir'
+              ;;
+            *)
+              hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+              ;;
+          esac
+        fi
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      ;;
+    sysv5* | sco3.2v5* | sco5v6*)
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec=      # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    library_names_spec='$libname.a'
+    ;;
+  aix[4-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  amigaos*)
+    case "$host_cpu" in
+      powerpc*)
+        library_names_spec='$libname$shrext' ;;
+      m68k)
+        library_names_spec='$libname.a' ;;
+    esac
+    ;;
+  beos*)
+    library_names_spec='$libname$shrext'
+    ;;
+  bsdi[45]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  cygwin* | mingw* | pw32* | cegcc*)
+    shrext=.dll
+    library_names_spec='$libname.dll.a $libname.lib'
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    library_names_spec='$libname$shrext'
+    ;;
+  dgux*)
+    library_names_spec='$libname$shrext'
+    ;;
+  freebsd[23].*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  freebsd* | dragonfly*)
+    library_names_spec='$libname$shrext'
+    ;;
+  gnu*)
+    library_names_spec='$libname$shrext'
+    ;;
+  haiku*)
+    library_names_spec='$libname$shrext'
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case $host_cpu in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    library_names_spec='$libname$shrext'
+    ;;
+  interix[3-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  irix5* | irix6* | nonstopux*)
+    library_names_spec='$libname$shrext'
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  knetbsd*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  netbsd*)
+    library_names_spec='$libname$shrext'
+    ;;
+  newsos6)
+    library_names_spec='$libname$shrext'
+    ;;
+  *nto* | *qnx*)
+    library_names_spec='$libname$shrext'
+    ;;
+  openbsd*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    library_names_spec='$libname.a'
+    ;;
+  osf3* | osf4* | osf5*)
+    library_names_spec='$libname$shrext'
+    ;;
+  rdos*)
+    ;;
+  solaris*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sunos4*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  sysv4 | sysv4.3*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv4*MP*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+    library_names_spec='$libname$shrext'
+    ;;
+  tpf*)
+    library_names_spec='$libname$shrext'
+    ;;
+  uts4*)
+    library_names_spec='$libname$shrext'
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/build-aux/config.sub b/build-aux/config.sub
new file mode 100755 (executable)
index 0000000..0f2234c
--- /dev/null
@@ -0,0 +1,1793 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2019 Free Software Foundation, Inc.
+
+timestamp='2019-06-30'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2019 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo "$1"
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+
+# Separate into logical components for further validation
+case $1 in
+       *-*-*-*-*)
+               echo Invalid configuration \`"$1"\': more than four components >&2
+               exit 1
+               ;;
+       *-*-*-*)
+               basic_machine=$field1-$field2
+               os=$field3-$field4
+               ;;
+       *-*-*)
+               # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+               # parts
+               maybe_os=$field2-$field3
+               case $maybe_os in
+                       nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
+                       | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+                       | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+                       | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+                       | storm-chaos* | os2-emx* | rtmk-nova*)
+                               basic_machine=$field1
+                               os=$maybe_os
+                               ;;
+                       android-linux)
+                               basic_machine=$field1-unknown
+                               os=linux-android
+                               ;;
+                       *)
+                               basic_machine=$field1-$field2
+                               os=$field3
+                               ;;
+               esac
+               ;;
+       *-*)
+               # A lone config we happen to match not fitting any pattern
+               case $field1-$field2 in
+                       decstation-3100)
+                               basic_machine=mips-dec
+                               os=
+                               ;;
+                       *-*)
+                               # Second component is usually, but not always the OS
+                               case $field2 in
+                                       # Prevent following clause from handling this valid os
+                                       sun*os*)
+                                               basic_machine=$field1
+                                               os=$field2
+                                               ;;
+                                       # Manufacturers
+                                       dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+                                       | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+                                       | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+                                       | convergent* | ncr* | news | 32* | 3600* | 3100* \
+                                       | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+                                       | ultra | tti* | harris | dolphin | highlevel | gould \
+                                       | cbm | ns | masscomp | apple | axis | knuth | cray \
+                                       | microblaze* | sim | cisco \
+                                       | oki | wec | wrs | winbond)
+                                               basic_machine=$field1-$field2
+                                               os=
+                                               ;;
+                                       *)
+                                               basic_machine=$field1
+                                               os=$field2
+                                               ;;
+                               esac
+                       ;;
+               esac
+               ;;
+       *)
+               # Convert single-component short-hands not valid as part of
+               # multi-component configurations.
+               case $field1 in
+                       386bsd)
+                               basic_machine=i386-pc
+                               os=bsd
+                               ;;
+                       a29khif)
+                               basic_machine=a29k-amd
+                               os=udi
+                               ;;
+                       adobe68k)
+                               basic_machine=m68010-adobe
+                               os=scout
+                               ;;
+                       alliant)
+                               basic_machine=fx80-alliant
+                               os=
+                               ;;
+                       altos | altos3068)
+                               basic_machine=m68k-altos
+                               os=
+                               ;;
+                       am29k)
+                               basic_machine=a29k-none
+                               os=bsd
+                               ;;
+                       amdahl)
+                               basic_machine=580-amdahl
+                               os=sysv
+                               ;;
+                       amiga)
+                               basic_machine=m68k-unknown
+                               os=
+                               ;;
+                       amigaos | amigados)
+                               basic_machine=m68k-unknown
+                               os=amigaos
+                               ;;
+                       amigaunix | amix)
+                               basic_machine=m68k-unknown
+                               os=sysv4
+                               ;;
+                       apollo68)
+                               basic_machine=m68k-apollo
+                               os=sysv
+                               ;;
+                       apollo68bsd)
+                               basic_machine=m68k-apollo
+                               os=bsd
+                               ;;
+                       aros)
+                               basic_machine=i386-pc
+                               os=aros
+                               ;;
+                       aux)
+                               basic_machine=m68k-apple
+                               os=aux
+                               ;;
+                       balance)
+                               basic_machine=ns32k-sequent
+                               os=dynix
+                               ;;
+                       blackfin)
+                               basic_machine=bfin-unknown
+                               os=linux
+                               ;;
+                       cegcc)
+                               basic_machine=arm-unknown
+                               os=cegcc
+                               ;;
+                       convex-c1)
+                               basic_machine=c1-convex
+                               os=bsd
+                               ;;
+                       convex-c2)
+                               basic_machine=c2-convex
+                               os=bsd
+                               ;;
+                       convex-c32)
+                               basic_machine=c32-convex
+                               os=bsd
+                               ;;
+                       convex-c34)
+                               basic_machine=c34-convex
+                               os=bsd
+                               ;;
+                       convex-c38)
+                               basic_machine=c38-convex
+                               os=bsd
+                               ;;
+                       cray)
+                               basic_machine=j90-cray
+                               os=unicos
+                               ;;
+                       crds | unos)
+                               basic_machine=m68k-crds
+                               os=
+                               ;;
+                       da30)
+                               basic_machine=m68k-da30
+                               os=
+                               ;;
+                       decstation | pmax | pmin | dec3100 | decstatn)
+                               basic_machine=mips-dec
+                               os=
+                               ;;
+                       delta88)
+                               basic_machine=m88k-motorola
+                               os=sysv3
+                               ;;
+                       dicos)
+                               basic_machine=i686-pc
+                               os=dicos
+                               ;;
+                       djgpp)
+                               basic_machine=i586-pc
+                               os=msdosdjgpp
+                               ;;
+                       ebmon29k)
+                               basic_machine=a29k-amd
+                               os=ebmon
+                               ;;
+                       es1800 | OSE68k | ose68k | ose | OSE)
+                               basic_machine=m68k-ericsson
+                               os=ose
+                               ;;
+                       gmicro)
+                               basic_machine=tron-gmicro
+                               os=sysv
+                               ;;
+                       go32)
+                               basic_machine=i386-pc
+                               os=go32
+                               ;;
+                       h8300hms)
+                               basic_machine=h8300-hitachi
+                               os=hms
+                               ;;
+                       h8300xray)
+                               basic_machine=h8300-hitachi
+                               os=xray
+                               ;;
+                       h8500hms)
+                               basic_machine=h8500-hitachi
+                               os=hms
+                               ;;
+                       harris)
+                               basic_machine=m88k-harris
+                               os=sysv3
+                               ;;
+                       hp300 | hp300hpux)
+                               basic_machine=m68k-hp
+                               os=hpux
+                               ;;
+                       hp300bsd)
+                               basic_machine=m68k-hp
+                               os=bsd
+                               ;;
+                       hppaosf)
+                               basic_machine=hppa1.1-hp
+                               os=osf
+                               ;;
+                       hppro)
+                               basic_machine=hppa1.1-hp
+                               os=proelf
+                               ;;
+                       i386mach)
+                               basic_machine=i386-mach
+                               os=mach
+                               ;;
+                       isi68 | isi)
+                               basic_machine=m68k-isi
+                               os=sysv
+                               ;;
+                       m68knommu)
+                               basic_machine=m68k-unknown
+                               os=linux
+                               ;;
+                       magnum | m3230)
+                               basic_machine=mips-mips
+                               os=sysv
+                               ;;
+                       merlin)
+                               basic_machine=ns32k-utek
+                               os=sysv
+                               ;;
+                       mingw64)
+                               basic_machine=x86_64-pc
+                               os=mingw64
+                               ;;
+                       mingw32)
+                               basic_machine=i686-pc
+                               os=mingw32
+                               ;;
+                       mingw32ce)
+                               basic_machine=arm-unknown
+                               os=mingw32ce
+                               ;;
+                       monitor)
+                               basic_machine=m68k-rom68k
+                               os=coff
+                               ;;
+                       morphos)
+                               basic_machine=powerpc-unknown
+                               os=morphos
+                               ;;
+                       moxiebox)
+                               basic_machine=moxie-unknown
+                               os=moxiebox
+                               ;;
+                       msdos)
+                               basic_machine=i386-pc
+                               os=msdos
+                               ;;
+                       msys)
+                               basic_machine=i686-pc
+                               os=msys
+                               ;;
+                       mvs)
+                               basic_machine=i370-ibm
+                               os=mvs
+                               ;;
+                       nacl)
+                               basic_machine=le32-unknown
+                               os=nacl
+                               ;;
+                       ncr3000)
+                               basic_machine=i486-ncr
+                               os=sysv4
+                               ;;
+                       netbsd386)
+                               basic_machine=i386-pc
+                               os=netbsd
+                               ;;
+                       netwinder)
+                               basic_machine=armv4l-rebel
+                               os=linux
+                               ;;
+                       news | news700 | news800 | news900)
+                               basic_machine=m68k-sony
+                               os=newsos
+                               ;;
+                       news1000)
+                               basic_machine=m68030-sony
+                               os=newsos
+                               ;;
+                       necv70)
+                               basic_machine=v70-nec
+                               os=sysv
+                               ;;
+                       nh3000)
+                               basic_machine=m68k-harris
+                               os=cxux
+                               ;;
+                       nh[45]000)
+                               basic_machine=m88k-harris
+                               os=cxux
+                               ;;
+                       nindy960)
+                               basic_machine=i960-intel
+                               os=nindy
+                               ;;
+                       mon960)
+                               basic_machine=i960-intel
+                               os=mon960
+                               ;;
+                       nonstopux)
+                               basic_machine=mips-compaq
+                               os=nonstopux
+                               ;;
+                       os400)
+                               basic_machine=powerpc-ibm
+                               os=os400
+                               ;;
+                       OSE68000 | ose68000)
+                               basic_machine=m68000-ericsson
+                               os=ose
+                               ;;
+                       os68k)
+                               basic_machine=m68k-none
+                               os=os68k
+                               ;;
+                       paragon)
+                               basic_machine=i860-intel
+                               os=osf
+                               ;;
+                       parisc)
+                               basic_machine=hppa-unknown
+                               os=linux
+                               ;;
+                       pw32)
+                               basic_machine=i586-unknown
+                               os=pw32
+                               ;;
+                       rdos | rdos64)
+                               basic_machine=x86_64-pc
+                               os=rdos
+                               ;;
+                       rdos32)
+                               basic_machine=i386-pc
+                               os=rdos
+                               ;;
+                       rom68k)
+                               basic_machine=m68k-rom68k
+                               os=coff
+                               ;;
+                       sa29200)
+                               basic_machine=a29k-amd
+                               os=udi
+                               ;;
+                       sei)
+                               basic_machine=mips-sei
+                               os=seiux
+                               ;;
+                       sequent)
+                               basic_machine=i386-sequent
+                               os=
+                               ;;
+                       sps7)
+                               basic_machine=m68k-bull
+                               os=sysv2
+                               ;;
+                       st2000)
+                               basic_machine=m68k-tandem
+                               os=
+                               ;;
+                       stratus)
+                               basic_machine=i860-stratus
+                               os=sysv4
+                               ;;
+                       sun2)
+                               basic_machine=m68000-sun
+                               os=
+                               ;;
+                       sun2os3)
+                               basic_machine=m68000-sun
+                               os=sunos3
+                               ;;
+                       sun2os4)
+                               basic_machine=m68000-sun
+                               os=sunos4
+                               ;;
+                       sun3)
+                               basic_machine=m68k-sun
+                               os=
+                               ;;
+                       sun3os3)
+                               basic_machine=m68k-sun
+                               os=sunos3
+                               ;;
+                       sun3os4)
+                               basic_machine=m68k-sun
+                               os=sunos4
+                               ;;
+                       sun4)
+                               basic_machine=sparc-sun
+                               os=
+                               ;;
+                       sun4os3)
+                               basic_machine=sparc-sun
+                               os=sunos3
+                               ;;
+                       sun4os4)
+                               basic_machine=sparc-sun
+                               os=sunos4
+                               ;;
+                       sun4sol2)
+                               basic_machine=sparc-sun
+                               os=solaris2
+                               ;;
+                       sun386 | sun386i | roadrunner)
+                               basic_machine=i386-sun
+                               os=
+                               ;;
+                       sv1)
+                               basic_machine=sv1-cray
+                               os=unicos
+                               ;;
+                       symmetry)
+                               basic_machine=i386-sequent
+                               os=dynix
+                               ;;
+                       t3e)
+                               basic_machine=alphaev5-cray
+                               os=unicos
+                               ;;
+                       t90)
+                               basic_machine=t90-cray
+                               os=unicos
+                               ;;
+                       toad1)
+                               basic_machine=pdp10-xkl
+                               os=tops20
+                               ;;
+                       tpf)
+                               basic_machine=s390x-ibm
+                               os=tpf
+                               ;;
+                       udi29k)
+                               basic_machine=a29k-amd
+                               os=udi
+                               ;;
+                       ultra3)
+                               basic_machine=a29k-nyu
+                               os=sym1
+                               ;;
+                       v810 | necv810)
+                               basic_machine=v810-nec
+                               os=none
+                               ;;
+                       vaxv)
+                               basic_machine=vax-dec
+                               os=sysv
+                               ;;
+                       vms)
+                               basic_machine=vax-dec
+                               os=vms
+                               ;;
+                       vsta)
+                               basic_machine=i386-pc
+                               os=vsta
+                               ;;
+                       vxworks960)
+                               basic_machine=i960-wrs
+                               os=vxworks
+                               ;;
+                       vxworks68)
+                               basic_machine=m68k-wrs
+                               os=vxworks
+                               ;;
+                       vxworks29k)
+                               basic_machine=a29k-wrs
+                               os=vxworks
+                               ;;
+                       xbox)
+                               basic_machine=i686-pc
+                               os=mingw32
+                               ;;
+                       ymp)
+                               basic_machine=ymp-cray
+                               os=unicos
+                               ;;
+                       *)
+                               basic_machine=$1
+                               os=
+                               ;;
+               esac
+               ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+       # Here we handle the default manufacturer of certain CPU types.  It is in
+       # some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               cpu=hppa1.1
+               vendor=winbond
+               ;;
+       op50n)
+               cpu=hppa1.1
+               vendor=oki
+               ;;
+       op60c)
+               cpu=hppa1.1
+               vendor=oki
+               ;;
+       ibm*)
+               cpu=i370
+               vendor=ibm
+               ;;
+       orion105)
+               cpu=clipper
+               vendor=highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               cpu=m68k
+               vendor=apple
+               ;;
+       pmac | pmac-mpw)
+               cpu=powerpc
+               vendor=apple
+               ;;
+
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               cpu=m68000
+               vendor=att
+               ;;
+       3b*)
+               cpu=we32k
+               vendor=att
+               ;;
+       bluegene*)
+               cpu=powerpc
+               vendor=ibm
+               os=cnk
+               ;;
+       decsystem10* | dec10*)
+               cpu=pdp10
+               vendor=dec
+               os=tops10
+               ;;
+       decsystem20* | dec20*)
+               cpu=pdp10
+               vendor=dec
+               os=tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               cpu=m68k
+               vendor=motorola
+               ;;
+       dpx2*)
+               cpu=m68k
+               vendor=bull
+               os=sysv3
+               ;;
+       encore | umax | mmax)
+               cpu=ns32k
+               vendor=encore
+               ;;
+       elxsi)
+               cpu=elxsi
+               vendor=elxsi
+               os=${os:-bsd}
+               ;;
+       fx2800)
+               cpu=i860
+               vendor=alliant
+               ;;
+       genix)
+               cpu=ns32k
+               vendor=ns
+               ;;
+       h3050r* | hiux*)
+               cpu=hppa1.1
+               vendor=hitachi
+               os=hiuxwe2
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               cpu=hppa1.0
+               vendor=hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               cpu=m68000
+               vendor=hp
+               ;;
+       hp9k3[2-9][0-9])
+               cpu=m68k
+               vendor=hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               cpu=hppa1.0
+               vendor=hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               cpu=hppa1.1
+               vendor=hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               cpu=hppa1.0
+               vendor=hp
+               ;;
+       i*86v32)
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=sysv32
+               ;;
+       i*86v4*)
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=sysv4
+               ;;
+       i*86v)
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=sysv
+               ;;
+       i*86sol2)
+               cpu=`echo "$1" | sed -e 's/86.*/86/'`
+               vendor=pc
+               os=solaris2
+               ;;
+       j90 | j90-cray)
+               cpu=j90
+               vendor=cray
+               os=${os:-unicos}
+               ;;
+       iris | iris4d)
+               cpu=mips
+               vendor=sgi
+               case $os in
+                   irix*)
+                       ;;
+                   *)
+                       os=irix4
+                       ;;
+               esac
+               ;;
+       miniframe)
+               cpu=m68000
+               vendor=convergent
+               ;;
+       *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               cpu=m68k
+               vendor=atari
+               os=mint
+               ;;
+       news-3600 | risc-news)
+               cpu=mips
+               vendor=sony
+               os=newsos
+               ;;
+       next | m*-next)
+               cpu=m68k
+               vendor=next
+               case $os in
+                   openstep*)
+                       ;;
+                   nextstep*)
+                       ;;
+                   ns2*)
+                     os=nextstep2
+                       ;;
+                   *)
+                     os=nextstep3
+                       ;;
+               esac
+               ;;
+       np1)
+               cpu=np1
+               vendor=gould
+               ;;
+       op50n-* | op60c-*)
+               cpu=hppa1.1
+               vendor=oki
+               os=proelf
+               ;;
+       pa-hitachi)
+               cpu=hppa1.1
+               vendor=hitachi
+               os=hiuxwe2
+               ;;
+       pbd)
+               cpu=sparc
+               vendor=tti
+               ;;
+       pbb)
+               cpu=m68k
+               vendor=tti
+               ;;
+       pc532)
+               cpu=ns32k
+               vendor=pc532
+               ;;
+       pn)
+               cpu=pn
+               vendor=gould
+               ;;
+       power)
+               cpu=power
+               vendor=ibm
+               ;;
+       ps2)
+               cpu=i386
+               vendor=ibm
+               ;;
+       rm[46]00)
+               cpu=mips
+               vendor=siemens
+               ;;
+       rtpc | rtpc-*)
+               cpu=romp
+               vendor=ibm
+               ;;
+       sde)
+               cpu=mipsisa32
+               vendor=sde
+               os=${os:-elf}
+               ;;
+       simso-wrs)
+               cpu=sparclite
+               vendor=wrs
+               os=vxworks
+               ;;
+       tower | tower-32)
+               cpu=m68k
+               vendor=ncr
+               ;;
+       vpp*|vx|vx-*)
+               cpu=f301
+               vendor=fujitsu
+               ;;
+       w65)
+               cpu=w65
+               vendor=wdc
+               ;;
+       w89k-*)
+               cpu=hppa1.1
+               vendor=winbond
+               os=proelf
+               ;;
+       none)
+               cpu=none
+               vendor=none
+               ;;
+       leon|leon[3-9])
+               cpu=sparc
+               vendor=$basic_machine
+               ;;
+       leon-*|leon[3-9]-*)
+               cpu=sparc
+               vendor=`echo "$basic_machine" | sed 's/-.*//'`
+               ;;
+
+       *-*)
+               # shellcheck disable=SC2162
+               IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+               cpu=$basic_machine
+               vendor=pc
+               ;;
+       # These rules are duplicated from below for sake of the special case above;
+       # i.e. things that normalized to x86 arches should also default to "pc"
+       pc98)
+               cpu=i386
+               vendor=pc
+               ;;
+       x64 | amd64)
+               cpu=x86_64
+               vendor=pc
+               ;;
+       # Recognize the basic CPU types without company name.
+       *)
+               cpu=$basic_machine
+               vendor=unknown
+               ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+       # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+       # some cases the only manufacturer, in others, it is the most popular.
+       craynv-unknown)
+               vendor=cray
+               os=${os:-unicosmp}
+               ;;
+       c90-unknown | c90-cray)
+               vendor=cray
+               os=${os:-unicos}
+               ;;
+       fx80-unknown)
+               vendor=alliant
+               ;;
+       romp-unknown)
+               vendor=ibm
+               ;;
+       mmix-unknown)
+               vendor=knuth
+               ;;
+       microblaze-unknown | microblazeel-unknown)
+               vendor=xilinx
+               ;;
+       rs6000-unknown)
+               vendor=ibm
+               ;;
+       vax-unknown)
+               vendor=dec
+               ;;
+       pdp11-unknown)
+               vendor=dec
+               ;;
+       we32k-unknown)
+               vendor=att
+               ;;
+       cydra-unknown)
+               vendor=cydrome
+               ;;
+       i370-ibm*)
+               vendor=ibm
+               ;;
+       orion-unknown)
+               vendor=highlevel
+               ;;
+       xps-unknown | xps100-unknown)
+               cpu=xps100
+               vendor=honeywell
+               ;;
+
+       # Here we normalize CPU types with a missing or matching vendor
+       dpx20-unknown | dpx20-bull)
+               cpu=rs6000
+               vendor=bull
+               os=${os:-bosx}
+               ;;
+
+       # Here we normalize CPU types irrespective of the vendor
+       amd64-*)
+               cpu=x86_64
+               ;;
+       blackfin-*)
+               cpu=bfin
+               os=linux
+               ;;
+       c54x-*)
+               cpu=tic54x
+               ;;
+       c55x-*)
+               cpu=tic55x
+               ;;
+       c6x-*)
+               cpu=tic6x
+               ;;
+       e500v[12]-*)
+               cpu=powerpc
+               os=$os"spe"
+               ;;
+       mips3*-*)
+               cpu=mips64
+               ;;
+       ms1-*)
+               cpu=mt
+               ;;
+       m68knommu-*)
+               cpu=m68k
+               os=linux
+               ;;
+       m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+               cpu=s12z
+               ;;
+       openrisc-*)
+               cpu=or32
+               ;;
+       parisc-*)
+               cpu=hppa
+               os=linux
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               cpu=i586
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+               cpu=i686
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               cpu=i686
+               ;;
+       pentium4-*)
+               cpu=i786
+               ;;
+       pc98-*)
+               cpu=i386
+               ;;
+       ppc-* | ppcbe-*)
+               cpu=powerpc
+               ;;
+       ppcle-* | powerpclittle-*)
+               cpu=powerpcle
+               ;;
+       ppc64-*)
+               cpu=powerpc64
+               ;;
+       ppc64le-* | powerpc64little-*)
+               cpu=powerpc64le
+               ;;
+       sb1-*)
+               cpu=mipsisa64sb1
+               ;;
+       sb1el-*)
+               cpu=mipsisa64sb1el
+               ;;
+       sh5e[lb]-*)
+               cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+               ;;
+       spur-*)
+               cpu=spur
+               ;;
+       strongarm-* | thumb-*)
+               cpu=arm
+               ;;
+       tx39-*)
+               cpu=mipstx39
+               ;;
+       tx39el-*)
+               cpu=mipstx39el
+               ;;
+       x64-*)
+               cpu=x86_64
+               ;;
+       xscale-* | xscalee[bl]-*)
+               cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+               ;;
+
+       # Recognize the canonical CPU Types that limit and/or modify the
+       # company names they are paired with.
+       cr16-*)
+               os=${os:-elf}
+               ;;
+       crisv32-* | etraxfs*-*)
+               cpu=crisv32
+               vendor=axis
+               ;;
+       cris-* | etrax*-*)
+               cpu=cris
+               vendor=axis
+               ;;
+       crx-*)
+               os=${os:-elf}
+               ;;
+       neo-tandem)
+               cpu=neo
+               vendor=tandem
+               ;;
+       nse-tandem)
+               cpu=nse
+               vendor=tandem
+               ;;
+       nsr-tandem)
+               cpu=nsr
+               vendor=tandem
+               ;;
+       nsv-tandem)
+               cpu=nsv
+               vendor=tandem
+               ;;
+       nsx-tandem)
+               cpu=nsx
+               vendor=tandem
+               ;;
+       s390-*)
+               cpu=s390
+               vendor=ibm
+               ;;
+       s390x-*)
+               cpu=s390x
+               vendor=ibm
+               ;;
+       tile*-*)
+               os=${os:-linux-gnu}
+               ;;
+
+       *)
+               # Recognize the canonical CPU types that are allowed with any
+               # company name.
+               case $cpu in
+                       1750a | 580 \
+                       | a29k \
+                       | aarch64 | aarch64_be \
+                       | abacus \
+                       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+                       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+                       | alphapca5[67] | alpha64pca5[67] \
+                       | am33_2.0 \
+                       | amdgcn \
+                       | arc | arceb \
+                       | arm  | arm[lb]e | arme[lb] | armv* \
+                       | avr | avr32 \
+                       | asmjs \
+                       | ba \
+                       | be32 | be64 \
+                       | bfin | bpf | bs2000 \
+                       | c[123]* | c30 | [cjt]90 | c4x \
+                       | c8051 | clipper | craynv | csky | cydra \
+                       | d10v | d30v | dlx | dsp16xx \
+                       | e2k | elxsi | epiphany \
+                       | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+                       | h8300 | h8500 \
+                       | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+                       | hexagon \
+                       | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+                       | ip2k | iq2000 \
+                       | k1om \
+                       | le32 | le64 \
+                       | lm32 \
+                       | m32c | m32r | m32rle \
+                       | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+                       | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+                       | m88110 | m88k | maxq | mb | mcore | mep | metag \
+                       | microblaze | microblazeel \
+                       | mips | mipsbe | mipseb | mipsel | mipsle \
+                       | mips16 \
+                       | mips64 | mips64eb | mips64el \
+                       | mips64octeon | mips64octeonel \
+                       | mips64orion | mips64orionel \
+                       | mips64r5900 | mips64r5900el \
+                       | mips64vr | mips64vrel \
+                       | mips64vr4100 | mips64vr4100el \
+                       | mips64vr4300 | mips64vr4300el \
+                       | mips64vr5000 | mips64vr5000el \
+                       | mips64vr5900 | mips64vr5900el \
+                       | mipsisa32 | mipsisa32el \
+                       | mipsisa32r2 | mipsisa32r2el \
+                       | mipsisa32r6 | mipsisa32r6el \
+                       | mipsisa64 | mipsisa64el \
+                       | mipsisa64r2 | mipsisa64r2el \
+                       | mipsisa64r6 | mipsisa64r6el \
+                       | mipsisa64sb1 | mipsisa64sb1el \
+                       | mipsisa64sr71k | mipsisa64sr71kel \
+                       | mipsr5900 | mipsr5900el \
+                       | mipstx39 | mipstx39el \
+                       | mmix \
+                       | mn10200 | mn10300 \
+                       | moxie \
+                       | mt \
+                       | msp430 \
+                       | nds32 | nds32le | nds32be \
+                       | nfp \
+                       | nios | nios2 | nios2eb | nios2el \
+                       | none | np1 | ns16k | ns32k | nvptx \
+                       | open8 \
+                       | or1k* \
+                       | or32 \
+                       | orion \
+                       | picochip \
+                       | pdp10 | pdp11 | pj | pjl | pn | power \
+                       | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+                       | pru \
+                       | pyramid \
+                       | riscv | riscv32 | riscv64 \
+                       | rl78 | romp | rs6000 | rx \
+                       | score \
+                       | sh | shl \
+                       | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+                       | sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+                       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+                       | sparclite \
+                       | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+                       | spu \
+                       | tahoe \
+                       | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+                       | tron \
+                       | ubicom32 \
+                       | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+                       | vax \
+                       | visium \
+                       | w65 \
+                       | wasm32 | wasm64 \
+                       | we32k \
+                       | x86 | x86_64 | xc16x | xgate | xps100 \
+                       | xstormy16 | xtensa* \
+                       | ymp \
+                       | z8k | z80)
+                               ;;
+
+                       *)
+                               echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+                               exit 1
+                               ;;
+               esac
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+       digital*)
+               vendor=dec
+               ;;
+       commodore*)
+               vendor=cbm
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x$os != x ]
+then
+case $os in
+       # First match some system type aliases that might get confused
+       # with valid system types.
+       # solaris* is a basic system type, with this one exception.
+       auroraux)
+               os=auroraux
+               ;;
+       bluegene*)
+               os=cnk
+               ;;
+       solaris1 | solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       solaris)
+               os=solaris2
+               ;;
+       unixware*)
+               os=sysv4.2uw
+               ;;
+       gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # es1800 is here to avoid being matched by es* (a different OS)
+       es1800*)
+               os=ose
+               ;;
+       # Some version numbers need modification
+       chorusos*)
+               os=chorusos
+               ;;
+       isc)
+               os=isc2.2
+               ;;
+       sco6)
+               os=sco5v6
+               ;;
+       sco5)
+               os=sco3.2v5
+               ;;
+       sco4)
+               os=sco3.2v4
+               ;;
+       sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               ;;
+       sco3.2v[4-9]* | sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               ;;
+       scout)
+               # Don't match below
+               ;;
+       sco*)
+               os=sco3.2v2
+               ;;
+       psos*)
+               os=psos
+               ;;
+       # Now accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST end in a * to match a version number.
+       # sysv* is not here because it comes later, after sysvr4.
+       gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+            | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
+            | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+            | sym* | kopensolaris* | plan9* \
+            | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+            | aos* | aros* | cloudabi* | sortix* | twizzler* \
+            | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+            | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+            | knetbsd* | mirbsd* | netbsd* \
+            | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
+            | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
+            | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+            | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+            | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
+            | chorusrdb* | cegcc* | glidix* \
+            | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+            | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
+            | linux-newlib* | linux-musl* | linux-uclibc* \
+            | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+            | interix* | uwin* | mks* | rhapsody* | darwin* \
+            | openstep* | oskit* | conix* | pw32* | nonstopux* \
+            | storm-chaos* | tops10* | tenex* | tops20* | its* \
+            | os2* | vos* | palmos* | uclinux* | nucleus* \
+            | morphos* | superux* | rtmk* | windiss* \
+            | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+            | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+            | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+            | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+            | nsk* | powerunix)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       qnx*)
+               case $cpu in
+                   x86 | i*86)
+                       ;;
+                   *)
+                       os=nto-$os
+                       ;;
+               esac
+               ;;
+       hiux*)
+               os=hiuxwe2
+               ;;
+       nto-qnx*)
+               ;;
+       nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       sim | xray | os68k* | v88r* \
+           | windows* | osx | abug | netware* | os9* \
+           | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
+               ;;
+       linux-dietlibc)
+               os=linux-dietlibc
+               ;;
+       linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       lynx*178)
+               os=lynxos178
+               ;;
+       lynx*5)
+               os=lynxos5
+               ;;
+       lynx*)
+               os=lynxos
+               ;;
+       mac*)
+               os=`echo "$os" | sed -e 's|mac|macos|'`
+               ;;
+       opened*)
+               os=openedition
+               ;;
+       os400*)
+               os=os400
+               ;;
+       sunos5*)
+               os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+               ;;
+       sunos6*)
+               os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+               ;;
+       wince*)
+               os=wince
+               ;;
+       utek*)
+               os=bsd
+               ;;
+       dynix*)
+               os=bsd
+               ;;
+       acis*)
+               os=aos
+               ;;
+       atheos*)
+               os=atheos
+               ;;
+       syllable*)
+               os=syllable
+               ;;
+       386bsd)
+               os=bsd
+               ;;
+       ctix* | uts*)
+               os=sysv
+               ;;
+       nova*)
+               os=rtmk-nova
+               ;;
+       ns2)
+               os=nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       sinix*)
+               os=sysv4
+               ;;
+       tpf*)
+               os=tpf
+               ;;
+       triton*)
+               os=sysv3
+               ;;
+       oss*)
+               os=sysv3
+               ;;
+       svr4*)
+               os=sysv4
+               ;;
+       svr3)
+               os=sysv3
+               ;;
+       sysvr4)
+               os=sysv4
+               ;;
+       # This must come after sysvr4.
+       sysv*)
+               ;;
+       ose*)
+               os=ose
+               ;;
+       *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+               os=mint
+               ;;
+       zvmoe)
+               os=zvmoe
+               ;;
+       dicos*)
+               os=dicos
+               ;;
+       pikeos*)
+               # Until real need of OS specific support for
+               # particular features comes up, bare metal
+               # configurations are quite functional.
+               case $cpu in
+                   arm*)
+                       os=eabi
+                       ;;
+                   *)
+                       os=elf
+                       ;;
+               esac
+               ;;
+       nacl*)
+               ;;
+       ios)
+               ;;
+       none)
+               ;;
+       *-eabi)
+               ;;
+       *)
+               echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $cpu-$vendor in
+       score-*)
+               os=elf
+               ;;
+       spu-*)
+               os=elf
+               ;;
+       *-acorn)
+               os=riscix1.2
+               ;;
+       arm*-rebel)
+               os=linux
+               ;;
+       arm*-semi)
+               os=aout
+               ;;
+       c4x-* | tic4x-*)
+               os=coff
+               ;;
+       c8051-*)
+               os=elf
+               ;;
+       clipper-intergraph)
+               os=clix
+               ;;
+       hexagon-*)
+               os=elf
+               ;;
+       tic54x-*)
+               os=coff
+               ;;
+       tic55x-*)
+               os=coff
+               ;;
+       tic6x-*)
+               os=coff
+               ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=tops20
+               ;;
+       pdp11-*)
+               os=none
+               ;;
+       *-dec | vax-*)
+               os=ultrix4.2
+               ;;
+       m68*-apollo)
+               os=domain
+               ;;
+       i386-sun)
+               os=sunos4.0.2
+               ;;
+       m68000-sun)
+               os=sunos3
+               ;;
+       m68*-cisco)
+               os=aout
+               ;;
+       mep-*)
+               os=elf
+               ;;
+       mips*-cisco)
+               os=elf
+               ;;
+       mips*-*)
+               os=elf
+               ;;
+       or32-*)
+               os=coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=sysv3
+               ;;
+       sparc-* | *-sun)
+               os=sunos4.1.1
+               ;;
+       pru-*)
+               os=elf
+               ;;
+       *-be)
+               os=beos
+               ;;
+       *-ibm)
+               os=aix
+               ;;
+       *-knuth)
+               os=mmixware
+               ;;
+       *-wec)
+               os=proelf
+               ;;
+       *-winbond)
+               os=proelf
+               ;;
+       *-oki)
+               os=proelf
+               ;;
+       *-hp)
+               os=hpux
+               ;;
+       *-hitachi)
+               os=hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=sysv
+               ;;
+       *-cbm)
+               os=amigaos
+               ;;
+       *-dg)
+               os=dgux
+               ;;
+       *-dolphin)
+               os=sysv3
+               ;;
+       m68k-ccur)
+               os=rtu
+               ;;
+       m88k-omron*)
+               os=luna
+               ;;
+       *-next)
+               os=nextstep
+               ;;
+       *-sequent)
+               os=ptx
+               ;;
+       *-crds)
+               os=unos
+               ;;
+       *-ns)
+               os=genix
+               ;;
+       i370-*)
+               os=mvs
+               ;;
+       *-gould)
+               os=sysv
+               ;;
+       *-highlevel)
+               os=bsd
+               ;;
+       *-encore)
+               os=bsd
+               ;;
+       *-sgi)
+               os=irix
+               ;;
+       *-siemens)
+               os=sysv4
+               ;;
+       *-masscomp)
+               os=rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=uxpv
+               ;;
+       *-rom68k)
+               os=coff
+               ;;
+       *-*bug)
+               os=coff
+               ;;
+       *-apple)
+               os=macos
+               ;;
+       *-atari*)
+               os=mint
+               ;;
+       *-wrs)
+               os=vxworks
+               ;;
+       *)
+               os=none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+case $vendor in
+       unknown)
+               case $os in
+                       riscix*)
+                               vendor=acorn
+                               ;;
+                       sunos*)
+                               vendor=sun
+                               ;;
+                       cnk*|-aix*)
+                               vendor=ibm
+                               ;;
+                       beos*)
+                               vendor=be
+                               ;;
+                       hpux*)
+                               vendor=hp
+                               ;;
+                       mpeix*)
+                               vendor=hp
+                               ;;
+                       hiux*)
+                               vendor=hitachi
+                               ;;
+                       unos*)
+                               vendor=crds
+                               ;;
+                       dgux*)
+                               vendor=dg
+                               ;;
+                       luna*)
+                               vendor=omron
+                               ;;
+                       genix*)
+                               vendor=ns
+                               ;;
+                       clix*)
+                               vendor=intergraph
+                               ;;
+                       mvs* | opened*)
+                               vendor=ibm
+                               ;;
+                       os400*)
+                               vendor=ibm
+                               ;;
+                       ptx*)
+                               vendor=sequent
+                               ;;
+                       tpf*)
+                               vendor=ibm
+                               ;;
+                       vxsim* | vxworks* | windiss*)
+                               vendor=wrs
+                               ;;
+                       aux*)
+                               vendor=apple
+                               ;;
+                       hms*)
+                               vendor=hitachi
+                               ;;
+                       mpw* | macos*)
+                               vendor=apple
+                               ;;
+                       *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               ;;
+esac
+
+echo "$cpu-$vendor-$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/build-aux/depcomp b/build-aux/depcomp
new file mode 100755 (executable)
index 0000000..3f27387
--- /dev/null
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2019 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/install-sh b/build-aux/install-sh
new file mode 100755 (executable)
index 0000000..20d8b2e
--- /dev/null
@@ -0,0 +1,529 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2018-03-11.20; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='  '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dstbase=`basename "$src"`
+      case $dst in
+       */) dst=$dst$dstbase;;
+       *)  dst=$dst/$dstbase;;
+      esac
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  case $dstdir in
+    */) dstdirslash=$dstdir;;
+    *)  dstdirslash=$dstdir/;;
+  esac
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
+            # here however when possible just to lower collision chance.
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # Because "mkdir -p" follows existing symlinks and we likely work
+            # directly in world-writeable /tmp, make sure that the '$tmpdir'
+            # directory is successfully created first before we actually test
+            # 'mkdir -p' feature.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=${dstdirslash}_inst.$$_
+    rmtmp=${dstdirslash}_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask &&
+     { test -z "$stripcmd" || {
+        # Create $dsttmp read-write so that cp doesn't create it read-only,
+        # which would cause strip to fail.
+        if test -z "$doit"; then
+          : >"$dsttmp" # No need to fork-exec 'touch'.
+        else
+          $doit touch "$dsttmp"
+        fi
+       }
+     } &&
+     $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/mdate-sh b/build-aux/mdate-sh
new file mode 100755 (executable)
index 0000000..79687f7
--- /dev/null
@@ -0,0 +1,228 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1995-2019 Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+fi
+
+case $1 in
+  '')
+     echo "$0: No file.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: mdate-sh [--help] [--version] FILE
+
+Pretty-print the modification day of FILE, in the format:
+1 January 1970
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "mdate-sh $scriptversion"
+    exit $?
+    ;;
+esac
+
+error ()
+{
+  echo "$0: $1" >&2
+  exit 1
+}
+
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+# Use UTC to get reproducible result.
+TZ=UTC0
+export TZ
+
+# GNU ls changes its time format in response to the TIME_STYLE
+# variable.  Since we cannot assume 'unset' works, revert this
+# variable to its documented default.
+if test "${TIME_STYLE+set}" = set; then
+  TIME_STYLE=posix-long-iso
+  export TIME_STYLE
+fi
+
+save_arg1=$1
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+  ls_command='ls -L -l -d'
+else
+  ls_command='ls -l -d'
+fi
+# Avoid user/group names that might have spaces, when possible.
+if ls -n /dev/null 1>/dev/null 2>&1; then
+  ls_command="$ls_command -n"
+fi
+
+# A 'ls -l' line looks as follows on OS/2.
+#  drwxrwx---        0 Aug 11  2001 foo
+# This differs from Unix, which adds ownership information.
+#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month.  This cannot work with files whose owner is a
+# user named "Jan", or "Feb", etc.  However, it's unlikely that '/'
+# will be owned by a user whose name is a month.  So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set x`$ls_command /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+  test $# -gt 0 || error "failed parsing '$ls_command /' output"
+  shift
+  # Add another shift to the command.
+  command="$command shift;"
+  case $1 in
+    Jan) month=January; nummonth=1;;
+    Feb) month=February; nummonth=2;;
+    Mar) month=March; nummonth=3;;
+    Apr) month=April; nummonth=4;;
+    May) month=May; nummonth=5;;
+    Jun) month=June; nummonth=6;;
+    Jul) month=July; nummonth=7;;
+    Aug) month=August; nummonth=8;;
+    Sep) month=September; nummonth=9;;
+    Oct) month=October; nummonth=10;;
+    Nov) month=November; nummonth=11;;
+    Dec) month=December; nummonth=12;;
+  esac
+done
+
+test -n "$month" || error "failed parsing '$ls_command /' output"
+
+# Get the extended ls output of the file or directory.
+set dummy x`eval "$ls_command \"\\\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Because of the dummy argument above, month is in $2.
+#
+# On a POSIX system, we should have
+#
+# $# = 5
+# $1 = file size
+# $2 = month
+# $3 = day
+# $4 = year or time
+# $5 = filename
+#
+# On Darwin 7.7.0 and 7.6.0, we have
+#
+# $# = 4
+# $1 = day
+# $2 = month
+# $3 = year or time
+# $4 = filename
+
+# Get the month.
+case $2 in
+  Jan) month=January; nummonth=1;;
+  Feb) month=February; nummonth=2;;
+  Mar) month=March; nummonth=3;;
+  Apr) month=April; nummonth=4;;
+  May) month=May; nummonth=5;;
+  Jun) month=June; nummonth=6;;
+  Jul) month=July; nummonth=7;;
+  Aug) month=August; nummonth=8;;
+  Sep) month=September; nummonth=9;;
+  Oct) month=October; nummonth=10;;
+  Nov) month=November; nummonth=11;;
+  Dec) month=December; nummonth=12;;
+esac
+
+case $3 in
+  ???*) day=$1;;
+  *) day=$3; shift;;
+esac
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+  *:*) set `date`; eval year=\$$#
+       case $2 in
+        Jan) nummonthtod=1;;
+        Feb) nummonthtod=2;;
+        Mar) nummonthtod=3;;
+        Apr) nummonthtod=4;;
+        May) nummonthtod=5;;
+        Jun) nummonthtod=6;;
+        Jul) nummonthtod=7;;
+        Aug) nummonthtod=8;;
+        Sep) nummonthtod=9;;
+        Oct) nummonthtod=10;;
+        Nov) nummonthtod=11;;
+        Dec) nummonthtod=12;;
+       esac
+       # For the first six month of the year the time notation can also
+       # be used for files modified in the last year.
+       if (expr $nummonth \> $nummonthtod) > /dev/null;
+       then
+        year=`expr $year - 1`
+       fi;;
+  *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/missing b/build-aux/missing
new file mode 100755 (executable)
index 0000000..625aeb1
--- /dev/null
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex
new file mode 100644 (file)
index 0000000..1ea515b
--- /dev/null
@@ -0,0 +1,11620 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2019-09-24.13}
+%
+% Copyright 1985, 1986, 1988, 1990-2019 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software: you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation, either version 3 of the
+% License, or (at your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program.  If not, see <https://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. This Exception is an additional permission under section 7
+% of the GNU General Public License, version 3 ("GPLv3").
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
+%   https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
+%   https://www.gnu.org/software/texinfo/ (the Texinfo home page)
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is https://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+% LaTeX's \typeout.  This ensures that the messages it is used for
+% are identical in format to the corresponding ones from latex/pdflatex.
+\def\typeout{\immediate\write17}%
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexsp=\sp
+\let\ptexstar=\*
+\let\ptexsup=\sup
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putworderror\undefined     \gdef\putworderror{error}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% Give the space character the catcode for a space.
+\def\spaceisspace{\catcode`\ =10\relax}
+
+% Likewise for ^^M, the end of line character.
+\def\endlineisspace{\catcode13=10\relax}
+
+\chardef\dashChar  = `\-
+\chardef\slashChar = `\/
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
+% aren't perfect, it's not the end of the world, being an error message,
+% after all.
+%
+\def\errormsg{\begingroup \indexnofonts \doerrormsg}
+\def\doerrormsg#1{\errmessage{#1}}
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+%\f Output routine
+%
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt }
+
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page.
+
+% \domark is called twice inside \chapmacro, to add one
+% mark before the section break, and one after.
+%   In the second call \prevchapterdefs is the same as \currentchapterdefs,
+% and \prevsectiondefs is the same as \currentsectiondefs.
+%   Then if the page is not broken at the mark, some of the previous
+% section appears on the page, and we can get the name of this section
+% from \firstmark for @everyheadingmarks top.
+%   @everyheadingmarks bottom uses \botmark.
+%
+% See page 260 of The TeXbook.
+\def\domark{%
+  \toks0=\expandafter{\currentchapterdefs}%
+  \toks2=\expandafter{\currentsectiondefs}%
+  \toks4=\expandafter{\prevchapterdefs}%
+  \toks6=\expandafter{\prevsectiondefs}%
+  \toks8=\expandafter{\currentcolordefs}%
+  \mark{%
+                   \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
+      \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
+    \noexpand\else \the\toks8             % 2: color marks
+  }%
+}
+
+% \gettopheadingmarks, \getbottomheadingmarks,
+% \getcolormarks - extract needed part of mark.
+%
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+  \ifcase0\the\savedtopmark\fi
+  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\the\savedtopmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\currentchapterdefs{}
+\def\currentsectiondefs{}
+\def\currentsection{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\currentcolordefs{}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\txipagewidth \newdimen\txipageheight
+
+% Main output routine.
+%
+\chardef\PAGE = 255
+\newtoks\defaultoutput
+\defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}}
+\output=\expandafter{\the\defaultoutput}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% When outputting the double column layout for indices, an output routine
+% is run several times, which hides the original value of \topmark.  This
+% can lead to a page heading being output and duplicating the chapter heading
+% of the index.  Hence, save the contents of \topmark at the beginning of
+% the output routine.  The saved contents are valid until we actually
+% \shipout a page.
+%
+% (We used to run a short output routine to actually set \topmark and
+% \firstmark to the right values, but if this was called with an empty page
+% containing whatsits for writing index entries, the whatsits would be thrown
+% away and the index auxiliary file would remain empty.)
+%
+\newtoks\savedtopmark
+\newif\iftopmarksaved
+\topmarksavedtrue
+\def\savetopmark{%
+  \iftopmarksaved\else
+    \global\savedtopmark=\expandafter{\topmark}%
+    \global\topmarksavedtrue
+  \fi
+}
+
+% \onepageout takes a vbox as an argument.
+% \shipout a vbox for a single page, adding an optional header, footer
+% and footnote.  This also causes index entries for this page to be written
+% to the auxiliary files.
+%
+\def\onepageout#1{%
+  \hoffset=\normaloffset
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Retrieve the information for the headings from the marks in the page,
+  % and call Plain TeX's \makeheadline and \makefootline, which use the
+  % values in \headline and \footline.
+  %
+  % This is used to check if we are on the first page of a chapter.
+  \ifcase1\the\savedtopmark\fi
+  \let\prevchaptername\thischaptername
+  \ifcase0\firstmark\fi
+  \let\curchaptername\thischaptername
+  %
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  %
+  \ifx\curchaptername\prevchaptername
+    \let\thischapterheading\thischapter
+  \else
+    % \thischapterheading is the same as \thischapter except it is blank
+    % for the first page of a chapter.  This is to prevent the chapter name
+    % being shown twice.
+    \def\thischapterheading{}%
+  \fi
+  %
+  % Common context changes for both heading and footing.
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \def\commmonheadfootline{\let\hsize=\txipagewidth \texinfochars}
+  %
+  \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
+  %
+  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+  \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%
+  %
+  {%
+    % Set context for writing to auxiliary files like index files.
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \atdummies         % don't expand commands in the output.
+    \turnoffactive
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingyyy.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 24pt
+        \unvbox\footlinebox
+      \fi
+      %
+    }%
+  }%
+  \global\topmarksavedfalse
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+% Main part of page, including any footnotes
+\def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+
+% Argument parsing
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+% For example, \def\foo{\parsearg\fooxxx}.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.  Pass the result on to
+% \argcheckspaces.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+
+% \parseargdef - define a command taking an argument on the line
+%
+% \parseargdef\foo{...}
+%      is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    outside of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal.
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\unskip\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  \addgroupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+
+\def\addgroupbox{
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\txipageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+}
+
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable  % we want to expand any @value in FILE.
+    \turnoffactive        % and allow special characters in the expansion
+    \indexnofonts         % Allow `@@' and other weird things in file names.
+    \wlog{texinfo.tex: doing @include of #1^^J}%
+    \edef\temp{\noexpand\input #1 }%
+    %
+    % This trickery is to read FILE outside of a group, in case it makes
+    % definitions, etc.
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+%
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\centersub\centerH
+  \else
+    \let\centersub\centerV
+  \fi
+  \centersub{\hfil \ignorespaces#1\unskip \hfil}%
+  \let\centersub\relax % don't let the definition persist, just in case
+}
+\def\centerH#1{{%
+  \hfil\break
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{#1}%
+  \break
+}}
+%
+\newcount\centerpenalty
+\def\centerV#1{%
+  % The idea here is the same as in \startdefun, \cartouche, etc.: if
+  % @center is the first thing after a section heading, we need to wipe
+  % out the negative parskip inserted by \sectionheading, but still
+  % prevent a page break here.
+  \centerpenalty = \lastpenalty
+  \ifnum\centerpenalty>10000 \vskip\parskip \fi
+  \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
+  \line{\kern\leftskip #1\kern\rightskip}%
+}
+
+% @sp n   outputs n lines of vertical space
+%
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+
+\def\c{\begingroup \catcode`\^^M=\active%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\cxxx}
+{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
+%
+\let\comment\c
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent  {\restorefirstparagraphindent \indent}%
+  \gdef\noindent{\restorefirstparagraphindent \noindent}%
+  \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
+}
+%
+\gdef\restorefirstparagraphindent{%
+  \global\let\indent = \ptexindent
+  \global\let\noindent = \ptexnoindent
+  \global\everypar = {}%
+}
+
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% @setfilename INFO-FILENAME - ignored
+\let\setfilename=\comment
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newbox\boxB
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+%
+% For LuaTeX
+%
+
+\newif\iftxiuseunicodedestname
+\txiuseunicodedestnamefalse % For pdfTeX etc.
+
+\ifx\luatexversion\thisisundefined
+\else
+  % Use Unicode destination names
+  \txiuseunicodedestnametrue
+  % Escape PDF strings with converting UTF-16 from UTF-8
+  \begingroup
+    \catcode`\%=12
+    \directlua{
+      function UTF16oct(str)
+        tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
+        for c in string.utfvalues(str) do
+          if c < 0x10000 then
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o',
+                            math.floor(c / 256), math.floor(c % 256)))
+          else
+            c = c - 0x10000
+            local c_hi = c / 1024 + 0xd800
+            local c_lo = c % 1024 + 0xdc00
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o',
+                            math.floor(c_hi / 256), math.floor(c_hi % 256),
+                            math.floor(c_lo / 256), math.floor(c_lo % 256)))
+          end
+        end
+      end
+    }
+  \endgroup
+  \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
+  % Escape PDF strings without converting
+  \begingroup
+    \directlua{
+      function PDFescstr(str)
+        for c in string.bytes(str) do
+          if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then
+            tex.sprint(-2,
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o',
+                            c))
+          else
+            tex.sprint(-2, string.char(c))
+          end
+        end
+      end
+    }
+    % The -2 in the arguments here gives all the input to TeX catcode 12
+    % (other) or 10 (space), preventing undefined control sequence errors. See
+    % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html
+    %
+  \endgroup
+  \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
+  \ifnum\luatexversion>84
+    % For LuaTeX >= 0.85
+    \def\pdfdest{\pdfextension dest}
+    \let\pdfoutput\outputmode
+    \def\pdfliteral{\pdfextension literal}
+    \def\pdfcatalog{\pdfextension catalog}
+    \def\pdftexversion{\numexpr\pdffeedback version\relax}
+    \let\pdfximage\saveimageresource
+    \let\pdfrefximage\useimageresource
+    \let\pdflastximage\lastsavedimageresourceindex
+    \def\pdfendlink{\pdfextension endlink\relax}
+    \def\pdfoutline{\pdfextension outline}
+    \def\pdfstartlink{\pdfextension startlink}
+    \def\pdffontattr{\pdfextension fontattr}
+    \def\pdfobj{\pdfextension obj}
+    \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
+    \let\pdfpagewidth\pagewidth
+    \let\pdfpageheight\pageheight
+    \edef\pdfhorigin{\pdfvariable horigin}
+    \edef\pdfvorigin{\pdfvariable vorigin}
+  \fi
+\fi
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as being undefined.
+\ifx\pdfoutput\thisisundefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+\newif\ifpdforxetex
+\pdforxetexfalse
+\ifpdf
+  \pdforxetextrue
+\fi
+\ifx\XeTeXrevision\thisisundefined\else
+  \pdforxetextrue
+\fi
+
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+%
+% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
+% related messages.  The final outcome is that it is up to the TeX user
+% to double the backslashes and otherwise make the string valid, so
+% that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
+% do this reliably, so we use it.
+
+% #1 is a control sequence in which to do the replacements,
+% which we \xdef.
+\def\txiescapepdf#1{%
+  \ifx\pdfescapestring\thisisundefined
+    % No primitive available; should we give a warning or log?
+    % Many times it won't matter.
+    \xdef#1{#1}%
+  \else
+    % The expandable \pdfescapestring primitive escapes parentheses,
+    % backslashes, and other special chars.
+    \xdef#1{\pdfescapestring{#1}}%
+  \fi
+}
+\def\txiescapepdfutfsixteen#1{%
+  \ifx\pdfescapestrutfsixteen\thisisundefined
+    % No UTF-16 converting macro available.
+    \txiescapepdf{#1}%
+  \else
+    \xdef#1{\pdfescapestrutfsixteen{#1}}%
+  \fi
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found.  (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+  %
+  % Color manipulation macros using ideas from pdfcolor.tex,
+  % except using rgb instead of cmyk; the latter is said to render as a
+  % very dark gray on-screen and a very dark halftone in print, instead
+  % of actual black. The dark red here is dark enough to print on paper as
+  % nearly black, but still distinguishable for online viewing.  We use
+  % black by default, though.
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  % rg sets the color for filling (usual text, etc.);
+  % RG sets the color for stroking (thin rules, e.g., normal _'s).
+  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\currentcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  %
+  \pdfcatalog{/PageMode /UseOutlines}
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\dopdfimage#1#2#3{%
+    \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % pdftex (and the PDF format) support .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\pdfimgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errhelp = \nopdfimagehelp
+                  \errmessage{Could not find image file #1 for pdf}%
+                \else \gdef\pdfimgext{JPG}%
+                \fi
+              \else \gdef\pdfimgext{jpeg}%
+              \fi
+            \else \gdef\pdfimgext{jpg}%
+            \fi
+          \else \gdef\pdfimgext{png}%
+          \fi
+        \else \gdef\pdfimgext{PDF}%
+        \fi
+      \else \gdef\pdfimgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    % without \immediate, ancient pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifdim \wd0 >0pt width \pdfimagewidth \fi
+      \ifdim \wd2 >0pt height \pdfimageheight \fi
+      \ifnum\pdftexversion<13
+         #1.\pdfimgext
+       \else
+         {#1.\pdfimgext}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  %
+  \def\setpdfdestname#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \iftxiuseunicodedestname
+      \ifx \declaredencoding \latone
+        % Pass through Latin-1 characters.
+        % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode.
+      \else
+        \ifx \declaredencoding \utfeight
+          % Pass through Unicode characters.
+        \else
+          % Use ASCII approximations in destination names.
+          \passthroughcharsfalse
+        \fi
+      \fi
+    \else
+      % Use ASCII approximations in destination names.
+      \passthroughcharsfalse
+    \fi
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+  }}
+  %
+  \def\setpdfoutlinetext#1{{%
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \ifx \declaredencoding \latone
+      % The PDF format can use an extended form of Latin-1 in bookmark
+      % strings.  See Appendix D of the PDF Reference, Sixth Edition, for
+      % the "PDFDocEncoding".
+      \passthroughcharstrue
+      % Pass through Latin-1 characters.
+      %   LuaTeX: Convert to Unicode
+      %   pdfTeX: Use Latin-1 as PDFDocEncoding
+      \def\pdfoutlinetext{#1}%
+    \else
+      \ifx \declaredencoding \utfeight
+        \ifx\luatexversion\thisisundefined
+          % For pdfTeX  with UTF-8.
+          % TODO: the PDF format can use UTF-16 in bookmark strings,
+          % but the code for this isn't done yet.
+          % Use ASCII approximations.
+          \passthroughcharsfalse
+          \def\pdfoutlinetext{#1}%
+        \else
+          % For LuaTeX with UTF-8.
+          % Pass through Unicode characters for title texts.
+          \passthroughcharstrue
+          \def\pdfoutlinetext{#1}%
+        \fi
+      \else
+        % For non-Latin-1 or non-UTF-8 encodings.
+        % Use ASCII approximations.
+        \passthroughcharsfalse
+        \def\pdfoutlinetext{#1}%
+      \fi
+    \fi
+    % LuaTeX: Convert to UTF-16
+    % pdfTeX: Use Latin-1 as PDFDocEncoding
+    \txiescapepdfutfsixteen\pdfoutlinetext
+  }}
+  %
+  \def\pdfmkdest#1{%
+    \setpdfdestname{#1}%
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}
+  %
+  % by default, use black for everything.
+  \def\urlcolor{\rgbBlack}
+  \def\linkcolor{\rgbBlack}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \setpdfoutlinetext{#1}
+    \setpdfdestname{#3}
+    \ifx\pdfdestname\empty
+      \def\pdfdestname{#4}%
+    \fi
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+       \def\thischapnum{##2}%
+       \def\thissecnum{0}%
+       \def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+       \advancenumber{chap\thischapnum}%
+       \def\thissecnum{##2}%
+       \def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+       \advancenumber{sec\thissecnum}%
+       \def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+       \advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % TODO this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Too
+      % much work for too little return.  Just use the ASCII equivalents
+      % we use for the index sort strings.
+      %
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  % \pdfgettoks - Surround page numbers in #1 with @pdflink.  #1 may
+  % be a simple number, or a list of numbers in the case of an index
+  % entry.
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  % non-pdf mode
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\setcolor = \gobble
+  \let\pdfsetcolor = \gobble
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+%
+% For XeTeX
+%
+\ifx\XeTeXrevision\thisisundefined
+\else
+  %
+  % XeTeX version check
+  %
+  \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
+    % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
+    % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941).
+    % For avoiding PDF destination name replacement, we use this special
+    % instead of xdvipdfmx's command line option `-C 0x0010'.
+    \special{dvipdfmx:config C 0x0010}
+    % XeTeX 0.99995+ comes with xdvipdfmx 20160307+.
+    % It can handle Unicode destination names for PDF.
+    \txiuseunicodedestnametrue
+  \else
+    % XeTeX < 0.99996 (TeX Live < 2016) cannot use the
+    % `dvipdfmx:config' special.
+    % So for avoiding PDF destination name replacement,
+    % xdvipdfmx's command line option `-C 0x0010' is necessary.
+    %
+    % XeTeX < 0.99995 can not handle Unicode destination names for PDF
+    % because xdvipdfmx 20150315 has a UTF-16 conversion issue.
+    % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+    \txiuseunicodedestnamefalse
+  \fi
+  %
+  % Color support
+  %
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  \def\pdfsetcolor#1{\special{pdf:scolor [#1]}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\currentcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  % PDF outline support
+  %
+  % Emulate pdfTeX primitive
+  \def\pdfdest name#1 xyz{%
+    \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}%
+  }
+  %
+  \def\setpdfdestname#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \iftxiuseunicodedestname
+      % Pass through Unicode characters.
+    \else
+      % Use ASCII approximations in destination names.
+      \passthroughcharsfalse
+    \fi
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+  }}
+  %
+  \def\setpdfoutlinetext#1{{%
+    \turnoffactive
+    % Always use Unicode characters in title texts.
+    \def\pdfoutlinetext{#1}%
+    % For XeTeX, xdvipdfmx converts to UTF-16.
+    % So we do not convert.
+    \txiescapepdf\pdfoutlinetext
+  }}
+  %
+  \def\pdfmkdest#1{%
+    \setpdfdestname{#1}%
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }
+  %
+  % by default, use black for everything.
+  \def\urlcolor{\rgbBlack}
+  \def\linkcolor{\rgbBlack}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    \setpdfoutlinetext{#1}
+    \setpdfdestname{#3}
+    \ifx\pdfdestname\empty
+      \def\pdfdestname{#4}%
+    \fi
+    %
+    \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
+      << /S /GoTo /D (\pdfdestname) >> >> }%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      %
+      % For XeTeX, counts of subentries are not necessary.
+      % Therefore, we read toc only once.
+      %
+      % We use node names as destinations.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{1}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{2}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{3}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{4}{##3}{##4}}%
+      %
+      \let\appentry\numchapentry%
+      \let\appsecentry\numsecentry%
+      \let\appsubsecentry\numsubsecentry%
+      \let\appsubsubsecentry\numsubsubsecentry%
+      \let\unnchapentry\numchapentry%
+      \let\unnsecentry\numsecentry%
+      \let\unnsubsecentry\numsubsecentry%
+      \let\unnsubsubsecentry\numsubsubsecentry%
+      %
+      % For XeTeX, xdvipdfmx converts strings to UTF-16.
+      % Therefore, the encoding and the language may not be considered.
+      %
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+
+  \special{pdf:docview << /PageMode /UseOutlines >> }
+  % ``\special{pdf:tounicode ...}'' is not necessary
+  % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
+  % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315,
+  % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings.
+  % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+%
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \special{pdf:bann << /Border [0 0 0]
+        /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
+    \endgroup}
+  \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \special{pdf:bann << /Border [0 0 0]
+      /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+%
+  %
+  % @image support
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\doxeteximage#1#2#3{%
+    \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\xeteximgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errmessage{Could not find image file #1 for XeTeX}%
+                \else \gdef\xeteximgext{JPG}%
+                \fi
+              \else \gdef\xeteximgext{jpeg}%
+              \fi
+            \else \gdef\xeteximgext{jpg}%
+            \fi
+          \else \gdef\xeteximgext{png}%
+          \fi
+        \else \gdef\xeteximgext{PDF}%
+        \fi
+      \else \gdef\xeteximgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    \def\xetexpdfext{pdf}%
+    \ifx\xeteximgext\xetexpdfext
+      \XeTeXpdffile "#1".\xeteximgext ""
+    \else
+      \def\xetexpdfext{PDF}%
+      \ifx\xeteximgext\xetexpdfext
+        \XeTeXpdffile "#1".\xeteximgext ""
+      \else
+        \XeTeXpicfile "#1".\xeteximgext ""
+      \fi
+    \fi
+    \ifdim \wd0 >0pt width \xeteximagewidth \fi
+    \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
+  }
+\fi
+
+
+%
+\message{fonts,}
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\newdimen\textleading
+\def\setleading#1{%
+  \dimen0 = #1\relax
+  \normalbaselineskip = \baselinefactor\dimen0
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% PDF CMaps.  See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\thisisundefined \else
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1IT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1TT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named \fontprefix#2.
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
+% Example:
+% #1 = \textrm
+% #2 = \rmshape
+% #3 = 10
+% #4 = \mainmagstep
+% #5 = OT1
+%
+\def\setfont#1#2#3#4#5{%
+  \font#1=\fontprefix#2#3 scaled #4
+  \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+%
+% (end of cmaps)
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\thisisundefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               % where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt.  (The default in Texinfo.)
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defsl\slshape{10}{\magstep1}{OT1}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\ttslfont=\defttsl \let\slfont=\defsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acronym in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+\textleading = 13.2pt % line spacing for 11pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 11pt text font size definitions, \definetextfontsizexi
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit.  This is for the GNU
+% Press printing of the Emacs 22 manual.  Maybe other manuals in the
+% future.  Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defsl\slshape{10}{\magstephalf}{OT1}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\slfont=\defsl \let\ttslfont=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acronym in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+\divide\parskip by 2  % reduce space between paragraphs
+\textleading = 12pt   % line spacing for 10pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 10pt text font size definitions, \definetextfontsizex
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+
+% We provide the user-level command
+%   @fonttextsize 10
+% (or 11) to redefine the text font size.  pt is assumed.
+%
+\def\xiword{11}
+\def\xword{10}
+\def\xwordpt{10pt}
+%
+\parseargdef\fonttextsize{%
+  \def\textsizearg{#1}%
+  %\wlog{doing @fonttextsize \textsizearg}%
+  %
+  % Set \globaldefs so that documents can use this inside @tex, since
+  % makeinfo 4.8 does not support it, but we need it nonetheless.
+  %
+ \begingroup \globaldefs=1
+  \ifx\textsizearg\xword \definetextfontsizex
+  \else \ifx\textsizearg\xiword \definetextfontsizexi
+  \else
+    \errhelp=\EMsimple
+    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+  \fi\fi
+ \endgroup
+}
+
+%
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname #1font\endcsname  % change the current font
+}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.
+% We don't bother to reset \scriptscriptfont; awaiting user need.
+%
+\def\resetmathfonts{%
+  \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont
+  \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont
+  \textfont\ttfam=\ttfont \textfont\sffam=\sffont
+  %
+  % Fonts for superscript.  Note that the 7pt fonts are used regardless
+  % of the current font size.
+  \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy
+  \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl
+  \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt
+  \scriptfont\sffam=\sevensf
+}
+
+%
+
+% The font-changing commands (all called \...fonts) redefine the meanings
+% of \STYLEfont, instead of just \STYLE.  We do this because \STYLE needs
+% to also set the current \fam for math mode.  Our \STYLE (e.g., \rm)
+% commands hardwire \STYLEfont to set the current font.
+%
+% The fonts used for \ifont are for "math italics"  (\itfont is for italics
+% in regular text).  \syfont is also used in math mode only.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used
+% in, e.g., the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+
+\def\assignfonts#1{%
+  \expandafter\let\expandafter\rmfont\csname #1rm\endcsname
+  \expandafter\let\expandafter\itfont\csname #1it\endcsname
+  \expandafter\let\expandafter\slfont\csname #1sl\endcsname
+  \expandafter\let\expandafter\bffont\csname #1bf\endcsname
+  \expandafter\let\expandafter\ttfont\csname #1tt\endcsname
+  \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname
+  \expandafter\let\expandafter\sffont  \csname #1sf\endcsname
+  \expandafter\let\expandafter\ifont   \csname #1i\endcsname
+  \expandafter\let\expandafter\syfont  \csname #1sy\endcsname
+  \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname
+}
+
+\newif\ifrmisbold
+
+% Select smaller font size with the current style.  Used to change font size
+% in, e.g., the LaTeX logo and acronyms.  If we are using bold fonts for
+% normal roman text, also use bold fonts for roman text in the smaller size.
+\def\switchtolllsize{%
+   \expandafter\assignfonts\expandafter{\lllsize}%
+   \ifrmisbold
+     \let\rmfont\bffont
+   \fi
+   \csname\curfontstyle\endcsname
+}%
+
+\def\switchtolsize{%
+   \expandafter\assignfonts\expandafter{\lsize}%
+   \ifrmisbold
+     \let\rmfont\bffont
+   \fi
+   \csname\curfontstyle\endcsname
+}%
+
+\def\definefontsetatsize#1#2#3#4#5{%
+\expandafter\def\csname #1fonts\endcsname{%
+  \def\curfontsize{#1}%
+  \def\lsize{#2}\def\lllsize{#3}%
+  \csname rmisbold#5\endcsname
+  \assignfonts{#1}%
+  \resetmathfonts
+  \setleading{#4}%
+}}
+
+\definefontsetatsize{text}   {reduced}{smaller}{\textleading}{false}
+\definefontsetatsize{title}  {chap}   {subsec} {27pt}  {true}
+\definefontsetatsize{chap}   {sec}    {text}   {19pt}  {true}
+\definefontsetatsize{sec}    {subsec} {reduced}{17pt}  {true}
+\definefontsetatsize{ssec}   {text}   {small}  {15pt}  {true}
+\definefontsetatsize{reduced}{small}  {smaller}{10.5pt}{false}
+\definefontsetatsize{small}  {smaller}{smaller}{10.5pt}{false}
+\definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false}
+
+\def\titlefont#1{{\titlefonts\rm #1}}
+\let\subsecfonts = \ssecfonts
+\let\subsubsecfonts = \ssecfonts
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style.
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+  \def\currentmarkupstyle{#1}%
+  \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+  \expandafter\def\expandafter\markupstylesetup
+    \expandafter{\markupstylesetup #1}%
+  \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuplq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuprq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+%
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+%
+\let\markupsetuplqkbd     \markupsetcodequoteleft
+\let\markupsetuprqkbd     \markupsetcodequoteright
+%
+\let\markupsetuplqsamp \markupsetcodequoteleft
+\let\markupsetuprqsamp \markupsetcodequoteright
+%
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+%
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+% Allow an option to not use regular directed right quote/apostrophe
+% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
+% The undirected quote is ugly, so don't make it the default, but it
+% works for pasting with more pdf viewers (at least evince), the
+% lilypond developers report.  xpdf does work with the regular 0x27.
+%
+\def\codequoteright{%
+  \ifmonospace
+    \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+      \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+        '%
+      \else \char'15 \fi
+    \else \char'15 \fi
+   \else
+     '%
+   \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+  \ifmonospace
+    \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+      \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+        % [Knuth] pp. 380,381,391
+        % \relax disables Spanish ligatures ?` and !` of \tt font.
+        \relax`%
+      \else \char'22 \fi
+    \else \char'22 \fi
+   \else
+     \relax`%
+   \fi
+}
+
+% Commands to set the quote options.
+%
+\parseargdef\codequoteundirected{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
+  \fi\fi
+}
+%
+\parseargdef\codequotebacktick{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
+  \fi\fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Font commands.
+
+% #1 is the font command (\sl or \it), #2 is the text to slant.
+% If we are in a monospaced environment, however, 1) always use \ttsl,
+% and 2) do not add an italic correction.
+\def\dosmartslant#1#2{%
+  \ifusingtt
+    {{\ttsl #2}\let\next=\relax}%
+    {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
+  \next
+}
+\def\smartslanted{\dosmartslant\sl}
+\def\smartitalic{\dosmartslant\it}
+
+% Output an italic correction unless \next (presumed to be the following
+% character) is such as not to need one.
+\def\smartitaliccorrection{%
+  \ifx\next,%
+  \else\ifx\next-%
+  \else\ifx\next.%
+  \else\ifx\next\.%
+  \else\ifx\next\comma%
+  \else\ptexslash
+  \fi\fi\fi\fi\fi
+  \aftersmartic
+}
+
+% Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
+\def\ttslanted#1{{\ttsl #1}}
+
+% @cite is like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
+
+\def\aftersmartic{}
+\def\var#1{%
+  \let\saveaftersmartic = \aftersmartic
+  \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
+  \smartslanted{#1}%
+}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @b, explicit bold.  Also @strong.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
+    \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+% @t, explicit typewriter.
+\def\t#1{%
+  {\tt \plainfrenchspacing #1}%
+  \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% @indicateurl is \samp, that is, with quotes.
+\let\indicateurl=\samp
+
+% @code (and similar) prints in typewriter, but with spaces the same
+% size as normal in the surrounding text, without hyphenation, etc.
+% This is a subroutine for that.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \plainfrenchspacing
+    #1%
+  }%
+  \null % reset spacefactor to 1000
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% (But see \codedashfinish below.)
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+%
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash. -- rms.
+{
+  \catcode`\-=\active \catcode`\_=\active
+  \catcode`\'=\active \catcode`\`=\active
+  \global\let'=\rq \global\let`=\lq  % default definitions
+  %
+  \global\def\code{\begingroup
+    \setupmarkupstyle{code}%
+    % The following should really be moved into \setupmarkupstyle handlers.
+    \catcode\dashChar=\active  \catcode\underChar=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\normaldash
+     \let_\realunder
+    \fi
+    % Given -foo (with a single dash), we do not want to allow a break
+    % after the hyphen.
+    \global\let\codedashprev=\codedash
+    %
+    \codex
+  }
+  %
+  \gdef\codedash{\futurelet\next\codedashfinish}
+  \gdef\codedashfinish{%
+    \normaldash % always output the dash character itself.
+    %
+    % Now, output a discretionary to allow a line break, unless
+    % (a) the next character is a -, or
+    % (b) the preceding character is a -.
+    % E.g., given --posix, we do not want to allow a break after either -.
+    % Given --foo-bar, we do want to allow a break between the - and the b.
+    \ifx\next\codedash \else
+      \ifx\codedashprev\codedash
+      \else \discretionary{}{}{}\fi
+    \fi
+    % we need the space after the = for the case when \next itself is a
+    % space token; it would get swallowed otherwise.  As in @code{- a}.
+    \global\let\codedashprev= \next
+  }
+}
+\def\normaldash{-}
+%
+\def\codex #1{\tclose{#1}\endgroup}
+
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is bad.
+% @allowcodebreaks provides a document-level way to turn breaking at -
+% and _ on and off.
+%
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
+  \fi\fi
+}
+
+% For @command, @env, @file, @option quotes seem unnecessary,
+% so use \code rather than \samp.
+\let\command=\code
+\let\env=\code
+\let\file=\code
+\let\option=\code
+
+% @uref (abbreviation for `urlref') aka @url takes an optional
+% (comma-separated) second argument specifying the text to display and
+% an optional third arg as text to display instead of (rather than in
+% addition to) the url itself.  First (mandatory) arg is the url.
+
+% TeX-only option to allow changing PDF output to show only the second
+% arg (if given), and not the url (which is then just the link target).
+\newif\ifurefurlonlylink
+
+% The main macro is \urefbreak, which allows breaking at expected
+% places within the url.  (There used to be another version, which
+% didn't support automatic breaking.)
+\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+\let\uref=\urefbreak
+%
+\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
+\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}% look for second arg
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        % For pdfTeX and LuaTeX
+        \ifurefurlonlylink
+          % PDF plus option to not display url, show just arg
+          \unhbox0
+        \else
+          % PDF, normally display both arg and url for consistency,
+          % visibility, if the pdf is eventually used to print, etc.
+          \unhbox0\ (\urefcode{#1})%
+        \fi
+      \else
+        \ifx\XeTeXrevision\thisisundefined
+          \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
+        \else
+          % For XeTeX
+          \ifurefurlonlylink
+            % PDF plus option to not display url, show just arg
+            \unhbox0
+          \else
+            % PDF, normally display both arg and url for consistency,
+            % visibility, if the pdf is eventually used to print, etc.
+            \unhbox0\ (\urefcode{#1})%
+          \fi
+        \fi
+      \fi
+    \else
+      \urefcode{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% Allow line breaks around only a few characters (only).
+\def\urefcatcodes{%
+  \catcode`\&=\active \catcode`\.=\active
+  \catcode`\#=\active \catcode`\?=\active
+  \catcode`\/=\active
+}
+{
+  \urefcatcodes
+  %
+  \global\def\urefcode{\begingroup
+    \setupmarkupstyle{code}%
+    \urefcatcodes
+    \let&\urefcodeamp
+    \let.\urefcodedot
+    \let#\urefcodehash
+    \let?\urefcodequest
+    \let/\urefcodeslash
+    \codex
+  }
+  %
+  % By default, they are just regular characters.
+  \global\def&{\normalamp}
+  \global\def.{\normaldot}
+  \global\def#{\normalhash}
+  \global\def?{\normalquest}
+  \global\def/{\normalslash}
+}
+
+\def\urefcodeamp{\urefprebreak \&\urefpostbreak}
+\def\urefcodedot{\urefprebreak .\urefpostbreak}
+\def\urefcodehash{\urefprebreak \#\urefpostbreak}
+\def\urefcodequest{\urefprebreak ?\urefpostbreak}
+\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
+{
+  \catcode`\/=\active
+  \global\def\urefcodeslashfinish{%
+    \urefprebreak \slashChar
+    % Allow line break only after the final / in a sequence of
+    % slashes, to avoid line break between the slashes in http://.
+    \ifx\next/\else \urefpostbreak \fi
+  }
+}
+
+% By default we'll break after the special characters, but some people like to
+% break before the special chars, so allow that.  Also allow no breaking at
+% all, for manual control.
+%
+\parseargdef\urefbreakstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\wordnone
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordbefore
+    \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordafter
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak}
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\wordafter{after}
+\def\wordbefore{before}
+\def\wordnone{none}
+
+% Allow a ragged right output to aid breaking long URL's.  There can
+% be a break at the \allowbreak with no extra glue (if the existing stretch in
+% the line is sufficent), a break at the \penalty100 with extra glue added
+% at the end of the line, or no break at all here.
+%   Changing the value of the penalty and/or the amount of stretch affects how
+% preferrable one choice is over the other.
+\def\urefallowbreak{%
+  \allowbreak
+  \hskip 0pt plus 4 em\relax
+  \penalty100
+  \hskip 0pt plus -4 em\relax
+}
+
+\urefbreakstyle after
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdforxetex
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
+
+\def\xkey{\key}
+\def\kbdsub#1#2#3\par{%
+  \def\one{#1}\def\three{#3}\def\threex{??}%
+  \ifx\one\xkey\ifx\threex\three \key{#2}%
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+}
+
+% definition of @key that produces a lozenge.  Doesn't adjust to text size.
+%\setfont\keyrm\rmshape{8}{1000}{OT1}
+%\font\keysy=cmsy9
+%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+%    \vbox{\hrule\kern-0.4pt
+%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+%    \kern-0.4pt\hrule}%
+%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+
+% definition of @key with no lozenge.  If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle.  But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+  \nohyphenation
+  \ifmonospace\else\tt\fi
+  #1}\null}
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow   (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\switchtolsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a math (or tt) \.
+% FYI, plain.tex uses \\ as a temporary control sequence (for no
+% particular reason), but this is not advertised and we don't care.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \ifmmode\else % only go into math if not in math mode already
+    \tex
+    \mathunderscore
+    \let\\ = \mathbackslash
+    \mathactive
+    % make the texinfo accent commands work in math mode
+    \let\"=\ddot
+    \let\'=\acute
+    \let\==\bar
+    \let\^=\hat
+    \let\`=\grave
+    \let\u=\breve
+    \let\v=\check
+    \let\~=\tilde
+    \let\dotaccent=\dot
+    % have to provide another name for sup operator
+    \let\mathopsup=\sup
+  $\expandafter\finishmath\fi
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \catcode`' = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+    \let' = \ptexquoteright
+  }
+}
+
+% for @sub and @sup, if in math mode, just do a normal sub/superscript.
+% If in text, use math to place as sub/superscript, but switch
+% into text mode, with smaller fonts.  This is a different font than the
+% one used for real math sub/superscripts (8pt vs. 7pt), but let's not
+% fix it (significant additions to font machinery) until someone notices.
+%
+\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
+\def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}%
+%
+\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
+\def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
+
+% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
+% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
+% except specified as a normal braced arg, so no newlines to worry about.
+%
+\def\outfmtnametex{tex}
+%
+\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
+\long\def\doinlinefmt#1,#2,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
+}
+%
+% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
+% FMTNAME is tex, else ELSE-TEXT.
+\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
+\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
+}
+%
+% For raw, must switch into @tex before parsing the argument, to avoid
+% setting catcodes prematurely.  Doing it this way means that, for
+% example, @inlineraw{html, foo{bar} gets a parse error instead of being
+% ignored.  But this isn't important because if people want a literal
+% *right* brace they would have to use a command anyway, so they may as
+% well use a command to get a left brace too.  We could re-use the
+% delimiter character idea from \verb, but it seems like overkill.
+%
+\long\def\inlineraw{\tex \doinlineraw}
+\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
+\def\doinlinerawtwo#1,#2,\finish{%
+  \def\inlinerawname{#1}%
+  \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
+  \endgroup % close group opened by \tex.
+}
+
+% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
+%
+\long\def\inlineifset#1{\doinlineifset #1,\finish}
+\long\def\doinlineifset#1,#2,\finish{%
+  \def\inlinevarname{#1}%
+  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
+  \else\ignorespaces#2\fi
+}
+
+% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
+%
+\long\def\inlineifclear#1{\doinlineifclear #1,\finish}
+\long\def\doinlineifclear#1,#2,\finish{%
+  \def\inlinevarname{#1}%
+  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
+}
+
+
+\message{glyphs,}
+% and logos.
+
+% @@ prints an @, as does @atchar{}.
+\def\@{\char64 }
+\let\atchar=\@
+
+% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
+\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
+\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
+\let\{=\lbracechar
+\let\}=\rbracechar
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \ptexc
+\let\dotaccent = \ptexdot
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \ptext
+\let\ubaraccent = \ptexb
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{%
+     \ifx\textnominalsize\xwordpt
+       % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX.
+       % Revert to plain's \scriptsize, which is 7pt.
+       \count255=\the\fam $\fam\count255 \scriptstyle A$%
+     \else
+       % For 11pt, we can use our lllsize.
+       \switchtolllsize A%
+     \fi
+     }%
+     \vss
+  }}%
+  \kern-.15em
+  \TeX
+}
+
+% Some math mode symbols.  Define \ensuremath to switch into math mode
+% unless we are already there.  Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em.  So do
+% whichever is larger.
+%
+\def\dots{%
+  \leavevmode
+  \setbox0=\hbox{...}% get width of three periods
+  \ifdim\wd0 > 1.5em
+    \dimen0 = \wd0
+  \else
+    \dimen0 = 1.5em
+  \fi
+  \hbox to \dimen0{%
+    \hskip 0pt plus.25fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\ttfont \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  %
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  %
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  %
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% Glyphs from the EC fonts.  We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases.  We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+  \def\temp{#1}%
+  \ifx\temp\macrocharA\Aogonek
+  \else\ifx\temp\macrochara\aogonek
+  \else\ifx\temp\macrocharE\Eogonek
+  \else\ifx\temp\macrochare\eogonek
+  \else
+    \ecfont \setbox0=\hbox{#1}%
+    \ifdim\ht0=1ex\accent"0C #1%
+    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+    \fi
+  \fi\fi\fi\fi
+  }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the European Computer Modern fonts (cm-super in outline format)
+% for non-CM glyphs.  That is ec* for regular text and tc* for the text
+% companion symbols (LaTeX TS1 encoding).  Both are part of the ec
+% package and follow the same conventions.
+%
+\def\ecfont{\etcfont{e}}
+\def\tcfont{\etcfont{t}}
+%
+\def\etcfont#1{%
+  % We can't distinguish serif/sans and italic/slanted, but this
+  % is used for crude hacks anyway (like adding French and German
+  % quotes to documents typeset with CM, where we lose kerning), so
+  % hopefully nobody will notice/care.
+  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+  \ifmonospace
+    % typewriter:
+    \font\thisecfont = #1ctt\ecsize \space at \nominalsize
+  \else
+    \ifx\curfontstyle\bfstylename
+      % bold:
+      \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
+    \else
+      % regular:
+      \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+    \fi
+  \fi
+  \thisecfont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\thisisundefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% @setcontentsaftertitlepage used to do an implicit @contents or
+% @shortcontents after @end titlepage, but it is now obsolete.
+\def\setcontentsaftertitlepage{%
+  \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
+              command; move your @contents command if you want the contents
+              after the title page.}}%
+\def\setshortcontentsaftertitlepage{%
+  \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
+              command; move your @shortcontents and @contents commands if you
+              want the contents after the title page.}}%
+
+\parseargdef\shorttitlepage{%
+  \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+  \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+        \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+       \finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+% Settings used for typesetting titles: no hyphenation, no indentation,
+% don't worry much about spacing, ragged right.  This should be used
+% inside a \vbox, and fonts need to be set appropriately first. \par should
+% be specified before the end of the \vbox, since a vbox is a group.
+%
+\def\raggedtitlesettings{%
+  \rm
+  \hyphenpenalty=10000
+  \parindent=0pt
+  \tolerance=5000
+  \ptexraggedright
+}
+
+% Macros to be used within @titlepage:
+
+\let\subtitlerm=\rmfont
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \vbox{\titlefonts \raggedtitlesettings #1\par}%
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\secfonts\rm \leftline{#1}}%
+  \fi
+}
+
+
+% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make \makeheadline and \makefootline in Plain TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\txipageheight by -12pt
+  \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top     \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+% These define \getoddheadingmarks, \getevenheadingmarks,
+% \getoddfootingmarks, and \getevenfootingmarks, each to one of
+% \gettopheadingmarks, \getbottomheadingmarks.
+%
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
+                          \headingmarks{odd}{heading}{#1} }
+\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
+                          \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+  \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\parseargdef\headings{\csname HEADINGS#1\endcsname}
+
+\def\headingsoff{% non-global headings elimination
+  \evenheadline={\hfil}\evenfootline={\hfil}%
+   \oddheadline={\hfil}\oddfootline={\hfil}%
+}
+
+\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
+\HEADINGSoff  % it's the default
+
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\thisisundefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil\relax
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    %
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  %
+  % Try typesetting the item mark so that if the document erroneously says
+  % something like @itemize @samp (intending @table), there's an error
+  % right away at the @itemize.  It's not the best error message in the
+  % world, but it's better than leaving it to the @item.  This means if
+  % the user wants an empty mark, they have to say @w{} not just @w.
+  \def\itemcontents{#1}%
+  \setbox0 = \hbox{\itemcontents}%
+  %
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  %
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   %
+   \ifinner\else
+     \vadjust{\penalty 1200}% not good to break after first line of item.
+   \fi
+   % We can be in inner vertical mode in a footnote, although an
+   % @itemize looks awful there.
+  }%
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.  Assignments
+% have to be global since we are inside the implicit group of an
+% alignment entry.  \everycr below resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+  \checkenv\multitable
+  \crcr
+  \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
+  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+  \the\everytab % for the first item
+}%
+%
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we again encounter the problem the 1sp was intended to solve.
+%                                      --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}% Reset from possible headitem.
+      \global\colcount=0 % Reset the column counter.
+      %
+      % Check for saved footnotes, etc.:
+      \checkinserts
+      %
+      % Perhaps a \nobreak, then reset:
+      \headitemcrhook
+      \global\let\headitemcrhook=\relax
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+       % The first column will be indented with the surrounding text.
+       \advance\hsize by\leftskip
+      \else
+       \ifsetpercent \else
+         % If user has not set preamble in terms of percent of \hsize
+         % we will advance \hsize by \multitablecolspace.
+         \advance\hsize by \multitablecolspace
+       \fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+% Test to see if parskip is larger than space between lines of
+% table. If not, do nothing.
+%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty                      % Nothing found.
+    \let\next\doignoretextzzz
+  \else                                        % Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy          % ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0     % We have just found the outermost @end.
+    \let\next\enddoignore
+  \else                                % Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\-=\active \catcode`\_=\active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\normaldash \let_\normalunderscore
+  }
+}
+
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% Like \expandablevalue, but completely expandable (the \message in the
+% definition above operates at the execution level of TeX).  Used when
+% writing to auxiliary files, due to the expansion that \write does.
+% If flag is undefined, pass through an unexpanded @value command: maybe it
+% will be set by the time it is read back in.
+%
+% NB flag names containing - or _ may not work here.
+\def\dummyvalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \string\value{#1}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% Used for @value's in index entries to form the sort key: expand the @value
+% if possible, otherwise sort late.
+\def\indexnofontsvalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    ZZZZZZZ%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get the special treatment we need for `@end ifset,' we call
+% \makecond and then redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end executes the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
+% without the @) is in fact defined.  We can only feasibly check at the
+% TeX level, so something like `mathcode' is going to considered
+% defined even though it is not a Texinfo command.
+%
+\makecond{ifcommanddefined}
+\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
+%
+\def\doifcmddefined#1#2{{%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname #2\endcsname\relax
+      #1% If not defined, \let\next as above.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
+
+% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
+\makecond{ifcommandnotdefined}
+\def\ifcommandnotdefined{%
+  \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
+\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
+
+% Set the `txicommandconditionals' variable, so documents have a way to
+% test if the @ifcommand...defined conditionals are available.
+\set txicommandconditionals
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named IX.
+% It automatically defines \IXindex such that
+% \IXindex ...rest of line... puts an entry in the index IX.
+% It also defines \IXindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is IX.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \expandafter\chardef\csname#1indfile\endcsname=0
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \expandafter\chardef\csname#1indfile\endcsname=0
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+% The default indices:
+\newindex{cp}%      concepts,
+\newcodeindex{fn}%  functions,
+\newcodeindex{vr}%  variables,
+\newcodeindex{tp}%  types,
+\newcodeindex{ky}%  keys
+\newcodeindex{pg}%  and programs.
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  \requireopenindexfile{#3}%
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all index macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is the two-letter name of the index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
+\def\doindexxxx #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
+\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+
+
+% Used for the aux, toc and index files to prevent expansion of Texinfo
+% commands.
+%
+\def\atdummies{%
+  \definedummyletter\@%
+  \definedummyletter\ %
+  \definedummyletter\{%
+  \definedummyletter\}%
+  \definedummyletter\&%
+  %
+  % Do the redefinitions.
+  \definedummies
+  \otherbackslash
+}
+
+% \definedummyword defines \#1 as \string\#1\space, thus effectively
+% preventing its expansion.  This is used only for control words,
+% not control letters, because the \space would be incorrect for
+% control characters, but is needed to separate the control word
+% from whatever follows.
+%
+% These can be used both for control words that take an argument and
+% those that do not.  If it is followed by {arg} in the input, then
+% that will dutifully get written to the index (or wherever).
+%
+% For control letters, we have \definedummyletter, which omits the
+% space.
+%
+\def\definedummyword  #1{\def#1{\string#1\space}}%
+\def\definedummyletter#1{\def#1{\string#1}}%
+\let\definedummyaccent\definedummyletter
+
+% Called from \atdummies to prevent the expansion of commands.
+%
+\def\definedummies{%
+  %
+  \let\commondummyword\definedummyword
+  \let\commondummyletter\definedummyletter
+  \let\commondummyaccent\definedummyaccent
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  \definedummyletter\-%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\DH
+  \definedummyword\L
+  \definedummyword\O
+  \definedummyword\OE
+  \definedummyword\TH
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\dh
+  \definedummyword\exclamdown
+  \definedummyword\l
+  \definedummyword\o
+  \definedummyword\oe
+  \definedummyword\ordf
+  \definedummyword\ordm
+  \definedummyword\questiondown
+  \definedummyword\ss
+  \definedummyword\th
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\ampchar
+  \definedummyword\atchar
+  \definedummyword\arrow
+  \definedummyword\backslashchar
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\entrybreak
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\geq
+  \definedummyword\guillemetleft
+  \definedummyword\guillemetright
+  \definedummyword\guilsinglleft
+  \definedummyword\guilsinglright
+  \definedummyword\lbracechar
+  \definedummyword\leq
+  \definedummyword\mathopsup
+  \definedummyword\minus
+  \definedummyword\ogonek
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\quotedblbase
+  \definedummyword\quotedblleft
+  \definedummyword\quotedblright
+  \definedummyword\quoteleft
+  \definedummyword\quoteright
+  \definedummyword\quotesinglbase
+  \definedummyword\rbracechar
+  \definedummyword\result
+  \definedummyword\sub
+  \definedummyword\sup
+  \definedummyword\textdegree
+  %
+  \definedummyword\subentry
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  \let\value\dummyvalue
+  %
+  \normalturnoffactive
+}
+
+% \commondummiesnofonts: common to \definedummies and \indexnofonts.
+% Define \commondummyletter, \commondummyaccent and \commondummyword before
+% using.  Used for accents, font commands, and various control letters.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \commondummyletter\!%
+  \commondummyaccent\"%
+  \commondummyaccent\'%
+  \commondummyletter\*%
+  \commondummyaccent\,%
+  \commondummyletter\.%
+  \commondummyletter\/%
+  \commondummyletter\:%
+  \commondummyaccent\=%
+  \commondummyletter\?%
+  \commondummyaccent\^%
+  \commondummyaccent\`%
+  \commondummyaccent\~%
+  \commondummyword\u
+  \commondummyword\v
+  \commondummyword\H
+  \commondummyword\dotaccent
+  \commondummyword\ogonek
+  \commondummyword\ringaccent
+  \commondummyword\tieaccent
+  \commondummyword\ubaraccent
+  \commondummyword\udotaccent
+  \commondummyword\dotless
+  %
+  % Texinfo font commands.
+  \commondummyword\b
+  \commondummyword\i
+  \commondummyword\r
+  \commondummyword\sansserif
+  \commondummyword\sc
+  \commondummyword\slanted
+  \commondummyword\t
+  %
+  % Commands that take arguments.
+  \commondummyword\abbr
+  \commondummyword\acronym
+  \commondummyword\anchor
+  \commondummyword\cite
+  \commondummyword\code
+  \commondummyword\command
+  \commondummyword\dfn
+  \commondummyword\dmn
+  \commondummyword\email
+  \commondummyword\emph
+  \commondummyword\env
+  \commondummyword\file
+  \commondummyword\image
+  \commondummyword\indicateurl
+  \commondummyword\inforef
+  \commondummyword\kbd
+  \commondummyword\key
+  \commondummyword\math
+  \commondummyword\option
+  \commondummyword\pxref
+  \commondummyword\ref
+  \commondummyword\samp
+  \commondummyword\strong
+  \commondummyword\tie
+  \commondummyword\U
+  \commondummyword\uref
+  \commondummyword\url
+  \commondummyword\var
+  \commondummyword\verb
+  \commondummyword\w
+  \commondummyword\xref
+}
+
+\let\indexlbrace\relax
+\let\indexrbrace\relax
+\let\indexatchar\relax
+\let\indexbackslash\relax
+
+{\catcode`\@=0
+\catcode`\\=13
+  @gdef@backslashdisappear{@def\{}}
+}
+
+{
+\catcode`\<=13
+\catcode`\-=13
+\catcode`\`=13
+  \gdef\indexnonalnumdisappear{%
+    \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
+      % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
+      % (Introduced for FSFS 2nd ed.)
+      \let`=\empty
+    \fi
+    %
+    \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
+      \backslashdisappear
+    \fi
+    %
+    \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
+      \def-{}%
+    \fi
+    \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
+      \def<{}%
+    \fi
+    \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
+      \def\@{}%
+    \fi
+  }
+
+  \gdef\indexnonalnumreappear{%
+    \let-\normaldash
+    \let<\normalless
+  }
+}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\commondummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\commondummyletter##1{\let##1\empty}%
+  % All control words become @asis by default; overrides below.
+  \let\commondummyword\commondummyaccent
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  \def\_{\normalunderscore}%
+  \def\-{}% @- shouldn't affect sorting
+  %
+  \uccode`\1=`\{ \uppercase{\def\{{1}}%
+  \uccode`\1=`\} \uppercase{\def\}{1}}%
+  \let\lbracechar\{%
+  \let\rbracechar\}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\DH{DZZ}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\TH{TH}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\dh{dzz}%
+  \def\exclamdown{!}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  \def\o{o}%
+  \def\questiondown{?}%
+  \def\ss{ss}%
+  \def\th{th}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.  \defglyph gives the control sequence a
+  % definition that removes the {} that follows its use.
+  \defglyph\atchar{@}%
+  \defglyph\arrow{->}%
+  \defglyph\bullet{bullet}%
+  \defglyph\comma{,}%
+  \defglyph\copyright{copyright}%
+  \defglyph\dots{...}%
+  \defglyph\enddots{...}%
+  \defglyph\equiv{==}%
+  \defglyph\error{error}%
+  \defglyph\euro{euro}%
+  \defglyph\expansion{==>}%
+  \defglyph\geq{>=}%
+  \defglyph\guillemetleft{<<}%
+  \defglyph\guillemetright{>>}%
+  \defglyph\guilsinglleft{<}%
+  \defglyph\guilsinglright{>}%
+  \defglyph\leq{<=}%
+  \defglyph\lbracechar{\{}%
+  \defglyph\minus{-}%
+  \defglyph\point{.}%
+  \defglyph\pounds{pounds}%
+  \defglyph\print{-|}%
+  \defglyph\quotedblbase{"}%
+  \defglyph\quotedblleft{"}%
+  \defglyph\quotedblright{"}%
+  \defglyph\quoteleft{`}%
+  \defglyph\quoteright{'}%
+  \defglyph\quotesinglbase{,}%
+  \defglyph\rbracechar{\}}%
+  \defglyph\registeredsymbol{R}%
+  \defglyph\result{=>}%
+  \defglyph\textdegree{o}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  %
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  %
+  \macrolist
+  \let\value\indexnofontsvalue
+}
+\def\defglyph#1#2{\def#1##1{#2}} % see above
+
+
+
+
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{%
+  \iflinks
+  {%
+    %
+    \requireopenindexfile{#1}%
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \def\indextext{#2}%
+    \safewhatsit\doindwrite
+  }%
+  \fi
+}
+
+% Check if an index file has been opened, and if not, open it.
+\def\requireopenindexfile#1{%
+\ifnum\csname #1indfile\endcsname=0
+  \expandafter\newwrite \csname#1indfile\endcsname
+  \edef\suffix{#1}%
+  % A .fls suffix would conflict with the file extension for the output
+  % of -recorder, so use .f1s instead.
+  \ifx\suffix\indexisfl\def\suffix{f1}\fi
+  % Open the file
+  \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
+  % Using \immediate above here prevents an object entering into the current
+  % box, which could confound checks such as those in \safewhatsit for
+  % preceding skips.
+  \typeout{Writing index file \jobname.\suffix}%
+\fi}
+\def\indexisfl{fl}
+
+% Definition for writing index entry sort key.
+{
+\catcode`\-=13
+\gdef\indexwritesortas{%
+  \begingroup
+  \indexnonalnumreappear
+  \indexwritesortasxxx}
+\gdef\indexwritesortasxxx#1{%
+  \xdef\indexsortkey{#1}\endgroup}
+}
+
+\def\indexwriteseealso#1{
+  \gdef\pagenumbertext{\string\seealso{#1}}%
+}
+\def\indexwriteseeentry#1{
+  \gdef\pagenumbertext{\string\seeentry{#1}}%
+}
+
+% The default definitions
+\def\sortas#1{}%
+\def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only
+\def\putwordSeeAlso{See also}
+\def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only
+
+
+% Given index entry text like "aaa @subentry bbb @sortas{ZZZ}":
+%   * Set \bracedtext to "{aaa}{bbb}"
+%   * Set \fullindexsortkey to "aaa @subentry ZZZ"
+%   * If @seealso occurs, set \pagenumbertext
+%
+\def\splitindexentry#1{%
+  \gdef\fullindexsortkey{}%
+  \xdef\bracedtext{}%
+  \def\sep{}%
+  \def\seealso##1{}%
+  \def\seeentry##1{}%
+  \expandafter\doindexsegment#1\subentry\finish\subentry
+}
+
+% append the results from the next segment
+\def\doindexsegment#1\subentry{%
+  \def\segment{#1}%
+  \ifx\segment\isfinish
+  \else
+    %
+    % Fully expand the segment, throwing away any @sortas directives, and
+    % trim spaces.
+    \edef\trimmed{\segment}%
+    \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+    %
+    \xdef\bracedtext{\bracedtext{\trimmed}}%
+    %
+    % Get the string to sort by.  Process the segment with all
+    % font commands turned off.
+    \bgroup
+      \let\sortas\indexwritesortas
+      \let\seealso\indexwriteseealso
+      \let\seeentry\indexwriteseeentry
+      \indexnofonts
+      % The braces around the commands are recognized by texindex.
+      \def\lbracechar{{\string\indexlbrace}}%
+      \def\rbracechar{{\string\indexrbrace}}%
+      \let\{=\lbracechar
+      \let\}=\rbracechar
+      \def\@{{\string\indexatchar}}%
+      \def\atchar##1{\@}%
+      \def\backslashchar{{\string\indexbackslash}}%
+      \uccode`\~=`\\ \uppercase{\let~\backslashchar}%
+      %
+      \let\indexsortkey\empty
+      \global\let\pagenumbertext\empty
+      % Execute the segment and throw away the typeset output.  This executes
+      % any @sortas or @seealso commands in this segment.
+      \setbox\dummybox = \hbox{\segment}%
+      \ifx\indexsortkey\empty{%
+        \indexnonalnumdisappear
+        \xdef\trimmed{\segment}%
+        \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+        \xdef\indexsortkey{\trimmed}%
+        \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
+      }\fi
+      %
+      % Append to \fullindexsortkey.
+      \edef\tmp{\gdef\noexpand\fullindexsortkey{%
+                  \fullindexsortkey\sep\indexsortkey}}%
+      \tmp
+    \egroup
+    \def\sep{\subentry}%
+    %
+    \expandafter\doindexsegment
+  \fi
+}
+\def\isfinish{\finish}%
+\newbox\dummybox % used above
+
+\let\subentry\relax
+
+% Use \ instead of @ in index files.  To support old texi2dvi and texindex.
+% This works without changing the escape character used in the toc or aux
+% files because the index entries are fully expanded here, and \string uses
+% the current value of \escapechar.
+\def\escapeisbackslash{\escapechar=`\\}
+
+% Use \ in index files by default.  texi2dvi didn't support @ as the escape
+% character (as it checked for "\entry" in the files, and not "@entry").  When
+% the new version of texi2dvi has had a chance to become more prevalent, then
+% the escape character can change back to @ again.  This should be an easy
+% change to make now because both @ and \ are only used as escape characters in
+% index files, never standing for themselves.
+%
+\set txiindexescapeisbackslash
+
+% Write the entry in \indextext to the index file.
+%
+\def\doindwrite{%
+  \maybemarginindex
+  %
+  \atdummies
+  %
+  \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else
+    \escapeisbackslash
+  \fi
+  %
+  % For texindex which always views { and } as separators.
+  \def\{{\lbracechar{}}%
+  \def\}{\rbracechar{}}%
+  \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}%
+  %
+  % Split the entry into primary entry and any subentries, and get the index
+  % sort key.
+  \splitindexentry\indextext
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  %
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\fullindexsortkey}%
+        {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}%
+        \bracedtext}%
+  }%
+  \temp
+}
+
+% Put the index entry in the margin if desired (undocumented).
+\def\maybemarginindex{%
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}%
+  \fi
+}
+\let\SETmarginindex=\relax
+
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero.  The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{\ifhmode
+  #1%
+ \else
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \whatsitskip = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \whatsitpenalty = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\whatsitskip glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\whatsitskip
+  \fi
+  %
+  #1%
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\whatsitskip
+  \fi
+\fi}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%  \entry {topic}{}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+%  \secondary {subtopic}{}
+%     for a subtopic with sub-subtopics
+%  \tertiary {subtopic}{subsubtopic}{pagelist}
+%     for each sub-subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \plainfrenchspacing
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See comment in \requireopenindexfile.
+  \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
+  %
+  % See if the index file exists and is nonempty.
+  \openin 1 \jobname.\indexname s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+    \typeout{No file \jobname.\indexname s.}%
+  \else
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \thisline
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      \expandafter\printindexzz\thisline\relax\relax\finish%
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% If the index file starts with a backslash, forgo reading the index
+% file altogether.  If somebody upgrades texinfo.tex they may still have
+% old index files using \ as the escape character.  Reading this would
+% at best lead to typesetting garbage, at worst a TeX syntax error.
+\def\printindexzz#1#2\finish{%
+  \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax
+    \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1
+      \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax
+\errmessage{%
+ERROR: A sorted index file in an obsolete format was skipped.
+To fix this problem, please upgrade your version of 'texi2dvi'
+or 'texi2pdf' to that at <https://ftp.gnu.org/gnu/texinfo>.
+If you are using an old version of 'texindex' (part of the Texinfo
+distribution), you may also need to upgrade to a newer version (at least 6.0).
+You may be able to typeset the index if you run
+'texindex \jobname.\indexname' yourself.
+You could also try setting the 'txiindexescapeisbackslash' flag by
+running a command like
+'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'.  If you do
+this, Texinfo will try to use index files in the old format.
+If you continue to have problems, deleting the index files and starting again
+might help (with 'rm \jobname.?? \jobname.??s')%
+}%
+      \else
+        (Skipped sorted index file in obsolete format)
+      \fi
+    \else
+      \begindoublecolumns
+      \input \jobname.\indexname s
+      \enddoublecolumns
+    \fi
+  \else
+    \begindoublecolumns
+    \catcode`\\=0\relax
+    \catcode`\@=12\relax
+    \input \jobname.\indexname s
+    \enddoublecolumns
+  \fi
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
+\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
+\catcode`\$=3
+\gdef\initialglyphs{%
+  % special control sequences used in the index sort key
+  \let\indexlbrace\{%
+  \let\indexrbrace\}%
+  \let\indexatchar\@%
+  \def\indexbackslash{\math{\backslash}}%
+  %
+  % Some changes for non-alphabetic characters.  Using the glyphs from the
+  % math fonts looks more consistent than the typewriter font used elsewhere
+  % for these characters.
+  \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}}
+  %
+  % In case @\ is used for backslash
+  \uppercase{\let\\=~}
+  % Can't get bold backslash so don't use bold forward slash
+  \catcode`\/=13
+  \def/{{\secrmnotbold \normalslash}}%
+  \def-{{\normaldash\normaldash}}% en dash `--'
+  \def^{{\chapbf \normalcaret}}%
+  \def~{{\chapbf \normaltilde}}%
+  \def\_{%
+     \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
+  \def|{$\vert$}%
+  \def<{$\less$}%
+  \def>{$\gtr$}%
+  \def+{$\normalplus$}%
+}}
+
+\def\initial{%
+  \bgroup
+  \initialglyphs
+  \initialx
+}
+
+\def\initialx#1{%
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  % The glue before the bonus allows a little bit of space at the
+  % bottom of a column to reduce an increase in inter-line spacing.
+  \nobreak
+  \vskip 0pt plus 5\baselineskip
+  \penalty -300
+  \vskip 0pt plus -5\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus 1\baselineskip
+  \leftline{\secfonts \kern-0.05em \secbf #1}%
+  % \secfonts is inside the argument of \leftline so that the change of
+  % \baselineskip will not affect any glue inserted before the vbox that
+  % \leftline creates.
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+  \egroup % \initialglyphs
+}
+
+\newdimen\entryrightmargin
+\entryrightmargin=0pt
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+\def\entry{%
+  \begingroup
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % When reading the text of entry, convert explicit line breaks
+    % from @* into spaces.  The user might give these in long section
+    % titles, for instance.
+    \def\*{\unskip\space\ignorespaces}%
+    \def\entrybreak{\hfil\break}% An undocumented command
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\entrybreak{\unskip\space\ignorespaces}%
+\def\doentry{%
+    % Save the text of the entry
+    \global\setbox\boxA=\hbox\bgroup
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+      % Not absorbing as a macro argument reduces the chance of problems
+      % with catcodes occurring.
+}
+{\catcode`\@=11
+\gdef\finishentry#1{%
+    \egroup % end box A
+    \dimen@ = \wd\boxA % Length of text of entry
+    \global\setbox\boxA=\hbox\bgroup
+      \unhbox\boxA
+      % #1 is the page number.
+      %
+      % Get the width of the page numbers, and only use
+      % leaders if they are present.
+      \global\setbox\boxB = \hbox{#1}%
+      \ifdim\wd\boxB = 0pt
+        \null\nobreak\hfill\ %
+      \else
+        %
+        \null\nobreak\indexdotfill % Have leaders before the page number.
+        %
+        \ifpdforxetex
+          \pdfgettoks#1.%
+          \hskip\skip\thinshrinkable\the\toksA
+        \else
+          \hskip\skip\thinshrinkable #1%
+        \fi
+      \fi
+    \egroup % end \boxA
+    \ifdim\wd\boxB = 0pt
+      \noindent\unhbox\boxA\par
+      \nobreak
+    \else\bgroup
+      % We want the text of the entries to be aligned to the left, and the
+      % page numbers to be aligned to the right.
+      %
+      \parindent = 0pt
+      \advance\leftskip by 0pt plus 1fil
+      \advance\leftskip by 0pt plus -1fill
+      \rightskip = 0pt plus -1fil
+      \advance\rightskip by 0pt plus 1fill
+      % Cause last line, which could consist of page numbers on their own
+      % if the list of page numbers is long, to be aligned to the right.
+      \parfillskip=0pt plus -1fill
+      %
+      \advance\rightskip by \entryrightmargin
+      % Determine how far we can stretch into the margin.
+      % This allows, e.g., "Appendix H  GNU Free Documentation License" to
+      % fit on one line in @letterpaper format.
+      \ifdim\entryrightmargin>2.1em
+        \dimen@i=2.1em
+      \else
+        \dimen@i=0em
+      \fi
+      \advance \parfillskip by 0pt minus 1\dimen@i
+      %
+      \dimen@ii = \hsize
+      \advance\dimen@ii by -1\leftskip
+      \advance\dimen@ii by -1\entryrightmargin
+      \advance\dimen@ii by 1\dimen@i
+      \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
+      \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
+        % Try to split the text roughly evenly.  \dimen@ will be the length of
+        % the first line.
+        \dimen@ = 0.7\dimen@
+        \dimen@ii = \hsize
+        \ifnum\dimen@>\dimen@ii
+          % If the entry is too long (for example, if it needs more than
+          % two lines), use all the space in the first line.
+          \dimen@ = \dimen@ii
+        \fi
+        \advance\leftskip by 0pt plus 1fill % ragged right
+        \advance \dimen@ by 1\rightskip
+        \parshape = 2 0pt \dimen@ 0em \dimen@ii
+        % Ideally we'd add a finite glue at the end of the first line only,
+        % instead of using \parshape with explicit line lengths, but TeX
+        % doesn't seem to provide a way to do such a thing.
+        %
+        % Indent all lines but the first one.
+        \advance\leftskip by 1em
+        \advance\parindent by -1em
+      \fi\fi
+      \indent % start paragraph
+      \unhbox\boxA
+      %
+      % Do not prefer a separate line ending with a hyphen to fewer lines.
+      \finalhyphendemerits = 0
+      %
+      % Word spacing - no stretch
+      \spaceskip=\fontdimen2\font minus \fontdimen4\font
+      %
+      \linepenalty=1000  % Discourage line breaks.
+      \hyphenpenalty=5000  % Discourage hyphenation.
+      %
+      \par % format the paragraph
+    \egroup % The \vbox
+    \fi
+  \endgroup
+}}
+
+\newskip\thinshrinkable
+\skip\thinshrinkable=.15em minus .15em
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+% The filll stretch here overpowers both the fil and fill stretch to push
+% the page number to the right.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
+
+
+\def\primary #1{\line{#1\hfil}}
+
+\def\secondary{\indententry{0.5cm}}
+\def\tertiary{\indententry{1cm}}
+
+\def\indententry#1#2#3{%
+  \bgroup
+  \leftskip=#1
+  \entry{#2}{#3}%
+  \egroup
+}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11  % private names
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % If not much space left on page, start a new page.
+  \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
+  %
+  % Grab any single-column material above us.
+  \output = {%
+    \savetopmark
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \advance\vsize by -\ht\partialpage
+  \vsize = 2\vsize
+  %
+  % For the benefit of balancing columns
+  \advance\baselineskip by 0pt plus 0.5pt
+}
+
+% The double-column output routine for all double-column pages except
+% the last, which is done by \balancecolumns.
+%
+\def\doublecolumnout{%
+  %
+  \savetopmark
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@
+  \global\advance\vsize by 2\ht\partialpage
+  \onepageout\pagesofar % empty except for the first time we are called
+  \unvbox\PAGE
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\txipagewidth{\box0\hfil\box2}%
+}
+
+
+% Finished with double columns.
+\def\enddoublecolumns{%
+  % The following penalty ensures that the page builder is exercised
+  % _before_ we change the output routine.  This is necessary in the
+  % following situation:
+  %
+  % The last section of the index consists only of a single entry.
+  % Before this section, \pagetotal is less than \pagegoal, so no
+  % break occurs before the last section starts.  However, the last
+  % section, consisting of \initial and the single \entry, does not
+  % fit on the page and has to be broken off.  Without the following
+  % penalty the page builder will not be exercised until \eject
+  % below, and by that time we'll already have changed the output
+  % routine to the \balancecolumns version, so the next-to-last
+  % double-column page will be processed with \balancecolumns, which
+  % is wrong:  The two columns will go to the main vertical list, with
+  % the broken-off section in the recent contributions.  As soon as
+  % the output routine finishes, TeX starts reconsidering the page
+  % break.  The two columns and the broken-off section both fit on the
+  % page, because the two columns now take up only half of the page
+  % goal.  When TeX sees \eject from below which follows the final
+  % section, it invokes the new output routine that we've set after
+  % \balancecolumns below; \onepageout will try to fit the two columns
+  % and the final section into the vbox of \txipageheight (see
+  % \pagebody), causing an overfull box.
+  %
+  % Note that glue won't work here, because glue does not exercise the
+  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+  \penalty0
+  %
+  \output = {%
+    % Split the last of the double-column material.
+    \savetopmark
+    \balancecolumns
+  }%
+  \eject % call the \output just set
+  \ifdim\pagetotal=0pt
+    % Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.
+    \global\output=\expandafter{\the\defaultoutput}
+    %
+    \endgroup % started in \begindoublecolumns
+    % Leave the double-column material on the current page, no automatic
+    % page break.
+    \box\balancedcolumns
+    %
+    % \pagegoal was set to the doubled \vsize above, since we restarted
+    % the current page.  We're now back to normal single-column
+    % typesetting, so reset \pagegoal to the normal \vsize.
+    \global\vsize = \txipageheight %
+    \pagegoal = \txipageheight %
+  \else
+    % We had some left-over material.  This might happen when \doublecolumnout
+    % is called in \balancecolumns.  Try again.
+    \expandafter\enddoublecolumns
+  \fi
+}
+\newbox\balancedcolumns
+\setbox\balancedcolumns=\vbox{shouldnt see this}%
+%
+% Only called for the last of the double column material.  \doublecolumnout
+% does the others.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \ifdim\dimen@<7\baselineskip
+    % Don't split a short final column in two.
+    \setbox2=\vbox{}%
+    \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+  \else
+    % double the leading vertical space
+    \advance\dimen@ by \topskip
+    \advance\dimen@ by-\baselineskip
+    \divide\dimen@ by 2 % target to split to
+    \dimen@ii = \dimen@
+    \splittopskip = \topskip
+    % Loop until left column is at least as high as the right column.
+    {%
+      \vbadness = 10000
+      \loop
+        \global\setbox3 = \copy0
+        \global\setbox1 = \vsplit3 to \dimen@
+      \ifdim\ht1<\ht3
+        \global\advance\dimen@ by 1pt
+      \repeat
+    }%
+    % Now the left column is in box 1, and the right column in box 3.
+    %
+    % Check whether the left column has come out higher than the page itself.
+    % (Note that we have doubled \vsize for the double columns, so
+    % the actual height of the page is 0.5\vsize).
+    \ifdim2\ht1>\vsize
+      % It appears that we have been called upon to balance too much material.
+      % Output some of it with \doublecolumnout, leaving the rest on the page.
+      \setbox\PAGE=\box0
+      \doublecolumnout
+    \else
+      % Compare the heights of the two columns.
+      \ifdim4\ht1>5\ht3
+        % Column heights are too different, so don't make their bottoms
+        % flush with each other.
+        \setbox2=\vbox to \ht1 {\unvbox3\vfill}%
+        \setbox0=\vbox to \ht1 {\unvbox1\vfill}%
+      \else
+        % Make column bottoms flush with each other.
+        \setbox2=\vbox to\ht1{\unvbox3\unskip}%
+        \setbox0=\vbox to\ht1{\unvbox1\unskip}%
+      \fi
+      \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+    \fi
+  \fi
+  %
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% Let's start with @part.
+\outer\parseargdef\part{\partzzz{#1}}
+\def\partzzz#1{%
+  \chapoddpage
+  \null
+  \vskip.3\vsize  % move it down on the page a bit
+  \begingroup
+    \noindent \titlefonts\rm #1\par % the text
+    \let\lastnode=\empty      % no node to associate with
+    \writetocentry{part}{#1}{}% but put it in the toc
+    \headingsoff              % no headline or footline on the part page
+    % This outputs a mark at the end of the page that clears \thischapter
+    % and \thissection, as is done in \startcontents.
+    \let\pchapsepmacro\relax
+    \chapmacro{}{Yomitfromtoc}{}%
+    \chapoddpage
+  \endgroup
+}
+
+% \unnumberedno is an oxymoron.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter.  Page headings and footings can use
+% these.  @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achieve this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unnlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unnlevel
+      \chardef\unnlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+       \errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unnlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unnlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+       \unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+         \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+         \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  % \putwordChapter can contain complex things in translations.
+  \toks0=\expandafter{\putwordChapter}%
+  \message{\the\toks0 \space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
+%
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  % \putwordAppendix can contain complex things in translations.
+  \toks0=\expandafter{\putwordAppendix}%
+  \message{\the\toks0 \space \appendixletter}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% normally unnmhead0 calls unnumberedzzz:
+\outer\parseargdef\unnumbered{\unnmhead0{#1}}
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+%
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+% normally calls appendixsectionzzz:
+\outer\parseargdef\appendixsection{\apphead1{#1}}
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+% normally calls unnumberedseczzz:
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+%
+% normally calls numberedsubseczzz:
+\outer\parseargdef\numberedsubsec{\numhead2{#1}}
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+% normally calls appendixsubseczzz:
+\outer\parseargdef\appendixsubsec{\apphead2{#1}}
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+% normally calls unnumberedsubseczzz:
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+%
+% normally numberedsubsubseczzz:
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally appendixsubsubseczzz:
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally unnumberedsubsubseczzz:
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  \vbox{\chapfonts \raggedtitlesettings #1\par}%
+  \nobreak\bigskip \nobreak
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+% Parameter controlling skip before chapter headings (if needed)
+\newskip\chapheadingskip
+
+% Define plain chapter starts, and page on/off switching for it.
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+
+% Start a new page
+\def\chappager{\par\vfill\supereject}
+
+% \chapoddpage - start on an odd page for a new chapter
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong.  But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+  \chappager
+  \ifodd\pageno \else
+    \begingroup
+      \headingsoff
+      \null
+      \chappager
+    \endgroup
+  \fi
+}
+
+\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% \chapmacro - Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+% Not used for @heading series.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yappendixkeyword{Yappendix}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+%
+\def\chapmacro#1#2#3{%
+  \expandafter\ifx\thisenv\titlepage\else
+    \checkenv{}% chapters, etc., should not start inside an environment.
+  \fi
+  % Insert the first mark before the heading break (see notes for \domark).
+  \let\prevchapterdefs=\currentchapterdefs
+  \let\prevsectiondefs=\currentsectiondefs
+  \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+                        \gdef\thissection{}}%
+  %
+  \def\temptype{#2}%
+  \ifx\temptype\Ynothingkeyword
+    \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{\thischaptername}}%
+  \else\ifx\temptype\Yomitfromtockeyword
+    \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{}}%
+  \else\ifx\temptype\Yappendixkeyword
+    \toks0={#1}%
+    \xdef\currentchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\appendixletter}%
+      % \noexpand\putwordAppendix avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \else
+    \toks0={#1}%
+    \xdef\currentchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\the\chapno}%
+      % \noexpand\putwordChapter avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \fi\fi\fi
+  %
+  % Output the mark.  Pass it through \safewhatsit, to take care of
+  % the preceding space.
+  \safewhatsit\domark
+  %
+  % Insert the chapter heading break.
+  \pchapsepmacro
+  %
+  % Now the second mark, after the heading break.  No break points
+  % between here and the heading.
+  \let\prevchapterdefs=\currentchapterdefs
+  \let\prevsectiondefs=\currentsectiondefs
+  \domark
+  %
+  {%
+    \chapfonts \rm
+    \let\footnote=\errfootnoteheading % give better error message
+    %
+    % Have to define \currentsection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\currentsection{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \nobreak % Avoid page breaks at the interline glue.
+    \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text of the title,
+% #2 is the section level (sec/subsec/subsubsec),
+% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
+% #4 is the section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    % It is ok for the @heading series commands to appear inside an
+    % environment (it's been historically allowed, though the logic is
+    % dubious), but not the others.
+    \ifx\temptype\Yomitfromtockeyword\else
+      \checkenv{}% non-@*heading should not be in an environment.
+    \fi
+    \let\footnote=\errfootnoteheading
+    %
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert first mark before the heading break (see notes for \domark).
+    \let\prevsectiondefs=\currentsectiondefs
+    \ifx\temptype\Ynothingkeyword
+      \ifx\sectionlevel\seckeyword
+        \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+                              \gdef\thissection{\thissectionname}}%
+      \fi
+    \else\ifx\temptype\Yomitfromtockeyword
+      % Don't redefine \thissection.
+    \else\ifx\temptype\Yappendixkeyword
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\currentsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \else
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\currentsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \fi\fi\fi
+    %
+    % Go into vertical mode.  Usually we'll already be there, but we
+    % don't want the following whatsit to end up in a preceding paragraph
+    % if the document didn't happen to have a blank line.
+    \par
+    %
+    % Output the mark.  Pass it through \safewhatsit, to take care of
+    % the preceding space.
+    \safewhatsit\domark
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Now the second mark, after the heading break.  No break points
+    % between here and the heading.
+    \global\let\prevsectiondefs=\currentsectiondefs
+    \domark
+    %
+    % Only insert the space after the number if we have a section number.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\currentsection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \currentsection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\currentsection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\currentsection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)  However, when a paragraph is not started next
+  % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
+  % or the negative glue will cause weirdly wrong output, typically
+  % obscuring the section heading with something else.
+  \vskip-\parskip
+  %
+  % This is so the last item on the main vertical list is a known
+  % \penalty > 10000, so \startdefun, etc., can recognize the situation
+  % and do the needful.
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdforxetex
+    \global\pdfmakepagedesttrue
+  \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \entryrightmargin=\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref.  We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\partentry = \shortpartentry
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Parts, in the main contents.  Replace the part number, which doesn't
+% exist, with an empty box.  Let's hope all the numbers have the same width.
+% Also ignore the page number, which is conventionally not printed.
+\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
+\def\partentry#1#2#3#4{%
+  % Add stretch and a bonus for breaking the page before the part heading.
+  % This reduces the chance of the page being broken immediately after the
+  % part heading, before a following chapter heading.
+  \vskip 0pt plus 5\baselineskip
+  \penalty-300
+  \vskip 0pt plus -5\baselineskip
+  \dochapentry{\numeralbox\labelspace#1}{}%
+}
+%
+% Parts, in the short toc.
+\def\shortpartentry#1#2#3#4{%
+  \penalty-300
+  \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
+  \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
+}
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     % Move the page numbers slightly to the right
+     \advance\entryrightmargin by -0.05em
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @tex ... @end tex    escapes into raw TeX temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain @ character.
+
+\envdef\tex{%
+  \setupmarkupstyle{tex}%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \catcode `\`=\other
+  \catcode `\'=\other
+  %
+  % ' is active in math mode (mathcode"8000).  So reset it, and all our
+  % other math active characters (just in case), to plain's definitions.
+  \mathactive
+  %
+  % Inverse of the list at the beginning of the file.
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\sp=\ptexsp
+  \let\*=\ptexstar
+  %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
+  \let\t=\ptext
+  \expandafter \let\csname top\endcsname=\ptextop  % we've made it outer
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      \ifnum\lastpenalty<10000
+        % Penalize breaking before the environment, because preceding text
+        % often leads into it.
+        \penalty100
+      \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\def\afterenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+% only require the font if @cartouche is actually used
+\def\cartouchefontdefs{%
+  \font\circle=lcircle10\relax
+  \circthick=\fontdimen8\circle
+}
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+
+
+\envdef\cartouche{%
+  \cartouchefontdefs
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+                               % side, and for 6pt waste from
+                               % each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  %
+  % If this cartouche directly follows a sectioning command, we need the
+  % \parskip glue (backspaced over by default) or the cartouche can
+  % collide with the section heading.
+  \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
+  %
+  \setbox\groupbox=\vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+         \hskip\lskip
+         \vrule\kern3pt
+         \vbox\bgroup
+             \kern3pt
+             \hsize=\cartinner
+             \baselineskip=\normbskip
+             \lineskip=\normlskip
+             \parskip=\normpskip
+             \vskip -\parskip
+             \comment % For explanation, see the end of def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+             \kern3pt
+         \egroup
+         \kern3pt\vrule
+         \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \addgroupbox
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+  \aboveenvbreak
+  \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  % Turn off paragraph indentation but redefine \indent to emulate
+  % the normal \indent.
+  \nonfillparindent=\parindent
+  \parindent = 0pt
+  \let\indent\nonfillindent
+  %
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    % end paragraph for sake of leading, in case document has no blank
+    % line.  This is redundant with what happens in \aboveenvbreak, but
+    % we need to do it before changing the fonts, and it's inconvenient
+    % to change the fonts afterward.
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it in one command.  #1 is the env name, #2 the definition.
+\def\makedispenvdef#1#2{%
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two environment synonyms (#1 and #2) for an environment.
+\def\maketwodispenvdef#1#2#3{%
+  \makedispenvdef{#1}{#3}%
+  \makedispenvdef{#2}{#3}%
+}
+%
+% @lisp: indented, narrowed, typewriter font;
+% @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvdef{lisp}{example}{%
+  \nonfillstart
+  \tt\setupmarkupstyle{example}%
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenvdef{display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenvdef{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill\relax
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification.  From plain.tex.
+\envdef\raggedright{%
+  \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+  \parindent=0pt \leftskip0pt plus2em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\makedispenvdef{quotation}{\quotationstart}
+%
+\def\quotationstart{%
+  \indentedblockstart % same as \indentedblock, but increase right margin too.
+  \ifx\nonarrowing\relax
+    \advance\rightskip by \lispnarrowing
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\thisisundefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallquotation{\Equotation}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+% @indentedblock is like @quotation, but indents only on the left and
+% has no optional argument.
+%
+\makedispenvdef{indentedblock}{\indentedblockstart}
+%
+\def\indentedblockstart{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+}
+
+% Keep a nonzero parskip for the environment, since we're doing normal filling.
+%
+\def\Eindentedblock{%
+  \par
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallindentedblock{\Eindentedblock}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+  % Don't do the quotes -- if we do, @set txicodequoteundirected and
+  % @set txicodequotebacktick will not have effect on @verb and
+  % @verbatim, and ?` and !` ligatures won't get disabled.
+  %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \setupmarkupstyle{verb}%
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion.
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+% We typeset each line of the verbatim in an \hbox, so we can handle
+% tabs.  The \global is in case the verbatim line starts with an accent,
+% or some other command that starts with a begin-group.  Otherwise, the
+% entire \verbbox would disappear at the corresponding end-group, before
+% it is typeset.  Meanwhile, we can't have nested verbatim commands
+% (can we?), so the \global won't be overwriting itself.
+\newbox\verbbox
+\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+%
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
+      \divide\dimen\verbbox by\tabw
+      \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
+      \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
+      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+    }%
+  }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \tt % easiest (and conventionally used) font for verbatim
+  % The \leavevmode here is for blank lines.  Otherwise, we would
+  % never \starttabbox and the \egroup would end verbatim mode.
+  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+  \tabexpand
+  \setupmarkupstyle{verbatim}%
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count.
+  % Must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    {%
+      \indexnofonts       % Allow `@@' and other weird things in file names.
+      \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
+      \edef\tmp{\noexpand\input #1 }
+      \expandafter
+    }\tmp
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+    \defunpenalty=10003 % Will keep this @deffn together with the
+                        % following @def command, see below.
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \printdefunline, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    %
+    % As a further refinement, we avoid "club" headers by signalling
+    % with penalty of 10003 after the very first @deffn in the
+    % sequence (see above), and penalty of 10002 after any following
+    % @def command.
+    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil\relax
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \doingtypefnfalse    % distinguish typed functions from all else
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+\newif\ifdoingtypefn       % doing typed function?
+\newif\ifrettypeownline    % typeset return type on its own line?
+
+% @deftypefnnewline on|off says whether the return type of typed functions
+% are printed on their own line.  This affects @deftypefn, @deftypefun,
+% @deftypeop, and @deftypemethod.
+%
+\parseargdef\deftypefnnewline{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @txideftypefnnl value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% \dosubind {index}{topic}{subtopic}
+%
+% If SUBTOPIC is present, precede it with a space, and call \doind.
+% (At some time during the 20th century, this made a two-level entry in an
+% index such as the operation index.  Nobody seemed to notice the change in
+% behaviour though.)
+\def\dosubind#1#2#3{%
+  \def\thirdarg{#3}%
+  \ifx\thirdarg\empty
+    \doind{#1}{#2}%
+  \else
+    \doind{#1}{#2\space#3}%
+  \fi
+}
+
+% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \doingtypefntrue
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+% Types:
+
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  \par
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % Determine if we are typesetting the return type of a typed function
+  % on a line by itself.
+  \rettypeownlinefalse
+  \ifdoingtypefn  % doing a typed function specifically?
+    % then check user option for putting return type on its own line:
+    \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
+      \rettypeownlinetrue
+    \fi
+  \fi
+  %
+  % How we'll format the category name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.  We'll always have at
+  % least two.
+  \tempnum = 2
+  %
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  %
+  % If doing a return type on its own line, we'll have another line.
+  \ifrettypeownline
+    \advance\tempnum by 1
+    \def\maybeshapeline{0in \hsize}%
+  \else
+    \def\maybeshapeline{}%
+  \fi
+  %
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  %
+  % The final paragraph shape:
+  \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
+  %
+  % Put the category name at the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% text of the return type
+    \ifx\temp\empty\else
+      \tclose{\temp}% typeset the return type
+      \ifrettypeownline
+        % put return type on its own line; prohibit line break following:
+        \hfil\vadjust{\nobreak}\break
+      \else
+        \space  % type on same line, so just followed by a space
+      \fi
+    \fi           % no return type
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \rmfont
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  We used to recommend @var for that, so
+  % leave the code in, but it's strange for @var to lead to typewriter.
+  % Nowadays we recommend @code, since the difference between a ttsl hyphen
+  % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
+  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+\let\ampchar\&
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+  \message{Warning: unbalanced parentheses in @def...}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \message{Warning: unbalanced square brackets in @def...}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\thisisundefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+% Used at the time of macro expansion.
+% Argument is macro body with arguments substituted
+\def\scanmacro#1{%
+  \newlinechar`\^^M
+  \def\xeatspaces{\eatspaces}%
+  %
+  % Process the macro body under the current catcode regime.
+  \scantokens{#1@comment}%
+  %
+  % The \comment is to remove the \newlinechar added by \scantokens, and
+  % can be noticed by \parsearg.  Note \c isn't used because this means cedilla
+  % in math mode.
+}
+
+% Used for copying and captions
+\def\scanexp#1{%
+  \expandafter\scanmacro\expandafter{#1}%
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \commondummyword\macro1\commondummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\commondummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \
+% to recognize macro arguments; this is the job of \mbodybackslash.
+%
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion.  Must do this non-globally, to
+% confine the change to the current group.
+%
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+%
+\def\scanctxt{% used as subroutine
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+  \passthroughcharstrue
+}
+
+\def\scanargctxt{% used for copying and captions, not macros.
+  \scanctxt
+  \catcode`\@=\other
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{% used for @macro definitions
+  \scanctxt
+  \catcode`\ =\other
+  \catcode`\@=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+% Used when scanning braced macro arguments.  Note, however, that catcode
+% changes here are ineffectual if the macro invocation was nested inside
+% an argument to another Texinfo command.
+\def\macroargctxt{%
+  \scanctxt
+  \catcode`\ =\active
+  \catcode`\@=\other
+  \catcode`\^^M=\other
+  \catcode`\\=\active
+}
+
+\def\macrolineargctxt{% used for whole-line arguments without braces
+  \scanctxt
+  \catcode`\@=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+%
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\margbackslash#1{\char`\#1 }
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}% now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0\relax
+  \else
+     \expandafter\parsemargdef \argl;%
+     \if\paramno>256\relax
+       \ifx\eTeXversion\thisisundefined
+         \errhelp = \EMsimple
+         \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
+       \fi
+     \fi
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\commondummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\commondummyword \noexpand#1%
+  \fi
+}
+
+% \getargs -- Parse the arguments to a @macro line.  Set \macname to
+% the name of the macro, and \argl to the braced argument list.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname#1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+% This made use of the feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+
+% Parse the optional {params} list to @macro or @rmacro.
+% Set \paramno to the number of arguments,
+% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
+% three-param macro.)  Define \macarg.BLAH for each BLAH in the params
+% list to some hook where the argument is to be expanded.  If there are
+% less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.
+%
+% That gets used by \mbodybackslash (above).
+%
+% If there are 10 or more arguments, a different technique is used: see
+% \parsemmanyargdef.
+%
+\def\parsemargdef#1;{%
+  \paramno=0\def\paramlist{}%
+  \let\hash\relax
+  % \hash is redefined to `#' later to get it into definitions
+  \let\xeatspaces\relax
+  \parsemargdefxxx#1,;,%
+  \ifnum\paramno<10\relax\else
+    \paramno0\relax
+    \parsemmanyargdef@@#1,;,% 10 or more arguments
+  \fi
+}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% \parsemacbody, \parsermacbody
+%
+% Read recursive and nonrecursive macro bodies. (They're different since
+% rec and nonrec macros end differently.)
+%
+% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro
+% body to be transformed.
+% Set \macrobody to the body of the macro, and call \defmacro.
+%
+{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+
+% Make @ a letter, so that we can make private-to-Texinfo macro names.
+\edef\texiatcatcode{\the\catcode`\@}
+\catcode `@=11\relax
+
+%%%%%%%%%%%%%% Code for > 10 arguments only   %%%%%%%%%%%%%%%%%%
+
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef the body (nothing else will expand because of
+% the catcode regime under which the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, no macro can have more than 256 arguments (else error).
+%
+% In case that there are 10 or more arguments we parse again the arguments
+% list to set new definitions for the \macarg.BLAH macros corresponding to
+% each BLAH argument. It was anyhow needed to parse already once this list
+% in order to count the arguments, and as macros with at most 9 arguments
+% are by far more frequent than macro with 10 or more arguments, defining
+% twice the \macarg.BLAH macros does not cost too much processing power.
+\def\parsemmanyargdef@@#1,{%
+  \if#1;\let\next=\relax
+  \else
+    \let\next=\parsemmanyargdef@@
+    \edef\tempb{\eatspaces{#1}}%
+    \expandafter\def\expandafter\tempa
+       \expandafter{\csname macarg.\tempb\endcsname}%
+    % Note that we need some extra \noexpand\noexpand, this is because we
+    % don't want \the  to be expanded in the \parsermacbody  as it uses an
+    % \xdef .
+    \expandafter\edef\tempa
+      {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+    \advance\paramno by 1\relax
+  \fi\next}
+
+
+\let\endargs@\relax
+\let\nil@\relax
+\def\nilm@{\nil@}%
+\long\def\nillm@{\nil@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition.  It gets all the arguments' values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
+\def\getargvals@#1#2#3{%
+  \def\macargdeflist@{}%
+  \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
+  \def\paramlist{#2,\nil@}%
+  \def\macroname{#1}%
+  \begingroup
+  \macroargctxt
+  \def\argvaluelist{#3,\nil@}%
+  \def\@tempa{#3}%
+  \ifx\@tempa\empty
+    \setemptyargvalues@
+  \else
+    \getargvals@@
+  \fi
+}
+\def\getargvals@@{%
+  \ifx\paramlist\nilm@
+      % Some sanity check needed here that \argvaluelist is also empty.
+      \ifx\argvaluelist\nillm@
+      \else
+        \errhelp = \EMsimple
+        \errmessage{Too many arguments in macro `\macroname'!}%
+      \fi
+      \let\next\macargexpandinbody@
+  \else
+    \ifx\argvaluelist\nillm@
+       % No more arguments values passed to macro.  Set remaining named-arg
+       % macros to empty.
+       \let\next\setemptyargvalues@
+    \else
+      % pop current arg name into \@tempb
+      \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\paramlist}%
+       % pop current argument value into \@tempc
+      \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\argvaluelist}%
+       % Here \@tempb is the current arg name and \@tempc is the current arg value.
+       % First place the new argument macro definition into \@tempd
+       \expandafter\macname\expandafter{\@tempc}%
+       \expandafter\let\csname macarg.\@tempb\endcsname\relax
+       \expandafter\def\expandafter\@tempe\expandafter{%
+         \csname macarg.\@tempb\endcsname}%
+       \edef\@tempd{\long\def\@tempe{\the\macname}}%
+       \push@\@tempd\macargdeflist@
+       \let\next\getargvals@@
+    \fi
+  \fi
+  \next
+}
+
+\def\push@#1#2{%
+  \expandafter\expandafter\expandafter\def
+  \expandafter\expandafter\expandafter#2%
+  \expandafter\expandafter\expandafter{%
+  \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro \@tempa.
+%
+\def\macvalstoargs@{%
+  %  To do this we use the property that token registers that are \the'ed
+  % within an \edef  expand only once. So we are going to place all argument
+  % values into respective token registers.
+  %
+  % First we save the token context, and initialize argument numbering.
+  \begingroup
+    \paramno0\relax
+    % Then, for each argument number #N, we place the corresponding argument
+    % value into a new token list register \toks#N
+    \expandafter\putargsintokens@\saveparamlist@,;,%
+    % Then, we expand the body so that argument are replaced by their
+    % values. The trick for values not to be expanded themselves is that they
+    % are within tokens and that tokens expand only once in an \edef .
+    \edef\@tempc{\csname mac.\macroname .body\endcsname}%
+    % Now we restore the token stack pointer to free the token list registers
+    % which we have used, but we make sure that expanded body is saved after
+    % group.
+    \expandafter
+  \endgroup
+  \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
+  }
+
+% Define the named-macro outside of this group and then close this group.
+%
+\def\macargexpandinbody@{%
+  \expandafter
+  \endgroup
+  \macargdeflist@
+  % First the replace in body the macro arguments by their values, the result
+  % is in \@tempa .
+  \macvalstoargs@
+  % Then we point at the \norecurse or \gobble (for recursive) macro value
+  % with \@tempb .
+  \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
+  % Depending on whether it is recursive or not, we need some tailing
+  % \egroup .
+  \ifx\@tempb\gobble
+     \let\@tempc\relax
+  \else
+     \let\@tempc\egroup
+  \fi
+  % And now we do the real job:
+  \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
+  \@tempd
+}
+
+\def\putargsintokens@#1,{%
+  \if#1;\let\next\relax
+  \else
+    \let\next\putargsintokens@
+    % First we allocate the new token list register, and give it a temporary
+    % alias \@tempb .
+    \toksdef\@tempb\the\paramno
+    % Then we place the argument value into that token list register.
+    \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
+    \expandafter\@tempb\expandafter{\@tempa}%
+    \advance\paramno by 1\relax
+  \fi
+  \next
+}
+
+% Trailing missing arguments are set to empty.
+%
+\def\setemptyargvalues@{%
+  \ifx\paramlist\nilm@
+    \let\next\macargexpandinbody@
+  \else
+    \expandafter\setemptyargvaluesparser@\paramlist\endargs@
+    \let\next\setemptyargvalues@
+  \fi
+  \next
+}
+
+\def\setemptyargvaluesparser@#1,#2\endargs@{%
+  \expandafter\def\expandafter\@tempa\expandafter{%
+    \expandafter\def\csname macarg.#1\endcsname{}}%
+  \push@\@tempa\macargdeflist@
+  \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
+\def\pop@#1#2#3,#4\endargs@{%
+   \def#1{#3}%
+   \def#2{#4}%
+}
+\long\def\longpop@#1#2#3,#4\endargs@{%
+   \long\def#1{#3}%
+   \long\def#2{#4}%
+}
+
+
+%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
+
+
+% This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
+%    \macrobody has the body of the macro in it, with placeholders for
+% its parameters, looking like "\xeatspaces{\hash 1}".
+%    \paramno is the number of parameters
+%    \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
+% There are four cases: macros of zero, one, up to nine, and many arguments.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in: @include reads the file inside a group.
+%
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifnum\paramno=1
+    \def\xeatspaces##1{##1}%
+    % This removes the pair of braces around the argument.  We don't
+    % use \eatspaces, because this can cause ends of lines to be lost
+    % when the argument to \eatspaces is read, leading to line-based
+    % commands like "@itemize" not being read correctly.
+  \else
+    \let\xeatspaces\relax % suppress expansion
+  \fi
+  \ifcase\paramno
+  % 0
+    \expandafter\xdef\csname\the\macname\endcsname{%
+      \bgroup
+        \noexpand\spaceisspace
+        \noexpand\endlineisspace
+        \noexpand\expandafter % skip any whitespace after the macro name.
+        \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+    \expandafter\xdef\csname\the\macname @@@\endcsname{%
+      \egroup
+      \noexpand\scanmacro{\macrobody}}%
+  \or % 1
+    \expandafter\xdef\csname\the\macname\endcsname{%
+       \bgroup
+       \noexpand\braceorline
+       \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+    \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+      \egroup
+      \noexpand\scanmacro{\macrobody}%
+      }%
+  \else % at most 9
+    \ifnum\paramno<10\relax
+      % @MACNAME sets the context for reading the macro argument
+      % @MACNAME@@ gets the argument, processes backslashes and appends a
+      % comma.
+      % @MACNAME@@@ removes braces surrounding the argument list.
+      % @MACNAME@@@@ scans the macro body with arguments substituted.
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \bgroup
+        \noexpand\expandafter  % This \expandafter skip any spaces after the
+        \noexpand\macroargctxt % macro before we change the catcode of space.
+        \noexpand\expandafter
+        \expandafter\noexpand\csname\the\macname @@\endcsname}%
+      \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+          \noexpand\passargtomacro
+          \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+      \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname @@@@\endcsname\paramlist{%
+          \egroup\noexpand\scanmacro{\macrobody}}%
+    \else % 10 or more:
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\getargvals@{\the\macname}{\argl}%
+      }%
+      \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+      \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
+    \fi
+  \fi}
+
+\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+{\catcode`\@=0 \catcode`\\=13  % We need to manipulate \ so use @ as escape
+@catcode`@_=11  % private names
+@catcode`@!=11  % used as argument separator
+
+% \passargtomacro#1#2 -
+% Call #1 with a list of tokens #2, with any doubled backslashes in #2
+% compressed to one.
+%
+% This implementation works by expansion, and not execution (so we cannot use
+% \def or similar).  This reduces the risk of this failing in contexts where
+% complete expansion is done with no execution (for example, in writing out to
+% an auxiliary file for an index entry).
+%
+% State is kept in the input stream: the argument passed to
+% @look_ahead, @gobble_and_check_finish and @add_segment is
+%
+% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input)
+%
+% where:
+% THE_MACRO - name of the macro we want to call
+% ARG_RESULT - argument list we build to pass to that macro
+% PENDING_BS - either a backslash or nothing
+% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
+
+@gdef@passargtomacro#1#2{%
+  @add_segment #1!{}@relax#2\@_finish\%
+}
+@gdef@_finish{@_finishx} @global@let@_finishx@relax
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 used to look ahead
+%
+% If the next token is not a backslash, process the rest of the argument;
+% otherwise, remove the next token.
+@gdef@look_ahead#1!#2#3#4{%
+  @ifx#4\%
+   @expandafter@gobble_and_check_finish
+  @else
+   @expandafter@add_segment
+  @fi#1!{#2}#4#4%
+}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 should be a backslash, which is gobbled.
+% #5 looks ahead
+%
+% Double backslash found.  Add a single backslash, and look ahead.
+@gdef@gobble_and_check_finish#1!#2#3#4#5{%
+  @add_segment#1\!{}#5#5%
+}
+
+@gdef@is_fi{@fi}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 is input stream until next backslash
+%
+% Input stream is either at the start of the argument, or just after a
+% backslash sequence, either a lone backslash, or a doubled backslash.
+% NEXT_TOKEN contains the first token in the input stream: if it is \finish,
+% finish; otherwise, append to ARG_RESULT the segment of the argument up until
+% the next backslash.  PENDING_BACKSLASH contains a backslash to represent
+% a backslash just before the start of the input stream that has not been
+% added to ARG_RESULT.
+@gdef@add_segment#1!#2#3#4\{%
+@ifx#3@_finish
+  @call_the_macro#1!%
+@else
+  % append the pending backslash to the result, followed by the next segment
+  @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
+  % this @fi is discarded by @look_ahead.
+  % we can't get rid of it with \expandafter because we don't know how
+  % long #4 is.
+}
+
+% #1 - THE_MACRO
+% #2 - ARG_RESULT
+% #3 discards the res of the conditional in @add_segment, and @is_fi ends the
+% conditional.
+@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
+
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \braceorline MAC is used for a one-argument macro MAC.  It checks
+% whether the next non-whitespace character is a {.  It sets the context
+% for reading the argument (slightly different in the two cases).  Then,
+% to read the argument, in the whole-line case, it then calls the regular
+% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
+%
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup
+    \macroargctxt
+    \expandafter\passargtomacro
+  \else
+    \macrolineargctxt\expandafter\parsearg
+  \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Make them active and then expand them all to nothing.
+%
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{%
+  \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}\omittopnode}
+
+% Used so that the @top node doesn't have to be wrapped in an @ifnottex
+% conditional.
+% \doignore goes to more effort to skip nested conditionals but we don't need
+% that here.
+\def\omittopnode{%
+   \ifx\lastnode\wordTop
+   \expandafter\ignorenode\fi
+}
+\def\wordTop{Top}
+
+% Until the next @node or @bye command, divert output to a box that is not
+% output.
+\def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}%
+\ignorenodebye
+}
+
+{\let\bye\relax
+\gdef\ignorenodebye{\let\bye\ignorenodebyedef}
+\gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}}
+% The redefinition of \bye here is because it is declared \outer
+
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \currentsection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \requireauxfile
+      \atdummies  % preserve commands, but don't expand them
+      % match definition in \xrdef, \refx, \xrefX.
+      \def\value##1{##1}%
+      \edef\writexrdef##1##2{%
+       \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+         ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\currentsection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
+    }%
+  \fi
+}
+
+% @xrefautosectiontitle on|off says whether @section(ing) names are used
+% automatically in xrefs, if the third arg is not explicitly specified.
+% This was provided as a "secret" @set xref-automatic-section-title
+% variable, now it's official.
+%
+\parseargdef\xrefautomaticsectiontitle{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+%
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref{\putwordsee{} \xrefXX}
+\def\xref{\putwordSee{} \xrefXX}
+\def\ref{\xrefXX}
+
+\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
+\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
+%
+\newbox\toprefbox
+\newbox\printedrefnamebox
+\newbox\infofilenamebox
+\newbox\printedmanualbox
+%
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  %
+  % Get args without leading/trailing spaces.
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
+  %
+  \def\infofilename{\ignorespaces #4}%
+  \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
+  %
+  \def\printedmanual{\ignorespaces #5}%
+  \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
+  %
+  % If the printed reference name (arg #3) was not explicitly given in
+  % the @xref, figure out what we want to use.
+  \ifdim \wd\printedrefnamebox = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
+      % Not auto section-title: use node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Auto section-title: use chapter/section title inside
+      % the square brackets if we have it.
+      \ifdim \wd\printedmanualbox > 0pt
+        % It is in another manual, so we don't have it; use node name.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We (should) know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    % For pdfTeX and LuaTeX
+    {\indexnofonts
+     \makevalueexpandable
+     \turnoffactive
+     % This expands tokens, so do it after making catcode changes, so _
+     % etc. don't get their TeX definitions.  This ignores all spaces in
+     % #4, including (wrongly) those in the middle of the filename.
+     \getfilename{#4}%
+     %
+     % This (wrongly) does not take account of leading or trailing
+     % spaces in #1, which should be ignored.
+     \setpdfdestname{#1}%
+     %
+     \ifx\pdfdestname\empty
+       \def\pdfdestname{Top}% no empty targets
+     \fi
+     %
+     \leavevmode
+     \startlink attr{/Border [0 0 0]}%
+     \ifnum\filenamelength>0
+       goto file{\the\filename.pdf} name{\pdfdestname}%
+     \else
+       goto name{\pdfmkpgn{\pdfdestname}}%
+     \fi
+    }%
+    \setcolor{\linkcolor}%
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+    \else
+      % For XeTeX
+      {\indexnofonts
+       \makevalueexpandable
+       \turnoffactive
+       % This expands tokens, so do it after making catcode changes, so _
+       % etc. don't get their TeX definitions.  This ignores all spaces in
+       % #4, including (wrongly) those in the middle of the filename.
+       \getfilename{#4}%
+       %
+       % This (wrongly) does not take account of leading or trailing
+       % spaces in #1, which should be ignored.
+       \setpdfdestname{#1}%
+       %
+       \ifx\pdfdestname\empty
+         \def\pdfdestname{Top}% no empty targets
+       \fi
+       %
+       \leavevmode
+       \ifnum\filenamelength>0
+         % With default settings,
+         % XeTeX (xdvipdfmx) replaces link destination names with integers.
+         % In this case, the replaced destination names of
+         % remote PDFs are no longer known.  In order to avoid a replacement,
+         % you can use xdvipdfmx's command line option `-C 0x0010'.
+         % If you use XeTeX 0.99996+ (TeX Live 2016+),
+         % this command line option is no longer necessary
+         % because we can use the `dvipdfmx:config' special.
+         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+           << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%
+       \else
+         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+           << /S /GoTo /D (\pdfdestname) >> >>}%
+       \fi
+      }%
+      \setcolor{\linkcolor}%
+    \fi
+  \fi
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \def\value##1{##1}%
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  \iffloat distinguishes them by
+  % \Xthisreftitle being set to a magic string.
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd\printedrefnamebox = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % If the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd\printedmanualbox > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    %
+    % If we use \unhbox to print the node names, TeX does not insert
+    % empty discretionaries after hyphens, which means that it will not
+    % find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens,
+    % this is a loss.  Therefore, we give the text of the node name
+    % again, so it is as if TeX is seeing it for the first time.
+    %
+    \ifdim \wd\printedmanualbox > 0pt
+      % Cross-manual reference with a printed manual name.
+      %
+      \crossmanualxref{\cite{\printedmanual\unskip}}%
+    %
+    \else\ifdim \wd\infofilenamebox > 0pt
+      % Cross-manual reference with only an info filename (arg 4), no
+      % printed manual name (arg 5).  This is essentially the same as
+      % the case above; we output the filename, since we have nothing else.
+      %
+      \crossmanualxref{\code{\infofilename\unskip}}%
+    %
+    \else
+      % Reference within this manual.
+      %
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via the macro below so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+      % Add a , if xref followed by a space
+      \if\space\noexpand\tokenafterxref ,%
+      \else\ifx\       \tokenafterxref ,% @TAB
+      \else\ifx\*\tokenafterxref ,%   @*
+      \else\ifx\ \tokenafterxref ,%   @SPACE
+      \else\ifx\
+                \tokenafterxref ,%    @NL
+      \else\ifx\tie\tokenafterxref ,% @tie
+      \fi\fi\fi\fi\fi\fi
+    \fi\fi
+  \fi
+  \endlink
+\endgroup}
+
+% Output a cross-manual xref to #1.  Used just above (twice).
+%
+% Only include the text "Section ``foo'' in" if the foo is neither
+% missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
+% "see The Foo Manual", the idea being to refer to the whole manual.
+%
+% But, this being TeX, we can't easily compare our node name against the
+% string "Top" while ignoring the possible spaces before and after in
+% the input.  By adding the arbitrary 7sp below, we make it much less
+% likely that a real node name would have the same width as "Top" (e.g.,
+% in a monospaced font).  Hopefully it will never happen in practice.
+%
+% For the same basic reason, we retypeset the "Top" at every
+% reference, since the current font is indeterminate.
+%
+\def\crossmanualxref#1{%
+  \setbox\toprefbox = \hbox{Top\kern7sp}%
+  \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
+  \ifdim \wd2 > 7sp  % nonempty?
+    \ifdim \wd2 = \wd\toprefbox \else  % same as Top?
+      \putwordSection{} ``\printedrefname'' \putwordin{}\space
+    \fi
+  \fi
+  #1%
+}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX
+% is output afterwards if non-empty.
+\def\refx#1#2{%
+  \requireauxfile
+  {%
+    \indexnofonts
+    \otherbackslash
+    \def\value##1{##1}%
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        {\toks0 = {#1}% avoid expansion of possibly-complex value
+         \message{\linenumber Undefined cross reference `\the\toks0'.}}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Define a control
+% sequence for a cross-reference target (we prepend XR to the control sequence
+% name to avoid collisions).  The value is the page number.  If this is a float
+% type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  {% Expand the node or anchor name to remove control sequences.
+   % \turnoffactive stops 8-bit characters being changed to commands
+   % like @'e.  \refx does the same to retrieve the value in the definition.
+    \indexnofonts
+    \turnoffactive
+    \def\value##1{##1}%
+    \xdef\safexrefname{#1}%
+  }%
+  %
+  \bgroup
+    \expandafter\gdef\csname XR\safexrefname\endcsname{#2}%
+  \egroup
+  % We put the \gdef inside a group to avoid the definitions building up on
+  % TeX's save stack, which can cause it to run out of space for aux files with
+  % thousands of lines.  \gdef doesn't use the save stack, but \csname does
+  % when it defines an unknown control sequence as \relax.
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR\safexrefname\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+      {\safexrefname}}%
+  \fi
+}
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate at the beginning of the file.
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% Used when writing to the aux file, or when using data from it.
+\def\requireauxfile{%
+  \iflinks
+    \tryauxfile
+    % Open the new aux file.  TeX will close it automatically at exit.
+    \immediate\openout\auxfile=\jobname.aux
+  \fi
+  \global\let\requireauxfile=\relax   % Only do this once.
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  \catcode`\\=\active
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for Info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  %
+  % Nested footnotes are not supported in TeX, that would take a lot
+  % more work.  (\startsavinginserts does not suffice.)
+  \let\footnote=\errfootnotenest
+  %
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\txipagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  %
+  % Invoke rest of plain TeX footnote routine.
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+\def\errfootnotenest{%
+  \errhelp=\EMsimple
+  \errmessage{Nested footnotes not supported in texinfo.tex,
+    even though they work in makeinfo; sorry}
+}
+
+\def\errfootnoteheading{%
+  \errhelp=\EMsimple
+  \errmessage{Footnotes in chapters, sections, etc., are not supported}
+}
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+%
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\thisisundefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+  \else \ifx\centersub\centerV
+    % for @center @image, we need a vbox so we can have our vertical space
+    \imagevmodetrue
+    \vbox\bgroup % vbox has better behavior than vtop herev
+  \fi\fi
+  %
+  \ifimagevmode
+    \nobreak\medskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+  \fi
+  %
+  % Leave vertical mode so that indentation from an enclosing
+  %  environment such as @quotation is respected.
+  % However, if we're at the top level, we don't want the
+  %  normal paragraph indentation.
+  % On the other hand, if we are in the case of @center @image, we don't
+  %  want to start a paragraph, which will create a hsize-width box and
+  %  eradicate the centering.
+  \ifx\centersub\centerV\else \noindent \fi
+  %
+  % Output the image.
+  \ifpdf
+    % For pdfTeX and LuaTeX <= 0.80
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      % For epsf.tex
+      % \epsfbox itself resets \epsf?size at each figure.
+      \setbox0 = \hbox{\ignorespaces #2}%
+        \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+      \setbox0 = \hbox{\ignorespaces #3}%
+        \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+      \epsfbox{#1.eps}%
+    \else
+      % For XeTeX
+      \doxeteximage{#1}{#2}{#3}%
+    \fi
+  \fi
+  %
+  \ifimagevmode
+    \medskip  % space after a standalone image
+  \fi
+  \ifx\centersub\centerV \egroup \fi
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \currentsection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\currentsection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+        \appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \requireauxfile
+        \atdummies
+        %
+        \ifx\thisshortcaption\empty
+          \def\gtemp{\thiscaption}%
+        \else
+          \def\gtemp{\thisshortcaption}%
+        \fi
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+          \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \currentsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+
+\message{localization,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding.  Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+  \catcode`\_ = \active
+  \globaldefs=1
+\parseargdef\documentlanguage{%
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file by the name they passed if it exists.
+    \let_ = \normalunderscore  % normal _ character for filename test
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \documentlanguagetrywithoutunderscore #1_\finish
+    \else
+      \globaldefs = 1  % everything in the txi-LL files needs to persist
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup % end raw TeX
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+  \openin 1 txi-#1.tex
+  \ifeof 1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+  \else
+    \globaldefs = 1  % everything in the txi-LL files needs to persist
+    \input txi-#1.tex
+  \fi
+  \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages.  This means we can support hyphenation in
+% Texinfo, at least to some extent.  (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+  % do not set the language if the name is undefined in the current TeX.
+  \expandafter\ifx\csname lang@#1\endcsname \relax
+    \message{no patterns for #1}%
+  \else
+    \global\language = \csname lang@#1\endcsname
+  \fi
+  % but there is no harm in adjusting the hyphenmin values regardless.
+  \global\lefthyphenmin = #2\relax
+  \global\righthyphenmin = #3\relax
+}
+
+% XeTeX and LuaTeX can handle Unicode natively.
+% Their default I/O uses UTF-8 sequences instead of a byte-wise operation.
+% Other TeX engines' I/O (pdfTeX, etc.) is byte-wise.
+%
+\newif\iftxinativeunicodecapable
+\newif\iftxiusebytewiseio
+
+\ifx\XeTeXrevision\thisisundefined
+  \ifx\luatexversion\thisisundefined
+    \txinativeunicodecapablefalse
+    \txiusebytewiseiotrue
+  \else
+    \txinativeunicodecapabletrue
+    \txiusebytewiseiofalse
+  \fi
+\else
+  \txinativeunicodecapabletrue
+  \txiusebytewiseiofalse
+\fi
+
+% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex
+% for non-UTF-8 (byte-wise) encodings.
+%
+\def\setbytewiseio{%
+  \ifx\XeTeXrevision\thisisundefined
+  \else
+    \XeTeXdefaultencoding "bytes"  % For subsequent files to be read
+    \XeTeXinputencoding "bytes"  % For document root file
+    % Unfortunately, there seems to be no corresponding XeTeX command for
+    % output encoding.  This is a problem for auxiliary index and TOC files.
+    % The only solution would be perhaps to write out @U{...} sequences in
+    % place of non-ASCII characters.
+  \fi
+
+  \ifx\luatexversion\thisisundefined
+  \else
+    \directlua{
+    local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub
+    local function convert_char (char)
+      return utf8_char(byte(char))
+    end
+
+    local function convert_line (line)
+      return gsub(line, ".", convert_char)
+    end
+
+    callback.register("process_input_buffer", convert_line)
+
+    local function convert_line_out (line)
+      local line_out = ""
+      for c in string.utfvalues(line) do
+         line_out = line_out .. string.char(c)
+      end
+      return line_out
+    end
+
+    callback.register("process_output_buffer", convert_line_out)
+    }
+  \fi
+
+  \txiusebytewiseiotrue
+}
+
+
+% Helpers for encodings.
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \global\catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
+\def\documentencodingzzz#1{%
+  %
+  % Encoding being declared for the document.
+  \def\declaredencoding{\csname #1.enc\endcsname}%
+  %
+  % Supported encodings: names converted to tokens in order to be able
+  % to compare them with \ifx.
+  \def\ascii{\csname US-ASCII.enc\endcsname}%
+  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+  \def\latone{\csname ISO-8859-1.enc\endcsname}%
+  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+  \def\utfeight{\csname UTF-8.enc\endcsname}%
+  %
+  \ifx \declaredencoding \ascii
+     \asciichardefs
+  %
+  \else \ifx \declaredencoding \lattwo
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \lattwochardefs
+  %
+  \else \ifx \declaredencoding \latone
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \latonechardefs
+  %
+  \else \ifx \declaredencoding \latnine
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \latninechardefs
+  %
+  \else \ifx \declaredencoding \utfeight
+     \iftxinativeunicodecapable
+       % For native Unicode handling (XeTeX and LuaTeX)
+       \nativeunicodechardefs
+     \else
+       % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX)
+       \setnonasciicharscatcode\active
+       % since we already invoked \utfeightchardefs at the top level
+       % (below), do not re-invoke it, otherwise our check for duplicated
+       % definitions gets triggered.  Making non-ascii chars active is
+       % sufficient.
+     \fi
+  %
+  \else
+    \message{Ignoring unknown document encoding: #1.}%
+  %
+  \fi % utfeight
+  \fi % latnine
+  \fi % latone
+  \fi % lattwo
+  \fi % ascii
+  %
+  \ifx\XeTeXrevision\thisisundefined
+  \else
+    \ifx \declaredencoding \utfeight
+    \else
+      \ifx \declaredencoding \ascii
+      \else
+        \message{Warning: XeTeX with non-UTF-8 encodings cannot handle %
+        non-ASCII characters in auxiliary files.}%
+      \fi
+    \fi
+  \fi
+}
+
+% emacs-page
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing, sorry: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+
+\def\gdefchar#1#2{%
+\gdef#1{%
+   \ifpassthroughchars
+     \string#1%
+   \else
+     #2%
+   \fi
+}}
+
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+  \gdefchar^^a0{\tie}
+  \gdefchar^^a1{\exclamdown}
+  \gdefchar^^a2{{\tcfont \char162}} % cent
+  \gdefchar^^a3{\pounds{}}
+  \gdefchar^^a4{{\tcfont \char164}} % currency
+  \gdefchar^^a5{{\tcfont \char165}} % yen
+  \gdefchar^^a6{{\tcfont \char166}} % broken bar
+  \gdefchar^^a7{\S}
+  \gdefchar^^a8{\"{}}
+  \gdefchar^^a9{\copyright{}}
+  \gdefchar^^aa{\ordf}
+  \gdefchar^^ab{\guillemetleft{}}
+  \gdefchar^^ac{\ensuremath\lnot}
+  \gdefchar^^ad{\-}
+  \gdefchar^^ae{\registeredsymbol{}}
+  \gdefchar^^af{\={}}
+  %
+  \gdefchar^^b0{\textdegree}
+  \gdefchar^^b1{$\pm$}
+  \gdefchar^^b2{$^2$}
+  \gdefchar^^b3{$^3$}
+  \gdefchar^^b4{\'{}}
+  \gdefchar^^b5{$\mu$}
+  \gdefchar^^b6{\P}
+  \gdefchar^^b7{\ensuremath\cdot}
+  \gdefchar^^b8{\cedilla\ }
+  \gdefchar^^b9{$^1$}
+  \gdefchar^^ba{\ordm}
+  \gdefchar^^bb{\guillemetright{}}
+  \gdefchar^^bc{$1\over4$}
+  \gdefchar^^bd{$1\over2$}
+  \gdefchar^^be{$3\over4$}
+  \gdefchar^^bf{\questiondown}
+  %
+  \gdefchar^^c0{\`A}
+  \gdefchar^^c1{\'A}
+  \gdefchar^^c2{\^A}
+  \gdefchar^^c3{\~A}
+  \gdefchar^^c4{\"A}
+  \gdefchar^^c5{\ringaccent A}
+  \gdefchar^^c6{\AE}
+  \gdefchar^^c7{\cedilla C}
+  \gdefchar^^c8{\`E}
+  \gdefchar^^c9{\'E}
+  \gdefchar^^ca{\^E}
+  \gdefchar^^cb{\"E}
+  \gdefchar^^cc{\`I}
+  \gdefchar^^cd{\'I}
+  \gdefchar^^ce{\^I}
+  \gdefchar^^cf{\"I}
+  %
+  \gdefchar^^d0{\DH}
+  \gdefchar^^d1{\~N}
+  \gdefchar^^d2{\`O}
+  \gdefchar^^d3{\'O}
+  \gdefchar^^d4{\^O}
+  \gdefchar^^d5{\~O}
+  \gdefchar^^d6{\"O}
+  \gdefchar^^d7{$\times$}
+  \gdefchar^^d8{\O}
+  \gdefchar^^d9{\`U}
+  \gdefchar^^da{\'U}
+  \gdefchar^^db{\^U}
+  \gdefchar^^dc{\"U}
+  \gdefchar^^dd{\'Y}
+  \gdefchar^^de{\TH}
+  \gdefchar^^df{\ss}
+  %
+  \gdefchar^^e0{\`a}
+  \gdefchar^^e1{\'a}
+  \gdefchar^^e2{\^a}
+  \gdefchar^^e3{\~a}
+  \gdefchar^^e4{\"a}
+  \gdefchar^^e5{\ringaccent a}
+  \gdefchar^^e6{\ae}
+  \gdefchar^^e7{\cedilla c}
+  \gdefchar^^e8{\`e}
+  \gdefchar^^e9{\'e}
+  \gdefchar^^ea{\^e}
+  \gdefchar^^eb{\"e}
+  \gdefchar^^ec{\`{\dotless i}}
+  \gdefchar^^ed{\'{\dotless i}}
+  \gdefchar^^ee{\^{\dotless i}}
+  \gdefchar^^ef{\"{\dotless i}}
+  %
+  \gdefchar^^f0{\dh}
+  \gdefchar^^f1{\~n}
+  \gdefchar^^f2{\`o}
+  \gdefchar^^f3{\'o}
+  \gdefchar^^f4{\^o}
+  \gdefchar^^f5{\~o}
+  \gdefchar^^f6{\"o}
+  \gdefchar^^f7{$\div$}
+  \gdefchar^^f8{\o}
+  \gdefchar^^f9{\`u}
+  \gdefchar^^fa{\'u}
+  \gdefchar^^fb{\^u}
+  \gdefchar^^fc{\"u}
+  \gdefchar^^fd{\'y}
+  \gdefchar^^fe{\th}
+  \gdefchar^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+  % Encoding is almost identical to Latin1.
+  \latonechardefs
+  %
+  \gdefchar^^a4{\euro{}}
+  \gdefchar^^a6{\v S}
+  \gdefchar^^a8{\v s}
+  \gdefchar^^b4{\v Z}
+  \gdefchar^^b8{\v z}
+  \gdefchar^^bc{\OE}
+  \gdefchar^^bd{\oe}
+  \gdefchar^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+  \gdefchar^^a0{\tie}
+  \gdefchar^^a1{\ogonek{A}}
+  \gdefchar^^a2{\u{}}
+  \gdefchar^^a3{\L}
+  \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdefchar^^a5{\v L}
+  \gdefchar^^a6{\'S}
+  \gdefchar^^a7{\S}
+  \gdefchar^^a8{\"{}}
+  \gdefchar^^a9{\v S}
+  \gdefchar^^aa{\cedilla S}
+  \gdefchar^^ab{\v T}
+  \gdefchar^^ac{\'Z}
+  \gdefchar^^ad{\-}
+  \gdefchar^^ae{\v Z}
+  \gdefchar^^af{\dotaccent Z}
+  %
+  \gdefchar^^b0{\textdegree{}}
+  \gdefchar^^b1{\ogonek{a}}
+  \gdefchar^^b2{\ogonek{ }}
+  \gdefchar^^b3{\l}
+  \gdefchar^^b4{\'{}}
+  \gdefchar^^b5{\v l}
+  \gdefchar^^b6{\'s}
+  \gdefchar^^b7{\v{}}
+  \gdefchar^^b8{\cedilla\ }
+  \gdefchar^^b9{\v s}
+  \gdefchar^^ba{\cedilla s}
+  \gdefchar^^bb{\v t}
+  \gdefchar^^bc{\'z}
+  \gdefchar^^bd{\H{}}
+  \gdefchar^^be{\v z}
+  \gdefchar^^bf{\dotaccent z}
+  %
+  \gdefchar^^c0{\'R}
+  \gdefchar^^c1{\'A}
+  \gdefchar^^c2{\^A}
+  \gdefchar^^c3{\u A}
+  \gdefchar^^c4{\"A}
+  \gdefchar^^c5{\'L}
+  \gdefchar^^c6{\'C}
+  \gdefchar^^c7{\cedilla C}
+  \gdefchar^^c8{\v C}
+  \gdefchar^^c9{\'E}
+  \gdefchar^^ca{\ogonek{E}}
+  \gdefchar^^cb{\"E}
+  \gdefchar^^cc{\v E}
+  \gdefchar^^cd{\'I}
+  \gdefchar^^ce{\^I}
+  \gdefchar^^cf{\v D}
+  %
+  \gdefchar^^d0{\DH}
+  \gdefchar^^d1{\'N}
+  \gdefchar^^d2{\v N}
+  \gdefchar^^d3{\'O}
+  \gdefchar^^d4{\^O}
+  \gdefchar^^d5{\H O}
+  \gdefchar^^d6{\"O}
+  \gdefchar^^d7{$\times$}
+  \gdefchar^^d8{\v R}
+  \gdefchar^^d9{\ringaccent U}
+  \gdefchar^^da{\'U}
+  \gdefchar^^db{\H U}
+  \gdefchar^^dc{\"U}
+  \gdefchar^^dd{\'Y}
+  \gdefchar^^de{\cedilla T}
+  \gdefchar^^df{\ss}
+  %
+  \gdefchar^^e0{\'r}
+  \gdefchar^^e1{\'a}
+  \gdefchar^^e2{\^a}
+  \gdefchar^^e3{\u a}
+  \gdefchar^^e4{\"a}
+  \gdefchar^^e5{\'l}
+  \gdefchar^^e6{\'c}
+  \gdefchar^^e7{\cedilla c}
+  \gdefchar^^e8{\v c}
+  \gdefchar^^e9{\'e}
+  \gdefchar^^ea{\ogonek{e}}
+  \gdefchar^^eb{\"e}
+  \gdefchar^^ec{\v e}
+  \gdefchar^^ed{\'{\dotless{i}}}
+  \gdefchar^^ee{\^{\dotless{i}}}
+  \gdefchar^^ef{\v d}
+  %
+  \gdefchar^^f0{\dh}
+  \gdefchar^^f1{\'n}
+  \gdefchar^^f2{\v n}
+  \gdefchar^^f3{\'o}
+  \gdefchar^^f4{\^o}
+  \gdefchar^^f5{\H o}
+  \gdefchar^^f6{\"o}
+  \gdefchar^^f7{$\div$}
+  \gdefchar^^f8{\v r}
+  \gdefchar^^f9{\ringaccent u}
+  \gdefchar^^fa{\'u}
+  \gdefchar^^fb{\H u}
+  \gdefchar^^fc{\"u}
+  \gdefchar^^fd{\'y}
+  \gdefchar^^fe{\cedilla t}
+  \gdefchar^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions.  It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+  \ifx #1\relax
+    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+  \else
+    \expandafter #1%
+  \fi
+}
+
+% Give non-ASCII bytes the active definitions for processing UTF-8 sequences
+\begingroup
+  \catcode`\~13
+  \catcode`\$12
+  \catcode`\"12
+
+  % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp
+  % substituting ~ and $ with a character token of that value.
+  \def\UTFviiiLoop{%
+    \global\catcode\countUTFx\active
+    \uccode`\~\countUTFx
+    \uccode`\$\countUTFx
+    \uppercase\expandafter{\UTFviiiTmp}%
+    \advance\countUTFx by 1
+    \ifnum\countUTFx < \countUTFy
+      \expandafter\UTFviiiLoop
+    \fi}
+
+  % For bytes other than the first in a UTF-8 sequence.  Not expected to
+  % be expanded except when writing to auxiliary files.
+  \countUTFx = "80
+  \countUTFy = "C2
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "C2
+  \countUTFy = "E0
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "E0
+  \countUTFy = "F0
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "F0
+  \countUTFy = "F4
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiFourOctets\expandafter$\fi
+        }}%
+  \UTFviiiLoop
+\endgroup
+
+\def\globallet{\global\let} % save some \expandafter's below
+
+% @U{xxxx} to produce U+xxxx, if we support it.
+\def\U#1{%
+  \expandafter\ifx\csname uni:#1\endcsname \relax
+    \iftxinativeunicodecapable
+      % All Unicode characters can be used if native Unicode handling is
+      % active.  However, if the font does not have the glyph,
+      % letters are missing.
+      \begingroup
+        \uccode`\.="#1\relax
+        \uppercase{.}
+      \endgroup
+    \else
+      \errhelp = \EMsimple
+      \errmessage{Unicode character U+#1 not supported, sorry}%
+    \fi
+  \else
+    \csname uni:#1\endcsname
+  \fi
+}
+
+% These macros are used here to construct the name of a control
+% sequence to be defined.
+\def\UTFviiiTwoOctetsName#1#2{%
+  \csname u8:#1\string #2\endcsname}%
+\def\UTFviiiThreeOctetsName#1#2#3{%
+  \csname u8:#1\string #2\string #3\endcsname}%
+\def\UTFviiiFourOctetsName#1#2#3#4{%
+  \csname u8:#1\string #2\string #3\string #4\endcsname}%
+
+% For UTF-8 byte sequences (TeX, e-TeX and pdfTeX),
+% provide a definition macro to replace a Unicode character;
+% this gets used by the @U command
+%
+\begingroup
+  \catcode`\"=12
+  \catcode`\<=12
+  \catcode`\.=12
+  \catcode`\,=12
+  \catcode`\;=12
+  \catcode`\!=12
+  \catcode`\~=13
+  \gdef\DeclareUnicodeCharacterUTFviii#1#2{%
+    \countUTFz = "#1\relax
+    \begingroup
+      \parseXMLCharref
+
+      % Give \u8:... its definition.  The sequence of seven \expandafter's
+      % expands after the \gdef three times, e.g.
+      %
+      % 1.  \UTFviiTwoOctetsName B1 B2
+      % 2.  \csname u8:B1 \string B2 \endcsname
+      % 3.  \u8: B1 B2  (a single control sequence token)
+      %
+      \expandafter\expandafter
+      \expandafter\expandafter
+      \expandafter\expandafter
+      \expandafter\gdef       \UTFviiiTmp{#2}%
+      %
+      \expandafter\ifx\csname uni:#1\endcsname \relax \else
+       \message{Internal error, already defined: #1}%
+      \fi
+      %
+      % define an additional control sequence for this code point.
+      \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
+    \endgroup}
+  %
+  % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
+  % to the corresponding UTF-8 sequence.
+  \gdef\parseXMLCharref{%
+    \ifnum\countUTFz < "A0\relax
+      \errhelp = \EMsimple
+      \errmessage{Cannot define Unicode char value < 00A0}%
+    \else\ifnum\countUTFz < "800\relax
+      \parseUTFviiiA,%
+      \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
+    \else\ifnum\countUTFz < "10000\relax
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
+    \else
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiA!%
+      \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
+    \fi\fi\fi
+  }
+
+  % Extract a byte from the end of the UTF-8 representation of \countUTFx.
+  % It must be a non-initial byte in the sequence.
+  % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
+  % of the bytes.
+  \gdef\parseUTFviiiA#1{%
+    \countUTFx = \countUTFz
+    \divide\countUTFz by 64
+    \countUTFy = \countUTFz  % Save to be the future value of \countUTFz.
+    \multiply\countUTFz by 64
+
+    % \countUTFz is now \countUTFx with the last 5 bits cleared.  Subtract
+    % in order to get the last five bits.
+    \advance\countUTFx by -\countUTFz
+
+    % Convert this to the byte in the UTF-8 sequence.
+    \advance\countUTFx by 128
+    \uccode `#1\countUTFx
+    \countUTFz = \countUTFy}
+
+  % Used to put a UTF-8 byte sequence into \UTFviiiTmp
+  % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
+  %    sequence.
+  % #2 is one of the \UTFviii*OctetsName macros.
+  % #3 is always a full stop (.)
+  % #4 is a template for the other bytes in the sequence.  The values for these
+  %    bytes is substituted in here with \uppercase using the \uccode's.
+  \gdef\parseUTFviiiB#1#2#3#4{%
+    \advance\countUTFz by "#10\relax
+    \uccode `#3\countUTFz
+    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro that sets a catcode to `other' non-globally
+%
+\def\DeclareUnicodeCharacterNativeOther#1#2{%
+  \catcode"#1=\other
+}
+
+% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
+% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
+% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
+% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
+% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
+%
+% Many of our renditions are less than wonderful, and all the missing
+% characters are available somewhere.  Loading the necessary fonts
+% awaits user request.  We can't truly support Unicode without
+% reimplementing everything that's been done in LaTeX for many years,
+% plus probably using luatex or xetex, and who knows what else.
+% We won't be doing that here in this simple file.  But we can try to at
+% least make most of the characters not bomb out.
+%
+\def\unicodechardefs{%
+  \DeclareUnicodeCharacter{00A0}{\tie}%
+  \DeclareUnicodeCharacter{00A1}{\exclamdown}%
+  \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
+  \DeclareUnicodeCharacter{00A3}{\pounds{}}%
+  \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
+  \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
+  \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
+  \DeclareUnicodeCharacter{00A7}{\S}%
+  \DeclareUnicodeCharacter{00A8}{\"{ }}%
+  \DeclareUnicodeCharacter{00A9}{\copyright{}}%
+  \DeclareUnicodeCharacter{00AA}{\ordf}%
+  \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}%
+  \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}%
+  \DeclareUnicodeCharacter{00AD}{\-}%
+  \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
+  \DeclareUnicodeCharacter{00AF}{\={ }}%
+  %
+  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%
+  \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
+  \DeclareUnicodeCharacter{00B2}{$^2$}%
+  \DeclareUnicodeCharacter{00B3}{$^3$}%
+  \DeclareUnicodeCharacter{00B4}{\'{ }}%
+  \DeclareUnicodeCharacter{00B5}{$\mu$}%
+  \DeclareUnicodeCharacter{00B6}{\P}%
+  \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}%
+  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}%
+  \DeclareUnicodeCharacter{00B9}{$^1$}%
+  \DeclareUnicodeCharacter{00BA}{\ordm}%
+  \DeclareUnicodeCharacter{00BB}{\guillemetright{}}%
+  \DeclareUnicodeCharacter{00BC}{$1\over4$}%
+  \DeclareUnicodeCharacter{00BD}{$1\over2$}%
+  \DeclareUnicodeCharacter{00BE}{$3\over4$}%
+  \DeclareUnicodeCharacter{00BF}{\questiondown}%
+  %
+  \DeclareUnicodeCharacter{00C0}{\`A}%
+  \DeclareUnicodeCharacter{00C1}{\'A}%
+  \DeclareUnicodeCharacter{00C2}{\^A}%
+  \DeclareUnicodeCharacter{00C3}{\~A}%
+  \DeclareUnicodeCharacter{00C4}{\"A}%
+  \DeclareUnicodeCharacter{00C5}{\AA}%
+  \DeclareUnicodeCharacter{00C6}{\AE}%
+  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}%
+  \DeclareUnicodeCharacter{00C8}{\`E}%
+  \DeclareUnicodeCharacter{00C9}{\'E}%
+  \DeclareUnicodeCharacter{00CA}{\^E}%
+  \DeclareUnicodeCharacter{00CB}{\"E}%
+  \DeclareUnicodeCharacter{00CC}{\`I}%
+  \DeclareUnicodeCharacter{00CD}{\'I}%
+  \DeclareUnicodeCharacter{00CE}{\^I}%
+  \DeclareUnicodeCharacter{00CF}{\"I}%
+  %
+  \DeclareUnicodeCharacter{00D0}{\DH}%
+  \DeclareUnicodeCharacter{00D1}{\~N}%
+  \DeclareUnicodeCharacter{00D2}{\`O}%
+  \DeclareUnicodeCharacter{00D3}{\'O}%
+  \DeclareUnicodeCharacter{00D4}{\^O}%
+  \DeclareUnicodeCharacter{00D5}{\~O}%
+  \DeclareUnicodeCharacter{00D6}{\"O}%
+  \DeclareUnicodeCharacter{00D7}{\ensuremath\times}%
+  \DeclareUnicodeCharacter{00D8}{\O}%
+  \DeclareUnicodeCharacter{00D9}{\`U}%
+  \DeclareUnicodeCharacter{00DA}{\'U}%
+  \DeclareUnicodeCharacter{00DB}{\^U}%
+  \DeclareUnicodeCharacter{00DC}{\"U}%
+  \DeclareUnicodeCharacter{00DD}{\'Y}%
+  \DeclareUnicodeCharacter{00DE}{\TH}%
+  \DeclareUnicodeCharacter{00DF}{\ss}%
+  %
+  \DeclareUnicodeCharacter{00E0}{\`a}%
+  \DeclareUnicodeCharacter{00E1}{\'a}%
+  \DeclareUnicodeCharacter{00E2}{\^a}%
+  \DeclareUnicodeCharacter{00E3}{\~a}%
+  \DeclareUnicodeCharacter{00E4}{\"a}%
+  \DeclareUnicodeCharacter{00E5}{\aa}%
+  \DeclareUnicodeCharacter{00E6}{\ae}%
+  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}%
+  \DeclareUnicodeCharacter{00E8}{\`e}%
+  \DeclareUnicodeCharacter{00E9}{\'e}%
+  \DeclareUnicodeCharacter{00EA}{\^e}%
+  \DeclareUnicodeCharacter{00EB}{\"e}%
+  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}%
+  %
+  \DeclareUnicodeCharacter{00F0}{\dh}%
+  \DeclareUnicodeCharacter{00F1}{\~n}%
+  \DeclareUnicodeCharacter{00F2}{\`o}%
+  \DeclareUnicodeCharacter{00F3}{\'o}%
+  \DeclareUnicodeCharacter{00F4}{\^o}%
+  \DeclareUnicodeCharacter{00F5}{\~o}%
+  \DeclareUnicodeCharacter{00F6}{\"o}%
+  \DeclareUnicodeCharacter{00F7}{\ensuremath\div}%
+  \DeclareUnicodeCharacter{00F8}{\o}%
+  \DeclareUnicodeCharacter{00F9}{\`u}%
+  \DeclareUnicodeCharacter{00FA}{\'u}%
+  \DeclareUnicodeCharacter{00FB}{\^u}%
+  \DeclareUnicodeCharacter{00FC}{\"u}%
+  \DeclareUnicodeCharacter{00FD}{\'y}%
+  \DeclareUnicodeCharacter{00FE}{\th}%
+  \DeclareUnicodeCharacter{00FF}{\"y}%
+  %
+  \DeclareUnicodeCharacter{0100}{\=A}%
+  \DeclareUnicodeCharacter{0101}{\=a}%
+  \DeclareUnicodeCharacter{0102}{\u{A}}%
+  \DeclareUnicodeCharacter{0103}{\u{a}}%
+  \DeclareUnicodeCharacter{0104}{\ogonek{A}}%
+  \DeclareUnicodeCharacter{0105}{\ogonek{a}}%
+  \DeclareUnicodeCharacter{0106}{\'C}%
+  \DeclareUnicodeCharacter{0107}{\'c}%
+  \DeclareUnicodeCharacter{0108}{\^C}%
+  \DeclareUnicodeCharacter{0109}{\^c}%
+  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}%
+  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}%
+  \DeclareUnicodeCharacter{010C}{\v{C}}%
+  \DeclareUnicodeCharacter{010D}{\v{c}}%
+  \DeclareUnicodeCharacter{010E}{\v{D}}%
+  \DeclareUnicodeCharacter{010F}{d'}%
+  %
+  \DeclareUnicodeCharacter{0110}{\DH}%
+  \DeclareUnicodeCharacter{0111}{\dh}%
+  \DeclareUnicodeCharacter{0112}{\=E}%
+  \DeclareUnicodeCharacter{0113}{\=e}%
+  \DeclareUnicodeCharacter{0114}{\u{E}}%
+  \DeclareUnicodeCharacter{0115}{\u{e}}%
+  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}%
+  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}%
+  \DeclareUnicodeCharacter{0118}{\ogonek{E}}%
+  \DeclareUnicodeCharacter{0119}{\ogonek{e}}%
+  \DeclareUnicodeCharacter{011A}{\v{E}}%
+  \DeclareUnicodeCharacter{011B}{\v{e}}%
+  \DeclareUnicodeCharacter{011C}{\^G}%
+  \DeclareUnicodeCharacter{011D}{\^g}%
+  \DeclareUnicodeCharacter{011E}{\u{G}}%
+  \DeclareUnicodeCharacter{011F}{\u{g}}%
+  %
+  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}%
+  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}%
+  \DeclareUnicodeCharacter{0122}{\cedilla{G}}%
+  \DeclareUnicodeCharacter{0123}{\cedilla{g}}%
+  \DeclareUnicodeCharacter{0124}{\^H}%
+  \DeclareUnicodeCharacter{0125}{\^h}%
+  \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}%
+  \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}%
+  \DeclareUnicodeCharacter{0128}{\~I}%
+  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}%
+  \DeclareUnicodeCharacter{012A}{\=I}%
+  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}%
+  \DeclareUnicodeCharacter{012C}{\u{I}}%
+  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}%
+  \DeclareUnicodeCharacter{012E}{\ogonek{I}}%
+  \DeclareUnicodeCharacter{012F}{\ogonek{i}}%
+  %
+  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}%
+  \DeclareUnicodeCharacter{0131}{\dotless{i}}%
+  \DeclareUnicodeCharacter{0132}{IJ}%
+  \DeclareUnicodeCharacter{0133}{ij}%
+  \DeclareUnicodeCharacter{0134}{\^J}%
+  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}%
+  \DeclareUnicodeCharacter{0136}{\cedilla{K}}%
+  \DeclareUnicodeCharacter{0137}{\cedilla{k}}%
+  \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}%
+  \DeclareUnicodeCharacter{0139}{\'L}%
+  \DeclareUnicodeCharacter{013A}{\'l}%
+  \DeclareUnicodeCharacter{013B}{\cedilla{L}}%
+  \DeclareUnicodeCharacter{013C}{\cedilla{l}}%
+  \DeclareUnicodeCharacter{013D}{L'}% should kern
+  \DeclareUnicodeCharacter{013E}{l'}% should kern
+  \DeclareUnicodeCharacter{013F}{L\U{00B7}}%
+  %
+  \DeclareUnicodeCharacter{0140}{l\U{00B7}}%
+  \DeclareUnicodeCharacter{0141}{\L}%
+  \DeclareUnicodeCharacter{0142}{\l}%
+  \DeclareUnicodeCharacter{0143}{\'N}%
+  \DeclareUnicodeCharacter{0144}{\'n}%
+  \DeclareUnicodeCharacter{0145}{\cedilla{N}}%
+  \DeclareUnicodeCharacter{0146}{\cedilla{n}}%
+  \DeclareUnicodeCharacter{0147}{\v{N}}%
+  \DeclareUnicodeCharacter{0148}{\v{n}}%
+  \DeclareUnicodeCharacter{0149}{'n}%
+  \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}%
+  \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}%
+  \DeclareUnicodeCharacter{014C}{\=O}%
+  \DeclareUnicodeCharacter{014D}{\=o}%
+  \DeclareUnicodeCharacter{014E}{\u{O}}%
+  \DeclareUnicodeCharacter{014F}{\u{o}}%
+  %
+  \DeclareUnicodeCharacter{0150}{\H{O}}%
+  \DeclareUnicodeCharacter{0151}{\H{o}}%
+  \DeclareUnicodeCharacter{0152}{\OE}%
+  \DeclareUnicodeCharacter{0153}{\oe}%
+  \DeclareUnicodeCharacter{0154}{\'R}%
+  \DeclareUnicodeCharacter{0155}{\'r}%
+  \DeclareUnicodeCharacter{0156}{\cedilla{R}}%
+  \DeclareUnicodeCharacter{0157}{\cedilla{r}}%
+  \DeclareUnicodeCharacter{0158}{\v{R}}%
+  \DeclareUnicodeCharacter{0159}{\v{r}}%
+  \DeclareUnicodeCharacter{015A}{\'S}%
+  \DeclareUnicodeCharacter{015B}{\'s}%
+  \DeclareUnicodeCharacter{015C}{\^S}%
+  \DeclareUnicodeCharacter{015D}{\^s}%
+  \DeclareUnicodeCharacter{015E}{\cedilla{S}}%
+  \DeclareUnicodeCharacter{015F}{\cedilla{s}}%
+  %
+  \DeclareUnicodeCharacter{0160}{\v{S}}%
+  \DeclareUnicodeCharacter{0161}{\v{s}}%
+  \DeclareUnicodeCharacter{0162}{\cedilla{T}}%
+  \DeclareUnicodeCharacter{0163}{\cedilla{t}}%
+  \DeclareUnicodeCharacter{0164}{\v{T}}%
+  \DeclareUnicodeCharacter{0165}{\v{t}}%
+  \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}%
+  \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}%
+  \DeclareUnicodeCharacter{0168}{\~U}%
+  \DeclareUnicodeCharacter{0169}{\~u}%
+  \DeclareUnicodeCharacter{016A}{\=U}%
+  \DeclareUnicodeCharacter{016B}{\=u}%
+  \DeclareUnicodeCharacter{016C}{\u{U}}%
+  \DeclareUnicodeCharacter{016D}{\u{u}}%
+  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}%
+  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}%
+  %
+  \DeclareUnicodeCharacter{0170}{\H{U}}%
+  \DeclareUnicodeCharacter{0171}{\H{u}}%
+  \DeclareUnicodeCharacter{0172}{\ogonek{U}}%
+  \DeclareUnicodeCharacter{0173}{\ogonek{u}}%
+  \DeclareUnicodeCharacter{0174}{\^W}%
+  \DeclareUnicodeCharacter{0175}{\^w}%
+  \DeclareUnicodeCharacter{0176}{\^Y}%
+  \DeclareUnicodeCharacter{0177}{\^y}%
+  \DeclareUnicodeCharacter{0178}{\"Y}%
+  \DeclareUnicodeCharacter{0179}{\'Z}%
+  \DeclareUnicodeCharacter{017A}{\'z}%
+  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}%
+  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}%
+  \DeclareUnicodeCharacter{017D}{\v{Z}}%
+  \DeclareUnicodeCharacter{017E}{\v{z}}%
+  \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}%
+  %
+  \DeclareUnicodeCharacter{01C4}{D\v{Z}}%
+  \DeclareUnicodeCharacter{01C5}{D\v{z}}%
+  \DeclareUnicodeCharacter{01C6}{d\v{z}}%
+  \DeclareUnicodeCharacter{01C7}{LJ}%
+  \DeclareUnicodeCharacter{01C8}{Lj}%
+  \DeclareUnicodeCharacter{01C9}{lj}%
+  \DeclareUnicodeCharacter{01CA}{NJ}%
+  \DeclareUnicodeCharacter{01CB}{Nj}%
+  \DeclareUnicodeCharacter{01CC}{nj}%
+  \DeclareUnicodeCharacter{01CD}{\v{A}}%
+  \DeclareUnicodeCharacter{01CE}{\v{a}}%
+  \DeclareUnicodeCharacter{01CF}{\v{I}}%
+  %
+  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}%
+  \DeclareUnicodeCharacter{01D1}{\v{O}}%
+  \DeclareUnicodeCharacter{01D2}{\v{o}}%
+  \DeclareUnicodeCharacter{01D3}{\v{U}}%
+  \DeclareUnicodeCharacter{01D4}{\v{u}}%
+  %
+  \DeclareUnicodeCharacter{01E2}{\={\AE}}%
+  \DeclareUnicodeCharacter{01E3}{\={\ae}}%
+  \DeclareUnicodeCharacter{01E6}{\v{G}}%
+  \DeclareUnicodeCharacter{01E7}{\v{g}}%
+  \DeclareUnicodeCharacter{01E8}{\v{K}}%
+  \DeclareUnicodeCharacter{01E9}{\v{k}}%
+  %
+  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}%
+  \DeclareUnicodeCharacter{01F1}{DZ}%
+  \DeclareUnicodeCharacter{01F2}{Dz}%
+  \DeclareUnicodeCharacter{01F3}{dz}%
+  \DeclareUnicodeCharacter{01F4}{\'G}%
+  \DeclareUnicodeCharacter{01F5}{\'g}%
+  \DeclareUnicodeCharacter{01F8}{\`N}%
+  \DeclareUnicodeCharacter{01F9}{\`n}%
+  \DeclareUnicodeCharacter{01FC}{\'{\AE}}%
+  \DeclareUnicodeCharacter{01FD}{\'{\ae}}%
+  \DeclareUnicodeCharacter{01FE}{\'{\O}}%
+  \DeclareUnicodeCharacter{01FF}{\'{\o}}%
+  %
+  \DeclareUnicodeCharacter{021E}{\v{H}}%
+  \DeclareUnicodeCharacter{021F}{\v{h}}%
+  %
+  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}%
+  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}%
+  \DeclareUnicodeCharacter{0228}{\cedilla{E}}%
+  \DeclareUnicodeCharacter{0229}{\cedilla{e}}%
+  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}%
+  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}%
+  %
+  \DeclareUnicodeCharacter{0232}{\=Y}%
+  \DeclareUnicodeCharacter{0233}{\=y}%
+  \DeclareUnicodeCharacter{0237}{\dotless{j}}%
+  %
+  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
+  %
+  % Greek letters upper case
+  \DeclareUnicodeCharacter{0391}{{\it A}}%
+  \DeclareUnicodeCharacter{0392}{{\it B}}%
+  \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}%
+  \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}%
+  \DeclareUnicodeCharacter{0395}{{\it E}}%
+  \DeclareUnicodeCharacter{0396}{{\it Z}}%
+  \DeclareUnicodeCharacter{0397}{{\it H}}%
+  \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}%
+  \DeclareUnicodeCharacter{0399}{{\it I}}%
+  \DeclareUnicodeCharacter{039A}{{\it K}}%
+  \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}%
+  \DeclareUnicodeCharacter{039C}{{\it M}}%
+  \DeclareUnicodeCharacter{039D}{{\it N}}%
+  \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}%
+  \DeclareUnicodeCharacter{039F}{{\it O}}%
+  \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}%
+  \DeclareUnicodeCharacter{03A1}{{\it P}}%
+  %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
+  \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}%
+  \DeclareUnicodeCharacter{03A4}{{\it T}}%
+  \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}%
+  \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}%
+  \DeclareUnicodeCharacter{03A7}{{\it X}}%
+  \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}%
+  \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}%
+  %
+  % Vowels with accents
+  \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}%
+  \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}%
+  \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}%
+  \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}%
+  \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}%
+  \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}%
+  %
+  % Standalone accent
+  \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}%
+  %
+  % Greek letters lower case
+  \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}%
+  \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}%
+  \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}%
+  \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}%
+  \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}%
+  \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}%
+  \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}%
+  \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}%
+  \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}%
+  \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}%
+  \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}%
+  \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}%
+  \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}%
+  \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}%
+  \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron
+  \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}%
+  \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}%
+  \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}%
+  \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}%
+  \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}%
+  \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}%
+  \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}%
+  \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}%
+  \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}%
+  \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}%
+  %
+  % More Greek vowels with accents
+  \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}%
+  \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}%
+  \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}%
+  \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}%
+  \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}%
+  %
+  % Variant Greek letters
+  \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}%
+  \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}%
+  \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}%
+  %
+  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}%
+  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}%
+  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}%
+  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}%
+  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}%
+  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}%
+  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}%
+  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}%
+  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}%
+  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}%
+  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}%
+  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}%
+  %
+  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}%
+  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}%
+  %
+  \DeclareUnicodeCharacter{1E20}{\=G}%
+  \DeclareUnicodeCharacter{1E21}{\=g}%
+  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}%
+  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}%
+  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}%
+  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}%
+  \DeclareUnicodeCharacter{1E26}{\"H}%
+  \DeclareUnicodeCharacter{1E27}{\"h}%
+  %
+  \DeclareUnicodeCharacter{1E30}{\'K}%
+  \DeclareUnicodeCharacter{1E31}{\'k}%
+  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}%
+  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}%
+  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}%
+  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}%
+  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}%
+  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}%
+  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}%
+  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}%
+  \DeclareUnicodeCharacter{1E3E}{\'M}%
+  \DeclareUnicodeCharacter{1E3F}{\'m}%
+  %
+  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}%
+  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}%
+  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}%
+  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}%
+  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}%
+  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}%
+  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}%
+  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}%
+  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}%
+  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}%
+  %
+  \DeclareUnicodeCharacter{1E54}{\'P}%
+  \DeclareUnicodeCharacter{1E55}{\'p}%
+  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}%
+  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}%
+  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}%
+  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}%
+  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}%
+  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}%
+  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}%
+  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}%
+  %
+  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}%
+  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}%
+  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}%
+  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}%
+  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}%
+  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}%
+  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}%
+  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}%
+  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}%
+  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}%
+  %
+  \DeclareUnicodeCharacter{1E7C}{\~V}%
+  \DeclareUnicodeCharacter{1E7D}{\~v}%
+  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}%
+  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}%
+  %
+  \DeclareUnicodeCharacter{1E80}{\`W}%
+  \DeclareUnicodeCharacter{1E81}{\`w}%
+  \DeclareUnicodeCharacter{1E82}{\'W}%
+  \DeclareUnicodeCharacter{1E83}{\'w}%
+  \DeclareUnicodeCharacter{1E84}{\"W}%
+  \DeclareUnicodeCharacter{1E85}{\"w}%
+  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}%
+  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}%
+  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}%
+  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}%
+  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}%
+  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}%
+  \DeclareUnicodeCharacter{1E8C}{\"X}%
+  \DeclareUnicodeCharacter{1E8D}{\"x}%
+  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}%
+  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}%
+  %
+  \DeclareUnicodeCharacter{1E90}{\^Z}%
+  \DeclareUnicodeCharacter{1E91}{\^z}%
+  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}%
+  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}%
+  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}%
+  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}%
+  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}%
+  \DeclareUnicodeCharacter{1E97}{\"t}%
+  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}%
+  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}%
+  %
+  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}%
+  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}%
+  %
+  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}%
+  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}%
+  \DeclareUnicodeCharacter{1EBC}{\~E}%
+  \DeclareUnicodeCharacter{1EBD}{\~e}%
+  %
+  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}%
+  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}%
+  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}%
+  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}%
+  %
+  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}%
+  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}%
+  %
+  \DeclareUnicodeCharacter{1EF2}{\`Y}%
+  \DeclareUnicodeCharacter{1EF3}{\`y}%
+  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}%
+  %
+  \DeclareUnicodeCharacter{1EF8}{\~Y}%
+  \DeclareUnicodeCharacter{1EF9}{\~y}%
+  %
+  % Punctuation
+  \DeclareUnicodeCharacter{2013}{--}%
+  \DeclareUnicodeCharacter{2014}{---}%
+  \DeclareUnicodeCharacter{2018}{\quoteleft{}}%
+  \DeclareUnicodeCharacter{2019}{\quoteright{}}%
+  \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}%
+  \DeclareUnicodeCharacter{201C}{\quotedblleft{}}%
+  \DeclareUnicodeCharacter{201D}{\quotedblright{}}%
+  \DeclareUnicodeCharacter{201E}{\quotedblbase{}}%
+  \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}%
+  \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}%
+  \DeclareUnicodeCharacter{2022}{\bullet{}}%
+  \DeclareUnicodeCharacter{202F}{\thinspace}%
+  \DeclareUnicodeCharacter{2026}{\dots{}}%
+  \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}%
+  \DeclareUnicodeCharacter{203A}{\guilsinglright{}}%
+  %
+  \DeclareUnicodeCharacter{20AC}{\euro{}}%
+  %
+  \DeclareUnicodeCharacter{2192}{\expansion{}}%
+  \DeclareUnicodeCharacter{21D2}{\result{}}%
+  %
+  % Mathematical symbols
+  \DeclareUnicodeCharacter{2200}{\ensuremath\forall}%
+  \DeclareUnicodeCharacter{2203}{\ensuremath\exists}%
+  \DeclareUnicodeCharacter{2208}{\ensuremath\in}%
+  \DeclareUnicodeCharacter{2212}{\minus{}}%
+  \DeclareUnicodeCharacter{2217}{\ast}%
+  \DeclareUnicodeCharacter{221E}{\ensuremath\infty}%
+  \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}%
+  \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}%
+  \DeclareUnicodeCharacter{2229}{\ensuremath\cap}%
+  \DeclareUnicodeCharacter{2261}{\equiv{}}%
+  \DeclareUnicodeCharacter{2264}{\ensuremath\leq}%
+  \DeclareUnicodeCharacter{2265}{\ensuremath\geq}%
+  \DeclareUnicodeCharacter{2282}{\ensuremath\subset}%
+  \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}%
+  %
+  \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}%
+  \DeclareUnicodeCharacter{2032}{\ensuremath\prime}%
+  \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}%
+  \DeclareUnicodeCharacter{2111}{\ensuremath\Im}%
+  \DeclareUnicodeCharacter{2113}{\ensuremath\ell}%
+  \DeclareUnicodeCharacter{2118}{\ensuremath\wp}%
+  \DeclareUnicodeCharacter{211C}{\ensuremath\Re}%
+  \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}%
+  \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}%
+  \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}%
+  \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}%
+  \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}%
+  \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}%
+  \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}%
+  \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}%
+  \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}%
+  \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}%
+  \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}%
+  \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}%
+  \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}%
+  \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}%
+  \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}%
+  \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}%
+  \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}%
+  \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}%
+  \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}%
+  \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}%
+  \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}%
+  \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}%
+  \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}%
+  \DeclareUnicodeCharacter{2202}{\ensuremath\partial}%
+  \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}%
+  \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}%
+  \DeclareUnicodeCharacter{2209}{\ensuremath\notin}%
+  \DeclareUnicodeCharacter{220B}{\ensuremath\owns}%
+  \DeclareUnicodeCharacter{220F}{\ensuremath\prod}%
+  \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}%
+  \DeclareUnicodeCharacter{2211}{\ensuremath\sum}%
+  \DeclareUnicodeCharacter{2213}{\ensuremath\mp}%
+  \DeclareUnicodeCharacter{2218}{\ensuremath\circ}%
+  \DeclareUnicodeCharacter{221A}{\ensuremath\surd}%
+  \DeclareUnicodeCharacter{221D}{\ensuremath\propto}%
+  \DeclareUnicodeCharacter{2220}{\ensuremath\angle}%
+  \DeclareUnicodeCharacter{2223}{\ensuremath\mid}%
+  \DeclareUnicodeCharacter{2228}{\ensuremath\vee}%
+  \DeclareUnicodeCharacter{222A}{\ensuremath\cup}%
+  \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}%
+  \DeclareUnicodeCharacter{222E}{\ensuremath\oint}%
+  \DeclareUnicodeCharacter{223C}{\ensuremath\sim}%
+  \DeclareUnicodeCharacter{2240}{\ensuremath\wr}%
+  \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}%
+  \DeclareUnicodeCharacter{2245}{\ensuremath\cong}%
+  \DeclareUnicodeCharacter{2248}{\ensuremath\approx}%
+  \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}%
+  \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}%
+  \DeclareUnicodeCharacter{2260}{\ensuremath\neq}%
+  \DeclareUnicodeCharacter{226A}{\ensuremath\ll}%
+  \DeclareUnicodeCharacter{226B}{\ensuremath\gg}%
+  \DeclareUnicodeCharacter{227A}{\ensuremath\prec}%
+  \DeclareUnicodeCharacter{227B}{\ensuremath\succ}%
+  \DeclareUnicodeCharacter{2283}{\ensuremath\supset}%
+  \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}%
+  \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}%
+  \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}%
+  \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}%
+  \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}%
+  \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}%
+  \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}%
+  \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}%
+  \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}%
+  \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}%
+  \DeclareUnicodeCharacter{2299}{\ensuremath\odot}%
+  \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}%
+  \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}%
+  \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}%
+  \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}%
+  \DeclareUnicodeCharacter{22A8}{\ensuremath\models}%
+  \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}%
+  \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}%
+  \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}%
+  \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}%
+  \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}%
+  \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}%
+  \DeclareUnicodeCharacter{22C6}{\ensuremath\star}%
+  \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}%
+  \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}%
+  \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}%
+  \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}%
+  \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}%
+  \DeclareUnicodeCharacter{2322}{\ensuremath\frown}%
+  \DeclareUnicodeCharacter{2323}{\ensuremath\smile}%
+  %
+  \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}%
+  \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}%
+  \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}%
+  \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}%
+  \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}%
+  \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}%
+  \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}%
+  \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}%
+  \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}%
+  \DeclareUnicodeCharacter{266D}{\ensuremath\flat}%
+  \DeclareUnicodeCharacter{266E}{\ensuremath\natural}%
+  \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}%
+  \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}%
+  \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}%
+  \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}%
+  \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}%
+  \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}%
+  \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}%
+  \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}%
+  \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}%
+  \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}%
+  \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}%
+  \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}%
+  \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}%
+  \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}%
+  \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}%
+  \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}%
+  \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}%
+  \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}%
+  %
+  \global\mathchardef\checkmark="1370% actually the square root sign
+  \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}%
+}% end of \unicodechardefs
+
+% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command)
+% It makes the setting that replace UTF-8 byte sequence.
+\def\utfeightchardefs{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii
+  \unicodechardefs
+}
+
+% Whether the active definitions of non-ASCII characters expand to
+% non-active tokens with the same character code.  This is used to
+% write characters literally, instead of using active definitions for
+% printing the correct glyphs.
+\newif\ifpassthroughchars
+\passthroughcharsfalse
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro to replace/pass-through a Unicode character
+%
+\def\DeclareUnicodeCharacterNative#1#2{%
+  \catcode"#1=\active
+  \def\dodeclareunicodecharacternative##1##2##3{%
+    \begingroup
+      \uccode`\~="##2\relax
+      \uppercase{\gdef~}{%
+        \ifpassthroughchars
+          ##1%
+        \else
+          ##3%
+        \fi
+      }
+    \endgroup
+  }
+  \begingroup
+    \uccode`\.="#1\relax
+    \uppercase{\def\UTFNativeTmp{.}}%
+    \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
+  \endgroup
+}
+
+% Native Unicode handling (XeTeX and LuaTeX) character replacing definition.
+% It activates the setting that replaces Unicode characters.
+\def\nativeunicodechardefs{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative
+  \unicodechardefs
+}
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% make the character token expand
+% to the sequences given in \unicodechardefs for printing.
+\def\DeclareUnicodeCharacterNativeAtU#1#2{%
+  \def\UTFAtUTmp{#2}
+  \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp
+}
+
+% @U command definitions for native Unicode handling (XeTeX and LuaTeX).
+\def\nativeunicodechardefsatu{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU
+  \unicodechardefs
+}
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+   \relax
+}
+
+% Define all Unicode characters we know about.  This makes UTF-8 the default
+% input encoding and allows @U to work.
+\iftxinativeunicodecapable
+  \nativeunicodechardefsatu
+\else
+  \utfeightchardefs
+\fi
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be very finicky about underfull hboxes, either.
+\hbadness = 6666
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \txipageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \txipagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+    % if we don't reset these, they will remain at "1 true in" of
+    % whatever layout pdftex was dumped with.
+    \pdfhorigin = 1 true in
+    \pdfvorigin = 1 true in
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      \special{papersize=#8,#7}%
+    \else
+      \pdfpageheight #7\relax
+      \pdfpagewidth #8\relax
+      % XeTeX does not have \pdfhorigin and \pdfvorigin.
+    \fi
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{607.2pt}{6in}% that's 46 lines
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {-.2in}{0in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1\relax
+  \advance\dimen0 by \voffset
+  \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+% Default value of \hfuzz, for suppressing warnings about overfull hboxes.
+\hfuzz = 1pt
+
+
+\message{and turning on texinfo input format.}
+
+\def^^L{\par} % remove \outer, so ^L can appear in an @comment
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other \def\normaldoublequote{"}
+\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
+\catcode`\+=\other \def\normalplus{+}
+\catcode`\<=\other \def\normalless{<}
+\catcode`\>=\other \def\normalgreater{>}
+\catcode`\^=\other \def\normalcaret{^}
+\catcode`\_=\other \def\normalunderscore{_}
+\catcode`\|=\other \def\normalverticalbar{|}
+\catcode`\~=\other \def\normaltilde{~}
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Set catcodes for Texinfo file
+
+% Active characters for printing the wanted glyph.
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+%
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
+\chardef\hatchar=`\^
+\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+\let\realunder=_
+
+\catcode`\|=\active \def|{{\tt\char124}}
+
+\chardef \less=`\<
+\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
+\chardef \gtr=`\>
+\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
+\catcode`\+=\active \def+{{\tt \char 43}}
+\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+\catcode`\-=\active \let-=\normaldash
+
+
+% used for headline/footline in the output routine, in case the page
+% breaks in the middle of an @tex block.
+\def\texinfochars{%
+  \let< = \activeless
+  \let> = \activegtr
+  \let~ = \activetilde
+  \let^ = \activehat
+  \markupsetuplqdefault \markupsetuprqdefault
+  \let\b = \strong
+  \let\i = \smartitalic
+  % in principle, all other definitions in \tex have to be undone too.
+}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% In Texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active  % @ for escape char from now on.
+
+% Print a typewriter backslash.  For math mode, we can't simply use
+% \backslashcurfont: the story here is that in math mode, the \char
+% of \backslashcurfont ends up printing the roman \ from the math symbol
+% font (because \char in math mode uses the \mathcode, and plain.tex
+% sets \mathcode`\\="026E).  Hence we use an explicit \mathchar,
+% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
+% ignored family value; char position "5C).  We can't use " for the
+% usual hex value because it has already been made active.
+
+@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
+@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
+
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+{@catcode`- = @active
+ @gdef@normalturnoffactive{%
+   @passthroughcharstrue
+   @let-=@normaldash
+   @let"=@normaldoublequote
+   @let$=@normaldollar %$ font-lock fix
+   @let+=@normalplus
+   @let<=@normalless
+   @let>=@normalgreater
+   @let^=@normalcaret
+   @let_=@normalunderscore
+   @let|=@normalverticalbar
+   @let~=@normaltilde
+   @let\=@ttbackslash
+   @markupsetuplqdefault
+   @markupsetuprqdefault
+   @unsepspaces
+ }
+}
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have @fixbackslash turn them back on.
+@catcode`+=@other @catcode`@_=@other
+
+% \enablebackslashhack - allow file to begin `\input texinfo'
+%
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+% If the file did not have a `\input texinfo', then it is turned off after
+% the first line; otherwise the first `\' in the file would cause an error.
+% This is used on the very last line of this file, texinfo.tex.
+% We also use @c to call @fixbackslash, in case ends of lines are hidden.
+{
+@catcode`@^=7
+@catcode`@^^M=13@gdef@enablebackslashhack{%
+  @global@let\ = @eatinput%
+  @catcode`@^^M=13%
+  @def@c{@fixbackslash@c}%
+  % Definition for the newline at the end of this file.
+  @def ^^M{@let^^M@secondlinenl}%
+  % Definition for a newline in the main Texinfo file.
+  @gdef @secondlinenl{@fixbackslash}%
+  % In case the first line has a whole-line command on it
+  @let@originalparsearg@parsearg
+  @def@parsearg{@fixbackslash@originalparsearg}
+}}
+
+{@catcode`@^=7 @catcode`@^^M=13%
+@gdef@eatinput input texinfo#1^^M{@fixbackslash}}
+
+% Emergency active definition of newline, in case an active newline token
+% appears by mistake.
+{@catcode`@^=7 @catcode13=13%
+@gdef@enableemergencynewline{%
+  @gdef^^M{%
+    @par%
+    %<warning: active newline>@par%
+}}}
+
+
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @ttbackslash @fi
+  @catcode13=5 % regular end of line
+  @enableemergencynewline
+  @let@c=@comment
+  @let@parsearg@originalparsearg
+  % Also turn back on active characters that might appear in the input
+  % file name, in case not using a pre-dumped format.
+  @catcode`+=@active
+  @catcode`@_=@active
+  %
+  % If texinfo.cnf is present on the system, read it.
+  % Useful for site-wide @afourpaper, etc.  This macro, @fixbackslash, gets
+  % called at the beginning of every Texinfo file.  Not opening texinfo.cnf
+  % directly in this file, texinfo.tex, makes it possible to make a format
+  % file for Texinfo.
+  %
+  @openin 1 texinfo.cnf
+  @ifeof 1 @else @input texinfo.cnf @fi
+  @closein 1
+}
+
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These (along with & and #) are made active for url-breaking, so need
+% active definitions as the normal characters.
+@def@normaldot{.}
+@def@normalquest{?}
+@def@normalslash{/}
+
+% These look ok in all fonts, so just make them not special.
+% @hashchar{} gets its own user-level command, because of #line.
+@catcode`@& = @other @def@normalamp{&}
+@catcode`@# = @other @def@normalhash{#}
+@catcode`@% = @other @def@normalpercent{%}
+
+@let @hashchar = @normalhash
+
+@c Finally, make ` and ' active, so that txicodequoteundirected and
+@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
+@c don't make ` and ' active, @code will not get them as active chars.
+@c Do this last of all since we use ` in the previous @catcode assignments.
+@catcode`@'=@active
+@catcode`@`=@active
+@markupsetuplqdefault
+@markupsetuprqdefault
+
+@c Local variables:
+@c eval: (add-hook 'before-save-hook 'time-stamp)
+@c page-delimiter: "^\\\\message\\|emacs-page"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@enablebackslashhack
diff --git a/build.cfg.in b/build.cfg.in
new file mode 100644 (file)
index 0000000..80ce9b4
--- /dev/null
@@ -0,0 +1,38 @@
+# Configuration for building GNU Make in the absence of any 'make' program.
+# @configure_input@
+
+# Copyright (C) 1993-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# See Makefile.in for comments describing these variables.
+
+top_srcdir='@top_srcdir@'
+
+prefix='@prefix@'
+exec_prefix=`eval echo @exec_prefix@`
+
+CC='@CC@'
+AR='@AR@'
+CFLAGS='@CFLAGS@ @GUILE_CFLAGS@'
+CPPFLAGS='@CPPFLAGS@'
+DEFS='@DEFS@'
+ARFLAGS='@ARFLAGS@'
+LDFLAGS='@AM_LDFLAGS@ @LDFLAGS@'
+ALLOCA='@ALLOCA@'
+LOADLIBES='@LIBS@ @GUILE_LIBS@ @LIBINTL@'
+REMOTE='@REMOTE@'
+OBJEXT='@OBJEXT@'
+EXEEXT='@EXEEXT@'
diff --git a/build.sh b/build.sh
new file mode 100755 (executable)
index 0000000..4c88b53
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,149 @@
+#!/bin/sh
+# Shell script to build GNU Make in the absence of any 'make' program.
+
+# Copyright (C) 1993-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Get configure-generated values
+. ./build.cfg
+
+: ${OUTDIR:=.}
+OUTLIB="$OUTDIR/lib"
+
+# Directory to find libraries in for '-lXXX'.
+libdir=$exec_prefix/lib
+# Directory to search by default for included makefiles.
+includedir=$prefix/include
+
+localedir=$prefix/share/locale
+
+defines="-DLOCALEDIR=\"$localedir\" -DLIBDIR=\"$libdir\" -DINCLUDEDIR=\"$includedir\""
+
+# Look up a make variable value.
+# It can handle simple recursion where variables are separate words.
+# Print the value to stdout.
+get_mk_var ()
+{
+  file=$1
+  var=$2
+
+  val=
+  v=$(sed -e :a -e '/\\$/N; s/\\\n//; ta' "$file" | sed -n "s=^ *$var *\= *==p")
+  for w in $v; do
+    case $w in
+      (\$[\(\{]*[\)\}]) w=${w#\$[\(\{]}; w=$(get_mk_var "$file" "${w%[\)\}]}") ;;
+    esac
+    val="${val:+$val }$w"
+  done
+
+  printf '%s\n' "$val"
+}
+
+# Compile source files.  Object files are put into $objs.
+compile ()
+{
+  objs=
+  for ofile in "$@"; do
+    file="${ofile%.$OBJEXT}.c"
+    echo "compiling $file..."
+    of="$OUTDIR/$ofile"
+    mkdir -p "${of%/*}"
+    $CC $cflags $CPPFLAGS $CFLAGS -c -o "$of" "$top_srcdir/$file"
+    objs="${objs:+$objs }$of"
+  done
+}
+
+# Use config.status to convert a .in file.  Output file is put into $out.
+# $out will be empty if no conversion was needed.
+convert ()
+{
+  out=
+  base=$1
+  var="GENERATE_$(echo $base | tr 'a-z./+' A-Z__X)"
+
+  # Is this file disabled?
+  grep "${var}_FALSE\"]=\"\"" config.status >/dev/null && return
+
+  # Not disabled, so create it
+  in="$top_srcdir/lib/$(echo ${base%.*}.in.${base##*.} | tr / _)"
+  out="$OUTLIB/$base"
+  mkdir -p "${out%/*}"
+
+  # First perform the normal replacements, using config.status
+  sed -e 's|@GUARD_PREFIX@|GL|g' \
+      -e 's/@GNULIB_UNISTD_H_GETOPT@/0/g' \
+      "$in" > "${out}_"
+  ./config.status --file "${out}__:${out}_"
+  int="${out}__"
+
+  # Then see if there any files we need to include.  Unfortunately there's no
+  # algorithmic conversion so we just have to hard-code it.
+  incls=$(sed -n 's/.*definitions* of \(_[^ $]*\).*/\1/p' "$in")
+
+  for inc in $incls; do
+    case $inc in
+      (_GL_FUNCDECL_RPL) fn=$(get_mk_var lib/Makefile CXXDEFS_H) ;;
+      (_GL_ARG_NONNULL)  fn=$(get_mk_var lib/Makefile ARG_NONNULL_H) ;;
+      (_GL_WARN_ON_USE)  fn=$(get_mk_var lib/Makefile WARN_ON_USE_H) ;;
+      (_Noreturn)        fn=$(get_mk_var lib/Makefile _NORETURN_H) ;;
+      (*) echo "Unknown file replacement: $inc"; exit 1 ;;
+    esac
+
+    fn="$top_srcdir/lib/${fn##*/}"
+    [ -f "$fn" ] || { echo "Missing file: $fn"; exit 1; }
+
+    sed "/definitions* of $inc/r $fn" "$int" > "${int}_"
+    int=${int}_
+  done
+
+  # Done!
+  mv "$int" "$out"
+}
+
+# Get source files provided from gnulib and convert to object files
+LIBOBJS=
+for lo in $( (get_mk_var lib/Makefile libgnu_a_OBJECTS; get_mk_var lib/Makefile libgnu_a_LIBADD) | sed "s=\$[\(\{]OBJEXT[\)\}]=$OBJEXT=g"); do
+  LIBOBJS="${LIBOBJS:+$LIBOBJS }lib/$lo"
+done
+
+# Get object files from the Makefile
+OBJS=$(get_mk_var Makefile make_OBJECTS | sed "s=\$[\(\{]OBJEXT[\)\}]=$OBJEXT=g")
+
+# Exit as soon as any command fails.
+set -e
+
+# Generate gnulib header files that would normally be created by make
+for b in $(get_mk_var lib/Makefile BUILT_SOURCES); do
+    convert $b
+done
+
+# Build the gnulib library
+cflags="$DEFS -I$OUTLIB -Ilib -I$top_srcdir/lib -I$OUTDIR/src -Isrc -I$top_srcdir/src"
+compile $LIBOBJS
+
+echo "creating libgnu.a..."
+$AR $ARFLAGS "$OUTLIB"/libgnu.a $objs
+
+# Compile the source files into those objects.
+cflags="$DEFS $defines -I$OUTDIR/src -Isrc -I$top_srcdir/src -I$OUTLIB -Ilib -I$top_srcdir/lib"
+compile $OBJS
+
+# Link all the objects together.
+echo "linking make..."
+$CC $CFLAGS $LDFLAGS -L"$OUTLIB" $objs -lgnu $LOADLIBES -o "$OUTDIR/makenew$EXEEXT"
+mv -f "$OUTDIR/makenew$EXEEXT" "$OUTDIR/make$EXEEXT"
+
+echo done.
diff --git a/build.sh.in b/build.sh.in
deleted file mode 100755 (executable)
index 1f24fed..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/sh
-# Shell script to build GNU Make in the absence of any 'make' program.
-# @configure_input@
-
-# Copyright (C) 1993-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# See Makefile.in for comments describing these variables.
-
-srcdir='@srcdir@'
-CC='@CC@'
-CFLAGS='@CFLAGS@ @GUILE_CFLAGS@'
-CPPFLAGS='@CPPFLAGS@'
-LDFLAGS='@AM_LDFLAGS@ @LDFLAGS@'
-ALLOCA='@ALLOCA@'
-LOADLIBES='@LIBS@ @GUILE_LIBS@ @LIBINTL@'
-eval extras=\'@LIBOBJS@\'
-REMOTE='@REMOTE@'
-GLOBLIB='@GLOBLIB@'
-PATH_SEPARATOR='@PATH_SEPARATOR@'
-OBJEXT='@OBJEXT@'
-EXEEXT='@EXEEXT@'
-
-# Common prefix for machine-independent installed files.
-prefix='@prefix@'
-# Common prefix for machine-dependent installed files.
-exec_prefix=`eval echo @exec_prefix@`
-# Directory to find libraries in for '-lXXX'.
-libdir=${exec_prefix}/lib
-# Directory to search by default for included makefiles.
-includedir=${prefix}/include
-
-localedir=${prefix}/share/locale
-aliaspath=${localedir}${PATH_SEPARATOR}.
-
-defines="-DLOCALEDIR=\"${localedir}\" -DLIBDIR=\"${libdir}\" -DINCLUDEDIR=\"${includedir}\""' @DEFS@'
-
-# Exit as soon as any command fails.
-set -e
-
-# These are all the objects we need to link together.
-objs="ar.${OBJEXT} arscan.${OBJEXT} commands.${OBJEXT} default.${OBJEXT} dir.${OBJEXT} expand.${OBJEXT} file.${OBJEXT} function.${OBJEXT} getopt.${OBJEXT} getopt1.${OBJEXT} guile.${OBJEXT} implicit.${OBJEXT} job.${OBJEXT} load.${OBJEXT} loadapi.${OBJEXT} main.${OBJEXT} misc.${OBJEXT} posixos.${OBJEXT} output.${OBJEXT} read.${OBJEXT} remake.${OBJEXT} rule.${OBJEXT} signame.${OBJEXT} strcache.${OBJEXT} variable.${OBJEXT} version.${OBJEXT} vpath.${OBJEXT} hash.${OBJEXT} remote-${REMOTE}.${OBJEXT} ${extras} ${ALLOCA}"
-
-if [ x"$GLOBLIB" != x ]; then
-  objs="$objs glob/fnmatch.${OBJEXT} glob/glob.${OBJEXT}"
-  globinc=-I${srcdir}/glob
-fi
-
-# Compile the source files into those objects.
-for file in `echo ${objs} | sed 's/\.'${OBJEXT}'/.c/g'`; do
-  echo compiling ${file}...
-  $CC $defines $CPPFLAGS $CFLAGS \
-      -c -I. -I${srcdir} ${globinc} ${srcdir}/$file
-done
-
-# The object files were actually all put in the current directory.
-# Remove the source directory names from the list.
-srcobjs="$objs"
-objs=
-for obj in $srcobjs; do
-  objs="$objs `basename $obj`"
-done
-
-# Link all the objects together.
-echo linking make...
-$CC $CFLAGS $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT}
-echo done
-mv -f makenew${EXEEXT} make${EXEEXT}
index 59e068b63fc4eb77b04dafa8fcf8e052efa8ded0..553e9d9ce7aedcc05317b36a6b5ce3bc7a7d1127 100755 (executable)
 @echo off\r
-rem Copyright (C) 1996-2016 Free Software Foundation, Inc.\r
-rem This file is part of GNU Make.\r
-rem\r
-rem GNU Make is free software; you can redistribute it and/or modify it under\r
-rem the terms of the GNU General Public License as published by the Free\r
-rem Software Foundation; either version 3 of the License, or (at your option)\r
-rem any later version.\r
-rem\r
-rem GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
-rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
-rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
-rem more details.\r
-rem\r
-rem You should have received a copy of the GNU General Public License along\r
-rem with this program.  If not, see <http://www.gnu.org/licenses/>.\r
+:: Copyright (C) 1996-2020 Free Software Foundation, Inc.\r
+:: This file is part of GNU Make.\r
+::\r
+:: GNU Make is free software; you can redistribute it and/or modify it under\r
+:: the terms of the GNU General Public License as published by the Free\r
+:: Software Foundation; either version 3 of the License, or (at your option)\r
+:: any later version.\r
+::\r
+:: GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
+:: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+:: FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
+:: more details.\r
+::\r
+:: You should have received a copy of the GNU General Public License along\r
+:: with this program.  If not, see <http://www.gnu.org/licenses/>.\r
+\r
+setlocal\r
+if not "%RECURSEME%"=="%~0" (\r
+    set "RECURSEME=%~0"\r
+    %ComSpec% /s /c ""%~0" %*"\r
+    goto :EOF\r
+)\r
 \r
 call :Reset\r
 \r
 if "%1" == "-h" goto Usage\r
 if "%1" == "--help" goto Usage\r
 \r
+echo.\r
+echo Creating GNU Make for Windows 9X/NT/2K/XP/Vista/7/8/10\r
+echo.\r
+\r
 set MAKE=gnumake\r
 set GUILE=Y\r
-set COMPILER=msvc\r
+set COMPILER=cl.exe\r
+set O=obj\r
+set ARCH=x64\r
+set DEBUG=N\r
+\r
+if exist maintMakefile (\r
+    set MAINT=Y\r
+) else (\r
+    set MAINT=N\r
+)\r
 \r
 :ParseSW\r
 if "%1" == "--debug" goto SetDebug\r
 if "%1" == "--without-guile" goto NoGuile\r
+if "%1" == "--x86" goto Set32Bit\r
 if "%1" == "gcc" goto SetCC\r
 if "%1" == "" goto DoneSW\r
+goto Usage\r
 \r
 :SetDebug\r
 set DEBUG=Y\r
+echo - Building without compiler optimizations\r
 shift\r
 goto ParseSW\r
 \r
 :NoGuile\r
 set GUILE=N\r
-echo Building without Guile\r
+echo - Building without Guile\r
+shift\r
+goto ParseSW\r
+\r
+:Set32Bit\r
+set ARCH=x86\r
+echo - Building 32bit GNU Make\r
 shift\r
 goto ParseSW\r
 \r
 :SetCC\r
 set COMPILER=gcc\r
-echo Building with GCC\r
+set O=o\r
+echo - Building with GCC\r
 shift\r
 goto ParseSW\r
 \r
-rem Build with Guile is supported only on NT and later versions\r
 :DoneSW\r
-echo.\r
-echo Creating GNU Make for Windows 9X/NT/2K/XP/Vista/7/8\r
-if "%DEBUG%" == "Y" echo Building without compiler optimizations\r
+if "%MAINT%" == "Y" echo - Enabling maintainer mode\r
+\r
+if "%COMPILER%" == "gcc" goto FindGcc\r
+\r
+:: Find a compiler.  Visual Studio requires a lot of effort to locate :-/.\r
+%COMPILER% >nul 2>&1\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+:: Visual Studio 17 and above provides the "vswhere" tool\r
+call :FindVswhere\r
+if ERRORLEVEL 1 goto LegacyVS\r
+\r
+for /f "tokens=* usebackq" %%i in (`%VSWHERE% -latest -property installationPath`) do (\r
+    set InstallPath=%%i\r
+)\r
+set "VSVARS=%InstallPath%\VC\Auxiliary\Build\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+:: No "vswhere" or it can't find a compiler.  Go old-school.\r
+:LegacyVS\r
+set "VSVARS=%VS150COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%VS120COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%VS90COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%VS80COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
 \r
-if "%COMPILER%" == "gcc" goto GccBuild\r
+set "VSVARS=%VS71COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
 \r
+set "VSVARS=%VS70COMNTOOLS%\..\..\VC\vcvarsall.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%V6TOOLS%\VC98\Bin\vcvars32.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%V6TOOLS%\VC97\Bin\vcvars32.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+set "VSVARS=%V5TOOLS%\VC\Bin\vcvars32.bat"\r
+call :CheckMSVC\r
+if not ERRORLEVEL 1 goto FoundMSVC\r
+\r
+:: We did not find anything--fail\r
+echo No MSVC compiler available.\r
+echo Please run vcvarsall.bat and/or configure your Path.\r
+exit 1\r
+\r
+:FoundMSVC\r
 set OUTDIR=.\WinRel\r
+set LNKOUT=./WinRel\r
 set "OPTS=/O2 /D NDEBUG"\r
 set LINKOPTS=\r
 if "%DEBUG%" == "Y" set OUTDIR=.\WinDebug\r
+if "%DEBUG%" == "Y" set LNKOUT=./WinDebug\r
 if "%DEBUG%" == "Y" set "OPTS=/Zi /Od /D _DEBUG"\r
 if "%DEBUG%" == "Y" set LINKOPTS=/DEBUG\r
-call :Build\r
-goto Done\r
+if "%MAINT%" == "Y" set "OPTS=%OPTS% /D MAKE_MAINTAINER_MODE"\r
+:: Show the compiler version that we found\r
+:: Unfortunately this also shows a "usage" note; I can't find anything better.\r
+echo.\r
+%COMPILER%\r
+goto Build\r
 \r
-:GccBuild\r
+:FindGcc\r
 set OUTDIR=.\GccRel\r
+set LNKOUT=./GccRel\r
 set OPTS=-O2\r
 if "%DEBUG%" == "Y" set OPTS=-O0\r
 if "%DEBUG%" == "Y" set OUTDIR=.\GccDebug\r
-call :Build\r
-goto Done\r
-\r
-:Done\r
-call :Reset\r
-goto :EOF\r
+if "%DEBUG%" == "Y" set LNKOUT=./GccDebug\r
+if "%MAINT%" == "Y" set "OPTS=%OPTS% -DMAKE_MAINTAINER_MODE"\r
+:: Show the compiler version that we found\r
+echo.\r
+%COMPILER% --version\r
+if not ERRORLEVEL 1 goto Build\r
+echo No %COMPILER% found.\r
+exit 1\r
 \r
 :Build\r
 :: Clean the directory if it exists\r
@@ -82,114 +189,138 @@ if exist %OUTDIR%\nul rmdir /S /Q %OUTDIR%
 \r
 :: Recreate it\r
 mkdir %OUTDIR%\r
-mkdir %OUTDIR%\glob\r
-mkdir %OUTDIR%\w32\r
-mkdir %OUTDIR%\w32\compat\r
-mkdir %OUTDIR%\w32\subproc\r
+mkdir %OUTDIR%\src\r
+mkdir %OUTDIR%\src\w32\r
+mkdir %OUTDIR%\src\w32\compat\r
+mkdir %OUTDIR%\src\w32\subproc\r
+mkdir %OUTDIR%\lib\r
 \r
 if "%GUILE%" == "Y" call :ChkGuile\r
 \r
 echo.\r
 echo Compiling %OUTDIR% version\r
 \r
-if exist config.h.W32.template call :ConfigSCM\r
-copy config.h.W32 %OUTDIR%\config.h\r
-\r
-call :Compile ar\r
-call :Compile arscan\r
-call :Compile commands\r
-call :Compile default\r
-call :Compile dir\r
-call :Compile expand\r
-call :Compile file\r
-call :Compile function\r
-call :Compile getloadavg\r
-call :Compile getopt\r
-call :Compile getopt1\r
-call :Compile glob\fnmatch\r
-call :Compile glob\glob\r
-call :Compile guile GUILE\r
-call :Compile hash\r
-call :Compile implicit\r
-call :Compile job\r
-call :Compile load\r
-call :Compile loadapi\r
-call :Compile main GUILE\r
-call :Compile misc\r
-call :Compile output\r
-call :Compile read\r
-call :Compile remake\r
-call :Compile remote-stub\r
-call :Compile rule\r
-call :Compile signame\r
-call :Compile strcache\r
-call :Compile variable\r
-call :Compile version\r
-call :Compile vpath\r
-call :Compile w32\compat\posixfcn\r
-call :Compile w32\pathstuff\r
-call :Compile w32\subproc\misc\r
-call :Compile w32\subproc\sub_proc\r
-call :Compile w32\subproc\w32err\r
-call :Compile w32\w32os\r
-\r
-if not "%COMPILER%" == "gcc" call :Compile w32\compat\dirent\r
+if exist src\config.h.W32.template call :ConfigSCM\r
+copy src\config.h.W32 %OUTDIR%\src\config.h\r
+\r
+copy lib\glob.in.h %OUTDIR%\lib\glob.h\r
+copy lib\fnmatch.in.h %OUTDIR%\lib\fnmatch.h\r
+\r
+if exist %OUTDIR%\link.sc del %OUTDIR%\link.sc\r
+\r
+call :Compile src/ar\r
+call :Compile src/arscan\r
+call :Compile src/commands\r
+call :Compile src/default\r
+call :Compile src/dir\r
+call :Compile src/expand\r
+call :Compile src/file\r
+call :Compile src/function\r
+call :Compile src/getopt\r
+call :Compile src/getopt1\r
+call :Compile src/guile GUILE\r
+call :Compile src/hash\r
+call :Compile src/implicit\r
+call :Compile src/job\r
+call :Compile src/load\r
+call :Compile src/loadapi\r
+call :Compile src/main GUILE\r
+call :Compile src/misc\r
+call :Compile src/output\r
+call :Compile src/read\r
+call :Compile src/remake\r
+call :Compile src/remote-stub\r
+call :Compile src/rule\r
+call :Compile src/signame\r
+call :Compile src/strcache\r
+call :Compile src/variable\r
+call :Compile src/version\r
+call :Compile src/vpath\r
+call :Compile src/w32/pathstuff\r
+call :Compile src/w32/w32os\r
+call :Compile src/w32/compat/posixfcn\r
+call :Compile src/w32/subproc/misc\r
+call :Compile src/w32/subproc/sub_proc\r
+call :Compile src/w32/subproc/w32err\r
+call :Compile lib/fnmatch\r
+call :Compile lib/glob\r
+call :Compile lib/getloadavg\r
+\r
+if not "%COMPILER%" == "gcc" call :Compile src\w32\compat\dirent\r
 \r
 call :Link\r
 \r
 echo.\r
-if not exist %OUTDIR%\%MAKE%.exe echo %OUTDIR% build FAILED!\r
-if exist %OUTDIR%\%MAKE%.exe echo %OUTDIR% build succeeded.\r
+if exist %OUTDIR%\%MAKE%.exe goto Success\r
+echo %OUTDIR% build FAILED!\r
+exit 1\r
+\r
+:Success\r
+echo %OUTDIR% build succeeded.\r
+if exist Basic.mk copy /Y Basic.mk Makefile\r
+if not exist tests\config-flags.pm copy /Y tests\config-flags.pm.W32 tests\config-flags.pm\r
+call :Reset\r
 goto :EOF\r
 \r
+::\r
+:: Subroutines\r
+::\r
+\r
 :Compile\r
+echo %LNKOUT%/%1.%O% >>%OUTDIR%\link.sc\r
 set EXTRAS=\r
 if "%2" == "GUILE" set "EXTRAS=%GUILECFLAGS%"\r
+if exist "%OUTDIR%\%1.%O%" del "%OUTDIR%\%1.%O%"\r
 if "%COMPILER%" == "gcc" goto GccCompile\r
 \r
 :: MSVC Compile\r
 echo on\r
-cl.exe /nologo /MT /W4 /EHsc %OPTS% /I %OUTDIR% /I . /I glob /I w32/include /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR%OUTDIR% /Fp%OUTDIR%\%MAKE%.pch /Fo%OUTDIR%\%1.obj /Fd%OUTDIR%\%MAKE%.pdb %EXTRAS% /c %1.c\r
+%COMPILER% /nologo /MT /W4 /EHsc %OPTS% /I %OUTDIR%/src /I src /I %OUTDIR%/lib /I lib /I src/w32/include /D WINDOWS32 /D WIN32 /D _CONSOLE /D HAVE_CONFIG_H /FR%OUTDIR% /Fp%OUTDIR%\%MAKE%.pch /Fo%OUTDIR%\%1.%O% /Fd%OUTDIR%\%MAKE%.pdb %EXTRAS% /c %1.c\r
 @echo off\r
-echo %OUTDIR%\%1.obj >>%OUTDIR%\link.sc\r
-goto :EOF\r
+goto CompileDone\r
 \r
 :GccCompile\r
 :: GCC Compile\r
 echo on\r
-gcc -mthreads -Wall -std=gnu99 -gdwarf-2 -g3 %OPTS% -I%OUTDIR% -I. -I./glob -I./w32/include -DWINDOWS32 -DHAVE_CONFIG_H %EXTRAS% -o %OUTDIR%\%1.o -c %1.c\r
+%COMPILER% -mthreads -Wall -std=gnu99 -gdwarf-2 -g3 %OPTS% -I%OUTDIR%/src -I./src -I%OUTDIR%/lib -I./lib -I./src/w32/include -DWINDOWS32 -DHAVE_CONFIG_H %EXTRAS% -o %OUTDIR%/%1.%O% -c %1.c\r
 @echo off\r
+\r
+:CompileDone\r
+if not exist "%OUTDIR%\%1.%O%" exit 1\r
 goto :EOF\r
 \r
 :Link\r
-echo Linking %OUTDIR%/%MAKE%.exe\r
+echo.\r
+echo Linking %LNKOUT%/%MAKE%.exe\r
 if "%COMPILER%" == "gcc" goto GccLink\r
 \r
 :: MSVC Link\r
 echo %GUILELIBS% kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib >>%OUTDIR%\link.sc\r
 echo on\r
-link.exe /NOLOGO /SUBSYSTEM:console /PDB:%OUTDIR%\%MAKE%.pdb %LINKOPTS% /OUT:%OUTDIR%\%MAKE%.exe @%OUTDIR%\link.sc\r
+link.exe /NOLOGO /SUBSYSTEM:console /PDB:%LNKOUT%\%MAKE%.pdb %LINKOPTS% /OUT:%LNKOUT%\%MAKE%.exe @%LNKOUT%\link.sc\r
 @echo off\r
 goto :EOF\r
 \r
 :GccLink\r
 :: GCC Link\r
 echo on\r
-gcc -mthreads -gdwarf-2 -g3 -o %OUTDIR%\%MAKE%.exe %OUTDIR%\variable.o %OUTDIR%\rule.o %OUTDIR%\remote-stub.o %OUTDIR%\commands.o %OUTDIR%\file.o %OUTDIR%\getloadavg.o %OUTDIR%\default.o %OUTDIR%\signame.o %OUTDIR%\expand.o %OUTDIR%\dir.o %OUTDIR%\main.o %OUTDIR%\getopt1.o %OUTDIR%\guile.o %OUTDIR%\job.o %OUTDIR%\output.o %OUTDIR%\read.o %OUTDIR%\version.o %OUTDIR%\getopt.o %OUTDIR%\arscan.o %OUTDIR%\remake.o %OUTDIR%\misc.o %OUTDIR%\hash.o %OUTDIR%\strcache.o %OUTDIR%\ar.o %OUTDIR%\function.o %OUTDIR%\vpath.o %OUTDIR%\implicit.o %OUTDIR%\loadapi.o %OUTDIR%\load.o %OUTDIR%\glob\glob.o %OUTDIR%\glob\fnmatch.o %OUTDIR%\w32\pathstuff.o %OUTDIR%\w32\compat\posixfcn.o %OUTDIR%\w32\w32os.o %OUTDIR%\w32\subproc\misc.o %OUTDIR%\w32\subproc\sub_proc.o %OUTDIR%\w32\subproc\w32err.o %GUILELIBS% -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -Wl,--out-implib=%OUTDIR%\libgnumake-1.dll.a\r
+echo %GUILELIBS% -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 >>%OUTDIR%\link.sc\r
+%COMPILER% -mthreads -gdwarf-2 -g3 %OPTS% -o %LNKOUT%/%MAKE%.exe @%LNKOUT%/link.sc -Wl,--out-implib=%LNKOUT%/libgnumake-1.dll.a\r
 @echo off\r
 goto :EOF\r
 \r
 :ConfigSCM\r
 echo Generating config from SCM templates\r
-sed -n "s/^AC_INIT(\[GNU make\],\[\([^]]\+\)\].*/s,%%VERSION%%,\1,g/p" configure.ac > %OUTDIR%\config.h.W32.sed\r
-echo s,%%PACKAGE%%,make,g >> %OUTDIR%\config.h.W32.sed\r
-sed -f %OUTDIR%\config.h.W32.sed config.h.W32.template > config.h.W32\r
-echo static const char *const GUILE_module_defn = ^" \gmk-default.h\r
-sed -e "s/;.*//" -e "/^[ \t]*$/d" -e "s/\"/\\\\\"/g" -e "s/$/ \\\/" gmk-default.scm >> gmk-default.h\r
-echo ^";>> gmk-default.h\r
+sed -n "s/^AC_INIT(\[GNU make\],\[\([^]]\+\)\].*/s,%%VERSION%%,\1,g/p" configure.ac > %OUTDIR%\src\config.h.W32.sed\r
+echo s,%%PACKAGE%%,make,g >> %OUTDIR%\src\config.h.W32.sed\r
+sed -f %OUTDIR%\src\config.h.W32.sed src\config.h.W32.template > src\config.h.W32\r
+echo static const char *const GUILE_module_defn = ^" \ > src\gmk-default.h\r
+sed -e "s/;.*//" -e "/^[ \t]*$/d" -e "s/\"/\\\\\"/g" -e "s/$/ \\\/" src\gmk-default.scm >> src\gmk-default.h\r
+echo ^";>> src\gmk-default.h\r
 goto :EOF\r
 \r
 :ChkGuile\r
+:: Build with Guile is supported only on NT and later versions\r
 if not "%OS%" == "Windows_NT" goto NoGuile\r
 pkg-config --help > %OUTDIR%\guile.tmp 2> NUL\r
 if ERRORLEVEL 1 goto NoPkgCfg\r
@@ -213,29 +344,47 @@ if not ERRORLEVEL 1 set /P GUILELIBS= < %OUTDIR%\guile.tmp
 \r
 if not "%GUILECFLAGS%" == "" goto GuileDone\r
 \r
-echo No Guile found, building without Guile\r
+echo No Guile found, building without Guile\r
 goto GuileDone\r
 \r
 :NoPkgCfg\r
-echo pkg-config not found, building without Guile\r
+echo pkg-config not found, building without Guile\r
 \r
 :GuileDone\r
 if "%GUILECFLAGS%" == "" goto :EOF\r
 \r
-echo Guile found, building with Guile\r
+echo - Guile found: building with Guile\r
 set "GUILECFLAGS=%GUILECFLAGS% -DHAVE_GUILE"\r
 goto :EOF\r
 \r
+:FindVswhere\r
+set VSWHERE=vswhere\r
+%VSWHERE% -help >nul 2>&1\r
+if not ERRORLEVEL 1 exit /b 0\r
+set "VSWHERE=C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere"\r
+%VSWHERE% -help >nul 2>&1\r
+if ERRORLEVEL 1 exit /b 1\r
+goto :EOF\r
+\r
+:CheckMSVC\r
+if not exist "%VSVARS%" exit /b 1\r
+call "%VSVARS%" %ARCH%\r
+if ERRORLEVEL 1 exit /b 1\r
+%COMPILER% >nul 2>&1\r
+if ERRORLEVEL 1 exit /b 1\r
+goto :EOF\r
+\r
 :Usage\r
 echo Usage: %0 [options] [gcc]\r
 echo Options:\r
-echo.  --debug           For GCC only, make a debug build\r
-echo.                    (MSVC build always makes both debug and release)\r
 echo.  --without-guile   Do not compile Guile support even if found\r
+echo.  --debug           Make a Debug build--default is Release\r
+echo.  --x86             Make a 32bit binary--default is 64bit\r
 echo.  --help            Display these instructions and exit\r
 goto :EOF\r
 \r
 :Reset\r
+set ARCH=\r
 set COMPILER=\r
 set DEBUG=\r
 set GUILE=\r
@@ -244,7 +393,10 @@ set GUILELIBS=
 set LINKOPTS=\r
 set MAKE=\r
 set NOGUILE=\r
+set O=\r
 set OPTS=\r
 set OUTDIR=\r
+set LNKOUT=\r
 set PKGMSC=\r
+set VSVARS=\r
 goto :EOF\r
diff --git a/builddos.bat b/builddos.bat
new file mode 100644 (file)
index 0000000..9cecabe
--- /dev/null
@@ -0,0 +1,95 @@
+@echo off\r
+rem Copyright (C) 1998-2020 Free Software Foundation, Inc.\r
+rem This file is part of GNU Make.\r
+rem\r
+rem GNU Make is free software; you can redistribute it and/or modify it under\r
+rem the terms of the GNU General Public License as published by the Free\r
+rem Software Foundation; either version 3 of the License, or (at your option)\r
+rem any later version.\r
+rem\r
+rem GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
+rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
+rem more details.\r
+rem\r
+rem You should have received a copy of the GNU General Public License along\r
+rem with this program.  If not, see <http://www.gnu.org/licenses/>.\r
+\r
+echo Building Make for MSDOS with DJGPP\r
+\r
+rem The SmallEnv trick protects against too small environment block,\r
+rem in which case the values will be truncated and the whole thing\r
+rem goes awry.  COMMAND.COM will say "Out of environment space", but\r
+rem many people don't care, so we force them to care by refusing to go.\r
+\r
+rem Where is the srcdir?\r
+set XSRC=.\r
+if not "%XSRC%"=="." goto SmallEnv\r
+if "%1%"=="" goto SrcDone\r
+if "%1%"=="." goto SrcDone\r
+set XSRC=%1\r
+\r
+if not "%XSRC%"=="%1" goto SmallEnv\r
+\r
+:SrcDone\r
+\r
+if not exist src mkdir src\r
+if not exist lib mkdir lib\r
+\r
+copy /Y %XSRC%\src\configh.dos .\src\config.h\r
+\r
+copy /Y %XSRC%\lib\glob.in.h .\lib\glob.h\r
+copy /Y %XSRC%\lib\fnmatch.in.h .\lib\fnmatch.h\r
+\r
+rem Echo ON so they will see what is going on.\r
+@echo on\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/commands.c -o commands.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/output.c -o output.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/job.c -o job.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/dir.c -o dir.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/file.c -o file.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/misc.c -o misc.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/main.c -o main.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -DINCLUDEDIR=\"c:/djgpp/include\" -O2 -g %XSRC%/src/read.c -o read.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -DLIBDIR=\"c:/djgpp/lib\" -O2 -g %XSRC%/src/remake.c -o remake.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/rule.c -o rule.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/implicit.c -o implicit.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/default.c -o default.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/variable.c -o variable.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/expand.c -o eyxpand.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/function.c -o function.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/vpath.c -o vpath.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/hash.c -o hash.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/strcache.c -o strcache.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/version.c -o version.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/ar.c -o ar.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/arscan.c -o arscan.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/signame.c -o signame.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/remote-stub.c -o remote-stub.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/getopt.c -o getopt.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/src/getopt1.c -o getopt1.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/lib/glob.c -o lib/glob.o\r
+gcc -c -I./src -I%XSRC%/src -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/lib/fnmatch.c -o lib/fnmatch.o\r
+@echo off\r
+echo commands.o > respf.$$$\r
+for %%f in (job output dir file misc main read remake rule implicit default variable) do echo %%f.o >> respf.$$$\r
+for %%f in (expand function vpath hash strcache version ar arscan signame remote-stub getopt getopt1) do echo %%f.o >> respf.$$$\r
+for %%f in (lib\glob lib\fnmatch) do echo %%f.o >> respf.$$$\r
+rem gcc  -c -I./src -I%XSRC% -I./lib -I%XSRC%/lib -DHAVE_CONFIG_H -O2 -g %XSRC%/guile.c -o guile.o\r
+rem echo guile.o >> respf.$$$\r
+@echo Linking...\r
+@echo on\r
+gcc -o make.exe @respf.$$$\r
+@echo off\r
+if not exist make.exe echo Make.exe build failed...\r
+if exist make.exe echo make.exe is now built!\r
+if exist make.exe del respf.$$$\r
+if exist make.exe copy /Y Basic.mk Makefile\r
+goto End\r
+\r
+:SmallEnv\r
+echo Your environment is too small.  Please enlarge it and run me again.\r
+\r
+:End\r
+set XRSC=\r
+@echo on\r
diff --git a/commands.c b/commands.c
deleted file mode 100644 (file)
index 124b93e..0000000
+++ /dev/null
@@ -1,710 +0,0 @@
-/* Command processing for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "dep.h"
-#include "variable.h"
-#include "job.h"
-#include "commands.h"
-#ifdef WINDOWS32
-#include <windows.h>
-#include "w32err.h"
-#endif
-
-#if VMS
-# define FILE_LIST_SEPARATOR (vms_comma_separator ? ',' : ' ')
-#else
-# define FILE_LIST_SEPARATOR ' '
-#endif
-
-#ifndef HAVE_UNISTD_H
-int getpid ();
-#endif
-\f
-
-static unsigned long
-dep_hash_1 (const void *key)
-{
-  const struct dep *d = key;
-  return_STRING_HASH_1 (dep_name (d));
-}
-
-static unsigned long
-dep_hash_2 (const void *key)
-{
-  const struct dep *d = key;
-  return_STRING_HASH_2 (dep_name (d));
-}
-
-static int
-dep_hash_cmp (const void *x, const void *y)
-{
-  const struct dep *dx = x;
-  const struct dep *dy = y;
-  return strcmp (dep_name (dx), dep_name (dy));
-}
-
-/* Set FILE's automatic variables up.  */
-
-void
-set_file_variables (struct file *file)
-{
-  struct dep *d;
-  const char *at, *percent, *star, *less;
-
-#ifndef NO_ARCHIVES
-  /* If the target is an archive member 'lib(member)',
-     then $@ is 'lib' and $% is 'member'.  */
-
-  if (ar_name (file->name))
-    {
-      unsigned int len;
-      const char *cp;
-      char *p;
-
-      cp = strchr (file->name, '(');
-      p = alloca (cp - file->name + 1);
-      memcpy (p, file->name, cp - file->name);
-      p[cp - file->name] = '\0';
-      at = p;
-      len = strlen (cp + 1);
-      p = alloca (len);
-      memcpy (p, cp + 1, len - 1);
-      p[len - 1] = '\0';
-      percent = p;
-    }
-  else
-#endif  /* NO_ARCHIVES.  */
-    {
-      at = file->name;
-      percent = "";
-    }
-
-  /* $* is the stem from an implicit or static pattern rule.  */
-  if (file->stem == 0)
-    {
-      /* In Unix make, $* is set to the target name with
-         any suffix in the .SUFFIXES list stripped off for
-         explicit rules.  We store this in the 'stem' member.  */
-      const char *name;
-      unsigned int len;
-
-#ifndef NO_ARCHIVES
-      if (ar_name (file->name))
-        {
-          name = strchr (file->name, '(') + 1;
-          len = strlen (name) - 1;
-        }
-      else
-#endif
-        {
-          name = file->name;
-          len = strlen (name);
-        }
-
-      for (d = enter_file (strcache_add (".SUFFIXES"))->deps; d ; d = d->next)
-        {
-          unsigned int slen = strlen (dep_name (d));
-          if (len > slen && strneq (dep_name (d), name + (len - slen), slen))
-            {
-              file->stem = strcache_add_len (name, len - slen);
-              break;
-            }
-        }
-      if (d == 0)
-        file->stem = "";
-    }
-  star = file->stem;
-
-  /* $< is the first not order-only dependency.  */
-  less = "";
-  for (d = file->deps; d != 0; d = d->next)
-    if (!d->ignore_mtime)
-      {
-        if (!d->need_2nd_expansion)
-          less = dep_name (d);
-        break;
-      }
-
-  if (file->cmds == default_file->cmds)
-    /* This file got its commands from .DEFAULT.
-       In this case $< is the same as $@.  */
-    less = at;
-
-#define DEFINE_VARIABLE(name, len, value) \
-  (void) define_variable_for_file (name,len,value,o_automatic,0,file)
-
-  /* Define the variables.  */
-
-  DEFINE_VARIABLE ("<", 1, less);
-  DEFINE_VARIABLE ("*", 1, star);
-  DEFINE_VARIABLE ("@", 1, at);
-  DEFINE_VARIABLE ("%", 1, percent);
-
-  /* Compute the values for $^, $+, $?, and $|.  */
-
-  {
-    static char *plus_value=0, *bar_value=0, *qmark_value=0;
-    static unsigned int plus_max=0, bar_max=0, qmark_max=0;
-
-    unsigned int qmark_len, plus_len, bar_len;
-    char *cp;
-    char *caret_value;
-    char *qp;
-    char *bp;
-    unsigned int len;
-
-    struct hash_table dep_hash;
-    void **slot;
-
-    /* Compute first the value for $+, which is supposed to contain
-       duplicate dependencies as they were listed in the makefile.  */
-
-    plus_len = 0;
-    bar_len = 0;
-    for (d = file->deps; d != 0; d = d->next)
-      {
-        if (!d->need_2nd_expansion)
-          {
-            if (d->ignore_mtime)
-              bar_len += strlen (dep_name (d)) + 1;
-            else
-              plus_len += strlen (dep_name (d)) + 1;
-          }
-      }
-
-    if (bar_len == 0)
-      bar_len++;
-
-    if (plus_len == 0)
-      plus_len++;
-
-    if (plus_len > plus_max)
-      plus_value = xrealloc (plus_value, plus_max = plus_len);
-
-    cp = plus_value;
-
-    qmark_len = plus_len + 1;   /* Will be this or less.  */
-    for (d = file->deps; d != 0; d = d->next)
-      if (! d->ignore_mtime && ! d->need_2nd_expansion)
-        {
-          const char *c = dep_name (d);
-
-#ifndef NO_ARCHIVES
-          if (ar_name (c))
-            {
-              c = strchr (c, '(') + 1;
-              len = strlen (c) - 1;
-            }
-          else
-#endif
-            len = strlen (c);
-
-          memcpy (cp, c, len);
-          cp += len;
-          *cp++ = FILE_LIST_SEPARATOR;
-          if (! (d->changed || always_make_flag))
-            qmark_len -= len + 1;       /* Don't space in $? for this one.  */
-        }
-
-    /* Kill the last space and define the variable.  */
-
-    cp[cp > plus_value ? -1 : 0] = '\0';
-    DEFINE_VARIABLE ("+", 1, plus_value);
-
-    /* Compute the values for $^, $?, and $|.  */
-
-    cp = caret_value = plus_value; /* Reuse the buffer; it's big enough.  */
-
-    if (qmark_len > qmark_max)
-      qmark_value = xrealloc (qmark_value, qmark_max = qmark_len);
-    qp = qmark_value;
-
-    if (bar_len > bar_max)
-      bar_value = xrealloc (bar_value, bar_max = bar_len);
-    bp = bar_value;
-
-    /* Make sure that no dependencies are repeated in $^, $?, and $|.  It
-       would be natural to combine the next two loops but we can't do it
-       because of a situation where we have two dep entries, the first
-       is order-only and the second is normal (see below).  */
-
-    hash_init (&dep_hash, 500, dep_hash_1, dep_hash_2, dep_hash_cmp);
-
-    for (d = file->deps; d != 0; d = d->next)
-      {
-        if (d->need_2nd_expansion)
-          continue;
-
-        slot = hash_find_slot (&dep_hash, d);
-        if (HASH_VACANT (*slot))
-          hash_insert_at (&dep_hash, d, slot);
-        else
-          {
-            /* Check if the two prerequisites have different ignore_mtime.
-               If so then we need to "upgrade" one that is order-only.  */
-
-            struct dep* hd = (struct dep*) *slot;
-
-            if (d->ignore_mtime != hd->ignore_mtime)
-              d->ignore_mtime = hd->ignore_mtime = 0;
-          }
-      }
-
-    for (d = file->deps; d != 0; d = d->next)
-      {
-        const char *c;
-
-        if (d->need_2nd_expansion || hash_find_item (&dep_hash, d) != d)
-          continue;
-
-        c = dep_name (d);
-#ifndef NO_ARCHIVES
-        if (ar_name (c))
-          {
-            c = strchr (c, '(') + 1;
-            len = strlen (c) - 1;
-          }
-        else
-#endif
-          len = strlen (c);
-
-        if (d->ignore_mtime)
-          {
-            memcpy (bp, c, len);
-            bp += len;
-            *bp++ = FILE_LIST_SEPARATOR;
-          }
-        else
-          {
-            memcpy (cp, c, len);
-            cp += len;
-            *cp++ = FILE_LIST_SEPARATOR;
-            if (d->changed || always_make_flag)
-              {
-                memcpy (qp, c, len);
-                qp += len;
-                *qp++ = FILE_LIST_SEPARATOR;
-              }
-          }
-      }
-
-    hash_free (&dep_hash, 0);
-
-    /* Kill the last spaces and define the variables.  */
-
-    cp[cp > caret_value ? -1 : 0] = '\0';
-    DEFINE_VARIABLE ("^", 1, caret_value);
-
-    qp[qp > qmark_value ? -1 : 0] = '\0';
-    DEFINE_VARIABLE ("?", 1, qmark_value);
-
-    bp[bp > bar_value ? -1 : 0] = '\0';
-    DEFINE_VARIABLE ("|", 1, bar_value);
-  }
-
-#undef  DEFINE_VARIABLE
-}
-\f
-/* Chop CMDS up into individual command lines if necessary.
-   Also set the 'lines_flags' and 'any_recurse' members.  */
-
-void
-chop_commands (struct commands *cmds)
-{
-  unsigned int nlines, idx;
-  char **lines;
-
-  /* If we don't have any commands,
-     or we already parsed them, never mind.  */
-
-  if (!cmds || cmds->command_lines != 0)
-    return;
-
-  /* Chop CMDS->commands up into lines in CMDS->command_lines.  */
-
-  if (one_shell)
-    {
-      int l = strlen (cmds->commands);
-
-      nlines = 1;
-      lines = xmalloc (nlines * sizeof (char *));
-      lines[0] = xstrdup (cmds->commands);
-
-      /* Strip the trailing newline.  */
-      if (l > 0 && lines[0][l-1] == '\n')
-        lines[0][l-1] = '\0';
-    }
-  else
-    {
-      const char *p;
-
-      nlines = 5;
-      lines = xmalloc (nlines * sizeof (char *));
-      idx = 0;
-      p = cmds->commands;
-      while (*p != '\0')
-        {
-          const char *end = p;
-        find_end:;
-          end = strchr (end, '\n');
-          if (end == 0)
-            end = p + strlen (p);
-          else if (end > p && end[-1] == '\\')
-            {
-              int backslash = 1;
-              const char *b;
-              for (b = end - 2; b >= p && *b == '\\'; --b)
-                backslash = !backslash;
-              if (backslash)
-                {
-                  ++end;
-                  goto find_end;
-                }
-            }
-
-          if (idx == nlines)
-            {
-              nlines += 2;
-              lines = xrealloc (lines, nlines * sizeof (char *));
-            }
-          lines[idx++] = xstrndup (p, end - p);
-          p = end;
-          if (*p != '\0')
-            ++p;
-        }
-
-      if (idx != nlines)
-        {
-          nlines = idx;
-          lines = xrealloc (lines, nlines * sizeof (char *));
-        }
-    }
-
-  /* Finally, set the corresponding CMDS->lines_flags elements and the
-     CMDS->any_recurse flag.  */
-
-  if (nlines > USHRT_MAX)
-    ON (fatal, &cmds->fileinfo, _("Recipe has too many lines (%ud)"), nlines);
-
-  cmds->ncommand_lines = nlines;
-  cmds->command_lines = lines;
-
-  cmds->any_recurse = 0;
-  cmds->lines_flags = xmalloc (nlines);
-
-  for (idx = 0; idx < nlines; ++idx)
-    {
-      unsigned char flags = 0;
-      const char *p = lines[idx];
-
-      while (ISBLANK (*p) || *p == '-' || *p == '@' || *p == '+')
-        switch (*(p++))
-          {
-          case '+':
-            flags |= COMMANDS_RECURSE;
-            break;
-          case '@':
-            flags |= COMMANDS_SILENT;
-            break;
-          case '-':
-            flags |= COMMANDS_NOERROR;
-            break;
-          }
-
-      /* If no explicit '+' was given, look for MAKE variable references.  */
-      if (!(flags & COMMANDS_RECURSE)
-          && (strstr (p, "$(MAKE)") != 0 || strstr (p, "${MAKE}") != 0))
-        flags |= COMMANDS_RECURSE;
-
-      cmds->lines_flags[idx] = flags;
-      cmds->any_recurse |= flags & COMMANDS_RECURSE ? 1 : 0;
-    }
-}
-\f
-/* Execute the commands to remake FILE.  If they are currently executing,
-   return or have already finished executing, just return.  Otherwise,
-   fork off a child process to run the first command line in the sequence.  */
-
-void
-execute_file_commands (struct file *file)
-{
-  const char *p;
-
-  /* Don't go through all the preparations if
-     the commands are nothing but whitespace.  */
-
-  for (p = file->cmds->commands; *p != '\0'; ++p)
-    if (!ISSPACE (*p) && *p != '-' && *p != '@' && *p != '+')
-      break;
-  if (*p == '\0')
-    {
-      /* If there are no commands, assume everything worked.  */
-      set_command_state (file, cs_running);
-      file->update_status = us_success;
-      notice_finished_file (file);
-      return;
-    }
-
-  /* First set the automatic variables according to this file.  */
-
-  initialize_file_variables (file, 0);
-
-  set_file_variables (file);
-
-  /* If this is a loaded dynamic object, unload it before remaking.
-     Some systems don't support overwriting a loaded object.  */
-  if (file->loaded)
-    unload_file (file->name);
-
-  /* Start the commands running.  */
-  new_job (file);
-}
-\f
-/* This is set while we are inside fatal_error_signal,
-   so things can avoid nonreentrant operations.  */
-
-int handling_fatal_signal = 0;
-
-/* Handle fatal signals.  */
-
-RETSIGTYPE
-fatal_error_signal (int sig)
-{
-#ifdef __MSDOS__
-  extern int dos_status, dos_command_running;
-
-  if (dos_command_running)
-    {
-      /* That was the child who got the signal, not us.  */
-      dos_status |= (sig << 8);
-      return;
-    }
-  remove_intermediates (1);
-  exit (EXIT_FAILURE);
-#else /* not __MSDOS__ */
-#ifdef _AMIGA
-  remove_intermediates (1);
-  if (sig == SIGINT)
-     fputs (_("*** Break.\n"), stderr);
-
-  exit (10);
-#else /* not Amiga */
-#ifdef WINDOWS32
-  extern HANDLE main_thread;
-
-  /* Windows creates a sperate thread for handling Ctrl+C, so we need
-     to suspend the main thread, or else we will have race conditions
-     when both threads call reap_children.  */
-  if (main_thread)
-    {
-      DWORD susp_count = SuspendThread (main_thread);
-
-      if (susp_count != 0)
-        fprintf (stderr, "SuspendThread: suspend count = %ld\n", susp_count);
-      else if (susp_count == (DWORD)-1)
-        {
-          DWORD ierr = GetLastError ();
-
-          fprintf (stderr, "SuspendThread: error %ld: %s\n",
-                   ierr, map_windows32_error_to_string (ierr));
-        }
-    }
-#endif
-  handling_fatal_signal = 1;
-
-  /* Set the handling for this signal to the default.
-     It is blocked now while we run this handler.  */
-  signal (sig, SIG_DFL);
-
-  /* A termination signal won't be sent to the entire
-     process group, but it means we want to kill the children.  */
-
-  if (sig == SIGTERM)
-    {
-      struct child *c;
-      for (c = children; c != 0; c = c->next)
-        if (!c->remote)
-          (void) kill (c->pid, SIGTERM);
-    }
-
-  /* If we got a signal that means the user
-     wanted to kill make, remove pending targets.  */
-
-  if (sig == SIGTERM || sig == SIGINT
-#ifdef SIGHUP
-    || sig == SIGHUP
-#endif
-#ifdef SIGQUIT
-    || sig == SIGQUIT
-#endif
-    )
-    {
-      struct child *c;
-
-      /* Remote children won't automatically get signals sent
-         to the process group, so we must send them.  */
-      for (c = children; c != 0; c = c->next)
-        if (c->remote)
-          (void) remote_kill (c->pid, sig);
-
-      for (c = children; c != 0; c = c->next)
-        delete_child_targets (c);
-
-      /* Clean up the children.  We don't just use the call below because
-         we don't want to print the "Waiting for children" message.  */
-      while (job_slots_used > 0)
-        reap_children (1, 0);
-    }
-  else
-    /* Wait for our children to die.  */
-    while (job_slots_used > 0)
-      reap_children (1, 1);
-
-  /* Delete any non-precious intermediate files that were made.  */
-
-  remove_intermediates (1);
-
-#ifdef SIGQUIT
-  if (sig == SIGQUIT)
-    /* We don't want to send ourselves SIGQUIT, because it will
-       cause a core dump.  Just exit instead.  */
-    exit (MAKE_TROUBLE);
-#endif
-
-#ifdef WINDOWS32
-  if (main_thread)
-    CloseHandle (main_thread);
-  /* Cannot call W32_kill with a pid (it needs a handle).  The exit
-     status of 130 emulates what happens in Bash.  */
-  exit (130);
-#else
-  /* Signal the same code; this time it will really be fatal.  The signal
-     will be unblocked when we return and arrive then to kill us.  */
-  if (kill (getpid (), sig) < 0)
-    pfatal_with_name ("kill");
-#endif /* not WINDOWS32 */
-#endif /* not Amiga */
-#endif /* not __MSDOS__  */
-}
-\f
-/* Delete FILE unless it's precious or not actually a file (phony),
-   and it has changed on disk since we last stat'd it.  */
-
-static void
-delete_target (struct file *file, const char *on_behalf_of)
-{
-  struct stat st;
-  int e;
-
-  if (file->precious || file->phony)
-    return;
-
-#ifndef NO_ARCHIVES
-  if (ar_name (file->name))
-    {
-      time_t file_date = (file->last_mtime == NONEXISTENT_MTIME
-                          ? (time_t) -1
-                          : (time_t) FILE_TIMESTAMP_S (file->last_mtime));
-      if (ar_member_date (file->name) != file_date)
-        {
-          if (on_behalf_of)
-            OSS (error, NILF,
-                 _("*** [%s] Archive member '%s' may be bogus; not deleted"),
-                 on_behalf_of, file->name);
-          else
-            OS (error, NILF,
-                _("*** Archive member '%s' may be bogus; not deleted"),
-                file->name);
-        }
-      return;
-    }
-#endif
-
-  EINTRLOOP (e, stat (file->name, &st));
-  if (e == 0
-      && S_ISREG (st.st_mode)
-      && FILE_TIMESTAMP_STAT_MODTIME (file->name, st) != file->last_mtime)
-    {
-      if (on_behalf_of)
-        OSS (error, NILF,
-             _("*** [%s] Deleting file '%s'"), on_behalf_of, file->name);
-      else
-        OS (error, NILF, _("*** Deleting file '%s'"), file->name);
-      if (unlink (file->name) < 0
-          && errno != ENOENT)   /* It disappeared; so what.  */
-        perror_with_name ("unlink: ", file->name);
-    }
-}
-
-
-/* Delete all non-precious targets of CHILD unless they were already deleted.
-   Set the flag in CHILD to say they've been deleted.  */
-
-void
-delete_child_targets (struct child *child)
-{
-  struct dep *d;
-
-  if (child->deleted)
-    return;
-
-  /* Delete the target file if it changed.  */
-  delete_target (child->file, NULL);
-
-  /* Also remove any non-precious targets listed in the 'also_make' member.  */
-  for (d = child->file->also_make; d != 0; d = d->next)
-    delete_target (d->file, child->file->name);
-
-  child->deleted = 1;
-}
-\f
-/* Print out the commands in CMDS.  */
-
-void
-print_commands (const struct commands *cmds)
-{
-  const char *s;
-
-  fputs (_("#  recipe to execute"), stdout);
-
-  if (cmds->fileinfo.filenm == 0)
-    puts (_(" (built-in):"));
-  else
-    printf (_(" (from '%s', line %lu):\n"),
-            cmds->fileinfo.filenm, cmds->fileinfo.lineno);
-
-  s = cmds->commands;
-  while (*s != '\0')
-    {
-      const char *end;
-      int bs;
-
-      /* Print one full logical recipe line: find a non-escaped newline.  */
-      for (end = s, bs = 0; *end != '\0'; ++end)
-        {
-          if (*end == '\n' && !bs)
-            break;
-
-          bs = *end == '\\' ? !bs : 0;
-        }
-
-      printf ("%c%.*s\n", cmd_prefix, (int) (end - s), s);
-
-      s = end + (end[0] == '\n');
-    }
-}
diff --git a/commands.h b/commands.h
deleted file mode 100644 (file)
index 18d8c28..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Definition of data structures describing shell commands for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Structure that gives the commands to make a file
-   and information about where these commands came from.  */
-
-struct commands
-  {
-    floc fileinfo;              /* Where commands were defined.  */
-    char *commands;             /* Commands text.  */
-    char **command_lines;       /* Commands chopped up into lines.  */
-    unsigned char *lines_flags; /* One set of flag bits for each line.  */
-    unsigned short ncommand_lines;/* Number of command lines.  */
-    char recipe_prefix;         /* Recipe prefix for this command set.  */
-    unsigned int any_recurse:1; /* Nonzero if any 'lines_flags' elt has */
-                                /* the COMMANDS_RECURSE bit set.  */
-  };
-
-/* Bits in 'lines_flags'.  */
-#define COMMANDS_RECURSE        1 /* Recurses: + or $(MAKE).  */
-#define COMMANDS_SILENT         2 /* Silent: @.  */
-#define COMMANDS_NOERROR        4 /* No errors: -.  */
-
-RETSIGTYPE fatal_error_signal (int sig);
-void execute_file_commands (struct file *file);
-void print_commands (const struct commands *cmds);
-void delete_child_targets (struct child *child);
-void chop_commands (struct commands *cmds);
-void set_file_variables (struct file *file);
diff --git a/config.ami b/config.ami
deleted file mode 100644 (file)
index b342a83..0000000
+++ /dev/null
@@ -1,337 +0,0 @@
-/* config.h -- hand-massaged for Amiga                                  -*-C-*-
-Copyright (C) 1995-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Define if on AIX 3.
-   System headers sometimes define this.
-   We just want to avoid a redefinition error message.  */
-#ifndef _ALL_SOURCE
-/* #undef _ALL_SOURCE */
-#endif
-
-/* Define if using alloca.c.  */
-#define C_ALLOCA
-
-/* Define if the closedir function returns void instead of int.  */
-/* #undef CLOSEDIR_VOID */
-
-/* Define to empty if the keyword does not work.  */
-/* #undef const */
-
-/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
-   This function is required for alloca.c support on those systems.  */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define for DGUX with <sys/dg_sys_info.h>.  */
-/* #undef DGUX */
-
-/* Define if the 'getloadavg' function needs to be run setuid or setgid.  */
-/* #undef GETLOADAVG_PRIVILEGED */
-
-/* Define to 'unsigned long' or 'unsigned long long'
-   if <inttypes.h> doesn't define.  */
-#define uintmax_t unsigned long
-
-/* Define to 'int' if <sys/types.h> doesn't define.  */
-#define gid_t int
-
-/* Define if you have alloca, as a function or macro.  */
-/* #undef HAVE_ALLOCA */
-
-/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
-/* #undef HAVE_ALLOCA_H */
-
-/* Define if your system has a working fnmatch function.  */
-/* #undef HAVE_FNMATCH */
-
-/* Define if your system has its own 'getloadavg' function.  */
-/* #undef HAVE_GETLOADAVG */
-
-/* Define if you have the getmntent function.  */
-/* #undef HAVE_GETMNTENT */
-
-/* Embed GNU Guile support */
-/* #undef HAVE_GUILE */
-
-/* Define if the 'long double' type works.  */
-/* #undef HAVE_LONG_DOUBLE */
-
-/* Define if you support file names longer than 14 characters.  */
-#define HAVE_LONG_FILE_NAMES 1
-
-/* Define if you have a working 'mmap' system call.  */
-/* #undef HAVE_MMAP */
-
-/* Define if system calls automatically restart after interruption
-   by a signal.  */
-/* #undef HAVE_RESTARTABLE_SYSCALLS */
-
-/* Define if your struct stat has st_blksize.  */
-/* #undef HAVE_ST_BLKSIZE */
-
-/* Define if your struct stat has st_blocks.  */
-/* #undef HAVE_ST_BLOCKS */
-
-/* Define if you have the strcoll function and it is properly defined.  */
-#define HAVE_STRCOLL 1
-
-/* Define if your struct stat has st_rdev.  */
-#define HAVE_ST_RDEV 1
-
-/* Define if you have the strftime function.  */
-#define HAVE_STRFTIME 1
-
-/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
-/* #undef HAVE_SYS_WAIT_H */
-
-/* Define if your struct tm has tm_zone.  */
-/* #undef HAVE_TM_ZONE */
-
-/* Define if you don't have tm_zone but do have the external array
-   tzname.  */
-#define HAVE_TZNAME 1
-
-/* Define if you have <unistd.h>.  */
-#define HAVE_UNISTD_H 1
-
-/* Define if utime(file, NULL) sets file's timestamp to the present.  */
-/* #undef HAVE_UTIME_NULL */
-
-/* Define if you have the wait3 system call.  */
-/* #undef HAVE_WAIT3 */
-
-/* Define if on MINIX.  */
-/* #undef _MINIX */
-
-/* Define if your struct nlist has an n_un member.  */
-/* #undef NLIST_NAME_UNION */
-
-/* Define if you have <nlist.h>.  */
-/* #undef NLIST_STRUCT */
-
-/* Define if your C compiler doesn't accept -c and -o together.  */
-/* #undef NO_MINUS_C_MINUS_O */
-
-/* Define to 'int' if <sys/types.h> doesn't define.  */
-#define pid_t int
-
-/* Define if the system does not provide POSIX.1 features except
-   with this defined.  */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define if you need to in order for stat and other things to work.  */
-/* #undef _POSIX_SOURCE */
-
-/* Define as the return type of signal handlers (int or void).  */
-#define RETSIGTYPE void
-
-/* Define if the setvbuf function takes the buffering type as its second
-   argument and the buffer pointer as the third, as on System V
-   before release 3.  */
-/* #undef SETVBUF_REVERSED */
-
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at run-time.
-        STACK_DIRECTION > 0 => grows toward higher addresses
-        STACK_DIRECTION < 0 => grows toward lower addresses
-        STACK_DIRECTION = 0 => direction of growth unknown
- */
-#define STACK_DIRECTION -1
-
-/* Define if the 'S_IS*' macros in <sys/stat.h> do not work properly.  */
-/* #undef STAT_MACROS_BROKEN */
-
-/* Define if you have the ANSI C header files.  */
-#define STDC_HEADERS
-
-/* Define on System V Release 4.  */
-/* #undef SVR4 */
-
-/* Define if 'sys_siglist' is declared by <signal.h>.  */
-/* #undef SYS_SIGLIST_DECLARED */
-
-/* Define to 'int' if <sys/types.h> doesn't define.  */
-#define uid_t int
-
-/* Define for Encore UMAX.  */
-/* #undef UMAX */
-
-/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
-   instead of <sys/cpustats.h>.  */
-/* #undef UMAX4_3 */
-
-/* Name of this package (needed by automake) */
-#define PACKAGE "make"
-
-/* Version of this package (needed by automake) */
-#define VERSION "4.2.1"
-
-/* Define to the name of the SCCS 'get' command.  */
-#define SCCS_GET "get"
-
-/* Define this if the SCCS 'get' command understands the '-G<file>' option.  */
-/* #undef SCCS_GET_MINUS_G */
-
-/* Define this to enable job server support in GNU make.  */
-/* #undef MAKE_JOBSERVER */
-
-/* Define to be the nanoseconds member of struct stat's st_mtim,
-   if it exists.  */
-/* #undef ST_MTIM_NSEC */
-
-/* Define this if the C library defines the variable 'sys_siglist'.  */
-/* #undef HAVE_SYS_SIGLIST */
-
-/* Define this if the C library defines the variable '_sys_siglist'.  */
-/* #undef HAVE__SYS_SIGLIST */
-
-/* Define this if you have the 'union wait' type in <sys/wait.h>.  */
-/* #undef HAVE_UNION_WAIT */
-
-/* Define if you have the dup2 function.  */
-/* #undef HAVE_DUP2 */
-
-/* Define if you have the getcwd function.  */
-#define HAVE_GETCWD 1
-
-/* Define if you have the getgroups function.  */
-/* #undef HAVE_GETGROUPS */
-
-/* Define if you have the gethostbyname function.  */
-/* #undef HAVE_GETHOSTBYNAME */
-
-/* Define if you have the gethostname function.  */
-/* #undef HAVE_GETHOSTNAME */
-
-/* Define if you have the memmove function.  */
-#define HAVE_MEMMOVE 1
-
-/* Define if you have the mktemp function.  */
-#define HAVE_MKTEMP 1
-
-/* Define if you have the psignal function.  */
-/* #undef HAVE_PSIGNAL */
-
-/* Define if you have the pstat_getdynamic function.  */
-/* #undef HAVE_PSTAT_GETDYNAMIC */
-
-/* Define if you have the setegid function.  */
-/* #undef HAVE_SETEGID */
-
-/* Define if you have the seteuid function.  */
-/* #undef HAVE_SETEUID */
-
-/* Define if you have the setlinebuf function.  */
-/* #undef HAVE_SETLINEBUF */
-
-/* Define if you have the setregid function.  */
-/* #undef HAVE_SETREGID */
-
-/* Define if you have the setreuid function.  */
-/* #undef HAVE_SETREUID */
-
-/* Define if you have the sigsetmask function.  */
-/* #undef HAVE_SIGSETMASK */
-
-/* Define if you have the socket function.  */
-/* #undef HAVE_SOCKET */
-
-/* Define to 1 if you have the strcasecmp function.  */
-/* #undef HAVE_STRCASECMP */
-
-/* Define to 1 if you have the strcmpi function.  */
-/* #undef HAVE_STRCMPI */
-
-/* Define to 1 if you have the stricmp function.  */
-/* #undef HAVE_STRICMP */
-
-/* Define if you have the strerror function.  */
-#define HAVE_STRERROR 1
-
-/* Define if you have the strsignal function.  */
-/* #undef HAVE_STRSIGNAL */
-
-/* Define if you have the wait3 function.  */
-/* #undef HAVE_WAIT3 */
-
-/* Define if you have the waitpid function.  */
-/* #undef HAVE_WAITPID */
-
-/* Define if you have the <dirent.h> header file.  */
-#define HAVE_DIRENT_H 1
-
-/* Define if you have the <fcntl.h> header file.  */
-#define HAVE_FCNTL_H 1
-
-/* Define if you have the <limits.h> header file.  */
-#define HAVE_LIMITS_H 1
-
-/* Define if you have the <mach/mach.h> header file.  */
-/* #undef HAVE_MACH_MACH_H */
-
-/* Define if you have the <memory.h> header file.  */
-/* #undef HAVE_MEMORY_H */
-
-/* Define if you have the <ndir.h> header file.  */
-/* #undef HAVE_NDIR_H */
-
-/* Define if you have the <stdlib.h> header file.  */
-/* #undef HAVE_STDLIB_H */
-
-/* Define if you have the <string.h> header file.  */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <sys/dir.h> header file.  */
-#define HAVE_SYS_DIR_H 1
-
-/* Define if you have the <sys/ndir.h> header file.  */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define if you have the <sys/param.h> header file.  */
-/* #undef HAVE_SYS_PARAM_H */
-
-/* Define if you have the <sys/timeb.h> header file.  */
-/* #undef HAVE_SYS_TIMEB_H */
-
-/* Define if you have the <sys/wait.h> header file.  */
-/* #undef HAVE_SYS_WAIT_H */
-
-/* Define if you have the <unistd.h> header file.  */
-#define HAVE_UNISTD_H 1
-
-/* Define if you have the dgc library (-ldgc).  */
-/* #undef HAVE_LIBDGC */
-
-/* Define if you have the kstat library (-lkstat).  */
-/* #undef HAVE_LIBKSTAT */
-
-/* Define to 1 if you have the `isatty' function. */
-/* #undef HAVE_ISATTY */
-
-/* Define to 1 if you have the `ttyname' function. */
-/* #undef HAVE_TTYNAME */
-
-/* Define if you have the sun library (-lsun).  */
-/* #undef HAVE_LIBSUN */
-
-/* Output sync sypport */
-#define NO_OUTPUT_SYNC
-
-/* Define for Case Insensitve behavior */
-#define HAVE_CASE_INSENSITIVE_FS
-
-/* Build host information. */
-#define MAKE_HOST "Amiga"
diff --git a/config.h-vms b/config.h-vms
deleted file mode 100644 (file)
index c538672..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-/* config.h-vms. Generated by hand by Klaus Kämpf <kkaempf@rmi.de>      -*-C-*-
-
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* config.h.  Generated automatically by configure.  */
-/* config.h.in.  Generated automatically from configure.ac by autoheader.  */
-
-/* Pull in types.h here to get __CRTL_VER defined for old versions of the
-   compiler which don't define it. */
-#ifdef __DECC
-# include <types.h>
-#endif
-
-/* Define to 1 if on AIX 3.
-   System headers sometimes define this.
-   We just want to avoid a redefinition error message.  */
-#ifndef _ALL_SOURCE
-/* #undef _ALL_SOURCE */
-#endif
-
-/* Define to 1 if NLS is requested.  */
-/* #undef ENABLE_NLS */
-
-/* Define as 1 if you have dcgettext.  */
-/* #undef HAVE_DCGETTEXT */
-
-/* Define as 1 if you have gettext and don't want to use GNU gettext.  */
-/* #undef HAVE_GETTEXT */
-
-/* Embed GNU Guile support */
-/* #undef HAVE_GUILE */
-
-/* Define to 1 if your locale.h file contains LC_MESSAGES.  */
-/* #undef HAVE_LC_MESSAGES */
-
-/* Define to the installation directory for locales.  */
-#define LOCALEDIR ""
-
-/* Define as 1 if you have the stpcpy function.  */
-/* #undef HAVE_STPCPY */
-
-/* Define to 1 if the closedir function returns void instead of int.  */
-/* #undef CLOSEDIR_VOID */
-
-/* Define to empty if the keyword does not work.  */
-/* #undef const */
-
-/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
-   This function is required for alloca.c support on those systems.  */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define for DGUX with <sys/dg_sys_info.h>.  */
-/* #undef DGUX */
-
-/* Define to 1 if the 'getloadavg' function needs to be run setuid or setgid.  */
-/* #undef GETLOADAVG_PRIVILEGED */
-
-/* Define to 'unsigned long' or 'unsigned long long'
-   if <inttypes.h> doesn't define.  */
-#define uintmax_t unsigned long
-
-/* Define to 'int' if <sys/types.h> doesn't define.  */
-/* #undef gid_t */
-
-/* Define to 1 if you have alloca, as a function or macro.  */
-#define HAVE_ALLOCA 1
-
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).  */
-/* #undef HAVE_ALLOCA_H */
-
-/* Define to 1 if you have the fdopen function.  */
-#define HAVE_FDOPEN 1
-
-/* Define to 1 if your system has a working fnmatch function.  */
-/* #undef HAVE_FNMATCH */
-
-/* Define to 1 if your system has its own 'getloadavg' function.  */
-/* #undef HAVE_GETLOADAVG */
-
-/* Define to 1 if you have the getmntent function.  */
-/* #undef HAVE_GETMNTENT */
-
-/* Define to 1 if the 'long double' type works.  */
-/* #undef HAVE_LONG_DOUBLE */
-
-/* Define to 1 if you support file names longer than 14 characters.  */
-#define HAVE_LONG_FILE_NAMES 1
-
-/* Define to 1 if you have a working 'mmap' system call.  */
-/* #undef HAVE_MMAP */
-
-/* Define to 1 if system calls automatically restart after interruption
-   by a signal.  */
-/* #undef HAVE_RESTARTABLE_SYSCALLS */
-
-/* Define to 1 if your struct stat has st_blksize.  */
-/* #undef HAVE_ST_BLKSIZE */
-
-/* Define to 1 if your struct stat has st_blocks.  */
-/* #undef HAVE_ST_BLOCKS */
-
-/* Define to 1 if you have the strcoll function and it is properly defined.  */
-/* #undef HAVE_STRCOLL */
-
-/* Define to 1 if you have the strncasecmp' function. */
-#if __CRTL_VER >= 70000000
-#define HAVE_STRNCASECMP 1
-#endif
-
-/* Define to 1 if your struct stat has st_rdev.  */
-/* #undef HAVE_ST_RDEV */
-
-/* Define to 1 if you have the strftime function.  */
-/* #undef HAVE_STRFTIME */
-
-/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible.  */
-/* #undef HAVE_SYS_WAIT_H */
-
-/* Define to 1 if your struct tm has tm_zone.  */
-/* #undef HAVE_TM_ZONE */
-
-/* Define to 1 if you don't have tm_zone but do have the external array
-   tzname.  */
-/* #undef HAVE_TZNAME */
-
-/* Define to 1 if you have <unistd.h>.  */
-#ifdef __DECC
-#define HAVE_UNISTD_H 1
-#endif
-
-/* Define to 1 if utime(file, NULL) sets file's timestamp to the present.  */
-/* #undef HAVE_UTIME_NULL */
-
-/* Define to 1 if you have the wait3 system call.  */
-/* #undef HAVE_WAIT3 */
-
-/* Define to 1 if on MINIX.  */
-/* #undef _MINIX */
-
-/* Define to 1 if your struct nlist has an n_un member.  */
-/* #undef NLIST_NAME_UNION */
-
-/* Define to 1 if you have <nlist.h>.  */
-/* #undef NLIST_STRUCT */
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together.  */
-/* #undef NO_MINUS_C_MINUS_O */
-
-/* Define to 'int' if <sys/types.h> doesn't define.  */
-/* I assume types.h is available for all 5.0 cc/cxx compilers */
-#if __DECC_VER < 50090000
-#define pid_t int
-#endif
-
-/* Define to 1 if the system does not provide POSIX.1 features except
-   with this defined.  */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for stat and other things to work.  */
-/* #undef _POSIX_SOURCE */
-
-/* Define as the return type of signal handlers (int or void).  */
-#define RETSIGTYPE void
-
-/* Define to 1 if the setvbuf function takes the buffering type as its second
-   argument and the buffer pointer as the third, as on System V
-   before release 3.  */
-/* #undef SETVBUF_REVERSED */
-
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at run-time.
-        STACK_DIRECTION > 0 => grows toward higher addresses
-        STACK_DIRECTION < 0 => grows toward lower addresses
-        STACK_DIRECTION = 0 => direction of growth unknown
- */
-/* #undef STACK_DIRECTION */
-
-/* Define to 1 if the 'S_IS*' macros in <sys/stat.h> do not work properly.  */
-/* #undef STAT_MACROS_BROKEN */
-
-/* Define to 1 if you have the ANSI C header files.  */
-/* #undef STDC_HEADERS */
-
-/* Define on System V Release 4.  */
-/* #undef SVR4 */
-
-/* Define to 1 if 'sys_siglist' is declared by <signal.h>.  */
-/* #undef SYS_SIGLIST_DECLARED */
-
-/* Define to 'int' if <sys/types.h> doesn't define.  */
-#if __DECC_VER < 50090000
-#define uid_t int
-#endif
-
-/* Define for Encore UMAX.  */
-/* #undef UMAX */
-
-/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
-   instead of <sys/cpustats.h>.  */
-/* #undef UMAX4_3 */
-
-/* Name of this package (needed by automake) */
-#define PACKAGE "make"
-
-/* Version of this package (needed by automake) */
-#define VERSION "4.2.1"
-
-/* Define to the name of the SCCS 'get' command.  */
-/* #undef SCCS_GET */
-
-/* Define this if the SCCS 'get' command understands the '-G<file>' option.  */
-/* #undef SCCS_GET_MINUS_G */
-
-/* Define this to enable job server support in GNU make.  */
-/* #undef MAKE_JOBSERVER */
-
-/* Define to be the nanoseconds member of struct stat's st_mtim,
-   if it exists.  */
-/* #undef ST_MTIM_NSEC */
-
-/* Define to 1 if the C library defines the variable 'sys_siglist'.  */
-/* #undefine HAVE_SYS_SIGLIST */
-
-/* Define to 1 if the C library defines the variable '_sys_siglist'.  */
-/* #undef HAVE__SYS_SIGLIST */
-
-/* Define to 1 if you have the 'union wait' type in <sys/wait.h>.  */
-/* #undef HAVE_UNION_WAIT */
-
-/* Define to 1 if you have the dup2 function.  */
-#define HAVE_DUP2 1
-
-/* Define to 1 if you have the getcwd function.  */
-#define HAVE_GETCWD 1
-
-/* Define to 1 if you have the getgroups function.  */
-/* #undef HAVE_GETGROUPS */
-
-/* Define to 1 if you have the gethostbyname function.  */
-/* #undef HAVE_GETHOSTBYNAME */
-
-/* Define to 1 if you have the gethostname function.  */
-/* #undef HAVE_GETHOSTNAME */
-
-/* Define to 1 if you have the memmove function.  */
-#define HAVE_MEMMOVE 1
-
-/* Define to 1 if you have the mktemp function.  */
-#define HAVE_MKTEMP 1
-
-/* Define to 1 if you have the psignal function.  */
-/* #undef HAVE_PSIGNAL */
-
-/* Define to 1 if you have the pstat_getdynamic function.  */
-/* #undef HAVE_PSTAT_GETDYNAMIC */
-
-/* Define to 1 if you have the setegid function.  */
-/* #undef HAVE_SETEGID */
-
-/* Define to 1 if you have the seteuid function.  */
-/* #undef HAVE_SETEUID */
-
-/* Define to 1 if you have the setlinebuf function.  */
-/* #undef HAVE_SETLINEBUF */
-
-/* Define to 1 if you have the setregid function.  */
-/* #undefine HAVE_SETREGID */
-
-/* Define to 1 if you have the setreuid function.  */
-/* #define HAVE_SETREUID */
-
-/* Define to 1 if you have the sigsetmask function.  */
-#define HAVE_SIGSETMASK 1
-
-/* Define to 1 if you have the socket function.  */
-/* #undef HAVE_SOCKET */
-
-/* Define to 1 if you have the strcasecmp function.  */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the strcmpi function.  */
-/* #undef HAVE_STRCMPI */
-
-/* Define to 1 if you have the stricmp function.  */
-/* #undef HAVE_STRICMP */
-
-/* Define to 1 if you have the strerror function.  */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the strsignal function.  */
-/* #undef HAVE_STRSIGNAL */
-
-/* Define to 1 if you have the wait3 function.  */
-/* #undef HAVE_WAIT3 */
-
-/* Define to 1 if you have the waitpid function.  */
-/* #undef HAVE_WAITPID */
-
-/* Define to 1 if you have the <dirent.h> header file.  */
-#define HAVE_DIRENT_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file.  */
-#ifdef __DECC
-#define HAVE_FCNTL_H 1
-#endif
-
-/* Define to 1 if you have the <limits.h> header file.  */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <mach/mach.h> header file.  */
-/* #undef HAVE_MACH_MACH_H */
-
-/* Define to 1 if you have the <memory.h> header file.  */
-/* #undef HAVE_MEMORY_H */
-
-/* Define to 1 if you have the <ndir.h> header file.  */
-/* #undef HAVE_NDIR_H */
-
-/* Define to 1 if you have the <stdlib.h> header file.  */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <string.h> header file.  */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/dir.h> header file.  */
-/* #undef HAVE_SYS_DIR_H */
-
-/* Define to 1 if you have the <sys/ndir.h> header file.  */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define to 1 if you have the <sys/param.h> header file.  */
-/* #undef HAVE_SYS_PARAM_H */
-
-/* Define to 1 if you have the <sys/timeb.h> header file.  */
-#ifndef __GNUC__
-#define HAVE_SYS_TIMEB_H 1
-#endif
-
-/* Define to 1 if you have the <sys/wait.h> header file.  */
-/* #undef HAVE_SYS_WAIT_H */
-
-/* Define to 1 if you have the dgc library (-ldgc).  */
-/* #undef HAVE_LIBDGC */
-
-/* Define to 1 if you have the kstat library (-lkstat).  */
-/* #undef HAVE_LIBKSTAT *
-
-/* Define to 1 if you have the sun library (-lsun).  */
-/* #undef HAVE_LIBSUN */
-
-/* Define to 1 if you have the `isatty' function. */
-/* #undef HAVE_ISATTY */
-
-/* Define to 1 if you have the `ttyname' function. */
-/* #undef HAVE_TTYNAME */
-
-/* Use high resolution file timestamps if nonzero. */
-#define FILE_TIMESTAMP_HI_RES 0
-
-/* Define for case insensitve filenames */
-#define HAVE_CASE_INSENSITIVE_FS 1
-
-/* VMS specific, define it if you want to use case sensitive targets */
-/* #undef WANT_CASE_SENSITIVE_TARGETS */
-
-/* VMS specific, V7.0 has opendir() and friends, so it's undefined */
-/* If you want to use non-VMS code for opendir() etc. on V7.0 and greater
-   define the first or both macros AND change the compile command to get the
-   non-VMS versions linked: (prefix=(all,except=(opendir,...  */
-/* #undef HAVE_VMSDIR_H */
-/* #undef _DIRENT_HAVE_D_NAMLEN */
-
-/* On older systems without 7.0 backport of CRTL use non-VMS code for opendir() etc. */
-#if __CRTL_VER < 70000000
-# define HAVE_VMSDIR_H 1
-#endif
-
-#if defined(HAVE_VMSDIR_H) && defined(HAVE_DIRENT_H)
-#undef HAVE_DIRENT_H
-#endif
-
-#define HAVE_STDLIB_H 1
-#define INCLUDEDIR "sys$sysroot:[syslib]"
-#define LIBDIR "sys$sysroot:[syslib]"
-
-/* Don't use RTL functions of OpenVMS */
-#ifdef __DECC
-#include <stdio.h>
-#include <unistd.h>
-#define getopt   gnu_getopt
-#define optarg   gnu_optarg
-#define optopt   gnu_optopt
-#define optind   gnu_optind
-#define opterr   gnu_opterr
-#define globfree gnu_globfree
-#define glob     gnu_glob
-#endif
-
-/* Define if using alloca.c.  */
-/* #undef C_ALLOCA */
-/* maybe this should be placed into makeint.h */
-#if     defined(__VAX) && defined(__DECC)
-#define alloca(n)       __ALLOCA(n)
-#endif
-
-/* Output sync sypport */
-#define NO_OUTPUT_SYNC
-
-/* Define to 1 to write even short single-line actions into a VMS/DCL command
-   file; this also enables exporting make environment variables into the
-   (sub-)process, which executes the action.
-   The usual make rules apply whether a shell variable - here a DCL symbol or
-   VMS logical [see CRTL getenv()] - is added to the make environment and
-   is exported. */
-#define USE_DCL_COM_FILE 1
-
-/* Build host information. */
-#define MAKE_HOST "VMS"
diff --git a/config.h.W32 b/config.h.W32
deleted file mode 100644 (file)
index 2c6fc53..0000000
+++ /dev/null
@@ -1,532 +0,0 @@
-/* config.h.W32 -- hand-massaged config.h file for Windows builds       -*-C-*-
-
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Suppress some Visual C++ warnings.
-   Maybe after the code cleanup for ISO C we can remove some/all of these.  */
-#if _MSC_VER > 1000
-# pragma warning(disable:4100) /* unreferenced formal parameter */
-# pragma warning(disable:4102) /* unreferenced label */
-# pragma warning(disable:4127) /* conditional expression is constant */
-# pragma warning(disable:4131) /* uses old-style declarator */
-# pragma warning(disable:4702) /* unreachable code */
-# define _CRT_SECURE_NO_WARNINGS  /* function or variable may be unsafe */
-# define _CRT_NONSTDC_NO_WARNINGS /* functions w/o a leading underscore */
-#endif
-
-/* Define to 1 if the 'closedir' function returns void instead of 'int'. */
-/* #undef CLOSEDIR_VOID */
-
-/* Define to one of '_getb67', 'GETB67', 'getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for 'alloca.c' support on those systems.
-   */
-/* #undef CRAY_STACKSEG_END */
-
-/* Define to 1 if using 'alloca.c'. */
-/* #undef C_ALLOCA */
-
-/* Define to 1 if using 'getloadavg.c'. */
-#define C_GETLOADAVG 1
-
-/* Define to 1 for DGUX with <sys/dg_sys_info.h>. */
-/* #undef DGUX */
-
-/* Define to 1 if translation of program messages to the user's native
-   language is requested. */
-/* #undef ENABLE_NLS */
-
-/* Use high resolution file timestamps if nonzero. */
-#define FILE_TIMESTAMP_HI_RES 0
-
-/* Define to 1 if the 'getloadavg' function needs to be run setuid or setgid.
-   */
-/* #undef GETLOADAVG_PRIVILEGED */
-
-/* Define to 1 if you have 'alloca', as a function or macro. */
-#define HAVE_ALLOCA 1
-
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
-/* #undef HAVE_ALLOCA_H */
-
-/* Define to 1 if you have the 'atexit' function. */
-#define HAVE_ATEXIT 1
-
-/* Use case insensitive file names */
-/* #undef HAVE_CASE_INSENSITIVE_FS */
-
-/* Define to 1 if you have the clock_gettime function. */
-/* #undef HAVE_CLOCK_GETTIME */
-
-/* Embed GNU Guile support.  Windows build sets this on the
-   compilation command line.  */
-/* #undef HAVE_GUILE */
-
-/* Define if the GNU dcgettext() function is already present or preinstalled.
-   */
-/* #undef HAVE_DCGETTEXT */
-
-/* Define to 1 if you have the declaration of 'bsd_signal', and to 0 if you
-   don't. */
-#define HAVE_DECL_BSD_SIGNAL 0
-
-/* Define to 1 if you have the declaration of 'sys_siglist', and to 0 if you
-   don't. */
-#define HAVE_DECL_SYS_SIGLIST 0
-
-/* Define to 1 if you have the declaration of '_sys_siglist', and to 0 if you
-   don't. */
-#define HAVE_DECL__SYS_SIGLIST 0
-
-/* Define to 1 if you have the declaration of '__sys_siglist', and to 0 if you
-   don't. */
-#define HAVE_DECL___SYS_SIGLIST 0
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines 'DIR'.
-   */
-#define HAVE_DIRENT_H 1
-
-/* Define to 1 if you have the <direct.h> header file, and it defines getcwd()
-   and chdir().
-   */
-#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__INTERIX)
-# define HAVE_DIRECT_H 1
-#endif
-
-/* Use platform specific coding */
-#define HAVE_DOS_PATHS 1
-
-/* Define to 1 if you have the 'dup2' function. */
-#define HAVE_DUP2 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the 'fdopen' function. */
-#ifdef __MINGW32__
-#define HAVE_FDOPEN 1
-#endif
-
-/* Define to 1 if you have the 'fileno' function. */
-#define HAVE_FILENO 1
-
-/* Define to 1 if you have the 'getcwd' function.  */
-#define HAVE_GETCWD 1
-
-/* Define to 1 if you have the 'getgroups' function. */
-/* #undef HAVE_GETGROUPS */
-
-/* Define to 1 if you have the 'gethostbyname' function. */
-/* #undef HAVE_GETHOSTBYNAME */
-
-/* Define to 1 if you have the 'gethostname' function. */
-/* #undef HAVE_GETHOSTNAME */
-
-/* Define to 1 if you have the 'getloadavg' function. */
-/* #undef HAVE_GETLOADAVG */
-
-/* Define to 1 if you have the 'getrlimit' function. */
-/* #undef HAVE_GETRLIMIT */
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-/* #undef HAVE_GETTEXT */
-
-/* Define to 1 if you have a standard gettimeofday function */
-#ifdef __MINGW32__
-#define HAVE_GETTIMEOFDAY 1
-#endif
-
-/* Define if you have the iconv() function. */
-/* #undef HAVE_ICONV */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#ifdef __MINGW32__
-#define HAVE_INTTYPES_H 1
-#endif
-
-/* Define to 1 if you have the 'dgc' library (-ldgc). */
-/* #undef HAVE_LIBDGC */
-
-/* Define to 1 if you have the 'kstat' library (-lkstat). */
-/* #undef HAVE_LIBKSTAT */
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have the <locale.h> header file. */
-/*#define HAVE_LOCALE_H 1*/
-
-/* Define to 1 if you have the 'lstat' function. */
-/* #undef HAVE_LSTAT */
-
-/* Define to 1 if you have the <mach/mach.h> header file. */
-/* #undef HAVE_MACH_MACH_H */
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the 'mkstemp' function. */
-/* #undef HAVE_MKSTEMP */
-
-/* Define to 1 if you have the 'mktemp' function. */
-#define HAVE_MKTEMP 1
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines 'DIR'. */
-/* #undef HAVE_NDIR_H */
-
-/* Define to 1 if you have the <nlist.h> header file. */
-/* #undef HAVE_NLIST_H */
-
-/* Define to 1 if you have the 'pipe' function. */
-/* #undef HAVE_PIPE */
-
-/* Define to 1 if you have the 'pstat_getdynamic' function. */
-/* #undef HAVE_PSTAT_GETDYNAMIC */
-
-/* Define to 1 if you have the 'readlink' function. */
-/* #undef HAVE_READLINK */
-
-/* Define to 1 if you have the 'realpath' function. */
-/* #undef HAVE_REALPATH */
-
-/* Define to 1 if <signal.h> defines the SA_RESTART constant. */
-/* #undef HAVE_SA_RESTART */
-
-/* Define to 1 if you have the 'setegid' function. */
-/* #undef HAVE_SETEGID */
-
-/* Define to 1 if you have the 'seteuid' function. */
-/* #undef HAVE_SETEUID */
-
-/* Define to 1 if you have the 'setlinebuf' function. */
-/* #undef HAVE_SETLINEBUF */
-
-/* Define to 1 if you have the 'setlocale' function. */
-/*#define HAVE_SETLOCALE 1*/
-
-/* Define to 1 if you have the 'setregid' function. */
-/* #undef HAVE_SETREGID */
-
-/* Define to 1 if you have the 'setreuid' function. */
-/* #undef HAVE_SETREUID */
-
-/* Define to 1 if you have the 'setrlimit' function. */
-/* #undef HAVE_SETRLIMIT */
-
-/* Define to 1 if you have the 'setvbuf' function. */
-#define HAVE_SETVBUF 1
-
-/* Define to 1 if you have the 'sigaction' function. */
-/* #undef HAVE_SIGACTION */
-
-/* Define to 1 if you have the 'sigsetmask' function. */
-/* #undef HAVE_SIGSETMASK */
-
-/* Define to 1 if you have the 'socket' function. */
-/* #undef HAVE_SOCKET */
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#ifdef __MINGW32__
-#define HAVE_STDINT_H 1
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the 'strcasecmp' function. */
-#ifdef __MINGW32__
-#define HAVE_STRCASECMP 1
-#endif
-
-/* Define to 1 if you have the 'strcmpi' function. */
-#define HAVE_STRCMPI 1
-
-/* Define to 1 if you have the 'strcoll' function and it is properly defined.
-   */
-#define HAVE_STRCOLL 1
-
-/* Define to 1 if you have the 'strdup' function. */
-#define HAVE_STRDUP 1
-
-/* Define to 1 if you have the 'strerror' function. */
-#define HAVE_STRERROR 1
-
-/* Define to 1 if you have the 'stricmp' function. */
-#define HAVE_STRICMP 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-/* #define HAVE_STRINGS_H 1 */
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the 'strncasecmp' function. */
-#ifdef __MINGW32__
-#define HAVE_STRNCASECMP 1
-#endif
-
-/* Define to 1 if you have the 'strncmpi' function. */
-/* #undef HAVE_STRNCMPI */
-
-/* Define to 1 if you have the 'strndup' function. */
-/* #undef HAVE_STRNDUP */
-
-/* Define to 1 if you have the 'strnicmp' function. */
-#ifdef __MINGW32__
-#define HAVE_STRNICMP 1
-#endif
-
-/* Define to 1 if you have the 'strsignal' function. */
-/* #undef HAVE_STRSIGNAL */
-
-/* Define to 1 if you have the `isatty' function. */
-#define HAVE_ISATTY 1
-
-/* Define to 1 if you have the `ttyname' function. */
-#define HAVE_TTYNAME 1
-char *ttyname (int);
-
-/* Define to 1 if 'n_un.n_name' is a member of 'struct nlist'. */
-/* #undef HAVE_STRUCT_NLIST_N_UN_N_NAME */
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines 'DIR'.
-   */
-/* #undef HAVE_SYS_DIR_H */
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines 'DIR'.
-   */
-/* #undef HAVE_SYS_NDIR_H */
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#ifdef __MINGW32__
-#define HAVE_SYS_PARAM_H 1
-#endif
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-/* #undef HAVE_SYS_RESOURCE_H */
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/timeb.h> header file. */
-#define HAVE_SYS_TIMEB_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#ifdef __MINGW32__
-#define HAVE_SYS_TIME_H 1
-#endif
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <sys/wait.h> header file. */
-/* #undef HAVE_SYS_WAIT_H */
-
-/* Define to 1 if you have the \'union wait' type in <sys/wait.h>. */
-/* #undef HAVE_UNION_WAIT */
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifdef __MINGW32__
-#define HAVE_UNISTD_H 1
-#endif
-
-/* Define to 1 if you have the 'wait3' function. */
-/* #undef HAVE_WAIT3 */
-
-/* Define to 1 if you have the 'waitpid' function. */
-/* #undef HAVE_WAITPID */
-
-/* Build host information. */
-#define MAKE_HOST "Windows32"
-
-/* Define to 1 to enable job server support in GNU make. */
-#define MAKE_JOBSERVER 1
-
-/* Define to 1 to enable 'load' support in GNU make. */
-#define MAKE_LOAD 1
-
-/* Define to 1 to enable symbolic link timestamp checking. */
-/* #undef MAKE_SYMLINKS */
-
-/* Define to 1 if your 'struct nlist' has an 'n_un' member. Obsolete, depend
-   on 'HAVE_STRUCT_NLIST_N_UN_N_NAME */
-/* #undef NLIST_NAME_UNION */
-
-/* Define to 1 if struct nlist.n_name is a pointer rather than an array. */
-/* #undef NLIST_STRUCT */
-
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-/* #undef NO_MINUS_C_MINUS_O */
-
-/* Name of this package (needed by automake) */
-#define PACKAGE "make"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bug-make@gnu.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "GNU make"
-
-/* Define to the home page for this package. */
-#define PACKAGE_URL "http://www.gnu.org/software/make/"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "4.2.1"
-
-/* Define to the character that separates directories in PATH. */
-#define PATH_SEPARATOR_CHAR ';'
-
-/* Define as the return type of signal handlers ('int' or 'void'). */
-#define RETSIGTYPE void
-
-/* Define to the name of the SCCS 'get' command. */
-#define SCCS_GET "echo no sccs get"
-
-/* Define this if the SCCS 'get' command understands the '-G<file>' option. */
-/* #undef SCCS_GET_MINUS_G */
-
-/* Define to 1 if the 'setvbuf' function takes the buffering type as its
-   second argument and the buffer pointer as the third, as on System V before
-   release 3. */
-/* #undef SETVBUF_REVERSED */
-
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at run time.
-        STACK_DIRECTION > 0 => grows toward higher addresses
-        STACK_DIRECTION < 0 => grows toward lower addresses
-        STACK_DIRECTION = 0 => direction of growth unknown */
-/* #undef STACK_DIRECTION */
-
-/* Define to 1 if the 'S_IS*' macros in <sys/stat.h> do not work properly. */
-/* #undef STAT_MACROS_BROKEN */
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if struct stat contains a nanoseconds field */
-/* #undef ST_MTIM_NSEC */
-
-/* Define to 1 on System V Release 4. */
-/* #undef SVR4 */
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#ifdef __MINGW32__
-#define TIME_WITH_SYS_TIME 1
-#endif
-
-/* Define to 1 for Encore UMAX. */
-/* #undef UMAX */
-
-/* Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h> instead of
-   <sys/cpustats.h>. */
-/* #undef UMAX4_3 */
-
-/* Version number of package */
-#define VERSION "4.2.1"
-
-/* Define if using the dmalloc debugging malloc package */
-/* #undef WITH_DMALLOC */
-
-/* Define to 1 if on AIX 3.
-   System headers sometimes define this.
-   We just want to avoid a redefinition error message.  */
-#ifndef _ALL_SOURCE
-/* # undef _ALL_SOURCE */
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-/* #undef _FILE_OFFSET_BITS */
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for 'stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
-
-/* Define to empty if 'const' does not conform to ANSI C. */
-/* #undef const */
-
-#include <sys/types.h>
-
-/* Define to 'int' if <sys/types.h> doesn't define. */
-#define gid_t int
-
-/* Define to 'int' if <sys/types.h> does not define. */
-/* GCC 4.x reportedly defines pid_t.  */
-#ifndef _PID_T_
-#ifdef _WIN64
-#define pid_t __int64
-#else
-#define pid_t int
-#endif
-#endif
-
-/* Define to 'int' if <sys/types.h> doesn't define. */
-#define uid_t int
-
-/* Define uintmax_t if not defined in <stdint.h> or <inttypes.h>. */
-#if !HAVE_STDINT_H && !HAVE_INTTYPES_H
-#define uintmax_t unsigned long
-#endif
-
-/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
-/* #undef HAVE_SYS_WAIT_H */
-
-/* Define to the installation directory for locales.  */
-#define LOCALEDIR ""
-
-/*
- * Refer to README.W32 for info on the following settings
- */
-
-
-/*
- * If you have a shell that does not grok 'sh -c quoted-command-line'
- * correctly, you need this setting. Please see below for specific
- * shell support.
- */
-/*#define BATCH_MODE_ONLY_SHELL 1 */
-
-/*
- * Define if you have the Cygnus "Cygwin" GNU Windows32 tool set.
- * Do NOT define BATCH_MODE_ONLY_SHELL if you define HAVE_CYGWIN_SHELL
- */
-/*#define HAVE_CYGWIN_SHELL 1 */
-
-/*
- * Define if you have the MKS tool set or shell. Do NOT define
- * BATCH_MODE_ONLY_SHELL if you define HAVE_MKS_SHELL
- */
-/*#define HAVE_MKS_SHELL 1 */
-
-/*
- * Enforce the mutual exclusivity restriction.
- */
-#ifdef HAVE_MKS_SHELL
-#undef BATCH_MODE_ONLY_SHELL
-#endif
-
-#ifdef HAVE_CYGWIN_SHELL
-#undef BATCH_MODE_ONLY_SHELL
-#endif
diff --git a/config.h.in b/config.h.in
deleted file mode 100644 (file)
index 4c26fb5..0000000
+++ /dev/null
@@ -1,506 +0,0 @@
-/* config.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define to 1 if the `closedir' function returns void instead of `int'. */
-#undef CLOSEDIR_VOID
-
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
-   systems. This function is required for `alloca.c' support on those systems.
-   */
-#undef CRAY_STACKSEG_END
-
-/* Define to 1 if using `alloca.c'. */
-#undef C_ALLOCA
-
-/* Define to 1 if using `getloadavg.c'. */
-#undef C_GETLOADAVG
-
-/* Define to 1 for DGUX with <sys/dg_sys_info.h>. */
-#undef DGUX
-
-/* Define to 1 if translation of program messages to the user's native
-   language is requested. */
-#undef ENABLE_NLS
-
-/* Use high resolution file timestamps if nonzero. */
-#undef FILE_TIMESTAMP_HI_RES
-
-/* Define to 1 if the `getloadavg' function needs to be run setuid or setgid.
-   */
-#undef GETLOADAVG_PRIVILEGED
-
-/* Define to 1 if you have `alloca', as a function or macro. */
-#undef HAVE_ALLOCA
-
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
-   */
-#undef HAVE_ALLOCA_H
-
-/* Define to 1 if you have the `atexit' function. */
-#undef HAVE_ATEXIT
-
-/* Use case insensitive file names */
-#undef HAVE_CASE_INSENSITIVE_FS
-
-/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
-   CoreFoundation framework. */
-#undef HAVE_CFLOCALECOPYCURRENT
-
-/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
-   the CoreFoundation framework. */
-#undef HAVE_CFPREFERENCESCOPYAPPVALUE
-
-/* Define to 1 if you have the clock_gettime function. */
-#undef HAVE_CLOCK_GETTIME
-
-/* Define if the GNU dcgettext() function is already present or preinstalled.
-   */
-#undef HAVE_DCGETTEXT
-
-/* Define to 1 if you have the declaration of `bsd_signal', and to 0 if you
-   don't. */
-#undef HAVE_DECL_BSD_SIGNAL
-
-/* Define to 1 if you have the declaration of `dlerror', and to 0 if you
-   don't. */
-#undef HAVE_DECL_DLERROR
-
-/* Define to 1 if you have the declaration of `dlopen', and to 0 if you don't.
-   */
-#undef HAVE_DECL_DLOPEN
-
-/* Define to 1 if you have the declaration of `dlsym', and to 0 if you don't.
-   */
-#undef HAVE_DECL_DLSYM
-
-/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
-   don't. */
-#undef HAVE_DECL_SYS_SIGLIST
-
-/* Define to 1 if you have the declaration of `_sys_siglist', and to 0 if you
-   don't. */
-#undef HAVE_DECL__SYS_SIGLIST
-
-/* Define to 1 if you have the declaration of `__sys_siglist', and to 0 if you
-   don't. */
-#undef HAVE_DECL___SYS_SIGLIST
-
-/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
-   */
-#undef HAVE_DIRENT_H
-
-/* Use platform specific coding */
-#undef HAVE_DOS_PATHS
-
-/* Define to 1 if you have the `dup' function. */
-#undef HAVE_DUP
-
-/* Define to 1 if you have the `dup2' function. */
-#undef HAVE_DUP2
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define to 1 if you have the `fdopen' function. */
-#undef HAVE_FDOPEN
-
-/* Define to 1 if you have the `fileno' function. */
-#undef HAVE_FILENO
-
-/* Define to 1 if you have the `fork' function. */
-#undef HAVE_FORK
-
-/* Define to 1 if you have the `getcwd' function. */
-#undef HAVE_GETCWD
-
-/* Define to 1 if you have the `getgroups' function. */
-#undef HAVE_GETGROUPS
-
-/* Define to 1 if you have the `gethostbyname' function. */
-#undef HAVE_GETHOSTBYNAME
-
-/* Define to 1 if you have the `gethostname' function. */
-#undef HAVE_GETHOSTNAME
-
-/* Define to 1 if you have the `getloadavg' function. */
-#undef HAVE_GETLOADAVG
-
-/* Define to 1 if you have the `getrlimit' function. */
-#undef HAVE_GETRLIMIT
-
-/* Define if the GNU gettext() function is already present or preinstalled. */
-#undef HAVE_GETTEXT
-
-/* Define to 1 if you have a standard gettimeofday function */
-#undef HAVE_GETTIMEOFDAY
-
-/* Embed GNU Guile support */
-#undef HAVE_GUILE
-
-/* Define if you have the iconv() function and it works. */
-#undef HAVE_ICONV
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the `isatty' function. */
-#undef HAVE_ISATTY
-
-/* Define to 1 if you have the `dgc' library (-ldgc). */
-#undef HAVE_LIBDGC
-
-/* Define to 1 if you have the `kstat' library (-lkstat). */
-#undef HAVE_LIBKSTAT
-
-/* Define to 1 if you have the <limits.h> header file. */
-#undef HAVE_LIMITS_H
-
-/* Define to 1 if you have the <locale.h> header file. */
-#undef HAVE_LOCALE_H
-
-/* Define to 1 if you have the `lstat' function. */
-#undef HAVE_LSTAT
-
-/* Define to 1 if you have the <mach/mach.h> header file. */
-#undef HAVE_MACH_MACH_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the `mkstemp' function. */
-#undef HAVE_MKSTEMP
-
-/* Define to 1 if you have the `mktemp' function. */
-#undef HAVE_MKTEMP
-
-/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
-#undef HAVE_NDIR_H
-
-/* Define to 1 if you have the <nlist.h> header file. */
-#undef HAVE_NLIST_H
-
-/* Define to 1 if you have the `pipe' function. */
-#undef HAVE_PIPE
-
-/* Define to 1 if you have the `pselect' function. */
-#undef HAVE_PSELECT
-
-/* Define to 1 if you have the `pstat_getdynamic' function. */
-#undef HAVE_PSTAT_GETDYNAMIC
-
-/* Define to 1 if you have the `readlink' function. */
-#undef HAVE_READLINK
-
-/* Define to 1 if you have the `realpath' function. */
-#undef HAVE_REALPATH
-
-/* Define to 1 if <signal.h> defines the SA_RESTART constant. */
-#undef HAVE_SA_RESTART
-
-/* Define to 1 if you have the `setegid' function. */
-#undef HAVE_SETEGID
-
-/* Define to 1 if you have the `seteuid' function. */
-#undef HAVE_SETEUID
-
-/* Define to 1 if you have the `setlinebuf' function. */
-#undef HAVE_SETLINEBUF
-
-/* Define to 1 if you have the `setlocale' function. */
-#undef HAVE_SETLOCALE
-
-/* Define to 1 if you have the `setregid' function. */
-#undef HAVE_SETREGID
-
-/* Define to 1 if you have the `setreuid' function. */
-#undef HAVE_SETREUID
-
-/* Define to 1 if you have the `setrlimit' function. */
-#undef HAVE_SETRLIMIT
-
-/* Define to 1 if you have the `setvbuf' function. */
-#undef HAVE_SETVBUF
-
-/* Define to 1 if you have the `sigaction' function. */
-#undef HAVE_SIGACTION
-
-/* Define to 1 if you have the `sigsetmask' function. */
-#undef HAVE_SIGSETMASK
-
-/* Define to 1 if you have the `socket' function. */
-#undef HAVE_SOCKET
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#undef HAVE_STRCASECMP
-
-/* Define to 1 if you have the `strcmpi' function. */
-#undef HAVE_STRCMPI
-
-/* Define to 1 if you have the `strcoll' function and it is properly defined.
-   */
-#undef HAVE_STRCOLL
-
-/* Define to 1 if you have the `strdup' function. */
-#undef HAVE_STRDUP
-
-/* Define to 1 if you have the `strerror' function. */
-#undef HAVE_STRERROR
-
-/* Define to 1 if you have the `stricmp' function. */
-#undef HAVE_STRICMP
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the `strncasecmp' function. */
-#undef HAVE_STRNCASECMP
-
-/* Define to 1 if you have the `strncmpi' function. */
-#undef HAVE_STRNCMPI
-
-/* Define to 1 if you have the `strndup' function. */
-#undef HAVE_STRNDUP
-
-/* Define to 1 if you have the `strnicmp' function. */
-#undef HAVE_STRNICMP
-
-/* Define to 1 if you have the `strsignal' function. */
-#undef HAVE_STRSIGNAL
-
-/* Define to 1 if `n_un.n_name' is a member of `struct nlist'. */
-#undef HAVE_STRUCT_NLIST_N_UN_N_NAME
-
-/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
-   */
-#undef HAVE_SYS_DIR_H
-
-/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
-   */
-#undef HAVE_SYS_NDIR_H
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#undef HAVE_SYS_PARAM_H
-
-/* Define to 1 if you have the <sys/resource.h> header file. */
-#undef HAVE_SYS_RESOURCE_H
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#undef HAVE_SYS_SELECT_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/timeb.h> header file. */
-#undef HAVE_SYS_TIMEB_H
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#undef HAVE_SYS_TIME_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <sys/wait.h> header file. */
-#undef HAVE_SYS_WAIT_H
-
-/* Define to 1 if you have the `ttyname' function. */
-#undef HAVE_TTYNAME
-
-/* Define to 1 if the system has the type `uintmax_t'. */
-#undef HAVE_UINTMAX_T
-
-/* Define to 1 if you have the 'union wait' type in <sys/wait.h>. */
-#undef HAVE_UNION_WAIT
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if the system has the type 'unsigned long long int'. */
-#undef HAVE_UNSIGNED_LONG_LONG_INT
-
-/* Define to 1 if you have the `vfork' function. */
-#undef HAVE_VFORK
-
-/* Define to 1 if you have the <vfork.h> header file. */
-#undef HAVE_VFORK_H
-
-/* Define to 1 if you have the `wait3' function. */
-#undef HAVE_WAIT3
-
-/* Define to 1 if you have the `waitpid' function. */
-#undef HAVE_WAITPID
-
-/* Define to 1 if `fork' works. */
-#undef HAVE_WORKING_FORK
-
-/* Define to 1 if `vfork' works. */
-#undef HAVE_WORKING_VFORK
-
-/* Build host information. */
-#undef MAKE_HOST
-
-/* Define to 1 to enable job server support in GNU make. */
-#undef MAKE_JOBSERVER
-
-/* Define to 1 to enable 'load' support in GNU make. */
-#undef MAKE_LOAD
-
-/* Define to 1 to enable symbolic link timestamp checking. */
-#undef MAKE_SYMLINKS
-
-/* Define to 1 if your `struct nlist' has an `n_un' member. Obsolete, depend
-   on `HAVE_STRUCT_NLIST_N_UN_N_NAME */
-#undef NLIST_NAME_UNION
-
-/* Define to 1 if struct nlist.n_name is a pointer rather than an array. */
-#undef NLIST_STRUCT
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the home page for this package. */
-#undef PACKAGE_URL
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define to the character that separates directories in PATH. */
-#undef PATH_SEPARATOR_CHAR
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-#undef RETSIGTYPE
-
-/* Define to the name of the SCCS 'get' command. */
-#undef SCCS_GET
-
-/* Define to 1 if the SCCS 'get' command understands the '-G<file>' option. */
-#undef SCCS_GET_MINUS_G
-
-/* If using the C implementation of alloca, define if you know the
-   direction of stack growth for your system; otherwise it will be
-   automatically deduced at runtime.
-       STACK_DIRECTION > 0 => grows toward higher addresses
-       STACK_DIRECTION < 0 => grows toward lower addresses
-       STACK_DIRECTION = 0 => direction of growth unknown */
-#undef STACK_DIRECTION
-
-/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
-#undef STAT_MACROS_BROKEN
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Define if struct stat contains a nanoseconds field */
-#undef ST_MTIM_NSEC
-
-/* Define to 1 on System V Release 4. */
-#undef SVR4
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
-/* Define to 1 for Encore UMAX. */
-#undef UMAX
-
-/* Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h> instead of
-   <sys/cpustats.h>. */
-#undef UMAX4_3
-
-/* Enable extensions on AIX 3, Interix.  */
-#ifndef _ALL_SOURCE
-# undef _ALL_SOURCE
-#endif
-/* Enable GNU extensions on systems that have them.  */
-#ifndef _GNU_SOURCE
-# undef _GNU_SOURCE
-#endif
-/* Enable threading extensions on Solaris.  */
-#ifndef _POSIX_PTHREAD_SEMANTICS
-# undef _POSIX_PTHREAD_SEMANTICS
-#endif
-/* Enable extensions on HP NonStop.  */
-#ifndef _TANDEM_SOURCE
-# undef _TANDEM_SOURCE
-#endif
-/* Enable general extensions on Solaris.  */
-#ifndef __EXTENSIONS__
-# undef __EXTENSIONS__
-#endif
-
-
-/* Version number of package */
-#undef VERSION
-
-/* Use platform specific coding */
-#undef WINDOWS32
-
-/* Define if using the dmalloc debugging malloc package */
-#undef WITH_DMALLOC
-
-/* Enable large inode numbers on Mac OS X 10.5.  */
-#ifndef _DARWIN_USE_64_BIT_INODE
-# define _DARWIN_USE_64_BIT_INODE 1
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#undef _FILE_OFFSET_BITS
-
-/* Define for large files, on AIX-style hosts. */
-#undef _LARGE_FILES
-
-/* Define to 1 if on MINIX. */
-#undef _MINIX
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
-   this defined. */
-#undef _POSIX_1_SOURCE
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-#undef _POSIX_SOURCE
-
-/* Define to empty if `const' does not conform to ANSI C. */
-#undef const
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef gid_t
-
-/* Define to `long int' if <sys/types.h> does not define. */
-#undef off_t
-
-/* Define to `int' if <sys/types.h> does not define. */
-#undef pid_t
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-#undef size_t
-
-/* Define to `int' if <sys/types.h> does not define. */
-#undef ssize_t
-
-/* Define to `int' if <sys/types.h> doesn't define. */
-#undef uid_t
-
-/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
-   do not define. */
-#undef uintmax_t
-
-/* Define as `fork' if `vfork' does not work. */
-#undef vfork
diff --git a/config/Makefile.am b/config/Makefile.am
deleted file mode 100644 (file)
index 7bce036..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*-Makefile-*-, or close enough
-# Copyright (C) 2002-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 3 of the License, or (at your option)
-# any later version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# Autoconf / automake know how to handle this directory.
diff --git a/config/Makefile.in b/config/Makefile.in
deleted file mode 100644 (file)
index 19fd6b5..0000000
+++ /dev/null
@@ -1,469 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# -*-Makefile-*-, or close enough
-# Copyright (C) 2002-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 3 of the License, or (at your option)
-# any later version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = config
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \
-       $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \
-       $(top_srcdir)/config/intlmacosx.m4 \
-       $(top_srcdir)/config/lib-ld.m4 \
-       $(top_srcdir)/config/lib-link.m4 \
-       $(top_srcdir)/config/lib-prefix.m4 \
-       $(top_srcdir)/config/longlong.m4 $(top_srcdir)/config/nls.m4 \
-       $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \
-       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-SOURCES =
-DIST_SOURCES =
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-am__DIST_COMMON = $(srcdir)/Makefile.in ar-lib compile config.guess \
-       config.rpath config.sub depcomp install-sh missing
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_LDFLAGS = @AM_LDFLAGS@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
-GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
-GLOBINC = @GLOBINC@
-GLOBLIB = @GLOBLIB@
-GMSGFMT = @GMSGFMT@
-GMSGFMT_015 = @GMSGFMT_015@
-GREP = @GREP@
-GUILE_CFLAGS = @GUILE_CFLAGS@
-GUILE_LIBS = @GUILE_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-KMEM_GROUP = @KMEM_GROUP@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MAKE_HOST = @MAKE_HOST@
-MKDIR_P = @MKDIR_P@
-MSGFMT = @MSGFMT@
-MSGFMT_015 = @MSGFMT_015@
-MSGMERGE = @MSGMERGE@
-NEED_SETGID = @NEED_SETGID@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-REMOTE = @REMOTE@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-USE_NLS = @USE_NLS@
-VERSION = @VERSION@
-XGETTEXT = @XGETTEXT@
-XGETTEXT_015 = @XGETTEXT_015@
-XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign config/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign config/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-tags TAGS:
-
-ctags CTAGS:
-
-cscope cscopelist:
-
-
-distdir: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-am
-       -rm -f Makefile
-distclean-am: clean-am distclean-generic
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
-       ctags-am distclean distclean-generic distdir dvi dvi-am html \
-       html-am info info-am install install-am install-data \
-       install-data-am install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
-       pdf-am ps ps-am tags-am uninstall uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Autoconf / automake know how to handle this directory.
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/config/ar-lib b/config/ar-lib
deleted file mode 100755 (executable)
index 463b9ec..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-#! /bin/sh
-# Wrapper for Microsoft lib.exe
-
-me=ar-lib
-scriptversion=2012-03-01.08; # UTC
-
-# Copyright (C) 2010-2014 Free Software Foundation, Inc.
-# Written by Peter Rosin <peda@lysator.liu.se>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-
-# func_error message
-func_error ()
-{
-  echo "$me: $1" 1>&2
-  exit 1
-}
-
-file_conv=
-
-# func_file_conv build_file
-# Convert a $build file to $host form and store it in $file
-# Currently only supports Windows hosts.
-func_file_conv ()
-{
-  file=$1
-  case $file in
-    / | /[!/]*) # absolute file, and not a UNC file
-      if test -z "$file_conv"; then
-       # lazily determine how to convert abs files
-       case `uname -s` in
-         MINGW*)
-           file_conv=mingw
-           ;;
-         CYGWIN*)
-           file_conv=cygwin
-           ;;
-         *)
-           file_conv=wine
-           ;;
-       esac
-      fi
-      case $file_conv in
-       mingw)
-         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
-         ;;
-       cygwin)
-         file=`cygpath -m "$file" || echo "$file"`
-         ;;
-       wine)
-         file=`winepath -w "$file" || echo "$file"`
-         ;;
-      esac
-      ;;
-  esac
-}
-
-# func_at_file at_file operation archive
-# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
-# for each of them.
-# When interpreting the content of the @FILE, do NOT use func_file_conv,
-# since the user would need to supply preconverted file names to
-# binutils ar, at least for MinGW.
-func_at_file ()
-{
-  operation=$2
-  archive=$3
-  at_file_contents=`cat "$1"`
-  eval set x "$at_file_contents"
-  shift
-
-  for member
-  do
-    $AR -NOLOGO $operation:"$member" "$archive" || exit $?
-  done
-}
-
-case $1 in
-  '')
-     func_error "no command.  Try '$0 --help' for more information."
-     ;;
-  -h | --h*)
-    cat <<EOF
-Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
-
-Members may be specified in a file named with @FILE.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "$me, version $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test $# -lt 3; then
-  func_error "you must specify a program, an action and an archive"
-fi
-
-AR=$1
-shift
-while :
-do
-  if test $# -lt 2; then
-    func_error "you must specify a program, an action and an archive"
-  fi
-  case $1 in
-    -lib | -LIB \
-    | -ltcg | -LTCG \
-    | -machine* | -MACHINE* \
-    | -subsystem* | -SUBSYSTEM* \
-    | -verbose | -VERBOSE \
-    | -wx* | -WX* )
-      AR="$AR $1"
-      shift
-      ;;
-    *)
-      action=$1
-      shift
-      break
-      ;;
-  esac
-done
-orig_archive=$1
-shift
-func_file_conv "$orig_archive"
-archive=$file
-
-# strip leading dash in $action
-action=${action#-}
-
-delete=
-extract=
-list=
-quick=
-replace=
-index=
-create=
-
-while test -n "$action"
-do
-  case $action in
-    d*) delete=yes  ;;
-    x*) extract=yes ;;
-    t*) list=yes    ;;
-    q*) quick=yes   ;;
-    r*) replace=yes ;;
-    s*) index=yes   ;;
-    S*)             ;; # the index is always updated implicitly
-    c*) create=yes  ;;
-    u*)             ;; # TODO: don't ignore the update modifier
-    v*)             ;; # TODO: don't ignore the verbose modifier
-    *)
-      func_error "unknown action specified"
-      ;;
-  esac
-  action=${action#?}
-done
-
-case $delete$extract$list$quick$replace,$index in
-  yes,* | ,yes)
-    ;;
-  yesyes*)
-    func_error "more than one action specified"
-    ;;
-  *)
-    func_error "no action specified"
-    ;;
-esac
-
-if test -n "$delete"; then
-  if test ! -f "$orig_archive"; then
-    func_error "archive not found"
-  fi
-  for member
-  do
-    case $1 in
-      @*)
-        func_at_file "${1#@}" -REMOVE "$archive"
-        ;;
-      *)
-        func_file_conv "$1"
-        $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
-        ;;
-    esac
-  done
-
-elif test -n "$extract"; then
-  if test ! -f "$orig_archive"; then
-    func_error "archive not found"
-  fi
-  if test $# -gt 0; then
-    for member
-    do
-      case $1 in
-        @*)
-          func_at_file "${1#@}" -EXTRACT "$archive"
-          ;;
-        *)
-          func_file_conv "$1"
-          $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
-          ;;
-      esac
-    done
-  else
-    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
-    do
-      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
-    done
-  fi
-
-elif test -n "$quick$replace"; then
-  if test ! -f "$orig_archive"; then
-    if test -z "$create"; then
-      echo "$me: creating $orig_archive"
-    fi
-    orig_archive=
-  else
-    orig_archive=$archive
-  fi
-
-  for member
-  do
-    case $1 in
-    @*)
-      func_file_conv "${1#@}"
-      set x "$@" "@$file"
-      ;;
-    *)
-      func_file_conv "$1"
-      set x "$@" "$file"
-      ;;
-    esac
-    shift
-    shift
-  done
-
-  if test -n "$orig_archive"; then
-    $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
-  else
-    $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
-  fi
-
-elif test -n "$list"; then
-  if test ! -f "$orig_archive"; then
-    func_error "archive not found"
-  fi
-  $AR -NOLOGO -LIST "$archive" || exit $?
-fi
diff --git a/config/compile b/config/compile
deleted file mode 100755 (executable)
index a85b723..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-#! /bin/sh
-# Wrapper for compilers which do not understand '-c -o'.
-
-scriptversion=2012-10-14.11; # UTC
-
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
-# Written by Tom Tromey <tromey@cygnus.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-nl='
-'
-
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent tools from complaining about whitespace usage.
-IFS=" ""       $nl"
-
-file_conv=
-
-# func_file_conv build_file lazy
-# Convert a $build file to $host form and store it in $file
-# Currently only supports Windows hosts. If the determined conversion
-# type is listed in (the comma separated) LAZY, no conversion will
-# take place.
-func_file_conv ()
-{
-  file=$1
-  case $file in
-    / | /[!/]*) # absolute file, and not a UNC file
-      if test -z "$file_conv"; then
-       # lazily determine how to convert abs files
-       case `uname -s` in
-         MINGW*)
-           file_conv=mingw
-           ;;
-         CYGWIN*)
-           file_conv=cygwin
-           ;;
-         *)
-           file_conv=wine
-           ;;
-       esac
-      fi
-      case $file_conv/,$2, in
-       *,$file_conv,*)
-         ;;
-       mingw/*)
-         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
-         ;;
-       cygwin/*)
-         file=`cygpath -m "$file" || echo "$file"`
-         ;;
-       wine/*)
-         file=`winepath -w "$file" || echo "$file"`
-         ;;
-      esac
-      ;;
-  esac
-}
-
-# func_cl_dashL linkdir
-# Make cl look for libraries in LINKDIR
-func_cl_dashL ()
-{
-  func_file_conv "$1"
-  if test -z "$lib_path"; then
-    lib_path=$file
-  else
-    lib_path="$lib_path;$file"
-  fi
-  linker_opts="$linker_opts -LIBPATH:$file"
-}
-
-# func_cl_dashl library
-# Do a library search-path lookup for cl
-func_cl_dashl ()
-{
-  lib=$1
-  found=no
-  save_IFS=$IFS
-  IFS=';'
-  for dir in $lib_path $LIB
-  do
-    IFS=$save_IFS
-    if $shared && test -f "$dir/$lib.dll.lib"; then
-      found=yes
-      lib=$dir/$lib.dll.lib
-      break
-    fi
-    if test -f "$dir/$lib.lib"; then
-      found=yes
-      lib=$dir/$lib.lib
-      break
-    fi
-    if test -f "$dir/lib$lib.a"; then
-      found=yes
-      lib=$dir/lib$lib.a
-      break
-    fi
-  done
-  IFS=$save_IFS
-
-  if test "$found" != yes; then
-    lib=$lib.lib
-  fi
-}
-
-# func_cl_wrapper cl arg...
-# Adjust compile command to suit cl
-func_cl_wrapper ()
-{
-  # Assume a capable shell
-  lib_path=
-  shared=:
-  linker_opts=
-  for arg
-  do
-    if test -n "$eat"; then
-      eat=
-    else
-      case $1 in
-       -o)
-         # configure might choose to run compile as 'compile cc -o foo foo.c'.
-         eat=1
-         case $2 in
-           *.o | *.[oO][bB][jJ])
-             func_file_conv "$2"
-             set x "$@" -Fo"$file"
-             shift
-             ;;
-           *)
-             func_file_conv "$2"
-             set x "$@" -Fe"$file"
-             shift
-             ;;
-         esac
-         ;;
-       -I)
-         eat=1
-         func_file_conv "$2" mingw
-         set x "$@" -I"$file"
-         shift
-         ;;
-       -I*)
-         func_file_conv "${1#-I}" mingw
-         set x "$@" -I"$file"
-         shift
-         ;;
-       -l)
-         eat=1
-         func_cl_dashl "$2"
-         set x "$@" "$lib"
-         shift
-         ;;
-       -l*)
-         func_cl_dashl "${1#-l}"
-         set x "$@" "$lib"
-         shift
-         ;;
-       -L)
-         eat=1
-         func_cl_dashL "$2"
-         ;;
-       -L*)
-         func_cl_dashL "${1#-L}"
-         ;;
-       -static)
-         shared=false
-         ;;
-       -Wl,*)
-         arg=${1#-Wl,}
-         save_ifs="$IFS"; IFS=','
-         for flag in $arg; do
-           IFS="$save_ifs"
-           linker_opts="$linker_opts $flag"
-         done
-         IFS="$save_ifs"
-         ;;
-       -Xlinker)
-         eat=1
-         linker_opts="$linker_opts $2"
-         ;;
-       -*)
-         set x "$@" "$1"
-         shift
-         ;;
-       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
-         func_file_conv "$1"
-         set x "$@" -Tp"$file"
-         shift
-         ;;
-       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
-         func_file_conv "$1" mingw
-         set x "$@" "$file"
-         shift
-         ;;
-       *)
-         set x "$@" "$1"
-         shift
-         ;;
-      esac
-    fi
-    shift
-  done
-  if test -n "$linker_opts"; then
-    linker_opts="-link$linker_opts"
-  fi
-  exec "$@" $linker_opts
-  exit 1
-}
-
-eat=
-
-case $1 in
-  '')
-     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: compile [--help] [--version] PROGRAM [ARGS]
-
-Wrapper for compilers which do not understand '-c -o'.
-Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
-arguments, and rename the output as expected.
-
-If you are trying to build a whole package this is not the
-right script to run: please start by reading the file 'INSTALL'.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "compile $scriptversion"
-    exit $?
-    ;;
-  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
-    func_cl_wrapper "$@"      # Doesn't return...
-    ;;
-esac
-
-ofile=
-cfile=
-
-for arg
-do
-  if test -n "$eat"; then
-    eat=
-  else
-    case $1 in
-      -o)
-       # configure might choose to run compile as 'compile cc -o foo foo.c'.
-       # So we strip '-o arg' only if arg is an object.
-       eat=1
-       case $2 in
-         *.o | *.obj)
-           ofile=$2
-           ;;
-         *)
-           set x "$@" -o "$2"
-           shift
-           ;;
-       esac
-       ;;
-      *.c)
-       cfile=$1
-       set x "$@" "$1"
-       shift
-       ;;
-      *)
-       set x "$@" "$1"
-       shift
-       ;;
-    esac
-  fi
-  shift
-done
-
-if test -z "$ofile" || test -z "$cfile"; then
-  # If no '-o' option was seen then we might have been invoked from a
-  # pattern rule where we don't need one.  That is ok -- this is a
-  # normal compilation that the losing compiler can handle.  If no
-  # '.c' file was seen then we are probably linking.  That is also
-  # ok.
-  exec "$@"
-fi
-
-# Name of file we expect compiler to create.
-cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
-
-# Create the lock directory.
-# Note: use '[/\\:.-]' here to ensure that we don't use the same name
-# that we are using for the .o file.  Also, base the name on the expected
-# object file name, since that is what matters with a parallel build.
-lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
-while true; do
-  if mkdir "$lockdir" >/dev/null 2>&1; then
-    break
-  fi
-  sleep 1
-done
-# FIXME: race condition here if user kills between mkdir and trap.
-trap "rmdir '$lockdir'; exit 1" 1 2 15
-
-# Run the compile.
-"$@"
-ret=$?
-
-if test -f "$cofile"; then
-  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
-elif test -f "${cofile}bj"; then
-  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
-fi
-
-rmdir "$lockdir"
-exit $ret
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config/config.guess b/config/config.guess
deleted file mode 100644 (file)
index c4bd827..0000000
+++ /dev/null
@@ -1,1456 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright 1992-2016 Free Software Foundation, Inc.
-
-timestamp='2016-05-15'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program.  This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-#
-# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
-#
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
-#
-# Please send patches to <config-patches@gnu.org>.
-
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright 1992-2016 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )        # Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-       for c in cc gcc c89 c99 ; do
-         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-            CC_FOR_BUILD="$c"; break ;
-         fi ;
-       done ;
-       if test x"$CC_FOR_BUILD" = x ; then
-         CC_FOR_BUILD=no_compiler_found ;
-       fi
-       ;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-       PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-case "${UNAME_SYSTEM}" in
-Linux|GNU|GNU/*)
-       # If the system lacks a compiler, then just pick glibc.
-       # We could probably try harder.
-       LIBC=gnu
-
-       eval $set_cc_for_build
-       cat <<-EOF > $dummy.c
-       #include <features.h>
-       #if defined(__UCLIBC__)
-       LIBC=uclibc
-       #elif defined(__dietlibc__)
-       LIBC=dietlibc
-       #else
-       LIBC=gnu
-       #endif
-       EOF
-       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
-       ;;
-esac
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-       # NetBSD (nbsd) targets should (where applicable) match one or
-       # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
-       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-       # switched to ELF, *-*-netbsd* would select the old
-       # object file format.  This provides both forward
-       # compatibility and a consistent mechanism for selecting the
-       # object file format.
-       #
-       # Note: NetBSD doesn't particularly care about the vendor
-       # portion of the name.  We always set it to "unknown".
-       sysctl="sysctl -n hw.machine_arch"
-       UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
-           /sbin/$sysctl 2>/dev/null || \
-           /usr/sbin/$sysctl 2>/dev/null || \
-           echo unknown)`
-       case "${UNAME_MACHINE_ARCH}" in
-           armeb) machine=armeb-unknown ;;
-           arm*) machine=arm-unknown ;;
-           sh3el) machine=shl-unknown ;;
-           sh3eb) machine=sh-unknown ;;
-           sh5el) machine=sh5le-unknown ;;
-           earmv*)
-               arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
-               endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
-               machine=${arch}${endian}-unknown
-               ;;
-           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-       esac
-       # The Operating System including object format, if it has switched
-       # to ELF recently (or will in the future) and ABI.
-       case "${UNAME_MACHINE_ARCH}" in
-           earm*)
-               os=netbsdelf
-               ;;
-           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-               eval $set_cc_for_build
-               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-                       | grep -q __ELF__
-               then
-                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-                   # Return netbsd for either.  FIX?
-                   os=netbsd
-               else
-                   os=netbsdelf
-               fi
-               ;;
-           *)
-               os=netbsd
-               ;;
-       esac
-       # Determine ABI tags.
-       case "${UNAME_MACHINE_ARCH}" in
-           earm*)
-               expr='s/^earmv[0-9]/-eabi/;s/eb$//'
-               abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
-               ;;
-       esac
-       # The OS release
-       # Debian GNU/NetBSD machines have a different userland, and
-       # thus, need a distinct triplet. However, they do not need
-       # kernel version information, so it can be replaced with a
-       # suitable tag, in the style of linux-gnu.
-       case "${UNAME_VERSION}" in
-           Debian*)
-               release='-gnu'
-               ;;
-           *)
-               release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
-               ;;
-       esac
-       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-       # contains redundant information, the shorter form:
-       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-       echo "${machine}-${os}${release}${abi}"
-       exit ;;
-    *:Bitrig:*:*)
-       UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
-       echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
-       exit ;;
-    *:OpenBSD:*:*)
-       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-       exit ;;
-    *:LibertyBSD:*:*)
-       UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
-       echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
-       exit ;;
-    *:ekkoBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-       exit ;;
-    *:SolidBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-       exit ;;
-    macppc:MirBSD:*:*)
-       echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-       exit ;;
-    *:MirBSD:*:*)
-       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-       exit ;;
-    *:Sortix:*:*)
-       echo ${UNAME_MACHINE}-unknown-sortix
-       exit ;;
-    alpha:OSF1:*:*)
-       case $UNAME_RELEASE in
-       *4.0)
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-               ;;
-       *5.*)
-               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-               ;;
-       esac
-       # According to Compaq, /usr/sbin/psrinfo has been available on
-       # OSF/1 and Tru64 systems produced since 1995.  I hope that
-       # covers most systems running today.  This code pipes the CPU
-       # types through head -n 1, so we only detect the type of CPU 0.
-       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-       case "$ALPHA_CPU_TYPE" in
-           "EV4 (21064)")
-               UNAME_MACHINE=alpha ;;
-           "EV4.5 (21064)")
-               UNAME_MACHINE=alpha ;;
-           "LCA4 (21066/21068)")
-               UNAME_MACHINE=alpha ;;
-           "EV5 (21164)")
-               UNAME_MACHINE=alphaev5 ;;
-           "EV5.6 (21164A)")
-               UNAME_MACHINE=alphaev56 ;;
-           "EV5.6 (21164PC)")
-               UNAME_MACHINE=alphapca56 ;;
-           "EV5.7 (21164PC)")
-               UNAME_MACHINE=alphapca57 ;;
-           "EV6 (21264)")
-               UNAME_MACHINE=alphaev6 ;;
-           "EV6.7 (21264A)")
-               UNAME_MACHINE=alphaev67 ;;
-           "EV6.8CB (21264C)")
-               UNAME_MACHINE=alphaev68 ;;
-           "EV6.8AL (21264B)")
-               UNAME_MACHINE=alphaev68 ;;
-           "EV6.8CX (21264D)")
-               UNAME_MACHINE=alphaev68 ;;
-           "EV6.9A (21264/EV69A)")
-               UNAME_MACHINE=alphaev69 ;;
-           "EV7 (21364)")
-               UNAME_MACHINE=alphaev7 ;;
-           "EV7.9 (21364A)")
-               UNAME_MACHINE=alphaev79 ;;
-       esac
-       # A Pn.n version is a patched version.
-       # A Vn.n version is a released version.
-       # A Tn.n version is a released field test version.
-       # A Xn.n version is an unreleased experimental baselevel.
-       # 1.2 uses "1.2" for uname -r.
-       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
-       # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-       exitcode=$?
-       trap '' 0
-       exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # Should we change UNAME_MACHINE based on the output of uname instead
-       # of the specific Alpha model?
-       echo alpha-pc-interix
-       exit ;;
-    21064:Windows_NT:50:3)
-       echo alpha-dec-winnt3.5
-       exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-       echo m68k-unknown-sysv4
-       exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-       echo ${UNAME_MACHINE}-unknown-amigaos
-       exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-       echo ${UNAME_MACHINE}-unknown-morphos
-       exit ;;
-    *:OS/390:*:*)
-       echo i370-ibm-openedition
-       exit ;;
-    *:z/VM:*:*)
-       echo s390-ibm-zvmoe
-       exit ;;
-    *:OS400:*:*)
-       echo powerpc-ibm-os400
-       exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-       echo arm-acorn-riscix${UNAME_RELEASE}
-       exit ;;
-    arm*:riscos:*:*|arm*:RISCOS:*:*)
-       echo arm-unknown-riscos
-       exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-       echo hppa1.1-hitachi-hiuxmpp
-       exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-       if test "`(/bin/universe) 2>/dev/null`" = att ; then
-               echo pyramid-pyramid-sysv3
-       else
-               echo pyramid-pyramid-bsd
-       fi
-       exit ;;
-    NILE*:*:*:dcosx)
-       echo pyramid-pyramid-svr4
-       exit ;;
-    DRS?6000:unix:4.0:6*)
-       echo sparc-icl-nx6
-       exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-       case `/usr/bin/uname -p` in
-           sparc) echo sparc-icl-nx7; exit ;;
-       esac ;;
-    s390x:SunOS:*:*)
-       echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit ;;
-    sun4H:SunOS:5.*:*)
-       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit ;;
-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-       echo i386-pc-auroraux${UNAME_RELEASE}
-       exit ;;
-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-       eval $set_cc_for_build
-       SUN_ARCH=i386
-       # If there is a compiler, see if it is configured for 64-bit objects.
-       # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
-       # This test works for both compilers.
-       if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
-           if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-               (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-               grep IS_64BIT_ARCH >/dev/null
-           then
-               SUN_ARCH=x86_64
-           fi
-       fi
-       echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit ;;
-    sun4*:SunOS:6*:*)
-       # According to config.sub, this is the proper way to canonicalize
-       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-       # it's likely to be more like Solaris than SunOS4.
-       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit ;;
-    sun4*:SunOS:*:*)
-       case "`/usr/bin/arch -k`" in
-           Series*|S4*)
-               UNAME_RELEASE=`uname -v`
-               ;;
-       esac
-       # Japanese Language versions have a version number like `4.1.3-JL'.
-       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-       exit ;;
-    sun3*:SunOS:*:*)
-       echo m68k-sun-sunos${UNAME_RELEASE}
-       exit ;;
-    sun*:*:4.2BSD:*)
-       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-       test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
-       case "`/bin/arch`" in
-           sun3)
-               echo m68k-sun-sunos${UNAME_RELEASE}
-               ;;
-           sun4)
-               echo sparc-sun-sunos${UNAME_RELEASE}
-               ;;
-       esac
-       exit ;;
-    aushp:SunOS:*:*)
-       echo sparc-auspex-sunos${UNAME_RELEASE}
-       exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-       echo m68k-atari-mint${UNAME_RELEASE}
-       exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-       echo m68k-atari-mint${UNAME_RELEASE}
-       exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-       echo m68k-atari-mint${UNAME_RELEASE}
-       exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-       echo m68k-milan-mint${UNAME_RELEASE}
-       exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-       echo m68k-hades-mint${UNAME_RELEASE}
-       exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-       echo m68k-unknown-mint${UNAME_RELEASE}
-       exit ;;
-    m68k:machten:*:*)
-       echo m68k-apple-machten${UNAME_RELEASE}
-       exit ;;
-    powerpc:machten:*:*)
-       echo powerpc-apple-machten${UNAME_RELEASE}
-       exit ;;
-    RISC*:Mach:*:*)
-       echo mips-dec-mach_bsd4.3
-       exit ;;
-    RISC*:ULTRIX:*:*)
-       echo mips-dec-ultrix${UNAME_RELEASE}
-       exit ;;
-    VAX*:ULTRIX*:*:*)
-       echo vax-dec-ultrix${UNAME_RELEASE}
-       exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-       echo clipper-intergraph-clix${UNAME_RELEASE}
-       exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-       eval $set_cc_for_build
-       sed 's/^        //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-       int main (int argc, char *argv[]) {
-#else
-       int main (argc, argv) int argc; char *argv[]; {
-#endif
-       #if defined (host_mips) && defined (MIPSEB)
-       #if defined (SYSTYPE_SYSV)
-         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_SVR4)
-         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-       #endif
-       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-       #endif
-       #endif
-         exit (-1);
-       }
-EOF
-       $CC_FOR_BUILD -o $dummy $dummy.c &&
-         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-         SYSTEM_NAME=`$dummy $dummyarg` &&
-           { echo "$SYSTEM_NAME"; exit; }
-       echo mips-mips-riscos${UNAME_RELEASE}
-       exit ;;
-    Motorola:PowerMAX_OS:*:*)
-       echo powerpc-motorola-powermax
-       exit ;;
-    Motorola:*:4.3:PL8-*)
-       echo powerpc-harris-powermax
-       exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-       echo powerpc-harris-powermax
-       exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-       echo powerpc-harris-powerunix
-       exit ;;
-    m88k:CX/UX:7*:*)
-       echo m88k-harris-cxux7
-       exit ;;
-    m88k:*:4*:R4*)
-       echo m88k-motorola-sysv4
-       exit ;;
-    m88k:*:3*:R3*)
-       echo m88k-motorola-sysv3
-       exit ;;
-    AViiON:dgux:*:*)
-       # DG/UX returns AViiON for all architectures
-       UNAME_PROCESSOR=`/usr/bin/uname -p`
-       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-       then
-           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-              [ ${TARGET_BINARY_INTERFACE}x = x ]
-           then
-               echo m88k-dg-dgux${UNAME_RELEASE}
-           else
-               echo m88k-dg-dguxbcs${UNAME_RELEASE}
-           fi
-       else
-           echo i586-dg-dgux${UNAME_RELEASE}
-       fi
-       exit ;;
-    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
-       echo m88k-dolphin-sysv3
-       exit ;;
-    M88*:*:R3*:*)
-       # Delta 88k system running SVR3
-       echo m88k-motorola-sysv3
-       exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-       echo m88k-tektronix-sysv3
-       exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-       echo m68k-tektronix-bsd
-       exit ;;
-    *:IRIX*:*:*)
-       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-       exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-       echo i386-ibm-aix
-       exit ;;
-    ia64:AIX:*:*)
-       if [ -x /usr/bin/oslevel ] ; then
-               IBM_REV=`/usr/bin/oslevel`
-       else
-               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-       fi
-       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-       exit ;;
-    *:AIX:2:3)
-       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-               eval $set_cc_for_build
-               sed 's/^                //' << EOF >$dummy.c
-               #include <sys/systemcfg.h>
-
-               main()
-                       {
-                       if (!__power_pc())
-                               exit(1);
-                       puts("powerpc-ibm-aix3.2.5");
-                       exit(0);
-                       }
-EOF
-               if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-               then
-                       echo "$SYSTEM_NAME"
-               else
-                       echo rs6000-ibm-aix3.2.5
-               fi
-       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-               echo rs6000-ibm-aix3.2.4
-       else
-               echo rs6000-ibm-aix3.2
-       fi
-       exit ;;
-    *:AIX:*:[4567])
-       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-               IBM_ARCH=rs6000
-       else
-               IBM_ARCH=powerpc
-       fi
-       if [ -x /usr/bin/lslpp ] ; then
-               IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
-                          awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
-       else
-               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-       fi
-       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-       exit ;;
-    *:AIX:*:*)
-       echo rs6000-ibm-aix
-       exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-       echo romp-ibm-bsd4.4
-       exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-       exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-       echo rs6000-bull-bosx
-       exit ;;
-    DPX/2?00:B.O.S.:*:*)
-       echo m68k-bull-sysv3
-       exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-       echo m68k-hp-bsd
-       exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-       echo m68k-hp-bsd4.4
-       exit ;;
-    9000/[34678]??:HP-UX:*:*)
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       case "${UNAME_MACHINE}" in
-           9000/31? )            HP_ARCH=m68000 ;;
-           9000/[34]?? )         HP_ARCH=m68k ;;
-           9000/[678][0-9][0-9])
-               if [ -x /usr/bin/getconf ]; then
-                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                   sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                   case "${sc_cpu_version}" in
-                     523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
-                     528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
-                     532)                      # CPU_PA_RISC2_0
-                       case "${sc_kernel_bits}" in
-                         32) HP_ARCH=hppa2.0n ;;
-                         64) HP_ARCH=hppa2.0w ;;
-                         '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
-                       esac ;;
-                   esac
-               fi
-               if [ "${HP_ARCH}" = "" ]; then
-                   eval $set_cc_for_build
-                   sed 's/^            //' << EOF >$dummy.c
-
-               #define _HPUX_SOURCE
-               #include <stdlib.h>
-               #include <unistd.h>
-
-               int main ()
-               {
-               #if defined(_SC_KERNEL_BITS)
-                   long bits = sysconf(_SC_KERNEL_BITS);
-               #endif
-                   long cpu  = sysconf (_SC_CPU_VERSION);
-
-                   switch (cpu)
-                       {
-                       case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-                       case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-                       case CPU_PA_RISC2_0:
-               #if defined(_SC_KERNEL_BITS)
-                           switch (bits)
-                               {
-                               case 64: puts ("hppa2.0w"); break;
-                               case 32: puts ("hppa2.0n"); break;
-                               default: puts ("hppa2.0"); break;
-                               } break;
-               #else  /* !defined(_SC_KERNEL_BITS) */
-                           puts ("hppa2.0"); break;
-               #endif
-                       default: puts ("hppa1.0"); break;
-                       }
-                   exit (0);
-               }
-EOF
-                   (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-                   test -z "$HP_ARCH" && HP_ARCH=hppa
-               fi ;;
-       esac
-       if [ ${HP_ARCH} = hppa2.0w ]
-       then
-           eval $set_cc_for_build
-
-           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-           # generating 64-bit code.  GNU and HP use different nomenclature:
-           #
-           # $ CC_FOR_BUILD=cc ./config.guess
-           # => hppa2.0w-hp-hpux11.23
-           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-           # => hppa64-hp-hpux11.23
-
-           if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
-               grep -q __LP64__
-           then
-               HP_ARCH=hppa2.0w
-           else
-               HP_ARCH=hppa64
-           fi
-       fi
-       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-       exit ;;
-    ia64:HP-UX:*:*)
-       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-       echo ia64-hp-hpux${HPUX_REV}
-       exit ;;
-    3050*:HI-UX:*:*)
-       eval $set_cc_for_build
-       sed 's/^        //' << EOF >$dummy.c
-       #include <unistd.h>
-       int
-       main ()
-       {
-         long cpu = sysconf (_SC_CPU_VERSION);
-         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-            results, however.  */
-         if (CPU_IS_PA_RISC (cpu))
-           {
-             switch (cpu)
-               {
-                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-                 default: puts ("hppa-hitachi-hiuxwe2"); break;
-               }
-           }
-         else if (CPU_IS_HP_MC68K (cpu))
-           puts ("m68k-hitachi-hiuxwe2");
-         else puts ("unknown-hitachi-hiuxwe2");
-         exit (0);
-       }
-EOF
-       $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-               { echo "$SYSTEM_NAME"; exit; }
-       echo unknown-hitachi-hiuxwe2
-       exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-       echo hppa1.1-hp-bsd
-       exit ;;
-    9000/8??:4.3bsd:*:*)
-       echo hppa1.0-hp-bsd
-       exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-       echo hppa1.0-hp-mpeix
-       exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-       echo hppa1.1-hp-osf
-       exit ;;
-    hp8??:OSF1:*:*)
-       echo hppa1.0-hp-osf
-       exit ;;
-    i*86:OSF1:*:*)
-       if [ -x /usr/sbin/sysversion ] ; then
-           echo ${UNAME_MACHINE}-unknown-osf1mk
-       else
-           echo ${UNAME_MACHINE}-unknown-osf1
-       fi
-       exit ;;
-    parisc*:Lites*:*:*)
-       echo hppa1.1-hp-lites
-       exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-       echo c1-convex-bsd
-       exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-       if getsysinfo -f scalar_acc
-       then echo c32-convex-bsd
-       else echo c2-convex-bsd
-       fi
-       exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-       echo c34-convex-bsd
-       exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-       echo c38-convex-bsd
-       exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-       echo c4-convex-bsd
-       exit ;;
-    CRAY*Y-MP:*:*:*)
-       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit ;;
-    CRAY*[A-Z]90:*:*:*)
-       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-             -e 's/\.[^.]*$/.X/'
-       exit ;;
-    CRAY*TS:*:*:*)
-       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit ;;
-    CRAY*T3E:*:*:*)
-       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit ;;
-    CRAY*SV1:*:*:*)
-       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit ;;
-    *:UNICOS/mp:*:*)
-       echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-       exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-       FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
-       FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
-       FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-       echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-       exit ;;
-    5000:UNIX_System_V:4.*:*)
-       FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
-       FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
-       echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-       exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-       exit ;;
-    sparc*:BSD/OS:*:*)
-       echo sparc-unknown-bsdi${UNAME_RELEASE}
-       exit ;;
-    *:BSD/OS:*:*)
-       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-       exit ;;
-    *:FreeBSD:*:*)
-       UNAME_PROCESSOR=`/usr/bin/uname -p`
-       case ${UNAME_PROCESSOR} in
-           amd64)
-               echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-           *)
-               echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-       esac
-       exit ;;
-    i*:CYGWIN*:*)
-       echo ${UNAME_MACHINE}-pc-cygwin
-       exit ;;
-    *:MINGW64*:*)
-       echo ${UNAME_MACHINE}-pc-mingw64
-       exit ;;
-    *:MINGW*:*)
-       echo ${UNAME_MACHINE}-pc-mingw32
-       exit ;;
-    *:MSYS*:*)
-       echo ${UNAME_MACHINE}-pc-msys
-       exit ;;
-    i*:windows32*:*)
-       # uname -m includes "-pc" on this system.
-       echo ${UNAME_MACHINE}-mingw32
-       exit ;;
-    i*:PW*:*)
-       echo ${UNAME_MACHINE}-pc-pw32
-       exit ;;
-    *:Interix*:*)
-       case ${UNAME_MACHINE} in
-           x86)
-               echo i586-pc-interix${UNAME_RELEASE}
-               exit ;;
-           authenticamd | genuineintel | EM64T)
-               echo x86_64-unknown-interix${UNAME_RELEASE}
-               exit ;;
-           IA64)
-               echo ia64-unknown-interix${UNAME_RELEASE}
-               exit ;;
-       esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-       echo i${UNAME_MACHINE}-pc-mks
-       exit ;;
-    8664:Windows_NT:*)
-       echo x86_64-pc-mks
-       exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-       # UNAME_MACHINE based on the output of uname instead of i386?
-       echo i586-pc-interix
-       exit ;;
-    i*:UWIN*:*)
-       echo ${UNAME_MACHINE}-pc-uwin
-       exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-       echo x86_64-unknown-cygwin
-       exit ;;
-    p*:CYGWIN*:*)
-       echo powerpcle-unknown-cygwin
-       exit ;;
-    prep*:SunOS:5.*:*)
-       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-       exit ;;
-    *:GNU:*:*)
-       # the GNU system
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-       exit ;;
-    *:GNU/*:*:*)
-       # other systems with GNU libc and userland
-       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
-       exit ;;
-    i*86:Minix:*:*)
-       echo ${UNAME_MACHINE}-pc-minix
-       exit ;;
-    aarch64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    aarch64_be:Linux:*:*)
-       UNAME_MACHINE=aarch64_be
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    alpha:Linux:*:*)
-       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-         EV5)   UNAME_MACHINE=alphaev5 ;;
-         EV56)  UNAME_MACHINE=alphaev56 ;;
-         PCA56) UNAME_MACHINE=alphapca56 ;;
-         PCA57) UNAME_MACHINE=alphapca56 ;;
-         EV6)   UNAME_MACHINE=alphaev6 ;;
-         EV67)  UNAME_MACHINE=alphaev67 ;;
-         EV68*) UNAME_MACHINE=alphaev68 ;;
-       esac
-       objdump --private-headers /bin/sh | grep -q ld.so.1
-       if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    arc:Linux:*:* | arceb:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    arm*:Linux:*:*)
-       eval $set_cc_for_build
-       if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
-           | grep -q __ARM_EABI__
-       then
-           echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       else
-           if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
-               | grep -q __ARM_PCS_VFP
-           then
-               echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
-           else
-               echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
-           fi
-       fi
-       exit ;;
-    avr32*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    cris:Linux:*:*)
-       echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-       exit ;;
-    crisv32:Linux:*:*)
-       echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-       exit ;;
-    e2k:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    frv:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    hexagon:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    i*86:Linux:*:*)
-       echo ${UNAME_MACHINE}-pc-linux-${LIBC}
-       exit ;;
-    ia64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    k1om:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    m32r*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    m68*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    mips:Linux:*:* | mips64:Linux:*:*)
-       eval $set_cc_for_build
-       sed 's/^        //' << EOF >$dummy.c
-       #undef CPU
-       #undef ${UNAME_MACHINE}
-       #undef ${UNAME_MACHINE}el
-       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-       CPU=${UNAME_MACHINE}el
-       #else
-       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-       CPU=${UNAME_MACHINE}
-       #else
-       CPU=
-       #endif
-       #endif
-EOF
-       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
-       ;;
-    openrisc*:Linux:*:*)
-       echo or1k-unknown-linux-${LIBC}
-       exit ;;
-    or32:Linux:*:* | or1k*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    padre:Linux:*:*)
-       echo sparc-unknown-linux-${LIBC}
-       exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-       echo hppa64-unknown-linux-${LIBC}
-       exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-       # Look for CPU level
-       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-         PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
-         PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
-         *)    echo hppa-unknown-linux-${LIBC} ;;
-       esac
-       exit ;;
-    ppc64:Linux:*:*)
-       echo powerpc64-unknown-linux-${LIBC}
-       exit ;;
-    ppc:Linux:*:*)
-       echo powerpc-unknown-linux-${LIBC}
-       exit ;;
-    ppc64le:Linux:*:*)
-       echo powerpc64le-unknown-linux-${LIBC}
-       exit ;;
-    ppcle:Linux:*:*)
-       echo powerpcle-unknown-linux-${LIBC}
-       exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-       echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
-       exit ;;
-    sh64*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    sh*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    tile*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    vax:Linux:*:*)
-       echo ${UNAME_MACHINE}-dec-linux-${LIBC}
-       exit ;;
-    x86_64:Linux:*:*)
-       echo ${UNAME_MACHINE}-pc-linux-${LIBC}
-       exit ;;
-    xtensa*:Linux:*:*)
-       echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-       exit ;;
-    i*86:DYNIX/ptx:4*:*)
-       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-       # earlier versions are messed up and put the nodename in both
-       # sysname and nodename.
-       echo i386-sequent-sysv4
-       exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-       # Unixware is an offshoot of SVR4, but it has its own version
-       # number series starting with 2...
-       # I am not positive that other SVR4 systems won't match this,
-       # I just have to hope.  -- rms.
-       # Use sysv4.2uw... so that sysv4* matches it.
-       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-       exit ;;
-    i*86:OS/2:*:*)
-       # If we were able to find `uname', then EMX Unix compatibility
-       # is probably installed.
-       echo ${UNAME_MACHINE}-pc-os2-emx
-       exit ;;
-    i*86:XTS-300:*:STOP)
-       echo ${UNAME_MACHINE}-unknown-stop
-       exit ;;
-    i*86:atheos:*:*)
-       echo ${UNAME_MACHINE}-unknown-atheos
-       exit ;;
-    i*86:syllable:*:*)
-       echo ${UNAME_MACHINE}-pc-syllable
-       exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-       echo i386-unknown-lynxos${UNAME_RELEASE}
-       exit ;;
-    i*86:*DOS:*:*)
-       echo ${UNAME_MACHINE}-pc-msdosdjgpp
-       exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-       else
-               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-       fi
-       exit ;;
-    i*86:*:5:[678]*)
-       # UnixWare 7.x, OpenUNIX and OpenServer 6.
-       case `/bin/uname -X | grep "^Machine"` in
-           *486*)           UNAME_MACHINE=i486 ;;
-           *Pentium)        UNAME_MACHINE=i586 ;;
-           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-       esac
-       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-       exit ;;
-    i*86:*:3.2:*)
-       if test -f /usr/options/cb.name; then
-               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-       elif /bin/uname -X 2>/dev/null >/dev/null ; then
-               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-                       && UNAME_MACHINE=i586
-               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-                       && UNAME_MACHINE=i686
-               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-       else
-               echo ${UNAME_MACHINE}-pc-sysv32
-       fi
-       exit ;;
-    pc:*:*:*)
-       # Left here for compatibility:
-       # uname -m prints for DJGPP always 'pc', but it prints nothing about
-       # the processor, so we play safe by assuming i586.
-       # Note: whatever this is, it MUST be the same as what config.sub
-       # prints for the "djgpp" host, or else GDB configure will decide that
-       # this is a cross-build.
-       echo i586-pc-msdosdjgpp
-       exit ;;
-    Intel:Mach:3*:*)
-       echo i386-pc-mach3
-       exit ;;
-    paragon:*:*:*)
-       echo i860-intel-osf1
-       exit ;;
-    i860:*:4.*:*) # i860-SVR4
-       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-       else # Add other i860-SVR4 vendors below as they are discovered.
-         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-       fi
-       exit ;;
-    mini*:CTIX:SYS*5:*)
-       # "miniframe"
-       echo m68010-convergent-sysv
-       exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-       echo m68k-convergent-sysv
-       exit ;;
-    M680?0:D-NIX:5.3:*)
-       echo m68k-diab-dnix
-       exit ;;
-    M68*:*:R3V[5678]*:*)
-       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-       OS_REL=''
-       test -r /etc/.relid \
-       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-         && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-         && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-         && { echo i486-ncr-sysv4; exit; } ;;
-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
-       OS_REL='.3'
-       test -r /etc/.relid \
-           && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-           && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-           && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
-       /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-           && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-       echo m68k-unknown-lynxos${UNAME_RELEASE}
-       exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-       echo m68k-atari-sysv4
-       exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-       echo sparc-unknown-lynxos${UNAME_RELEASE}
-       exit ;;
-    rs6000:LynxOS:2.*:*)
-       echo rs6000-unknown-lynxos${UNAME_RELEASE}
-       exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-       echo powerpc-unknown-lynxos${UNAME_RELEASE}
-       exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-       echo mips-dde-sysv${UNAME_RELEASE}
-       exit ;;
-    RM*:ReliantUNIX-*:*:*)
-       echo mips-sni-sysv4
-       exit ;;
-    RM*:SINIX-*:*:*)
-       echo mips-sni-sysv4
-       exit ;;
-    *:SINIX-*:*:*)
-       if uname -p 2>/dev/null >/dev/null ; then
-               UNAME_MACHINE=`(uname -p) 2>/dev/null`
-               echo ${UNAME_MACHINE}-sni-sysv4
-       else
-               echo ns32k-sni-sysv
-       fi
-       exit ;;
-    PENTIUM:*:4.0*:*)  # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                       # says <Richard.M.Bartel@ccMail.Census.GOV>
-       echo i586-unisys-sysv4
-       exit ;;
-    *:UNIX_System_V:4*:FTX*)
-       # From Gerald Hewes <hewes@openmarket.com>.
-       # How about differentiating between stratus architectures? -djm
-       echo hppa1.1-stratus-sysv4
-       exit ;;
-    *:*:*:FTX*)
-       # From seanf@swdc.stratus.com.
-       echo i860-stratus-sysv4
-       exit ;;
-    i*86:VOS:*:*)
-       # From Paul.Green@stratus.com.
-       echo ${UNAME_MACHINE}-stratus-vos
-       exit ;;
-    *:VOS:*:*)
-       # From Paul.Green@stratus.com.
-       echo hppa1.1-stratus-vos
-       exit ;;
-    mc68*:A/UX:*:*)
-       echo m68k-apple-aux${UNAME_RELEASE}
-       exit ;;
-    news*:NEWS-OS:6*:*)
-       echo mips-sony-newsos6
-       exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-       if [ -d /usr/nec ]; then
-               echo mips-nec-sysv${UNAME_RELEASE}
-       else
-               echo mips-unknown-sysv${UNAME_RELEASE}
-       fi
-       exit ;;
-    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
-       echo powerpc-be-beos
-       exit ;;
-    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
-       echo powerpc-apple-beos
-       exit ;;
-    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
-       echo i586-pc-beos
-       exit ;;
-    BePC:Haiku:*:*)    # Haiku running on Intel PC compatible.
-       echo i586-pc-haiku
-       exit ;;
-    x86_64:Haiku:*:*)
-       echo x86_64-unknown-haiku
-       exit ;;
-    SX-4:SUPER-UX:*:*)
-       echo sx4-nec-superux${UNAME_RELEASE}
-       exit ;;
-    SX-5:SUPER-UX:*:*)
-       echo sx5-nec-superux${UNAME_RELEASE}
-       exit ;;
-    SX-6:SUPER-UX:*:*)
-       echo sx6-nec-superux${UNAME_RELEASE}
-       exit ;;
-    SX-7:SUPER-UX:*:*)
-       echo sx7-nec-superux${UNAME_RELEASE}
-       exit ;;
-    SX-8:SUPER-UX:*:*)
-       echo sx8-nec-superux${UNAME_RELEASE}
-       exit ;;
-    SX-8R:SUPER-UX:*:*)
-       echo sx8r-nec-superux${UNAME_RELEASE}
-       exit ;;
-    SX-ACE:SUPER-UX:*:*)
-       echo sxace-nec-superux${UNAME_RELEASE}
-       exit ;;
-    Power*:Rhapsody:*:*)
-       echo powerpc-apple-rhapsody${UNAME_RELEASE}
-       exit ;;
-    *:Rhapsody:*:*)
-       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-       exit ;;
-    *:Darwin:*:*)
-       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-       eval $set_cc_for_build
-       if test "$UNAME_PROCESSOR" = unknown ; then
-           UNAME_PROCESSOR=powerpc
-       fi
-       if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
-           if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
-               if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-                   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-                   grep IS_64BIT_ARCH >/dev/null
-               then
-                   case $UNAME_PROCESSOR in
-                       i386) UNAME_PROCESSOR=x86_64 ;;
-                       powerpc) UNAME_PROCESSOR=powerpc64 ;;
-                   esac
-               fi
-           fi
-       elif test "$UNAME_PROCESSOR" = i386 ; then
-           # Avoid executing cc on OS X 10.9, as it ships with a stub
-           # that puts up a graphical alert prompting to install
-           # developer tools.  Any system running Mac OS X 10.7 or
-           # later (Darwin 11 and later) is required to have a 64-bit
-           # processor. This is not true of the ARM version of Darwin
-           # that Apple uses in portable devices.
-           UNAME_PROCESSOR=x86_64
-       fi
-       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-       exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-       UNAME_PROCESSOR=`uname -p`
-       if test "$UNAME_PROCESSOR" = x86; then
-               UNAME_PROCESSOR=i386
-               UNAME_MACHINE=pc
-       fi
-       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-       exit ;;
-    *:QNX:*:4*)
-       echo i386-pc-qnx
-       exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
-       echo neo-tandem-nsk${UNAME_RELEASE}
-       exit ;;
-    NSE-*:NONSTOP_KERNEL:*:*)
-       echo nse-tandem-nsk${UNAME_RELEASE}
-       exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-       echo nsr-tandem-nsk${UNAME_RELEASE}
-       exit ;;
-    *:NonStop-UX:*:*)
-       echo mips-compaq-nonstopux
-       exit ;;
-    BS2000:POSIX*:*:*)
-       echo bs2000-siemens-sysv
-       exit ;;
-    DS/*:UNIX_System_V:*:*)
-       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-       exit ;;
-    *:Plan9:*:*)
-       # "uname -m" is not consistent, so use $cputype instead. 386
-       # is converted to i386 for consistency with other x86
-       # operating systems.
-       if test "$cputype" = 386; then
-           UNAME_MACHINE=i386
-       else
-           UNAME_MACHINE="$cputype"
-       fi
-       echo ${UNAME_MACHINE}-unknown-plan9
-       exit ;;
-    *:TOPS-10:*:*)
-       echo pdp10-unknown-tops10
-       exit ;;
-    *:TENEX:*:*)
-       echo pdp10-unknown-tenex
-       exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-       echo pdp10-dec-tops20
-       exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-       echo pdp10-xkl-tops20
-       exit ;;
-    *:TOPS-20:*:*)
-       echo pdp10-unknown-tops20
-       exit ;;
-    *:ITS:*:*)
-       echo pdp10-unknown-its
-       exit ;;
-    SEI:*:*:SEIUX)
-       echo mips-sei-seiux${UNAME_RELEASE}
-       exit ;;
-    *:DragonFly:*:*)
-       echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-       exit ;;
-    *:*VMS:*:*)
-       UNAME_MACHINE=`(uname -p) 2>/dev/null`
-       case "${UNAME_MACHINE}" in
-           A*) echo alpha-dec-vms ; exit ;;
-           I*) echo ia64-dec-vms ; exit ;;
-           V*) echo vax-dec-vms ; exit ;;
-       esac ;;
-    *:XENIX:*:SysV)
-       echo i386-pc-xenix
-       exit ;;
-    i*86:skyos:*:*)
-       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
-       exit ;;
-    i*86:rdos:*:*)
-       echo ${UNAME_MACHINE}-pc-rdos
-       exit ;;
-    i*86:AROS:*:*)
-       echo ${UNAME_MACHINE}-pc-aros
-       exit ;;
-    x86_64:VMkernel:*:*)
-       echo ${UNAME_MACHINE}-unknown-esx
-       exit ;;
-    amd64:Isilon\ OneFS:*:*)
-       echo x86_64-unknown-onefs
-       exit ;;
-esac
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script (version $timestamp), has failed to recognize the
-operating system you are using. If your script is old, overwrite
-config.guess and config.sub with the latest versions from:
-
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
-and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
-
-If $0 has already been updated, send the following data and any
-information you think might be pertinent to config-patches@gnu.org to
-provide the necessary information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config/config.rpath b/config/config.rpath
deleted file mode 100755 (executable)
index b625621..0000000
+++ /dev/null
@@ -1,684 +0,0 @@
-#! /bin/sh
-# Output a system dependent set of variables, describing how to set the
-# run time search path of shared libraries in an executable.
-#
-#   Copyright 1996-2014 Free Software Foundation, Inc.
-#   Taken from GNU libtool, 2001
-#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-#   This file is free software; the Free Software Foundation gives
-#   unlimited permission to copy and/or distribute it, with or without
-#   modifications, as long as this notice is preserved.
-#
-# The first argument passed to this file is the canonical host specification,
-#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or
-#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
-# should be set by the caller.
-#
-# The set of defined variables is at the end of this script.
-
-# Known limitations:
-# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
-#   than 256 bytes, otherwise the compiler driver will dump core. The only
-#   known workaround is to choose shorter directory names for the build
-#   directory and/or the installation directory.
-
-# All known linkers require a '.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-shrext=.so
-
-host="$1"
-host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-# Code taken from libtool.m4's _LT_CC_BASENAME.
-
-for cc_temp in $CC""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
-
-# Code taken from libtool.m4's _LT_COMPILER_PIC.
-
-wl=
-if test "$GCC" = yes; then
-  wl='-Wl,'
-else
-  case "$host_os" in
-    aix*)
-      wl='-Wl,'
-      ;;
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      ;;
-    hpux9* | hpux10* | hpux11*)
-      wl='-Wl,'
-      ;;
-    irix5* | irix6* | nonstopux*)
-      wl='-Wl,'
-      ;;
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-        ecc*)
-          wl='-Wl,'
-          ;;
-        icc* | ifort*)
-          wl='-Wl,'
-          ;;
-        lf95*)
-          wl='-Wl,'
-          ;;
-        nagfor*)
-          wl='-Wl,-Wl,,'
-          ;;
-        pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-          wl='-Wl,'
-          ;;
-        ccc*)
-          wl='-Wl,'
-          ;;
-        xl* | bgxl* | bgf* | mpixl*)
-          wl='-Wl,'
-          ;;
-        como)
-          wl='-lopt='
-          ;;
-        *)
-          case `$CC -V 2>&1 | sed 5q` in
-            *Sun\ F* | *Sun*Fortran*)
-              wl=
-              ;;
-            *Sun\ C*)
-              wl='-Wl,'
-              ;;
-          esac
-          ;;
-      esac
-      ;;
-    newsos6)
-      ;;
-    *nto* | *qnx*)
-      ;;
-    osf3* | osf4* | osf5*)
-      wl='-Wl,'
-      ;;
-    rdos*)
-      ;;
-    solaris*)
-      case $cc_basename in
-        f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-          wl='-Qoption ld '
-          ;;
-        *)
-          wl='-Wl,'
-          ;;
-      esac
-      ;;
-    sunos4*)
-      wl='-Qoption ld '
-      ;;
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      wl='-Wl,'
-      ;;
-    sysv4*MP*)
-      ;;
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      wl='-Wl,'
-      ;;
-    unicos*)
-      wl='-Wl,'
-      ;;
-    uts4*)
-      ;;
-  esac
-fi
-
-# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
-
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-
-case "$host_os" in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
-  # Set some defaults for GNU ld with shared library support. These
-  # are reset later if shared libraries are not supported. Putting them
-  # here allows them to be overridden if necessary.
-  # Unlike libtool, we use -rpath here, not --rpath, since the documented
-  # option of GNU ld is called -rpath, not --rpath.
-  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-  case "$host_os" in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-        ld_shlibs=no
-      fi
-      ;;
-    amigaos*)
-      case "$host_cpu" in
-        powerpc)
-          ;;
-        m68k)
-          hardcode_libdir_flag_spec='-L$libdir'
-          hardcode_minus_L=yes
-          ;;
-      esac
-      ;;
-    beos*)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    cygwin* | mingw* | pw32* | cegcc*)
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    haiku*)
-      ;;
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      ;;
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    netbsd*)
-      ;;
-    solaris*)
-      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
-        ld_shlibs=no
-      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-          ld_shlibs=no
-          ;;
-        *)
-          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
-          else
-            ld_shlibs=no
-          fi
-          ;;
-      esac
-      ;;
-    sunos4*)
-      hardcode_direct=yes
-      ;;
-    *)
-      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-  esac
-  if test "$ld_shlibs" = no; then
-    hardcode_libdir_flag_spec=
-  fi
-else
-  case "$host_os" in
-    aix3*)
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes; then
-        # Neither direct hardcoding nor static linking is supported with a
-        # broken collect2.
-        hardcode_direct=unsupported
-      fi
-      ;;
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-        # On IA64, the linker does run time linking by default, so we don't
-        # have to do anything special.
-        aix_use_runtimelinking=no
-      else
-        aix_use_runtimelinking=no
-        # Test if we are trying to use run time linking or normal
-        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-        # need to do runtime linking.
-        case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-          for ld_flag in $LDFLAGS; do
-            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-              aix_use_runtimelinking=yes
-              break
-            fi
-          done
-          ;;
-        esac
-      fi
-      hardcode_direct=yes
-      hardcode_libdir_separator=':'
-      if test "$GCC" = yes; then
-        case $host_os in aix4.[012]|aix4.[012].*)
-          collect2name=`${CC} -print-prog-name=collect2`
-          if test -f "$collect2name" && \
-            strings "$collect2name" | grep resolve_lib_name >/dev/null
-          then
-            # We have reworked collect2
-            :
-          else
-            # We have old collect2
-            hardcode_direct=unsupported
-            hardcode_minus_L=yes
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_libdir_separator=
-          fi
-          ;;
-        esac
-      fi
-      # Begin _LT_AC_SYS_LIBPATH_AIX.
-      echo 'int main () { return 0; }' > conftest.c
-      ${CC} ${LDFLAGS} conftest.c -o conftest
-      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-      if test -z "$aix_libpath"; then
-        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
-}'`
-      fi
-      if test -z "$aix_libpath"; then
-        aix_libpath="/usr/lib:/lib"
-      fi
-      rm -f conftest.c conftest
-      # End _LT_AC_SYS_LIBPATH_AIX.
-      if test "$aix_use_runtimelinking" = yes; then
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-      else
-        if test "$host_cpu" = ia64; then
-          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-        else
-          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        fi
-      fi
-      ;;
-    amigaos*)
-      case "$host_cpu" in
-        powerpc)
-          ;;
-        m68k)
-          hardcode_libdir_flag_spec='-L$libdir'
-          hardcode_minus_L=yes
-          ;;
-      esac
-      ;;
-    bsdi[45]*)
-      ;;
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      hardcode_libdir_flag_spec=' '
-      libext=lib
-      ;;
-    darwin* | rhapsody*)
-      hardcode_direct=no
-      if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
-        :
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    dgux*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      ;;
-    freebsd2.[01]*)
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      ;;
-    freebsd* | dragonfly*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      ;;
-    hpux9*)
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      ;;
-    hpux10*)
-      if test "$with_gnu_ld" = no; then
-        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator=:
-        hardcode_direct=yes
-        # hardcode_minus_L: Not really in the search PATH,
-        # but as the default location of the library.
-        hardcode_minus_L=yes
-      fi
-      ;;
-    hpux11*)
-      if test "$with_gnu_ld" = no; then
-        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-        hardcode_libdir_separator=:
-        case $host_cpu in
-          hppa*64*|ia64*)
-            hardcode_direct=no
-            ;;
-          *)
-            hardcode_direct=yes
-            # hardcode_minus_L: Not really in the search PATH,
-            # but as the default location of the library.
-            hardcode_minus_L=yes
-            ;;
-        esac
-      fi
-      ;;
-    irix5* | irix6* | nonstopux*)
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-    netbsd*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      ;;
-    newsos6)
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-    *nto* | *qnx*)
-      ;;
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-        hardcode_direct=yes
-        if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-          hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-        else
-          case "$host_os" in
-            openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-              hardcode_libdir_flag_spec='-R$libdir'
-              ;;
-            *)
-              hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-              ;;
-          esac
-        fi
-      else
-        ld_shlibs=no
-      fi
-      ;;
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      ;;
-    osf3*)
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
-    osf4* | osf5*)
-      if test "$GCC" = yes; then
-        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-        # Both cc and cxx compiler support -rpath directly
-        hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      hardcode_libdir_separator=:
-      ;;
-    solaris*)
-      hardcode_libdir_flag_spec='-R$libdir'
-      ;;
-    sunos4*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      ;;
-    sysv4)
-      case $host_vendor in
-        sni)
-          hardcode_direct=yes # is this really true???
-          ;;
-        siemens)
-          hardcode_direct=no
-          ;;
-        motorola)
-          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-          ;;
-      esac
-      ;;
-    sysv4.3*)
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-        ld_shlibs=yes
-      fi
-      ;;
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      ;;
-    sysv5* | sco3.2v5* | sco5v6*)
-      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
-      hardcode_libdir_separator=':'
-      ;;
-    uts4*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      ;;
-    *)
-      ld_shlibs=no
-      ;;
-  esac
-fi
-
-# Check dynamic linker characteristics
-# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
-# Unlike libtool.m4, here we don't care about _all_ names of the library, but
-# only about the one the linker finds when passed -lNAME. This is the last
-# element of library_names_spec in libtool.m4, or possibly two of them if the
-# linker has special search rules.
-library_names_spec=      # the last element of library_names_spec in libtool.m4
-libname_spec='lib$name'
-case "$host_os" in
-  aix3*)
-    library_names_spec='$libname.a'
-    ;;
-  aix[4-9]*)
-    library_names_spec='$libname$shrext'
-    ;;
-  amigaos*)
-    case "$host_cpu" in
-      powerpc*)
-        library_names_spec='$libname$shrext' ;;
-      m68k)
-        library_names_spec='$libname.a' ;;
-    esac
-    ;;
-  beos*)
-    library_names_spec='$libname$shrext'
-    ;;
-  bsdi[45]*)
-    library_names_spec='$libname$shrext'
-    ;;
-  cygwin* | mingw* | pw32* | cegcc*)
-    shrext=.dll
-    library_names_spec='$libname.dll.a $libname.lib'
-    ;;
-  darwin* | rhapsody*)
-    shrext=.dylib
-    library_names_spec='$libname$shrext'
-    ;;
-  dgux*)
-    library_names_spec='$libname$shrext'
-    ;;
-  freebsd[23].*)
-    library_names_spec='$libname$shrext$versuffix'
-    ;;
-  freebsd* | dragonfly*)
-    library_names_spec='$libname$shrext'
-    ;;
-  gnu*)
-    library_names_spec='$libname$shrext'
-    ;;
-  haiku*)
-    library_names_spec='$libname$shrext'
-    ;;
-  hpux9* | hpux10* | hpux11*)
-    case $host_cpu in
-      ia64*)
-        shrext=.so
-        ;;
-      hppa*64*)
-        shrext=.sl
-        ;;
-      *)
-        shrext=.sl
-        ;;
-    esac
-    library_names_spec='$libname$shrext'
-    ;;
-  interix[3-9]*)
-    library_names_spec='$libname$shrext'
-    ;;
-  irix5* | irix6* | nonstopux*)
-    library_names_spec='$libname$shrext'
-    case "$host_os" in
-      irix5* | nonstopux*)
-        libsuff= shlibsuff=
-        ;;
-      *)
-        case $LD in
-          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
-          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
-          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
-          *) libsuff= shlibsuff= ;;
-        esac
-        ;;
-    esac
-    ;;
-  linux*oldld* | linux*aout* | linux*coff*)
-    ;;
-  linux* | k*bsd*-gnu | kopensolaris*-gnu)
-    library_names_spec='$libname$shrext'
-    ;;
-  knetbsd*-gnu)
-    library_names_spec='$libname$shrext'
-    ;;
-  netbsd*)
-    library_names_spec='$libname$shrext'
-    ;;
-  newsos6)
-    library_names_spec='$libname$shrext'
-    ;;
-  *nto* | *qnx*)
-    library_names_spec='$libname$shrext'
-    ;;
-  openbsd*)
-    library_names_spec='$libname$shrext$versuffix'
-    ;;
-  os2*)
-    libname_spec='$name'
-    shrext=.dll
-    library_names_spec='$libname.a'
-    ;;
-  osf3* | osf4* | osf5*)
-    library_names_spec='$libname$shrext'
-    ;;
-  rdos*)
-    ;;
-  solaris*)
-    library_names_spec='$libname$shrext'
-    ;;
-  sunos4*)
-    library_names_spec='$libname$shrext$versuffix'
-    ;;
-  sysv4 | sysv4.3*)
-    library_names_spec='$libname$shrext'
-    ;;
-  sysv4*MP*)
-    library_names_spec='$libname$shrext'
-    ;;
-  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-    library_names_spec='$libname$shrext'
-    ;;
-  tpf*)
-    library_names_spec='$libname$shrext'
-    ;;
-  uts4*)
-    library_names_spec='$libname$shrext'
-    ;;
-esac
-
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
-shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
-escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-
-LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
-
-# How to pass a linker flag through the compiler.
-wl="$escaped_wl"
-
-# Static library suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally "so").
-shlibext="$shlibext"
-
-# Format of library name prefix.
-libname_spec="$escaped_libname_spec"
-
-# Library names that the linker finds when passed -lNAME.
-library_names_spec="$escaped_library_names_spec"
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator="$hardcode_libdir_separator"
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct="$hardcode_direct"
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L="$hardcode_minus_L"
-
-EOF
diff --git a/config/config.sub b/config/config.sub
deleted file mode 100644 (file)
index 6d86a1e..0000000
+++ /dev/null
@@ -1,1815 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright 1992-2016 Free Software Foundation, Inc.
-
-timestamp='2016-05-10'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program.  This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright 1992-2016 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )        # Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  android-linux)
-    os=-linux-android
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-       -sun*os*)
-               # Prevent following clause from handling this invalid input.
-               ;;
-       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-       -apple | -axis | -knuth | -cray | -microblaze*)
-               os=
-               basic_machine=$1
-               ;;
-       -bluegene*)
-               os=-cnk
-               ;;
-       -sim | -cisco | -oki | -wec | -winbond)
-               os=
-               basic_machine=$1
-               ;;
-       -scout)
-               ;;
-       -wrs)
-               os=-vxworks
-               basic_machine=$1
-               ;;
-       -chorusos*)
-               os=-chorusos
-               basic_machine=$1
-               ;;
-       -chorusrdb)
-               os=-chorusrdb
-               basic_machine=$1
-               ;;
-       -hiux*)
-               os=-hiuxwe2
-               ;;
-       -sco6)
-               os=-sco5v6
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco5)
-               os=-sco3.2v5
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco4)
-               os=-sco3.2v4
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2.[4-9]*)
-               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco3.2v[4-9]*)
-               # Don't forget version if it is 3.2v4 or newer.
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco5v6*)
-               # Don't forget version if it is 3.2v4 or newer.
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -sco*)
-               os=-sco3.2v2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -udk*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -isc)
-               os=-isc2.2
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -clix*)
-               basic_machine=clipper-intergraph
-               ;;
-       -isc*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-               ;;
-       -lynx*178)
-               os=-lynxos178
-               ;;
-       -lynx*5)
-               os=-lynxos5
-               ;;
-       -lynx*)
-               os=-lynxos
-               ;;
-       -ptx*)
-               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-               ;;
-       -windowsnt*)
-               os=`echo $os | sed -e 's/windowsnt/winnt/'`
-               ;;
-       -psos*)
-               os=-psos
-               ;;
-       -mint | -mint[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-       # Recognize the basic CPU types without company name.
-       # Some are omitted here because they have special meanings below.
-       1750a | 580 \
-       | a29k \
-       | aarch64 | aarch64_be \
-       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-       | am33_2.0 \
-       | arc | arceb \
-       | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
-       | avr | avr32 \
-       | ba \
-       | be32 | be64 \
-       | bfin \
-       | c4x | c8051 | clipper \
-       | d10v | d30v | dlx | dsp16xx \
-       | e2k | epiphany \
-       | fido | fr30 | frv | ft32 \
-       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-       | hexagon \
-       | i370 | i860 | i960 | ia64 \
-       | ip2k | iq2000 \
-       | k1om \
-       | le32 | le64 \
-       | lm32 \
-       | m32c | m32r | m32rle | m68000 | m68k | m88k \
-       | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
-       | mips | mipsbe | mipseb | mipsel | mipsle \
-       | mips16 \
-       | mips64 | mips64el \
-       | mips64octeon | mips64octeonel \
-       | mips64orion | mips64orionel \
-       | mips64r5900 | mips64r5900el \
-       | mips64vr | mips64vrel \
-       | mips64vr4100 | mips64vr4100el \
-       | mips64vr4300 | mips64vr4300el \
-       | mips64vr5000 | mips64vr5000el \
-       | mips64vr5900 | mips64vr5900el \
-       | mipsisa32 | mipsisa32el \
-       | mipsisa32r2 | mipsisa32r2el \
-       | mipsisa32r6 | mipsisa32r6el \
-       | mipsisa64 | mipsisa64el \
-       | mipsisa64r2 | mipsisa64r2el \
-       | mipsisa64r6 | mipsisa64r6el \
-       | mipsisa64sb1 | mipsisa64sb1el \
-       | mipsisa64sr71k | mipsisa64sr71kel \
-       | mipsr5900 | mipsr5900el \
-       | mipstx39 | mipstx39el \
-       | mn10200 | mn10300 \
-       | moxie \
-       | mt \
-       | msp430 \
-       | nds32 | nds32le | nds32be \
-       | nios | nios2 | nios2eb | nios2el \
-       | ns16k | ns32k \
-       | open8 | or1k | or1knd | or32 \
-       | pdp10 | pdp11 | pj | pjl \
-       | powerpc | powerpc64 | powerpc64le | powerpcle \
-       | pyramid \
-       | riscv32 | riscv64 \
-       | rl78 | rx \
-       | score \
-       | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-       | sh64 | sh64le \
-       | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-       | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-       | spu \
-       | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-       | ubicom32 \
-       | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-       | visium \
-       | we32k \
-       | x86 | xc16x | xstormy16 | xtensa \
-       | z8k | z80)
-               basic_machine=$basic_machine-unknown
-               ;;
-       c54x)
-               basic_machine=tic54x-unknown
-               ;;
-       c55x)
-               basic_machine=tic55x-unknown
-               ;;
-       c6x)
-               basic_machine=tic6x-unknown
-               ;;
-       leon|leon[3-9])
-               basic_machine=sparc-$basic_machine
-               ;;
-       m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
-               basic_machine=$basic_machine-unknown
-               os=-none
-               ;;
-       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-               ;;
-       ms1)
-               basic_machine=mt-unknown
-               ;;
-
-       strongarm | thumb | xscale)
-               basic_machine=arm-unknown
-               ;;
-       xgate)
-               basic_machine=$basic_machine-unknown
-               os=-none
-               ;;
-       xscaleeb)
-               basic_machine=armeb-unknown
-               ;;
-
-       xscaleel)
-               basic_machine=armel-unknown
-               ;;
-
-       # We use `pc' rather than `unknown'
-       # because (1) that's what they normally are, and
-       # (2) the word "unknown" tends to confuse beginning users.
-       i*86 | x86_64)
-         basic_machine=$basic_machine-pc
-         ;;
-       # Object if more than one company name word.
-       *-*-*)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-       # Recognize the basic CPU types with company name.
-       580-* \
-       | a29k-* \
-       | aarch64-* | aarch64_be-* \
-       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
-       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-       | avr-* | avr32-* \
-       | ba-* \
-       | be32-* | be64-* \
-       | bfin-* | bs2000-* \
-       | c[123]* | c30-* | [cjt]90-* | c4x-* \
-       | c8051-* | clipper-* | craynv-* | cydra-* \
-       | d10v-* | d30v-* | dlx-* \
-       | e2k-* | elxsi-* \
-       | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-       | h8300-* | h8500-* \
-       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-       | hexagon-* \
-       | i*86-* | i860-* | i960-* | ia64-* \
-       | ip2k-* | iq2000-* \
-       | k1om-* \
-       | le32-* | le64-* \
-       | lm32-* \
-       | m32c-* | m32r-* | m32rle-* \
-       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-       | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
-       | microblaze-* | microblazeel-* \
-       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-       | mips16-* \
-       | mips64-* | mips64el-* \
-       | mips64octeon-* | mips64octeonel-* \
-       | mips64orion-* | mips64orionel-* \
-       | mips64r5900-* | mips64r5900el-* \
-       | mips64vr-* | mips64vrel-* \
-       | mips64vr4100-* | mips64vr4100el-* \
-       | mips64vr4300-* | mips64vr4300el-* \
-       | mips64vr5000-* | mips64vr5000el-* \
-       | mips64vr5900-* | mips64vr5900el-* \
-       | mipsisa32-* | mipsisa32el-* \
-       | mipsisa32r2-* | mipsisa32r2el-* \
-       | mipsisa32r6-* | mipsisa32r6el-* \
-       | mipsisa64-* | mipsisa64el-* \
-       | mipsisa64r2-* | mipsisa64r2el-* \
-       | mipsisa64r6-* | mipsisa64r6el-* \
-       | mipsisa64sb1-* | mipsisa64sb1el-* \
-       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
-       | mipsr5900-* | mipsr5900el-* \
-       | mipstx39-* | mipstx39el-* \
-       | mmix-* \
-       | mt-* \
-       | msp430-* \
-       | nds32-* | nds32le-* | nds32be-* \
-       | nios-* | nios2-* | nios2eb-* | nios2el-* \
-       | none-* | np1-* | ns16k-* | ns32k-* \
-       | open8-* \
-       | or1k*-* \
-       | orion-* \
-       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-       | pyramid-* \
-       | riscv32-* | riscv64-* \
-       | rl78-* | romp-* | rs6000-* | rx-* \
-       | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-       | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-       | sparclite-* \
-       | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
-       | tahoe-* \
-       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-       | tile*-* \
-       | tron-* \
-       | ubicom32-* \
-       | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-       | vax-* \
-       | visium-* \
-       | we32k-* \
-       | x86-* | x86_64-* | xc16x-* | xps100-* \
-       | xstormy16-* | xtensa*-* \
-       | ymp-* \
-       | z8k-* | z80-*)
-               ;;
-       # Recognize the basic CPU types without company name, with glob match.
-       xtensa*)
-               basic_machine=$basic_machine-unknown
-               ;;
-       # Recognize the various machine names and aliases which stand
-       # for a CPU type and a company and sometimes even an OS.
-       386bsd)
-               basic_machine=i386-unknown
-               os=-bsd
-               ;;
-       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-               basic_machine=m68000-att
-               ;;
-       3b*)
-               basic_machine=we32k-att
-               ;;
-       a29khif)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       abacus)
-               basic_machine=abacus-unknown
-               ;;
-       adobe68k)
-               basic_machine=m68010-adobe
-               os=-scout
-               ;;
-       alliant | fx80)
-               basic_machine=fx80-alliant
-               ;;
-       altos | altos3068)
-               basic_machine=m68k-altos
-               ;;
-       am29k)
-               basic_machine=a29k-none
-               os=-bsd
-               ;;
-       amd64)
-               basic_machine=x86_64-pc
-               ;;
-       amd64-*)
-               basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       amdahl)
-               basic_machine=580-amdahl
-               os=-sysv
-               ;;
-       amiga | amiga-*)
-               basic_machine=m68k-unknown
-               ;;
-       amigaos | amigados)
-               basic_machine=m68k-unknown
-               os=-amigaos
-               ;;
-       amigaunix | amix)
-               basic_machine=m68k-unknown
-               os=-sysv4
-               ;;
-       apollo68)
-               basic_machine=m68k-apollo
-               os=-sysv
-               ;;
-       apollo68bsd)
-               basic_machine=m68k-apollo
-               os=-bsd
-               ;;
-       aros)
-               basic_machine=i386-pc
-               os=-aros
-               ;;
-       asmjs)
-               basic_machine=asmjs-unknown
-               ;;
-       aux)
-               basic_machine=m68k-apple
-               os=-aux
-               ;;
-       balance)
-               basic_machine=ns32k-sequent
-               os=-dynix
-               ;;
-       blackfin)
-               basic_machine=bfin-unknown
-               os=-linux
-               ;;
-       blackfin-*)
-               basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-               os=-linux
-               ;;
-       bluegene*)
-               basic_machine=powerpc-ibm
-               os=-cnk
-               ;;
-       c54x-*)
-               basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       c55x-*)
-               basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       c6x-*)
-               basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       c90)
-               basic_machine=c90-cray
-               os=-unicos
-               ;;
-       cegcc)
-               basic_machine=arm-unknown
-               os=-cegcc
-               ;;
-       convex-c1)
-               basic_machine=c1-convex
-               os=-bsd
-               ;;
-       convex-c2)
-               basic_machine=c2-convex
-               os=-bsd
-               ;;
-       convex-c32)
-               basic_machine=c32-convex
-               os=-bsd
-               ;;
-       convex-c34)
-               basic_machine=c34-convex
-               os=-bsd
-               ;;
-       convex-c38)
-               basic_machine=c38-convex
-               os=-bsd
-               ;;
-       cray | j90)
-               basic_machine=j90-cray
-               os=-unicos
-               ;;
-       craynv)
-               basic_machine=craynv-cray
-               os=-unicosmp
-               ;;
-       cr16 | cr16-*)
-               basic_machine=cr16-unknown
-               os=-elf
-               ;;
-       crds | unos)
-               basic_machine=m68k-crds
-               ;;
-       crisv32 | crisv32-* | etraxfs*)
-               basic_machine=crisv32-axis
-               ;;
-       cris | cris-* | etrax*)
-               basic_machine=cris-axis
-               ;;
-       crx)
-               basic_machine=crx-unknown
-               os=-elf
-               ;;
-       da30 | da30-*)
-               basic_machine=m68k-da30
-               ;;
-       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-               basic_machine=mips-dec
-               ;;
-       decsystem10* | dec10*)
-               basic_machine=pdp10-dec
-               os=-tops10
-               ;;
-       decsystem20* | dec20*)
-               basic_machine=pdp10-dec
-               os=-tops20
-               ;;
-       delta | 3300 | motorola-3300 | motorola-delta \
-             | 3300-motorola | delta-motorola)
-               basic_machine=m68k-motorola
-               ;;
-       delta88)
-               basic_machine=m88k-motorola
-               os=-sysv3
-               ;;
-       dicos)
-               basic_machine=i686-pc
-               os=-dicos
-               ;;
-       djgpp)
-               basic_machine=i586-pc
-               os=-msdosdjgpp
-               ;;
-       dpx20 | dpx20-*)
-               basic_machine=rs6000-bull
-               os=-bosx
-               ;;
-       dpx2* | dpx2*-bull)
-               basic_machine=m68k-bull
-               os=-sysv3
-               ;;
-       ebmon29k)
-               basic_machine=a29k-amd
-               os=-ebmon
-               ;;
-       elxsi)
-               basic_machine=elxsi-elxsi
-               os=-bsd
-               ;;
-       encore | umax | mmax)
-               basic_machine=ns32k-encore
-               ;;
-       es1800 | OSE68k | ose68k | ose | OSE)
-               basic_machine=m68k-ericsson
-               os=-ose
-               ;;
-       fx2800)
-               basic_machine=i860-alliant
-               ;;
-       genix)
-               basic_machine=ns32k-ns
-               ;;
-       gmicro)
-               basic_machine=tron-gmicro
-               os=-sysv
-               ;;
-       go32)
-               basic_machine=i386-pc
-               os=-go32
-               ;;
-       h3050r* | hiux*)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       h8300hms)
-               basic_machine=h8300-hitachi
-               os=-hms
-               ;;
-       h8300xray)
-               basic_machine=h8300-hitachi
-               os=-xray
-               ;;
-       h8500hms)
-               basic_machine=h8500-hitachi
-               os=-hms
-               ;;
-       harris)
-               basic_machine=m88k-harris
-               os=-sysv3
-               ;;
-       hp300-*)
-               basic_machine=m68k-hp
-               ;;
-       hp300bsd)
-               basic_machine=m68k-hp
-               os=-bsd
-               ;;
-       hp300hpux)
-               basic_machine=m68k-hp
-               os=-hpux
-               ;;
-       hp3k9[0-9][0-9] | hp9[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k2[0-9][0-9] | hp9k31[0-9])
-               basic_machine=m68000-hp
-               ;;
-       hp9k3[2-9][0-9])
-               basic_machine=m68k-hp
-               ;;
-       hp9k6[0-9][0-9] | hp6[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hp9k7[0-79][0-9] | hp7[0-79][0-9])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k78[0-9] | hp78[0-9])
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-               # FIXME: really hppa2.0-hp
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][13679] | hp8[0-9][13679])
-               basic_machine=hppa1.1-hp
-               ;;
-       hp9k8[0-9][0-9] | hp8[0-9][0-9])
-               basic_machine=hppa1.0-hp
-               ;;
-       hppa-next)
-               os=-nextstep3
-               ;;
-       hppaosf)
-               basic_machine=hppa1.1-hp
-               os=-osf
-               ;;
-       hppro)
-               basic_machine=hppa1.1-hp
-               os=-proelf
-               ;;
-       i370-ibm* | ibm*)
-               basic_machine=i370-ibm
-               ;;
-       i*86v32)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv32
-               ;;
-       i*86v4*)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv4
-               ;;
-       i*86v)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv
-               ;;
-       i*86sol2)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-solaris2
-               ;;
-       i386mach)
-               basic_machine=i386-mach
-               os=-mach
-               ;;
-       i386-vsta | vsta)
-               basic_machine=i386-unknown
-               os=-vsta
-               ;;
-       iris | iris4d)
-               basic_machine=mips-sgi
-               case $os in
-                   -irix*)
-                       ;;
-                   *)
-                       os=-irix4
-                       ;;
-               esac
-               ;;
-       isi68 | isi)
-               basic_machine=m68k-isi
-               os=-sysv
-               ;;
-       leon-*|leon[3-9]-*)
-               basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
-               ;;
-       m68knommu)
-               basic_machine=m68k-unknown
-               os=-linux
-               ;;
-       m68knommu-*)
-               basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-               os=-linux
-               ;;
-       m88k-omron*)
-               basic_machine=m88k-omron
-               ;;
-       magnum | m3230)
-               basic_machine=mips-mips
-               os=-sysv
-               ;;
-       merlin)
-               basic_machine=ns32k-utek
-               os=-sysv
-               ;;
-       microblaze*)
-               basic_machine=microblaze-xilinx
-               ;;
-       mingw64)
-               basic_machine=x86_64-pc
-               os=-mingw64
-               ;;
-       mingw32)
-               basic_machine=i686-pc
-               os=-mingw32
-               ;;
-       mingw32ce)
-               basic_machine=arm-unknown
-               os=-mingw32ce
-               ;;
-       miniframe)
-               basic_machine=m68000-convergent
-               ;;
-       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-               basic_machine=m68k-atari
-               os=-mint
-               ;;
-       mips3*-*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-               ;;
-       mips3*)
-               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-               ;;
-       monitor)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       morphos)
-               basic_machine=powerpc-unknown
-               os=-morphos
-               ;;
-       moxiebox)
-               basic_machine=moxie-unknown
-               os=-moxiebox
-               ;;
-       msdos)
-               basic_machine=i386-pc
-               os=-msdos
-               ;;
-       ms1-*)
-               basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-               ;;
-       msys)
-               basic_machine=i686-pc
-               os=-msys
-               ;;
-       mvs)
-               basic_machine=i370-ibm
-               os=-mvs
-               ;;
-       nacl)
-               basic_machine=le32-unknown
-               os=-nacl
-               ;;
-       ncr3000)
-               basic_machine=i486-ncr
-               os=-sysv4
-               ;;
-       netbsd386)
-               basic_machine=i386-unknown
-               os=-netbsd
-               ;;
-       netwinder)
-               basic_machine=armv4l-rebel
-               os=-linux
-               ;;
-       news | news700 | news800 | news900)
-               basic_machine=m68k-sony
-               os=-newsos
-               ;;
-       news1000)
-               basic_machine=m68030-sony
-               os=-newsos
-               ;;
-       news-3600 | risc-news)
-               basic_machine=mips-sony
-               os=-newsos
-               ;;
-       necv70)
-               basic_machine=v70-nec
-               os=-sysv
-               ;;
-       next | m*-next )
-               basic_machine=m68k-next
-               case $os in
-                   -nextstep* )
-                       ;;
-                   -ns2*)
-                     os=-nextstep2
-                       ;;
-                   *)
-                     os=-nextstep3
-                       ;;
-               esac
-               ;;
-       nh3000)
-               basic_machine=m68k-harris
-               os=-cxux
-               ;;
-       nh[45]000)
-               basic_machine=m88k-harris
-               os=-cxux
-               ;;
-       nindy960)
-               basic_machine=i960-intel
-               os=-nindy
-               ;;
-       mon960)
-               basic_machine=i960-intel
-               os=-mon960
-               ;;
-       nonstopux)
-               basic_machine=mips-compaq
-               os=-nonstopux
-               ;;
-       np1)
-               basic_machine=np1-gould
-               ;;
-       neo-tandem)
-               basic_machine=neo-tandem
-               ;;
-       nse-tandem)
-               basic_machine=nse-tandem
-               ;;
-       nsr-tandem)
-               basic_machine=nsr-tandem
-               ;;
-       op50n-* | op60c-*)
-               basic_machine=hppa1.1-oki
-               os=-proelf
-               ;;
-       openrisc | openrisc-*)
-               basic_machine=or32-unknown
-               ;;
-       os400)
-               basic_machine=powerpc-ibm
-               os=-os400
-               ;;
-       OSE68000 | ose68000)
-               basic_machine=m68000-ericsson
-               os=-ose
-               ;;
-       os68k)
-               basic_machine=m68k-none
-               os=-os68k
-               ;;
-       pa-hitachi)
-               basic_machine=hppa1.1-hitachi
-               os=-hiuxwe2
-               ;;
-       paragon)
-               basic_machine=i860-intel
-               os=-osf
-               ;;
-       parisc)
-               basic_machine=hppa-unknown
-               os=-linux
-               ;;
-       parisc-*)
-               basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-               os=-linux
-               ;;
-       pbd)
-               basic_machine=sparc-tti
-               ;;
-       pbb)
-               basic_machine=m68k-tti
-               ;;
-       pc532 | pc532-*)
-               basic_machine=ns32k-pc532
-               ;;
-       pc98)
-               basic_machine=i386-pc
-               ;;
-       pc98-*)
-               basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentium | p5 | k5 | k6 | nexgen | viac3)
-               basic_machine=i586-pc
-               ;;
-       pentiumpro | p6 | 6x86 | athlon | athlon_*)
-               basic_machine=i686-pc
-               ;;
-       pentiumii | pentium2 | pentiumiii | pentium3)
-               basic_machine=i686-pc
-               ;;
-       pentium4)
-               basic_machine=i786-pc
-               ;;
-       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumpro-* | p6-* | 6x86-* | athlon-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pentium4-*)
-               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pn)
-               basic_machine=pn-gould
-               ;;
-       power)  basic_machine=power-ibm
-               ;;
-       ppc | ppcbe)    basic_machine=powerpc-unknown
-               ;;
-       ppc-* | ppcbe-*)
-               basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppcle | powerpclittle | ppc-le | powerpc-little)
-               basic_machine=powerpcle-unknown
-               ;;
-       ppcle-* | powerpclittle-*)
-               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppc64)  basic_machine=powerpc64-unknown
-               ;;
-       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-               basic_machine=powerpc64le-unknown
-               ;;
-       ppc64le-* | powerpc64little-*)
-               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       ps2)
-               basic_machine=i386-ibm
-               ;;
-       pw32)
-               basic_machine=i586-unknown
-               os=-pw32
-               ;;
-       rdos | rdos64)
-               basic_machine=x86_64-pc
-               os=-rdos
-               ;;
-       rdos32)
-               basic_machine=i386-pc
-               os=-rdos
-               ;;
-       rom68k)
-               basic_machine=m68k-rom68k
-               os=-coff
-               ;;
-       rm[46]00)
-               basic_machine=mips-siemens
-               ;;
-       rtpc | rtpc-*)
-               basic_machine=romp-ibm
-               ;;
-       s390 | s390-*)
-               basic_machine=s390-ibm
-               ;;
-       s390x | s390x-*)
-               basic_machine=s390x-ibm
-               ;;
-       sa29200)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       sb1)
-               basic_machine=mipsisa64sb1-unknown
-               ;;
-       sb1el)
-               basic_machine=mipsisa64sb1el-unknown
-               ;;
-       sde)
-               basic_machine=mipsisa32-sde
-               os=-elf
-               ;;
-       sei)
-               basic_machine=mips-sei
-               os=-seiux
-               ;;
-       sequent)
-               basic_machine=i386-sequent
-               ;;
-       sh)
-               basic_machine=sh-hitachi
-               os=-hms
-               ;;
-       sh5el)
-               basic_machine=sh5le-unknown
-               ;;
-       sh64)
-               basic_machine=sh64-unknown
-               ;;
-       sparclite-wrs | simso-wrs)
-               basic_machine=sparclite-wrs
-               os=-vxworks
-               ;;
-       sps7)
-               basic_machine=m68k-bull
-               os=-sysv2
-               ;;
-       spur)
-               basic_machine=spur-unknown
-               ;;
-       st2000)
-               basic_machine=m68k-tandem
-               ;;
-       stratus)
-               basic_machine=i860-stratus
-               os=-sysv4
-               ;;
-       strongarm-* | thumb-*)
-               basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       sun2)
-               basic_machine=m68000-sun
-               ;;
-       sun2os3)
-               basic_machine=m68000-sun
-               os=-sunos3
-               ;;
-       sun2os4)
-               basic_machine=m68000-sun
-               os=-sunos4
-               ;;
-       sun3os3)
-               basic_machine=m68k-sun
-               os=-sunos3
-               ;;
-       sun3os4)
-               basic_machine=m68k-sun
-               os=-sunos4
-               ;;
-       sun4os3)
-               basic_machine=sparc-sun
-               os=-sunos3
-               ;;
-       sun4os4)
-               basic_machine=sparc-sun
-               os=-sunos4
-               ;;
-       sun4sol2)
-               basic_machine=sparc-sun
-               os=-solaris2
-               ;;
-       sun3 | sun3-*)
-               basic_machine=m68k-sun
-               ;;
-       sun4)
-               basic_machine=sparc-sun
-               ;;
-       sun386 | sun386i | roadrunner)
-               basic_machine=i386-sun
-               ;;
-       sv1)
-               basic_machine=sv1-cray
-               os=-unicos
-               ;;
-       symmetry)
-               basic_machine=i386-sequent
-               os=-dynix
-               ;;
-       t3e)
-               basic_machine=alphaev5-cray
-               os=-unicos
-               ;;
-       t90)
-               basic_machine=t90-cray
-               os=-unicos
-               ;;
-       tile*)
-               basic_machine=$basic_machine-unknown
-               os=-linux-gnu
-               ;;
-       tx39)
-               basic_machine=mipstx39-unknown
-               ;;
-       tx39el)
-               basic_machine=mipstx39el-unknown
-               ;;
-       toad1)
-               basic_machine=pdp10-xkl
-               os=-tops20
-               ;;
-       tower | tower-32)
-               basic_machine=m68k-ncr
-               ;;
-       tpf)
-               basic_machine=s390x-ibm
-               os=-tpf
-               ;;
-       udi29k)
-               basic_machine=a29k-amd
-               os=-udi
-               ;;
-       ultra3)
-               basic_machine=a29k-nyu
-               os=-sym1
-               ;;
-       v810 | necv810)
-               basic_machine=v810-nec
-               os=-none
-               ;;
-       vaxv)
-               basic_machine=vax-dec
-               os=-sysv
-               ;;
-       vms)
-               basic_machine=vax-dec
-               os=-vms
-               ;;
-       vpp*|vx|vx-*)
-               basic_machine=f301-fujitsu
-               ;;
-       vxworks960)
-               basic_machine=i960-wrs
-               os=-vxworks
-               ;;
-       vxworks68)
-               basic_machine=m68k-wrs
-               os=-vxworks
-               ;;
-       vxworks29k)
-               basic_machine=a29k-wrs
-               os=-vxworks
-               ;;
-       w65*)
-               basic_machine=w65-wdc
-               os=-none
-               ;;
-       w89k-*)
-               basic_machine=hppa1.1-winbond
-               os=-proelf
-               ;;
-       xbox)
-               basic_machine=i686-pc
-               os=-mingw32
-               ;;
-       xps | xps100)
-               basic_machine=xps100-honeywell
-               ;;
-       xscale-* | xscalee[bl]-*)
-               basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
-               ;;
-       ymp)
-               basic_machine=ymp-cray
-               os=-unicos
-               ;;
-       z8k-*-coff)
-               basic_machine=z8k-unknown
-               os=-sim
-               ;;
-       z80-*-coff)
-               basic_machine=z80-unknown
-               os=-sim
-               ;;
-       none)
-               basic_machine=none-none
-               os=-none
-               ;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-       w89k)
-               basic_machine=hppa1.1-winbond
-               ;;
-       op50n)
-               basic_machine=hppa1.1-oki
-               ;;
-       op60c)
-               basic_machine=hppa1.1-oki
-               ;;
-       romp)
-               basic_machine=romp-ibm
-               ;;
-       mmix)
-               basic_machine=mmix-knuth
-               ;;
-       rs6000)
-               basic_machine=rs6000-ibm
-               ;;
-       vax)
-               basic_machine=vax-dec
-               ;;
-       pdp10)
-               # there are many clones, so DEC is not a safe bet
-               basic_machine=pdp10-unknown
-               ;;
-       pdp11)
-               basic_machine=pdp11-dec
-               ;;
-       we32k)
-               basic_machine=we32k-att
-               ;;
-       sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-               basic_machine=sh-unknown
-               ;;
-       sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-               basic_machine=sparc-sun
-               ;;
-       cydra)
-               basic_machine=cydra-cydrome
-               ;;
-       orion)
-               basic_machine=orion-highlevel
-               ;;
-       orion105)
-               basic_machine=clipper-highlevel
-               ;;
-       mac | mpw | mac-mpw)
-               basic_machine=m68k-apple
-               ;;
-       pmac | pmac-mpw)
-               basic_machine=powerpc-apple
-               ;;
-       *-unknown)
-               # Make sure to match an already-canonicalized machine name.
-               ;;
-       *)
-               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-       *-digital*)
-               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-               ;;
-       *-commodore*)
-               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-               ;;
-       *)
-               ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-       # First match some system type aliases
-       # that might get confused with valid system types.
-       # -solaris* is a basic system type, with this one exception.
-       -auroraux)
-               os=-auroraux
-               ;;
-       -solaris1 | -solaris1.*)
-               os=`echo $os | sed -e 's|solaris1|sunos4|'`
-               ;;
-       -solaris)
-               os=-solaris2
-               ;;
-       -svr4*)
-               os=-sysv4
-               ;;
-       -unixware*)
-               os=-sysv4.2uw
-               ;;
-       -gnu/linux*)
-               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-               ;;
-       # First accept the basic system types.
-       # The portable systems comes first.
-       # Each alternative MUST END IN A *, to match a version number.
-       # -sysv* is not here because it comes later, after sysvr4.
-       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-             | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-             | -sym* | -kopensolaris* | -plan9* \
-             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-             | -aos* | -aros* | -cloudabi* | -sortix* \
-             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-             | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-             | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
-             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-             | -chorusos* | -chorusrdb* | -cegcc* \
-             | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-             | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
-             | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-             | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
-             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-             | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
-             | -onefs* | -tirtos* | -phoenix*)
-       # Remember, each alternative MUST END IN *, to match a version number.
-               ;;
-       -qnx*)
-               case $basic_machine in
-                   x86-* | i*86-*)
-                       ;;
-                   *)
-                       os=-nto$os
-                       ;;
-               esac
-               ;;
-       -nto-qnx*)
-               ;;
-       -nto*)
-               os=`echo $os | sed -e 's|nto|nto-qnx|'`
-               ;;
-       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-             | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-               ;;
-       -mac*)
-               os=`echo $os | sed -e 's|mac|macos|'`
-               ;;
-       -linux-dietlibc)
-               os=-linux-dietlibc
-               ;;
-       -linux*)
-               os=`echo $os | sed -e 's|linux|linux-gnu|'`
-               ;;
-       -sunos5*)
-               os=`echo $os | sed -e 's|sunos5|solaris2|'`
-               ;;
-       -sunos6*)
-               os=`echo $os | sed -e 's|sunos6|solaris3|'`
-               ;;
-       -opened*)
-               os=-openedition
-               ;;
-       -os400*)
-               os=-os400
-               ;;
-       -wince*)
-               os=-wince
-               ;;
-       -osfrose*)
-               os=-osfrose
-               ;;
-       -osf*)
-               os=-osf
-               ;;
-       -utek*)
-               os=-bsd
-               ;;
-       -dynix*)
-               os=-bsd
-               ;;
-       -acis*)
-               os=-aos
-               ;;
-       -atheos*)
-               os=-atheos
-               ;;
-       -syllable*)
-               os=-syllable
-               ;;
-       -386bsd)
-               os=-bsd
-               ;;
-       -ctix* | -uts*)
-               os=-sysv
-               ;;
-       -nova*)
-               os=-rtmk-nova
-               ;;
-       -ns2 )
-               os=-nextstep2
-               ;;
-       -nsk*)
-               os=-nsk
-               ;;
-       # Preserve the version number of sinix5.
-       -sinix5.*)
-               os=`echo $os | sed -e 's|sinix|sysv|'`
-               ;;
-       -sinix*)
-               os=-sysv4
-               ;;
-       -tpf*)
-               os=-tpf
-               ;;
-       -triton*)
-               os=-sysv3
-               ;;
-       -oss*)
-               os=-sysv3
-               ;;
-       -svr4)
-               os=-sysv4
-               ;;
-       -svr3)
-               os=-sysv3
-               ;;
-       -sysvr4)
-               os=-sysv4
-               ;;
-       # This must come after -sysvr4.
-       -sysv*)
-               ;;
-       -ose*)
-               os=-ose
-               ;;
-       -es1800*)
-               os=-ose
-               ;;
-       -xenix)
-               os=-xenix
-               ;;
-       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-               os=-mint
-               ;;
-       -aros*)
-               os=-aros
-               ;;
-       -zvmoe)
-               os=-zvmoe
-               ;;
-       -dicos*)
-               os=-dicos
-               ;;
-       -nacl*)
-               ;;
-       -ios)
-               ;;
-       -none)
-               ;;
-       *)
-               # Get rid of the `-' at the beginning of $os.
-               os=`echo $os | sed 's/[^-]*-//'`
-               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-               exit 1
-               ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-       score-*)
-               os=-elf
-               ;;
-       spu-*)
-               os=-elf
-               ;;
-       *-acorn)
-               os=-riscix1.2
-               ;;
-       arm*-rebel)
-               os=-linux
-               ;;
-       arm*-semi)
-               os=-aout
-               ;;
-       c4x-* | tic4x-*)
-               os=-coff
-               ;;
-       c8051-*)
-               os=-elf
-               ;;
-       hexagon-*)
-               os=-elf
-               ;;
-       tic54x-*)
-               os=-coff
-               ;;
-       tic55x-*)
-               os=-coff
-               ;;
-       tic6x-*)
-               os=-coff
-               ;;
-       # This must come before the *-dec entry.
-       pdp10-*)
-               os=-tops20
-               ;;
-       pdp11-*)
-               os=-none
-               ;;
-       *-dec | vax-*)
-               os=-ultrix4.2
-               ;;
-       m68*-apollo)
-               os=-domain
-               ;;
-       i386-sun)
-               os=-sunos4.0.2
-               ;;
-       m68000-sun)
-               os=-sunos3
-               ;;
-       m68*-cisco)
-               os=-aout
-               ;;
-       mep-*)
-               os=-elf
-               ;;
-       mips*-cisco)
-               os=-elf
-               ;;
-       mips*-*)
-               os=-elf
-               ;;
-       or32-*)
-               os=-coff
-               ;;
-       *-tti)  # must be before sparc entry or we get the wrong os.
-               os=-sysv3
-               ;;
-       sparc-* | *-sun)
-               os=-sunos4.1.1
-               ;;
-       *-be)
-               os=-beos
-               ;;
-       *-haiku)
-               os=-haiku
-               ;;
-       *-ibm)
-               os=-aix
-               ;;
-       *-knuth)
-               os=-mmixware
-               ;;
-       *-wec)
-               os=-proelf
-               ;;
-       *-winbond)
-               os=-proelf
-               ;;
-       *-oki)
-               os=-proelf
-               ;;
-       *-hp)
-               os=-hpux
-               ;;
-       *-hitachi)
-               os=-hiux
-               ;;
-       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-               os=-sysv
-               ;;
-       *-cbm)
-               os=-amigaos
-               ;;
-       *-dg)
-               os=-dgux
-               ;;
-       *-dolphin)
-               os=-sysv3
-               ;;
-       m68k-ccur)
-               os=-rtu
-               ;;
-       m88k-omron*)
-               os=-luna
-               ;;
-       *-next )
-               os=-nextstep
-               ;;
-       *-sequent)
-               os=-ptx
-               ;;
-       *-crds)
-               os=-unos
-               ;;
-       *-ns)
-               os=-genix
-               ;;
-       i370-*)
-               os=-mvs
-               ;;
-       *-next)
-               os=-nextstep3
-               ;;
-       *-gould)
-               os=-sysv
-               ;;
-       *-highlevel)
-               os=-bsd
-               ;;
-       *-encore)
-               os=-bsd
-               ;;
-       *-sgi)
-               os=-irix
-               ;;
-       *-siemens)
-               os=-sysv4
-               ;;
-       *-masscomp)
-               os=-rtu
-               ;;
-       f30[01]-fujitsu | f700-fujitsu)
-               os=-uxpv
-               ;;
-       *-rom68k)
-               os=-coff
-               ;;
-       *-*bug)
-               os=-coff
-               ;;
-       *-apple)
-               os=-macos
-               ;;
-       *-atari*)
-               os=-mint
-               ;;
-       *)
-               os=-none
-               ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-       *-unknown)
-               case $os in
-                       -riscix*)
-                               vendor=acorn
-                               ;;
-                       -sunos*)
-                               vendor=sun
-                               ;;
-                       -cnk*|-aix*)
-                               vendor=ibm
-                               ;;
-                       -beos*)
-                               vendor=be
-                               ;;
-                       -hpux*)
-                               vendor=hp
-                               ;;
-                       -mpeix*)
-                               vendor=hp
-                               ;;
-                       -hiux*)
-                               vendor=hitachi
-                               ;;
-                       -unos*)
-                               vendor=crds
-                               ;;
-                       -dgux*)
-                               vendor=dg
-                               ;;
-                       -luna*)
-                               vendor=omron
-                               ;;
-                       -genix*)
-                               vendor=ns
-                               ;;
-                       -mvs* | -opened*)
-                               vendor=ibm
-                               ;;
-                       -os400*)
-                               vendor=ibm
-                               ;;
-                       -ptx*)
-                               vendor=sequent
-                               ;;
-                       -tpf*)
-                               vendor=ibm
-                               ;;
-                       -vxsim* | -vxworks* | -windiss*)
-                               vendor=wrs
-                               ;;
-                       -aux*)
-                               vendor=apple
-                               ;;
-                       -hms*)
-                               vendor=hitachi
-                               ;;
-                       -mpw* | -macos*)
-                               vendor=apple
-                               ;;
-                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-                               vendor=atari
-                               ;;
-                       -vos*)
-                               vendor=stratus
-                               ;;
-               esac
-               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-               ;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config/depcomp b/config/depcomp
deleted file mode 100755 (executable)
index fc98710..0000000
+++ /dev/null
@@ -1,791 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2013-05-30.07; # UTC
-
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
-    exit 1;
-    ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by 'PROGRAMS ARGS'.
-  object      Object file output by 'PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputting dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-# Get the directory component of the given path, and save it in the
-# global variables '$dir'.  Note that this directory component will
-# be either empty or ending with a '/' character.  This is deliberate.
-set_dir_from ()
-{
-  case $1 in
-    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
-      *) dir=;;
-  esac
-}
-
-# Get the suffix-stripped basename of the given path, and save it the
-# global variable '$base'.
-set_base_from ()
-{
-  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
-}
-
-# If no dependency file was actually created by the compiler invocation,
-# we still have to create a dummy depfile, to avoid errors with the
-# Makefile "include basename.Plo" scheme.
-make_dummy_depfile ()
-{
-  echo "#dummy" > "$depfile"
-}
-
-# Factor out some common post-processing of the generated depfile.
-# Requires the auxiliary global variable '$tmpdepfile' to be set.
-aix_post_process_depfile ()
-{
-  # If the compiler actually managed to produce a dependency file,
-  # post-process it.
-  if test -f "$tmpdepfile"; then
-    # Each line is of the form 'foo.o: dependency.h'.
-    # Do two passes, one to just change these to
-    #   $object: dependency.h
-    # and one to simply output
-    #   dependency.h:
-    # which is needed to avoid the deleted-header problem.
-    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
-      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
-    } > "$depfile"
-    rm -f "$tmpdepfile"
-  else
-    make_dummy_depfile
-  fi
-}
-
-# A tabulation character.
-tab='  '
-# A newline character.
-nl='
-'
-# Character ranges might be problematic outside the C locale.
-# These definitions help.
-upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
-lower=abcdefghijklmnopqrstuvwxyz
-digits=0123456789
-alpha=${upper}${lower}
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Avoid interferences from the environment.
-gccflag= dashmflag=
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-  # This is just like dashmstdout with a different argument.
-  dashmflag=-xM
-  depmode=dashmstdout
-fi
-
-cygpath_u="cygpath -u -f -"
-if test "$depmode" = msvcmsys; then
-  # This is just like msvisualcpp but w/o cygpath translation.
-  # Just convert the backslash-escaped backslashes to single forward
-  # slashes to satisfy depend.m4
-  cygpath_u='sed s,\\\\,/,g'
-  depmode=msvisualcpp
-fi
-
-if test "$depmode" = msvc7msys; then
-  # This is just like msvc7 but w/o cygpath translation.
-  # Just convert the backslash-escaped backslashes to single forward
-  # slashes to satisfy depend.m4
-  cygpath_u='sed s,\\\\,/,g'
-  depmode=msvc7
-fi
-
-if test "$depmode" = xlc; then
-  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
-  gccflag=-qmakedep=gcc,-MF
-  depmode=gcc
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
-## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
-## (see the conditional assignment to $gccflag above).
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).  Also, it might not be
-##   supported by the other compilers which use the 'gcc' depmode.
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  # The second -e expression handles DOS-style file names with drive
-  # letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the "deleted header file" problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-## Some versions of gcc put a space before the ':'.  On the theory
-## that the space means something, we add a space to the output as
-## well.  hp depmode also adds that space, but also prefixes the VPATH
-## to the object.  Take care to not repeat it in the output.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-  tr ' ' "$nl" < "$tmpdepfile" \
-    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like '#:fec' to the end of the
-    # dependency line.
-    tr ' ' "$nl" < "$tmpdepfile" \
-      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
-      | tr "$nl" ' ' >> "$depfile"
-    echo >> "$depfile"
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' "$nl" < "$tmpdepfile" \
-      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-      >> "$depfile"
-  else
-    make_dummy_depfile
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-xlc)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts '$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  set_dir_from "$object"
-  set_base_from "$object"
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$base.u
-    tmpdepfile3=$dir.libs/$base.u
-    "$@" -Wc,-M
-  else
-    tmpdepfile1=$dir$base.u
-    tmpdepfile2=$dir$base.u
-    tmpdepfile3=$dir$base.u
-    "$@" -M
-  fi
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  aix_post_process_depfile
-  ;;
-
-tcc)
-  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
-  # FIXME: That version still under development at the moment of writing.
-  #        Make that this statement remains true also for stable, released
-  #        versions.
-  # It will wrap lines (doesn't matter whether long or short) with a
-  # trailing '\', as in:
-  #
-  #   foo.o : \
-  #    foo.c \
-  #    foo.h \
-  #
-  # It will put a trailing '\' even on the last line, and will use leading
-  # spaces rather than leading tabs (at least since its commit 0394caf7
-  # "Emit spaces for -MD").
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
-  # We have to change lines of the first kind to '$object: \'.
-  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
-  # And for each line of the second kind, we have to emit a 'dep.h:'
-  # dummy dependency, to avoid the deleted-header problem.
-  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-## The order of this option in the case statement is important, since the
-## shell code in configure will try each of these formats in the order
-## listed in this file.  A plain '-MD' option would be understood by many
-## compilers, so we must ensure this comes after the gcc and icc options.
-pgcc)
-  # Portland's C compiler understands '-MD'.
-  # Will always output deps to 'file.d' where file is the root name of the
-  # source file under compilation, even if file resides in a subdirectory.
-  # The object file name does not affect the name of the '.d' file.
-  # pgcc 10.2 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using '\' :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-  set_dir_from "$object"
-  # Use the source, not the object, to determine the base name, since
-  # that's sadly what pgcc will do too.
-  set_base_from "$source"
-  tmpdepfile=$base.d
-
-  # For projects that build the same source file twice into different object
-  # files, the pgcc approach of using the *source* file root name can cause
-  # problems in parallel builds.  Use a locking strategy to avoid stomping on
-  # the same $tmpdepfile.
-  lockdir=$base.d-lock
-  trap "
-    echo '$0: caught signal, cleaning up...' >&2
-    rmdir '$lockdir'
-    exit 1
-  " 1 2 13 15
-  numtries=100
-  i=$numtries
-  while test $i -gt 0; do
-    # mkdir is a portable test-and-set.
-    if mkdir "$lockdir" 2>/dev/null; then
-      # This process acquired the lock.
-      "$@" -MD
-      stat=$?
-      # Release the lock.
-      rmdir "$lockdir"
-      break
-    else
-      # If the lock is being held by a different process, wait
-      # until the winning process is done or we timeout.
-      while test -d "$lockdir" && test $i -gt 0; do
-        sleep 1
-        i=`expr $i - 1`
-      done
-    fi
-    i=`expr $i - 1`
-  done
-  trap - 1 2 13 15
-  if test $i -le 0; then
-    echo "$0: failed to acquire lock after $numtries attempts" >&2
-    echo "$0: check lockdir '$lockdir'" >&2
-    exit 1
-  fi
-
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  set_dir_from  "$object"
-  set_base_from "$object"
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -ne 0; then
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add 'dependent.h:' lines.
-    sed -ne '2,${
-               s/^ *//
-               s/ \\*$//
-               s/$/:/
-               p
-             }' "$tmpdepfile" >> "$depfile"
-  else
-    make_dummy_depfile
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-  # The Tru64 compiler uses -MD to generate dependencies as a side
-  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
-  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-  # dependencies in 'foo.d' instead, so we check for that too.
-  # Subdirectories are respected.
-  set_dir_from  "$object"
-  set_base_from "$object"
-
-  if test "$libtool" = yes; then
-    # Libtool generates 2 separate objects for the 2 libraries.  These
-    # two compilations output dependencies in $dir.libs/$base.o.d and
-    # in $dir$base.o.d.  We have to check for both files, because
-    # one of the two compilations can be disabled.  We should prefer
-    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-    # automatically cleaned when .libs/ is deleted, while ignoring
-    # the former would cause a distcleancheck panic.
-    tmpdepfile1=$dir$base.o.d          # libtool 1.5
-    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
-    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
-    "$@" -Wc,-MD
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    tmpdepfile3=$dir$base.d
-    "$@" -MD
-  fi
-
-  stat=$?
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-    exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  # Same post-processing that is required for AIX mode.
-  aix_post_process_depfile
-  ;;
-
-msvc7)
-  if test "$libtool" = yes; then
-    showIncludes=-Wc,-showIncludes
-  else
-    showIncludes=-showIncludes
-  fi
-  "$@" $showIncludes > "$tmpdepfile"
-  stat=$?
-  grep -v '^Note: including file: ' "$tmpdepfile"
-  if test $stat -ne 0; then
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  # The first sed program below extracts the file names and escapes
-  # backslashes for cygpath.  The second sed program outputs the file
-  # name when reading, but also accumulates all include files in the
-  # hold buffer in order to output them again at the end.  This only
-  # works with sed implementations that can handle large buffers.
-  sed < "$tmpdepfile" -n '
-/^Note: including file:  *\(.*\)/ {
-  s//\1/
-  s/\\/\\\\/g
-  p
-}' | $cygpath_u | sort -u | sed -n '
-s/ /\\ /g
-s/\(.*\)/'"$tab"'\1 \\/p
-s/.\(.*\) \\/\1:/
-H
-$ {
-  s/.*/'"$tab"'/
-  G
-  p
-}' >> "$depfile"
-  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
-  rm -f "$tmpdepfile"
-  ;;
-
-msvc7msys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove '-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for ':'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
-  "$@" $dashmflag |
-    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this sed invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  tr ' ' "$nl" < "$tmpdepfile" \
-    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no eat=no
-  for arg
-  do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    if test $eat = yes; then
-      eat=no
-      continue
-    fi
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -arch)
-      eat=yes ;;
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix=`echo "$object" | sed 's/^.*\././'`
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  # makedepend may prepend the VPATH from the source file name to the object.
-  # No need to regex-escape $object, excess matching of '.' is harmless.
-  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process the last invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed '1,2d' "$tmpdepfile" \
-    | tr ' ' "$nl" \
-    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
-    | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove '-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E \
-    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-    | sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test "X$1" != 'X--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-        set fnord "$@"
-        shift
-        shift
-        ;;
-    *)
-        set fnord "$@" "$arg"
-        shift
-        shift
-        ;;
-    esac
-  done
-  "$@" -E 2>/dev/null |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
-  echo "$tab" >> "$depfile"
-  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvcmsys)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config/dospaths.m4 b/config/dospaths.m4
deleted file mode 100644 (file)
index 9aa9814..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-# Test if the system uses DOS-style pathnames (drive specs and backslashes)
-# By Paul Smith <psmith@gnu.org>.  Based on dos.m4 by Jim Meyering.
-#
-# Copyright (C) 1993-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-AC_DEFUN([pds_AC_DOS_PATHS], [
-  AC_CACHE_CHECK([whether system uses MSDOS-style paths], [ac_cv_dos_paths], [
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __EMX__ && !defined __MSYS__ && !defined __CYGWIN__
-neither MSDOS nor Windows nor OS2
-#endif
-]])],
-        [ac_cv_dos_paths=yes],
-        [ac_cv_dos_paths=no])])
-
-  AS_IF([test x"$ac_cv_dos_paths" = xyes],
-  [ AC_DEFINE_UNQUOTED([HAVE_DOS_PATHS], 1,
-                       [Define if the system uses DOS-style pathnames.])])
-])
diff --git a/config/gettext.m4 b/config/gettext.m4
deleted file mode 100644 (file)
index be247bf..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-# gettext.m4 serial 66 (gettext-0.18.2)
-dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
-
-dnl Macro to add for using GNU gettext.
-
-dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
-dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
-dnl    default (if it is not specified or empty) is 'no-libtool'.
-dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
-dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
-dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
-dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
-dnl    depending on --{enable,disable}-{shared,static} and on the presence of
-dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
-dnl    $(top_builddir)/intl/libintl.a will be created.
-dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
-dnl    implementations (in libc or libintl) without the ngettext() function
-dnl    will be ignored.  If NEEDSYMBOL is specified and is
-dnl    'need-formatstring-macros', then GNU gettext implementations that don't
-dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
-dnl INTLDIR is used to find the intl libraries.  If empty,
-dnl    the value '$(top_builddir)/intl/' is used.
-dnl
-dnl The result of the configuration is one of three cases:
-dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
-dnl    and used.
-dnl    Catalog format: GNU --> install in $(datadir)
-dnl    Catalog extension: .mo after installation, .gmo in source tree
-dnl 2) GNU gettext has been found in the system's C library.
-dnl    Catalog format: GNU --> install in $(datadir)
-dnl    Catalog extension: .mo after installation, .gmo in source tree
-dnl 3) No internationalization, always use English msgid.
-dnl    Catalog format: none
-dnl    Catalog extension: none
-dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
-dnl The use of .gmo is historical (it was needed to avoid overwriting the
-dnl GNU format catalogs when building on a platform with an X/Open gettext),
-dnl but we keep it in order not to force irrelevant filename changes on the
-dnl maintainers.
-dnl
-AC_DEFUN([AM_GNU_GETTEXT],
-[
-  dnl Argument checking.
-  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
-    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
-])])])])])
-  ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
-    [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
-  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
-    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
-])])])])
-  define([gt_included_intl],
-    ifelse([$1], [external],
-      ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
-      [yes]))
-  define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
-  gt_NEEDS_INIT
-  AM_GNU_GETTEXT_NEED([$2])
-
-  AC_REQUIRE([AM_PO_SUBDIRS])dnl
-  ifelse(gt_included_intl, yes, [
-    AC_REQUIRE([AM_INTL_SUBDIR])dnl
-  ])
-
-  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-
-  dnl Sometimes libintl requires libiconv, so first search for libiconv.
-  dnl Ideally we would do this search only after the
-  dnl      if test "$USE_NLS" = "yes"; then
-  dnl        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
-  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
-  dnl the configure script would need to contain the same shell code
-  dnl again, outside any 'if'. There are two solutions:
-  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
-  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
-  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
-  dnl documented, we avoid it.
-  ifelse(gt_included_intl, yes, , [
-    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
-  ])
-
-  dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
-  gt_INTL_MACOSX
-
-  dnl Set USE_NLS.
-  AC_REQUIRE([AM_NLS])
-
-  ifelse(gt_included_intl, yes, [
-    BUILD_INCLUDED_LIBINTL=no
-    USE_INCLUDED_LIBINTL=no
-  ])
-  LIBINTL=
-  LTLIBINTL=
-  POSUB=
-
-  dnl Add a version number to the cache macros.
-  case " $gt_needs " in
-    *" need-formatstring-macros "*) gt_api_version=3 ;;
-    *" need-ngettext "*) gt_api_version=2 ;;
-    *) gt_api_version=1 ;;
-  esac
-  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
-  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
-
-  dnl If we use NLS figure out what method
-  if test "$USE_NLS" = "yes"; then
-    gt_use_preinstalled_gnugettext=no
-    ifelse(gt_included_intl, yes, [
-      AC_MSG_CHECKING([whether included gettext is requested])
-      AC_ARG_WITH([included-gettext],
-        [  --with-included-gettext use the GNU gettext library included here],
-        nls_cv_force_use_gnu_gettext=$withval,
-        nls_cv_force_use_gnu_gettext=no)
-      AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
-
-      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
-      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
-    ])
-        dnl User does not insist on using GNU NLS library.  Figure out what
-        dnl to use.  If GNU gettext is available we use this.  Else we have
-        dnl to fall back to GNU NLS library.
-
-        if test $gt_api_version -ge 3; then
-          gt_revision_test_code='
-#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
-#endif
-changequote(,)dnl
-typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
-changequote([,])dnl
-'
-        else
-          gt_revision_test_code=
-        fi
-        if test $gt_api_version -ge 2; then
-          gt_expression_test_code=' + * ngettext ("", "", 0)'
-        else
-          gt_expression_test_code=
-        fi
-
-        AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
-         [AC_LINK_IFELSE(
-            [AC_LANG_PROGRAM(
-               [[
-#include <libintl.h>
-$gt_revision_test_code
-extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;
-               ]],
-               [[
-bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
-               ]])],
-            [eval "$gt_func_gnugettext_libc=yes"],
-            [eval "$gt_func_gnugettext_libc=no"])])
-
-        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
-          dnl Sometimes libintl requires libiconv, so first search for libiconv.
-          ifelse(gt_included_intl, yes, , [
-            AM_ICONV_LINK
-          ])
-          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
-          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
-          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
-          dnl even if libiconv doesn't exist.
-          AC_LIB_LINKFLAGS_BODY([intl])
-          AC_CACHE_CHECK([for GNU gettext in libintl],
-            [$gt_func_gnugettext_libintl],
-           [gt_save_CPPFLAGS="$CPPFLAGS"
-            CPPFLAGS="$CPPFLAGS $INCINTL"
-            gt_save_LIBS="$LIBS"
-            LIBS="$LIBS $LIBINTL"
-            dnl Now see whether libintl exists and does not depend on libiconv.
-            AC_LINK_IFELSE(
-              [AC_LANG_PROGRAM(
-                 [[
-#include <libintl.h>
-$gt_revision_test_code
-extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);
-                 ]],
-                 [[
-bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
-                 ]])],
-              [eval "$gt_func_gnugettext_libintl=yes"],
-              [eval "$gt_func_gnugettext_libintl=no"])
-            dnl Now see whether libintl exists and depends on libiconv.
-            if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
-              LIBS="$LIBS $LIBICONV"
-              AC_LINK_IFELSE(
-                [AC_LANG_PROGRAM(
-                   [[
-#include <libintl.h>
-$gt_revision_test_code
-extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);
-                   ]],
-                   [[
-bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
-                   ]])],
-                [LIBINTL="$LIBINTL $LIBICONV"
-                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
-                 eval "$gt_func_gnugettext_libintl=yes"
-                ])
-            fi
-            CPPFLAGS="$gt_save_CPPFLAGS"
-            LIBS="$gt_save_LIBS"])
-        fi
-
-        dnl If an already present or preinstalled GNU gettext() is found,
-        dnl use it.  But if this macro is used in GNU gettext, and GNU
-        dnl gettext is already preinstalled in libintl, we update this
-        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
-        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
-           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
-                && test "$PACKAGE" != gettext-runtime \
-                && test "$PACKAGE" != gettext-tools; }; then
-          gt_use_preinstalled_gnugettext=yes
-        else
-          dnl Reset the values set by searching for libintl.
-          LIBINTL=
-          LTLIBINTL=
-          INCINTL=
-        fi
-
-    ifelse(gt_included_intl, yes, [
-        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
-          dnl GNU gettext is not found in the C library.
-          dnl Fall back on included GNU gettext library.
-          nls_cv_use_gnu_gettext=yes
-        fi
-      fi
-
-      if test "$nls_cv_use_gnu_gettext" = "yes"; then
-        dnl Mark actions used to generate GNU NLS library.
-        BUILD_INCLUDED_LIBINTL=yes
-        USE_INCLUDED_LIBINTL=yes
-        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
-        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
-        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
-      fi
-
-      CATOBJEXT=
-      if test "$gt_use_preinstalled_gnugettext" = "yes" \
-         || test "$nls_cv_use_gnu_gettext" = "yes"; then
-        dnl Mark actions to use GNU gettext tools.
-        CATOBJEXT=.gmo
-      fi
-    ])
-
-    if test -n "$INTL_MACOSX_LIBS"; then
-      if test "$gt_use_preinstalled_gnugettext" = "yes" \
-         || test "$nls_cv_use_gnu_gettext" = "yes"; then
-        dnl Some extra flags are needed during linking.
-        LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
-        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
-      fi
-    fi
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes" \
-       || test "$nls_cv_use_gnu_gettext" = "yes"; then
-      AC_DEFINE([ENABLE_NLS], [1],
-        [Define to 1 if translation of program messages to the user's native language
-   is requested.])
-    else
-      USE_NLS=no
-    fi
-  fi
-
-  AC_MSG_CHECKING([whether to use NLS])
-  AC_MSG_RESULT([$USE_NLS])
-  if test "$USE_NLS" = "yes"; then
-    AC_MSG_CHECKING([where the gettext function comes from])
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
-        gt_source="external libintl"
-      else
-        gt_source="libc"
-      fi
-    else
-      gt_source="included intl directory"
-    fi
-    AC_MSG_RESULT([$gt_source])
-  fi
-
-  if test "$USE_NLS" = "yes"; then
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
-        AC_MSG_CHECKING([how to link with libintl])
-        AC_MSG_RESULT([$LIBINTL])
-        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
-      fi
-
-      dnl For backward compatibility. Some packages may be using this.
-      AC_DEFINE([HAVE_GETTEXT], [1],
-       [Define if the GNU gettext() function is already present or preinstalled.])
-      AC_DEFINE([HAVE_DCGETTEXT], [1],
-       [Define if the GNU dcgettext() function is already present or preinstalled.])
-    fi
-
-    dnl We need to process the po/ directory.
-    POSUB=po
-  fi
-
-  ifelse(gt_included_intl, yes, [
-    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
-    dnl to 'yes' because some of the testsuite requires it.
-    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
-      BUILD_INCLUDED_LIBINTL=yes
-    fi
-
-    dnl Make all variables we use known to autoconf.
-    AC_SUBST([BUILD_INCLUDED_LIBINTL])
-    AC_SUBST([USE_INCLUDED_LIBINTL])
-    AC_SUBST([CATOBJEXT])
-
-    dnl For backward compatibility. Some configure.ins may be using this.
-    nls_cv_header_intl=
-    nls_cv_header_libgt=
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    DATADIRNAME=share
-    AC_SUBST([DATADIRNAME])
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    INSTOBJEXT=.mo
-    AC_SUBST([INSTOBJEXT])
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    GENCAT=gencat
-    AC_SUBST([GENCAT])
-
-    dnl For backward compatibility. Some Makefiles may be using this.
-    INTLOBJS=
-    if test "$USE_INCLUDED_LIBINTL" = yes; then
-      INTLOBJS="\$(GETTOBJS)"
-    fi
-    AC_SUBST([INTLOBJS])
-
-    dnl Enable libtool support if the surrounding package wishes it.
-    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
-    AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
-  ])
-
-  dnl For backward compatibility. Some Makefiles may be using this.
-  INTLLIBS="$LIBINTL"
-  AC_SUBST([INTLLIBS])
-
-  dnl Make all documented variables known to autoconf.
-  AC_SUBST([LIBINTL])
-  AC_SUBST([LTLIBINTL])
-  AC_SUBST([POSUB])
-])
-
-
-dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
-m4_define([gt_NEEDS_INIT],
-[
-  m4_divert_text([DEFAULTS], [gt_needs=])
-  m4_define([gt_NEEDS_INIT], [])
-])
-
-
-dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
-AC_DEFUN([AM_GNU_GETTEXT_NEED],
-[
-  m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
-])
-
-
-dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
-AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/config/iconv.m4 b/config/iconv.m4
deleted file mode 100644 (file)
index 4e37363..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-# iconv.m4 serial 19 (gettext-0.18.2)
-dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
-[
-  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-
-  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
-  dnl accordingly.
-  AC_LIB_LINKFLAGS_BODY([iconv])
-])
-
-AC_DEFUN([AM_ICONV_LINK],
-[
-  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
-  dnl those with the standalone portable GNU libiconv installed).
-  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
-
-  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
-  dnl accordingly.
-  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
-
-  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
-  dnl because if the user has installed libiconv and not disabled its use
-  dnl via --without-libiconv-prefix, he wants to use it. The first
-  dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
-  am_save_CPPFLAGS="$CPPFLAGS"
-  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
-
-  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
-    am_cv_func_iconv="no, consider installing GNU libiconv"
-    am_cv_lib_iconv=no
-    AC_LINK_IFELSE(
-      [AC_LANG_PROGRAM(
-         [[
-#include <stdlib.h>
-#include <iconv.h>
-         ]],
-         [[iconv_t cd = iconv_open("","");
-           iconv(cd,NULL,NULL,NULL,NULL);
-           iconv_close(cd);]])],
-      [am_cv_func_iconv=yes])
-    if test "$am_cv_func_iconv" != yes; then
-      am_save_LIBS="$LIBS"
-      LIBS="$LIBS $LIBICONV"
-      AC_LINK_IFELSE(
-        [AC_LANG_PROGRAM(
-           [[
-#include <stdlib.h>
-#include <iconv.h>
-           ]],
-           [[iconv_t cd = iconv_open("","");
-             iconv(cd,NULL,NULL,NULL,NULL);
-             iconv_close(cd);]])],
-        [am_cv_lib_iconv=yes]
-        [am_cv_func_iconv=yes])
-      LIBS="$am_save_LIBS"
-    fi
-  ])
-  if test "$am_cv_func_iconv" = yes; then
-    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
-      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
-      dnl Solaris 10.
-      am_save_LIBS="$LIBS"
-      if test $am_cv_lib_iconv = yes; then
-        LIBS="$LIBS $LIBICONV"
-      fi
-      am_cv_func_iconv_works=no
-      for ac_iconv_const in '' 'const'; do
-        AC_RUN_IFELSE(
-          [AC_LANG_PROGRAM(
-             [[
-#include <iconv.h>
-#include <string.h>
-
-#ifndef ICONV_CONST
-# define ICONV_CONST $ac_iconv_const
-#endif
-             ]],
-             [[int result = 0;
-  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
-     returns.  */
-  {
-    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
-    if (cd_utf8_to_88591 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
-        char buf[10];
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = strlen (input);
-        char *outptr = buf;
-        size_t outbytesleft = sizeof (buf);
-        size_t res = iconv (cd_utf8_to_88591,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if (res == 0)
-          result |= 1;
-        iconv_close (cd_utf8_to_88591);
-      }
-  }
-  /* Test against Solaris 10 bug: Failures are not distinguishable from
-     successful returns.  */
-  {
-    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
-    if (cd_ascii_to_88591 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\263";
-        char buf[10];
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = strlen (input);
-        char *outptr = buf;
-        size_t outbytesleft = sizeof (buf);
-        size_t res = iconv (cd_ascii_to_88591,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if (res == 0)
-          result |= 2;
-        iconv_close (cd_ascii_to_88591);
-      }
-  }
-  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
-  {
-    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
-    if (cd_88591_to_utf8 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\304";
-        static char buf[2] = { (char)0xDE, (char)0xAD };
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = 1;
-        char *outptr = buf;
-        size_t outbytesleft = 1;
-        size_t res = iconv (cd_88591_to_utf8,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
-          result |= 4;
-        iconv_close (cd_88591_to_utf8);
-      }
-  }
-#if 0 /* This bug could be worked around by the caller.  */
-  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
-  {
-    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
-    if (cd_88591_to_utf8 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
-        char buf[50];
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = strlen (input);
-        char *outptr = buf;
-        size_t outbytesleft = sizeof (buf);
-        size_t res = iconv (cd_88591_to_utf8,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if ((int)res > 0)
-          result |= 8;
-        iconv_close (cd_88591_to_utf8);
-      }
-  }
-#endif
-  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
-     provided.  */
-  if (/* Try standardized names.  */
-      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
-      /* Try IRIX, OSF/1 names.  */
-      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
-      /* Try AIX names.  */
-      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
-      /* Try HP-UX names.  */
-      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
-    result |= 16;
-  return result;
-]])],
-          [am_cv_func_iconv_works=yes], ,
-          [case "$host_os" in
-             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-             *)            am_cv_func_iconv_works="guessing yes" ;;
-           esac])
-        test "$am_cv_func_iconv_works" = no || break
-      done
-      LIBS="$am_save_LIBS"
-    ])
-    case "$am_cv_func_iconv_works" in
-      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
-      *)   am_func_iconv=yes ;;
-    esac
-  else
-    am_func_iconv=no am_cv_lib_iconv=no
-  fi
-  if test "$am_func_iconv" = yes; then
-    AC_DEFINE([HAVE_ICONV], [1],
-      [Define if you have the iconv() function and it works.])
-  fi
-  if test "$am_cv_lib_iconv" = yes; then
-    AC_MSG_CHECKING([how to link with libiconv])
-    AC_MSG_RESULT([$LIBICONV])
-  else
-    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
-    dnl either.
-    CPPFLAGS="$am_save_CPPFLAGS"
-    LIBICONV=
-    LTLIBICONV=
-  fi
-  AC_SUBST([LIBICONV])
-  AC_SUBST([LTLIBICONV])
-])
-
-dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
-dnl avoid warnings like
-dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
-dnl This is tricky because of the way 'aclocal' is implemented:
-dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
-dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
-dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
-dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
-dnl   warnings.
-m4_define([gl_iconv_AC_DEFUN],
-  m4_version_prereq([2.64],
-    [[AC_DEFUN_ONCE(
-        [$1], [$2])]],
-    [m4_ifdef([gl_00GNULIB],
-       [[AC_DEFUN_ONCE(
-           [$1], [$2])]],
-       [[AC_DEFUN(
-           [$1], [$2])]])]))
-gl_iconv_AC_DEFUN([AM_ICONV],
-[
-  AM_ICONV_LINK
-  if test "$am_cv_func_iconv" = yes; then
-    AC_MSG_CHECKING([for iconv declaration])
-    AC_CACHE_VAL([am_cv_proto_iconv], [
-      AC_COMPILE_IFELSE(
-        [AC_LANG_PROGRAM(
-           [[
-#include <stdlib.h>
-#include <iconv.h>
-extern
-#ifdef __cplusplus
-"C"
-#endif
-#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
-size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
-#else
-size_t iconv();
-#endif
-           ]],
-           [[]])],
-        [am_cv_proto_iconv_arg1=""],
-        [am_cv_proto_iconv_arg1="const"])
-      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
-    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
-    AC_MSG_RESULT([
-         $am_cv_proto_iconv])
-    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
-      [Define as const if the declaration of iconv() needs const.])
-    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
-    m4_ifdef([gl_ICONV_H_DEFAULTS],
-      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
-       if test -n "$am_cv_proto_iconv_arg1"; then
-         ICONV_CONST="const"
-       fi
-      ])
-  fi
-])
diff --git a/config/install-sh b/config/install-sh
deleted file mode 100755 (executable)
index 59990a1..0000000
+++ /dev/null
@@ -1,508 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2014-09-12.12; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-tab='  '
-nl='
-'
-IFS=" $tab$nl"
-
-# Set DOITPROG to "echo" to test this script.
-
-doit=${DOITPROG-}
-doit_exec=${doit:-exec}
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-is_target_a_directory=possibly
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-        shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-        case $mode in
-          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
-            echo "$0: invalid mode: $mode" >&2
-            exit 1;;
-        esac
-        shift;;
-
-    -o) chowncmd="$chownprog $2"
-        shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t)
-        is_target_a_directory=always
-        dst_arg=$2
-        # Protect names problematic for 'test' and other utilities.
-        case $dst_arg in
-          -* | [=\(\)!]) dst_arg=./$dst_arg;;
-        esac
-        shift;;
-
-    -T) is_target_a_directory=never;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --) shift
-        break;;
-
-    -*) echo "$0: invalid option: $1" >&2
-        exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
-  if test -n "$dst_arg"; then
-    echo "$0: target directory not allowed when installing a directory." >&2
-    exit 1
-  fi
-fi
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-    # Protect names problematic for 'test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call 'install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  if test $# -gt 1 || test "$is_target_a_directory" = always; then
-    if test ! -d "$dst_arg"; then
-      echo "$0: $dst_arg: Is not a directory." >&2
-      exit 1
-    fi
-  fi
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-        u_plus_rw=
-      else
-        u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-        u_plus_rw=
-      else
-        u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names problematic for 'test' and other utilities.
-  case $src in
-    -* | [=\(\)!]) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-    dst=$dst_arg
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test "$is_target_a_directory" = never; then
-        echo "$0: $dst_arg: Is a directory" >&2
-        exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      dstdir=`dirname "$dst"`
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-        # Create intermediate dirs using mode 755 as modified by the umask.
-        # This is like FreeBSD 'install' as of 1997-10-28.
-        umask=`umask`
-        case $stripcmd.$umask in
-          # Optimize common cases.
-          *[2367][2367]) mkdir_umask=$umask;;
-          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-          *[0-7])
-            mkdir_umask=`expr $umask + 22 \
-              - $umask % 100 % 40 + $umask % 20 \
-              - $umask % 10 % 4 + $umask % 2
-            `;;
-          *) mkdir_umask=$umask,go-w;;
-        esac
-
-        # With -d, create the new directory with the user-specified mode.
-        # Otherwise, rely on $mkdir_umask.
-        if test -n "$dir_arg"; then
-          mkdir_mode=-m$mode
-        else
-          mkdir_mode=
-        fi
-
-        posix_mkdir=false
-        case $umask in
-          *[123567][0-7][0-7])
-            # POSIX mkdir -p sets u+wx bits regardless of umask, which
-            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-            ;;
-          *)
-            # $RANDOM is not portable (e.g. dash);  use it when possible to
-            # lower collision chance
-            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
-            # create the $tmpdir first (and fail if unsuccessful) to make sure
-            # that nobody tries to guess the $tmpdir name.
-            if (umask $mkdir_umask &&
-                $mkdirprog $mkdir_mode "$tmpdir" &&
-                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
-            then
-              if test -z "$dir_arg" || {
-                   # Check for POSIX incompatibilities with -m.
-                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                   # other-writable bit of parent directory when it shouldn't.
-                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                   test_tmpdir="$tmpdir/a"
-                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
-                   case $ls_ld_tmpdir in
-                     d????-?r-*) different_mode=700;;
-                     d????-?--*) different_mode=755;;
-                     *) false;;
-                   esac &&
-                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
-                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
-                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                   }
-                 }
-              then posix_mkdir=:
-              fi
-              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
-            else
-              # Remove any dirs left behind by ancient mkdir implementations.
-              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
-            fi
-            trap '' 0;;
-        esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-        umask $mkdir_umask &&
-        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-        /*) prefix='/';;
-        [-=\(\)!]*) prefix='./';;
-        *)  prefix='';;
-      esac
-
-      oIFS=$IFS
-      IFS=/
-      set -f
-      set fnord $dstdir
-      shift
-      set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-        test X"$d" = X && continue
-
-        prefix=$prefix$d
-        if test -d "$prefix"; then
-          prefixes=
-        else
-          if $posix_mkdir; then
-            (umask=$mkdir_umask &&
-             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-            # Don't fail if two instances are running concurrently.
-            test -d "$prefix" || exit 1
-          else
-            case $prefix in
-              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-              *) qprefix=$prefix;;
-            esac
-            prefixes="$prefixes '$qprefix'"
-          fi
-        fi
-        prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-        # Don't fail if two instances are running concurrently.
-        (umask $mkdir_umask &&
-         eval "\$doit_exec \$mkdirprog $prefixes") ||
-          test -d "$dstdir" || exit 1
-        obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
-       set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       set +f &&
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-        # Now remove or move aside any old file at destination location.
-        # We try this two ways since rm can't unlink itself on some
-        # systems and the destination file might be busy for other
-        # reasons.  In this case, the final cleanup might fail but the new
-        # file should still install successfully.
-        {
-          test ! -f "$dst" ||
-          $doit $rmcmd -f "$dst" 2>/dev/null ||
-          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-          } ||
-          { echo "$0: cannot unlink or rename $dst" >&2
-            (exit 1); exit 1
-          }
-        } &&
-
-        # Now rename the file to the real destination.
-        $doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config/intlmacosx.m4 b/config/intlmacosx.m4
deleted file mode 100644 (file)
index 8a045f6..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-# intlmacosx.m4 serial 5 (gettext-0.18.2)
-dnl Copyright (C) 2004-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Checks for special options needed on Mac OS X.
-dnl Defines INTL_MACOSX_LIBS.
-AC_DEFUN([gt_INTL_MACOSX],
-[
-  dnl Check for API introduced in Mac OS X 10.2.
-  AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
-    [gt_cv_func_CFPreferencesCopyAppValue],
-    [gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
-     AC_LINK_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[#include <CoreFoundation/CFPreferences.h>]],
-          [[CFPreferencesCopyAppValue(NULL, NULL)]])],
-       [gt_cv_func_CFPreferencesCopyAppValue=yes],
-       [gt_cv_func_CFPreferencesCopyAppValue=no])
-     LIBS="$gt_save_LIBS"])
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
-    AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
-      [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
-  fi
-  dnl Check for API introduced in Mac OS X 10.3.
-  AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
-    [gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
-     AC_LINK_IFELSE(
-       [AC_LANG_PROGRAM(
-          [[#include <CoreFoundation/CFLocale.h>]],
-          [[CFLocaleCopyCurrent();]])],
-       [gt_cv_func_CFLocaleCopyCurrent=yes],
-       [gt_cv_func_CFLocaleCopyCurrent=no])
-     LIBS="$gt_save_LIBS"])
-  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-    AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
-      [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
-  fi
-  INTL_MACOSX_LIBS=
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
-  fi
-  AC_SUBST([INTL_MACOSX_LIBS])
-])
diff --git a/config/lib-ld.m4 b/config/lib-ld.m4
deleted file mode 100644 (file)
index ddc569f..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-# lib-ld.m4 serial 6
-dnl Copyright (C) 1996-2003, 2009-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl Subroutines of libtool.m4,
-dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
-dnl collision with libtool.m4.
-
-dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
-AC_DEFUN([AC_LIB_PROG_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  acl_cv_prog_gnu_ld=yes
-  ;;
-*)
-  acl_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$acl_cv_prog_gnu_ld
-])
-
-dnl From libtool-2.4. Sets the variable LD.
-AC_DEFUN([AC_LIB_PROG_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-        [assume the C compiler uses GNU ld [default=no]])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
-fi
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
-      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
-        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL([acl_cv_path_LD],
-[if test -z "$LD"; then
-  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$acl_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      acl_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-        test "$with_gnu_ld" != no && break
-        ;;
-      *)
-        test "$with_gnu_ld" != yes && break
-        ;;
-      esac
-    fi
-  done
-  IFS="$acl_save_ifs"
-else
-  acl_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$acl_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT([$LD])
-else
-  AC_MSG_RESULT([no])
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_LIB_PROG_LD_GNU
-])
diff --git a/config/lib-link.m4 b/config/lib-link.m4
deleted file mode 100644 (file)
index 3522d99..0000000
+++ /dev/null
@@ -1,777 +0,0 @@
-# lib-link.m4 serial 26 (gettext-0.18.2)
-dnl Copyright (C) 2001-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-AC_PREREQ([2.54])
-
-dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
-dnl the libraries corresponding to explicit and implicit dependencies.
-dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
-dnl augments the CPPFLAGS variable.
-dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
-dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
-AC_DEFUN([AC_LIB_LINKFLAGS],
-[
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-  pushdef([Name],[m4_translit([$1],[./+-], [____])])
-  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
-                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
-  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
-    AC_LIB_LINKFLAGS_BODY([$1], [$2])
-    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
-    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
-    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
-    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
-  ])
-  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
-  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
-  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
-  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
-  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
-  AC_SUBST([LIB]NAME)
-  AC_SUBST([LTLIB]NAME)
-  AC_SUBST([LIB]NAME[_PREFIX])
-  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
-  dnl results of this search when this library appears as a dependency.
-  HAVE_LIB[]NAME=yes
-  popdef([NAME])
-  popdef([Name])
-])
-
-dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
-dnl searches for libname and the libraries corresponding to explicit and
-dnl implicit dependencies, together with the specified include files and
-dnl the ability to compile and link the specified testcode. The missing-message
-dnl defaults to 'no' and may contain additional hints for the user.
-dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
-dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
-dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
-dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
-dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
-dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
-AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
-[
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  AC_REQUIRE([AC_LIB_RPATH])
-  pushdef([Name],[m4_translit([$1],[./+-], [____])])
-  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
-                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
-
-  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
-  dnl accordingly.
-  AC_LIB_LINKFLAGS_BODY([$1], [$2])
-
-  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
-  dnl because if the user has installed lib[]Name and not disabled its use
-  dnl via --without-lib[]Name-prefix, he wants to use it.
-  ac_save_CPPFLAGS="$CPPFLAGS"
-  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
-
-  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
-    ac_save_LIBS="$LIBS"
-    dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
-    dnl because these -l options might require -L options that are present in
-    dnl LIBS. -l options benefit only from the -L options listed before it.
-    dnl Otherwise, add it to the front of LIBS, because it may be a static
-    dnl library that depends on another static library that is present in LIBS.
-    dnl Static libraries benefit only from the static libraries listed after
-    dnl it.
-    case " $LIB[]NAME" in
-      *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
-      *)       LIBS="$LIB[]NAME $LIBS" ;;
-    esac
-    AC_LINK_IFELSE(
-      [AC_LANG_PROGRAM([[$3]], [[$4]])],
-      [ac_cv_lib[]Name=yes],
-      [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
-    LIBS="$ac_save_LIBS"
-  ])
-  if test "$ac_cv_lib[]Name" = yes; then
-    HAVE_LIB[]NAME=yes
-    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
-    AC_MSG_CHECKING([how to link with lib[]$1])
-    AC_MSG_RESULT([$LIB[]NAME])
-  else
-    HAVE_LIB[]NAME=no
-    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
-    dnl $INC[]NAME either.
-    CPPFLAGS="$ac_save_CPPFLAGS"
-    LIB[]NAME=
-    LTLIB[]NAME=
-    LIB[]NAME[]_PREFIX=
-  fi
-  AC_SUBST([HAVE_LIB]NAME)
-  AC_SUBST([LIB]NAME)
-  AC_SUBST([LTLIB]NAME)
-  AC_SUBST([LIB]NAME[_PREFIX])
-  popdef([NAME])
-  popdef([Name])
-])
-
-dnl Determine the platform dependent parameters needed to use rpath:
-dnl   acl_libext,
-dnl   acl_shlibext,
-dnl   acl_libname_spec,
-dnl   acl_library_names_spec,
-dnl   acl_hardcode_libdir_flag_spec,
-dnl   acl_hardcode_libdir_separator,
-dnl   acl_hardcode_direct,
-dnl   acl_hardcode_minus_L.
-AC_DEFUN([AC_LIB_RPATH],
-[
-  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
-  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
-  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
-  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
-  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
-  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
-  AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
-    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
-    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
-    . ./conftest.sh
-    rm -f ./conftest.sh
-    acl_cv_rpath=done
-  ])
-  wl="$acl_cv_wl"
-  acl_libext="$acl_cv_libext"
-  acl_shlibext="$acl_cv_shlibext"
-  acl_libname_spec="$acl_cv_libname_spec"
-  acl_library_names_spec="$acl_cv_library_names_spec"
-  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
-  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
-  acl_hardcode_direct="$acl_cv_hardcode_direct"
-  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
-  dnl Determine whether the user wants rpath handling at all.
-  AC_ARG_ENABLE([rpath],
-    [  --disable-rpath         do not hardcode runtime library paths],
-    :, enable_rpath=yes)
-])
-
-dnl AC_LIB_FROMPACKAGE(name, package)
-dnl declares that libname comes from the given package. The configure file
-dnl will then not have a --with-libname-prefix option but a
-dnl --with-package-prefix option. Several libraries can come from the same
-dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
-dnl macro call that searches for libname.
-AC_DEFUN([AC_LIB_FROMPACKAGE],
-[
-  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
-                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
-  define([acl_frompackage_]NAME, [$2])
-  popdef([NAME])
-  pushdef([PACK],[$2])
-  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
-                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
-  define([acl_libsinpackage_]PACKUP,
-    m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
-  popdef([PACKUP])
-  popdef([PACK])
-])
-
-dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
-dnl the libraries corresponding to explicit and implicit dependencies.
-dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
-dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
-dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
-AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
-[
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
-  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
-                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
-  pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
-  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
-                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
-  pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
-  dnl Autoconf >= 2.61 supports dots in --with options.
-  pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
-  dnl By default, look in $includedir and $libdir.
-  use_additional=yes
-  AC_LIB_WITH_FINAL_PREFIX([
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
-  ])
-  AC_ARG_WITH(P_A_C_K[-prefix],
-[[  --with-]]P_A_C_K[[-prefix[=DIR]  search for ]PACKLIBS[ in DIR/include and DIR/lib
-  --without-]]P_A_C_K[[-prefix     don't search for ]PACKLIBS[ in includedir and libdir]],
-[
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
-        AC_LIB_WITH_FINAL_PREFIX([
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
-        ])
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-        if test "$acl_libdirstem2" != "$acl_libdirstem" \
-           && ! test -d "$withval/$acl_libdirstem"; then
-          additional_libdir="$withval/$acl_libdirstem2"
-        fi
-      fi
-    fi
-])
-  dnl Search the library and its dependencies in $additional_libdir and
-  dnl $LDFLAGS. Using breadth-first-seach.
-  LIB[]NAME=
-  LTLIB[]NAME=
-  INC[]NAME=
-  LIB[]NAME[]_PREFIX=
-  dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
-  dnl computed. So it has to be reset here.
-  HAVE_LIB[]NAME=
-  rpathdirs=
-  ltrpathdirs=
-  names_already_handled=
-  names_next_round='$1 $2'
-  while test -n "$names_next_round"; do
-    names_this_round="$names_next_round"
-    names_next_round=
-    for name in $names_this_round; do
-      already_handled=
-      for n in $names_already_handled; do
-        if test "$n" = "$name"; then
-          already_handled=yes
-          break
-        fi
-      done
-      if test -z "$already_handled"; then
-        names_already_handled="$names_already_handled $name"
-        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
-        dnl or AC_LIB_HAVE_LINKFLAGS call.
-        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
-        eval value=\"\$HAVE_LIB$uppername\"
-        if test -n "$value"; then
-          if test "$value" = yes; then
-            eval value=\"\$LIB$uppername\"
-            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
-            eval value=\"\$LTLIB$uppername\"
-            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
-          else
-            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
-            dnl that this library doesn't exist. So just drop it.
-            :
-          fi
-        else
-          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
-          dnl and the already constructed $LIBNAME/$LTLIBNAME.
-          found_dir=
-          found_la=
-          found_so=
-          found_a=
-          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
-          if test -n "$acl_shlibext"; then
-            shrext=".$acl_shlibext"             # typically: shrext=.so
-          else
-            shrext=
-          fi
-          if test $use_additional = yes; then
-            dir="$additional_libdir"
-            dnl The same code as in the loop below:
-            dnl First look for a shared library.
-            if test -n "$acl_shlibext"; then
-              if test -f "$dir/$libname$shrext"; then
-                found_dir="$dir"
-                found_so="$dir/$libname$shrext"
-              else
-                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
-                  ver=`(cd "$dir" && \
-                        for f in "$libname$shrext".*; do echo "$f"; done \
-                        | sed -e "s,^$libname$shrext\\\\.,," \
-                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
-                        | sed 1q ) 2>/dev/null`
-                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
-                    found_dir="$dir"
-                    found_so="$dir/$libname$shrext.$ver"
-                  fi
-                else
-                  eval library_names=\"$acl_library_names_spec\"
-                  for f in $library_names; do
-                    if test -f "$dir/$f"; then
-                      found_dir="$dir"
-                      found_so="$dir/$f"
-                      break
-                    fi
-                  done
-                fi
-              fi
-            fi
-            dnl Then look for a static library.
-            if test "X$found_dir" = "X"; then
-              if test -f "$dir/$libname.$acl_libext"; then
-                found_dir="$dir"
-                found_a="$dir/$libname.$acl_libext"
-              fi
-            fi
-            if test "X$found_dir" != "X"; then
-              if test -f "$dir/$libname.la"; then
-                found_la="$dir/$libname.la"
-              fi
-            fi
-          fi
-          if test "X$found_dir" = "X"; then
-            for x in $LDFLAGS $LTLIB[]NAME; do
-              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-              case "$x" in
-                -L*)
-                  dir=`echo "X$x" | sed -e 's/^X-L//'`
-                  dnl First look for a shared library.
-                  if test -n "$acl_shlibext"; then
-                    if test -f "$dir/$libname$shrext"; then
-                      found_dir="$dir"
-                      found_so="$dir/$libname$shrext"
-                    else
-                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
-                        ver=`(cd "$dir" && \
-                              for f in "$libname$shrext".*; do echo "$f"; done \
-                              | sed -e "s,^$libname$shrext\\\\.,," \
-                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
-                              | sed 1q ) 2>/dev/null`
-                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
-                          found_dir="$dir"
-                          found_so="$dir/$libname$shrext.$ver"
-                        fi
-                      else
-                        eval library_names=\"$acl_library_names_spec\"
-                        for f in $library_names; do
-                          if test -f "$dir/$f"; then
-                            found_dir="$dir"
-                            found_so="$dir/$f"
-                            break
-                          fi
-                        done
-                      fi
-                    fi
-                  fi
-                  dnl Then look for a static library.
-                  if test "X$found_dir" = "X"; then
-                    if test -f "$dir/$libname.$acl_libext"; then
-                      found_dir="$dir"
-                      found_a="$dir/$libname.$acl_libext"
-                    fi
-                  fi
-                  if test "X$found_dir" != "X"; then
-                    if test -f "$dir/$libname.la"; then
-                      found_la="$dir/$libname.la"
-                    fi
-                  fi
-                  ;;
-              esac
-              if test "X$found_dir" != "X"; then
-                break
-              fi
-            done
-          fi
-          if test "X$found_dir" != "X"; then
-            dnl Found the library.
-            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
-            if test "X$found_so" != "X"; then
-              dnl Linking with a shared library. We attempt to hardcode its
-              dnl directory into the executable's runpath, unless it's the
-              dnl standard /usr/lib.
-              if test "$enable_rpath" = no \
-                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
-                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
-                dnl No hardcoding is needed.
-                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-              else
-                dnl Use an explicit option to hardcode DIR into the resulting
-                dnl binary.
-                dnl Potentially add DIR to ltrpathdirs.
-                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
-                haveit=
-                for x in $ltrpathdirs; do
-                  if test "X$x" = "X$found_dir"; then
-                    haveit=yes
-                    break
-                  fi
-                done
-                if test -z "$haveit"; then
-                  ltrpathdirs="$ltrpathdirs $found_dir"
-                fi
-                dnl The hardcoding into $LIBNAME is system dependent.
-                if test "$acl_hardcode_direct" = yes; then
-                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
-                  dnl resulting binary.
-                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-                else
-                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
-                    dnl Use an explicit option to hardcode DIR into the resulting
-                    dnl binary.
-                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-                    dnl Potentially add DIR to rpathdirs.
-                    dnl The rpathdirs will be appended to $LIBNAME at the end.
-                    haveit=
-                    for x in $rpathdirs; do
-                      if test "X$x" = "X$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      rpathdirs="$rpathdirs $found_dir"
-                    fi
-                  else
-                    dnl Rely on "-L$found_dir".
-                    dnl But don't add it if it's already contained in the LDFLAGS
-                    dnl or the already constructed $LIBNAME
-                    haveit=
-                    for x in $LDFLAGS $LIB[]NAME; do
-                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                      if test "X$x" = "X-L$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
-                    fi
-                    if test "$acl_hardcode_minus_L" != no; then
-                      dnl FIXME: Not sure whether we should use
-                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
-                      dnl here.
-                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
-                    else
-                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
-                      dnl here, because this doesn't fit in flags passed to the
-                      dnl compiler. So give up. No hardcoding. This affects only
-                      dnl very old systems.
-                      dnl FIXME: Not sure whether we should use
-                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
-                      dnl here.
-                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
-                    fi
-                  fi
-                fi
-              fi
-            else
-              if test "X$found_a" != "X"; then
-                dnl Linking with a static library.
-                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
-              else
-                dnl We shouldn't come here, but anyway it's good to have a
-                dnl fallback.
-                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
-              fi
-            fi
-            dnl Assume the include files are nearby.
-            additional_includedir=
-            case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
-                if test "$name" = '$1'; then
-                  LIB[]NAME[]_PREFIX="$basedir"
-                fi
-                additional_includedir="$basedir/include"
-                ;;
-              */$acl_libdirstem2 | */$acl_libdirstem2/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
-                if test "$name" = '$1'; then
-                  LIB[]NAME[]_PREFIX="$basedir"
-                fi
-                additional_includedir="$basedir/include"
-                ;;
-            esac
-            if test "X$additional_includedir" != "X"; then
-              dnl Potentially add $additional_includedir to $INCNAME.
-              dnl But don't add it
-              dnl   1. if it's the standard /usr/include,
-              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
-              dnl   3. if it's already present in $CPPFLAGS or the already
-              dnl      constructed $INCNAME,
-              dnl   4. if it doesn't exist as a directory.
-              if test "X$additional_includedir" != "X/usr/include"; then
-                haveit=
-                if test "X$additional_includedir" = "X/usr/local/include"; then
-                  if test -n "$GCC"; then
-                    case $host_os in
-                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                    esac
-                  fi
-                fi
-                if test -z "$haveit"; then
-                  for x in $CPPFLAGS $INC[]NAME; do
-                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                    if test "X$x" = "X-I$additional_includedir"; then
-                      haveit=yes
-                      break
-                    fi
-                  done
-                  if test -z "$haveit"; then
-                    if test -d "$additional_includedir"; then
-                      dnl Really add $additional_includedir to $INCNAME.
-                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
-                    fi
-                  fi
-                fi
-              fi
-            fi
-            dnl Look for dependencies.
-            if test -n "$found_la"; then
-              dnl Read the .la file. It defines the variables
-              dnl dlname, library_names, old_library, dependency_libs, current,
-              dnl age, revision, installed, dlopen, dlpreopen, libdir.
-              save_libdir="$libdir"
-              case "$found_la" in
-                */* | *\\*) . "$found_la" ;;
-                *) . "./$found_la" ;;
-              esac
-              libdir="$save_libdir"
-              dnl We use only dependency_libs.
-              for dep in $dependency_libs; do
-                case "$dep" in
-                  -L*)
-                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
-                    dnl But don't add it
-                    dnl   1. if it's the standard /usr/lib,
-                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
-                    dnl   3. if it's already present in $LDFLAGS or the already
-                    dnl      constructed $LIBNAME,
-                    dnl   4. if it doesn't exist as a directory.
-                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
-                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
-                      haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
-                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
-                        if test -n "$GCC"; then
-                          case $host_os in
-                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                          esac
-                        fi
-                      fi
-                      if test -z "$haveit"; then
-                        haveit=
-                        for x in $LDFLAGS $LIB[]NAME; do
-                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                            dnl Really add $additional_libdir to $LIBNAME.
-                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
-                          fi
-                        fi
-                        haveit=
-                        for x in $LDFLAGS $LTLIB[]NAME; do
-                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                            dnl Really add $additional_libdir to $LTLIBNAME.
-                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
-                          fi
-                        fi
-                      fi
-                    fi
-                    ;;
-                  -R*)
-                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
-                    if test "$enable_rpath" != no; then
-                      dnl Potentially add DIR to rpathdirs.
-                      dnl The rpathdirs will be appended to $LIBNAME at the end.
-                      haveit=
-                      for x in $rpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        rpathdirs="$rpathdirs $dir"
-                      fi
-                      dnl Potentially add DIR to ltrpathdirs.
-                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
-                      haveit=
-                      for x in $ltrpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        ltrpathdirs="$ltrpathdirs $dir"
-                      fi
-                    fi
-                    ;;
-                  -l*)
-                    dnl Handle this in the next round.
-                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
-                    ;;
-                  *.la)
-                    dnl Handle this in the next round. Throw away the .la's
-                    dnl directory; it is already contained in a preceding -L
-                    dnl option.
-                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
-                    ;;
-                  *)
-                    dnl Most likely an immediate library name.
-                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
-                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
-                    ;;
-                esac
-              done
-            fi
-          else
-            dnl Didn't find the library; assume it is in the system directories
-            dnl known to the linker and runtime loader. (All the system
-            dnl directories known to the linker should also be known to the
-            dnl runtime loader, otherwise the system is severely misconfigured.)
-            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
-            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
-          fi
-        fi
-      fi
-    done
-  done
-  if test "X$rpathdirs" != "X"; then
-    if test -n "$acl_hardcode_libdir_separator"; then
-      dnl Weird platform: only the last -rpath option counts, the user must
-      dnl pass all path elements in one option. We can arrange that for a
-      dnl single library, but not when more than one $LIBNAMEs are used.
-      alldirs=
-      for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
-      done
-      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
-      acl_save_libdir="$libdir"
-      libdir="$alldirs"
-      eval flag=\"$acl_hardcode_libdir_flag_spec\"
-      libdir="$acl_save_libdir"
-      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
-    else
-      dnl The -rpath options are cumulative.
-      for found_dir in $rpathdirs; do
-        acl_save_libdir="$libdir"
-        libdir="$found_dir"
-        eval flag=\"$acl_hardcode_libdir_flag_spec\"
-        libdir="$acl_save_libdir"
-        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
-      done
-    fi
-  fi
-  if test "X$ltrpathdirs" != "X"; then
-    dnl When using libtool, the option that works for both libraries and
-    dnl executables is -R. The -R options are cumulative.
-    for found_dir in $ltrpathdirs; do
-      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
-    done
-  fi
-  popdef([P_A_C_K])
-  popdef([PACKLIBS])
-  popdef([PACKUP])
-  popdef([PACK])
-  popdef([NAME])
-])
-
-dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
-dnl unless already present in VAR.
-dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
-dnl contains two or three consecutive elements that belong together.
-AC_DEFUN([AC_LIB_APPENDTOVAR],
-[
-  for element in [$2]; do
-    haveit=
-    for x in $[$1]; do
-      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-      if test "X$x" = "X$element"; then
-        haveit=yes
-        break
-      fi
-    done
-    if test -z "$haveit"; then
-      [$1]="${[$1]}${[$1]:+ }$element"
-    fi
-  done
-])
-
-dnl For those cases where a variable contains several -L and -l options
-dnl referring to unknown libraries and directories, this macro determines the
-dnl necessary additional linker options for the runtime path.
-dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
-dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
-dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
-dnl otherwise linking without libtool is assumed.
-AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
-[
-  AC_REQUIRE([AC_LIB_RPATH])
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
-  $1=
-  if test "$enable_rpath" != no; then
-    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
-      dnl Use an explicit option to hardcode directories into the resulting
-      dnl binary.
-      rpathdirs=
-      next=
-      for opt in $2; do
-        if test -n "$next"; then
-          dir="$next"
-          dnl No need to hardcode the standard /usr/lib.
-          if test "X$dir" != "X/usr/$acl_libdirstem" \
-             && test "X$dir" != "X/usr/$acl_libdirstem2"; then
-            rpathdirs="$rpathdirs $dir"
-          fi
-          next=
-        else
-          case $opt in
-            -L) next=yes ;;
-            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
-                 dnl No need to hardcode the standard /usr/lib.
-                 if test "X$dir" != "X/usr/$acl_libdirstem" \
-                    && test "X$dir" != "X/usr/$acl_libdirstem2"; then
-                   rpathdirs="$rpathdirs $dir"
-                 fi
-                 next= ;;
-            *) next= ;;
-          esac
-        fi
-      done
-      if test "X$rpathdirs" != "X"; then
-        if test -n ""$3""; then
-          dnl libtool is used for linking. Use -R options.
-          for dir in $rpathdirs; do
-            $1="${$1}${$1:+ }-R$dir"
-          done
-        else
-          dnl The linker is used for linking directly.
-          if test -n "$acl_hardcode_libdir_separator"; then
-            dnl Weird platform: only the last -rpath option counts, the user
-            dnl must pass all path elements in one option.
-            alldirs=
-            for dir in $rpathdirs; do
-              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
-            done
-            acl_save_libdir="$libdir"
-            libdir="$alldirs"
-            eval flag=\"$acl_hardcode_libdir_flag_spec\"
-            libdir="$acl_save_libdir"
-            $1="$flag"
-          else
-            dnl The -rpath options are cumulative.
-            for dir in $rpathdirs; do
-              acl_save_libdir="$libdir"
-              libdir="$dir"
-              eval flag=\"$acl_hardcode_libdir_flag_spec\"
-              libdir="$acl_save_libdir"
-              $1="${$1}${$1:+ }$flag"
-            done
-          fi
-        fi
-      fi
-    fi
-  fi
-  AC_SUBST([$1])
-])
diff --git a/config/lib-prefix.m4 b/config/lib-prefix.m4
deleted file mode 100644 (file)
index 31f49e4..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-# lib-prefix.m4 serial 7 (gettext-0.18)
-dnl Copyright (C) 2001-2005, 2008-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Bruno Haible.
-
-dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
-dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
-dnl require excessive bracketing.
-ifdef([AC_HELP_STRING],
-[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
-[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
-
-dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
-dnl to access previously installed libraries. The basic assumption is that
-dnl a user will want packages to use other packages he previously installed
-dnl with the same --prefix option.
-dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
-dnl libraries, but is otherwise very convenient.
-AC_DEFUN([AC_LIB_PREFIX],
-[
-  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
-  AC_REQUIRE([AC_PROG_CC])
-  AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
-  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
-  dnl By default, look in $includedir and $libdir.
-  use_additional=yes
-  AC_LIB_WITH_FINAL_PREFIX([
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
-  ])
-  AC_LIB_ARG_WITH([lib-prefix],
-[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
-  --without-lib-prefix    don't search for libraries in includedir and libdir],
-[
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
-        AC_LIB_WITH_FINAL_PREFIX([
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
-        ])
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-      fi
-    fi
-])
-  if test $use_additional = yes; then
-    dnl Potentially add $additional_includedir to $CPPFLAGS.
-    dnl But don't add it
-    dnl   1. if it's the standard /usr/include,
-    dnl   2. if it's already present in $CPPFLAGS,
-    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
-    dnl   4. if it doesn't exist as a directory.
-    if test "X$additional_includedir" != "X/usr/include"; then
-      haveit=
-      for x in $CPPFLAGS; do
-        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-        if test "X$x" = "X-I$additional_includedir"; then
-          haveit=yes
-          break
-        fi
-      done
-      if test -z "$haveit"; then
-        if test "X$additional_includedir" = "X/usr/local/include"; then
-          if test -n "$GCC"; then
-            case $host_os in
-              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-            esac
-          fi
-        fi
-        if test -z "$haveit"; then
-          if test -d "$additional_includedir"; then
-            dnl Really add $additional_includedir to $CPPFLAGS.
-            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
-          fi
-        fi
-      fi
-    fi
-    dnl Potentially add $additional_libdir to $LDFLAGS.
-    dnl But don't add it
-    dnl   1. if it's the standard /usr/lib,
-    dnl   2. if it's already present in $LDFLAGS,
-    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
-    dnl   4. if it doesn't exist as a directory.
-    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
-      haveit=
-      for x in $LDFLAGS; do
-        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
-        if test "X$x" = "X-L$additional_libdir"; then
-          haveit=yes
-          break
-        fi
-      done
-      if test -z "$haveit"; then
-        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
-          if test -n "$GCC"; then
-            case $host_os in
-              linux*) haveit=yes;;
-            esac
-          fi
-        fi
-        if test -z "$haveit"; then
-          if test -d "$additional_libdir"; then
-            dnl Really add $additional_libdir to $LDFLAGS.
-            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
-          fi
-        fi
-      fi
-    fi
-  fi
-])
-
-dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
-dnl acl_final_exec_prefix, containing the values to which $prefix and
-dnl $exec_prefix will expand at the end of the configure script.
-AC_DEFUN([AC_LIB_PREPARE_PREFIX],
-[
-  dnl Unfortunately, prefix and exec_prefix get only finally determined
-  dnl at the end of configure.
-  if test "X$prefix" = "XNONE"; then
-    acl_final_prefix="$ac_default_prefix"
-  else
-    acl_final_prefix="$prefix"
-  fi
-  if test "X$exec_prefix" = "XNONE"; then
-    acl_final_exec_prefix='${prefix}'
-  else
-    acl_final_exec_prefix="$exec_prefix"
-  fi
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
-  prefix="$acl_save_prefix"
-])
-
-dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
-dnl variables prefix and exec_prefix bound to the values they will have
-dnl at the end of the configure script.
-AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
-[
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  $1
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-])
-
-dnl AC_LIB_PREPARE_MULTILIB creates
-dnl - a variable acl_libdirstem, containing the basename of the libdir, either
-dnl   "lib" or "lib64" or "lib/64",
-dnl - a variable acl_libdirstem2, as a secondary possible value for
-dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
-dnl   "lib/amd64".
-AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
-[
-  dnl There is no formal standard regarding lib and lib64.
-  dnl On glibc systems, the current practice is that on a system supporting
-  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
-  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
-  dnl the compiler's default mode by looking at the compiler's library search
-  dnl path. If at least one of its elements ends in /lib64 or points to a
-  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
-  dnl Otherwise we use the default, namely "lib".
-  dnl On Solaris systems, the current practice is that on a system supporting
-  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
-  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
-  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
-  AC_REQUIRE([AC_CANONICAL_HOST])
-  acl_libdirstem=lib
-  acl_libdirstem2=
-  case "$host_os" in
-    solaris*)
-      dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
-      dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
-      dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
-      dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
-      dnl symlink is missing, so we set acl_libdirstem2 too.
-      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
-        [AC_EGREP_CPP([sixtyfour bits], [
-#ifdef _LP64
-sixtyfour bits
-#endif
-           ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
-        ])
-      if test $gl_cv_solaris_64bit = yes; then
-        acl_libdirstem=lib/64
-        case "$host_cpu" in
-          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
-          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
-        esac
-      fi
-      ;;
-    *)
-      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
-      if test -n "$searchpath"; then
-        acl_save_IFS="${IFS=   }"; IFS=":"
-        for searchdir in $searchpath; do
-          if test -d "$searchdir"; then
-            case "$searchdir" in
-              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
-              */../ | */.. )
-                # Better ignore directories of this form. They are misleading.
-                ;;
-              *) searchdir=`cd "$searchdir" && pwd`
-                 case "$searchdir" in
-                   */lib64 ) acl_libdirstem=lib64 ;;
-                 esac ;;
-            esac
-          fi
-        done
-        IFS="$acl_save_IFS"
-      fi
-      ;;
-  esac
-  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
-])
diff --git a/config/longlong.m4 b/config/longlong.m4
deleted file mode 100644 (file)
index eefb37c..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-# longlong.m4 serial 17
-dnl Copyright (C) 1999-2007, 2009-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-dnl From Paul Eggert.
-
-# Define HAVE_LONG_LONG_INT if 'long long int' works.
-# This fixes a bug in Autoconf 2.61, and can be faster
-# than what's in Autoconf 2.62 through 2.68.
-
-# Note: If the type 'long long int' exists but is only 32 bits large
-# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
-# defined. In this case you can treat 'long long int' like 'long int'.
-
-AC_DEFUN([AC_TYPE_LONG_LONG_INT],
-[
-  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
-  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
-     [ac_cv_type_long_long_int=yes
-      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
-        if test $ac_cv_type_long_long_int = yes; then
-          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
-          dnl If cross compiling, assume the bug is not important, since
-          dnl nobody cross compiles for this platform as far as we know.
-          AC_RUN_IFELSE(
-            [AC_LANG_PROGRAM(
-               [[@%:@include <limits.h>
-                 @%:@ifndef LLONG_MAX
-                 @%:@ define HALF \
-                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
-                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
-                 @%:@endif]],
-               [[long long int n = 1;
-                 int i;
-                 for (i = 0; ; i++)
-                   {
-                     long long int m = n << i;
-                     if (m >> i != n)
-                       return 1;
-                     if (LLONG_MAX / 2 < m)
-                       break;
-                   }
-                 return 0;]])],
-            [],
-            [ac_cv_type_long_long_int=no],
-            [:])
-        fi
-      fi])
-  if test $ac_cv_type_long_long_int = yes; then
-    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
-      [Define to 1 if the system has the type 'long long int'.])
-  fi
-])
-
-# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
-# This fixes a bug in Autoconf 2.61, and can be faster
-# than what's in Autoconf 2.62 through 2.68.
-
-# Note: If the type 'unsigned long long int' exists but is only 32 bits
-# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
-# will not be defined. In this case you can treat 'unsigned long long int'
-# like 'unsigned long int'.
-
-AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
-[
-  AC_CACHE_CHECK([for unsigned long long int],
-    [ac_cv_type_unsigned_long_long_int],
-    [ac_cv_type_unsigned_long_long_int=yes
-     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-       AC_LINK_IFELSE(
-         [_AC_TYPE_LONG_LONG_SNIPPET],
-         [],
-         [ac_cv_type_unsigned_long_long_int=no])
-     fi])
-  if test $ac_cv_type_unsigned_long_long_int = yes; then
-    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
-      [Define to 1 if the system has the type 'unsigned long long int'.])
-  fi
-])
-
-# Expands to a C program that can be used to test for simultaneous support
-# of 'long long' and 'unsigned long long'. We don't want to say that
-# 'long long' is available if 'unsigned long long' is not, or vice versa,
-# because too many programs rely on the symmetry between signed and unsigned
-# integer types (excluding 'bool').
-AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
-[
-  AC_LANG_PROGRAM(
-    [[/* For now, do not test the preprocessor; as of 2007 there are too many
-         implementations with broken preprocessors.  Perhaps this can
-         be revisited in 2012.  In the meantime, code should not expect
-         #if to work with literals wider than 32 bits.  */
-      /* Test literals.  */
-      long long int ll = 9223372036854775807ll;
-      long long int nll = -9223372036854775807LL;
-      unsigned long long int ull = 18446744073709551615ULL;
-      /* Test constant expressions.   */
-      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
-                     ? 1 : -1)];
-      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
-                     ? 1 : -1)];
-      int i = 63;]],
-    [[/* Test availability of runtime routines for shift and division.  */
-      long long int llmax = 9223372036854775807ll;
-      unsigned long long int ullmax = 18446744073709551615ull;
-      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
-              | (llmax / ll) | (llmax % ll)
-              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
-              | (ullmax / ull) | (ullmax % ull));]])
-])
diff --git a/config/mdate-sh b/config/mdate-sh
deleted file mode 100755 (executable)
index 9e2c0c9..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/bin/sh
-# Get modification time of a file or directory and pretty-print it.
-
-scriptversion=2015-04-09.19; # UTC
-
-# Copyright (C) 1995-2014 Free Software Foundation, Inc.
-# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-fi
-
-case $1 in
-  '')
-     echo "$0: No file.  Try '$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: mdate-sh [--help] [--version] FILE
-
-Pretty-print the modification day of FILE, in the format:
-1 January 1970
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "mdate-sh $scriptversion"
-    exit $?
-    ;;
-esac
-
-error ()
-{
-  echo "$0: $1" >&2
-  exit 1
-}
-
-
-# Prevent date giving response in another language.
-LANG=C
-export LANG
-LC_ALL=C
-export LC_ALL
-LC_TIME=C
-export LC_TIME
-
-# Use UTC to get reproducible result
-TZ=UTC
-export TZ
-
-# GNU ls changes its time format in response to the TIME_STYLE
-# variable.  Since we cannot assume 'unset' works, revert this
-# variable to its documented default.
-if test "${TIME_STYLE+set}" = set; then
-  TIME_STYLE=posix-long-iso
-  export TIME_STYLE
-fi
-
-save_arg1=$1
-
-# Find out how to get the extended ls output of a file or directory.
-if ls -L /dev/null 1>/dev/null 2>&1; then
-  ls_command='ls -L -l -d'
-else
-  ls_command='ls -l -d'
-fi
-# Avoid user/group names that might have spaces, when possible.
-if ls -n /dev/null 1>/dev/null 2>&1; then
-  ls_command="$ls_command -n"
-fi
-
-# A 'ls -l' line looks as follows on OS/2.
-#  drwxrwx---        0 Aug 11  2001 foo
-# This differs from Unix, which adds ownership information.
-#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
-#
-# To find the date, we split the line on spaces and iterate on words
-# until we find a month.  This cannot work with files whose owner is a
-# user named "Jan", or "Feb", etc.  However, it's unlikely that '/'
-# will be owned by a user whose name is a month.  So we first look at
-# the extended ls output of the root directory to decide how many
-# words should be skipped to get the date.
-
-# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
-set x`$ls_command /`
-
-# Find which argument is the month.
-month=
-command=
-until test $month
-do
-  test $# -gt 0 || error "failed parsing '$ls_command /' output"
-  shift
-  # Add another shift to the command.
-  command="$command shift;"
-  case $1 in
-    Jan) month=January; nummonth=1;;
-    Feb) month=February; nummonth=2;;
-    Mar) month=March; nummonth=3;;
-    Apr) month=April; nummonth=4;;
-    May) month=May; nummonth=5;;
-    Jun) month=June; nummonth=6;;
-    Jul) month=July; nummonth=7;;
-    Aug) month=August; nummonth=8;;
-    Sep) month=September; nummonth=9;;
-    Oct) month=October; nummonth=10;;
-    Nov) month=November; nummonth=11;;
-    Dec) month=December; nummonth=12;;
-  esac
-done
-
-test -n "$month" || error "failed parsing '$ls_command /' output"
-
-# Get the extended ls output of the file or directory.
-set dummy x`eval "$ls_command \"\\\$save_arg1\""`
-
-# Remove all preceding arguments
-eval $command
-
-# Because of the dummy argument above, month is in $2.
-#
-# On a POSIX system, we should have
-#
-# $# = 5
-# $1 = file size
-# $2 = month
-# $3 = day
-# $4 = year or time
-# $5 = filename
-#
-# On Darwin 7.7.0 and 7.6.0, we have
-#
-# $# = 4
-# $1 = day
-# $2 = month
-# $3 = year or time
-# $4 = filename
-
-# Get the month.
-case $2 in
-  Jan) month=January; nummonth=1;;
-  Feb) month=February; nummonth=2;;
-  Mar) month=March; nummonth=3;;
-  Apr) month=April; nummonth=4;;
-  May) month=May; nummonth=5;;
-  Jun) month=June; nummonth=6;;
-  Jul) month=July; nummonth=7;;
-  Aug) month=August; nummonth=8;;
-  Sep) month=September; nummonth=9;;
-  Oct) month=October; nummonth=10;;
-  Nov) month=November; nummonth=11;;
-  Dec) month=December; nummonth=12;;
-esac
-
-case $3 in
-  ???*) day=$1;;
-  *) day=$3; shift;;
-esac
-
-# Here we have to deal with the problem that the ls output gives either
-# the time of day or the year.
-case $3 in
-  *:*) set `date`; eval year=\$$#
-       case $2 in
-        Jan) nummonthtod=1;;
-        Feb) nummonthtod=2;;
-        Mar) nummonthtod=3;;
-        Apr) nummonthtod=4;;
-        May) nummonthtod=5;;
-        Jun) nummonthtod=6;;
-        Jul) nummonthtod=7;;
-        Aug) nummonthtod=8;;
-        Sep) nummonthtod=9;;
-        Oct) nummonthtod=10;;
-        Nov) nummonthtod=11;;
-        Dec) nummonthtod=12;;
-       esac
-       # For the first six month of the year the time notation can also
-       # be used for files modified in the last year.
-       if (expr $nummonth \> $nummonthtod) > /dev/null;
-       then
-        year=`expr $year - 1`
-       fi;;
-  *) year=$3;;
-esac
-
-# The result.
-echo $day $month $year
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config/missing b/config/missing
deleted file mode 100755 (executable)
index f62bbae..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-#! /bin/sh
-# Common wrapper for a few potentially missing GNU programs.
-
-scriptversion=2013-10-28.13; # UTC
-
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
-# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try '$0 --help' for more information"
-  exit 1
-fi
-
-case $1 in
-
-  --is-lightweight)
-    # Used by our autoconf macros to check whether the available missing
-    # script is modern enough.
-    exit 0
-    ;;
-
-  --run)
-    # Back-compat with the calling convention used by older automake.
-    shift
-    ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
-to PROGRAM being missing or too old.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-
-Supported PROGRAM values:
-  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
-  bison     yacc      flex         lex       help2man
-
-Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
-'g' are ignored when checking the name.
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: unknown '$1' option"
-    echo 1>&2 "Try '$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# Run the given program, remember its exit status.
-"$@"; st=$?
-
-# If it succeeded, we are done.
-test $st -eq 0 && exit 0
-
-# Also exit now if we it failed (or wasn't found), and '--version' was
-# passed; such an option is passed most likely to detect whether the
-# program is present and works.
-case $2 in --version|--help) exit $st;; esac
-
-# Exit code 63 means version mismatch.  This often happens when the user
-# tries to use an ancient version of a tool on a file that requires a
-# minimum version.
-if test $st -eq 63; then
-  msg="probably too old"
-elif test $st -eq 127; then
-  # Program was missing.
-  msg="missing on your system"
-else
-  # Program was found and executed, but failed.  Give up.
-  exit $st
-fi
-
-perl_URL=http://www.perl.org/
-flex_URL=http://flex.sourceforge.net/
-gnu_software_URL=http://www.gnu.org/software
-
-program_details ()
-{
-  case $1 in
-    aclocal|automake)
-      echo "The '$1' program is part of the GNU Automake package:"
-      echo "<$gnu_software_URL/automake>"
-      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
-      echo "<$gnu_software_URL/autoconf>"
-      echo "<$gnu_software_URL/m4/>"
-      echo "<$perl_URL>"
-      ;;
-    autoconf|autom4te|autoheader)
-      echo "The '$1' program is part of the GNU Autoconf package:"
-      echo "<$gnu_software_URL/autoconf/>"
-      echo "It also requires GNU m4 and Perl in order to run:"
-      echo "<$gnu_software_URL/m4/>"
-      echo "<$perl_URL>"
-      ;;
-  esac
-}
-
-give_advice ()
-{
-  # Normalize program name to check for.
-  normalized_program=`echo "$1" | sed '
-    s/^gnu-//; t
-    s/^gnu//; t
-    s/^g//; t'`
-
-  printf '%s\n' "'$1' is $msg."
-
-  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
-  case $normalized_program in
-    autoconf*)
-      echo "You should only need it if you modified 'configure.ac',"
-      echo "or m4 files included by it."
-      program_details 'autoconf'
-      ;;
-    autoheader*)
-      echo "You should only need it if you modified 'acconfig.h' or"
-      echo "$configure_deps."
-      program_details 'autoheader'
-      ;;
-    automake*)
-      echo "You should only need it if you modified 'Makefile.am' or"
-      echo "$configure_deps."
-      program_details 'automake'
-      ;;
-    aclocal*)
-      echo "You should only need it if you modified 'acinclude.m4' or"
-      echo "$configure_deps."
-      program_details 'aclocal'
-      ;;
-   autom4te*)
-      echo "You might have modified some maintainer files that require"
-      echo "the 'autom4te' program to be rebuilt."
-      program_details 'autom4te'
-      ;;
-    bison*|yacc*)
-      echo "You should only need it if you modified a '.y' file."
-      echo "You may want to install the GNU Bison package:"
-      echo "<$gnu_software_URL/bison/>"
-      ;;
-    lex*|flex*)
-      echo "You should only need it if you modified a '.l' file."
-      echo "You may want to install the Fast Lexical Analyzer package:"
-      echo "<$flex_URL>"
-      ;;
-    help2man*)
-      echo "You should only need it if you modified a dependency" \
-           "of a man page."
-      echo "You may want to install the GNU Help2man package:"
-      echo "<$gnu_software_URL/help2man/>"
-    ;;
-    makeinfo*)
-      echo "You should only need it if you modified a '.texi' file, or"
-      echo "any other file indirectly affecting the aspect of the manual."
-      echo "You might want to install the Texinfo package:"
-      echo "<$gnu_software_URL/texinfo/>"
-      echo "The spurious makeinfo call might also be the consequence of"
-      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
-      echo "want to install GNU make:"
-      echo "<$gnu_software_URL/make/>"
-      ;;
-    *)
-      echo "You might have modified some files without having the proper"
-      echo "tools for further handling them.  Check the 'README' file, it"
-      echo "often tells you about the needed prerequisites for installing"
-      echo "this package.  You may also peek at any GNU archive site, in"
-      echo "case some other package contains this missing '$1' program."
-      ;;
-  esac
-}
-
-give_advice "$1" | sed -e '1s/^/WARNING: /' \
-                       -e '2,$s/^/         /' >&2
-
-# Propagate the correct exit status (expected to be 127 for a program
-# not found, 63 for a program that failed due to version mismatch).
-exit $st
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/config/nls.m4 b/config/nls.m4
deleted file mode 100644 (file)
index 53cdc8b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# nls.m4 serial 5 (gettext-0.18)
-dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation,
-dnl Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-
-AC_PREREQ([2.50])
-
-AC_DEFUN([AM_NLS],
-[
-  AC_MSG_CHECKING([whether NLS is requested])
-  dnl Default is enabled NLS
-  AC_ARG_ENABLE([nls],
-    [  --disable-nls           do not use Native Language Support],
-    USE_NLS=$enableval, USE_NLS=yes)
-  AC_MSG_RESULT([$USE_NLS])
-  AC_SUBST([USE_NLS])
-])
diff --git a/config/po.m4 b/config/po.m4
deleted file mode 100644 (file)
index 43012dc..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-# po.m4 serial 24 (gettext-0.19)
-dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
-dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
-
-AC_PREREQ([2.60])
-
-dnl Checks for all prerequisites of the po subdirectory.
-AC_DEFUN([AM_PO_SUBDIRS],
-[
-  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-  AC_REQUIRE([AC_PROG_INSTALL])dnl
-  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-  AC_REQUIRE([AC_PROG_SED])dnl
-  AC_REQUIRE([AM_NLS])dnl
-
-  dnl Release version of the gettext macros. This is used to ensure that
-  dnl the gettext macros and po/Makefile.in.in are in sync.
-  AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
-
-  dnl Perform the following tests also if --disable-nls has been given,
-  dnl because they are needed for "make dist" to work.
-
-  dnl Search for GNU msgfmt in the PATH.
-  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
-  dnl The second test excludes FreeBSD msgfmt.
-  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
-    [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
-     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
-    :)
-  AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
-
-  dnl Test whether it is GNU msgfmt >= 0.15.
-changequote(,)dnl
-  case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
-    *) MSGFMT_015=$MSGFMT ;;
-  esac
-changequote([,])dnl
-  AC_SUBST([MSGFMT_015])
-changequote(,)dnl
-  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
-    *) GMSGFMT_015=$GMSGFMT ;;
-  esac
-changequote([,])dnl
-  AC_SUBST([GMSGFMT_015])
-
-  dnl Search for GNU xgettext 0.12 or newer in the PATH.
-  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
-  dnl The second test excludes FreeBSD xgettext.
-  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
-    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
-     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
-    :)
-  dnl Remove leftover from FreeBSD xgettext call.
-  rm -f messages.po
-
-  dnl Test whether it is GNU xgettext >= 0.15.
-changequote(,)dnl
-  case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
-    *) XGETTEXT_015=$XGETTEXT ;;
-  esac
-changequote([,])dnl
-  AC_SUBST([XGETTEXT_015])
-
-  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
-  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
-    [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
-
-  dnl Installation directories.
-  dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
-  dnl have to define it here, so that it can be used in po/Makefile.
-  test -n "$localedir" || localedir='${datadir}/locale'
-  AC_SUBST([localedir])
-
-  dnl Support for AM_XGETTEXT_OPTION.
-  test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
-  AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
-
-  AC_CONFIG_COMMANDS([po-directories], [[
-    for ac_file in $CONFIG_FILES; do
-      # Support "outfile[:infile[:infile...]]"
-      case "$ac_file" in
-        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-      esac
-      # PO directories have a Makefile.in generated from Makefile.in.in.
-      case "$ac_file" in */Makefile.in)
-        # Adjust a relative srcdir.
-        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
-        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
-        # In autoconf-2.13 it is called $ac_given_srcdir.
-        # In autoconf-2.50 it is called $srcdir.
-        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
-        case "$ac_given_srcdir" in
-          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
-          /*) top_srcdir="$ac_given_srcdir" ;;
-          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
-        esac
-        # Treat a directory as a PO directory if and only if it has a
-        # POTFILES.in file. This allows packages to have multiple PO
-        # directories under different names or in different locations.
-        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
-          rm -f "$ac_dir/POTFILES"
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
-          gt_tab=`printf '\t'`
-          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
-          POMAKEFILEDEPS="POTFILES.in"
-          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
-          # on $ac_dir but don't depend on user-specified configuration
-          # parameters.
-          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
-            # The LINGUAS file contains the set of available languages.
-            if test -n "$OBSOLETE_ALL_LINGUAS"; then
-              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
-            fi
-            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-            # Hide the ALL_LINGUAS assignment from automake < 1.5.
-            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
-            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
-          else
-            # The set of available languages was given in configure.in.
-            # Hide the ALL_LINGUAS assignment from automake < 1.5.
-            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
-          fi
-          # Compute POFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
-          # Compute UPDATEPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
-          # Compute DUMMYPOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
-          # Compute GMOFILES
-          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
-          case "$ac_given_srcdir" in
-            .) srcdirpre= ;;
-            *) srcdirpre='$(srcdir)/' ;;
-          esac
-          POFILES=
-          UPDATEPOFILES=
-          DUMMYPOFILES=
-          GMOFILES=
-          for lang in $ALL_LINGUAS; do
-            POFILES="$POFILES $srcdirpre$lang.po"
-            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
-            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
-            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
-          done
-          # CATALOGS depends on both $ac_dir and the user's LINGUAS
-          # environment variable.
-          INST_LINGUAS=
-          if test -n "$ALL_LINGUAS"; then
-            for presentlang in $ALL_LINGUAS; do
-              useit=no
-              if test "%UNSET%" != "$LINGUAS"; then
-                desiredlanguages="$LINGUAS"
-              else
-                desiredlanguages="$ALL_LINGUAS"
-              fi
-              for desiredlang in $desiredlanguages; do
-                # Use the presentlang catalog if desiredlang is
-                #   a. equal to presentlang, or
-                #   b. a variant of presentlang (because in this case,
-                #      presentlang can be used as a fallback for messages
-                #      which are not translated in the desiredlang catalog).
-                case "$desiredlang" in
-                  "$presentlang"*) useit=yes;;
-                esac
-              done
-              if test $useit = yes; then
-                INST_LINGUAS="$INST_LINGUAS $presentlang"
-              fi
-            done
-          fi
-          CATALOGS=
-          if test -n "$INST_LINGUAS"; then
-            for lang in $INST_LINGUAS; do
-              CATALOGS="$CATALOGS $lang.gmo"
-            done
-          fi
-          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
-          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
-          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
-            if test -f "$f"; then
-              case "$f" in
-                *.orig | *.bak | *~) ;;
-                *) cat "$f" >> "$ac_dir/Makefile" ;;
-              esac
-            fi
-          done
-        fi
-        ;;
-      esac
-    done]],
-   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
-    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
-    # from automake < 1.5.
-    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
-    # Capture the value of LINGUAS because we need it to compute CATALOGS.
-    LINGUAS="${LINGUAS-%UNSET%}"
-   ])
-])
-
-dnl Postprocesses a Makefile in a directory containing PO files.
-AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
-[
-  # When this code is run, in config.status, two variables have already been
-  # set:
-  # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
-  # - LINGUAS is the value of the environment variable LINGUAS at configure
-  #   time.
-
-changequote(,)dnl
-  # Adjust a relative srcdir.
-  ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
-  ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
-  ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
-  # In autoconf-2.13 it is called $ac_given_srcdir.
-  # In autoconf-2.50 it is called $srcdir.
-  test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
-  case "$ac_given_srcdir" in
-    .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
-    /*) top_srcdir="$ac_given_srcdir" ;;
-    *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-  # Find a way to echo strings without interpreting backslash.
-  if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
-    gt_echo='echo'
-  else
-    if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
-      gt_echo='printf %s\n'
-    else
-      echo_func () {
-        cat <<EOT
-$*
-EOT
-      }
-      gt_echo='echo_func'
-    fi
-  fi
-
-  # A sed script that extracts the value of VARIABLE from a Makefile.
-  tab=`printf '\t'`
-  sed_x_variable='
-# Test if the hold space is empty.
-x
-s/P/P/
-x
-ta
-# Yes it was empty. Look if we have the expected variable definition.
-/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
-  # Seen the first line of the variable definition.
-  s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
-  ba
-}
-bd
-:a
-# Here we are processing a line from the variable definition.
-# Remove comment, more precisely replace it with a space.
-s/#.*$/ /
-# See if the line ends in a backslash.
-tb
-:b
-s/\\$//
-# Print the line, without the trailing backslash.
-p
-tc
-# There was no trailing backslash. The end of the variable definition is
-# reached. Clear the hold space.
-s/^.*$//
-x
-bd
-:c
-# A trailing backslash means that the variable definition continues in the
-# next line. Put a nonempty string into the hold space to indicate this.
-s/^.*$/P/
-x
-:d
-'
-changequote([,])dnl
-
-  # Set POTFILES to the value of the Makefile variable POTFILES.
-  sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
-  POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
-  # Compute POTFILES_DEPS as
-  #   $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
-  POTFILES_DEPS=
-  for file in $POTFILES; do
-    POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
-  done
-  POMAKEFILEDEPS=""
-
-  if test -n "$OBSOLETE_ALL_LINGUAS"; then
-    test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
-  fi
-  if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
-    # The LINGUAS file contains the set of available languages.
-    ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
-    POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
-  else
-    # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
-    sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
-    ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
-  fi
-  # Hide the ALL_LINGUAS assignment from automake < 1.5.
-  eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
-  # Compute POFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
-  # Compute UPDATEPOFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
-  # Compute DUMMYPOFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
-  # Compute GMOFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
-  # Compute PROPERTIESFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
-  # Compute CLASSFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
-  # Compute QMFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
-  # Compute MSGFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
-  # Compute RESOURCESDLLFILES
-  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
-  case "$ac_given_srcdir" in
-    .) srcdirpre= ;;
-    *) srcdirpre='$(srcdir)/' ;;
-  esac
-  POFILES=
-  UPDATEPOFILES=
-  DUMMYPOFILES=
-  GMOFILES=
-  PROPERTIESFILES=
-  CLASSFILES=
-  QMFILES=
-  MSGFILES=
-  RESOURCESDLLFILES=
-  for lang in $ALL_LINGUAS; do
-    POFILES="$POFILES $srcdirpre$lang.po"
-    UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
-    DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
-    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
-    PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
-    CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
-    QMFILES="$QMFILES $srcdirpre$lang.qm"
-    frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
-    MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
-    frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
-    RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
-  done
-  # CATALOGS depends on both $ac_dir and the user's LINGUAS
-  # environment variable.
-  INST_LINGUAS=
-  if test -n "$ALL_LINGUAS"; then
-    for presentlang in $ALL_LINGUAS; do
-      useit=no
-      if test "%UNSET%" != "$LINGUAS"; then
-        desiredlanguages="$LINGUAS"
-      else
-        desiredlanguages="$ALL_LINGUAS"
-      fi
-      for desiredlang in $desiredlanguages; do
-        # Use the presentlang catalog if desiredlang is
-        #   a. equal to presentlang, or
-        #   b. a variant of presentlang (because in this case,
-        #      presentlang can be used as a fallback for messages
-        #      which are not translated in the desiredlang catalog).
-        case "$desiredlang" in
-          "$presentlang"*) useit=yes;;
-        esac
-      done
-      if test $useit = yes; then
-        INST_LINGUAS="$INST_LINGUAS $presentlang"
-      fi
-    done
-  fi
-  CATALOGS=
-  JAVACATALOGS=
-  QTCATALOGS=
-  TCLCATALOGS=
-  CSHARPCATALOGS=
-  if test -n "$INST_LINGUAS"; then
-    for lang in $INST_LINGUAS; do
-      CATALOGS="$CATALOGS $lang.gmo"
-      JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
-      QTCATALOGS="$QTCATALOGS $lang.qm"
-      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
-      TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
-      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
-      CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
-    done
-  fi
-
-  sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
-  tab=`printf '\t'`
-  if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
-    # Add dependencies that cannot be formulated as a simple suffix rule.
-    for lang in $ALL_LINGUAS; do
-      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
-      cat >> "$ac_file.tmp" <<EOF
-$frobbedlang.msg: $lang.po
-${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
-${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
-EOF
-    done
-  fi
-  if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
-    # Add dependencies that cannot be formulated as a simple suffix rule.
-    for lang in $ALL_LINGUAS; do
-      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
-      cat >> "$ac_file.tmp" <<EOF
-$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
-${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
-${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
-EOF
-    done
-  fi
-  if test -n "$POMAKEFILEDEPS"; then
-    cat >> "$ac_file.tmp" <<EOF
-Makefile: $POMAKEFILEDEPS
-EOF
-  fi
-  mv "$ac_file.tmp" "$ac_file"
-])
-
-dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
-AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
-[
-  XGETTEXT_EXTRA_OPTIONS=
-])
-
-dnl Registers an option to be passed to xgettext in the po subdirectory.
-AC_DEFUN([AM_XGETTEXT_OPTION],
-[
-  AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
-  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
-])
diff --git a/config/progtest.m4 b/config/progtest.m4
deleted file mode 100644 (file)
index b499f79..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-# progtest.m4 serial 7 (gettext-0.18.2)
-dnl Copyright (C) 1996-2003, 2005, 2008-2014 Free Software Foundation, Inc.
-dnl This file is free software; the Free Software Foundation
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-dnl
-dnl This file can can be used in projects which are not available under
-dnl the GNU General Public License or the GNU Library General Public
-dnl License but which still want to provide support for the GNU gettext
-dnl functionality.
-dnl Please note that the actual code of the GNU gettext library is covered
-dnl by the GNU Library General Public License, and the rest of the GNU
-dnl gettext package package is covered by the GNU General Public License.
-dnl They are *not* in the public domain.
-
-dnl Authors:
-dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
-
-AC_PREREQ([2.50])
-
-# Search path for a program which passes the given test.
-
-dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
-dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
-AC_DEFUN([AM_PATH_PROG_WITH_TEST],
-[
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
-fi
-
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
-
-# Extract the first word of "$2", so it can be a program name with args.
-set dummy $2; ac_word=[$]2
-AC_MSG_CHECKING([for $ac_word])
-AC_CACHE_VAL([ac_cv_path_$1],
-[case "[$]$1" in
-  [[\\/]]* | ?:[[\\/]]*)
-    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in ifelse([$5], , $PATH, [$5]); do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
-          if [$3]; then
-            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-dnl If no 4th arg is given, leave the cache variable unset,
-dnl so AC_PATH_PROGS will keep looking.
-ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
-])dnl
-    ;;
-esac])dnl
-$1="$ac_cv_path_$1"
-if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
-  AC_MSG_RESULT([$][$1])
-else
-  AC_MSG_RESULT([no])
-fi
-AC_SUBST([$1])dnl
-])
diff --git a/config/texinfo.tex b/config/texinfo.tex
deleted file mode 100644 (file)
index e60dd17..0000000
+++ /dev/null
@@ -1,11654 +0,0 @@
-% texinfo.tex -- TeX macros to handle Texinfo files.
-% 
-% Load plain if necessary, i.e., if running under initex.
-\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
-%
-\def\texinfoversion{2016-06-07.21}
-%
-% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
-% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
-% Free Software Foundation, Inc.
-%
-% This texinfo.tex file is free software: you can redistribute it and/or
-% modify it under the terms of the GNU General Public License as
-% published by the Free Software Foundation, either version 3 of the
-% License, or (at your option) any later version.
-%
-% This texinfo.tex file is distributed in the hope that it will be
-% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-% General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License
-% along with this program.  If not, see <http://www.gnu.org/licenses/>.
-%
-% As a special exception, when this file is read by TeX when processing
-% a Texinfo source document, you may use the result without
-% restriction. This Exception is an additional permission under section 7
-% of the GNU General Public License, version 3 ("GPLv3").
-%
-% Please try the latest version of texinfo.tex before submitting bug
-% reports; you can get the latest version from:
-%   http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
-%   http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
-%   http://www.gnu.org/software/texinfo/ (the Texinfo home page)
-% The texinfo.tex in any given distribution could well be out
-% of date, so if that's what you're using, please check.
-%
-% Send bug reports to bug-texinfo@gnu.org.  Please include including a
-% complete document in each bug report with which we can reproduce the
-% problem.  Patches are, of course, greatly appreciated.
-%
-% To process a Texinfo manual with TeX, it's most reliable to use the
-% texi2dvi shell script that comes with the distribution.  For a simple
-% manual foo.texi, however, you can get away with this:
-%   tex foo.texi
-%   texindex foo.??
-%   tex foo.texi
-%   tex foo.texi
-%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
-% The extra TeX runs get the cross-reference information correct.
-% Sometimes one run after texindex suffices, and sometimes you need more
-% than two; texi2dvi does it as many times as necessary.
-%
-% It is possible to adapt texinfo.tex for other languages, to some
-% extent.  You can get the existing language-specific files from the
-% full Texinfo distribution.
-%
-% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
-
-
-\message{Loading texinfo [version \texinfoversion]:}
-
-% If in a .fmt file, print the version number
-% and turn on active characters that we couldn't do earlier because
-% they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}%
-  \catcode`+=\active \catcode`\_=\active}
-
-% LaTeX's \typeout.  This ensures that the messages it is used for
-% are identical in format to the corresponding ones from latex/pdflatex.
-\def\typeout{\immediate\write17}%
-
-\chardef\other=12
-
-% We never want plain's \outer definition of \+ in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-% Save some plain tex macros whose names we will redefine.
-\let\ptexb=\b
-\let\ptexbullet=\bullet
-\let\ptexc=\c
-\let\ptexcomma=\,
-\let\ptexdot=\.
-\let\ptexdots=\dots
-\let\ptexend=\end
-\let\ptexequiv=\equiv
-\let\ptexexclam=\!
-\let\ptexfootnote=\footnote
-\let\ptexgtr=>
-\let\ptexhat=^
-\let\ptexi=\i
-\let\ptexindent=\indent
-\let\ptexinsert=\insert
-\let\ptexlbrace=\{
-\let\ptexless=<
-\let\ptexnewwrite\newwrite
-\let\ptexnoindent=\noindent
-\let\ptexplus=+
-\let\ptexraggedright=\raggedright
-\let\ptexrbrace=\}
-\let\ptexslash=\/
-\let\ptexsp=\sp
-\let\ptexstar=\*
-\let\ptexsup=\sup
-\let\ptext=\t
-\let\ptextop=\top
-{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
-  \let\linenumber = \empty % Pre-3.0.
-\else
-  \def\linenumber{l.\the\inputlineno:\space}
-\fi
-
-% Set up fixed words for English if not already set.
-\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
-\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
-\ifx\putworderror\undefined     \gdef\putworderror{error}\fi
-\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
-\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
-\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
-\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
-\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
-\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
-\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
-\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
-\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
-\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
-\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
-\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
-\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
-\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
-\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
-\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
-\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
-%
-\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
-\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
-\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
-\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
-\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
-\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
-\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
-\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
-\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
-\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
-\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
-\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
-%
-\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
-\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
-\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
-\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
-
-% Give the space character the catcode for a space.
-\def\spaceisspace{\catcode`\ =10\relax}
-
-\chardef\dashChar  = `\-
-\chardef\slashChar = `\/
-\chardef\underChar = `\_
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-% The following is used inside several \edef's.
-\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
-
-% Hyphenation fixes.
-\hyphenation{
-  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
-  ap-pen-dix bit-map bit-maps
-  data-base data-bases eshell fall-ing half-way long-est man-u-script
-  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
-  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
-  spell-ing spell-ings
-  stand-alone strong-est time-stamp time-stamps which-ever white-space
-  wide-spread wrap-around
-}
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal.  We don't just call \tracingall here,
-% since that produces some useless output on the terminal.  We also make
-% some effort to order the tracing commands to reduce output in the log
-% file; cf. trace.sty in LaTeX.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{%
-  \tracingstats2
-  \tracingpages1
-  \tracinglostchars2  % 2 gives us more in etex
-  \tracingparagraphs1
-  \tracingoutput1
-  \tracingmacros2
-  \tracingrestores1
-  \showboxbreadth\maxdimen \showboxdepth\maxdimen
-  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
-    \tracingscantokens1
-    \tracingifs1
-    \tracinggroups1
-    \tracingnesting2
-    \tracingassigns1
-  \fi
-  \tracingcommands3  % 3 gives us more in etex
-  \errorcontextlines16
-}%
-
-% @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
-% aren't perfect, it's not the end of the world, being an error message,
-% after all.
-% 
-\def\errormsg{\begingroup \indexnofonts \doerrormsg}
-\def\doerrormsg#1{\errmessage{#1}}
-
-% add check for \lastpenalty to plain's definitions.  If the last thing
-% we did was a \nobreak, we don't want to insert more space.
-%
-\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
-  \removelastskip\penalty-50\smallskip\fi\fi}
-\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
-  \removelastskip\penalty-100\medskip\fi\fi}
-\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
-  \removelastskip\penalty-200\bigskip\fi\fi}
-
-%\f Output routine
-%
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt }
-
-% Do @cropmarks to get crop marks.
-%
-\newif\ifcropmarks
-\let\cropmarks = \cropmarkstrue
-%
-% Dimensions to add cropmarks at corners.
-% Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
-\newdimen\cornerlong  \cornerlong=1pc
-\newdimen\cornerthick \cornerthick=.3pt
-\newdimen\topandbottommargin \topandbottommargin=.75in
-
-% Output a mark which sets \thischapter, \thissection and \thiscolor.
-% We dump everything together because we only have one kind of mark.
-% This works because we only use \botmark / \topmark, not \firstmark.
-%
-% A mark contains a subexpression of the \ifcase ... \fi construct.
-% \get*marks macros below extract the needed part using \ifcase.
-%
-% Another complication is to let the user choose whether \thischapter
-% (\thissection) refers to the chapter (section) in effect at the top
-% of a page, or that at the bottom of a page.
-
-% \domark is called twice inside \chapmacro, to add one
-% mark before the section break, and one after.
-%   In the second call \prevchapterdefs is the same as \lastchapterdefs,
-% and \prevsectiondefs is the same as \lastsectiondefs.
-%   Then if the page is not broken at the mark, some of the previous
-% section appears on the page, and we can get the name of this section
-% from \firstmark for @everyheadingmarks top.
-%   @everyheadingmarks bottom uses \botmark.
-%
-% See page 260 of The TeXbook.
-\def\domark{%
-  \toks0=\expandafter{\lastchapterdefs}%
-  \toks2=\expandafter{\lastsectiondefs}%
-  \toks4=\expandafter{\prevchapterdefs}%
-  \toks6=\expandafter{\prevsectiondefs}%
-  \toks8=\expandafter{\lastcolordefs}%
-  \mark{%
-                   \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
-      \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
-    \noexpand\else \the\toks8             % 2: color marks
-  }%
-}
-
-% \gettopheadingmarks, \getbottomheadingmarks,
-% \getcolormarks - extract needed part of mark.
-%
-% \topmark doesn't work for the very first chapter (after the title
-% page or the contents), so we use \firstmark there -- this gets us
-% the mark with the chapter defs, unless the user sneaks in, e.g.,
-% @setcolor (or @url, or @link, etc.) between @contents and the very
-% first @chapter.
-\def\gettopheadingmarks{%
-  \ifcase0\topmark\fi
-  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
-}
-\def\getbottomheadingmarks{\ifcase1\botmark\fi}
-\def\getcolormarks{\ifcase2\topmark\fi}
-
-% Avoid "undefined control sequence" errors.
-\def\lastchapterdefs{}
-\def\lastsectiondefs{}
-\def\lastsection{}
-\def\prevchapterdefs{}
-\def\prevsectiondefs{}
-\def\lastcolordefs{}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen\bindingoffset
-\newdimen\normaloffset
-\newdimen\txipagewidth \newdimen\txipageheight
-
-% Main output routine.
-%
-\chardef\PAGE = 255
-\output = {\onepageout{\pagecontents\PAGE}}
-
-\newbox\headlinebox
-\newbox\footlinebox
-
-% \onepageout takes a vbox as an argument.
-% \shipout a vbox for a single page, adding an optional header, footer,
-% cropmarks, and footnote.  This also causes index entries for this page
-% to be written to the auxiliary files.
-%
-\def\onepageout#1{%
-  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
-  %
-  \ifodd\pageno  \advance\hoffset by \bindingoffset
-  \else \advance\hoffset by -\bindingoffset\fi
-  %
-  % Common context changes for both heading and footing.
-  % Do this outside of the \shipout so @code etc. will be expanded in
-  % the headline as they should be, not taken literally (outputting ''code).
-  \def\commmonheadfootline{\let\hsize=\txipagewidth \texinfochars}
-  %
-  % Retrieve the information for the headings from the marks in the page,
-  % and call Plain TeX's \makeheadline and \makefootline, which use the
-  % values in \headline and \footline.
-  %
-  % This is used to check if we are on the first page of a chapter.
-  \ifcase1\topmark\fi
-  \let\prevchaptername\thischaptername
-  \ifcase0\firstmark\fi
-  \let\curchaptername\thischaptername
-  %
-  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
-  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
-  %
-  \ifx\curchaptername\prevchaptername
-    \let\thischapterheading\thischapter
-  \else
-    % \thischapterheading is the same as \thischapter except it is blank
-    % for the first page of a chapter.  This is to prevent the chapter name 
-    % being shown twice.
-    \def\thischapterheading{}%
-  \fi
-  %
-  \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
-  \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%
-  %
-  {%
-    % Set context for writing to auxiliary files like index files.
-    % Have to do this stuff outside the \shipout because we want it to
-    % take effect in \write's, yet the group defined by the \vbox ends
-    % before the \shipout runs.
-    %
-    \indexdummies         % don't expand commands in the output.
-    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
-               % the page break happens to be in the middle of an example.
-               % We don't want .vr (or whatever) entries like this:
-               % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}}
-               % "\acronym" won't work when it's read back in;
-               % it needs to be
-               % {\code {{\backslashcurfont }acronym}
-    \shipout\vbox{%
-      % Do this early so pdf references go to the beginning of the page.
-      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
-      %
-      \ifcropmarks \vbox to \outervsize\bgroup
-        \hsize = \outerhsize
-        \vskip-\topandbottommargin
-        \vtop to0pt{%
-          \line{\ewtop\hfil\ewtop}%
-          \nointerlineskip
-          \line{%
-            \vbox{\moveleft\cornerthick\nstop}%
-            \hfill
-            \vbox{\moveright\cornerthick\nstop}%
-          }%
-          \vss}%
-        \vskip\topandbottommargin
-        \line\bgroup
-          \hfil % center the page within the outer (page) hsize.
-          \ifodd\pageno\hskip\bindingoffset\fi
-          \vbox\bgroup
-      \fi
-      %
-      \unvbox\headlinebox
-      \pagebody{#1}%
-      \ifdim\ht\footlinebox > 0pt
-        % Only leave this space if the footline is nonempty.
-        % (We lessened \vsize for it in \oddfootingyyy.)
-        % The \baselineskip=24pt in plain's \makefootline has no effect.
-        \vskip 24pt
-        \unvbox\footlinebox
-      \fi
-      %
-      \ifcropmarks
-          \egroup % end of \vbox\bgroup
-        \hfil\egroup % end of (centering) \line\bgroup
-        \vskip\topandbottommargin plus1fill minus1fill
-        \boxmaxdepth = \cornerthick
-        \vbox to0pt{\vss
-          \line{%
-            \vbox{\moveleft\cornerthick\nsbot}%
-            \hfill
-            \vbox{\moveright\cornerthick\nsbot}%
-          }%
-          \nointerlineskip
-          \line{\ewbot\hfil\ewbot}%
-        }%
-      \egroup % \vbox from first cropmarks clause
-      \fi
-    }% end of \shipout\vbox
-  }% end of group with \indexdummies
-  \advancepageno
-  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
-}
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-% Main part of page, including any footnotes
-\def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
-  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1\relax \unvbox#1\relax
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-% Here are the rules for the cropmarks.  Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
-  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
-  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-
-% Argument parsing
-
-% Parse an argument, then pass it to #1.  The argument is the rest of
-% the input line (except we remove a trailing comment).  #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-% For example, \def\foo{\parsearg\fooxxx}.
-%
-\def\parsearg{\parseargusing{}}
-\def\parseargusing#1#2{%
-  \def\argtorun{#2}%
-  \begingroup
-    \obeylines
-    \spaceisspace
-    #1%
-    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
-}
-
-{\obeylines %
-  \gdef\parseargline#1^^M{%
-    \endgroup % End of the group started in \parsearg.
-    \argremovecomment #1\comment\ArgTerm%
-  }%
-}
-
-% First remove any @comment, then any @c comment.  Also remove a @texinfoc
-% comment (see \scanmacro for details).  Pass the result on to \argcheckspaces.
-\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
-\def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm}
-\def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
-
-% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
-%
-% \argremovec might leave us with trailing space, e.g.,
-%    @end itemize  @c foo
-% This space token undergoes the same procedure and is eventually removed
-% by \finishparsearg.
-%
-\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
-\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
-\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
-  \def\temp{#3}%
-  \ifx\temp\empty
-    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
-    \let\temp\finishparsearg
-  \else
-    \let\temp\argcheckspaces
-  \fi
-  % Put the space token in:
-  \temp#1 #3\ArgTerm
-}
-
-% If a _delimited_ argument is enclosed in braces, they get stripped; so
-% to get _exactly_ the rest of the line, we had to prevent such situation.
-% We prepended an \empty token at the very beginning and we expand it now,
-% just before passing the control to \argtorun.
-% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
-% either the null string, or it ends with \^^M---thus there is no danger
-% that a pair of braces would be stripped.
-%
-% But first, we have to remove the trailing space token.
-%
-\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
-
-
-% \parseargdef - define a command taking an argument on the line
-%
-% \parseargdef\foo{...}
-%      is roughly equivalent to
-% \def\foo{\parsearg\Xfoo}
-% \def\Xfoo#1{...}
-\def\parseargdef#1{%
-  \expandafter \doparseargdef \csname\string#1\endcsname #1%
-}
-\def\doparseargdef#1#2{%
-  \def#2{\parsearg#1}%
-  \def#1##1%
-}
-
-% Several utility definitions with active space:
-{
-  \obeyspaces
-  \gdef\obeyedspace{ }
-
-  % Make each space character in the input produce a normal interword
-  % space in the output.  Don't allow a line break at this space, as this
-  % is used only in environments like @example, where each line of input
-  % should produce a line of output anyway.
-  %
-  \gdef\sepspaces{\obeyspaces\let =\tie}
-
-  % If an index command is used in an @example environment, any spaces
-  % therein should become regular spaces in the raw index file, not the
-  % expansion of \tie (\leavevmode \penalty \@M \ ).
-  \gdef\unsepspaces{\let =\space}
-}
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-% Define the framework for environments in texinfo.tex.  It's used like this:
-%
-%   \envdef\foo{...}
-%   \def\Efoo{...}
-%
-% It's the responsibility of \envdef to insert \begingroup before the
-% actual body; @end closes the group after calling \Efoo.  \envdef also
-% defines \thisenv, so the current environment is known; @end checks
-% whether the environment name matches.  The \checkenv macro can also be
-% used to check whether the current environment is the one expected.
-%
-% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
-% are not treated as environments; they don't open a group.  (The
-% implementation of @end takes care not to call \endgroup in this
-% special case.)
-
-
-% At run-time, environments start with this:
-\def\startenvironment#1{\begingroup\def\thisenv{#1}}
-% initialize
-\let\thisenv\empty
-
-% ... but they get defined via ``\envdef\foo{...}'':
-\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
-\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
-
-% Check whether we're in the right environment:
-\def\checkenv#1{%
-  \def\temp{#1}%
-  \ifx\thisenv\temp
-  \else
-    \badenverr
-  \fi
-}
-
-% Environment mismatch, #1 expected:
-\def\badenverr{%
-  \errhelp = \EMsimple
-  \errmessage{This command can appear only \inenvironment\temp,
-    not \inenvironment\thisenv}%
-}
-\def\inenvironment#1{%
-  \ifx#1\empty
-    outside of any environment%
-  \else
-    in environment \expandafter\string#1%
-  \fi
-}
-
-% @end foo executes the definition of \Efoo.
-% But first, it executes a specialized version of \checkenv
-%
-\parseargdef\end{%
-  \if 1\csname iscond.#1\endcsname
-  \else
-    % The general wording of \badenverr may not be ideal.
-    \expandafter\checkenv\csname#1\endcsname
-    \csname E#1\endcsname
-    \endgroup
-  \fi
-}
-
-\newhelp\EMsimple{Press RETURN to continue.}
-
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\unskip\hfil\break\hbox{}\ignorespaces}
-
-% @/ allows a line break.
-\let\/=\allowbreak
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=\endofsentencespacefactor\space}
-
-% @! is an end-of-sentence bang.
-\def\!{!\spacefactor=\endofsentencespacefactor\space}
-
-% @? is an end-of-sentence query.
-\def\?{?\spacefactor=\endofsentencespacefactor\space}
-
-% @frenchspacing on|off  says whether to put extra space after punctuation.
-%
-\def\onword{on}
-\def\offword{off}
-%
-\parseargdef\frenchspacing{%
-  \def\temp{#1}%
-  \ifx\temp\onword \plainfrenchspacing
-  \else\ifx\temp\offword \plainnonfrenchspacing
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
-  \fi\fi
-}
-
-% @w prevents a word break.  Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line.  According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0).  If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-% Another complication is that the group might be very large.  This can
-% cause the glue on the previous page to be unduly stretched, because it
-% does not have much material.  In this case, it's better to add an
-% explicit \vfill so that the extra space is at the bottom.  The
-% threshold for doing this is if the group is more than \vfilllimit
-% percent of a page (\vfilllimit can be changed inside of @tex).
-%
-\newbox\groupbox
-\def\vfilllimit{0.7}
-%
-\envdef\group{%
-  \ifnum\catcode`\^^M=\active \else
-    \errhelp = \groupinvalidhelp
-    \errmessage{@group invalid in context where filling is enabled}%
-  \fi
-  \startsavinginserts
-  %
-  \setbox\groupbox = \vtop\bgroup
-    % Do @comment since we are called inside an environment such as
-    % @example, where each end-of-line in the input causes an
-    % end-of-line in the output.  We don't want the end-of-line after
-    % the `@group' to put extra space in the output.  Since @group
-    % should appear on a line by itself (according to the Texinfo
-    % manual), we don't worry about eating any user text.
-    \comment
-}
-%
-% The \vtop produces a box with normal height and large depth; thus, TeX puts
-% \baselineskip glue before it, and (when the next line of text is done)
-% \lineskip glue after it.  Thus, space below is not quite equal to space
-% above.  But it's pretty close.
-\def\Egroup{%
-    % To get correct interline space between the last line of the group
-    % and the first line afterwards, we have to propagate \prevdepth.
-    \endgraf % Not \par, as it may have been set to \lisppar.
-    \global\dimen1 = \prevdepth
-  \egroup           % End the \vtop.
-  \addgroupbox
-  \prevdepth = \dimen1
-  \checkinserts
-}
-
-\def\addgroupbox{
-  % \dimen0 is the vertical size of the group's box.
-  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
-  % \dimen2 is how much space is left on the page (more or less).
-  \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal
-  % if the group doesn't fit on the current page, and it's a big big
-  % group, force a page break.
-  \ifdim \dimen0 > \dimen2
-    \ifdim \pagetotal < \vfilllimit\txipageheight
-      \page
-    \fi
-  \fi
-  \box\groupbox
-}
-
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil  \mil=0.001in
-
-\parseargdef\need{%
-  % Ensure vertical mode, so we don't make a big box in the middle of a
-  % paragraph.
-  \par
-  %
-  % If the @need value is less than one line space, it's useless.
-  \dimen0 = #1\mil
-  \dimen2 = \ht\strutbox
-  \advance\dimen2 by \dp\strutbox
-  \ifdim\dimen0 > \dimen2
-    %
-    % Do a \strut just to make the height of this box be normal, so the
-    % normal leading is inserted relative to the preceding line.
-    % And a page break here is fine.
-    \vtop to #1\mil{\strut\vfil}%
-    %
-    % TeX does not even consider page breaks if a penalty added to the
-    % main vertical list is 10000 or more.  But in order to see if the
-    % empty box we just added fits on the page, we must make it consider
-    % page breaks.  On the other hand, we don't want to actually break the
-    % page after the empty box.  So we use a penalty of 9999.
-    %
-    % There is an extremely small chance that TeX will actually break the
-    % page at this \penalty, if there are no other feasible breakpoints in
-    % sight.  (If the user is using lots of big @group commands, which
-    % almost-but-not-quite fill up a page, TeX will have a hard time doing
-    % good page breaking, for example.)  However, I could not construct an
-    % example where a page broke at this \penalty; if it happens in a real
-    % document, then we can reconsider our strategy.
-    \penalty9999
-    %
-    % Back up by the size of the box, whether we did a page break or not.
-    \kern -#1\mil
-    %
-    % Do not allow a page break right after this kern.
-    \nobreak
-  \fi
-}
-
-% @br   forces paragraph break (and is undocumented).
-
-\let\br = \par
-
-% @page forces the start of a new page.
-%
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
-
-% This defn is used inside nofill environments such as @example.
-\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
-  \leftline{\hskip\leftskip{\rm#1}}}}
-
-% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
-% paragraph.  For more general purposes, use the \margin insertion
-% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
-%
-\newskip\inmarginspacing \inmarginspacing=1cm
-\def\strutdepth{\dp\strutbox}
-%
-\def\doinmargin#1#2{\strut\vadjust{%
-  \nobreak
-  \kern-\strutdepth
-  \vtop to \strutdepth{%
-    \baselineskip=\strutdepth
-    \vss
-    % if you have multiple lines of stuff to put here, you'll need to
-    % make the vbox yourself of the appropriate size.
-    \ifx#1l%
-      \llap{\ignorespaces #2\hskip\inmarginspacing}%
-    \else
-      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
-    \fi
-    \null
-  }%
-}}
-\def\inleftmargin{\doinmargin l}
-\def\inrightmargin{\doinmargin r}
-%
-% @inmargin{TEXT [, RIGHT-TEXT]}
-% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
-% else use TEXT for both).
-%
-\def\inmargin#1{\parseinmargin #1,,\finish}
-\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
-  \setbox0 = \hbox{\ignorespaces #2}%
-  \ifdim\wd0 > 0pt
-    \def\lefttext{#1}%  have both texts
-    \def\righttext{#2}%
-  \else
-    \def\lefttext{#1}%  have only one text
-    \def\righttext{#1}%
-  \fi
-  %
-  \ifodd\pageno
-    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
-  \else
-    \def\temp{\inleftmargin\lefttext}%
-  \fi
-  \temp
-}
-
-% @| inserts a changebar to the left of the current line.  It should
-% surround any changed text.  This approach does *not* work if the
-% change spans more than two lines of output.  To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).  This command
-% is not documented, not supported, and doesn't work.
-%
-\def\|{%
-  % \vadjust can only be used in horizontal mode.
-  \leavevmode
-  %
-  % Append this vertical mode material after the current line in the output.
-  \vadjust{%
-    % We want to insert a rule with the height and depth of the current
-    % leading; that is exactly what \strutbox is supposed to record.
-    \vskip-\baselineskip
-    %
-    % \vadjust-items are inserted at the left edge of the type.  So
-    % the \llap here moves out into the left-hand margin.
-    \llap{%
-      %
-      % For a thicker or thinner bar, change the `1pt'.
-      \vrule height\baselineskip width1pt
-      %
-      % This is the space between the bar and the text.
-      \hskip 12pt
-    }%
-  }%
-}
-
-% @include FILE -- \input text of FILE.
-%
-\def\include{\parseargusing\filenamecatcodes\includezzz}
-\def\includezzz#1{%
-  \pushthisfilestack
-  \def\thisfile{#1}%
-  {%
-    \makevalueexpandable  % we want to expand any @value in FILE.
-    \turnoffactive        % and allow special characters in the expansion
-    \indexnofonts         % Allow `@@' and other weird things in file names.
-    \wlog{texinfo.tex: doing @include of #1^^J}%
-    \edef\temp{\noexpand\input #1 }%
-    %
-    % This trickery is to read FILE outside of a group, in case it makes
-    % definitions, etc.
-    \expandafter
-  }\temp
-  \popthisfilestack
-}
-\def\filenamecatcodes{%
-  \catcode`\\=\other
-  \catcode`~=\other
-  \catcode`^=\other
-  \catcode`_=\other
-  \catcode`|=\other
-  \catcode`<=\other
-  \catcode`>=\other
-  \catcode`+=\other
-  \catcode`-=\other
-  \catcode`\`=\other
-  \catcode`\'=\other
-}
-
-\def\pushthisfilestack{%
-  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
-}
-\def\pushthisfilestackX{%
-  \expandafter\pushthisfilestackY\thisfile\StackTerm
-}
-\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
-  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
-}
-
-\def\popthisfilestack{\errthisfilestackempty}
-\def\errthisfilestackempty{\errmessage{Internal error:
-  the stack of filenames is empty.}}
-%
-\def\thisfile{}
-
-% @center line
-% outputs that line, centered.
-%
-\parseargdef\center{%
-  \ifhmode
-    \let\centersub\centerH
-  \else
-    \let\centersub\centerV
-  \fi
-  \centersub{\hfil \ignorespaces#1\unskip \hfil}%
-  \let\centersub\relax % don't let the definition persist, just in case
-}
-\def\centerH#1{{%
-  \hfil\break
-  \advance\hsize by -\leftskip
-  \advance\hsize by -\rightskip
-  \line{#1}%
-  \break
-}}
-%
-\newcount\centerpenalty
-\def\centerV#1{%
-  % The idea here is the same as in \startdefun, \cartouche, etc.: if
-  % @center is the first thing after a section heading, we need to wipe
-  % out the negative parskip inserted by \sectionheading, but still
-  % prevent a page break here.
-  \centerpenalty = \lastpenalty
-  \ifnum\centerpenalty>10000 \vskip\parskip \fi
-  \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
-  \line{\kern\leftskip #1\kern\rightskip}%
-}
-
-% @sp n   outputs n lines of vertical space
-%
-\parseargdef\sp{\vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore  is another way to write a comment
-%
-\def\comment{\begingroup \catcode`\^^M=\active%
-\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}%
-
-{\catcode`\^^M=\active%
-\gdef\commentxxx#1^^M{\endgroup%
-\futurelet\nexttoken\commentxxxx}%
-\gdef\commentxxxx{\ifx\nexttoken\aftermacro\expandafter\comment\fi}%
-}
-
-\def\c{\begingroup \catcode`\^^M=\active%
-\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
-\cxxx}
-{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
-% See comment in \scanmacro about why the definitions of @c and @comment differ
-
-% @paragraphindent NCHARS
-% We'll use ems for NCHARS, close enough.
-% NCHARS can also be the word `asis' or `none'.
-% We cannot feasibly implement @paragraphindent asis, though.
-%
-\def\asisword{asis} % no translation, these are keywords
-\def\noneword{none}
-%
-\parseargdef\paragraphindent{%
-  \def\temp{#1}%
-  \ifx\temp\asisword
-  \else
-    \ifx\temp\noneword
-      \defaultparindent = 0pt
-    \else
-      \defaultparindent = #1em
-    \fi
-  \fi
-  \parindent = \defaultparindent
-}
-
-% @exampleindent NCHARS
-% We'll use ems for NCHARS like @paragraphindent.
-% It seems @exampleindent asis isn't necessary, but
-% I preserve it to make it similar to @paragraphindent.
-\parseargdef\exampleindent{%
-  \def\temp{#1}%
-  \ifx\temp\asisword
-  \else
-    \ifx\temp\noneword
-      \lispnarrowing = 0pt
-    \else
-      \lispnarrowing = #1em
-    \fi
-  \fi
-}
-
-% @firstparagraphindent WORD
-% If WORD is `none', then suppress indentation of the first paragraph
-% after a section heading.  If WORD is `insert', then do indent at such
-% paragraphs.
-%
-% The paragraph indentation is suppressed or not by calling
-% \suppressfirstparagraphindent, which the sectioning commands do.
-% We switch the definition of this back and forth according to WORD.
-% By default, we suppress indentation.
-%
-\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
-\def\insertword{insert}
-%
-\parseargdef\firstparagraphindent{%
-  \def\temp{#1}%
-  \ifx\temp\noneword
-    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
-  \else\ifx\temp\insertword
-    \let\suppressfirstparagraphindent = \relax
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @firstparagraphindent option `\temp'}%
-  \fi\fi
-}
-
-% Here is how we actually suppress indentation.  Redefine \everypar to
-% \kern backwards by \parindent, and then reset itself to empty.
-%
-% We also make \indent itself not actually do anything until the next
-% paragraph.
-%
-\gdef\dosuppressfirstparagraphindent{%
-  \gdef\indent  {\restorefirstparagraphindent \indent}%
-  \gdef\noindent{\restorefirstparagraphindent \noindent}%
-  \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
-}
-%
-\gdef\restorefirstparagraphindent{%
-  \global\let\indent = \ptexindent
-  \global\let\noindent = \ptexnoindent
-  \global\everypar = {}%
-}
-
-
-% @refill is a no-op.
-\let\refill=\relax
-
-% @setfilename INFO-FILENAME - ignored
-\let\setfilename=\comment
-
-% @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-
-\message{pdf,}
-% adobe `portable' document format
-\newcount\tempnum
-\newcount\lnkcount
-\newtoks\filename
-\newcount\filenamelength
-\newcount\pgn
-\newtoks\toksA
-\newtoks\toksB
-\newtoks\toksC
-\newtoks\toksD
-\newbox\boxA
-\newbox\boxB
-\newcount\countA
-\newif\ifpdf
-\newif\ifpdfmakepagedest
-
-%
-% For LuaTeX
-%
-
-\ifx\luatexversion\thisisundefined
-\else
-  % Escape PDF strings UTF-8 to UTF-16
-  \begingroup
-    \catcode`\%=12
-    \directlua{
-      function UTF16oct(str)
-        tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
-        for c in string.utfvalues(str) do
-          if c < 0x10000 then
-            tex.sprint(
-              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
-                            string.char(0x5c) .. string.char(0x25) .. '03o',
-                            (c / 256), (c % 256)))
-          else
-            c = c - 0x10000
-            local c_hi = c / 1024 + 0xd800
-            local c_lo = c % 1024 + 0xdc00
-            tex.sprint(
-              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
-                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
-                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
-                            string.char(0x5c) .. string.char(0x25) .. '03o',
-                            (c_hi / 256), (c_hi % 256),
-                            (c_lo / 256), (c_lo % 256)))
-          end
-        end
-      end
-    }
-  \endgroup
-  \def\pdfescapestring#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
-  \ifnum\luatexversion>84
-    % For LuaTeX >= 0.85
-    \def\pdfdest{\pdfextension dest}
-    \let\pdfoutput\outputmode
-    \def\pdfliteral{\pdfextension literal}
-    \def\pdfcatalog{\pdfextension catalog}
-    \def\pdftexversion{\numexpr\pdffeedback version\relax}
-    \let\pdfximage\saveimageresource
-    \let\pdfrefximage\useimageresource
-    \let\pdflastximage\lastsavedimageresourceindex
-    \def\pdfendlink{\pdfextension endlink\relax}
-    \def\pdfoutline{\pdfextension outline}
-    \def\pdfstartlink{\pdfextension startlink}
-    \def\pdffontattr{\pdfextension fontattr}
-    \def\pdfobj{\pdfextension obj}
-    \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
-    \let\pdfpagewidth\pagewidth
-    \let\pdfpageheight\pageheight
-    \edef\pdfhorigin{\pdfvariable horigin}
-    \edef\pdfvorigin{\pdfvariable vorigin}
-  \fi
-\fi
-
-% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
-% can be set).  So we test for \relax and 0 as well as being undefined.
-\ifx\pdfoutput\thisisundefined
-\else
-  \ifx\pdfoutput\relax
-  \else
-    \ifcase\pdfoutput
-    \else
-      \pdftrue
-    \fi
-  \fi
-\fi
-
-% PDF uses PostScript string constants for the names of xref targets,
-% for display in the outlines, and in other places.  Thus, we have to
-% double any backslashes.  Otherwise, a name like "\node" will be
-% interpreted as a newline (\n), followed by o, d, e.  Not good.
-% 
-% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
-% related messages.  The final outcome is that it is up to the TeX user
-% to double the backslashes and otherwise make the string valid, so
-% that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
-% do this reliably, so we use it.
-
-% #1 is a control sequence in which to do the replacements,
-% which we \xdef.
-\def\txiescapepdf#1{%
-  \ifx\pdfescapestring\thisisundefined
-    % No primitive available; should we give a warning or log?
-    % Many times it won't matter.
-    \xdef#1{#1}%
-  \else
-    % The expandable \pdfescapestring primitive escapes parentheses,
-    % backslashes, and other special chars.
-    \xdef#1{\pdfescapestring{#1}}%
-  \fi
-}
-
-\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
-with PDF output, and none of those formats could be found.  (.eps cannot
-be supported due to the design of the PDF format; use regular TeX (DVI
-output) for that.)}
-
-\ifpdf
-  %
-  % Color manipulation macros using ideas from pdfcolor.tex,
-  % except using rgb instead of cmyk; the latter is said to render as a
-  % very dark gray on-screen and a very dark halftone in print, instead
-  % of actual black. The dark red here is dark enough to print on paper as
-  % nearly black, but still distinguishable for online viewing.  We use
-  % black by default, though.
-  \def\rgbDarkRed{0.50 0.09 0.12}
-  \def\rgbBlack{0 0 0}
-  %
-  % rg sets the color for filling (usual text, etc.);
-  % RG sets the color for stroking (thin rules, e.g., normal _'s).
-  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
-  %
-  % Set color, and create a mark which defines \thiscolor accordingly,
-  % so that \makeheadline knows which color to restore.
-  \def\setcolor#1{%
-    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
-    \domark
-    \pdfsetcolor{#1}%
-  }
-  %
-  \def\maincolor{\rgbBlack}
-  \pdfsetcolor{\maincolor}
-  \edef\thiscolor{\maincolor}
-  \def\lastcolordefs{}
-  %
-  \def\makefootline{%
-    \baselineskip24pt
-    \line{\pdfsetcolor{\maincolor}\the\footline}%
-  }
-  %
-  \def\makeheadline{%
-    \vbox to 0pt{%
-      \vskip-22.5pt
-      \line{%
-        \vbox to8.5pt{}%
-        % Extract \thiscolor definition from the marks.
-        \getcolormarks
-        % Typeset the headline with \maincolor, then restore the color.
-        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
-      }%
-      \vss
-    }%
-    \nointerlineskip
-  }
-  %
-  %
-  \pdfcatalog{/PageMode /UseOutlines}
-  %
-  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
-  \def\dopdfimage#1#2#3{%
-    \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
-    \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
-    %
-    % pdftex (and the PDF format) support .pdf, .png, .jpg (among
-    % others).  Let's try in that order, PDF first since if
-    % someone has a scalable image, presumably better to use that than a
-    % bitmap.
-    \let\pdfimgext=\empty
-    \begingroup
-      \openin 1 #1.pdf \ifeof 1
-        \openin 1 #1.PDF \ifeof 1
-          \openin 1 #1.png \ifeof 1
-            \openin 1 #1.jpg \ifeof 1
-              \openin 1 #1.jpeg \ifeof 1
-                \openin 1 #1.JPG \ifeof 1
-                  \errhelp = \nopdfimagehelp
-                  \errmessage{Could not find image file #1 for pdf}%
-                \else \gdef\pdfimgext{JPG}%
-                \fi
-              \else \gdef\pdfimgext{jpeg}%
-              \fi
-            \else \gdef\pdfimgext{jpg}%
-            \fi
-          \else \gdef\pdfimgext{png}%
-          \fi
-        \else \gdef\pdfimgext{PDF}%
-        \fi
-      \else \gdef\pdfimgext{pdf}%
-      \fi
-      \closein 1
-    \endgroup
-    %
-    % without \immediate, ancient pdftex seg faults when the same image is
-    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
-    \ifnum\pdftexversion < 14
-      \immediate\pdfimage
-    \else
-      \immediate\pdfximage
-    \fi
-      \ifdim \wd0 >0pt width \pdfimagewidth \fi
-      \ifdim \wd2 >0pt height \pdfimageheight \fi
-      \ifnum\pdftexversion<13
-         #1.\pdfimgext
-       \else
-         {#1.\pdfimgext}%
-       \fi
-    \ifnum\pdftexversion < 14 \else
-      \pdfrefximage \pdflastximage
-    \fi}
-  %
-  \def\pdfmkdest#1{{%
-    % We have to set dummies so commands such as @code, and characters
-    % such as \, aren't expanded when present in a section title.
-    \indexnofonts
-    \makevalueexpandable
-    \turnoffactive
-    % Use ASCII approximations in destination names.
-    \passthroughcharsfalse
-    \def\pdfdestname{#1}%
-    \txiescapepdf\pdfdestname
-    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
-  }}
-  %
-  % used to mark target names; must be expandable.
-  \def\pdfmkpgn#1{#1}
-  %
-  % by default, use black for everything.
-  \def\urlcolor{\rgbBlack}
-  \def\linkcolor{\rgbBlack}
-  \def\endlink{\setcolor{\maincolor}\pdfendlink}
-  %
-  % Adding outlines to PDF; macros for calculating structure of outlines
-  % come from Petr Olsak
-  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
-    \else \csname#1\endcsname \fi}
-  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
-    \advance\tempnum by 1
-    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
-  %
-  % #1 is the section text, which is what will be displayed in the
-  % outline by the pdf viewer.  #2 is the pdf expression for the number
-  % of subentries (or empty, for subsubsections).  #3 is the node text,
-  % which might be empty if this toc entry had no corresponding node.
-  % #4 is the page number
-  %
-  \def\dopdfoutline#1#2#3#4{%
-    % Generate a link to the node text if that exists; else, use the
-    % page number.  We could generate a destination for the section
-    % text in the case where a section has no node, but it doesn't
-    % seem worth the trouble, since most documents are normally structured.
-    {
-      \ifx\luatexversion\thisisundefined \else
-        \turnoffactive % LuaTeX can use Unicode strings for PDF
-      \fi
-      \edef\pdfoutlinedest{#3}%
-      \ifx\pdfoutlinedest\empty
-        \def\pdfoutlinedest{#4}%
-      \else
-        \txiescapepdf\pdfoutlinedest
-      \fi
-      %
-      % Also escape PDF chars in the display string.
-      \bgroup
-        \ifx \declaredencoding \latone
-          % The PDF format can use an extended form of Latin-1 in bookmark
-          % strings.  See Appendix D of the PDF Reference, Sixth Edition, for
-          % the "PDFDocEncoding".
-          \passthroughcharstrue
-        \fi
-        \ifx \declaredencoding \utfeight
-          % TODO: the PDF format can use UTF-16 in bookmark strings, but the
-          % code for this isn't done yet.
-        \fi
-        \globaldefs=1
-        \edef\pdfoutlinetext{#1}%
-        \txiescapepdf\pdfoutlinetext
-      \egroup
-      %
-      \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
-    }
-  }
-  %
-  \def\pdfmakeoutlines{%
-    \begingroup
-      % Read toc silently, to get counts of subentries for \pdfoutline.
-      \def\partentry##1##2##3##4{}% ignore parts in the outlines
-      \def\numchapentry##1##2##3##4{%
-       \def\thischapnum{##2}%
-       \def\thissecnum{0}%
-       \def\thissubsecnum{0}%
-      }%
-      \def\numsecentry##1##2##3##4{%
-       \advancenumber{chap\thischapnum}%
-       \def\thissecnum{##2}%
-       \def\thissubsecnum{0}%
-      }%
-      \def\numsubsecentry##1##2##3##4{%
-       \advancenumber{sec\thissecnum}%
-       \def\thissubsecnum{##2}%
-      }%
-      \def\numsubsubsecentry##1##2##3##4{%
-       \advancenumber{subsec\thissubsecnum}%
-      }%
-      \def\thischapnum{0}%
-      \def\thissecnum{0}%
-      \def\thissubsecnum{0}%
-      %
-      % use \def rather than \let here because we redefine \chapentry et
-      % al. a second time, below.
-      \def\appentry{\numchapentry}%
-      \def\appsecentry{\numsecentry}%
-      \def\appsubsecentry{\numsubsecentry}%
-      \def\appsubsubsecentry{\numsubsubsecentry}%
-      \def\unnchapentry{\numchapentry}%
-      \def\unnsecentry{\numsecentry}%
-      \def\unnsubsecentry{\numsubsecentry}%
-      \def\unnsubsubsecentry{\numsubsubsecentry}%
-      \readdatafile{toc}%
-      %
-      % Read toc second time, this time actually producing the outlines.
-      % The `-' means take the \expnumber as the absolute number of
-      % subentries, which we calculated on our first read of the .toc above.
-      %
-      % We use the node names as the destinations.
-      \def\numchapentry##1##2##3##4{%
-        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
-      \def\numsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
-      \def\numsubsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
-      \def\numsubsubsecentry##1##2##3##4{% count is always zero
-        \dopdfoutline{##1}{}{##3}{##4}}%
-      %
-      % PDF outlines are displayed using system fonts, instead of
-      % document fonts.  Therefore we cannot use special characters,
-      % since the encoding is unknown.  For example, the eogonek from
-      % Latin 2 (0xea) gets translated to a | character.  Info from
-      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
-      %
-      % TODO this right, we have to translate 8-bit characters to
-      % their "best" equivalent, based on the @documentencoding.  Too
-      % much work for too little return.  Just use the ASCII equivalents
-      % we use for the index sort strings.
-      % 
-      \indexnofonts
-      \setupdatafile
-      % We can have normal brace characters in the PDF outlines, unlike
-      % Texinfo index files.  So set that up.
-      \def\{{\lbracecharliteral}%
-      \def\}{\rbracecharliteral}%
-      \catcode`\\=\active \otherbackslash
-      \input \tocreadfilename
-    \endgroup
-  }
-  {\catcode`[=1 \catcode`]=2
-   \catcode`{=\other \catcode`}=\other
-   \gdef\lbracecharliteral[{]%
-   \gdef\rbracecharliteral[}]%
-  ]
-  %
-  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
-    \ifx\PP\D\let\nextsp\relax
-    \else\let\nextsp\skipspaces
-      \addtokens{\filename}{\PP}%
-      \advance\filenamelength by 1
-    \fi
-    \nextsp}
-  \def\getfilename#1{%
-    \filenamelength=0
-    % If we don't expand the argument now, \skipspaces will get
-    % snagged on things like "@value{foo}".
-    \edef\temp{#1}%
-    \expandafter\skipspaces\temp|\relax
-  }
-  \ifnum\pdftexversion < 14
-    \let \startlink \pdfannotlink
-  \else
-    \let \startlink \pdfstartlink
-  \fi
-  % make a live url in pdf output.
-  \def\pdfurl#1{%
-    \begingroup
-      % it seems we really need yet another set of dummies; have not
-      % tried to figure out what each command should do in the context
-      % of @url.  for now, just make @/ a no-op, that's the only one
-      % people have actually reported a problem with.
-      %
-      \normalturnoffactive
-      \def\@{@}%
-      \let\/=\empty
-      \makevalueexpandable
-      % do we want to go so far as to use \indexnofonts instead of just
-      % special-casing \var here?
-      \def\var##1{##1}%
-      %
-      \leavevmode\setcolor{\urlcolor}%
-      \startlink attr{/Border [0 0 0]}%
-        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
-    \endgroup}
-  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
-  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
-  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
-  \def\maketoks{%
-    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
-    \ifx\first0\adn0
-    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
-    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
-    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
-    \else
-      \ifnum0=\countA\else\makelink\fi
-      \ifx\first.\let\next=\done\else
-        \let\next=\maketoks
-        \addtokens{\toksB}{\the\toksD}
-        \ifx\first,\addtokens{\toksB}{\space}\fi
-      \fi
-    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-    \next}
-  \def\makelink{\addtokens{\toksB}%
-    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
-  \def\pdflink#1{%
-    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
-    \setcolor{\linkcolor}#1\endlink}
-  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\else
-  % non-pdf mode
-  \let\pdfmkdest = \gobble
-  \let\pdfurl = \gobble
-  \let\endlink = \relax
-  \let\setcolor = \gobble
-  \let\pdfsetcolor = \gobble
-  \let\pdfmakeoutlines = \relax
-\fi  % \ifx\pdfoutput
-
-%
-% For XeTeX
-%
-\newif\iftxiuseunicodedestname
-\ifx\XeTeXrevision\thisisundefined
-\else
-  %
-  % XeTeX version check
-  %
-  \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99995}>-1
-    % XeTeX 0.99995+ contains xdvipdfmx 20160307+.
-    % It can handle Unicode destination name for PDF.
-    \txiuseunicodedestnametrue
-  \else
-    % XeTeX < 0.99995 can not handle Unicode destination name for PDF
-    % because xdvipdfmx 20150315 has UTF-16 convert issue.
-    % It fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
-    \txiuseunicodedestnamefalse
-  \fi
-  %
-  % PDF outline support
-  %
-  % Emulate the primitive of pdfTeX
-  \def\pdfdest name#1 xyz{%
-    \special{pdf:dest (name#1) [@thispage /XYZ @xpos @ypos]}%
-  }
-  \def\pdfmkdest#1{{%
-    % We have to set dummies so commands such as @code, and characters
-    % such as \, aren't expanded when present in a section title.
-    \indexnofonts
-    \iftxiuseunicodedestname
-      \def\pdfdestname{#1}% Pass through Unicode characters.
-    \else
-      \edef\pdfdestname{#1}% Replace Unicode characters to ASCII.
-    \fi
-    \turnoffactive
-    \makevalueexpandable
-    \txiescapepdf\pdfdestname
-    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
-  }}
-  %
-  \def\dopdfoutline#1#2#3#4{%
-    \iftxiuseunicodedestname
-      \def\pdfoutlinedest{#3}% Pass through Unicode characters.
-    \else
-      \edef\pdfoutlinedest{#3}% Replace Unicode characters to ASCII.
-    \fi
-    \ifx\pdfoutlinedest\empty
-      \def\pdfoutlinedest{#4}%
-    \fi
-    {
-      \turnoffactive
-      \txiescapepdf\pdfoutlinedest
-      \edef\pdfoutlinetext{#1}%
-      \txiescapepdf\pdfoutlinetext
-      %
-      \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
-        << /S /GoTo /D (name\pdfoutlinedest) >> >> }%
-    }
-  }
-  %
-  \def\pdfmakeoutlines{%
-    \begingroup
-      %
-      % In the case of XeTeX, counts of subentries is not necesary.
-      % Therefore, read toc only once.
-      %
-      % We use the node names as the destinations.
-      \def\partentry##1##2##3##4{}% ignore parts in the outlines
-      \def\numchapentry##1##2##3##4{%
-        \dopdfoutline{##1}{1}{##3}{##4}}%
-      \def\numsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{2}{##3}{##4}}%
-      \def\numsubsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{3}{##3}{##4}}%
-      \def\numsubsubsecentry##1##2##3##4{%
-        \dopdfoutline{##1}{4}{##3}{##4}}%
-      %
-      \let\appentry\numchapentry%
-      \let\appsecentry\numsecentry%
-      \let\appsubsecentry\numsubsecentry%
-      \let\appsubsubsecentry\numsubsubsecentry%
-      \let\unnchapentry\numchapentry%
-      \let\unnsecentry\numsecentry%
-      \let\unnsubsecentry\numsubsecentry%
-      \let\unnsubsubsecentry\numsubsubsecentry%
-      %
-      % In the case of XeTeX, xdvipdfmx converts strings to UTF-16.
-      % Therefore, the encoding and the language may not be considered.
-      %
-      \indexnofonts
-      \setupdatafile
-      % We can have normal brace characters in the PDF outlines, unlike
-      % Texinfo index files.  So set that up.
-      \def\{{\lbracecharliteral}%
-      \def\}{\rbracecharliteral}%
-      \catcode`\\=\active \otherbackslash
-      \input \tocreadfilename
-    \endgroup
-  }
-  {\catcode`[=1 \catcode`]=2
-   \catcode`{=\other \catcode`}=\other
-   \gdef\lbracecharliteral[{]%
-   \gdef\rbracecharliteral[}]%
-  ]
-
-  \special{pdf:docview << /PageMode /UseOutlines >> }
-  % ``\special{pdf:tounicode ...}'' is not necessary
-  % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
-  % However, due to UTF-16 convert issue of xdvipdfmx 20150315,
-  % ``\special{pdf:dest ...}'' can not handle non-ASCII strings.
-  % It fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
-%
-  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
-    \ifx\PP\D\let\nextsp\relax
-    \else\let\nextsp\skipspaces
-      \addtokens{\filename}{\PP}%
-      \advance\filenamelength by 1
-    \fi
-    \nextsp}
-  \def\getfilename#1{%
-    \filenamelength=0
-    % If we don't expand the argument now, \skipspaces will get
-    % snagged on things like "@value{foo}".
-    \edef\temp{#1}%
-    \expandafter\skipspaces\temp|\relax
-  }
-  % make a live url in pdf output.
-  \def\pdfurl#1{%
-    \begingroup
-      % it seems we really need yet another set of dummies; have not
-      % tried to figure out what each command should do in the context
-      % of @url.  for now, just make @/ a no-op, that's the only one
-      % people have actually reported a problem with.
-      %
-      \normalturnoffactive
-      \def\@{@}%
-      \let\/=\empty
-      \makevalueexpandable
-      % do we want to go so far as to use \indexnofonts instead of just
-      % special-casing \var here?
-      \def\var##1{##1}%
-      %
-      \leavevmode\setcolor{\urlcolor}%
-      \special{pdf:bann << /Border [0 0 0]
-        /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
-    \endgroup}
-  \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
-  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
-  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
-  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
-  \def\maketoks{%
-    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
-    \ifx\first0\adn0
-    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
-    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
-    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
-    \else
-      \ifnum0=\countA\else\makelink\fi
-      \ifx\first.\let\next=\done\else
-        \let\next=\maketoks
-        \addtokens{\toksB}{\the\toksD}
-        \ifx\first,\addtokens{\toksB}{\space}\fi
-      \fi
-    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-    \next}
-  \def\makelink{\addtokens{\toksB}%
-    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
-  \def\pdflink#1{%
-    \special{pdf:bann << /Border [0 0 0]
-      /Type /Annot /Subtype /Link /A << /S /GoTo /D (name#1) >> >>}%
-    \setcolor{\linkcolor}#1\endlink}
-  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-%
-  %
-  % @image support
-  %
-  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
-  \def\doxeteximage#1#2#3{%
-    \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
-    \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
-    %
-    % XeTeX (and the PDF format) support .pdf, .png, .jpg (among
-    % others).  Let's try in that order, PDF first since if
-    % someone has a scalable image, presumably better to use that than a
-    % bitmap.
-    \let\xeteximgext=\empty
-    \begingroup
-      \openin 1 #1.pdf \ifeof 1
-        \openin 1 #1.PDF \ifeof 1
-          \openin 1 #1.png \ifeof 1
-            \openin 1 #1.jpg \ifeof 1
-              \openin 1 #1.jpeg \ifeof 1
-                \openin 1 #1.JPG \ifeof 1
-                  \errmessage{Could not find image file #1 for XeTeX}%
-                \else \gdef\xeteximgext{JPG}%
-                \fi
-              \else \gdef\xeteximgext{jpeg}%
-              \fi
-            \else \gdef\xeteximgext{jpg}%
-            \fi
-          \else \gdef\xeteximgext{png}%
-          \fi
-        \else \gdef\xeteximgext{PDF}%
-        \fi
-      \else \gdef\xeteximgext{pdf}%
-      \fi
-      \closein 1
-    \endgroup
-    %
-    \def\xetexpdfext{pdf}%
-    \ifx\xeteximgext\xetexpdfext
-      \XeTeXpdffile "#1".\xeteximgext ""
-    \else
-      \def\xetexpdfext{PDF}%
-      \ifx\xeteximgext\xetexpdfext
-        \XeTeXpdffile "#1".\xeteximgext ""
-      \else
-        \XeTeXpicfile "#1".\xeteximgext ""
-      \fi
-    \fi
-    \ifdim \wd0 >0pt width \xeteximagewidth \fi
-    \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
-  }
-\fi
-
-\message{fonts,}
-
-% Change the current font style to #1, remembering it in \curfontstyle.
-% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
-% italics, not bold italics.
-%
-\def\setfontstyle#1{%
-  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
-  \csname ten#1\endcsname  % change the current font
-}
-
-% Select #1 fonts with the current style.
-%
-\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
-
-\def\rm{\fam=0 \setfontstyle{rm}}
-\def\it{\fam=\itfam \setfontstyle{it}}
-\def\sl{\fam=\slfam \setfontstyle{sl}}
-\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
-\def\tt{\fam=\ttfam \setfontstyle{tt}}
-
-% Unfortunately, we have to override this for titles and the like, since
-% in those cases "rm" is bold.  Sigh.
-\def\rmisbold{\rm\def\curfontstyle{bf}}
-
-% Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf.
-\newfam\sffam
-\def\sf{\fam=\sffam \setfontstyle{sf}}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-% We don't need math for this font style.
-\def\ttsl{\setfontstyle{ttsl}}
-
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly.  There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-% can get a sort of poor man's double spacing by redefining this.
-\def\baselinefactor{1}
-%
-\newdimen\textleading
-\def\setleading#1{%
-  \dimen0 = #1\relax
-  \normalbaselineskip = \baselinefactor\dimen0
-  \normallineskip = \lineskipfactor\normalbaselineskip
-  \normalbaselines
-  \setbox\strutbox =\hbox{%
-    \vrule width0pt height\strutheightpercent\baselineskip
-                    depth \strutdepthpercent \baselineskip
-  }%
-}
-
-% PDF CMaps.  See also LaTeX's t1.cmap.
-%
-% do nothing with this by default.
-\expandafter\let\csname cmapOT1\endcsname\gobble
-\expandafter\let\csname cmapOT1IT\endcsname\gobble
-\expandafter\let\csname cmapOT1TT\endcsname\gobble
-
-% if we are producing pdf, and we have \pdffontattr, then define cmaps.
-% (\pdffontattr was introduced many years ago, but people still run
-% older pdftex's; it's easy to conditionalize, so we do.)
-\ifpdf \ifx\pdffontattr\thisisundefined \else
-  \begingroup
-    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
-    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
-%%DocumentNeededResources: ProcSet (CIDInit)
-%%IncludeResource: ProcSet (CIDInit)
-%%BeginResource: CMap (TeX-OT1-0)
-%%Title: (TeX-OT1-0 TeX OT1 0)
-%%Version: 1.000
-%%EndComments
-/CIDInit /ProcSet findresource begin
-12 dict begin
-begincmap
-/CIDSystemInfo
-<< /Registry (TeX)
-/Ordering (OT1)
-/Supplement 0
->> def
-/CMapName /TeX-OT1-0 def
-/CMapType 2 def
-1 begincodespacerange
-<00> <7F>
-endcodespacerange
-8 beginbfrange
-<00> <01> <0393>
-<09> <0A> <03A8>
-<23> <26> <0023>
-<28> <3B> <0028>
-<3F> <5B> <003F>
-<5D> <5E> <005D>
-<61> <7A> <0061>
-<7B> <7C> <2013>
-endbfrange
-40 beginbfchar
-<02> <0398>
-<03> <039B>
-<04> <039E>
-<05> <03A0>
-<06> <03A3>
-<07> <03D2>
-<08> <03A6>
-<0B> <00660066>
-<0C> <00660069>
-<0D> <0066006C>
-<0E> <006600660069>
-<0F> <00660066006C>
-<10> <0131>
-<11> <0237>
-<12> <0060>
-<13> <00B4>
-<14> <02C7>
-<15> <02D8>
-<16> <00AF>
-<17> <02DA>
-<18> <00B8>
-<19> <00DF>
-<1A> <00E6>
-<1B> <0153>
-<1C> <00F8>
-<1D> <00C6>
-<1E> <0152>
-<1F> <00D8>
-<21> <0021>
-<22> <201D>
-<27> <2019>
-<3C> <00A1>
-<3D> <003D>
-<3E> <00BF>
-<5C> <201C>
-<5F> <02D9>
-<60> <2018>
-<7D> <02DD>
-<7E> <007E>
-<7F> <00A8>
-endbfchar
-endcmap
-CMapName currentdict /CMap defineresource pop
-end
-end
-%%EndResource
-%%EOF
-    }\endgroup
-  \expandafter\edef\csname cmapOT1\endcsname#1{%
-    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
-  }%
-%
-% \cmapOT1IT
-  \begingroup
-    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
-    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
-%%DocumentNeededResources: ProcSet (CIDInit)
-%%IncludeResource: ProcSet (CIDInit)
-%%BeginResource: CMap (TeX-OT1IT-0)
-%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
-%%Version: 1.000
-%%EndComments
-/CIDInit /ProcSet findresource begin
-12 dict begin
-begincmap
-/CIDSystemInfo
-<< /Registry (TeX)
-/Ordering (OT1IT)
-/Supplement 0
->> def
-/CMapName /TeX-OT1IT-0 def
-/CMapType 2 def
-1 begincodespacerange
-<00> <7F>
-endcodespacerange
-8 beginbfrange
-<00> <01> <0393>
-<09> <0A> <03A8>
-<25> <26> <0025>
-<28> <3B> <0028>
-<3F> <5B> <003F>
-<5D> <5E> <005D>
-<61> <7A> <0061>
-<7B> <7C> <2013>
-endbfrange
-42 beginbfchar
-<02> <0398>
-<03> <039B>
-<04> <039E>
-<05> <03A0>
-<06> <03A3>
-<07> <03D2>
-<08> <03A6>
-<0B> <00660066>
-<0C> <00660069>
-<0D> <0066006C>
-<0E> <006600660069>
-<0F> <00660066006C>
-<10> <0131>
-<11> <0237>
-<12> <0060>
-<13> <00B4>
-<14> <02C7>
-<15> <02D8>
-<16> <00AF>
-<17> <02DA>
-<18> <00B8>
-<19> <00DF>
-<1A> <00E6>
-<1B> <0153>
-<1C> <00F8>
-<1D> <00C6>
-<1E> <0152>
-<1F> <00D8>
-<21> <0021>
-<22> <201D>
-<23> <0023>
-<24> <00A3>
-<27> <2019>
-<3C> <00A1>
-<3D> <003D>
-<3E> <00BF>
-<5C> <201C>
-<5F> <02D9>
-<60> <2018>
-<7D> <02DD>
-<7E> <007E>
-<7F> <00A8>
-endbfchar
-endcmap
-CMapName currentdict /CMap defineresource pop
-end
-end
-%%EndResource
-%%EOF
-    }\endgroup
-  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
-    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
-  }%
-%
-% \cmapOT1TT
-  \begingroup
-    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
-    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
-%%DocumentNeededResources: ProcSet (CIDInit)
-%%IncludeResource: ProcSet (CIDInit)
-%%BeginResource: CMap (TeX-OT1TT-0)
-%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
-%%Version: 1.000
-%%EndComments
-/CIDInit /ProcSet findresource begin
-12 dict begin
-begincmap
-/CIDSystemInfo
-<< /Registry (TeX)
-/Ordering (OT1TT)
-/Supplement 0
->> def
-/CMapName /TeX-OT1TT-0 def
-/CMapType 2 def
-1 begincodespacerange
-<00> <7F>
-endcodespacerange
-5 beginbfrange
-<00> <01> <0393>
-<09> <0A> <03A8>
-<21> <26> <0021>
-<28> <5F> <0028>
-<61> <7E> <0061>
-endbfrange
-32 beginbfchar
-<02> <0398>
-<03> <039B>
-<04> <039E>
-<05> <03A0>
-<06> <03A3>
-<07> <03D2>
-<08> <03A6>
-<0B> <2191>
-<0C> <2193>
-<0D> <0027>
-<0E> <00A1>
-<0F> <00BF>
-<10> <0131>
-<11> <0237>
-<12> <0060>
-<13> <00B4>
-<14> <02C7>
-<15> <02D8>
-<16> <00AF>
-<17> <02DA>
-<18> <00B8>
-<19> <00DF>
-<1A> <00E6>
-<1B> <0153>
-<1C> <00F8>
-<1D> <00C6>
-<1E> <0152>
-<1F> <00D8>
-<20> <2423>
-<27> <2019>
-<60> <2018>
-<7F> <00A8>
-endbfchar
-endcmap
-CMapName currentdict /CMap defineresource pop
-end
-end
-%%EndResource
-%%EOF
-    }\endgroup
-  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
-    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
-  }%
-\fi\fi
-
-
-% Set the font macro #1 to the font named \fontprefix#2.
-% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
-% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
-% Example:
-% #1 = \textrm
-% #2 = \rmshape
-% #3 = 10
-% #4 = \mainmagstep
-% #5 = OT1
-%
-\def\setfont#1#2#3#4#5{%
-  \font#1=\fontprefix#2#3 scaled #4
-  \csname cmap#5\endcsname#1%
-}
-% This is what gets called when #5 of \setfont is empty.
-\let\cmap\gobble
-%
-% (end of cmaps)
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\thisisundefined
-\def\fontprefix{cm}
-\fi
-% Support font families that don't use the same naming scheme as CM.
-\def\rmshape{r}
-\def\rmbshape{bx}               % where the normal face is bold
-\def\bfshape{b}
-\def\bxshape{bx}
-\def\ttshape{tt}
-\def\ttbshape{tt}
-\def\ttslshape{sltt}
-\def\itshape{ti}
-\def\itbshape{bxti}
-\def\slshape{sl}
-\def\slbshape{bxsl}
-\def\sfshape{ss}
-\def\sfbshape{ss}
-\def\scshape{csc}
-\def\scbshape{csc}
-
-% Definitions for a main text size of 11pt.  (The default in Texinfo.)
-%
-\def\definetextfontsizexi{%
-% Text fonts (11.2pt, magstep1).
-\def\textnominalsize{11pt}
-\edef\mainmagstep{\magstephalf}
-\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
-\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
-\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
-\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
-\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
-\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
-\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-\def\textecsize{1095}
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstep1}{OT1}
-\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
-\setfont\defsl\slshape{10}{\magstep1}{OT1TT}
-\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf
-\let\tenttsl=\defttsl \let\tensl=\defsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\def\smallnominalsize{9pt}
-\setfont\smallrm\rmshape{9}{1000}{OT1}
-\setfont\smalltt\ttshape{9}{1000}{OT1TT}
-\setfont\smallbf\bfshape{10}{900}{OT1}
-\setfont\smallit\itshape{9}{1000}{OT1IT}
-\setfont\smallsl\slshape{9}{1000}{OT1}
-\setfont\smallsf\sfshape{9}{1000}{OT1}
-\setfont\smallsc\scshape{10}{900}{OT1}
-\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-\def\smallecsize{0900}
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}{OT1}
-\setfont\smallertt\ttshape{8}{1000}{OT1TT}
-\setfont\smallerbf\bfshape{10}{800}{OT1}
-\setfont\smallerit\itshape{8}{1000}{OT1IT}
-\setfont\smallersl\slshape{8}{1000}{OT1}
-\setfont\smallersf\sfshape{8}{1000}{OT1}
-\setfont\smallersc\scshape{10}{800}{OT1}
-\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-\def\smallerecsize{0800}
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
-\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
-\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
-\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
-\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
-\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\titleecsize{2074}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\def\chapnominalsize{17pt}
-\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
-\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
-\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
-\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
-\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
-\setfont\chapsf\sfbshape{17}{1000}{OT1}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-\def\chapecsize{1728}
-
-% Section fonts (14.4pt).
-\def\secnominalsize{14pt}
-\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
-\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
-\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
-\setfont\secsl\slbshape{10}{\magstep2}{OT1}
-\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
-\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
-\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}{OT1}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-\def\sececsize{1440}
-
-% Subsection fonts (13.15pt).
-\def\ssecnominalsize{13pt}
-\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
-\setfont\ssecit\itbshape{10}{1315}{OT1IT}
-\setfont\ssecsl\slbshape{10}{1315}{OT1}
-\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
-\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1315}{OT1}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-\def\ssececsize{1200}
-
-% Reduced fonts for @acro in text (10pt).
-\def\reducednominalsize{10pt}
-\setfont\reducedrm\rmshape{10}{1000}{OT1}
-\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
-\setfont\reducedbf\bfshape{10}{1000}{OT1}
-\setfont\reducedit\itshape{10}{1000}{OT1IT}
-\setfont\reducedsl\slshape{10}{1000}{OT1}
-\setfont\reducedsf\sfshape{10}{1000}{OT1}
-\setfont\reducedsc\scshape{10}{1000}{OT1}
-\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
-\font\reducedi=cmmi10
-\font\reducedsy=cmsy10
-\def\reducedecsize{1000}
-
-\textleading = 13.2pt % line spacing for 11pt CM
-\textfonts            % reset the current fonts
-\rm
-} % end of 11pt text font size definitions, \definetextfontsizexi
-
-
-% Definitions to make the main text be 10pt Computer Modern, with
-% section, chapter, etc., sizes following suit.  This is for the GNU
-% Press printing of the Emacs 22 manual.  Maybe other manuals in the
-% future.  Used with @smallbook, which sets the leading to 12pt.
-%
-\def\definetextfontsizex{%
-% Text fonts (10pt).
-\def\textnominalsize{10pt}
-\edef\mainmagstep{1000}
-\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
-\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
-\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
-\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
-\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
-\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
-\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-\def\textecsize{1000}
-
-% A few fonts for @defun names and args.
-\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
-\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
-\setfont\defsl\slshape{10}{\magstephalf}{OT1TT}
-\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf
-\let\tensl=\defsl \let\tenttsl=\defttsl \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\def\smallnominalsize{9pt}
-\setfont\smallrm\rmshape{9}{1000}{OT1}
-\setfont\smalltt\ttshape{9}{1000}{OT1TT}
-\setfont\smallbf\bfshape{10}{900}{OT1}
-\setfont\smallit\itshape{9}{1000}{OT1IT}
-\setfont\smallsl\slshape{9}{1000}{OT1}
-\setfont\smallsf\sfshape{9}{1000}{OT1}
-\setfont\smallsc\scshape{10}{900}{OT1}
-\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-\def\smallecsize{0900}
-
-% Fonts for small examples (8pt).
-\def\smallernominalsize{8pt}
-\setfont\smallerrm\rmshape{8}{1000}{OT1}
-\setfont\smallertt\ttshape{8}{1000}{OT1TT}
-\setfont\smallerbf\bfshape{10}{800}{OT1}
-\setfont\smallerit\itshape{8}{1000}{OT1IT}
-\setfont\smallersl\slshape{8}{1000}{OT1}
-\setfont\smallersf\sfshape{8}{1000}{OT1}
-\setfont\smallersc\scshape{10}{800}{OT1}
-\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-\def\smallerecsize{0800}
-
-% Fonts for title page (20.4pt):
-\def\titlenominalsize{20pt}
-\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
-\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
-\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
-\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
-\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
-\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\titleecsize{2074}
-
-% Chapter fonts (14.4pt).
-\def\chapnominalsize{14pt}
-\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
-\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
-\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
-\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
-\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
-\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
-\let\chapbf\chaprm
-\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
-\font\chapi=cmmi12 scaled \magstep1
-\font\chapsy=cmsy10 scaled \magstep2
-\def\chapecsize{1440}
-
-% Section fonts (12pt).
-\def\secnominalsize{12pt}
-\setfont\secrm\rmbshape{12}{1000}{OT1}
-\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
-\setfont\secsl\slbshape{10}{\magstep1}{OT1}
-\setfont\sectt\ttbshape{12}{1000}{OT1TT}
-\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
-\setfont\secsf\sfbshape{12}{1000}{OT1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep1}{OT1}
-\font\seci=cmmi12
-\font\secsy=cmsy10 scaled \magstep1
-\def\sececsize{1200}
-
-% Subsection fonts (10pt).
-\def\ssecnominalsize{10pt}
-\setfont\ssecrm\rmbshape{10}{1000}{OT1}
-\setfont\ssecit\itbshape{10}{1000}{OT1IT}
-\setfont\ssecsl\slbshape{10}{1000}{OT1}
-\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
-\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
-\setfont\ssecsf\sfbshape{10}{1000}{OT1}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{1000}{OT1}
-\font\sseci=cmmi10
-\font\ssecsy=cmsy10
-\def\ssececsize{1000}
-
-% Reduced fonts for @acro in text (9pt).
-\def\reducednominalsize{9pt}
-\setfont\reducedrm\rmshape{9}{1000}{OT1}
-\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
-\setfont\reducedbf\bfshape{10}{900}{OT1}
-\setfont\reducedit\itshape{9}{1000}{OT1IT}
-\setfont\reducedsl\slshape{9}{1000}{OT1}
-\setfont\reducedsf\sfshape{9}{1000}{OT1}
-\setfont\reducedsc\scshape{10}{900}{OT1}
-\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
-\font\reducedi=cmmi9
-\font\reducedsy=cmsy9
-\def\reducedecsize{0900}
-
-\divide\parskip by 2  % reduce space between paragraphs
-\textleading = 12pt   % line spacing for 10pt CM
-\textfonts            % reset the current fonts
-\rm
-} % end of 10pt text font size definitions, \definetextfontsizex
-
-
-% We provide the user-level command
-%   @fonttextsize 10
-% (or 11) to redefine the text font size.  pt is assumed.
-%
-\def\xiword{11}
-\def\xword{10}
-\def\xwordpt{10pt}
-%
-\parseargdef\fonttextsize{%
-  \def\textsizearg{#1}%
-  %\wlog{doing @fonttextsize \textsizearg}%
-  %
-  % Set \globaldefs so that documents can use this inside @tex, since
-  % makeinfo 4.8 does not support it, but we need it nonetheless.
-  %
- \begingroup \globaldefs=1
-  \ifx\textsizearg\xword \definetextfontsizex
-  \else \ifx\textsizearg\xiword \definetextfontsizexi
-  \else
-    \errhelp=\EMsimple
-    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
-  \fi\fi
- \endgroup
-}
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families.  We don't
-% bother to reset \scriptfont and \scriptscriptfont; awaiting user need.
-%
-\def\resetmathfonts{%
-  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
-  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
-  \textfont\ttfam=\tentt \textfont\sffam=\tensf
-}
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE.  We do this because \STYLE needs to also set the
-% current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
-% \tenSTYLE to set the current font.
-%
-% Each font-changing command also sets the names \lsize (one size lower)
-% and \lllsize (three sizes lower).  These relative commands are used
-% in, e.g., the LaTeX logo and acronyms.
-%
-% This all needs generalizing, badly.
-%
-\def\textfonts{%
-  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
-  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
-  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
-  \let\tenttsl=\textttsl
-  \def\curfontsize{text}%
-  \def\lsize{reduced}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{\textleading}}
-\def\titlefonts{%
-  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
-  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
-  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
-  \let\tenttsl=\titlettsl
-  \def\curfontsize{title}%
-  \def\lsize{chap}\def\lllsize{subsec}%
-  \resetmathfonts \setleading{27pt}}
-\def\titlefont#1{{\titlefonts\rmisbold #1}}
-\def\chapfonts{%
-  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
-  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
-  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
-  \let\tenttsl=\chapttsl
-  \def\curfontsize{chap}%
-  \def\lsize{sec}\def\lllsize{text}%
-  \resetmathfonts \setleading{19pt}}
-\def\secfonts{%
-  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
-  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
-  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
-  \let\tenttsl=\secttsl
-  \def\curfontsize{sec}%
-  \def\lsize{subsec}\def\lllsize{reduced}%
-  \resetmathfonts \setleading{17pt}}
-\def\subsecfonts{%
-  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
-  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
-  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
-  \let\tenttsl=\ssecttsl
-  \def\curfontsize{ssec}%
-  \def\lsize{text}\def\lllsize{small}%
-  \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts
-\def\reducedfonts{%
-  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
-  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
-  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
-  \let\tenttsl=\reducedttsl
-  \def\curfontsize{reduced}%
-  \def\lsize{small}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{10.5pt}}
-\def\smallfonts{%
-  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
-  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
-  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
-  \let\tenttsl=\smallttsl
-  \def\curfontsize{small}%
-  \def\lsize{smaller}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{10.5pt}}
-\def\smallerfonts{%
-  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
-  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
-  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
-  \let\tenttsl=\smallerttsl
-  \def\curfontsize{smaller}%
-  \def\lsize{smaller}\def\lllsize{smaller}%
-  \resetmathfonts \setleading{9.5pt}}
-
-% Fonts for short table of contents.
-\setfont\shortcontrm\rmshape{12}{1000}{OT1}
-\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
-\setfont\shortcontsl\slshape{12}{1000}{OT1}
-\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
-
-% Define these just so they can be easily changed for other fonts.
-\def\angleleft{$\langle$}
-\def\angleright{$\rangle$}
-
-% Set the fonts to use with the @small... environments.
-\let\smallexamplefonts = \smallfonts
-
-% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
-% can fit this many characters:
-%   8.5x11=86   smallbook=72  a4=90  a5=69
-% If we use \scriptfonts (8pt), then we can fit this many characters:
-%   8.5x11=90+  smallbook=80  a4=90+  a5=77
-% For me, subjectively, the few extra characters that fit aren't worth
-% the additional smallness of 8pt.  So I'm making the default 9pt.
-%
-% By the way, for comparison, here's what fits with @example (10pt):
-%   8.5x11=71  smallbook=60  a4=75  a5=58
-% --karl, 24jan03.
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\definetextfontsizexi
-
-
-\message{markup,}
-
-% Check if we are currently using a typewriter font.  Since all the
-% Computer Modern typewriter fonts have zero interword stretch (and
-% shrink), and it is reasonable to expect all typewriter fonts to have
-% this property, we can check that font parameter.
-%
-\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
-
-% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
-% define and register \INITMACRO to be called on markup style changes.
-% \INITMACRO can check \currentmarkupstyle for the innermost
-% style and the set of \ifmarkupSTYLE switches for all styles
-% currently in effect.
-\newif\ifmarkupvar
-\newif\ifmarkupsamp
-\newif\ifmarkupkey
-%\newif\ifmarkupfile % @file == @samp.
-%\newif\ifmarkupoption % @option == @samp.
-\newif\ifmarkupcode
-\newif\ifmarkupkbd
-%\newif\ifmarkupenv % @env == @code.
-%\newif\ifmarkupcommand % @command == @code.
-\newif\ifmarkuptex % @tex (and part of @math, for now).
-\newif\ifmarkupexample
-\newif\ifmarkupverb
-\newif\ifmarkupverbatim
-
-\let\currentmarkupstyle\empty
-
-\def\setupmarkupstyle#1{%
-  \csname markup#1true\endcsname
-  \def\currentmarkupstyle{#1}%
-  \markupstylesetup
-}
-
-\let\markupstylesetup\empty
-
-\def\defmarkupstylesetup#1{%
-  \expandafter\def\expandafter\markupstylesetup
-    \expandafter{\markupstylesetup #1}%
-  \def#1%
-}
-
-% Markup style setup for left and right quotes.
-\defmarkupstylesetup\markupsetuplq{%
-  \expandafter\let\expandafter \temp
-    \csname markupsetuplq\currentmarkupstyle\endcsname
-  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
-}
-
-\defmarkupstylesetup\markupsetuprq{%
-  \expandafter\let\expandafter \temp
-    \csname markupsetuprq\currentmarkupstyle\endcsname
-  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
-}
-
-{
-\catcode`\'=\active
-\catcode`\`=\active
-
-\gdef\markupsetuplqdefault{\let`\lq}
-\gdef\markupsetuprqdefault{\let'\rq}
-
-\gdef\markupsetcodequoteleft{\let`\codequoteleft}
-\gdef\markupsetcodequoteright{\let'\codequoteright}
-}
-
-\let\markupsetuplqcode \markupsetcodequoteleft
-\let\markupsetuprqcode \markupsetcodequoteright
-%
-\let\markupsetuplqexample \markupsetcodequoteleft
-\let\markupsetuprqexample \markupsetcodequoteright
-%
-\let\markupsetuplqkbd     \markupsetcodequoteleft
-\let\markupsetuprqkbd     \markupsetcodequoteright
-%
-\let\markupsetuplqsamp \markupsetcodequoteleft
-\let\markupsetuprqsamp \markupsetcodequoteright
-%
-\let\markupsetuplqverb \markupsetcodequoteleft
-\let\markupsetuprqverb \markupsetcodequoteright
-%
-\let\markupsetuplqverbatim \markupsetcodequoteleft
-\let\markupsetuprqverbatim \markupsetcodequoteright
-
-% Allow an option to not use regular directed right quote/apostrophe
-% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
-% The undirected quote is ugly, so don't make it the default, but it
-% works for pasting with more pdf viewers (at least evince), the
-% lilypond developers report.  xpdf does work with the regular 0x27.
-%
-\def\codequoteright{%
-  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
-    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
-      '%
-    \else \char'15 \fi
-  \else \char'15 \fi
-}
-%
-% and a similar option for the left quote char vs. a grave accent.
-% Modern fonts display ASCII 0x60 as a grave accent, so some people like
-% the code environments to do likewise.
-%
-\def\codequoteleft{%
-  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
-    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
-      % [Knuth] pp. 380,381,391
-      % \relax disables Spanish ligatures ?` and !` of \tt font.
-      \relax`%
-    \else \char'22 \fi
-  \else \char'22 \fi
-}
-
-% Commands to set the quote options.
-% 
-\parseargdef\codequoteundirected{%
-  \def\temp{#1}%
-  \ifx\temp\onword
-    \expandafter\let\csname SETtxicodequoteundirected\endcsname
-      = t%
-  \else\ifx\temp\offword
-    \expandafter\let\csname SETtxicodequoteundirected\endcsname
-      = \relax
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
-  \fi\fi
-}
-%
-\parseargdef\codequotebacktick{%
-  \def\temp{#1}%
-  \ifx\temp\onword
-    \expandafter\let\csname SETtxicodequotebacktick\endcsname
-      = t%
-  \else\ifx\temp\offword
-    \expandafter\let\csname SETtxicodequotebacktick\endcsname
-      = \relax
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
-  \fi\fi
-}
-
-% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
-\def\noligaturesquoteleft{\relax\lq}
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-% Font commands.
-
-% #1 is the font command (\sl or \it), #2 is the text to slant.
-% If we are in a monospaced environment, however, 1) always use \ttsl,
-% and 2) do not add an italic correction.
-\def\dosmartslant#1#2{%
-  \ifusingtt 
-    {{\ttsl #2}\let\next=\relax}%
-    {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
-  \next
-}
-\def\smartslanted{\dosmartslant\sl}
-\def\smartitalic{\dosmartslant\it}
-
-% Output an italic correction unless \next (presumed to be the following
-% character) is such as not to need one.
-\def\smartitaliccorrection{%
-  \ifx\next,%
-  \else\ifx\next-%
-  \else\ifx\next.%
-  \else\ifx\next\.%
-  \else\ifx\next\comma%
-  \else\ptexslash
-  \fi\fi\fi\fi\fi
-  \aftersmartic
-}
-
-% Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
-\def\ttslanted#1{{\ttsl #1}}
-
-% @cite is like \smartslanted except unconditionally use \sl.  We never want
-% ttsl for book titles, do we?
-\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
-
-\def\aftersmartic{}
-\def\var#1{%
-  \let\saveaftersmartic = \aftersmartic
-  \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
-  \smartslanted{#1}%
-}
-
-\let\i=\smartitalic
-\let\slanted=\smartslanted
-\let\dfn=\smartslanted
-\let\emph=\smartitalic
-
-% Explicit font changes: @r, @sc, undocumented @ii.
-\def\r#1{{\rm #1}}              % roman font
-\def\sc#1{{\smallcaps#1}}       % smallcaps font
-\def\ii#1{{\it #1}}             % italic font
-
-% @b, explicit bold.  Also @strong.
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% @sansserif, explicit sans.
-\def\sansserif#1{{\sf #1}}
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph.  Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-% Set sfcode to normal for the chars that usually have another value.
-% Can't use plain's \frenchspacing because it uses the `\x notation, and
-% sometimes \x has an active definition that messes things up.
-%
-\catcode`@=11
-  \def\plainfrenchspacing{%
-    \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
-    \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
-    \def\endofsentencespacefactor{1000}% for @. and friends
-  }
-  \def\plainnonfrenchspacing{%
-    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
-    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
-    \def\endofsentencespacefactor{3000}% for @. and friends
-  }
-\catcode`@=\other
-\def\endofsentencespacefactor{3000}% default
-
-% @t, explicit typewriter.
-\def\t#1{%
-  {\tt \rawbackslash \plainfrenchspacing #1}%
-  \null
-}
-
-% @samp.
-\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
-
-% @indicateurl is \samp, that is, with quotes.
-\let\indicateurl=\samp
-
-% @code (and similar) prints in typewriter, but with spaces the same
-% size as normal in the surrounding text, without hyphenation, etc.
-% This is a subroutine for that.
-\def\tclose#1{%
-  {%
-    % Change normal interword space to be same as for the current font.
-    \spaceskip = \fontdimen2\font
-    %
-    % Switch to typewriter.
-    \tt
-    %
-    % But `\ ' produces the large typewriter interword space.
-    \def\ {{\spaceskip = 0pt{} }}%
-    %
-    % Turn off hyphenation.
-    \nohyphenation
-    %
-    \rawbackslash
-    \plainfrenchspacing
-    #1%
-  }%
-  \null % reset spacefactor to 1000
-}
-
-% We *must* turn on hyphenation at `-' and `_' in @code.
-% (But see \codedashfinish below.)
-% Otherwise, it is too hard to avoid overfull hboxes
-% in the Emacs manual, the Library manual, etc.
-%
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate at a dash. -- rms.
-{
-  \catcode`\-=\active \catcode`\_=\active
-  \catcode`\'=\active \catcode`\`=\active
-  \global\let'=\rq \global\let`=\lq  % default definitions
-  %
-  \global\def\code{\begingroup
-    \setupmarkupstyle{code}%
-    % The following should really be moved into \setupmarkupstyle handlers.
-    \catcode\dashChar=\active  \catcode\underChar=\active
-    \ifallowcodebreaks
-     \let-\codedash
-     \let_\codeunder
-    \else
-     \let-\normaldash
-     \let_\realunder
-    \fi
-    % Given -foo (with a single dash), we do not want to allow a break
-    % after the hyphen.
-    \global\let\codedashprev=\codedash
-    %
-    \codex
-  }
-  %
-  \gdef\codedash{\futurelet\next\codedashfinish}
-  \gdef\codedashfinish{%
-    \normaldash % always output the dash character itself.
-    % 
-    % Now, output a discretionary to allow a line break, unless
-    % (a) the next character is a -, or
-    % (b) the preceding character is a -.
-    % E.g., given --posix, we do not want to allow a break after either -.
-    % Given --foo-bar, we do want to allow a break between the - and the b.
-    \ifx\next\codedash \else
-      \ifx\codedashprev\codedash 
-      \else \discretionary{}{}{}\fi
-    \fi
-    % we need the space after the = for the case when \next itself is a
-    % space token; it would get swallowed otherwise.  As in @code{- a}.
-    \global\let\codedashprev= \next
-  }
-}
-\def\normaldash{-}
-%
-\def\codex #1{\tclose{#1}\endgroup}
-
-\def\codeunder{%
-  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
-  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
-  % will therefore expand the active definition of _, which is us
-  % (inside @code that is), therefore an endless loop.
-  \ifusingtt{\ifmmode
-               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
-             \else\normalunderscore \fi
-             \discretionary{}{}{}}%
-            {\_}%
-}
-
-% An additional complication: the above will allow breaks after, e.g.,
-% each of the four underscores in __typeof__.  This is bad.
-% @allowcodebreaks provides a document-level way to turn breaking at -
-% and _ on and off.
-%
-\newif\ifallowcodebreaks  \allowcodebreakstrue
-
-\def\keywordtrue{true}
-\def\keywordfalse{false}
-
-\parseargdef\allowcodebreaks{%
-  \def\txiarg{#1}%
-  \ifx\txiarg\keywordtrue
-    \allowcodebreakstrue
-  \else\ifx\txiarg\keywordfalse
-    \allowcodebreaksfalse
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
-  \fi\fi
-}
-
-% For @command, @env, @file, @option quotes seem unnecessary,
-% so use \code rather than \samp.
-\let\command=\code
-\let\env=\code
-\let\file=\code
-\let\option=\code
-
-% @uref (abbreviation for `urlref') aka @url takes an optional
-% (comma-separated) second argument specifying the text to display and
-% an optional third arg as text to display instead of (rather than in
-% addition to) the url itself.  First (mandatory) arg is the url.
-
-% TeX-only option to allow changing PDF output to show only the second
-% arg (if given), and not the url (which is then just the link target).
-\newif\ifurefurlonlylink
-
-% The main macro is \urefbreak, which allows breaking at expected
-% places within the url.  (There used to be another version, which
-% didn't support automatic breaking.)
-\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
-\let\uref=\urefbreak
-%
-\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
-\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
-  \unsepspaces
-  \pdfurl{#1}%
-  \setbox0 = \hbox{\ignorespaces #3}%
-  \ifdim\wd0 > 0pt
-    \unhbox0 % third arg given, show only that
-  \else
-    \setbox0 = \hbox{\ignorespaces #2}% look for second arg
-    \ifdim\wd0 > 0pt
-      \ifpdf
-        % For pdfTeX and LuaTeX
-        \ifurefurlonlylink
-          % PDF plus option to not display url, show just arg
-          \unhbox0             
-        \else
-          % PDF, normally display both arg and url for consistency,
-          % visibility, if the pdf is eventually used to print, etc.
-          \unhbox0\ (\urefcode{#1})%
-        \fi
-      \else
-        \ifx\XeTeXrevision\thisisundefined
-          \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
-        \else
-          % For XeTeX
-          \ifurefurlonlylink
-            % PDF plus option to not display url, show just arg
-            \unhbox0             
-          \else
-            % PDF, normally display both arg and url for consistency,
-            % visibility, if the pdf is eventually used to print, etc.
-            \unhbox0\ (\urefcode{#1})%
-          \fi
-        \fi
-      \fi
-    \else
-      \urefcode{#1}% only url given, so show it
-    \fi
-  \fi
-  \endlink
-\endgroup}
-
-% Allow line breaks around only a few characters (only).
-\def\urefcatcodes{%
-  \catcode`\&=\active \catcode`\.=\active
-  \catcode`\#=\active \catcode`\?=\active
-  \catcode`\/=\active
-}
-{
-  \urefcatcodes
-  %
-  \global\def\urefcode{\begingroup
-    \setupmarkupstyle{code}%
-    \urefcatcodes
-    \let&\urefcodeamp
-    \let.\urefcodedot
-    \let#\urefcodehash
-    \let?\urefcodequest
-    \let/\urefcodeslash
-    \codex
-  }
-  %
-  % By default, they are just regular characters.
-  \global\def&{\normalamp}
-  \global\def.{\normaldot}
-  \global\def#{\normalhash}
-  \global\def?{\normalquest}
-  \global\def/{\normalslash}
-}
-
-% we put a little stretch before and after the breakable chars, to help
-% line breaking of long url's.  The unequal skips make look better in
-% cmtt at least, especially for dots.
-\def\urefprestretchamount{.13em}
-\def\urefpoststretchamount{.1em}
-\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax}
-\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax}
-%
-\def\urefcodeamp{\urefprestretch \&\urefpoststretch}
-\def\urefcodedot{\urefprestretch .\urefpoststretch}
-\def\urefcodehash{\urefprestretch \#\urefpoststretch}
-\def\urefcodequest{\urefprestretch ?\urefpoststretch}
-\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
-{
-  \catcode`\/=\active
-  \global\def\urefcodeslashfinish{%
-    \urefprestretch \slashChar
-    % Allow line break only after the final / in a sequence of
-    % slashes, to avoid line break between the slashes in http://.
-    \ifx\next/\else \urefpoststretch \fi
-  }
-}
-
-% One more complication: by default we'll break after the special
-% characters, but some people like to break before the special chars, so
-% allow that.  Also allow no breaking at all, for manual control.
-% 
-\parseargdef\urefbreakstyle{%
-  \def\txiarg{#1}%
-  \ifx\txiarg\wordnone
-    \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
-  \else\ifx\txiarg\wordbefore
-    \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
-  \else\ifx\txiarg\wordafter
-    \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
-  \fi\fi\fi
-}
-\def\wordafter{after}
-\def\wordbefore{before}
-\def\wordnone{none}
-
-\urefbreakstyle after
-
-% @url synonym for @uref, since that's how everyone uses it.
-%
-\let\url=\uref
-
-% rms does not like angle brackets --karl, 17may97.
-% So now @email is just like @uref, unless we are pdf.
-%
-%\def\email#1{\angleleft{\tt #1}\angleright}
-\ifpdf
-  \def\email#1{\doemail#1,,\finish}
-  \def\doemail#1,#2,#3\finish{\begingroup
-    \unsepspaces
-    \pdfurl{mailto:#1}%
-    \setbox0 = \hbox{\ignorespaces #2}%
-    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
-    \endlink
-  \endgroup}
-\else
-  \ifx\XeTeXrevision\thisisundefined
-    \let\email=\uref
-  \else
-    \def\email#1{\doemail#1,,\finish}
-    \def\doemail#1,#2,#3\finish{\begingroup
-      \unsepspaces
-      \pdfurl{mailto:#1}%
-      \setbox0 = \hbox{\ignorespaces #2}%
-      \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
-      \endlink
-    \endgroup}
-  \fi
-\fi
-
-% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
-%   `example' (@kbd uses ttsl only inside of @example and friends),
-%   or `code' (@kbd uses normal tty font always).
-\parseargdef\kbdinputstyle{%
-  \def\txiarg{#1}%
-  \ifx\txiarg\worddistinct
-    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
-  \else\ifx\txiarg\wordexample
-    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
-  \else\ifx\txiarg\wordcode
-    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
-  \fi\fi\fi
-}
-\def\worddistinct{distinct}
-\def\wordexample{example}
-\def\wordcode{code}
-
-% Default is `distinct'.
-\kbdinputstyle distinct
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
-
-\def\xkey{\key}
-\def\kbdsub#1#2#3\par{%
-  \def\one{#1}\def\three{#3}\def\threex{??}%
-  \ifx\one\xkey\ifx\threex\three \key{#2}%
-  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
-  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
-}
-
-% definition of @key that produces a lozenge.  Doesn't adjust to text size.
-%\setfont\keyrm\rmshape{8}{1000}{OT1}
-%\font\keysy=cmsy9
-%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
-%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
-%    \vbox{\hrule\kern-0.4pt
-%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
-%    \kern-0.4pt\hrule}%
-%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
-
-% definition of @key with no lozenge.  If the current font is already
-% monospace, don't change it; that way, we respect @kbdinputstyle.  But
-% if it isn't monospace, then use \tt.
-%
-\def\key#1{{\setupmarkupstyle{key}%
-  \nohyphenation
-  \ifmonospace\else\tt\fi
-  #1}\null}
-
-% @clicksequence{File @click{} Open ...}
-\def\clicksequence#1{\begingroup #1\endgroup}
-
-% @clickstyle @arrow   (by default)
-\parseargdef\clickstyle{\def\click{#1}}
-\def\click{\arrow}
-
-% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-% @acronym for "FBI", "NATO", and the like.
-% We print this one point size smaller, since it's intended for
-% all-uppercase.
-%
-\def\acronym#1{\doacronym #1,,\finish}
-\def\doacronym#1,#2,#3\finish{%
-  {\selectfonts\lsize #1}%
-  \def\temp{#2}%
-  \ifx\temp\empty \else
-    \space ({\unsepspaces \ignorespaces \temp \unskip})%
-  \fi
-  \null % reset \spacefactor=1000
-}
-
-% @abbr for "Comput. J." and the like.
-% No font change, but don't do end-of-sentence spacing.
-%
-\def\abbr#1{\doabbr #1,,\finish}
-\def\doabbr#1,#2,#3\finish{%
-  {\plainfrenchspacing #1}%
-  \def\temp{#2}%
-  \ifx\temp\empty \else
-    \space ({\unsepspaces \ignorespaces \temp \unskip})%
-  \fi
-  \null % reset \spacefactor=1000
-}
-
-% @asis just yields its argument.  Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math outputs its argument in math mode.
-%
-% One complication: _ usually means subscripts, but it could also mean
-% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
-% _ active, and distinguish by seeing if the current family is \slfam,
-% which is what @var uses.
-{
-  \catcode`\_ = \active
-  \gdef\mathunderscore{%
-    \catcode`\_=\active
-    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
-  }
-}
-% Another complication: we want \\ (and @\) to output a math (or tt) \.
-% FYI, plain.tex uses \\ as a temporary control sequence (for no
-% particular reason), but this is not advertised and we don't care.
-%
-% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
-\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
-%
-\def\math{%
-  \ifmmode\else % only go into math if not in math mode already
-    \tex
-    \mathunderscore
-    \let\\ = \mathbackslash
-    \mathactive
-    % make the texinfo accent commands work in math mode
-    \let\"=\ddot
-    \let\'=\acute
-    \let\==\bar
-    \let\^=\hat
-    \let\`=\grave
-    \let\u=\breve
-    \let\v=\check
-    \let\~=\tilde
-    \let\dotaccent=\dot
-    % have to provide another name for sup operator
-    \let\mathopsup=\sup
-  $\expandafter\finishmath\fi
-}
-\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
-
-% Some active characters (such as <) are spaced differently in math.
-% We have to reset their definitions in case the @math was an argument
-% to a command which sets the catcodes (such as @item or @section).
-%
-{
-  \catcode`^ = \active
-  \catcode`< = \active
-  \catcode`> = \active
-  \catcode`+ = \active
-  \catcode`' = \active
-  \gdef\mathactive{%
-    \let^ = \ptexhat
-    \let< = \ptexless
-    \let> = \ptexgtr
-    \let+ = \ptexplus
-    \let' = \ptexquoteright
-  }
-}
-
-% for @sub and @sup, if in math mode, just do a normal sub/superscript.
-% If in text, use math to place as sub/superscript, but switch
-% into text mode, with smaller fonts.  This is a different font than the
-% one used for real math sub/superscripts (8pt vs. 7pt), but let's not
-% fix it (significant additions to font machinery) until someone notices.
-%
-\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
-\def\finishsub#1{$\sb{\hbox{\selectfonts\lllsize #1}}$}%
-%
-\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
-\def\finishsup#1{$\ptexsp{\hbox{\selectfonts\lllsize #1}}$}%
-
-% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
-% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
-% except specified as a normal braced arg, so no newlines to worry about.
-% 
-\def\outfmtnametex{tex}
-%
-\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
-\long\def\doinlinefmt#1,#2,\finish{%
-  \def\inlinefmtname{#1}%
-  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
-}
-% 
-% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
-% FMTNAME is tex, else ELSE-TEXT.
-\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
-\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
-  \def\inlinefmtname{#1}%
-  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
-}
-%
-% For raw, must switch into @tex before parsing the argument, to avoid
-% setting catcodes prematurely.  Doing it this way means that, for
-% example, @inlineraw{html, foo{bar} gets a parse error instead of being
-% ignored.  But this isn't important because if people want a literal
-% *right* brace they would have to use a command anyway, so they may as
-% well use a command to get a left brace too.  We could re-use the
-% delimiter character idea from \verb, but it seems like overkill.
-% 
-\long\def\inlineraw{\tex \doinlineraw}
-\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
-\def\doinlinerawtwo#1,#2,\finish{%
-  \def\inlinerawname{#1}%
-  \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
-  \endgroup % close group opened by \tex.
-}
-
-% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
-%
-\long\def\inlineifset#1{\doinlineifset #1,\finish}
-\long\def\doinlineifset#1,#2,\finish{%
-  \def\inlinevarname{#1}%
-  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
-  \else\ignorespaces#2\fi
-}
-
-% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
-%
-\long\def\inlineifclear#1{\doinlineifclear #1,\finish}
-\long\def\doinlineifclear#1,#2,\finish{%
-  \def\inlinevarname{#1}%
-  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
-}
-
-
-\message{glyphs,}
-% and logos.
-
-% @@ prints an @, as does @atchar{}.
-\def\@{\char64 }
-\let\atchar=\@
-
-% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
-% Unless we're in typewriter, use \ecfont because the CM text fonts do
-% not have braces, and we don't want to switch into math.
-\def\mylbrace{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
-\def\myrbrace{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
-\let\{=\mylbrace \let\lbracechar=\{
-\let\}=\myrbrace \let\rbracechar=\}
-\begingroup
-  % Definitions to produce \{ and \} commands for indices,
-  % and @{ and @} for the aux/toc files.
-  \catcode`\{ = \other \catcode`\} = \other
-  \catcode`\[ = 1 \catcode`\] = 2
-  \catcode`\! = 0 \catcode`\\ = \other
-  !gdef!lbracecmd[\{]%
-  !gdef!rbracecmd[\}]%
-  !gdef!lbraceatcmd[@{]%
-  !gdef!rbraceatcmd[@}]%
-!endgroup
-
-% @comma{} to avoid , parsing problems.
-\let\comma = ,
-
-% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
-\let\, = \ptexc
-\let\dotaccent = \ptexdot
-\def\ringaccent#1{{\accent23 #1}}
-\let\tieaccent = \ptext
-\let\ubaraccent = \ptexb
-\let\udotaccent = \d
-
-% Other special characters: @questiondown @exclamdown @ordf @ordm
-% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
-\def\questiondown{?`}
-\def\exclamdown{!`}
-\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
-\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
-
-% Dotless i and dotless j, used for accents.
-\def\imacro{i}
-\def\jmacro{j}
-\def\dotless#1{%
-  \def\temp{#1}%
-  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
-  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
-  \else \errmessage{@dotless can be used only with i or j}%
-  \fi\fi
-}
-
-% The \TeX{} logo, as in plain, but resetting the spacing so that a
-% period following counts as ending a sentence.  (Idea found in latex.)
-%
-\edef\TeX{\TeX \spacefactor=1000 }
-
-% @LaTeX{} logo.  Not quite the same results as the definition in
-% latex.ltx, since we use a different font for the raised A; it's most
-% convenient for us to use an explicitly smaller font, rather than using
-% the \scriptstyle font (since we don't reset \scriptstyle and
-% \scriptscriptstyle).
-%
-\def\LaTeX{%
-  L\kern-.36em
-  {\setbox0=\hbox{T}%
-   \vbox to \ht0{\hbox{%
-     \ifx\textnominalsize\xwordpt
-       % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.
-       % Revert to plain's \scriptsize, which is 7pt.
-       \count255=\the\fam $\fam\count255 \scriptstyle A$%
-     \else
-       % For 11pt, we can use our lllsize.
-       \selectfonts\lllsize A%
-     \fi
-     }%
-     \vss
-  }}%
-  \kern-.15em
-  \TeX
-}
-
-% Some math mode symbols.  Define \ensuremath to switch into math mode
-% unless we are already there.  Expansion tricks may not be needed here,
-% but safer, and can't hurt.
-\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
-\def\ensuredmath#1{$\relax#1$}
-%
-\def\bullet{\ensuremath\ptexbullet}
-\def\geq{\ensuremath\ge}
-\def\leq{\ensuremath\le}
-\def\minus{\ensuremath-}
-
-% @dots{} outputs an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in the cm
-% typewriter fonts as three actual period characters; on the other hand,
-% in other typewriter fonts three periods are wider than 1.5em.  So do
-% whichever is larger.
-%
-\def\dots{%
-  \leavevmode
-  \setbox0=\hbox{...}% get width of three periods
-  \ifdim\wd0 > 1.5em
-    \dimen0 = \wd0
-  \else
-    \dimen0 = 1.5em
-  \fi
-  \hbox to \dimen0{%
-    \hskip 0pt plus.25fil
-    .\hskip 0pt plus1fil
-    .\hskip 0pt plus1fil
-    .\hskip 0pt plus.5fil
-  }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
-  \dots
-  \spacefactor=\endofsentencespacefactor
-}
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
-%
-% Since these characters are used in examples, they should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-%
-\def\point{$\star$}
-\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
-\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% The @error{} command.
-% Adapted from the TeXbook's \boxit.
-%
-\newbox\errorbox
-%
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
-%
-\setbox\errorbox=\hbox to \dimen0{\hfil
-   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
-   \advance\hsize by -2\dimen2 % Rules.
-   \vbox{%
-      \hrule height\dimen2
-      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
-         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
-         \kern3pt\vrule width\dimen2}% Space to right.
-      \hrule height\dimen2}
-    \hfil}
-%
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
-%
-\def\pounds{{\it\$}}
-
-% @euro{} comes from a separate font, depending on the current style.
-% We use the free feym* fonts from the eurosym package by Henrik
-% Theiling, which support regular, slanted, bold and bold slanted (and
-% "outlined" (blackboard board, sort of) versions, which we don't need).
-% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
-%
-% Although only regular is the truly official Euro symbol, we ignore
-% that.  The Euro is designed to be slightly taller than the regular
-% font height.
-%
-% feymr - regular
-% feymo - slanted
-% feybr - bold
-% feybo - bold slanted
-%
-% There is no good (free) typewriter version, to my knowledge.
-% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
-% Hmm.
-%
-% Also doesn't work in math.  Do we need to do math with euro symbols?
-% Hope not.
-%
-%
-\def\euro{{\eurofont e}}
-\def\eurofont{%
-  % We set the font at each command, rather than predefining it in
-  % \textfonts and the other font-switching commands, so that
-  % installations which never need the symbol don't have to have the
-  % font installed.
-  %
-  % There is only one designed size (nominal 10pt), so we always scale
-  % that to the current nominal size.
-  %
-  % By the way, simply using "at 1em" works for cmr10 and the like, but
-  % does not work for cmbx10 and other extended/shrunken fonts.
-  %
-  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
-  %
-  \ifx\curfontstyle\bfstylename
-    % bold:
-    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
-  \else
-    % regular:
-    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
-  \fi
-  \thiseurofont
-}
-
-% Glyphs from the EC fonts.  We don't use \let for the aliases, because
-% sometimes we redefine the original macro, and the alias should reflect
-% the redefinition.
-%
-% Use LaTeX names for the Icelandic letters.
-\def\DH{{\ecfont \char"D0}} % Eth
-\def\dh{{\ecfont \char"F0}} % eth
-\def\TH{{\ecfont \char"DE}} % Thorn
-\def\th{{\ecfont \char"FE}} % thorn
-%
-\def\guillemetleft{{\ecfont \char"13}}
-\def\guillemotleft{\guillemetleft}
-\def\guillemetright{{\ecfont \char"14}}
-\def\guillemotright{\guillemetright}
-\def\guilsinglleft{{\ecfont \char"0E}}
-\def\guilsinglright{{\ecfont \char"0F}}
-\def\quotedblbase{{\ecfont \char"12}}
-\def\quotesinglbase{{\ecfont \char"0D}}
-%
-% This positioning is not perfect (see the ogonek LaTeX package), but
-% we have the precomposed glyphs for the most common cases.  We put the
-% tests to use those glyphs in the single \ogonek macro so we have fewer
-% dummy definitions to worry about for index entries, etc.
-%
-% ogonek is also used with other letters in Lithuanian (IOU), but using
-% the precomposed glyphs for those is not so easy since they aren't in
-% the same EC font.
-\def\ogonek#1{{%
-  \def\temp{#1}%
-  \ifx\temp\macrocharA\Aogonek
-  \else\ifx\temp\macrochara\aogonek
-  \else\ifx\temp\macrocharE\Eogonek
-  \else\ifx\temp\macrochare\eogonek
-  \else
-    \ecfont \setbox0=\hbox{#1}%
-    \ifdim\ht0=1ex\accent"0C #1%
-    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
-    \fi
-  \fi\fi\fi\fi
-  }%
-}
-\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
-\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
-\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
-\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
-%
-% Use the European Computer Modern fonts (cm-super in outline format)
-% for non-CM glyphs.  That is ec* for regular text and tc* for the text
-% companion symbols (LaTeX TS1 encoding).  Both are part of the ec
-% package and follow the same conventions.
-% 
-\def\ecfont{\etcfont{e}}
-\def\tcfont{\etcfont{t}}
-%
-\def\etcfont#1{%
-  % We can't distinguish serif/sans and italic/slanted, but this
-  % is used for crude hacks anyway (like adding French and German
-  % quotes to documents typeset with CM, where we lose kerning), so
-  % hopefully nobody will notice/care.
-  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
-  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
-  \ifmonospace
-    % typewriter:
-    \font\thisecfont = #1ctt\ecsize \space at \nominalsize
-  \else
-    \ifx\curfontstyle\bfstylename
-      % bold:
-      \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
-    \else
-      % regular:
-      \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
-    \fi
-  \fi
-  \thisecfont
-}
-
-% @registeredsymbol - R in a circle.  The font for the R should really
-% be smaller yet, but lllsize is the best we can do for now.
-% Adapted from the plain.tex definition of \copyright.
-%
-\def\registeredsymbol{%
-  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
-               \hfil\crcr\Orb}}%
-    }$%
-}
-
-% @textdegree - the normal degrees sign.
-%
-\def\textdegree{$^\circ$}
-
-% Laurent Siebenmann reports \Orb undefined with:
-%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
-% so we'll define it if necessary.
-%
-\ifx\Orb\thisisundefined
-\def\Orb{\mathhexbox20D}
-\fi
-
-% Quotes.
-\chardef\quotedblleft="5C
-\chardef\quotedblright=`\"
-\chardef\quoteleft=`\`
-\chardef\quoteright=`\'
-
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page.  Must do @settitle before @titlepage.
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-% @setcontentsaftertitlepage used to do an implicit @contents or
-% @shortcontents after @end titlepage, but it is now obsolete.
-\def\setcontentsaftertitlepage{%
-  \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
-              command; move your @contents command if you want the contents
-              after the title page.}}%
-\def\setshortcontentsaftertitlepage{%
-  \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
-              command; move your @shortcontents and @contents commands if you 
-              want the contents after the title page.}}%
-
-\parseargdef\shorttitlepage{%
-  \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
-  \endgroup\page\hbox{}\page}
-
-\envdef\titlepage{%
-  % Open one extra group, as we want to close it in the middle of \Etitlepage.
-  \begingroup
-    \parindent=0pt \textfonts
-    % Leave some space at the very top of the page.
-    \vglue\titlepagetopglue
-    % No rule at page bottom unless we print one at the top with @title.
-    \finishedtitlepagetrue
-    %
-    % Most title ``pages'' are actually two pages long, with space
-    % at the top of the second.  We don't want the ragged left on the second.
-    \let\oldpage = \page
-    \def\page{%
-      \iffinishedtitlepage\else
-        \finishtitlepage
-      \fi
-      \let\page = \oldpage
-      \page
-      \null
-    }%
-}
-
-\def\Etitlepage{%
-    \iffinishedtitlepage\else
-       \finishtitlepage
-    \fi
-    % It is important to do the page break before ending the group,
-    % because the headline and footline are only empty inside the group.
-    % If we use the new definition of \page, we always get a blank page
-    % after the title page, which we certainly don't want.
-    \oldpage
-  \endgroup
-  %
-  % Need this before the \...aftertitlepage checks so that if they are
-  % in effect the toc pages will come out with page numbers.
-  \HEADINGSon
-}
-
-\def\finishtitlepage{%
-  \vskip4pt \hrule height 2pt width \hsize
-  \vskip\titlepagebottomglue
-  \finishedtitlepagetrue
-}
-
-% Settings used for typesetting titles: no hyphenation, no indentation,
-% don't worry much about spacing, ragged right.  This should be used
-% inside a \vbox, and fonts need to be set appropriately first.  Because
-% it is always used for titles, nothing else, we call \rmisbold.  \par
-% should be specified before the end of the \vbox, since a vbox is a group.
-% 
-\def\raggedtitlesettings{%
-  \rmisbold
-  \hyphenpenalty=10000
-  \parindent=0pt
-  \tolerance=5000
-  \ptexraggedright
-}
-
-% Macros to be used within @titlepage:
-
-\let\subtitlerm=\tenrm
-\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
-
-\parseargdef\title{%
-  \checkenv\titlepage
-  \vbox{\titlefonts \raggedtitlesettings #1\par}%
-  % print a rule at the page bottom also.
-  \finishedtitlepagefalse
-  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
-}
-
-\parseargdef\subtitle{%
-  \checkenv\titlepage
-  {\subtitlefont \rightline{#1}}%
-}
-
-% @author should come last, but may come many times.
-% It can also be used inside @quotation.
-%
-\parseargdef\author{%
-  \def\temp{\quotation}%
-  \ifx\thisenv\temp
-    \def\quotationauthor{#1}% printed in \Equotation.
-  \else
-    \checkenv\titlepage
-    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
-    {\secfonts\rmisbold \leftline{#1}}%
-  \fi
-}
-
-
-% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks\evenheadline    % headline on even pages
-\newtoks\oddheadline     % headline on odd pages
-\newtoks\evenfootline    % footline on even pages
-\newtoks\oddfootline     % footline on odd pages
-
-% Now make \makeheadline and \makefootline in Plain TeX use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
-                            \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
-                            \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what  @headings on  does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
-\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
-\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
-\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
-\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
-  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
-  %
-  % Leave some space for the footline.  Hopefully ok to assume
-  % @evenfooting will not be used by itself.
-  \global\advance\txipageheight by -12pt
-  \global\advance\vsize by -12pt
-}
-
-\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-
-% @evenheadingmarks top     \thischapter <- chapter at the top of a page
-% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
-%
-% The same set of arguments for:
-%
-% @oddheadingmarks
-% @evenfootingmarks
-% @oddfootingmarks
-% @everyheadingmarks
-% @everyfootingmarks
-
-% These define \getoddheadingmarks, \getevenheadingmarks,
-% \getoddfootingmarks, and \getevenfootingmarks, each to one of
-% \gettopheadingmarks, \getbottomheadingmarks.
-%
-\def\evenheadingmarks{\headingmarks{even}{heading}}
-\def\oddheadingmarks{\headingmarks{odd}{heading}}
-\def\evenfootingmarks{\headingmarks{even}{footing}}
-\def\oddfootingmarks{\headingmarks{odd}{footing}}
-\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
-                          \headingmarks{odd}{heading}{#1} }
-\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
-                          \headingmarks{odd}{footing}{#1} }
-% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
-\def\headingmarks#1#2#3 {%
-  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
-  \global\expandafter\let\csname get#1#2marks\endcsname \temp
-}
-
-\everyheadingmarks bottom
-\everyfootingmarks bottom
-
-% @headings double      turns headings on for double-sided printing.
-% @headings single      turns headings on for single-sided printing.
-% @headings off         turns them off.
-% @headings on          same as @headings double, retained for compatibility.
-% @headings after       turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off at the start of a document,
-% and turned `on' after @end titlepage.
-
-\parseargdef\headings{\csname HEADINGS#1\endcsname}
-
-\def\headingsoff{% non-global headings elimination
-  \evenheadline={\hfil}\evenfootline={\hfil}%
-   \oddheadline={\hfil}\oddfootline={\hfil}%
-}
-
-\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
-\HEADINGSoff  % it's the default
-
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-\let\contentsalignmacro = \chappager
-
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{%
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapterheading\hfil\folio}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapterheading\hfil\folio}}
-\global\oddheadline={\line{\thischapterheading\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-
-% Subroutines used in generating headings
-% This produces Day Month Year style of output.
-% Only define if not already defined, in case a txi-??.tex file has set
-% up a different format (e.g., txi-cs.tex does this).
-\ifx\today\thisisundefined
-\def\today{%
-  \number\day\space
-  \ifcase\month
-  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
-  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
-  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
-  \fi
-  \space\number\year}
-\fi
-
-% @settitle line...  specifies the title of the document, for headings.
-% It generates no output of its own.
-\def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg{\gdef\thistitle}}
-
-
-\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent  \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin  \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\itemzzz #1{\begingroup %
-  \advance\hsize by -\rightskip
-  \advance\hsize by -\tableindent
-  \setbox0=\hbox{\itemindicate{#1}}%
-  \itemindex{#1}%
-  \nobreak % This prevents a break before @itemx.
-  %
-  % If the item text does not fit in the space we have, put it on a line
-  % by itself, and do not allow a page break either before or after that
-  % line.  We do not start a paragraph here because then if the next
-  % command is, e.g., @kindex, the whatsit would get put into the
-  % horizontal list on a line by itself, resulting in extra blank space.
-  \ifdim \wd0>\itemmax
-    %
-    % Make this a paragraph so we get the \parskip glue and wrapping,
-    % but leave it ragged-right.
-    \begingroup
-      \advance\leftskip by-\tableindent
-      \advance\hsize by\tableindent
-      \advance\rightskip by0pt plus1fil\relax
-      \leavevmode\unhbox0\par
-    \endgroup
-    %
-    % We're going to be starting a paragraph, but we don't want the
-    % \parskip glue -- logically it's part of the @item we just started.
-    \nobreak \vskip-\parskip
-    %
-    % Stop a page break at the \parskip glue coming up.  However, if
-    % what follows is an environment such as @example, there will be no
-    % \parskip glue; then the negative vskip we just inserted would
-    % cause the example and the item to crash together.  So we use this
-    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
-    % \parskip glue after all.  Section titles are handled this way also.
-    %
-    \penalty 10001
-    \endgroup
-    \itemxneedsnegativevskipfalse
-  \else
-    % The item text fits into the space.  Start a paragraph, so that the
-    % following text (if any) will end up on the same line.
-    \noindent
-    % Do this with kerns and \unhbox so that if there is a footnote in
-    % the item text, it can migrate to the main vertical list and
-    % eventually be printed.
-    \nobreak\kern-\tableindent
-    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
-    \unhbox0
-    \nobreak\kern\dimen0
-    \endgroup
-    \itemxneedsnegativevskiptrue
-  \fi
-}
-
-\def\item{\errmessage{@item while not in a list environment}}
-\def\itemx{\errmessage{@itemx while not in a list environment}}
-
-% @table, @ftable, @vtable.
-\envdef\table{%
-  \let\itemindex\gobble
-  \tablecheck{table}%
-}
-\envdef\ftable{%
-  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
-  \tablecheck{ftable}%
-}
-\envdef\vtable{%
-  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
-  \tablecheck{vtable}%
-}
-\def\tablecheck#1{%
-  \ifnum \the\catcode`\^^M=\active
-    \endgroup
-    \errmessage{This command won't work in this context; perhaps the problem is
-      that we are \inenvironment\thisenv}%
-    \def\next{\doignore{#1}}%
-  \else
-    \let\next\tablex
-  \fi
-  \next
-}
-\def\tablex#1{%
-  \def\itemindicate{#1}%
-  \parsearg\tabley
-}
-\def\tabley#1{%
-  {%
-    \makevalueexpandable
-    \edef\temp{\noexpand\tablez #1\space\space\space}%
-    \expandafter
-  }\temp \endtablez
-}
-\def\tablez #1 #2 #3 #4\endtablez{%
-  \aboveenvbreak
-  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
-  \ifnum 0#2>0 \tableindent=#2\mil \fi
-  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
-  \itemmax=\tableindent
-  \advance \itemmax by -\itemmargin
-  \advance \leftskip by \tableindent
-  \exdentamount=\tableindent
-  \parindent = 0pt
-  \parskip = \smallskipamount
-  \ifdim \parskip=0pt \parskip=2pt \fi
-  \let\item = \internalBitem
-  \let\itemx = \internalBitemx
-}
-\def\Etable{\endgraf\afterenvbreak}
-\let\Eftable\Etable
-\let\Evtable\Etable
-\let\Eitemize\Etable
-\let\Eenumerate\Etable
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\envdef\itemize{\parsearg\doitemize}
-
-\def\doitemize#1{%
-  \aboveenvbreak
-  \itemmax=\itemindent
-  \advance\itemmax by -\itemmargin
-  \advance\leftskip by \itemindent
-  \exdentamount=\itemindent
-  \parindent=0pt
-  \parskip=\smallskipamount
-  \ifdim\parskip=0pt \parskip=2pt \fi
-  %
-  % Try typesetting the item mark so that if the document erroneously says
-  % something like @itemize @samp (intending @table), there's an error
-  % right away at the @itemize.  It's not the best error message in the
-  % world, but it's better than leaving it to the @item.  This means if
-  % the user wants an empty mark, they have to say @w{} not just @w.
-  \def\itemcontents{#1}%
-  \setbox0 = \hbox{\itemcontents}%
-  %
-  % @itemize with no arg is equivalent to @itemize @bullet.
-  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
-  %
-  \let\item=\itemizeitem
-}
-
-% Definition of @item while inside @itemize and @enumerate.
-%
-\def\itemizeitem{%
-  \advance\itemno by 1  % for enumerations
-  {\let\par=\endgraf \smallbreak}% reasonable place to break
-  {%
-   % If the document has an @itemize directly after a section title, a
-   % \nobreak will be last on the list, and \sectionheading will have
-   % done a \vskip-\parskip.  In that case, we don't want to zero
-   % parskip, or the item text will crash with the heading.  On the
-   % other hand, when there is normal text preceding the item (as there
-   % usually is), we do want to zero parskip, or there would be too much
-   % space.  In that case, we won't have a \nobreak before.  At least
-   % that's the theory.
-   \ifnum\lastpenalty<10000 \parskip=0in \fi
-   \noindent
-   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
-   %
-   \ifinner\else
-     \vadjust{\penalty 1200}% not good to break after first line of item.
-   \fi
-   % We can be in inner vertical mode in a footnote, although an
-   % @itemize looks awful there.
-  }%
-  \flushcr
-}
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list.  No
-% argument is the same as `1'.
-%
-\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
-  % If we were given no argument, pretend we were given `1'.
-  \def\thearg{#1}%
-  \ifx\thearg\empty \def\thearg{1}\fi
-  %
-  % Detect if the argument is a single token.  If so, it might be a
-  % letter.  Otherwise, the only valid thing it can be is a number.
-  % (We will always have one token, because of the test we just made.
-  % This is a good thing, since \splitoff doesn't work given nothing at
-  % all -- the first parameter is undelimited.)
-  \expandafter\splitoff\thearg\endmark
-  \ifx\rest\empty
-    % Only one token in the argument.  It could still be anything.
-    % A ``lowercase letter'' is one whose \lccode is nonzero.
-    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
-    %   not equal to itself.
-    % Otherwise, we assume it's a number.
-    %
-    % We need the \relax at the end of the \ifnum lines to stop TeX from
-    % continuing to look for a <number>.
-    %
-    \ifnum\lccode\expandafter`\thearg=0\relax
-      \numericenumerate % a number (we hope)
-    \else
-      % It's a letter.
-      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
-        \lowercaseenumerate % lowercase letter
-      \else
-        \uppercaseenumerate % uppercase letter
-      \fi
-    \fi
-  \else
-    % Multiple tokens in the argument.  We hope it's a number.
-    \numericenumerate
-  \fi
-}
-
-% An @enumerate whose labels are integers.  The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
-  \itemno = \thearg
-  \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
-  \itemno = \expandafter`\thearg
-  \startenumeration{%
-    % Be sure we're not beyond the end of the alphabet.
-    \ifnum\itemno=0
-      \errmessage{No more lowercase letters in @enumerate; get a bigger
-                  alphabet}%
-    \fi
-    \char\lccode\itemno
-  }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
-  \itemno = \expandafter`\thearg
-  \startenumeration{%
-    % Be sure we're not beyond the end of the alphabet.
-    \ifnum\itemno=0
-      \errmessage{No more uppercase letters in @enumerate; get a bigger
-                  alphabet}
-    \fi
-    \char\uccode\itemno
-  }%
-}
-
-% Call \doitemize, adding a period to the first argument and supplying the
-% common last two arguments.  Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
-  \advance\itemno by -1
-  \doitemize{#1.}\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble.  Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-%   @multitable @columnfractions .25 .3 .45
-%   @item ...
-%
-%   Numbers following @columnfractions are the percent of the total
-%   current hsize to be used for each column. You may use as many
-%   columns as desired.
-
-
-% Or use a template:
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item ...
-%   using the widest term desired in each column.
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab do not need to be on their own lines, but it will not hurt
-% if they are.
-
-% Sample multitable:
-
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item first col stuff @tab second col stuff @tab third col
-%   @item
-%   first col stuff
-%   @tab
-%   second col stuff
-%   @tab
-%   third col
-%   @item first col stuff @tab second col stuff
-%   @tab Many paragraphs of text may be used in any column.
-%
-%         They will wrap at the width determined by the template.
-%   @item@tab@tab This will be in third column.
-%   @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-%                                                            to baseline.
-%   0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
-
-% Macros used to set up halign preamble:
-%
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\columnfractions\relax
-\def\xcolumnfractions{\columnfractions}
-\newif\ifsetpercent
-
-% #1 is the @columnfraction, usually a decimal number like .5, but might
-% be just 1.  We just use it, whatever it is.
-%
-\def\pickupwholefraction#1 {%
-  \global\advance\colcount by 1
-  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
-  \setuptable
-}
-
-\newcount\colcount
-\def\setuptable#1{%
-  \def\firstarg{#1}%
-  \ifx\firstarg\xendsetuptable
-    \let\go = \relax
-  \else
-    \ifx\firstarg\xcolumnfractions
-      \global\setpercenttrue
-    \else
-      \ifsetpercent
-         \let\go\pickupwholefraction
-      \else
-         \global\advance\colcount by 1
-         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
-                   % separator; typically that is always in the input, anyway.
-         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
-      \fi
-    \fi
-    \ifx\go\pickupwholefraction
-      % Put the argument back for the \pickupwholefraction call, so
-      % we'll always have a period there to be parsed.
-      \def\go{\pickupwholefraction#1}%
-    \else
-      \let\go = \setuptable
-    \fi%
-  \fi
-  \go
-}
-
-% multitable-only commands.
-% 
-% @headitem starts a heading row, which we typeset in bold.  Assignments
-% have to be global since we are inside the implicit group of an
-% alignment entry.  \everycr below resets \everytab so we don't have to
-% undo it ourselves.
-\def\headitemfont{\b}% for people to use in the template row; not changeable
-\def\headitem{%
-  \checkenv\multitable
-  \crcr
-  \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
-  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
-  \the\everytab % for the first item
-}%
-%
-% default for tables with no headings.
-\let\headitemcrhook=\relax
-%
-% A \tab used to include \hskip1sp.  But then the space in a template
-% line is not enough.  That is bad.  So let's go back to just `&' until
-% we again encounter the problem the 1sp was intended to solve.
-%                                      --karl, nathan@acm.org, 20apr99.
-\def\tab{\checkenv\multitable &\the\everytab}%
-
-% @multitable ... @end multitable definitions:
-%
-\newtoks\everytab  % insert after every tab.
-%
-\envdef\multitable{%
-  \vskip\parskip
-  \startsavinginserts
-  %
-  % @item within a multitable starts a normal row.
-  % We use \def instead of \let so that if one of the multitable entries
-  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
-  % \endtemplate) expanding \doitemize.
-  \def\item{\crcr}%
-  %
-  \tolerance=9500
-  \hbadness=9500
-  \setmultitablespacing
-  \parskip=\multitableparskip
-  \parindent=\multitableparindent
-  \overfullrule=0pt
-  \global\colcount=0
-  %
-  \everycr = {%
-    \noalign{%
-      \global\everytab={}% Reset from possible headitem.
-      \global\colcount=0 % Reset the column counter.
-      %
-      % Check for saved footnotes, etc.:
-      \checkinserts
-      %
-      % Perhaps a \nobreak, then reset:
-      \headitemcrhook
-      \global\let\headitemcrhook=\relax
-    }%
-  }%
-  %
-  \parsearg\domultitable
-}
-\def\domultitable#1{%
-  % To parse everything between @multitable and @item:
-  \setuptable#1 \endsetuptable
-  %
-  % This preamble sets up a generic column definition, which will
-  % be used as many times as user calls for columns.
-  % \vtop will set a single line and will also let text wrap and
-  % continue for many paragraphs if desired.
-  \halign\bgroup &%
-    \global\advance\colcount by 1
-    \multistrut
-    \vtop{%
-      % Use the current \colcount to find the correct column width:
-      \hsize=\expandafter\csname col\the\colcount\endcsname
-      %
-      % In order to keep entries from bumping into each other
-      % we will add a \leftskip of \multitablecolspace to all columns after
-      % the first one.
-      %
-      % If a template has been used, we will add \multitablecolspace
-      % to the width of each template entry.
-      %
-      % If the user has set preamble in terms of percent of \hsize we will
-      % use that dimension as the width of the column, and the \leftskip
-      % will keep entries from bumping into each other.  Table will start at
-      % left margin and final column will justify at right margin.
-      %
-      % Make sure we don't inherit \rightskip from the outer environment.
-      \rightskip=0pt
-      \ifnum\colcount=1
-       % The first column will be indented with the surrounding text.
-       \advance\hsize by\leftskip
-      \else
-       \ifsetpercent \else
-         % If user has not set preamble in terms of percent of \hsize
-         % we will advance \hsize by \multitablecolspace.
-         \advance\hsize by \multitablecolspace
-       \fi
-       % In either case we will make \leftskip=\multitablecolspace:
-      \leftskip=\multitablecolspace
-      \fi
-      % Ignoring space at the beginning and end avoids an occasional spurious
-      % blank line, when TeX decides to break the line at the space before the
-      % box from the multistrut, so the strut ends up on a line by itself.
-      % For example:
-      % @multitable @columnfractions .11 .89
-      % @item @code{#}
-      % @tab Legal holiday which is valid in major parts of the whole country.
-      % Is automatically provided with highlighting sequences respectively
-      % marking characters.
-      \noindent\ignorespaces##\unskip\multistrut
-    }\cr
-}
-\def\Emultitable{%
-  \crcr
-  \egroup % end the \halign
-  \global\setpercentfalse
-}
-
-\def\setmultitablespacing{%
-  \def\multistrut{\strut}% just use the standard line spacing
-  %
-  % Compute \multitablelinespace (if not defined by user) for use in
-  % \multitableparskip calculation.  We used define \multistrut based on
-  % this, but (ironically) that caused the spacing to be off.
-  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
-\ifdim\multitablelinespace=0pt
-\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
-\global\advance\multitablelinespace by-\ht0
-\fi
-% Test to see if parskip is larger than space between lines of
-% table. If not, do nothing.
-%        If so, set to same dimension as multitablelinespace.
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
-                                      % than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
-                                      % than skip between lines in the table.
-\fi}
-
-
-\message{conditionals,}
-
-% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
-% @ifnotxml always succeed.  They currently do nothing; we don't
-% attempt to check whether the conditionals are properly nested.  But we
-% have to remember that they are conditionals, so that @end doesn't
-% attempt to close an environment group.
-%
-\def\makecond#1{%
-  \expandafter\let\csname #1\endcsname = \relax
-  \expandafter\let\csname iscond.#1\endcsname = 1
-}
-\makecond{iftex}
-\makecond{ifnotdocbook}
-\makecond{ifnothtml}
-\makecond{ifnotinfo}
-\makecond{ifnotplaintext}
-\makecond{ifnotxml}
-
-% Ignore @ignore, @ifhtml, @ifinfo, and the like.
-%
-\def\direntry{\doignore{direntry}}
-\def\documentdescription{\doignore{documentdescription}}
-\def\docbook{\doignore{docbook}}
-\def\html{\doignore{html}}
-\def\ifdocbook{\doignore{ifdocbook}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\ifplaintext{\doignore{ifplaintext}}
-\def\ifxml{\doignore{ifxml}}
-\def\ignore{\doignore{ignore}}
-\def\menu{\doignore{menu}}
-\def\xml{\doignore{xml}}
-
-% Ignore text until a line `@end #1', keeping track of nested conditionals.
-%
-% A count to remember the depth of nesting.
-\newcount\doignorecount
-
-\def\doignore#1{\begingroup
-  % Scan in ``verbatim'' mode:
-  \obeylines
-  \catcode`\@ = \other
-  \catcode`\{ = \other
-  \catcode`\} = \other
-  %
-  % Make sure that spaces turn into tokens that match what \doignoretext wants.
-  \spaceisspace
-  %
-  % Count number of #1's that we've seen.
-  \doignorecount = 0
-  %
-  % Swallow text until we reach the matching `@end #1'.
-  \dodoignore{#1}%
-}
-
-{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
-  \obeylines %
-  %
-  \gdef\dodoignore#1{%
-    % #1 contains the command name as a string, e.g., `ifinfo'.
-    %
-    % Define a command to find the next `@end #1'.
-    \long\def\doignoretext##1^^M@end #1{%
-      \doignoretextyyy##1^^M@#1\_STOP_}%
-    %
-    % And this command to find another #1 command, at the beginning of a
-    % line.  (Otherwise, we would consider a line `@c @ifset', for
-    % example, to count as an @ifset for nesting.)
-    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
-    %
-    % And now expand that command.
-    \doignoretext ^^M%
-  }%
-}
-
-\def\doignoreyyy#1{%
-  \def\temp{#1}%
-  \ifx\temp\empty                      % Nothing found.
-    \let\next\doignoretextzzz
-  \else                                        % Found a nested condition, ...
-    \advance\doignorecount by 1
-    \let\next\doignoretextyyy          % ..., look for another.
-    % If we're here, #1 ends with ^^M\ifinfo (for example).
-  \fi
-  \next #1% the token \_STOP_ is present just after this macro.
-}
-
-% We have to swallow the remaining "\_STOP_".
-%
-\def\doignoretextzzz#1{%
-  \ifnum\doignorecount = 0     % We have just found the outermost @end.
-    \let\next\enddoignore
-  \else                                % Still inside a nested condition.
-    \advance\doignorecount by -1
-    \let\next\doignoretext      % Look for the next @end.
-  \fi
-  \next
-}
-
-% Finish off ignored text.
-{ \obeylines%
-  % Ignore anything after the last `@end #1'; this matters in verbatim
-  % environments, where otherwise the newline after an ignored conditional
-  % would result in a blank line in the output.
-  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
-}
-
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it.
-% We rely on the fact that \parsearg sets \catcode`\ =10.
-%
-\parseargdef\set{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
-  {%
-    \makevalueexpandable
-    \def\temp{#2}%
-    \edef\next{\gdef\makecsname{SET#1}}%
-    \ifx\temp\empty
-      \next{}%
-    \else
-      \setzzz#2\endsetzzz
-    \fi
-  }%
-}
-% Remove the trailing space \setxxx inserted.
-\def\setzzz#1 \endsetzzz{\next{#1}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\parseargdef\clear{%
-  {%
-    \makevalueexpandable
-    \global\expandafter\let\csname SET#1\endcsname=\relax
-  }%
-}
-
-% @value{foo} gets the text saved in variable foo.
-\def\value{\begingroup\makevalueexpandable\valuexxx}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
-{
-  \catcode`\-=\active \catcode`\_=\active
-  %
-  \gdef\makevalueexpandable{%
-    \let\value = \expandablevalue
-    % We don't want these characters active, ...
-    \catcode`\-=\other \catcode`\_=\other
-    % ..., but we might end up with active ones in the argument if
-    % we're called from @code, as @code{@value{foo-bar_}}, though.
-    % So \let them to their normal equivalents.
-    \let-\normaldash \let_\normalunderscore
-  }
-}
-
-% We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we call \makevalueexpandable in \indexdummies).
-% The command has to be fully expandable (if the variable is set), since
-% the result winds up in the index file.  This means that if the
-% variable's value contains other Texinfo commands, it's almost certain
-% it will fail (although perhaps we could fix that with sufficient work
-% to do a one-level expansion on the result, instead of complete).
-% 
-% Unfortunately, this has the consequence that when _ is in the *value*
-% of an @set, it does not print properly in the roman fonts (get the cmr
-% dot accent at position 126 instead).  No fix comes to mind, and it's
-% been this way since 2003 or earlier, so just ignore it.
-% 
-\def\expandablevalue#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    {[No value for ``#1'']}%
-    \message{Variable `#1', used in @value, is not set.}%
-  \else
-    \csname SET#1\endcsname
-  \fi
-}
-
-% Like \expandablevalue, but completely expandable (the \message in the
-% definition above operates at the execution level of TeX).  Used when
-% writing to auxiliary files, due to the expansion that \write does.
-% If flag is undefined, pass through an unexpanded @value command: maybe it 
-% will be set by the time it is read back in.
-%
-% NB flag names containing - or _ may not work here.
-\def\dummyvalue#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \noexpand\value{#1}%
-  \else
-    \csname SET#1\endcsname
-  \fi
-}
-
-% Used for @value's in index entries to form the sort key: expand the @value
-% if possible, otherwise sort late.
-\def\indexnofontsvalue#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    ZZZZZZZ
-  \else
-    \csname SET#1\endcsname
-  \fi
-}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-% 
-% To get the special treatment we need for `@end ifset,' we call
-% \makecond and then redefine.
-%
-\makecond{ifset}
-\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
-\def\doifset#1#2{%
-  {%
-    \makevalueexpandable
-    \let\next=\empty
-    \expandafter\ifx\csname SET#2\endcsname\relax
-      #1% If not set, redefine \next.
-    \fi
-    \expandafter
-  }\next
-}
-\def\ifsetfail{\doignore{ifset}}
-
-% @ifclear VAR ... @end executes the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-% The `\else' inside the `\doifset' parameter is a trick to reuse the
-% above code: if the variable is not set, do nothing, if it is set,
-% then redefine \next to \ifclearfail.
-%
-\makecond{ifclear}
-\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
-\def\ifclearfail{\doignore{ifclear}}
-
-% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
-% without the @) is in fact defined.  We can only feasibly check at the
-% TeX level, so something like `mathcode' is going to considered
-% defined even though it is not a Texinfo command.
-% 
-\makecond{ifcommanddefined}
-\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
-%
-\def\doifcmddefined#1#2{{%
-    \makevalueexpandable
-    \let\next=\empty
-    \expandafter\ifx\csname #2\endcsname\relax
-      #1% If not defined, \let\next as above.
-    \fi
-    \expandafter
-  }\next
-}
-\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
-
-% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
-\makecond{ifcommandnotdefined}
-\def\ifcommandnotdefined{%
-  \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
-\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
-
-% Set the `txicommandconditionals' variable, so documents have a way to
-% test if the @ifcommand...defined conditionals are available.
-\set txicommandconditionals
-
-% @dircategory CATEGORY  -- specify a category of the dir file
-% which this file should belong to.  Ignore this in TeX.
-\let\dircategory=\comment
-
-% @defininfoenclose.
-\let\definfoenclose=\comment
-
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within macros and \if's.
-\edef\newwrite{\makecsname{ptexnewwrite}}
-
-% \newindex {foo} defines an index named IX.
-% It automatically defines \IXindex such that
-% \IXindex ...rest of line... puts an entry in the index IX.
-% It also defines \IXindfile to be the number of the output channel for
-% the file that accumulates this index.  The file's extension is IX.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-%
-\def\newindex#1{%
-  \expandafter\chardef\csname#1indfile\endcsname=0
-  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
-    \noexpand\doindex{#1}}
-}
-
-% @defindex foo  ==  \newindex{foo}
-%
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-%
-\def\defcodeindex{\parsearg\newcodeindex}
-%
-\def\newcodeindex#1{%
-  \expandafter\chardef\csname#1indfile\endcsname=0
-  \expandafter\xdef\csname#1index\endcsname{%
-    \noexpand\docodeindex{#1}}%
-}
-
-% The default indices:
-\newindex{cp}%      concepts,
-\newcodeindex{fn}%  functions,
-\newcodeindex{vr}%  variables,
-\newcodeindex{tp}%  types,
-\newcodeindex{ky}%  keys
-\newcodeindex{pg}%  and programs.
-
-
-% @synindex foo bar    makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-%
-% @syncodeindex foo bar   similar, but put all entries made for index foo
-% inside @code.
-%
-\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
-\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
-
-% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
-% #3 the target index (bar).
-\def\dosynindex#1#2#3{%
-  % Only do \closeout if we haven't already done it, else we'll end up
-  % closing the target index.
-  \expandafter \ifx\csname donesynindex#2\endcsname \relax
-    % The \closeout helps reduce unnecessary open files; the limit on the
-    % Acorn RISC OS is a mere 16 files.
-    \expandafter\closeout\csname#2indfile\endcsname
-    \expandafter\let\csname donesynindex#2\endcsname = 1
-  \fi
-  % redefine \fooindfile:
-  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
-  \expandafter\let\csname#2indfile\endcsname=\temp
-  % redefine \fooindex:
-  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
-}
-
-% Define \doindex, the driver for all index macros.
-% Argument #1 is generated by the calling \fooindex macro,
-% and it is the two-letter name of the index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
-\def\doindexxxx #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
-\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
-
-\f
-% Used when writing an index entry out to an index file to prevent
-% expansion of Texinfo commands that can appear in an index entry.
-%
-\def\indexdummies{%
-  \escapechar = `\\     % use backslash in output files.
-  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
-  \def\ {\realbackslash\space }%
-  %
-  % Need these unexpandable (because we define \tt as a dummy)
-  % definitions when @{ or @} appear in index entry text.  Also, more
-  % complicated, when \tex is in effect and \{ is a \delimiter again.
-  % We can't use \lbracecmd and \rbracecmd because texindex assumes
-  % braces and backslashes are used only as delimiters.  Perhaps we
-  % should use @lbracechar and @rbracechar?
-  \def\{{{\tt\char123}}%
-  \def\}{{\tt\char125}}%
-  %
-  % Do the redefinitions.
-  \definedummies
-}
-
-% Used for the aux and toc files, where @ is the escape character.
-%
-% For the aux and toc files, @ is the escape character.  So we want to
-% redefine everything using @ as the escape character (instead of
-% \realbackslash, still used for index files).  When everything uses @,
-% this will be simpler.
-%
-\def\atdummies{%
-  \def\@{@@}%
-  \def\ {@ }%
-  \let\{ = \lbraceatcmd
-  \let\} = \rbraceatcmd
-  %
-  % Do the redefinitions.
-  \definedummies
-  \otherbackslash
-}
-
-% \definedummyword defines \#1 as \string\#1\space, thus effectively
-% preventing its expansion.  This is used only for control words,
-% not control letters, because the \space would be incorrect for
-% control characters, but is needed to separate the control word
-% from whatever follows.
-%
-% These can be used both for control words that take an argument and
-% those that do not.  If it is followed by {arg} in the input, then
-% that will dutifully get written to the index (or wherever).
-%
-% For control letters, we have \definedummyletter, which omits the
-% space.
-%
-\def\definedummyword  #1{\def#1{\string#1\space}}%
-\def\definedummyletter#1{\def#1{\string#1}}%
-\let\definedummyaccent\definedummyletter
-
-% Called from \indexdummies and \atdummies, to effectively prevent
-% the expansion of commands.
-%
-\def\definedummies{%
-  %
-  \let\commondummyword\definedummyword
-  \let\commondummyletter\definedummyletter
-  \let\commondummyaccent\definedummyaccent
-  \commondummiesnofonts
-  %
-  \definedummyletter\_%
-  \definedummyletter\-%
-  %
-  % Non-English letters.
-  \definedummyword\AA
-  \definedummyword\AE
-  \definedummyword\DH
-  \definedummyword\L
-  \definedummyword\O
-  \definedummyword\OE
-  \definedummyword\TH
-  \definedummyword\aa
-  \definedummyword\ae
-  \definedummyword\dh
-  \definedummyword\exclamdown
-  \definedummyword\l
-  \definedummyword\o
-  \definedummyword\oe
-  \definedummyword\ordf
-  \definedummyword\ordm
-  \definedummyword\questiondown
-  \definedummyword\ss
-  \definedummyword\th
-  %
-  % Although these internal commands shouldn't show up, sometimes they do.
-  \definedummyword\bf
-  \definedummyword\gtr
-  \definedummyword\hat
-  \definedummyword\less
-  \definedummyword\sf
-  \definedummyword\sl
-  \definedummyword\tclose
-  \definedummyword\tt
-  %
-  \definedummyword\LaTeX
-  \definedummyword\TeX
-  %
-  % Assorted special characters.
-  \definedummyword\arrow
-  \definedummyword\bullet
-  \definedummyword\comma
-  \definedummyword\copyright
-  \definedummyword\registeredsymbol
-  \definedummyword\dots
-  \definedummyword\enddots
-  \definedummyword\entrybreak
-  \definedummyword\equiv
-  \definedummyword\error
-  \definedummyword\euro
-  \definedummyword\expansion
-  \definedummyword\geq
-  \definedummyword\guillemetleft
-  \definedummyword\guillemetright
-  \definedummyword\guilsinglleft
-  \definedummyword\guilsinglright
-  \definedummyword\lbracechar
-  \definedummyword\leq
-  \definedummyword\mathopsup
-  \definedummyword\minus
-  \definedummyword\ogonek
-  \definedummyword\pounds
-  \definedummyword\point
-  \definedummyword\print
-  \definedummyword\quotedblbase
-  \definedummyword\quotedblleft
-  \definedummyword\quotedblright
-  \definedummyword\quoteleft
-  \definedummyword\quoteright
-  \definedummyword\quotesinglbase
-  \definedummyword\rbracechar
-  \definedummyword\result
-  \definedummyword\sub
-  \definedummyword\sup
-  \definedummyword\textdegree
-  %
-  % We want to disable all macros so that they are not expanded by \write.
-  \macrolist
-  \let\value\dummyvalue
-  %
-  \normalturnoffactive
-}
-
-% \commondummiesnofonts: common to \definedummies and \indexnofonts.
-% Define \commondummyletter, \commondummyaccent and \commondummyword before
-% using.  Used for accents, font commands, and various control letters.
-%
-\def\commondummiesnofonts{%
-  % Control letters and accents.
-  \commondummyletter\!%
-  \commondummyaccent\"%
-  \commondummyaccent\'%
-  \commondummyletter\*%
-  \commondummyaccent\,%
-  \commondummyletter\.%
-  \commondummyletter\/%
-  \commondummyletter\:%
-  \commondummyaccent\=%
-  \commondummyletter\?%
-  \commondummyaccent\^%
-  \commondummyaccent\`%
-  \commondummyaccent\~%
-  \commondummyword\u
-  \commondummyword\v
-  \commondummyword\H
-  \commondummyword\dotaccent
-  \commondummyword\ogonek
-  \commondummyword\ringaccent
-  \commondummyword\tieaccent
-  \commondummyword\ubaraccent
-  \commondummyword\udotaccent
-  \commondummyword\dotless
-  %
-  % Texinfo font commands.
-  \commondummyword\b
-  \commondummyword\i
-  \commondummyword\r
-  \commondummyword\sansserif
-  \commondummyword\sc
-  \commondummyword\slanted
-  \commondummyword\t
-  %
-  % Commands that take arguments.
-  \commondummyword\abbr
-  \commondummyword\acronym
-  \commondummyword\anchor
-  \commondummyword\cite
-  \commondummyword\code
-  \commondummyword\command
-  \commondummyword\dfn
-  \commondummyword\dmn
-  \commondummyword\email
-  \commondummyword\emph
-  \commondummyword\env
-  \commondummyword\file
-  \commondummyword\image
-  \commondummyword\indicateurl
-  \commondummyword\inforef
-  \commondummyword\kbd
-  \commondummyword\key
-  \commondummyword\math
-  \commondummyword\option
-  \commondummyword\pxref
-  \commondummyword\ref
-  \commondummyword\samp
-  \commondummyword\strong
-  \commondummyword\tie
-  \commondummyword\U
-  \commondummyword\uref
-  \commondummyword\url
-  \commondummyword\var
-  \commondummyword\verb
-  \commondummyword\w
-  \commondummyword\xref
-}
-
-% For testing: output @{ and @} in index sort strings as \{ and \}.
-\newif\ifusebracesinindexes
-
-\let\indexlbrace\relax
-\let\indexrbrace\relax
-
-{\catcode`\@=0
-\catcode`\\=13
-  @gdef@backslashdisappear{@def\{}}
-}
-
-{
-\catcode`\<=13
-\catcode`\-=13
-\catcode`\`=13
-  \gdef\indexnonalnumdisappear{%
-    \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
-      % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
-      % (Introduced for FSFS 2nd ed.)
-      \let`=\empty
-    \fi
-    %
-    \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
-      \backslashdisappear
-    \fi
-    %
-    \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
-      \def-{}%
-    \fi
-    \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
-      \def<{}%
-    \fi
-    \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
-      \def\@{}%
-    \fi
-  }
-
-  \gdef\indexnonalnumreappear{%
-    \useindexbackslash
-    \let-\normaldash
-    \let<\normalless
-    \def\@{@}%
-  }
-}
-
-
-% \indexnofonts is used when outputting the strings to sort the index
-% by, and when constructing control sequence names.  It eliminates all
-% control sequences and just writes whatever the best ASCII sort string
-% would be for a given command (usually its argument).
-%
-\def\indexnofonts{%
-  % Accent commands should become @asis.
-  \def\commondummyaccent##1{\let##1\asis}%
-  % We can just ignore other control letters.
-  \def\commondummyletter##1{\let##1\empty}%
-  % All control words become @asis by default; overrides below.
-  \let\commondummyword\commondummyaccent
-  \commondummiesnofonts
-  %
-  % Don't no-op \tt, since it isn't a user-level command
-  % and is used in the definitions of the active chars like <, >, |, etc.
-  % Likewise with the other plain tex font commands.
-  %\let\tt=\asis
-  %
-  \def\ { }%
-  \def\@{@}%
-  \def\_{\normalunderscore}%
-  \def\-{}% @- shouldn't affect sorting
-  %
-  \uccode`\1=`\{ \uppercase{\def\{{1}}%
-  \uccode`\1=`\} \uppercase{\def\}{1}}%
-  \let\lbracechar\{%
-  \let\rbracechar\}%
-  %
-  % Non-English letters.
-  \def\AA{AA}%
-  \def\AE{AE}%
-  \def\DH{DZZ}%
-  \def\L{L}%
-  \def\OE{OE}%
-  \def\O{O}%
-  \def\TH{TH}%
-  \def\aa{aa}%
-  \def\ae{ae}%
-  \def\dh{dzz}%
-  \def\exclamdown{!}%
-  \def\l{l}%
-  \def\oe{oe}%
-  \def\ordf{a}%
-  \def\ordm{o}%
-  \def\o{o}%
-  \def\questiondown{?}%
-  \def\ss{ss}%
-  \def\th{th}%
-  %
-  \def\LaTeX{LaTeX}%
-  \def\TeX{TeX}%
-  %
-  % Assorted special characters.
-  % (The following {} will end up in the sort string, but that's ok.)
-  \def\arrow{->}%
-  \def\bullet{bullet}%
-  \def\comma{,}%
-  \def\copyright{copyright}%
-  \def\dots{...}%
-  \def\enddots{...}%
-  \def\equiv{==}%
-  \def\error{error}%
-  \def\euro{euro}%
-  \def\expansion{==>}%
-  \def\geq{>=}%
-  \def\guillemetleft{<<}%
-  \def\guillemetright{>>}%
-  \def\guilsinglleft{<}%
-  \def\guilsinglright{>}%
-  \def\leq{<=}%
-  \def\minus{-}%
-  \def\point{.}%
-  \def\pounds{pounds}%
-  \def\print{-|}%
-  \def\quotedblbase{"}%
-  \def\quotedblleft{"}%
-  \def\quotedblright{"}%
-  \def\quoteleft{`}%
-  \def\quoteright{'}%
-  \def\quotesinglbase{,}%
-  \def\registeredsymbol{R}%
-  \def\result{=>}%
-  \def\textdegree{o}%
-  %
-  % We need to get rid of all macros, leaving only the arguments (if present).
-  % Of course this is not nearly correct, but it is the best we can do for now.
-  % makeinfo does not expand macros in the argument to @deffn, which ends up
-  % writing an index entry, and texindex isn't prepared for an index sort entry
-  % that starts with \.
-  %
-  % Since macro invocations are followed by braces, we can just redefine them
-  % to take a single TeX argument.  The case of a macro invocation that
-  % goes to end-of-line is not handled.
-  %
-  \macrolist
-  \let\value\indexnofontsvalue
-}
-
-\f
-
-
-\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
-
-% Most index entries go through here, but \dosubind is the general case.
-% #1 is the index name, #2 is the entry text.
-\def\doind#1#2{\dosubind{#1}{#2}{}}
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-% TODO: Two-level index?  Operation index?
-
-% Workhorse for all indexes.
-% #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% empty if called from \doind, as we usually are (the main exception
-% is with most defuns, which call us directly).
-%
-\def\dosubind#1#2#3{%
-  \iflinks
-  {%
-    \requireopenindexfile{#1}%
-    % Store the main index entry text (including the third arg).
-    \toks0 = {#2}%
-    % If third arg is present, precede it with a space.
-    \def\thirdarg{#3}%
-    \ifx\thirdarg\empty \else
-      \toks0 = \expandafter{\the\toks0 \space #3}%
-    \fi
-    %
-    \edef\writeto{\csname#1indfile\endcsname}%
-    %
-    \safewhatsit\dosubindwrite
-  }%
-  \fi
-}
-
-% Check if an index file has been opened, and if not, open it.
-\def\requireopenindexfile#1{%
-\ifnum\csname #1indfile\endcsname=0
-  \expandafter\newwrite \csname#1indfile\endcsname
-  \edef\suffix{#1}%
-  % A .fls suffix would conflict with the file extension for the output
-  % of -recorder, so use .f1s instead.
-  \ifx\suffix\indexisfl\def\suffix{f1}\fi
-  % Open the file
-  \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
-  % Using \immediate above here prevents an object entering into the current 
-  % box, which could confound checks such as those in \safewhatsit for
-  % preceding skips.
-  \typeout{Writing index file \jobname.\suffix}%
-\fi}
-\def\indexisfl{fl}
-
-% Output \ as {\indexbackslash}, because \ is an escape character in
-% the index files.
-\let\indexbackslash=\relax
-{\catcode`\@=0 \catcode`\\=\active
-  @gdef@useindexbackslash{@def\{{@indexbackslash}}}
-}
-
-% Definition for writing index entry text.
-\def\sortas#1{\ignorespaces}%
-
-% Definition for writing index entry sort key.  Should occur at the at
-% the beginning of the index entry, like
-%     @cindex @sortas{september} \september
-% The \ignorespaces takes care of following space, but there's no way
-% to remove space before it.
-{
-\catcode`\-=13
-\gdef\indexwritesortas{%
-  \begingroup
-  \indexnonalnumreappear
-  \indexwritesortasxxx}
-\gdef\indexwritesortasxxx#1{%
-  \xdef\indexsortkey{#1}\endgroup}
-}
-
-
-% Write the entry in \toks0 to the index file.
-%
-\def\dosubindwrite{%
-  % Put the index entry in the margin if desired.
-  \ifx\SETmarginindex\relax\else
-    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
-  \fi
-  %
-  % Remember, we are within a group.
-  \indexdummies % Must do this here, since \bf, etc expand at this stage
-  \useindexbackslash % \indexbackslash isn't defined now so it will be output 
-                     % as is; and it will print as backslash.
-  % The braces around \indexbrace are recognized by texindex.
-  %
-  % Get the string to sort by, by processing the index entry with all
-  % font commands turned off.
-  {\indexnofonts
-   \def\lbracechar{{\indexlbrace}}%
-   \def\rbracechar{{\indexrbrace}}%
-   \let\{=\lbracechar
-   \let\}=\rbracechar
-   \indexnonalnumdisappear
-   \xdef\indexsortkey{}%
-   \let\sortas=\indexwritesortas
-   \edef\temp{\the\toks0}%
-   \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas
-   \ifx\indexsortkey\empty
-     \xdef\indexsortkey{\temp}%
-     \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
-   \fi
-  }%
-  %
-  % Set up the complete index entry, with both the sort key and
-  % the original text, including any font commands.  We write
-  % three arguments to \entry to the .?? file (four in the
-  % subentry case), texindex reduces to two when writing the .??s
-  % sorted result.
-  \edef\temp{%
-    \write\writeto{%
-      \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}%
-  }%
-  \temp
-}
-\newbox\dummybox % used above
-
-% Take care of unwanted page breaks/skips around a whatsit:
-%
-% If a skip is the last thing on the list now, preserve it
-% by backing up by \lastskip, doing the \write, then inserting
-% the skip again.  Otherwise, the whatsit generated by the
-% \write or \pdfdest will make \lastskip zero.  The result is that
-% sequences like this:
-% @end defun
-% @tindex whatever
-% @defun ...
-% will have extra space inserted, because the \medbreak in the
-% start of the @defun won't see the skip inserted by the @end of
-% the previous defun.
-%
-% But don't do any of this if we're not in vertical mode.  We
-% don't want to do a \vskip and prematurely end a paragraph.
-%
-% Avoid page breaks due to these extra skips, too.
-%
-% But wait, there is a catch there:
-% We'll have to check whether \lastskip is zero skip.  \ifdim is not
-% sufficient for this purpose, as it ignores stretch and shrink parts
-% of the skip.  The only way seems to be to check the textual
-% representation of the skip.
-%
-% The following is almost like \def\zeroskipmacro{0.0pt} except that
-% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
-%
-\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
-%
-\newskip\whatsitskip
-\newcount\whatsitpenalty
-%
-% ..., ready, GO:
-%
-\def\safewhatsit#1{\ifhmode
-  #1%
- \else
-  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
-  \whatsitskip = \lastskip
-  \edef\lastskipmacro{\the\lastskip}%
-  \whatsitpenalty = \lastpenalty
-  %
-  % If \lastskip is nonzero, that means the last item was a
-  % skip.  And since a skip is discardable, that means this
-  % -\whatsitskip glue we're inserting is preceded by a
-  % non-discardable item, therefore it is not a potential
-  % breakpoint, therefore no \nobreak needed.
-  \ifx\lastskipmacro\zeroskipmacro
-  \else
-    \vskip-\whatsitskip
-  \fi
-  %
-  #1%
-  %
-  \ifx\lastskipmacro\zeroskipmacro
-    % If \lastskip was zero, perhaps the last item was a penalty, and
-    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
-    % to re-insert the same penalty (values >10000 are used for various
-    % signals); since we just inserted a non-discardable item, any
-    % following glue (such as a \parskip) would be a breakpoint.  For example:
-    %   @deffn deffn-whatever
-    %   @vindex index-whatever
-    %   Description.
-    % would allow a break between the index-whatever whatsit
-    % and the "Description." paragraph.
-    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
-  \else
-    % On the other hand, if we had a nonzero \lastskip,
-    % this make-up glue would be preceded by a non-discardable item
-    % (the whatsit from the \write), so we must insert a \nobreak.
-    \nobreak\vskip\whatsitskip
-  \fi
-\fi}
-
-% The index entry written in the file actually looks like
-%  \entry {sortstring}{page}{topic}
-% or
-%  \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-%  \initial {c}
-%     before the first topic whose initial is c
-%  \entry {topic}{pagelist}
-%     for a topic that is used without subtopics
-%  \primary {topic}
-%     for the beginning of a topic that is used with subtopics
-%  \secondary {subtopic}{pagelist}
-%     for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% @printindex causes a particular index (the ??s file) to get printed.
-% It does not print any chapter heading (usually an @unnumbered).
-%
-\parseargdef\printindex{\begingroup
-  \dobreak \chapheadingskip{10000}%
-  %
-  \smallfonts \rm
-  \tolerance = 9500
-  \plainfrenchspacing
-  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
-  %
-  % See if the index file exists and is nonempty.
-  % Change catcode of @ here so that if the index file contains
-  % \initial {@}
-  % as its first line, TeX doesn't complain about mismatched braces
-  % (because it thinks @} is a control sequence).
-  \catcode`\@ = 11
-  % See comment in \requireopenindexfile.
-  \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
-  \openin 1 \jobname.\indexname s
-  \ifeof 1
-    % \enddoublecolumns gets confused if there is no text in the index,
-    % and it loses the chapter title and the aux file entries for the
-    % index.  The easiest way to prevent this problem is to make sure
-    % there is some text.
-    \putwordIndexNonexistent
-    \typeout{No file \jobname.\indexname s.}%
-  \else
-    \catcode`\\ = 0
-    %
-    % If the index file exists but is empty, then \openin leaves \ifeof
-    % false.  We have to make TeX try to read something from the file, so
-    % it can discover if there is anything in it.
-    \read 1 to \thisline
-    \ifeof 1
-      \putwordIndexIsEmpty
-    \else
-      % Index files are almost Texinfo source, but we use \ as the escape
-      % character.  It would be better to use @, but that's too big a change
-      % to make right now.
-      \def\indexbackslash{\ttbackslash}%
-      \let\indexlbrace\{   % Likewise, set these sequences for braces
-      \let\indexrbrace\}   % used in the sort key.
-      \begindoublecolumns
-      \let\entryorphanpenalty=\indexorphanpenalty
-      %
-      % Read input from the index file line by line.
-      \loopdo
-        \ifeof1
-          \let\firsttoken\relax
-        \else
-          \read 1 to \nextline
-          \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}%
-          \act
-        \fi
-        \thisline
-        %
-        \ifeof1\else
-        \let\thisline\nextline
-      \repeat
-      %%
-      \enddoublecolumns
-    \fi
-  \fi
-  \closein 1
-\endgroup}
-
-\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken}
-\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1}
-
-\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx}
-\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
-\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
-\catcode`\$=3
-\gdef\initialglyphs{%
-  % Some changes for non-alphabetic characters.  Using the glyphs from the
-  % math fonts looks more consistent than the typewriter font used elsewhere
-  % for these characters.
-  \def\indexbackslash{\math{\backslash}}%
-  \let\\=\indexbackslash
-  %
-  % Can't get bold backslash so don't use bold forward slash
-  \catcode`\/=13
-  \def/{{\secrmnotbold \normalslash}}%
-  \def-{{\normaldash\normaldash}}% en dash `--'
-  \def^{{\chapbf \normalcaret}}%
-  \def~{{\chapbf \normaltilde}}%
-  \def\_{%
-     \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
-  \def|{$\vert$}%
-  \def<{$\less$}%
-  \def>{$\gtr$}%
-  \def+{$\normalplus$}%
-}}
-
-\def\initial{%
-  \bgroup
-  \initialglyphs
-  \initialx
-}
-
-\def\initialx#1{%
-  % Remove any glue we may have, we'll be inserting our own.
-  \removelastskip
-  %
-  % We like breaks before the index initials, so insert a bonus.
-  % The glue before the bonus allows a little bit of space at the
-  % bottom of a column to reduce an increase in inter-line spacing.
-  \nobreak
-  \vskip 0pt plus 5\baselineskip
-  \penalty -300 
-  \vskip 0pt plus -5\baselineskip
-  %
-  % Typeset the initial.  Making this add up to a whole number of
-  % baselineskips increases the chance of the dots lining up from column
-  % to column.  It still won't often be perfect, because of the stretch
-  % we need before each entry, but it's better.
-  %
-  % No shrink because it confuses \balancecolumns.
-  \vskip 1.67\baselineskip plus 1\baselineskip
-  \leftline{\secfonts \kern-0.05em \secbf #1}%
-  % \secfonts is inside the argument of \leftline so that the change of
-  % \baselineskip will not affect any glue inserted before the vbox that
-  % \leftline creates.
-  % Do our best not to break after the initial.
-  \nobreak
-  \vskip .33\baselineskip plus .1\baselineskip
-  \egroup % \initialglyphs
-}
-
-\newdimen\entryrightmargin
-\entryrightmargin=0pt
-
-% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
-% then page number (#2) flushed to the right margin.  It is used for index
-% and table of contents entries.  The paragraph is indented by \leftskip.
-%
-\def\entry{%
-  \begingroup
-    %
-    % Start a new paragraph if necessary, so our assignments below can't
-    % affect previous text.
-    \par
-    %
-    % No extra space above this paragraph.
-    \parskip = 0in
-    %
-    % When reading the text of entry, convert explicit line breaks
-    % from @* into spaces.  The user might give these in long section
-    % titles, for instance.
-    \def\*{\unskip\space\ignorespaces}%
-    \def\entrybreak{\hfil\break}% An undocumented command
-    %
-    % A bit of stretch before each entry for the benefit of balancing
-    % columns.
-    \vskip 0pt plus0.5pt
-    %
-    % Swallow the left brace of the text (first parameter):
-    \afterassignment\doentry
-    \let\temp =
-}
-\def\entrybreak{\unskip\space\ignorespaces}%
-\def\doentry{%
-    % Save the text of the entry
-    \global\setbox\boxA=\hbox\bgroup
-    \bgroup % Instead of the swallowed brace.
-      \noindent
-      \aftergroup\finishentry
-      % And now comes the text of the entry.
-      % Not absorbing as a macro argument reduces the chance of problems
-      % with catcodes occurring.
-}
-{\catcode`\@=11
-\gdef\finishentry#1{%
-    \egroup % end box A
-    \dimen@ = \wd\boxA % Length of text of entry
-    \global\setbox\boxA=\hbox\bgroup\unhbox\boxA
-    % #1 is the page number.
-    %
-    % Get the width of the page numbers, and only use
-    % leaders if they are present.
-    \global\setbox\boxB = \hbox{#1}%
-    \ifdim\wd\boxB = 0pt
-      \null\nobreak\hfill\ %
-    \else
-      %
-      \null\nobreak\indexdotfill % Have leaders before the page number.
-      %
-      \ifpdf
-        \pdfgettoks#1.%
-        \bgroup\let\domark\relax
-          \hskip\skip\thinshrinkable\the\toksA
-        \egroup
-        % The redefinion of \domark stops marks being added in \pdflink to 
-        % preserve coloured links across page boundaries.  Otherwise the marks
-        % would get in the way of \lastbox in \insertindexentrybox.
-      \else
-        \ifx\XeTeXrevision\thisisundefined
-          \hskip\skip\thinshrinkable #1%
-        \else
-          \pdfgettoks#1.%
-          \bgroup\let\domark\relax
-            \hskip\skip\thinshrinkable\the\toksA
-          \egroup
-        \fi
-      \fi
-    \fi
-    \egroup % end \boxA
-    \ifdim\wd\boxB = 0pt
-      \global\setbox\entryindexbox=\vbox{\unhbox\boxA}%
-    \else
-    \global\setbox\entryindexbox=\vbox\bgroup
-      \prevdepth=\entrylinedepth
-      \noindent
-      % We want the text of the entries to be aligned to the left, and the
-      % page numbers to be aligned to the right.
-      %
-      \advance\leftskip by 0pt plus 1fil
-      \advance\leftskip by 0pt plus -1fill
-      \rightskip = 0pt plus -1fil
-      \advance\rightskip by 0pt plus 1fill
-      % Cause last line, which could consist of page numbers on their own
-      % if the list of page numbers is long, to be aligned to the right.
-      \parfillskip=0pt plus -1fill
-      %
-      \hangindent=1em
-      %
-      \advance\rightskip by \entryrightmargin
-      % Determine how far we can stretch into the margin.
-      % This allows, e.g., "Appendix H  GNU Free Documentation License" to
-      % fit on one line in @letterpaper format.
-      \ifdim\entryrightmargin>2.1em
-        \dimen@i=2.1em
-      \else
-        \dimen@i=0em
-      \fi
-      \advance \parfillskip by 0pt minus 1\dimen@i
-      %
-      \dimen@ii = \hsize
-      \advance\dimen@ii by -1\leftskip
-      \advance\dimen@ii by -1\entryrightmargin
-      \advance\dimen@ii by 1\dimen@i
-      \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
-      \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
-        \dimen@ = 0.7\dimen@ % Try to split the text roughly evenly
-        \dimen@ii = \hsize
-        \advance \dimen@ii by -1em
-        \ifnum\dimen@>\dimen@ii
-          % If the entry is too long, use the whole line
-          \dimen@ = \dimen@ii
-        \fi
-        \advance\leftskip by 0pt plus 1fill % ragged right
-        \advance \dimen@ by 1\rightskip
-        \parshape = 2 0pt \dimen@ 1em \dimen@ii
-        % Ideally we'd add a finite glue at the end of the first line only, but
-        % TeX doesn't seem to provide a way to do such a thing.
-      \fi\fi
-      \unhbox\boxA
-      %
-      % Do not prefer a separate line ending with a hyphen to fewer lines.
-      \finalhyphendemerits = 0
-      %
-      % Word spacing - no stretch
-      \spaceskip=\fontdimen2\font minus \fontdimen4\font
-      %
-      \linepenalty=1000  % Discourage line breaks.
-      \hyphenpenalty=5000  % Discourage hyphenation.
-      %
-      \par % format the paragraph
-    \egroup % The \vbox
-    \fi
-  \endgroup
-  % delay text of entry until after penalty
-  \bgroup\aftergroup\insertindexentrybox
-  \entryorphanpenalty
-}}
-
-\newskip\thinshrinkable
-\skip\thinshrinkable=.15em minus .15em
-
-\newbox\entryindexbox
-\def\insertindexentrybox{%
-  \copy\entryindexbox
-  % The following gets the depth of the last box.  This is for even
-  % line spacing when entries span several lines.
-  \setbox\dummybox\vbox{%
-    \unvbox\entryindexbox
-    \nointerlineskip
-    \lastbox
-    \global\entrylinedepth=\prevdepth
-  }%
-  % Note that we couldn't simply \unvbox\entryindexbox followed by 
-  % \nointerlineskip\lastbox to remove the last box and then reinstate it, 
-  % because this resets how far the box has been \moveleft'ed to 0.  \unvbox
-  % doesn't affect \prevdepth either.
-}
-\newdimen\entrylinedepth
-
-% Default is no penalty
-\let\entryorphanpenalty\egroup
-
-% Used from \printindex.  \firsttoken should be the first token
-% after the \entry.  If it's not another \entry, we are at the last
-% line of a group of index entries, so insert a penalty to discourage
-% orphaned index entries.
-\long\def\indexorphanpenalty{%
-  \def\isentry{\entry}%
-  \ifx\firsttoken\isentry
-  \else
-    \unskip\penalty 9000
-    % The \unskip here stops breaking before the glue.  It relies on the
-    % \vskip above being there, otherwise there is an error
-    % "You can't use `\unskip' in vertical mode".  There has to be glue
-    % in the current vertical list that hasn't been added to the
-    % "current page".  See Chapter 24 of the TeXbook.  This contradicts
-    % Section 8.3.7 in "TeX by Topic," though.
-  \fi
-  \egroup % now comes the box added with \aftergroup
-}
-
-% Like plain.tex's \dotfill, except uses up at least 1 em.
-% The filll stretch here overpowers both the fil and fill stretch to push
-% the page number to the right.
-\def\indexdotfill{\cleaders
-  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
-
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-\def\secondary#1#2{{%
-  \parfillskip=0in
-  \parskip=0in
-  \hangindent=1in
-  \hangafter=1
-  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
-  \ifpdf
-    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
-  \else
-    \ifx\XeTeXrevision\thisisundefined
-      #2
-    \else
-      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
-    \fi
-  \fi
-  \par
-}}
-
-% Define two-column mode, which we use to typeset indexes.
-% Adapted from the TeXbook, page 416, which is to say,
-% the manmac.tex format used to print the TeXbook itself.
-\catcode`\@=11  % private names
-
-\newbox\partialpage
-\newdimen\doublecolumnhsize
-\newdimen\doublecolumntopgap
-\doublecolumntopgap = 0pt
-
-% Use inside an output routine to save \topmark and \firstmark
-\def\savemarks{%
-  \global\savedtopmark=\expandafter{\topmark }%
-  \global\savedfirstmark=\expandafter{\firstmark }%
-}
-\newtoks\savedtopmark
-\newtoks\savedfirstmark
-
-% Set \topmark and \firstmark for next time \output runs.
-% Can't be run from withinside \output (because any material
-% added while an output routine is active, including 
-% penalties, is saved for after it finishes).  The page so far
-% should be empty, otherwise what's on it will be thrown away.
-\def\restoremarks{%
-  \mark{\the\savedtopmark}%
-  \bgroup\output = {%
-    \setbox\dummybox=\box\PAGE
-  }abc\eject\egroup
-  % "abc" because output routine doesn't fire for a completely empty page.
-  \mark{\the\savedfirstmark}%
-}
-
-\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
-  % If not much space left on page, start a new page.
-  \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
-  %
-  % Grab any single-column material above us.
-  \output = {%
-    %
-    % Here is a possibility not foreseen in manmac: if we accumulate a
-    % whole lot of material, we might end up calling this \output
-    % routine twice in a row (see the doublecol-lose test, which is
-    % essentially a couple of indexes with @setchapternewpage off).  In
-    % that case we just ship out what is in \partialpage with the normal
-    % output routine.  Generally, \partialpage will be empty when this
-    % runs and this will be a no-op.  See the indexspread.tex test case.
-    \ifvoid\partialpage \else
-      \onepageout{\pagecontents\partialpage}%
-    \fi
-    %
-    \global\setbox\partialpage = \vbox{%
-      % Unvbox the main output page.
-      \unvbox\PAGE
-      \kern-\topskip \kern\baselineskip
-    }%
-    \savemarks
-  }%
-  \eject % run that output routine to set \partialpage
-  \restoremarks
-  %
-  % We recover the two marks that the last output routine saved in order
-  % to propagate the information in marks added around a chapter heading,
-  % which could be otherwise be lost by the time the final page is output.
-  %
-  %
-  % Use the double-column output routine for subsequent pages.
-  \output = {\doublecolumnout}%
-  %
-  % Change the page size parameters.  We could do this once outside this
-  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
-  % format, but then we repeat the same computation.  Repeating a couple
-  % of assignments once per index is clearly meaningless for the
-  % execution time, so we may as well do it in one place.
-  %
-  % First we halve the line length, less a little for the gutter between
-  % the columns.  We compute the gutter based on the line length, so it
-  % changes automatically with the paper format.  The magic constant
-  % below is chosen so that the gutter has the same value (well, +-<1pt)
-  % as it did when we hard-coded it.
-  %
-  % We put the result in a separate register, \doublecolumhsize, so we
-  % can restore it in \pagesofar, after \hsize itself has (potentially)
-  % been clobbered.
-  %
-  \doublecolumnhsize = \hsize
-    \advance\doublecolumnhsize by -.04154\hsize
-    \divide\doublecolumnhsize by 2
-  \hsize = \doublecolumnhsize
-  %
-  % Double the \vsize as well.  (We don't need a separate register here,
-  % since nobody clobbers \vsize.)
-  \global\doublecolumntopgap = \topskip
-  \global\advance\doublecolumntopgap by -1\baselineskip
-  \advance\vsize by -1\doublecolumntopgap
-  \vsize = 2\vsize
-  \topskip=0pt
-  \global\entrylinedepth=0pt\relax
-}
-
-% The double-column output routine for all double-column pages except
-% the last, which is done by \balancecolumns.
-%
-\def\doublecolumnout{%
-  %
-  \splittopskip=\topskip \splitmaxdepth=\maxdepth
-  % Get the available space for the double columns -- the normal
-  % (undoubled) page height minus any material left over from the
-  % previous page.
-  \dimen@ = \vsize
-  \divide\dimen@ by 2
-  \advance\dimen@ by -\ht\partialpage
-  %
-  % box0 will be the left-hand column, box2 the right.
-  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
-  \onepageout\pagesofar
-  \unvbox255
-  \penalty\outputpenalty
-}
-%
-% Re-output the contents of the output page -- any previous material,
-% followed by the two boxes we just split, in box0 and box2.
-\def\pagesofar{%
-  \unvbox\partialpage
-  %
-  \hsize = \doublecolumnhsize
-  \wd0=\hsize \wd2=\hsize
-  \vbox{%
-    \vskip\doublecolumntopgap
-    \hbox to\txipagewidth{\box0\hfil\box2}}%
-}
-
-
-% Finished with with double columns.
-\def\enddoublecolumns{%
-  % The following penalty ensures that the page builder is exercised
-  % _before_ we change the output routine.  This is necessary in the
-  % following situation:
-  %
-  % The last section of the index consists only of a single entry.
-  % Before this section, \pagetotal is less than \pagegoal, so no
-  % break occurs before the last section starts.  However, the last
-  % section, consisting of \initial and the single \entry, does not
-  % fit on the page and has to be broken off.  Without the following
-  % penalty the page builder will not be exercised until \eject
-  % below, and by that time we'll already have changed the output
-  % routine to the \balancecolumns version, so the next-to-last
-  % double-column page will be processed with \balancecolumns, which
-  % is wrong:  The two columns will go to the main vertical list, with
-  % the broken-off section in the recent contributions.  As soon as
-  % the output routine finishes, TeX starts reconsidering the page
-  % break.  The two columns and the broken-off section both fit on the
-  % page, because the two columns now take up only half of the page
-  % goal.  When TeX sees \eject from below which follows the final
-  % section, it invokes the new output routine that we've set after
-  % \balancecolumns below; \onepageout will try to fit the two columns
-  % and the final section into the vbox of \txipageheight (see
-  % \pagebody), causing an overfull box.
-  %
-  % Note that glue won't work here, because glue does not exercise the
-  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
-  \penalty0
-  %
-  \output = {%
-    % Split the last of the double-column material.
-    \savemarks
-    \balancecolumns
-    %
-    % Having called \balancecolumns once, we do not
-    % want to call it again.  Therefore, reset \output to its normal
-    % definition right away.
-    \global\output = {\onepageout{\pagecontents\PAGE}}%
-  }%
-  \eject
-  \endgroup % started in \begindoublecolumns
-  \restoremarks
-  % Leave the double-column material on the current page, no automatic
-  % page break.
-  \box\balancedcolumns
-  %
-  % \pagegoal was set to the doubled \vsize above, since we restarted
-  % the current page.  We're now back to normal single-column
-  % typesetting, so reset \pagegoal to the normal \vsize (after the
-  % \endgroup where \vsize got restored).
-  \pagegoal = \vsize
-}
-\newbox\balancedcolumns
-\setbox\balancedcolumns=\vbox{shouldnt see this}%
-%
-% Only called for the last of the double column material.  \doublecolumnout 
-% does the others.
-\def\balancecolumns{%
-  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
-  \dimen@ = \ht0
-  \advance\dimen@ by \topskip
-  \advance\dimen@ by-\baselineskip
-  \ifdim\dimen@<14\baselineskip
-    % Don't split a short final column in two.
-    \setbox2=\vbox{}%
-  \else
-    \divide\dimen@ by 2 % target to split to
-    \dimen@ii = \dimen@
-    \splittopskip = \topskip
-    % Loop until the second column is no higher than the first
-    {%
-      \vbadness = 10000
-      \loop
-        \global\setbox3 = \copy0
-        \global\setbox1 = \vsplit3 to \dimen@
-        % Remove glue from bottom of first column to
-        % make sure it is higher than the second.
-        \global\setbox1 = \vbox{\unvbox1\unpenalty\unskip}%
-      \ifdim\ht3>\ht1
-        \global\advance\dimen@ by 1pt
-      \repeat
-    }%
-    \multiply\dimen@ii by 4
-    \divide\dimen@ii by 5
-    \ifdim\ht3<\dimen@ii
-      % Column heights are too different, so don't make their bottoms
-      % flush with each other.  The glue at the end of the second column
-      % allows a second column to stretch, reducing the difference in
-      % height between the two.
-      \setbox0=\vbox to\dimen@{\unvbox1\vfill}%
-      \setbox2=\vbox to\dimen@{\unvbox3\vskip 0pt plus 0.3\ht0}%
-    \else
-      \setbox0=\vbox to\dimen@{\unvbox1}%
-      \setbox2=\vbox to\dimen@{\unvbox3}%
-    \fi
-  \fi
-  %
-  \global\setbox\balancedcolumns=\vbox{\pagesofar}%
-}
-\catcode`\@ = \other
-
-
-\message{sectioning,}
-% Chapters, sections, etc.
-
-% Let's start with @part.
-\outer\parseargdef\part{\partzzz{#1}}
-\def\partzzz#1{%
-  \chapoddpage
-  \null
-  \vskip.3\vsize  % move it down on the page a bit
-  \begingroup
-    \noindent \titlefonts\rmisbold #1\par % the text
-    \let\lastnode=\empty      % no node to associate with
-    \writetocentry{part}{#1}{}% but put it in the toc
-    \headingsoff              % no headline or footline on the part page
-    % This outputs a mark at the end of the page that clears \thischapter
-    % and \thissection, as is done in \startcontents.
-    \let\pchapsepmacro\relax
-    \chapmacro{}{Yomitfromtoc}{}%
-    \chapoddpage
-  \endgroup
-}
-
-% \unnumberedno is an oxymoron.  But we count the unnumbered
-% sections so that we can refer to them unambiguously in the pdf
-% outlines by their "section number".  We avoid collisions with chapter
-% numbers by starting them at 10000.  (If a document ever has 10000
-% chapters, we're in trouble anyway, I'm sure.)
-\newcount\unnumberedno \unnumberedno = 10000
-\newcount\chapno
-\newcount\secno        \secno=0
-\newcount\subsecno     \subsecno=0
-\newcount\subsubsecno  \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount\appendixno  \appendixno = `\@
-%
-% \def\appendixletter{\char\the\appendixno}
-% We do the following ugly conditional instead of the above simple
-% construct for the sake of pdftex, which needs the actual
-% letter in the expansion, not just typeset.
-%
-\def\appendixletter{%
-  \ifnum\appendixno=`A A%
-  \else\ifnum\appendixno=`B B%
-  \else\ifnum\appendixno=`C C%
-  \else\ifnum\appendixno=`D D%
-  \else\ifnum\appendixno=`E E%
-  \else\ifnum\appendixno=`F F%
-  \else\ifnum\appendixno=`G G%
-  \else\ifnum\appendixno=`H H%
-  \else\ifnum\appendixno=`I I%
-  \else\ifnum\appendixno=`J J%
-  \else\ifnum\appendixno=`K K%
-  \else\ifnum\appendixno=`L L%
-  \else\ifnum\appendixno=`M M%
-  \else\ifnum\appendixno=`N N%
-  \else\ifnum\appendixno=`O O%
-  \else\ifnum\appendixno=`P P%
-  \else\ifnum\appendixno=`Q Q%
-  \else\ifnum\appendixno=`R R%
-  \else\ifnum\appendixno=`S S%
-  \else\ifnum\appendixno=`T T%
-  \else\ifnum\appendixno=`U U%
-  \else\ifnum\appendixno=`V V%
-  \else\ifnum\appendixno=`W W%
-  \else\ifnum\appendixno=`X X%
-  \else\ifnum\appendixno=`Y Y%
-  \else\ifnum\appendixno=`Z Z%
-  % The \the is necessary, despite appearances, because \appendixletter is
-  % expanded while writing the .toc file.  \char\appendixno is not
-  % expandable, thus it is written literally, thus all appendixes come out
-  % with the same letter (or @) in the toc without it.
-  \else\char\the\appendixno
-  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-% Each @chapter defines these (using marks) as the number+name, number
-% and name of the chapter.  Page headings and footings can use
-% these.  @section does likewise.
-\def\thischapter{}
-\def\thischapternum{}
-\def\thischaptername{}
-\def\thissection{}
-\def\thissectionnum{}
-\def\thissectionname{}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% we only have subsub.
-\chardef\maxseclevel = 3
-%
-% A numbered section within an unnumbered changes to unnumbered too.
-% To achieve this, remember the "biggest" unnum. sec. we are currently in:
-\chardef\unnlevel = \maxseclevel
-%
-% Trace whether the current chapter is an appendix or not:
-% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
-\def\chapheadtype{N}
-
-% Choose a heading macro
-% #1 is heading type
-% #2 is heading level
-% #3 is text for heading
-\def\genhead#1#2#3{%
-  % Compute the abs. sec. level:
-  \absseclevel=#2
-  \advance\absseclevel by \secbase
-  % Make sure \absseclevel doesn't fall outside the range:
-  \ifnum \absseclevel < 0
-    \absseclevel = 0
-  \else
-    \ifnum \absseclevel > 3
-      \absseclevel = 3
-    \fi
-  \fi
-  % The heading type:
-  \def\headtype{#1}%
-  \if \headtype U%
-    \ifnum \absseclevel < \unnlevel
-      \chardef\unnlevel = \absseclevel
-    \fi
-  \else
-    % Check for appendix sections:
-    \ifnum \absseclevel = 0
-      \edef\chapheadtype{\headtype}%
-    \else
-      \if \headtype A\if \chapheadtype N%
-       \errmessage{@appendix... within a non-appendix chapter}%
-      \fi\fi
-    \fi
-    % Check for numbered within unnumbered:
-    \ifnum \absseclevel > \unnlevel
-      \def\headtype{U}%
-    \else
-      \chardef\unnlevel = 3
-    \fi
-  \fi
-  % Now print the heading:
-  \if \headtype U%
-    \ifcase\absseclevel
-       \unnumberedzzz{#3}%
-    \or \unnumberedseczzz{#3}%
-    \or \unnumberedsubseczzz{#3}%
-    \or \unnumberedsubsubseczzz{#3}%
-    \fi
-  \else
-    \if \headtype A%
-      \ifcase\absseclevel
-         \appendixzzz{#3}%
-      \or \appendixsectionzzz{#3}%
-      \or \appendixsubseczzz{#3}%
-      \or \appendixsubsubseczzz{#3}%
-      \fi
-    \else
-      \ifcase\absseclevel
-         \chapterzzz{#3}%
-      \or \seczzz{#3}%
-      \or \numberedsubseczzz{#3}%
-      \or \numberedsubsubseczzz{#3}%
-      \fi
-    \fi
-  \fi
-  \suppressfirstparagraphindent
-}
-
-% an interface:
-\def\numhead{\genhead N}
-\def\apphead{\genhead A}
-\def\unnmhead{\genhead U}
-
-% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
-% all lower-level sectioning counters to zero.
-%
-% Also set \chaplevelprefix, which we prepend to @float sequence numbers
-% (e.g., figures), q.v.  By default (before any chapter), that is empty.
-\let\chaplevelprefix = \empty
-%
-\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz#1{%
-  % section resetting is \global in case the chapter is in a group, such
-  % as an @include file.
-  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
-    \global\advance\chapno by 1
-  %
-  % Used for \float.
-  \gdef\chaplevelprefix{\the\chapno.}%
-  \resetallfloatnos
-  %
-  % \putwordChapter can contain complex things in translations.
-  \toks0=\expandafter{\putwordChapter}%
-  \message{\the\toks0 \space \the\chapno}%
-  %
-  % Write the actual heading.
-  \chapmacro{#1}{Ynumbered}{\the\chapno}%
-  %
-  % So @section and the like are numbered underneath this chapter.
-  \global\let\section = \numberedsec
-  \global\let\subsection = \numberedsubsec
-  \global\let\subsubsection = \numberedsubsubsec
-}
-
-\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
-%
-\def\appendixzzz#1{%
-  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
-    \global\advance\appendixno by 1
-  \gdef\chaplevelprefix{\appendixletter.}%
-  \resetallfloatnos
-  %
-  % \putwordAppendix can contain complex things in translations.
-  \toks0=\expandafter{\putwordAppendix}%
-  \message{\the\toks0 \space \appendixletter}%
-  %
-  \chapmacro{#1}{Yappendix}{\appendixletter}%
-  %
-  \global\let\section = \appendixsec
-  \global\let\subsection = \appendixsubsec
-  \global\let\subsubsection = \appendixsubsubsec
-}
-
-% normally unnmhead0 calls unnumberedzzz:
-\outer\parseargdef\unnumbered{\unnmhead0{#1}}
-\def\unnumberedzzz#1{%
-  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
-    \global\advance\unnumberedno by 1
-  %
-  % Since an unnumbered has no number, no prefix for figures.
-  \global\let\chaplevelprefix = \empty
-  \resetallfloatnos
-  %
-  % This used to be simply \message{#1}, but TeX fully expands the
-  % argument to \message.  Therefore, if #1 contained @-commands, TeX
-  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
-  % expanded @cite (which turns out to cause errors because \cite is meant
-  % to be executed, not expanded).
-  %
-  % Anyway, we don't want the fully-expanded definition of @cite to appear
-  % as a result of the \message, we just want `@cite' itself.  We use
-  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
-  % simply yielding the contents of <toks register>.  (We also do this for
-  % the toc entries.)
-  \toks0 = {#1}%
-  \message{(\the\toks0)}%
-  %
-  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
-  %
-  \global\let\section = \unnumberedsec
-  \global\let\subsection = \unnumberedsubsec
-  \global\let\subsubsection = \unnumberedsubsubsec
-}
-
-% @centerchap is like @unnumbered, but the heading is centered.
-\outer\parseargdef\centerchap{%
-  \let\centerparametersmaybe = \centerparameters
-  \unnmhead0{#1}%
-  \let\centerparametersmaybe = \relax
-}
-
-% @top is like @unnumbered.
-\let\top\unnumbered
-
-% Sections.
-% 
-\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
-\def\seczzz#1{%
-  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
-  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
-}
-
-% normally calls appendixsectionzzz:
-\outer\parseargdef\appendixsection{\apphead1{#1}}
-\def\appendixsectionzzz#1{%
-  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
-  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
-}
-\let\appendixsec\appendixsection
-
-% normally calls unnumberedseczzz:
-\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
-\def\unnumberedseczzz#1{%
-  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
-  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
-}
-
-% Subsections.
-% 
-% normally calls numberedsubseczzz:
-\outer\parseargdef\numberedsubsec{\numhead2{#1}}
-\def\numberedsubseczzz#1{%
-  \global\subsubsecno=0  \global\advance\subsecno by 1
-  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
-}
-
-% normally calls appendixsubseczzz:
-\outer\parseargdef\appendixsubsec{\apphead2{#1}}
-\def\appendixsubseczzz#1{%
-  \global\subsubsecno=0  \global\advance\subsecno by 1
-  \sectionheading{#1}{subsec}{Yappendix}%
-                 {\appendixletter.\the\secno.\the\subsecno}%
-}
-
-% normally calls unnumberedsubseczzz:
-\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
-\def\unnumberedsubseczzz#1{%
-  \global\subsubsecno=0  \global\advance\subsecno by 1
-  \sectionheading{#1}{subsec}{Ynothing}%
-                 {\the\unnumberedno.\the\secno.\the\subsecno}%
-}
-
-% Subsubsections.
-% 
-% normally numberedsubsubseczzz:
-\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
-\def\numberedsubsubseczzz#1{%
-  \global\advance\subsubsecno by 1
-  \sectionheading{#1}{subsubsec}{Ynumbered}%
-                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-% normally appendixsubsubseczzz:
-\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
-\def\appendixsubsubseczzz#1{%
-  \global\advance\subsubsecno by 1
-  \sectionheading{#1}{subsubsec}{Yappendix}%
-                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-% normally unnumberedsubsubseczzz:
-\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
-\def\unnumberedsubsubseczzz#1{%
-  \global\advance\subsubsecno by 1
-  \sectionheading{#1}{subsubsec}{Ynothing}%
-                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
-}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\let\section = \numberedsec
-\let\subsection = \numberedsubsec
-\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-\def\majorheading{%
-  {\advance\chapheadingskip by 10pt \chapbreak }%
-  \parsearg\chapheadingzzz
-}
-
-\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
-\def\chapheadingzzz#1{%
-  \vbox{\chapfonts \raggedtitlesettings #1\par}%
-  \nobreak\bigskip \nobreak
-  \suppressfirstparagraphindent
-}
-
-% @heading, @subheading, @subsubheading.
-\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
-  \suppressfirstparagraphindent}
-\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
-  \suppressfirstparagraphindent}
-\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
-  \suppressfirstparagraphindent}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-% Parameter controlling skip before chapter headings (if needed)
-\newskip\chapheadingskip
-
-% Define plain chapter starts, and page on/off switching for it.
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-
-% Start a new page
-\def\chappager{\par\vfill\supereject}
-
-% \chapoddpage - start on an odd page for a new chapter
-% Because \domark is called before \chapoddpage, the filler page will
-% get the headings for the next chapter, which is wrong.  But we don't
-% care -- we just disable all headings on the filler page.
-\def\chapoddpage{%
-  \chappager
-  \ifodd\pageno \else
-    \begingroup
-      \headingsoff
-      \null
-      \chappager
-    \endgroup
-  \fi
-}
-
-\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{%
-\global\let\contentsalignmacro = \chapoddpage
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-% \chapmacro - Chapter opening.
-%
-% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
-% Yappendix, Yomitfromtoc), #3 the chapter number.
-% Not used for @heading series.
-%
-% To test against our argument.
-\def\Ynothingkeyword{Ynothing}
-\def\Yappendixkeyword{Yappendix}
-\def\Yomitfromtockeyword{Yomitfromtoc}
-%
-\def\chapmacro#1#2#3{%
-  \expandafter\ifx\thisenv\titlepage\else
-    \checkenv{}% chapters, etc., should not start inside an environment.
-  \fi
-  % FIXME: \chapmacro is currently called from inside \titlepage when
-  % \setcontentsaftertitlepage to print the "Table of Contents" heading, but
-  % this should probably be done by \sectionheading with an option to print
-  % in chapter size.
-  %
-  % Insert the first mark before the heading break (see notes for \domark).
-  \let\prevchapterdefs=\lastchapterdefs
-  \let\prevsectiondefs=\lastsectiondefs
-  \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
-                        \gdef\thissection{}}%
-  %
-  \def\temptype{#2}%
-  \ifx\temptype\Ynothingkeyword
-    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
-                          \gdef\thischapter{\thischaptername}}%
-  \else\ifx\temptype\Yomitfromtockeyword
-    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
-                          \gdef\thischapter{}}%
-  \else\ifx\temptype\Yappendixkeyword
-    \toks0={#1}%
-    \xdef\lastchapterdefs{%
-      \gdef\noexpand\thischaptername{\the\toks0}%
-      \gdef\noexpand\thischapternum{\appendixletter}%
-      % \noexpand\putwordAppendix avoids expanding indigestible
-      % commands in some of the translations.
-      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
-                                 \noexpand\thischapternum:
-                                 \noexpand\thischaptername}%
-    }%
-  \else
-    \toks0={#1}%
-    \xdef\lastchapterdefs{%
-      \gdef\noexpand\thischaptername{\the\toks0}%
-      \gdef\noexpand\thischapternum{\the\chapno}%
-      % \noexpand\putwordChapter avoids expanding indigestible
-      % commands in some of the translations.
-      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
-                                 \noexpand\thischapternum:
-                                 \noexpand\thischaptername}%
-    }%
-  \fi\fi\fi
-  %
-  % Output the mark.  Pass it through \safewhatsit, to take care of
-  % the preceding space.
-  \safewhatsit\domark
-  %
-  % Insert the chapter heading break.
-  \pchapsepmacro
-  %
-  % Now the second mark, after the heading break.  No break points
-  % between here and the heading.
-  \let\prevchapterdefs=\lastchapterdefs
-  \let\prevsectiondefs=\lastsectiondefs
-  \domark
-  %
-  {%
-    \chapfonts \rmisbold
-    \let\footnote=\errfootnoteheading % give better error message
-    %
-    % Have to define \lastsection before calling \donoderef, because the
-    % xref code eventually uses it.  On the other hand, it has to be called
-    % after \pchapsepmacro, or the headline will change too soon.
-    \gdef\lastsection{#1}%
-    %
-    % Only insert the separating space if we have a chapter/appendix
-    % number, and don't print the unnumbered ``number''.
-    \ifx\temptype\Ynothingkeyword
-      \setbox0 = \hbox{}%
-      \def\toctype{unnchap}%
-    \else\ifx\temptype\Yomitfromtockeyword
-      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
-      \def\toctype{omit}%
-    \else\ifx\temptype\Yappendixkeyword
-      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
-      \def\toctype{app}%
-    \else
-      \setbox0 = \hbox{#3\enspace}%
-      \def\toctype{numchap}%
-    \fi\fi\fi
-    %
-    % Write the toc entry for this chapter.  Must come before the
-    % \donoderef, because we include the current node name in the toc
-    % entry, and \donoderef resets it to empty.
-    \writetocentry{\toctype}{#1}{#3}%
-    %
-    % For pdftex, we have to write out the node definition (aka, make
-    % the pdfdest) after any page break, but before the actual text has
-    % been typeset.  If the destination for the pdf outline is after the
-    % text, then jumping from the outline may wind up with the text not
-    % being visible, for instance under high magnification.
-    \donoderef{#2}%
-    %
-    % Typeset the actual heading.
-    \nobreak % Avoid page breaks at the interline glue.
-    \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
-          \unhbox0 #1\par}%
-  }%
-  \nobreak\bigskip % no page break after a chapter title
-  \nobreak
-}
-
-% @centerchap -- centered and unnumbered.
-\let\centerparametersmaybe = \relax
-\def\centerparameters{%
-  \advance\rightskip by 3\rightskip
-  \leftskip = \rightskip
-  \parfillskip = 0pt
-}
-
-
-% Section titles.  These macros combine the section number parts and
-% call the generic \sectionheading to do the printing.
-%
-\newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
-
-% Subsection titles.
-\newskip\subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
-
-% Subsubsection titles.
-\def\subsubsecheadingskip{\subsecheadingskip}
-\def\subsubsecheadingbreak{\subsecheadingbreak}
-
-
-% Print any size, any type, section title.
-%
-% #1 is the text of the title,
-% #2 is the section level (sec/subsec/subsubsec),
-% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
-% #4 is the section number.
-%
-\def\seckeyword{sec}
-%
-\def\sectionheading#1#2#3#4{%
-  {%
-    \def\sectionlevel{#2}%
-    \def\temptype{#3}%
-    %
-    % It is ok for the @heading series commands to appear inside an
-    % environment (it's been historically allowed, though the logic is
-    % dubious), but not the others.
-    \ifx\temptype\Yomitfromtockeyword\else
-      \checkenv{}% non-@*heading should not be in an environment.
-    \fi
-    \let\footnote=\errfootnoteheading
-    %
-    % Switch to the right set of fonts.
-    \csname #2fonts\endcsname \rmisbold
-    %
-    % Insert first mark before the heading break (see notes for \domark).
-    \let\prevsectiondefs=\lastsectiondefs
-    \ifx\temptype\Ynothingkeyword
-      \ifx\sectionlevel\seckeyword
-        \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
-                              \gdef\thissection{\thissectionname}}%
-      \fi
-    \else\ifx\temptype\Yomitfromtockeyword
-      % Don't redefine \thissection.
-    \else\ifx\temptype\Yappendixkeyword
-      \ifx\sectionlevel\seckeyword
-        \toks0={#1}%
-        \xdef\lastsectiondefs{%
-          \gdef\noexpand\thissectionname{\the\toks0}%
-          \gdef\noexpand\thissectionnum{#4}%
-          % \noexpand\putwordSection avoids expanding indigestible
-          % commands in some of the translations.
-          \gdef\noexpand\thissection{\noexpand\putwordSection{}
-                                     \noexpand\thissectionnum:
-                                     \noexpand\thissectionname}%
-        }%
-      \fi
-    \else
-      \ifx\sectionlevel\seckeyword
-        \toks0={#1}%
-        \xdef\lastsectiondefs{%
-          \gdef\noexpand\thissectionname{\the\toks0}%
-          \gdef\noexpand\thissectionnum{#4}%
-          % \noexpand\putwordSection avoids expanding indigestible
-          % commands in some of the translations.
-          \gdef\noexpand\thissection{\noexpand\putwordSection{}
-                                     \noexpand\thissectionnum:
-                                     \noexpand\thissectionname}%
-        }%
-      \fi
-    \fi\fi\fi
-    %
-    % Go into vertical mode.  Usually we'll already be there, but we
-    % don't want the following whatsit to end up in a preceding paragraph
-    % if the document didn't happen to have a blank line.
-    \par
-    %
-    % Output the mark.  Pass it through \safewhatsit, to take care of
-    % the preceding space.
-    \safewhatsit\domark
-    %
-    % Insert space above the heading.
-    \csname #2headingbreak\endcsname
-    %
-    % Now the second mark, after the heading break.  No break points
-    % between here and the heading.
-    \global\let\prevsectiondefs=\lastsectiondefs
-    \domark
-    %
-    % Only insert the space after the number if we have a section number.
-    \ifx\temptype\Ynothingkeyword
-      \setbox0 = \hbox{}%
-      \def\toctype{unn}%
-      \gdef\lastsection{#1}%
-    \else\ifx\temptype\Yomitfromtockeyword
-      % for @headings -- no section number, don't include in toc,
-      % and don't redefine \lastsection.
-      \setbox0 = \hbox{}%
-      \def\toctype{omit}%
-      \let\sectionlevel=\empty
-    \else\ifx\temptype\Yappendixkeyword
-      \setbox0 = \hbox{#4\enspace}%
-      \def\toctype{app}%
-      \gdef\lastsection{#1}%
-    \else
-      \setbox0 = \hbox{#4\enspace}%
-      \def\toctype{num}%
-      \gdef\lastsection{#1}%
-    \fi\fi\fi
-    %
-    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
-    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
-    %
-    % Write the node reference (= pdf destination for pdftex).
-    % Again, see comments in \chapmacro.
-    \donoderef{#3}%
-    %
-    % Interline glue will be inserted when the vbox is completed.
-    % That glue will be a valid breakpoint for the page, since it'll be
-    % preceded by a whatsit (usually from the \donoderef, or from the
-    % \writetocentry if there was no node).  We don't want to allow that
-    % break, since then the whatsits could end up on page n while the
-    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
-    \nobreak
-    %
-    % Output the actual section heading.
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
-          \hangindent=\wd0  % zero if no section number
-          \unhbox0 #1}%
-  }%
-  % Add extra space after the heading -- half of whatever came above it.
-  % Don't allow stretch, though.
-  \kern .5 \csname #2headingskip\endcsname
-  %
-  % Do not let the kern be a potential breakpoint, as it would be if it
-  % was followed by glue.
-  \nobreak
-  %
-  % We'll almost certainly start a paragraph next, so don't let that
-  % glue accumulate.  (Not a breakpoint because it's preceded by a
-  % discardable item.)  However, when a paragraph is not started next
-  % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
-  % or the negative glue will cause weirdly wrong output, typically
-  % obscuring the section heading with something else.
-  \vskip-\parskip
-  %
-  % This is so the last item on the main vertical list is a known
-  % \penalty > 10000, so \startdefun, etc., can recognize the situation
-  % and do the needful.
-  \penalty 10001
-}
-
-
-\message{toc,}
-% Table of contents.
-\newwrite\tocfile
-
-% Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.
-%
-% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
-% We append the current node name (if any) and page number as additional
-% arguments for the \{chap,sec,...}entry macros which will eventually
-% read this.  The node name is used in the pdf outlines as the
-% destination to jump to.
-%
-% We open the .toc file for writing here instead of at @setfilename (or
-% any other fixed time) so that @contents can be anywhere in the document.
-% But if #1 is `omit', then we don't do anything.  This is used for the
-% table of contents chapter openings themselves.
-%
-\newif\iftocfileopened
-\def\omitkeyword{omit}%
-%
-\def\writetocentry#1#2#3{%
-  \edef\writetoctype{#1}%
-  \ifx\writetoctype\omitkeyword \else
-    \iftocfileopened\else
-      \immediate\openout\tocfile = \jobname.toc
-      \global\tocfileopenedtrue
-    \fi
-    %
-    \iflinks
-      {\atdummies
-       \edef\temp{%
-         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
-       \temp
-      }%
-    \fi
-  \fi
-  %
-  % Tell \shipout to create a pdf destination on each page, if we're
-  % writing pdf.  These are used in the table of contents.  We can't
-  % just write one on every page because the title pages are numbered
-  % 1 and 2 (the page numbers aren't printed), and so are the first
-  % two pages of the document.  Thus, we'd have two destinations named
-  % `1', and two named `2'.
-  \ifpdf
-    \global\pdfmakepagedesttrue
-  \else
-    \ifx\XeTeXrevision\thisisundefined
-    \else
-      \global\pdfmakepagedesttrue
-    \fi
-  \fi
-}
-
-
-% These characters do not print properly in the Computer Modern roman
-% fonts, so we must take special care.  This is more or less redundant
-% with the Texinfo input format setup at the end of this file.
-%
-\def\activecatcodes{%
-  \catcode`\"=\active
-  \catcode`\$=\active
-  \catcode`\<=\active
-  \catcode`\>=\active
-  \catcode`\\=\active
-  \catcode`\^=\active
-  \catcode`\_=\active
-  \catcode`\|=\active
-  \catcode`\~=\active
-}
-
-
-% Read the toc file, which is essentially Texinfo input.
-\def\readtocfile{%
-  \setupdatafile
-  \activecatcodes
-  \input \tocreadfilename
-}
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\newcount\savepageno
-\newcount\lastnegativepageno \lastnegativepageno = -1
-
-% Prepare to read what we've written to \tocfile.
-%
-\def\startcontents#1{%
-  % If @setchapternewpage on, and @headings double, the contents should
-  % start on an odd page, unlike chapters.  Thus, we maintain
-  % \contentsalignmacro in parallel with \pagealignmacro.
-  % From: Torbjorn Granlund <tege@matematik.su.se>
-  \contentsalignmacro
-  \immediate\closeout\tocfile
-  %
-  % Don't need to put `Contents' or `Short Contents' in the headline.
-  % It is abundantly clear what they are.
-  \chapmacro{#1}{Yomitfromtoc}{}%
-  %
-  \savepageno = \pageno
-  \begingroup                  % Set up to handle contents files properly.
-    \raggedbottom              % Worry more about breakpoints than the bottom.
-    \entryrightmargin=\contentsrightmargin % Don't use the full line length.
-    %
-    % Roman numerals for page numbers.
-    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
-}
-
-% redefined for the two-volume lispref.  We always output on
-% \jobname.toc even if this is redefined.
-%
-\def\tocreadfilename{\jobname.toc}
-
-% Normal (long) toc.
-%
-\def\contents{%
-  \startcontents{\putwordTOC}%
-    \openin 1 \tocreadfilename\space
-    \ifeof 1 \else
-      \readtocfile
-    \fi
-    \vfill \eject
-    \contentsalignmacro % in case @setchapternewpage odd is in effect
-    \ifeof 1 \else
-      \pdfmakeoutlines
-    \fi
-    \closein 1
-  \endgroup
-  \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
-}
-
-% And just the chapters.
-\def\summarycontents{%
-  \startcontents{\putwordShortTOC}%
-    %
-    \let\partentry = \shortpartentry
-    \let\numchapentry = \shortchapentry
-    \let\appentry = \shortchapentry
-    \let\unnchapentry = \shortunnchapentry
-    % We want a true roman here for the page numbers.
-    \secfonts
-    \let\rm=\shortcontrm \let\bf=\shortcontbf
-    \let\sl=\shortcontsl \let\tt=\shortconttt
-    \rm
-    \hyphenpenalty = 10000
-    \advance\baselineskip by 1pt % Open it up a little.
-    \def\numsecentry##1##2##3##4{}
-    \let\appsecentry = \numsecentry
-    \let\unnsecentry = \numsecentry
-    \let\numsubsecentry = \numsecentry
-    \let\appsubsecentry = \numsecentry
-    \let\unnsubsecentry = \numsecentry
-    \let\numsubsubsecentry = \numsecentry
-    \let\appsubsubsecentry = \numsecentry
-    \let\unnsubsubsecentry = \numsecentry
-    \openin 1 \tocreadfilename\space
-    \ifeof 1 \else
-      \readtocfile
-    \fi
-    \closein 1
-    \vfill \eject
-    \contentsalignmacro % in case @setchapternewpage odd is in effect
-  \endgroup
-  \lastnegativepageno = \pageno
-  \global\pageno = \savepageno
-}
-\let\shortcontents = \summarycontents
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
-%
-\def\shortchaplabel#1{%
-  % This space should be enough, since a single number is .5em, and the
-  % widest letter (M) is 1em, at least in the Computer Modern fonts.
-  % But use \hss just in case.
-  % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in by \shortchapentry above.)
-  %
-  % We'd like to right-justify chapter numbers, but that looks strange
-  % with appendix letters.  And right-justifying numbers and
-  % left-justifying letters looks strange when there is less than 10
-  % chapters.  Have to read the whole toc once to know how many chapters
-  % there are before deciding ...
-  \hbox to 1em{#1\hss}%
-}
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Parts, in the main contents.  Replace the part number, which doesn't
-% exist, with an empty box.  Let's hope all the numbers have the same width.
-% Also ignore the page number, which is conventionally not printed.
-\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
-\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}}
-%
-% Parts, in the short toc.
-\def\shortpartentry#1#2#3#4{%
-  \penalty-300
-  \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
-  \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
-}
-
-% Chapters, in the main contents.
-\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
-
-% Chapters, in the short toc.
-% See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3#4{%
-  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
-}
-
-% Appendices, in the main contents.
-% Need the word Appendix, and a fixed-size box.
-%
-\def\appendixbox#1{%
-  % We use M since it's probably the widest letter.
-  \setbox0 = \hbox{\putwordAppendix{} M}%
-  \hbox to \wd0{\putwordAppendix{} #1\hss}}
-%
-\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}
-
-% Unnumbered chapters.
-\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
-\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
-
-% Sections.
-\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
-\let\appsecentry=\numsecentry
-\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
-
-% Subsections.
-\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsecentry=\numsubsecentry
-\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
-
-% And subsubsections.
-\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
-\let\appsubsubsecentry=\numsubsubsecentry
-\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
-
-% This parameter controls the indentation of the various levels.
-% Same as \defaultparindent.
-\newdimen\tocindent \tocindent = 15pt
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we want it to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
-   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
-   \begingroup
-     % Move the page numbers slightly to the right
-     \advance\entryrightmargin by -0.05em
-     \chapentryfonts
-     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-   \endgroup
-   \nobreak\vskip .25\baselineskip plus.1\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
-  \secentryfonts \leftskip=\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
-  \subsecentryfonts \leftskip=2\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
-  \subsubsecentryfonts \leftskip=3\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-% We use the same \entry macro as for the index entries.
-\let\tocentry = \entry
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\def\subsecentryfonts{\textfonts}
-\def\subsubsecentryfonts{\textfonts}
-
-
-\message{environments,}
-% @foo ... @end foo.
-
-% @tex ... @end tex    escapes into raw TeX temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain @ character.
-
-\envdef\tex{%
-  \setupmarkupstyle{tex}%
-  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
-  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
-  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
-  \catcode `\%=14
-  \catcode `\+=\other
-  \catcode `\"=\other
-  \catcode `\|=\other
-  \catcode `\<=\other
-  \catcode `\>=\other
-  \catcode `\`=\other
-  \catcode `\'=\other
-  %
-  % ' is active in math mode (mathcode"8000).  So reset it, and all our
-  % other math active characters (just in case), to plain's definitions.
-  \mathactive
-  %
-  % Inverse of the list at the beginning of the file.
-  \let\b=\ptexb
-  \let\bullet=\ptexbullet
-  \let\c=\ptexc
-  \let\,=\ptexcomma
-  \let\.=\ptexdot
-  \let\dots=\ptexdots
-  \let\equiv=\ptexequiv
-  \let\!=\ptexexclam
-  \let\i=\ptexi
-  \let\indent=\ptexindent
-  \let\noindent=\ptexnoindent
-  \let\{=\ptexlbrace
-  \let\+=\tabalign
-  \let\}=\ptexrbrace
-  \let\/=\ptexslash
-  \let\sp=\ptexsp
-  \let\*=\ptexstar
-  %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
-  \let\t=\ptext
-  \expandafter \let\csname top\endcsname=\ptextop  % we've made it outer
-  \let\frenchspacing=\plainfrenchspacing
-  %
-  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
-  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
-  \def\@{@}%
-}
-% There is no need to define \Etex.
-
-% Define @lisp ... @end lisp.
-% @lisp environment forms a group so it can rebind things,
-% including the definition of @end lisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments.  \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical.  We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip.
-%
-\def\aboveenvbreak{{%
-  % =10000 instead of <10000 because of a special case in \itemzzz and
-  % \sectionheading, q.v.
-  \ifnum \lastpenalty=10000 \else
-    \advance\envskipamount by \parskip
-    \endgraf
-    \ifdim\lastskip<\envskipamount
-      \removelastskip
-      \ifnum\lastpenalty<10000
-        % Penalize breaking before the environment, because preceding text
-        % often leads into it.
-        \penalty100
-      \fi
-      \vskip\envskipamount
-    \fi
-  \fi
-}}
-
-\def\afterenvbreak{{%
-  % =10000 instead of <10000 because of a special case in \itemzzz and
-  % \sectionheading, q.v.
-  \ifnum \lastpenalty=10000 \else
-    \advance\envskipamount by \parskip
-    \endgraf
-    \ifdim\lastskip<\envskipamount
-      \removelastskip
-      % it's not a good place to break if the last penalty was \nobreak
-      % or better ...
-      \ifnum\lastpenalty<10000 \penalty-50 \fi
-      \vskip\envskipamount
-    \fi
-  \fi
-}}
-
-% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
-% also clear it, so that its embedded environments do the narrowing again.
-\let\nonarrowing=\relax
-
-% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
-% environment contents.
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
-        \ctl\leaders\hrule height\circthick\hfil\ctr
-        \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
-        \cbl\leaders\hrule height\circthick\hfil\cbr
-        \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\envdef\cartouche{%
-  \ifhmode\par\fi  % can't be in the midst of a paragraph.
-  \startsavinginserts
-  \lskip=\leftskip \rskip=\rightskip
-  \leftskip=0pt\rightskip=0pt % we want these *outside*.
-  \cartinner=\hsize \advance\cartinner by-\lskip
-  \advance\cartinner by-\rskip
-  \cartouter=\hsize
-  \advance\cartouter by 18.4pt % allow for 3pt kerns on either
-                               % side, and for 6pt waste from
-                               % each corner char, and rule thickness
-  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-  %
-  % If this cartouche directly follows a sectioning command, we need the
-  % \parskip glue (backspaced over by default) or the cartouche can
-  % collide with the section heading.
-  \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
-  %
-  \setbox\groupbox=\vbox\bgroup
-      \baselineskip=0pt\parskip=0pt\lineskip=0pt
-      \carttop
-      \hbox\bgroup
-         \hskip\lskip
-         \vrule\kern3pt
-         \vbox\bgroup
-             \kern3pt
-             \hsize=\cartinner
-             \baselineskip=\normbskip
-             \lineskip=\normlskip
-             \parskip=\normpskip
-             \vskip -\parskip
-             \comment % For explanation, see the end of def\group.
-}
-\def\Ecartouche{%
-              \ifhmode\par\fi
-             \kern3pt
-         \egroup
-         \kern3pt\vrule
-         \hskip\rskip
-      \egroup
-      \cartbot
-  \egroup
-  \addgroupbox
-  \checkinserts
-}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\newdimen\nonfillparindent
-\def\nonfillstart{%
-  \aboveenvbreak
-  \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy
-  \sepspaces % Make spaces be word-separators rather than space tokens.
-  \let\par = \lisppar % don't ignore blank lines
-  \obeylines % each line of input is a line of output
-  \parskip = 0pt
-  % Turn off paragraph indentation but redefine \indent to emulate
-  % the normal \indent.
-  \nonfillparindent=\parindent
-  \parindent = 0pt
-  \let\indent\nonfillindent
-  %
-  \emergencystretch = 0pt % don't try to avoid overfull boxes
-  \ifx\nonarrowing\relax
-    \advance \leftskip by \lispnarrowing
-    \exdentamount=\lispnarrowing
-  \else
-    \let\nonarrowing = \relax
-  \fi
-  \let\exdent=\nofillexdent
-}
-
-\begingroup
-\obeyspaces
-% We want to swallow spaces (but not other tokens) after the fake
-% @indent in our nonfill-environments, where spaces are normally
-% active and set to @tie, resulting in them not being ignored after
-% @indent.
-\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
-\gdef\nonfillindentcheck{%
-\ifx\temp %
-\expandafter\nonfillindentgobble%
-\else%
-\leavevmode\nonfillindentbox%
-\fi%
-}%
-\endgroup
-\def\nonfillindentgobble#1{\nonfillindent}
-\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
-
-% If you want all examples etc. small: @set dispenvsize small.
-% If you want even small examples the full size: @set dispenvsize nosmall.
-% This affects the following displayed environments:
-%    @example, @display, @format, @lisp
-%
-\def\smallword{small}
-\def\nosmallword{nosmall}
-\let\SETdispenvsize\relax
-\def\setnormaldispenv{%
-  \ifx\SETdispenvsize\smallword
-    % end paragraph for sake of leading, in case document has no blank
-    % line.  This is redundant with what happens in \aboveenvbreak, but
-    % we need to do it before changing the fonts, and it's inconvenient
-    % to change the fonts afterward.
-    \ifnum \lastpenalty=10000 \else \endgraf \fi
-    \smallexamplefonts \rm
-  \fi
-}
-\def\setsmalldispenv{%
-  \ifx\SETdispenvsize\nosmallword
-  \else
-    \ifnum \lastpenalty=10000 \else \endgraf \fi
-    \smallexamplefonts \rm
-  \fi
-}
-
-% We often define two environments, @foo and @smallfoo.
-% Let's do it in one command.  #1 is the env name, #2 the definition.
-\def\makedispenvdef#1#2{%
-  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
-  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
-  \expandafter\let\csname E#1\endcsname \afterenvbreak
-  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
-}
-
-% Define two environment synonyms (#1 and #2) for an environment.
-\def\maketwodispenvdef#1#2#3{%
-  \makedispenvdef{#1}{#3}%
-  \makedispenvdef{#2}{#3}%
-}
-%
-% @lisp: indented, narrowed, typewriter font;
-% @example: same as @lisp.
-%
-% @smallexample and @smalllisp: use smaller fonts.
-% Originally contributed by Pavel@xerox.
-%
-\maketwodispenvdef{lisp}{example}{%
-  \nonfillstart
-  \tt\setupmarkupstyle{example}%
-  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
-  \gobble % eat return
-}
-% @display/@smalldisplay: same as @lisp except keep current font.
-%
-\makedispenvdef{display}{%
-  \nonfillstart
-  \gobble
-}
-
-% @format/@smallformat: same as @display except don't narrow margins.
-%
-\makedispenvdef{format}{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \gobble
-}
-
-% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
-\envdef\flushleft{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \gobble
-}
-\let\Eflushleft = \afterenvbreak
-
-% @flushright.
-%
-\envdef\flushright{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \advance\leftskip by 0pt plus 1fill\relax
-  \gobble
-}
-\let\Eflushright = \afterenvbreak
-
-
-% @raggedright does more-or-less normal line breaking but no right
-% justification.  From plain.tex.  Don't stretch around special
-% characters in urls in this environment, since the stretch at the right
-% should be enough.
-\envdef\raggedright{%
-  \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
-  \def\urefprestretchamount{0pt}%
-  \def\urefpoststretchamount{0pt}%
-}
-\let\Eraggedright\par
-
-\envdef\raggedleft{%
-  \parindent=0pt \leftskip0pt plus2em
-  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
-  \hbadness=10000 % Last line will usually be underfull, so turn off
-                  % badness reporting.
-}
-\let\Eraggedleft\par
-
-\envdef\raggedcenter{%
-  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
-  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
-  \hbadness=10000 % Last line will usually be underfull, so turn off
-                  % badness reporting.
-}
-\let\Eraggedcenter\par
-
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.  We keep \parskip nonzero in general, since
-% we're doing normal filling.  So, when using \aboveenvbreak and
-% \afterenvbreak, temporarily make \parskip 0.
-%
-\makedispenvdef{quotation}{\quotationstart}
-%
-\def\quotationstart{%
-  \indentedblockstart % same as \indentedblock, but increase right margin too.
-  \ifx\nonarrowing\relax
-    \advance\rightskip by \lispnarrowing
-  \fi
-  \parsearg\quotationlabel
-}
-
-% We have retained a nonzero parskip for the environment, since we're
-% doing normal filling.
-%
-\def\Equotation{%
-  \par
-  \ifx\quotationauthor\thisisundefined\else
-    % indent a bit.
-    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
-  \fi
-  {\parskip=0pt \afterenvbreak}%
-}
-\def\Esmallquotation{\Equotation}
-
-% If we're given an argument, typeset it in bold with a colon after.
-\def\quotationlabel#1{%
-  \def\temp{#1}%
-  \ifx\temp\empty \else
-    {\bf #1: }%
-  \fi
-}
-
-% @indentedblock is like @quotation, but indents only on the left and
-% has no optional argument.
-% 
-\makedispenvdef{indentedblock}{\indentedblockstart}
-%
-\def\indentedblockstart{%
-  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
-  \parindent=0pt
-  %
-  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
-  \ifx\nonarrowing\relax
-    \advance\leftskip by \lispnarrowing
-    \exdentamount = \lispnarrowing
-  \else
-    \let\nonarrowing = \relax
-  \fi
-}
-
-% Keep a nonzero parskip for the environment, since we're doing normal filling.
-%
-\def\Eindentedblock{%
-  \par
-  {\parskip=0pt \afterenvbreak}%
-}
-\def\Esmallindentedblock{\Eindentedblock}
-
-
-% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
-% If we want to allow any <char> as delimiter,
-% we need the curly braces so that makeinfo sees the @verb command, eg:
-% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
-%
-% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
-%
-% [Knuth] p.344; only we need to do the other characters Texinfo sets
-% active too.  Otherwise, they get lost as the first character on a
-% verbatim line.
-\def\dospecials{%
-  \do\ \do\\\do\{\do\}\do\$\do\&%
-  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
-  \do\<\do\>\do\|\do\@\do+\do\"%
-  % Don't do the quotes -- if we do, @set txicodequoteundirected and
-  % @set txicodequotebacktick will not have effect on @verb and
-  % @verbatim, and ?` and !` ligatures won't get disabled.
-  %\do\`\do\'%
-}
-%
-% [Knuth] p. 380
-\def\uncatcodespecials{%
-  \def\do##1{\catcode`##1=\other}\dospecials}
-%
-% Setup for the @verb command.
-%
-% Eight spaces for a tab
-\begingroup
-  \catcode`\^^I=\active
-  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
-\endgroup
-%
-\def\setupverb{%
-  \tt  % easiest (and conventionally used) font for verbatim
-  \def\par{\leavevmode\endgraf}%
-  \setupmarkupstyle{verb}%
-  \tabeightspaces
-  % Respect line breaks,
-  % print special symbols as themselves, and
-  % make each space count
-  % must do in this order:
-  \obeylines \uncatcodespecials \sepspaces
-}
-
-% Setup for the @verbatim environment
-%
-% Real tab expansion.
-\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
-%
-% We typeset each line of the verbatim in an \hbox, so we can handle
-% tabs.  The \global is in case the verbatim line starts with an accent,
-% or some other command that starts with a begin-group.  Otherwise, the
-% entire \verbbox would disappear at the corresponding end-group, before
-% it is typeset.  Meanwhile, we can't have nested verbatim commands
-% (can we?), so the \global won't be overwriting itself.
-\newbox\verbbox
-\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
-%
-\begingroup
-  \catcode`\^^I=\active
-  \gdef\tabexpand{%
-    \catcode`\^^I=\active
-    \def^^I{\leavevmode\egroup
-      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
-      \divide\dimen\verbbox by\tabw
-      \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
-      \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
-      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
-    }%
-  }
-\endgroup
-
-% start the verbatim environment.
-\def\setupverbatim{%
-  \let\nonarrowing = t%
-  \nonfillstart
-  \tt % easiest (and conventionally used) font for verbatim
-  % The \leavevmode here is for blank lines.  Otherwise, we would
-  % never \starttabox and the \egroup would end verbatim mode.
-  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
-  \tabexpand
-  \setupmarkupstyle{verbatim}%
-  % Respect line breaks,
-  % print special symbols as themselves, and
-  % make each space count.
-  % Must do in this order:
-  \obeylines \uncatcodespecials \sepspaces
-  \everypar{\starttabbox}%
-}
-
-% Do the @verb magic: verbatim text is quoted by unique
-% delimiter characters.  Before first delimiter expect a
-% right brace, after last delimiter expect closing brace:
-%
-%    \def\doverb'{'<char>#1<char>'}'{#1}
-%
-% [Knuth] p. 382; only eat outer {}
-\begingroup
-  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
-  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
-\endgroup
-%
-\def\verb{\begingroup\setupverb\doverb}
-%
-%
-% Do the @verbatim magic: define the macro \doverbatim so that
-% the (first) argument ends when '@end verbatim' is reached, ie:
-%
-%     \def\doverbatim#1@end verbatim{#1}
-%
-% For Texinfo it's a lot easier than for LaTeX,
-% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'.
-%
-% Inspired by LaTeX's verbatim command set [latex.ltx]
-%
-\begingroup
-  \catcode`\ =\active
-  \obeylines %
-  % ignore everything up to the first ^^M, that's the newline at the end
-  % of the @verbatim input line itself.  Otherwise we get an extra blank
-  % line in the output.
-  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
-  % We really want {...\end verbatim} in the body of the macro, but
-  % without the active space; thus we have to use \xdef and \gobble.
-\endgroup
-%
-\envdef\verbatim{%
-    \setupverbatim\doverbatim
-}
-\let\Everbatim = \afterenvbreak
-
-
-% @verbatiminclude FILE - insert text of file in verbatim environment.
-%
-\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
-%
-\def\doverbatiminclude#1{%
-  {%
-    \makevalueexpandable
-    \setupverbatim
-    \indexnofonts       % Allow `@@' and other weird things in file names.
-    \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
-    \input #1
-    \afterenvbreak
-  }%
-}
-
-% @copying ... @end copying.
-% Save the text away for @insertcopying later.
-%
-% We save the uninterpreted tokens, rather than creating a box.
-% Saving the text in a box would be much easier, but then all the
-% typesetting commands (@smallbook, font changes, etc.) have to be done
-% beforehand -- and a) we want @copying to be done first in the source
-% file; b) letting users define the frontmatter in as flexible order as
-% possible is desirable.
-%
-\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
-\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
-%
-\def\insertcopying{%
-  \begingroup
-    \parindent = 0pt  % paragraph indentation looks wrong on title page
-    \scanexp\copyingtext
-  \endgroup
-}
-
-
-\message{defuns,}
-% @defun etc.
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-\newcount\defunpenalty
-
-% Start the processing of @deffn:
-\def\startdefun{%
-  \ifnum\lastpenalty<10000
-    \medbreak
-    \defunpenalty=10003 % Will keep this @deffn together with the
-                        % following @def command, see below.
-  \else
-    % If there are two @def commands in a row, we'll have a \nobreak,
-    % which is there to keep the function description together with its
-    % header.  But if there's nothing but headers, we need to allow a
-    % break somewhere.  Check specifically for penalty 10002, inserted
-    % by \printdefunline, instead of 10000, since the sectioning
-    % commands also insert a nobreak penalty, and we don't want to allow
-    % a break between a section heading and a defun.
-    %
-    % As a further refinement, we avoid "club" headers by signalling
-    % with penalty of 10003 after the very first @deffn in the
-    % sequence (see above), and penalty of 10002 after any following
-    % @def command.
-    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
-    %
-    % Similarly, after a section heading, do not allow a break.
-    % But do insert the glue.
-    \medskip  % preceded by discardable penalty, so not a breakpoint
-  \fi
-  %
-  \parindent=0in
-  \advance\leftskip by \defbodyindent
-  \exdentamount=\defbodyindent
-}
-
-\def\dodefunx#1{%
-  % First, check whether we are in the right environment:
-  \checkenv#1%
-  %
-  % As above, allow line break if we have multiple x headers in a row.
-  % It's not a great place, though.
-  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
-  %
-  % And now, it's time to reuse the body of the original defun:
-  \expandafter\gobbledefun#1%
-}
-\def\gobbledefun#1\startdefun{}
-
-% \printdefunline \deffnheader{text}
-%
-\def\printdefunline#1#2{%
-  \begingroup
-    % call \deffnheader:
-    #1#2 \endheader
-    % common ending:
-    \interlinepenalty = 10000
-    \advance\rightskip by 0pt plus 1fil\relax
-    \endgraf
-    \nobreak\vskip -\parskip
-    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
-    % Some of the @defun-type tags do not enable magic parentheses,
-    % rendering the following check redundant.  But we don't optimize.
-    \checkparencounts
-  \endgroup
-}
-
-\def\Edefun{\endgraf\medbreak}
-
-% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
-% the only thing remaining is to define \deffnheader.
-%
-\def\makedefun#1{%
-  \expandafter\let\csname E#1\endcsname = \Edefun
-  \edef\temp{\noexpand\domakedefun
-    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
-  \temp
-}
-
-% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }
-%
-% Define \deffn and \deffnx, without parameters.
-% \deffnheader has to be defined explicitly.
-%
-\def\domakedefun#1#2#3{%
-  \envdef#1{%
-    \startdefun
-    \doingtypefnfalse    % distinguish typed functions from all else
-    \parseargusing\activeparens{\printdefunline#3}%
-  }%
-  \def#2{\dodefunx#1}%
-  \def#3%
-}
-
-\newif\ifdoingtypefn       % doing typed function?
-\newif\ifrettypeownline    % typeset return type on its own line?
-
-% @deftypefnnewline on|off says whether the return type of typed functions
-% are printed on their own line.  This affects @deftypefn, @deftypefun,
-% @deftypeop, and @deftypemethod.
-% 
-\parseargdef\deftypefnnewline{%
-  \def\temp{#1}%
-  \ifx\temp\onword
-    \expandafter\let\csname SETtxideftypefnnl\endcsname
-      = \empty
-  \else\ifx\temp\offword
-    \expandafter\let\csname SETtxideftypefnnl\endcsname
-      = \relax
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @txideftypefnnl value `\temp',
-                must be on|off}%
-  \fi\fi
-}
-
-% Untyped functions:
-
-% @deffn category name args
-\makedefun{deffn}{\deffngeneral{}}
-
-% @deffn category class name args
-\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
-
-% \defopon {category on}class name args
-\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deffngeneral {subind}category name args
-%
-\def\deffngeneral#1#2 #3 #4\endheader{%
-  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
-  \dosubind{fn}{\code{#3}}{#1}%
-  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
-}
-
-% Typed functions:
-
-% @deftypefn category type name args
-\makedefun{deftypefn}{\deftypefngeneral{}}
-
-% @deftypeop category class type name args
-\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
-
-% \deftypeopon {category on}class type name args
-\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypefngeneral {subind}category type name args
-%
-\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
-  \dosubind{fn}{\code{#4}}{#1}%
-  \doingtypefntrue
-  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-% Typed variables:
-
-% @deftypevr category type var args
-\makedefun{deftypevr}{\deftypecvgeneral{}}
-
-% @deftypecv category class type var args
-\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
-
-% \deftypecvof {category of}class type var args
-\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
-
-% \deftypecvgeneral {subind}category type var args
-%
-\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
-  \dosubind{vr}{\code{#4}}{#1}%
-  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
-}
-
-% Untyped variables:
-
-% @defvr category var args
-\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
-
-% @defcv category class var args
-\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
-
-% \defcvof {category of}class var args
-\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
-
-% Types:
-
-% @deftp category name args
-\makedefun{deftp}#1 #2 #3\endheader{%
-  \doind{tp}{\code{#2}}%
-  \defname{#1}{}{#2}\defunargs{#3\unskip}%
-}
-
-% Remaining @defun-like shortcuts:
-\makedefun{defun}{\deffnheader{\putwordDeffunc} }
-\makedefun{defmac}{\deffnheader{\putwordDefmac} }
-\makedefun{defspec}{\deffnheader{\putwordDefspec} }
-\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
-\makedefun{defvar}{\defvrheader{\putwordDefvar} }
-\makedefun{defopt}{\defvrheader{\putwordDefopt} }
-\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
-\makedefun{defmethod}{\defopon\putwordMethodon}
-\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
-\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
-\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
-
-% \defname, which formats the name of the @def (not the args).
-% #1 is the category, such as "Function".
-% #2 is the return type, if any.
-% #3 is the function name.
-%
-% We are followed by (but not passed) the arguments, if any.
-%
-\def\defname#1#2#3{%
-  \par
-  % Get the values of \leftskip and \rightskip as they were outside the @def...
-  \advance\leftskip by -\defbodyindent
-  %
-  % Determine if we are typesetting the return type of a typed function
-  % on a line by itself.
-  \rettypeownlinefalse
-  \ifdoingtypefn  % doing a typed function specifically?
-    % then check user option for putting return type on its own line:
-    \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
-      \rettypeownlinetrue
-    \fi
-  \fi
-  %
-  % How we'll format the category name.  Putting it in brackets helps
-  % distinguish it from the body text that may end up on the next line
-  % just below it.
-  \def\temp{#1}%
-  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
-  %
-  % Figure out line sizes for the paragraph shape.  We'll always have at
-  % least two.
-  \tempnum = 2
-  %
-  % The first line needs space for \box0; but if \rightskip is nonzero,
-  % we need only space for the part of \box0 which exceeds it:
-  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
-  %
-  % If doing a return type on its own line, we'll have another line.
-  \ifrettypeownline
-    \advance\tempnum by 1
-    \def\maybeshapeline{0in \hsize}%
-  \else
-    \def\maybeshapeline{}%
-  \fi
-  %
-  % The continuations:
-  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
-  %
-  % The final paragraph shape:
-  \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
-  %
-  % Put the category name at the right margin.
-  \noindent
-  \hbox to 0pt{%
-    \hfil\box0 \kern-\hsize
-    % \hsize has to be shortened this way:
-    \kern\leftskip
-    % Intentionally do not respect \rightskip, since we need the space.
-  }%
-  %
-  % Allow all lines to be underfull without complaint:
-  \tolerance=10000 \hbadness=10000
-  \exdentamount=\defbodyindent
-  {%
-    % defun fonts. We use typewriter by default (used to be bold) because:
-    % . we're printing identifiers, they should be in tt in principle.
-    % . in languages with many accents, such as Czech or French, it's
-    %   common to leave accents off identifiers.  The result looks ok in
-    %   tt, but exceedingly strange in rm.
-    % . we don't want -- and --- to be treated as ligatures.
-    % . this still does not fix the ?` and !` ligatures, but so far no
-    %   one has made identifiers using them :).
-    \df \tt
-    \def\temp{#2}% text of the return type
-    \ifx\temp\empty\else
-      \tclose{\temp}% typeset the return type
-      \ifrettypeownline
-        % put return type on its own line; prohibit line break following:
-        \hfil\vadjust{\nobreak}\break  
-      \else
-        \space  % type on same line, so just followed by a space
-      \fi
-    \fi           % no return type
-    #3% output function name
-  }%
-  {\rm\enskip}% hskip 0.5 em of \tenrm
-  %
-  \boldbrax
-  % arguments will be output next, if any.
-}
-
-% Print arguments in slanted roman (not ttsl), inconsistently with using
-% tt for the name.  This is because literal text is sometimes needed in
-% the argument list (groff manual), and ttsl and tt are not very
-% distinguishable.  Prevent hyphenation at `-' chars.
-%
-\def\defunargs#1{%
-  % use sl by default (not ttsl),
-  % tt for the names.
-  \df \sl \hyphenchar\font=0
-  %
-  % On the other hand, if an argument has two dashes (for instance), we
-  % want a way to get ttsl.  We used to recommend @var for that, so
-  % leave the code in, but it's strange for @var to lead to typewriter.
-  % Nowadays we recommend @code, since the difference between a ttsl hyphen
-  % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
-  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
-  #1%
-  \sl\hyphenchar\font=45
-}
-
-% We want ()&[] to print specially on the defun line.
-%
-\def\activeparens{%
-  \catcode`\(=\active \catcode`\)=\active
-  \catcode`\[=\active \catcode`\]=\active
-  \catcode`\&=\active
-}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-% Be sure that we always have a definition for `(', etc.  For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-{
-  \activeparens
-  \global\let(=\lparen \global\let)=\rparen
-  \global\let[=\lbrack \global\let]=\rbrack
-  \global\let& = \&
-
-  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-  \gdef\magicamp{\let&=\amprm}
-}
-
-\newcount\parencount
-
-% If we encounter &foo, then turn on ()-hacking afterwards
-\newif\ifampseen
-\def\amprm#1 {\ampseentrue{\bf\&#1 }}
-
-\def\parenfont{%
-  \ifampseen
-    % At the first level, print parens in roman,
-    % otherwise use the default font.
-    \ifnum \parencount=1 \rm \fi
-  \else
-    % The \sf parens (in \boldbrax) actually are a little bolder than
-    % the contained text.  This is especially needed for [ and ] .
-    \sf
-  \fi
-}
-\def\infirstlevel#1{%
-  \ifampseen
-    \ifnum\parencount=1
-      #1%
-    \fi
-  \fi
-}
-\def\bfafterword#1 {#1 \bf}
-
-\def\opnr{%
-  \global\advance\parencount by 1
-  {\parenfont(}%
-  \infirstlevel \bfafterword
-}
-\def\clnr{%
-  {\parenfont)}%
-  \infirstlevel \sl
-  \global\advance\parencount by -1
-}
-
-\newcount\brackcount
-\def\lbrb{%
-  \global\advance\brackcount by 1
-  {\bf[}%
-}
-\def\rbrb{%
-  {\bf]}%
-  \global\advance\brackcount by -1
-}
-
-\def\checkparencounts{%
-  \ifnum\parencount=0 \else \badparencount \fi
-  \ifnum\brackcount=0 \else \badbrackcount \fi
-}
-% these should not use \errmessage; the glibc manual, at least, actually
-% has such constructs (when documenting function pointers).
-\def\badparencount{%
-  \message{Warning: unbalanced parentheses in @def...}%
-  \global\parencount=0
-}
-\def\badbrackcount{%
-  \message{Warning: unbalanced square brackets in @def...}%
-  \global\brackcount=0
-}
-
-
-\message{macros,}
-% @macro.
-
-% To do this right we need a feature of e-TeX, \scantokens,
-% which we arrange to emulate with a temporary file in ordinary TeX.
-\ifx\eTeXversion\thisisundefined
-  \newwrite\macscribble
-  \def\scantokens#1{%
-    \toks0={#1}%
-    \immediate\openout\macscribble=\jobname.tmp
-    \immediate\write\macscribble{\the\toks0}%
-    \immediate\closeout\macscribble
-    \input \jobname.tmp
-  }
-\fi
-
-\let\aftermacroxxx\relax
-\def\aftermacro{\aftermacroxxx}
-
-% alias because \c means cedilla in @tex or @math
-\let\texinfoc=\c
-
-\newcount\savedcatcodeone
-\newcount\savedcatcodetwo
-
-% Used at the time of macro expansion.
-% Argument is macro body with arguments substituted
-\def\scanmacro#1{%
-  \newlinechar`\^^M
-  \def\xeatspaces{\eatspaces}%
-  %
-  % Temporarily undo catcode changes of \printindex.  Set catcode of @ to
-  % 0 so that @-commands in macro expansions aren't printed literally when 
-  % formatting an index file, where \ is used as the escape character.
-  \savedcatcodeone=\catcode`\@
-  \savedcatcodetwo=\catcode`\\
-  \catcode`\@=0
-  \catcode`\\=\active
-  %
-  % Process the macro body under the current catcode regime.
-  \scantokens{#1@texinfoc}\aftermacro%
-  %
-  \catcode`\@=\savedcatcodeone
-  \catcode`\\=\savedcatcodetwo
-  %
-  % The \texinfoc is to remove the \newlinechar added by \scantokens, and
-  % can be noticed by \parsearg.
-  %   The \aftermacro allows a \comment at the end of the macro definition
-  % to duplicate itself past the final \newlinechar added by \scantokens:
-  % this is used in the definition of \group to comment out a newline.  We
-  % don't do the same for \c to support Texinfo files with macros that ended
-  % with a @c, which should no longer be necessary.
-  %   We avoid surrounding the call to \scantokens with \bgroup and \egroup
-  % to allow macros to open or close groups themselves.
-}
-
-% Used for copying and captions
-\def\scanexp#1{%
-  \expandafter\scanmacro\expandafter{#1}%
-}
-
-\newcount\paramno   % Count of parameters
-\newtoks\macname    % Macro name
-\newif\ifrecursive  % Is it recursive?
-
-% List of all defined macros in the form
-%    \definedummyword\macro1\definedummyword\macro2...
-% Currently is also contains all @aliases; the list can be split
-% if there is a need.
-\def\macrolist{}
-
-% Add the macro to \macrolist
-\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
-\def\addtomacrolistxxx#1{%
-     \toks0 = \expandafter{\macrolist\definedummyword#1}%
-     \xdef\macrolist{\the\toks0}%
-}
-
-% Utility routines.
-% This does \let #1 = #2, with \csnames; that is,
-%   \let \csname#1\endcsname = \csname#2\endcsname
-% (except of course we have to play expansion games).
-%
-\def\cslet#1#2{%
-  \expandafter\let
-  \csname#1\expandafter\endcsname
-  \csname#2\endcsname
-}
-
-% Trim leading and trailing spaces off a string.
-% Concepts from aro-bend problem 15 (see CTAN).
-{\catcode`\@=11
-\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
-\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
-\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
-\def\unbrace#1{#1}
-\unbrace{\gdef\trim@@@ #1 } #2@{#1}
-}
-
-% Trim a single trailing ^^M off a string.
-{\catcode`\^^M=\other \catcode`\Q=3%
-\gdef\eatcr #1{\eatcra #1Q^^MQ}%
-\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
-\gdef\eatcrb#1Q#2Q{#1}%
-}
-
-% Macro bodies are absorbed as an argument in a context where
-% all characters are catcode 10, 11 or 12, except \ which is active
-% (as in normal texinfo). It is necessary to change the definition of \
-% to recognize macro arguments; this is the job of \mbodybackslash.
-%
-% Non-ASCII encodings make 8-bit characters active, so un-activate
-% them to avoid their expansion.  Must do this non-globally, to
-% confine the change to the current group.
-%
-% It's necessary to have hard CRs when the macro is executed. This is
-% done by making ^^M (\endlinechar) catcode 12 when reading the macro
-% body, and then making it the \newlinechar in \scanmacro.
-%
-\def\scanctxt{% used as subroutine
-  \catcode`\"=\other
-  \catcode`\+=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\^=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\~=\other
-  \passthroughcharstrue
-}
-
-\def\scanargctxt{% used for copying and captions, not macros.
-  \scanctxt
-  \catcode`\@=\other
-  \catcode`\\=\other
-  \catcode`\^^M=\other
-}
-
-\def\macrobodyctxt{% used for @macro definitions
-  \scanctxt
-  \catcode`\ =\other
-  \catcode`\@=\other
-  \catcode`\{=\other
-  \catcode`\}=\other
-  \catcode`\^^M=\other
-  \usembodybackslash
-}
-
-% Used when scanning braced macro arguments.  Note, however, that catcode
-% changes here are ineffectual if the macro invocation was nested inside
-% an argument to another Texinfo command.
-\def\macroargctxt{%
-  \scanctxt
-  \catcode`\ =\active
-  \catcode`\^^M=\other
-  \catcode`\\=\active
-}
-
-\def\macrolineargctxt{% used for whole-line arguments without braces
-  \scanctxt
-  \catcode`\{=\other
-  \catcode`\}=\other
-}
-
-% \mbodybackslash is the definition of \ in @macro bodies.
-% It maps \foo\ => \csname macarg.foo\endcsname => #N
-% where N is the macro parameter number.
-% We define \csname macarg.\endcsname to be \realbackslash, so
-% \\ in macro replacement text gets you a backslash.
-%
-{\catcode`@=0 @catcode`@\=@active
- @gdef@usembodybackslash{@let\=@mbodybackslash}
- @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
-}
-\expandafter\def\csname macarg.\endcsname{\realbackslash}
-
-\def\margbackslash#1{\char`\#1 }
-
-\def\macro{\recursivefalse\parsearg\macroxxx}
-\def\rmacro{\recursivetrue\parsearg\macroxxx}
-
-\def\macroxxx#1{%
-  \getargs{#1}% now \macname is the macname and \argl the arglist
-  \ifx\argl\empty       % no arguments
-     \paramno=0\relax
-  \else
-     \expandafter\parsemargdef \argl;%
-     \if\paramno>256\relax
-       \ifx\eTeXversion\thisisundefined
-         \errhelp = \EMsimple
-         \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
-       \fi
-     \fi
-  \fi
-  \if1\csname ismacro.\the\macname\endcsname
-     \message{Warning: redefining \the\macname}%
-  \else
-     \expandafter\ifx\csname \the\macname\endcsname \relax
-     \else \errmessage{Macro name \the\macname\space already defined}\fi
-     \global\cslet{macsave.\the\macname}{\the\macname}%
-     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
-     \addtomacrolist{\the\macname}%
-  \fi
-  \begingroup \macrobodyctxt
-  \ifrecursive \expandafter\parsermacbody
-  \else \expandafter\parsemacbody
-  \fi}
-
-\parseargdef\unmacro{%
-  \if1\csname ismacro.#1\endcsname
-    \global\cslet{#1}{macsave.#1}%
-    \global\expandafter\let \csname ismacro.#1\endcsname=0%
-    % Remove the macro name from \macrolist:
-    \begingroup
-      \expandafter\let\csname#1\endcsname \relax
-      \let\definedummyword\unmacrodo
-      \xdef\macrolist{\macrolist}%
-    \endgroup
-  \else
-    \errmessage{Macro #1 not defined}%
-  \fi
-}
-
-% Called by \do from \dounmacro on each macro.  The idea is to omit any
-% macro definitions that have been changed to \relax.
-%
-\def\unmacrodo#1{%
-  \ifx #1\relax
-    % remove this
-  \else
-    \noexpand\definedummyword \noexpand#1%
-  \fi
-}
-
-% \getargs -- Parse the arguments to a @macro line.  Set \macname to
-% the name of the macro, and \argl to the braced argument list.
-\def\getargs#1{\getargsxxx#1{}}
-\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
-\def\getmacname#1 #2\relax{\macname={#1}}
-\def\getmacargs#1{\def\argl{#1}}
-% This made use of the feature that if the last token of a
-% <parameter list> is #, then the preceding argument is delimited by
-% an opening brace, and that opening brace is not consumed.
-
-% Parse the optional {params} list to @macro or @rmacro.
-% Set \paramno to the number of arguments,
-% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
-% three-param macro.)  Define \macarg.BLAH for each BLAH in the params
-% list to some hook where the argument is to be expanded.  If there are
-% less than 10 arguments that hook is to be replaced by ##N where N
-% is the position in that list, that is to say the macro arguments are to be
-% defined `a la TeX in the macro body.  
-%
-% That gets used by \mbodybackslash (above).
-%
-% If there are 10 or more arguments, a different technique is used: see
-% \parsemmanyargdef.
-%
-\def\parsemargdef#1;{%
-  \paramno=0\def\paramlist{}%
-  \let\hash\relax
-  % \hash is redefined to `#' later to get it into definitions
-  \let\xeatspaces\relax
-  \parsemargdefxxx#1,;,%
-  \ifnum\paramno<10\relax\else
-    \paramno0\relax
-    \parsemmanyargdef@@#1,;,% 10 or more arguments
-  \fi
-}
-\def\parsemargdefxxx#1,{%
-  \if#1;\let\next=\relax
-  \else \let\next=\parsemargdefxxx
-    \advance\paramno by 1
-    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
-        {\xeatspaces{\hash\the\paramno}}%
-    \edef\paramlist{\paramlist\hash\the\paramno,}%
-  \fi\next}
-
-% \parsemacbody, \parsermacbody
-%
-% Read recursive and nonrecursive macro bodies. (They're different since
-% rec and nonrec macros end differently.)
-% 
-% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro 
-% body to be transformed.
-% Set \macrobody to the body of the macro, and call \defmacro.
-%
-{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
-\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
-{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
-\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
-
-% Make @ a letter, so that we can make private-to-Texinfo macro names.
-\edef\texiatcatcode{\the\catcode`\@}
-\catcode `@=11\relax
-
-%%%%%%%%%%%%%% Code for > 10 arguments only   %%%%%%%%%%%%%%%%%%
-
-% If there are 10 or more arguments, a different technique is used, where the
-% hook remains in the body, and when macro is to be expanded the body is
-% processed again to replace the arguments.
-%
-% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
-% argument N value and then \edef the body (nothing else will expand because of
-% the catcode regime under which the body was input).
-%
-% If you compile with TeX (not eTeX), and you have macros with 10 or more
-% arguments, no macro can have more than 256 arguments (else error).
-%
-% In case that there are 10 or more arguments we parse again the arguments
-% list to set new definitions for the \macarg.BLAH macros corresponding to
-% each BLAH argument. It was anyhow needed to parse already once this list
-% in order to count the arguments, and as macros with at most 9 arguments
-% are by far more frequent than macro with 10 or more arguments, defining
-% twice the \macarg.BLAH macros does not cost too much processing power.
-\def\parsemmanyargdef@@#1,{%
-  \if#1;\let\next=\relax
-  \else 
-    \let\next=\parsemmanyargdef@@
-    \edef\tempb{\eatspaces{#1}}%
-    \expandafter\def\expandafter\tempa
-       \expandafter{\csname macarg.\tempb\endcsname}%
-    % Note that we need some extra \noexpand\noexpand, this is because we
-    % don't want \the  to be expanded in the \parsermacbody  as it uses an
-    % \xdef .
-    \expandafter\edef\tempa
-      {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
-    \advance\paramno by 1\relax
-  \fi\next}
-
-
-\let\endargs@\relax
-\let\nil@\relax
-\def\nilm@{\nil@}%
-\long\def\nillm@{\nil@}%
-
-% This macro is expanded during the Texinfo macro expansion, not during its
-% definition.  It gets all the arguments' values and assigns them to macros
-% macarg.ARGNAME
-%
-% #1 is the macro name
-% #2 is the list of argument names
-% #3 is the list of argument values
-\def\getargvals@#1#2#3{%
-  \def\macargdeflist@{}%
-  \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
-  \def\paramlist{#2,\nil@}%
-  \def\macroname{#1}%
-  \begingroup
-  \macroargctxt
-  \def\argvaluelist{#3,\nil@}%
-  \def\@tempa{#3}%
-  \ifx\@tempa\empty
-    \setemptyargvalues@
-  \else
-    \getargvals@@
-  \fi
-}
-\def\getargvals@@{%
-  \ifx\paramlist\nilm@
-      % Some sanity check needed here that \argvaluelist is also empty.
-      \ifx\argvaluelist\nillm@
-      \else
-        \errhelp = \EMsimple
-        \errmessage{Too many arguments in macro `\macroname'!}%
-      \fi
-      \let\next\macargexpandinbody@
-  \else
-    \ifx\argvaluelist\nillm@
-       % No more arguments values passed to macro.  Set remaining named-arg
-       % macros to empty.
-       \let\next\setemptyargvalues@
-    \else
-      % pop current arg name into \@tempb
-      \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
-      \expandafter\@tempa\expandafter{\paramlist}%
-       % pop current argument value into \@tempc
-      \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
-      \expandafter\@tempa\expandafter{\argvaluelist}%
-       % Here \@tempb is the current arg name and \@tempc is the current arg value.
-       % First place the new argument macro definition into \@tempd
-       \expandafter\macname\expandafter{\@tempc}%
-       \expandafter\let\csname macarg.\@tempb\endcsname\relax
-       \expandafter\def\expandafter\@tempe\expandafter{%
-         \csname macarg.\@tempb\endcsname}%
-       \edef\@tempd{\long\def\@tempe{\the\macname}}%
-       \push@\@tempd\macargdeflist@
-       \let\next\getargvals@@
-    \fi
-  \fi
-  \next
-}
-
-\def\push@#1#2{%
-  \expandafter\expandafter\expandafter\def
-  \expandafter\expandafter\expandafter#2%
-  \expandafter\expandafter\expandafter{%
-  \expandafter#1#2}%
-}
-
-% Replace arguments by their values in the macro body, and place the result
-% in macro \@tempa.
-% 
-\def\macvalstoargs@{%
-  %  To do this we use the property that token registers that are \the'ed
-  % within an \edef  expand only once. So we are going to place all argument
-  % values into respective token registers.
-  %
-  % First we save the token context, and initialize argument numbering.
-  \begingroup
-    \paramno0\relax
-    % Then, for each argument number #N, we place the corresponding argument
-    % value into a new token list register \toks#N
-    \expandafter\putargsintokens@\saveparamlist@,;,%
-    % Then, we expand the body so that argument are replaced by their
-    % values. The trick for values not to be expanded themselves is that they
-    % are within tokens and that tokens expand only once in an \edef .
-    \edef\@tempc{\csname mac.\macroname .body\endcsname}%
-    % Now we restore the token stack pointer to free the token list registers
-    % which we have used, but we make sure that expanded body is saved after
-    % group.
-    \expandafter
-  \endgroup
-  \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
-  }
-
-% Define the named-macro outside of this group and then close this group. 
-% 
-\def\macargexpandinbody@{% 
-  \expandafter
-  \endgroup
-  \macargdeflist@
-  % First the replace in body the macro arguments by their values, the result
-  % is in \@tempa .
-  \macvalstoargs@
-  % Then we point at the \norecurse or \gobble (for recursive) macro value
-  % with \@tempb .
-  \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
-  % Depending on whether it is recursive or not, we need some tailing
-  % \egroup .
-  \ifx\@tempb\gobble
-     \let\@tempc\relax
-  \else
-     \let\@tempc\egroup
-  \fi
-  % And now we do the real job:
-  \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
-  \@tempd
-}
-
-\def\putargsintokens@#1,{%
-  \if#1;\let\next\relax
-  \else
-    \let\next\putargsintokens@
-    % First we allocate the new token list register, and give it a temporary
-    % alias \@tempb .
-    \toksdef\@tempb\the\paramno
-    % Then we place the argument value into that token list register.
-    \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
-    \expandafter\@tempb\expandafter{\@tempa}%
-    \advance\paramno by 1\relax
-  \fi
-  \next
-}
-
-% Trailing missing arguments are set to empty.
-% 
-\def\setemptyargvalues@{%
-  \ifx\paramlist\nilm@
-    \let\next\macargexpandinbody@
-  \else
-    \expandafter\setemptyargvaluesparser@\paramlist\endargs@
-    \let\next\setemptyargvalues@
-  \fi
-  \next
-}
-
-\def\setemptyargvaluesparser@#1,#2\endargs@{%
-  \expandafter\def\expandafter\@tempa\expandafter{%
-    \expandafter\def\csname macarg.#1\endcsname{}}%
-  \push@\@tempa\macargdeflist@
-  \def\paramlist{#2}%
-}
-
-% #1 is the element target macro
-% #2 is the list macro
-% #3,#4\endargs@ is the list value
-\def\pop@#1#2#3,#4\endargs@{%
-   \def#1{#3}%
-   \def#2{#4}%
-}
-\long\def\longpop@#1#2#3,#4\endargs@{%
-   \long\def#1{#3}%
-   \long\def#2{#4}%
-}
-
-
-%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
-
-
-% This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
-%    \macrobody has the body of the macro in it, with placeholders for
-% its parameters, looking like "\xeatspaces{\hash 1}".
-%    \paramno is the number of parameters
-%    \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
-% There are eight cases: recursive and nonrecursive macros of zero, one,
-% up to nine, and many arguments.
-% \xdef is used so that macro definitions will survive the file
-% they're defined in: @include reads the file inside a group.
-%
-\def\defmacro{%
-  \let\hash=##% convert placeholders to macro parameter chars
-  \ifnum\paramno=1
-    \def\xeatspaces##1{##1}%
-    % This removes the pair of braces around the argument.  We don't
-    % use \eatspaces, because this can cause ends of lines to be lost
-    % when the argument to \eatspaces is read, leading to line-based
-    % commands like "@itemize" not being read correctly.
-  \else
-    \let\xeatspaces\relax % suppress expansion
-  \fi
-  \ifrecursive   %%%%%%%%%%%%%% Recursive %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-    \ifcase\paramno
-    % 0
-      \expandafter\xdef\csname\the\macname\endcsname{%
-        \noexpand\scanmacro{\macrobody}}%
-    \or % 1
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup
-         \noexpand\braceorline
-         \expandafter\noexpand\csname\the\macname @@@\endcsname}%
-      \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
-        \egroup
-        \noexpand\scanmacro{\macrobody}%
-        }%
-    \else
-      \ifnum\paramno<10\relax % at most 9
-        % See non-recursive section below for comments
-        \expandafter\xdef\csname\the\macname\endcsname{%
-          \bgroup
-          \noexpand\expandafter
-          \noexpand\macroargctxt
-          \noexpand\expandafter
-          \expandafter\noexpand\csname\the\macname @@\endcsname}%
-        \expandafter\xdef\csname\the\macname @@\endcsname##1{%
-            \noexpand\passargtomacro
-            \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
-        \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
-            \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
-        \expandafter\expandafter
-        \expandafter\xdef
-        \expandafter\expandafter
-          \csname\the\macname @@@@\endcsname\paramlist{%
-            \egroup\noexpand\scanmacro{\macrobody}}%
-      \else % 10 or more
-        \expandafter\xdef\csname\the\macname\endcsname{%
-          \noexpand\getargvals@{\the\macname}{\argl}%
-        }%    
-        \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
-        \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
-      \fi
-    \fi
-  \else  %%%%%%%%%%%%%%%%%%%%%% Non-recursive %%%%%%%%%%%%%%%%%%%%%%%%%%
-    \ifcase\paramno
-    % 0
-      \expandafter\xdef\csname\the\macname\endcsname{%
-        \noexpand\scanmacro{\macrobody}}%
-    \or % 1
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup
-         \noexpand\braceorline
-         \expandafter\noexpand\csname\the\macname @@@\endcsname}%
-      \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
-        \egroup
-        \noexpand\scanmacro{\macrobody}%
-        }%
-    \else % at most 9
-      \ifnum\paramno<10\relax
-        % @MACNAME sets the context for reading the macro argument
-        % @MACNAME@@ gets the argument, processes backslashes and appends a 
-        % comma.
-        % @MACNAME@@@ removes braces surrounding the argument list.
-        % @MACNAME@@@@ scans the macro body with arguments substituted.
-        \expandafter\xdef\csname\the\macname\endcsname{%
-          \bgroup
-          \noexpand\expandafter  % This \expandafter skip any spaces after the
-          \noexpand\macroargctxt % macro before we change the catcode of space.
-          \noexpand\expandafter
-          \expandafter\noexpand\csname\the\macname @@\endcsname}%
-        \expandafter\xdef\csname\the\macname @@\endcsname##1{%
-            \noexpand\passargtomacro
-            \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
-        \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
-            \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
-        \expandafter\expandafter
-        \expandafter\xdef
-        \expandafter\expandafter
-          \csname\the\macname @@@@\endcsname\paramlist{%
-            \egroup\noexpand\scanmacro{\macrobody}}%
-      \else % 10 or more:
-        \expandafter\xdef\csname\the\macname\endcsname{%
-          \noexpand\getargvals@{\the\macname}{\argl}%
-        }%
-        \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
-        \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse
-      \fi
-    \fi
-  \fi}
-
-\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
-
-\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-{\catcode`\@=0 \catcode`\\=13  % We need to manipulate \ so use @ as escape
-@catcode`@_=11  % private names
-@catcode`@!=11  % used as argument separator
-
-% \passargtomacro#1#2 -
-% Call #1 with a list of tokens #2, with any doubled backslashes in #2
-% compressed to one.
-%
-% This implementation works by expansion, and not execution (so we cannot use 
-% \def or similar).  This reduces the risk of this failing in contexts where 
-% complete expansion is done with no execution (for example, in writing out to 
-% an auxiliary file for an index entry).
-% 
-% State is kept in the input stream: the argument passed to
-% @look_ahead, @gobble_and_check_finish and @add_segment is
-%
-% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input)
-%
-% where:
-% THE_MACRO - name of the macro we want to call
-% ARG_RESULT - argument list we build to pass to that macro
-% PENDING_BS - either a backslash or nothing
-% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
-
-@gdef@passargtomacro#1#2{%
-  @add_segment #1!{}@relax#2\@_finish\%
-}
-@gdef@_finish{@_finishx} @global@let@_finishx@relax
-
-% #1 - THE_MACRO ARG_RESULT
-% #2 - PENDING_BS
-% #3 - NEXT_TOKEN
-% #4 used to look ahead
-%
-% If the next token is not a backslash, process the rest of the argument; 
-% otherwise, remove the next token.
-@gdef@look_ahead#1!#2#3#4{%
-  @ifx#4\%
-   @expandafter@gobble_and_check_finish 
-  @else
-   @expandafter@add_segment
-  @fi#1!{#2}#4#4%
-}
-
-% #1 - THE_MACRO ARG_RESULT
-% #2 - PENDING_BS
-% #3 - NEXT_TOKEN
-% #4 should be a backslash, which is gobbled.
-% #5 looks ahead
-%
-% Double backslash found.  Add a single backslash, and look ahead.
-@gdef@gobble_and_check_finish#1!#2#3#4#5{%
-  @add_segment#1\!{}#5#5%
-}
-
-@gdef@is_fi{@fi}
-
-% #1 - THE_MACRO ARG_RESULT
-% #2 - PENDING_BS
-% #3 - NEXT_TOKEN
-% #4 is input stream until next backslash
-%
-% Input stream is either at the start of the argument, or just after a 
-% backslash sequence, either a lone backslash, or a doubled backslash.  
-% NEXT_TOKEN contains the first token in the input stream: if it is \finish, 
-% finish; otherwise, append to ARG_RESULT the segment of the argument up until
-% the next backslash.  PENDING_BACKSLASH contains a backslash to represent
-% a backslash just before the start of the input stream that has not been
-% added to ARG_RESULT.
-@gdef@add_segment#1!#2#3#4\{%
-@ifx#3@_finish
-  @call_the_macro#1!%
-@else
-  % append the pending backslash to the result, followed by the next segment
-  @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
-  % this @fi is discarded by @look_ahead.
-  % we can't get rid of it with \expandafter because we don't know how 
-  % long #4 is.
-}
-
-% #1 - THE_MACRO
-% #2 - ARG_RESULT
-% #3 discards the res of the conditional in @add_segment, and @is_fi ends the 
-% conditional.
-@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
-
-}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% \braceorline MAC is used for a one-argument macro MAC.  It checks
-% whether the next non-whitespace character is a {.  It sets the context
-% for reading the argument (slightly different in the two cases).  Then,
-% to read the argument, in the whole-line case, it then calls the regular
-% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
-% 
-\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
-  \ifx\nchar\bgroup
-    \macroargctxt
-    \expandafter\passargtomacro
-  \else
-    \macrolineargctxt\expandafter\parsearg
-  \fi \macnamexxx}
-
-
-% @alias.
-% We need some trickery to remove the optional spaces around the equal
-% sign.  Make them active and then expand them all to nothing.
-%
-\def\alias{\parseargusing\obeyspaces\aliasxxx}
-\def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{%
-  {%
-    \expandafter\let\obeyedspace=\empty
-    \addtomacrolist{#1}%
-    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
-  }%
-  \next
-}
-
-
-\message{cross references,}
-
-\newwrite\auxfile
-\newif\ifhavexrefs    % True if xref values are known.
-\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
-
-% @inforef is relatively simple.
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{%
-  \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
-  node \samp{\ignorespaces#1{}}}
-
-% @node's only job in TeX is to define \lastnode, which is used in
-% cross-references.  The @node line might or might not have commas, and
-% might or might not have spaces before the first comma, like:
-% @node foo , bar , ...
-% We don't want such trailing spaces in the node name.
-%
-\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
-%
-% also remove a trailing comma, in case of something like this:
-% @node Help-Cross,  ,  , Cross-refs
-\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
-\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
-
-\let\nwnode=\node
-\let\lastnode=\empty
-
-% Write a cross-reference definition for the current node.  #1 is the
-% type (Ynumbered, Yappendix, Ynothing).
-%
-\def\donoderef#1{%
-  \ifx\lastnode\empty\else
-    \setref{\lastnode}{#1}%
-    \global\let\lastnode=\empty
-  \fi
-}
-
-% @anchor{NAME} -- define xref target at arbitrary point.
-%
-\newcount\savesfregister
-%
-\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
-% anchor), which consists of three parts:
-% 1) NAME-title - the current sectioning name taken from \lastsection,
-%                 or the anchor name.
-% 2) NAME-snt   - section number and type, passed as the SNT arg, or
-%                 empty for anchors.
-% 3) NAME-pg    - the page number.
-%
-% This is called from \donoderef, \anchor, and \dofloat.  In the case of
-% floats, there is an additional part, which is not written here:
-% 4) NAME-lof   - the text as it should appear in a @listoffloats.
-%
-\def\setref#1#2{%
-  \pdfmkdest{#1}%
-  \iflinks
-    {%
-      \requireauxfile
-      \atdummies  % preserve commands, but don't expand them
-      % match definition in \xrdef, \refx, \xrefX.
-      \def\value##1{##1}%
-      \edef\writexrdef##1##2{%
-       \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
-         ##1}{##2}}% these are parameters of \writexrdef
-      }%
-      \toks0 = \expandafter{\lastsection}%
-      \immediate \writexrdef{title}{\the\toks0 }%
-      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
-      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
-    }%
-  \fi
-}
-
-% @xrefautosectiontitle on|off says whether @section(ing) names are used
-% automatically in xrefs, if the third arg is not explicitly specified.
-% This was provided as a "secret" @set xref-automatic-section-title
-% variable, now it's official.
-% 
-\parseargdef\xrefautomaticsectiontitle{%
-  \def\temp{#1}%
-  \ifx\temp\onword
-    \expandafter\let\csname SETxref-automatic-section-title\endcsname
-      = \empty
-  \else\ifx\temp\offword
-    \expandafter\let\csname SETxref-automatic-section-title\endcsname
-      = \relax
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
-                must be on|off}%
-  \fi\fi
-}
-
-% \f
-% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
-% the node name, #2 the name of the Info cross-reference, #3 the printed
-% node name, #4 the name of the Info file, #5 the name of the printed
-% manual.  All but the node name can be omitted.
-%
-\def\pxref{\putwordsee{} \xrefXX}
-\def\xref{\putwordSee{} \xrefXX}
-\def\ref{\xrefXX}
-
-\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
-\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
-%
-\newbox\toprefbox
-\newbox\printedrefnamebox
-\newbox\infofilenamebox
-\newbox\printedmanualbox
-%
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
-  \unsepspaces
-  %
-  % Get args without leading/trailing spaces.
-  \def\printedrefname{\ignorespaces #3}%
-  \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
-  %
-  \def\infofilename{\ignorespaces #4}%
-  \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
-  %
-  \def\printedmanual{\ignorespaces #5}%
-  \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
-  %
-  % If the printed reference name (arg #3) was not explicitly given in
-  % the @xref, figure out what we want to use.
-  \ifdim \wd\printedrefnamebox = 0pt
-    % No printed node name was explicitly given.
-    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
-      % Not auto section-title: use node name inside the square brackets.
-      \def\printedrefname{\ignorespaces #1}%
-    \else
-      % Auto section-title: use chapter/section title inside
-      % the square brackets if we have it.
-      \ifdim \wd\printedmanualbox > 0pt
-        % It is in another manual, so we don't have it; use node name.
-        \def\printedrefname{\ignorespaces #1}%
-      \else
-        \ifhavexrefs
-          % We (should) know the real title if we have the xref values.
-          \def\printedrefname{\refx{#1-title}{}}%
-        \else
-          % Otherwise just copy the Info node name.
-          \def\printedrefname{\ignorespaces #1}%
-        \fi%
-      \fi
-    \fi
-  \fi
-  %
-  % Make link in pdf output.
-  \ifpdf
-    % For pdfTeX and LuaTeX
-    {\indexnofonts
-     \turnoffactive
-     \makevalueexpandable
-     % This expands tokens, so do it after making catcode changes, so _
-     % etc. don't get their TeX definitions.  This ignores all spaces in
-     % #4, including (wrongly) those in the middle of the filename.
-     \getfilename{#4}%
-     %
-     % This (wrongly) does not take account of leading or trailing
-     % spaces in #1, which should be ignored.
-     \edef\pdfxrefdest{#1}%
-     \ifx\pdfxrefdest\empty
-       \def\pdfxrefdest{Top}% no empty targets
-     \else
-       \txiescapepdf\pdfxrefdest  % escape PDF special chars
-     \fi
-     %
-     \leavevmode
-     \startlink attr{/Border [0 0 0]}%
-     \ifnum\filenamelength>0
-       goto file{\the\filename.pdf} name{\pdfxrefdest}%
-     \else
-       goto name{\pdfmkpgn{\pdfxrefdest}}%
-     \fi
-    }%
-    \setcolor{\linkcolor}%
-  \else
-    \ifx\XeTeXrevision\thisisundefined
-    \else
-      % For XeTeX
-      {\indexnofonts
-       \turnoffactive
-       \makevalueexpandable
-       % This expands tokens, so do it after making catcode changes, so _
-       % etc. don't get their TeX definitions.  This ignores all spaces in
-       % #4, including (wrongly) those in the middle of the filename.
-       \getfilename{#4}%
-       %
-       % This (wrongly) does not take account of leading or trailing
-       % spaces in #1, which should be ignored.
-       \iftxiuseunicodedestname
-         \def\pdfxrefdest{#1}% Pass through Unicode characters.
-       \else
-         \edef\pdfxrefdest{#1}% Replace Unicode characters to ASCII.
-       \fi
-       \ifx\pdfxrefdest\empty
-         \def\pdfxrefdest{Top}% no empty targets
-       \else
-         \txiescapepdf\pdfxrefdest  % escape PDF special chars
-       \fi
-       %
-       \leavevmode
-       \ifnum\filenamelength>0
-         % By the default settings,
-         % XeTeX (xdvipdfmx) replaces link destination names with integers.
-         % In this case, the replaced destination names of
-         % remote PDF cannot be known. In order to avoid replacement,
-         % you can use commandline option `-C 0x0010' for xdvipdfmx.
-         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
-           << /S /GoToR /F (\the\filename.pdf) /D (name\pdfxrefdest) >> >>}%
-       \else
-         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
-           << /S /GoTo /D (name\pdfxrefdest) >> >>}%
-       \fi
-      }%
-      \setcolor{\linkcolor}%
-    \fi
-  \fi
-  {%
-    % Have to otherify everything special to allow the \csname to
-    % include an _ in the xref name, etc.
-    \indexnofonts
-    \turnoffactive
-    \def\value##1{##1}%
-    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
-      \csname XR#1-title\endcsname
-  }%
-  %
-  % Float references are printed completely differently: "Figure 1.2"
-  % instead of "[somenode], p.3".  \iffloat distinguishes them by
-  % \Xthisreftitle being set to a magic string.
-  \iffloat\Xthisreftitle
-    % If the user specified the print name (third arg) to the ref,
-    % print it instead of our usual "Figure 1.2".
-    \ifdim\wd\printedrefnamebox = 0pt
-      \refx{#1-snt}{}%
-    \else
-      \printedrefname
-    \fi
-    %
-    % If the user also gave the printed manual name (fifth arg), append
-    % "in MANUALNAME".
-    \ifdim \wd\printedmanualbox > 0pt
-      \space \putwordin{} \cite{\printedmanual}%
-    \fi
-  \else
-    % node/anchor (non-float) references.
-    % 
-    % If we use \unhbox to print the node names, TeX does not insert
-    % empty discretionaries after hyphens, which means that it will not
-    % find a line break at a hyphen in a node names.  Since some manuals
-    % are best written with fairly long node names, containing hyphens,
-    % this is a loss.  Therefore, we give the text of the node name
-    % again, so it is as if TeX is seeing it for the first time.
-    % 
-    \ifdim \wd\printedmanualbox > 0pt
-      % Cross-manual reference with a printed manual name.
-      % 
-      \crossmanualxref{\cite{\printedmanual\unskip}}%
-    %
-    \else\ifdim \wd\infofilenamebox > 0pt
-      % Cross-manual reference with only an info filename (arg 4), no
-      % printed manual name (arg 5).  This is essentially the same as
-      % the case above; we output the filename, since we have nothing else.
-      % 
-      \crossmanualxref{\code{\infofilename\unskip}}%
-    %
-    \else
-      % Reference within this manual.
-      %
-      % _ (for example) has to be the character _ for the purposes of the
-      % control sequence corresponding to the node, but it has to expand
-      % into the usual \leavevmode...\vrule stuff for purposes of
-      % printing. So we \turnoffactive for the \refx-snt, back on for the
-      % printing, back off for the \refx-pg.
-      {\turnoffactive
-       % Only output a following space if the -snt ref is nonempty; for
-       % @unnumbered and @anchor, it won't be.
-       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
-       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
-      }%
-      % output the `[mynode]' via the macro below so it can be overridden.
-      \xrefprintnodename\printedrefname
-      %
-      % But we always want a comma and a space:
-      ,\space
-      %
-      % output the `page 3'.
-      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
-      % Add a , if xref followed by a space
-      \if\space\noexpand\tokenafterxref ,%
-      \else\ifx\       \tokenafterxref ,% @TAB
-      \else\ifx\*\tokenafterxref ,%   @*
-      \else\ifx\ \tokenafterxref ,%   @SPACE
-      \else\ifx\
-                \tokenafterxref ,%    @NL
-      \else\ifx\tie\tokenafterxref ,% @tie
-      \fi\fi\fi\fi\fi\fi
-    \fi\fi
-  \fi
-  \endlink
-\endgroup}
-
-% Output a cross-manual xref to #1.  Used just above (twice).
-% 
-% Only include the text "Section ``foo'' in" if the foo is neither
-% missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
-% "see The Foo Manual", the idea being to refer to the whole manual.
-% 
-% But, this being TeX, we can't easily compare our node name against the
-% string "Top" while ignoring the possible spaces before and after in
-% the input.  By adding the arbitrary 7sp below, we make it much less
-% likely that a real node name would have the same width as "Top" (e.g.,
-% in a monospaced font).  Hopefully it will never happen in practice.
-% 
-% For the same basic reason, we retypeset the "Top" at every
-% reference, since the current font is indeterminate.
-% 
-\def\crossmanualxref#1{%
-  \setbox\toprefbox = \hbox{Top\kern7sp}%
-  \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
-  \ifdim \wd2 > 7sp  % nonempty?
-    \ifdim \wd2 = \wd\toprefbox \else  % same as Top?
-      \putwordSection{} ``\printedrefname'' \putwordin{}\space
-    \fi
-  \fi
-  #1%
-}
-
-% This macro is called from \xrefX for the `[nodename]' part of xref
-% output.  It's a separate macro only so it can be changed more easily,
-% since square brackets don't work well in some documents.  Particularly
-% one that Bob is working on :).
-%
-\def\xrefprintnodename#1{[#1]}
-
-% Things referred to by \setref.
-%
-\def\Ynothing{}
-\def\Yomitfromtoc{}
-\def\Ynumbered{%
-  \ifnum\secno=0
-    \putwordChapter@tie \the\chapno
-  \else \ifnum\subsecno=0
-    \putwordSection@tie \the\chapno.\the\secno
-  \else \ifnum\subsubsecno=0
-    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
-  \else
-    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
-  \fi\fi\fi
-}
-\def\Yappendix{%
-  \ifnum\secno=0
-     \putwordAppendix@tie @char\the\appendixno{}%
-  \else \ifnum\subsecno=0
-     \putwordSection@tie @char\the\appendixno.\the\secno
-  \else \ifnum\subsubsecno=0
-    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
-  \else
-    \putwordSection@tie
-      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
-  \fi\fi\fi
-}
-
-% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX 
-% is output afterwards if non-empty.
-\def\refx#1#2{%
-  \requireauxfile
-  {%
-    \indexnofonts
-    \otherbackslash
-    \def\value##1{##1}%
-    \expandafter\global\expandafter\let\expandafter\thisrefX
-      \csname XR#1\endcsname
-  }%
-  \ifx\thisrefX\relax
-    % If not defined, say something at least.
-    \angleleft un\-de\-fined\angleright
-    \iflinks
-      \ifhavexrefs
-        {\toks0 = {#1}% avoid expansion of possibly-complex value
-         \message{\linenumber Undefined cross reference `\the\toks0'.}}%
-      \else
-        \ifwarnedxrefs\else
-          \global\warnedxrefstrue
-          \message{Cross reference values unknown; you must run TeX again.}%
-        \fi
-      \fi
-    \fi
-  \else
-    % It's defined, so just use it.
-    \thisrefX
-  \fi
-  #2% Output the suffix in any case.
-}
-
-% This is the macro invoked by entries in the aux file.  Define a control 
-% sequence for a cross-reference target (we prepend XR to the control sequence 
-% name to avoid collisions).  The value is the page number.  If this is a float 
-% type, we have more work to do.
-%
-\def\xrdef#1#2{%
-  {% Expand the node or anchor name to remove control sequences.
-   % \turnoffactive stops 8-bit characters being changed to commands
-   % like @'e.  \refx does the same to retrieve the value in the definition.
-    \indexnofonts
-    \turnoffactive
-    \def\value##1{##1}%
-    \xdef\safexrefname{#1}%
-  }%
-  %
-  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
-  %
-  % Was that xref control sequence that we just defined for a float?
-  \expandafter\iffloat\csname XR\safexrefname\endcsname
-    % it was a float, and we have the (safe) float type in \iffloattype.
-    \expandafter\let\expandafter\floatlist
-      \csname floatlist\iffloattype\endcsname
-    %
-    % Is this the first time we've seen this float type?
-    \expandafter\ifx\floatlist\relax
-      \toks0 = {\do}% yes, so just \do
-    \else
-      % had it before, so preserve previous elements in list.
-      \toks0 = \expandafter{\floatlist\do}%
-    \fi
-    %
-    % Remember this xref in the control sequence \floatlistFLOATTYPE,
-    % for later use in \listoffloats.
-    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
-      {\safexrefname}}%
-  \fi
-}
-
-% If working on a large document in chapters, it is convenient to
-% be able to disable indexing, cross-referencing, and contents, for test runs.
-% This is done with @novalidate at the beginning of the file.
-%
-\newif\iflinks \linkstrue % by default we want the aux files.
-\let\novalidate = \linksfalse
-
-% Used when writing to the aux file, or when using data from it.
-\def\requireauxfile{%
-  \iflinks
-    \tryauxfile
-    % Open the new aux file.  TeX will close it automatically at exit.
-    \immediate\openout\auxfile=\jobname.aux
-  \fi
-  \global\let\requireauxfile=\relax   % Only do this once.
-}
-
-% Read the last existing aux file, if any.  No error if none exists.
-%
-\def\tryauxfile{%
-  \openin 1 \jobname.aux
-  \ifeof 1 \else
-    \readdatafile{aux}%
-    \global\havexrefstrue
-  \fi
-  \closein 1
-}
-
-\def\setupdatafile{%
-  \catcode`\^^@=\other
-  \catcode`\^^A=\other
-  \catcode`\^^B=\other
-  \catcode`\^^C=\other
-  \catcode`\^^D=\other
-  \catcode`\^^E=\other
-  \catcode`\^^F=\other
-  \catcode`\^^G=\other
-  \catcode`\^^H=\other
-  \catcode`\^^K=\other
-  \catcode`\^^L=\other
-  \catcode`\^^N=\other
-  \catcode`\^^P=\other
-  \catcode`\^^Q=\other
-  \catcode`\^^R=\other
-  \catcode`\^^S=\other
-  \catcode`\^^T=\other
-  \catcode`\^^U=\other
-  \catcode`\^^V=\other
-  \catcode`\^^W=\other
-  \catcode`\^^X=\other
-  \catcode`\^^Z=\other
-  \catcode`\^^[=\other
-  \catcode`\^^\=\other
-  \catcode`\^^]=\other
-  \catcode`\^^^=\other
-  \catcode`\^^_=\other
-  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
-  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
-  % supported in the main text, it doesn't seem desirable.  Furthermore,
-  % that is not enough: for node names that actually contain a ^
-  % character, we would end up writing a line like this: 'xrdef {'hat
-  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
-  % argument, and \hat is not an expandable control sequence.  It could
-  % all be worked out, but why?  Either we support ^^ or we don't.
-  %
-  % The other change necessary for this was to define \auxhat:
-  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
-  % and then to call \auxhat in \setq.
-  %
-  \catcode`\^=\other
-  %
-  % Special characters.  Should be turned off anyway, but...
-  \catcode`\~=\other
-  \catcode`\[=\other
-  \catcode`\]=\other
-  \catcode`\"=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\$=\other
-  \catcode`\#=\other
-  \catcode`\&=\other
-  \catcode`\%=\other
-  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
-  %
-  % This is to support \ in node names and titles, since the \
-  % characters end up in a \csname.  It's easier than
-  % leaving it active and making its active definition an actual \
-  % character.  What I don't understand is why it works in the *value*
-  % of the xrdef.  Seems like it should be a catcode12 \, and that
-  % should not typeset properly.  But it works, so I'm moving on for
-  % now.  --karl, 15jan04.
-  \catcode`\\=\other
-  %
-  % @ is our escape character in .aux files, and we need braces.
-  \catcode`\{=1
-  \catcode`\}=2
-  \catcode`\@=0
-}
-
-\def\readdatafile#1{%
-\begingroup
-  \setupdatafile
-  \input\jobname.#1
-\endgroup}
-
-
-\message{insertions,}
-% including footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed. (Generally, numeric constants should always be followed by a
-% space to prevent strange expansion errors.)
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for Info output only.
-\let\footnotestyle=\comment
-
-{\catcode `\@=11
-%
-% Auto-number footnotes.  Otherwise like plain.
-\gdef\footnote{%
-  \global\advance\footnoteno by \@ne
-  \edef\thisfootno{$^{\the\footnoteno}$}%
-  %
-  % In case the footnote comes at the end of a sentence, preserve the
-  % extra spacing after we do the footnote number.
-  \let\@sf\empty
-  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
-  %
-  % Remove inadvertent blank space before typesetting the footnote number.
-  \unskip
-  \thisfootno\@sf
-  \dofootnote
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter.  Our footnotes don't need to be so general.
-%
-% Oh yes, they do; otherwise, @ifset (and anything else that uses
-% \parseargline) fails inside footnotes because the tokens are fixed when
-% the footnote is read.  --karl, 16nov96.
-%
-\gdef\dofootnote{%
-  \insert\footins\bgroup
-  %
-  % Nested footnotes are not supported in TeX, that would take a lot
-  % more work.  (\startsavinginserts does not suffice.)
-  \let\footnote=\errfootnotenest
-  %
-  % We want to typeset this text as a normal paragraph, even if the
-  % footnote reference occurs in (for example) a display environment.
-  % So reset some parameters.
-  \hsize=\txipagewidth
-  \interlinepenalty\interfootnotelinepenalty
-  \splittopskip\ht\strutbox % top baseline for broken footnotes
-  \splitmaxdepth\dp\strutbox
-  \floatingpenalty\@MM
-  \leftskip\z@skip
-  \rightskip\z@skip
-  \spaceskip\z@skip
-  \xspaceskip\z@skip
-  \parindent\defaultparindent
-  %
-  \smallfonts \rm
-  %
-  % Because we use hanging indentation in footnotes, a @noindent appears
-  % to exdent this text, so make it be a no-op.  makeinfo does not use
-  % hanging indentation so @noindent can still be needed within footnote
-  % text after an @example or the like (not that this is good style).
-  \let\noindent = \relax
-  %
-  % Hang the footnote text off the number.  Use \everypar in case the
-  % footnote extends for more than one paragraph.
-  \everypar = {\hang}%
-  \textindent{\thisfootno}%
-  %
-  % Don't crash into the line above the footnote text.  Since this
-  % expands into a box, it must come within the paragraph, lest it
-  % provide a place where TeX can split the footnote.
-  \footstrut
-  %
-  % Invoke rest of plain TeX footnote routine.
-  \futurelet\next\fo@t
-}
-}%end \catcode `\@=11
-
-\def\errfootnotenest{%
-  \errhelp=\EMsimple
-  \errmessage{Nested footnotes not supported in texinfo.tex,
-    even though they work in makeinfo; sorry}
-}
-
-\def\errfootnoteheading{%
-  \errhelp=\EMsimple
-  \errmessage{Footnotes in chapters, sections, etc., are not supported}
-}
-
-% In case a @footnote appears in a vbox, save the footnote text and create
-% the real \insert just after the vbox finished.  Otherwise, the insertion
-% would be lost.
-% Similarly, if a @footnote appears inside an alignment, save the footnote
-% text to a box and make the \insert when a row of the table is finished.
-% And the same can be done for other insert classes.  --kasal, 16nov03.
-%
-% Replace the \insert primitive by a cheating macro.
-% Deeper inside, just make sure that the saved insertions are not spilled
-% out prematurely.
-%
-\def\startsavinginserts{%
-  \ifx \insert\ptexinsert
-    \let\insert\saveinsert
-  \else
-    \let\checkinserts\relax
-  \fi
-}
-
-% This \insert replacement works for both \insert\footins{foo} and
-% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
-%
-\def\saveinsert#1{%
-  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
-  \afterassignment\next
-  % swallow the left brace
-  \let\temp =
-}
-\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
-\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
-
-\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
-
-\def\placesaveins#1{%
-  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
-    {\box#1}%
-}
-
-% eat @SAVE -- beware, all of them have catcode \other:
-{
-  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
-  \gdef\gobblesave @SAVE{}
-}
-
-% initialization:
-\def\newsaveins #1{%
-  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
-  \next
-}
-\def\newsaveinsX #1{%
-  \csname newbox\endcsname #1%
-  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
-    \checksaveins #1}%
-}
-
-% initialize:
-\let\checkinserts\empty
-\newsaveins\footins
-\newsaveins\margin
-
-
-% @image.  We use the macros from epsf.tex to support this.
-% If epsf.tex is not installed and @image is used, we complain.
-%
-% Check for and read epsf.tex up front.  If we read it only at @image
-% time, we might be inside a group, and then its definitions would get
-% undone and the next image would fail.
-\openin 1 = epsf.tex
-\ifeof 1 \else
-  % Do not bother showing banner with epsf.tex v2.7k (available in
-  % doc/epsf.tex and on ctan).
-  \def\epsfannounce{\toks0 = }%
-  \input epsf.tex
-\fi
-\closein 1
-%
-% We will only complain once about lack of epsf.tex.
-\newif\ifwarnednoepsf
-\newhelp\noepsfhelp{epsf.tex must be installed for images to
-  work.  It is also included in the Texinfo distribution, or you can get
-  it from ftp://tug.org/tex/epsf.tex.}
-%
-\def\image#1{%
-  \ifx\epsfbox\thisisundefined
-    \ifwarnednoepsf \else
-      \errhelp = \noepsfhelp
-      \errmessage{epsf.tex not found, images will be ignored}%
-      \global\warnednoepsftrue
-    \fi
-  \else
-    \imagexxx #1,,,,,\finish
-  \fi
-}
-%
-% Arguments to @image:
-% #1 is (mandatory) image filename; we tack on .eps extension.
-% #2 is (optional) width, #3 is (optional) height.
-% #4 is (ignored optional) html alt text.
-% #5 is (ignored optional) extension.
-% #6 is just the usual extra ignored arg for parsing stuff.
-\newif\ifimagevmode
-\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
-  \catcode`\^^M = 5     % in case we're inside an example
-  \normalturnoffactive  % allow _ et al. in names
-  \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
-  % If the image is by itself, center it.
-  \ifvmode
-    \imagevmodetrue
-  \else \ifx\centersub\centerV
-    % for @center @image, we need a vbox so we can have our vertical space
-    \imagevmodetrue
-    \vbox\bgroup % vbox has better behavior than vtop herev
-  \fi\fi
-  %
-  \ifimagevmode
-    \nobreak\medskip
-    % Usually we'll have text after the image which will insert
-    % \parskip glue, so insert it here too to equalize the space
-    % above and below.
-    \nobreak\vskip\parskip
-    \nobreak
-  \fi
-  %
-  % Leave vertical mode so that indentation from an enclosing
-  %  environment such as @quotation is respected.
-  % However, if we're at the top level, we don't want the
-  %  normal paragraph indentation.
-  % On the other hand, if we are in the case of @center @image, we don't
-  %  want to start a paragraph, which will create a hsize-width box and
-  %  eradicate the centering.
-  \ifx\centersub\centerV\else \noindent \fi
-  %
-  % Output the image.
-  \ifpdf
-    % For pdfTeX and LuaTeX <= 0.80
-    \dopdfimage{#1}{#2}{#3}%
-  \else
-    \ifx\XeTeXrevision\thisisundefined
-      % For epsf.tex
-      % \epsfbox itself resets \epsf?size at each figure.
-      \setbox0 = \hbox{\ignorespaces #2}%
-        \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
-      \setbox0 = \hbox{\ignorespaces #3}%
-        \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
-      \epsfbox{#1.eps}%
-    \else
-      % For XeTeX
-      \doxeteximage{#1}{#2}{#3}%
-    \fi
-  \fi
-  %
-  \ifimagevmode
-    \medskip  % space after a standalone image
-  \fi  
-  \ifx\centersub\centerV \egroup \fi
-\endgroup}
-
-
-% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
-% etc.  We don't actually implement floating yet, we always include the
-% float "here".  But it seemed the best name for the future.
-%
-\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
-
-% There may be a space before second and/or third parameter; delete it.
-\def\eatcommaspace#1, {#1,}
-
-% #1 is the optional FLOATTYPE, the text label for this float, typically
-% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
-% this float will not be numbered and cannot be referred to.
-%
-% #2 is the optional xref label.  Also must be present for the float to
-% be referable.
-%
-% #3 is the optional positioning argument; for now, it is ignored.  It
-% will somehow specify the positions allowed to float to (here, top, bottom).
-%
-% We keep a separate counter for each FLOATTYPE, which we reset at each
-% chapter-level command.
-\let\resetallfloatnos=\empty
-%
-\def\dofloat#1,#2,#3,#4\finish{%
-  \let\thiscaption=\empty
-  \let\thisshortcaption=\empty
-  %
-  % don't lose footnotes inside @float.
-  %
-  % BEWARE: when the floats start float, we have to issue warning whenever an
-  % insert appears inside a float which could possibly float. --kasal, 26may04
-  %
-  \startsavinginserts
-  %
-  % We can't be used inside a paragraph.
-  \par
-  %
-  \vtop\bgroup
-    \def\floattype{#1}%
-    \def\floatlabel{#2}%
-    \def\floatloc{#3}% we do nothing with this yet.
-    %
-    \ifx\floattype\empty
-      \let\safefloattype=\empty
-    \else
-      {%
-        % the floattype might have accents or other special characters,
-        % but we need to use it in a control sequence name.
-        \indexnofonts
-        \turnoffactive
-        \xdef\safefloattype{\floattype}%
-      }%
-    \fi
-    %
-    % If label is given but no type, we handle that as the empty type.
-    \ifx\floatlabel\empty \else
-      % We want each FLOATTYPE to be numbered separately (Figure 1,
-      % Table 1, Figure 2, ...).  (And if no label, no number.)
-      %
-      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
-      \global\advance\floatno by 1
-      %
-      {%
-        % This magic value for \lastsection is output by \setref as the
-        % XREFLABEL-title value.  \xrefX uses it to distinguish float
-        % labels (which have a completely different output format) from
-        % node and anchor labels.  And \xrdef uses it to construct the
-        % lists of floats.
-        %
-        \edef\lastsection{\floatmagic=\safefloattype}%
-        \setref{\floatlabel}{Yfloat}%
-      }%
-    \fi
-    %
-    % start with \parskip glue, I guess.
-    \vskip\parskip
-    %
-    % Don't suppress indentation if a float happens to start a section.
-    \restorefirstparagraphindent
-}
-
-% we have these possibilities:
-% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
-% @float Foo,lbl & no caption:    Foo 1.1
-% @float Foo & @caption{Cap}:     Foo: Cap
-% @float Foo & no caption:        Foo
-% @float ,lbl & Caption{Cap}:     1.1: Cap
-% @float ,lbl & no caption:       1.1
-% @float & @caption{Cap}:         Cap
-% @float & no caption:
-%
-\def\Efloat{%
-    \let\floatident = \empty
-    %
-    % In all cases, if we have a float type, it comes first.
-    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
-    %
-    % If we have an xref label, the number comes next.
-    \ifx\floatlabel\empty \else
-      \ifx\floattype\empty \else % if also had float type, need tie first.
-        \appendtomacro\floatident{\tie}%
-      \fi
-      % the number.
-      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
-    \fi
-    %
-    % Start the printed caption with what we've constructed in
-    % \floatident, but keep it separate; we need \floatident again.
-    \let\captionline = \floatident
-    %
-    \ifx\thiscaption\empty \else
-      \ifx\floatident\empty \else
-        \appendtomacro\captionline{: }% had ident, so need a colon between
-      \fi
-      %
-      % caption text.
-      \appendtomacro\captionline{\scanexp\thiscaption}%
-    \fi
-    %
-    % If we have anything to print, print it, with space before.
-    % Eventually this needs to become an \insert.
-    \ifx\captionline\empty \else
-      \vskip.5\parskip
-      \captionline
-      %
-      % Space below caption.
-      \vskip\parskip
-    \fi
-    %
-    % If have an xref label, write the list of floats info.  Do this
-    % after the caption, to avoid chance of it being a breakpoint.
-    \ifx\floatlabel\empty \else
-      % Write the text that goes in the lof to the aux file as
-      % \floatlabel-lof.  Besides \floatident, we include the short
-      % caption if specified, else the full caption if specified, else nothing.
-      {%
-        \requireauxfile
-        \atdummies
-        %
-        \ifx\thisshortcaption\empty
-          \def\gtemp{\thiscaption}%
-        \else
-          \def\gtemp{\thisshortcaption}%
-        \fi
-        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
-          \ifx\gtemp\empty \else : \gtemp \fi}}%
-      }%
-    \fi
-  \egroup  % end of \vtop
-  %
-  \checkinserts
-}
-
-% Append the tokens #2 to the definition of macro #1, not expanding either.
-%
-\def\appendtomacro#1#2{%
-  \expandafter\def\expandafter#1\expandafter{#1#2}%
-}
-
-% @caption, @shortcaption
-%
-\def\caption{\docaption\thiscaption}
-\def\shortcaption{\docaption\thisshortcaption}
-\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
-\def\defcaption#1#2{\egroup \def#1{#2}}
-
-% The parameter is the control sequence identifying the counter we are
-% going to use.  Create it if it doesn't exist and assign it to \floatno.
-\def\getfloatno#1{%
-  \ifx#1\relax
-      % Haven't seen this figure type before.
-      \csname newcount\endcsname #1%
-      %
-      % Remember to reset this floatno at the next chap.
-      \expandafter\gdef\expandafter\resetallfloatnos
-        \expandafter{\resetallfloatnos #1=0 }%
-  \fi
-  \let\floatno#1%
-}
-
-% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
-% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
-% first read the @float command.
-%
-\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
-
-% Magic string used for the XREFLABEL-title value, so \xrefX can
-% distinguish floats from other xref types.
-\def\floatmagic{!!float!!}
-
-% #1 is the control sequence we are passed; we expand into a conditional
-% which is true if #1 represents a float ref.  That is, the magic
-% \lastsection value which we \setref above.
-%
-\def\iffloat#1{\expandafter\doiffloat#1==\finish}
-%
-% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
-% (safe) float type for this float.  We set \iffloattype to #2.
-%
-\def\doiffloat#1=#2=#3\finish{%
-  \def\temp{#1}%
-  \def\iffloattype{#2}%
-  \ifx\temp\floatmagic
-}
-
-% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
-%
-\parseargdef\listoffloats{%
-  \def\floattype{#1}% floattype
-  {%
-    % the floattype might have accents or other special characters,
-    % but we need to use it in a control sequence name.
-    \indexnofonts
-    \turnoffactive
-    \xdef\safefloattype{\floattype}%
-  }%
-  %
-  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
-  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
-    \ifhavexrefs
-      % if the user said @listoffloats foo but never @float foo.
-      \message{\linenumber No `\safefloattype' floats to list.}%
-    \fi
-  \else
-    \begingroup
-      \leftskip=\tocindent  % indent these entries like a toc
-      \let\do=\listoffloatsdo
-      \csname floatlist\safefloattype\endcsname
-    \endgroup
-  \fi
-}
-
-% This is called on each entry in a list of floats.  We're passed the
-% xref label, in the form LABEL-title, which is how we save it in the
-% aux file.  We strip off the -title and look up \XRLABEL-lof, which
-% has the text we're supposed to typeset here.
-%
-% Figures without xref labels will not be included in the list (since
-% they won't appear in the aux file).
-%
-\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
-\def\listoffloatsdoentry#1-title\finish{{%
-  % Can't fully expand XR#1-lof because it can contain anything.  Just
-  % pass the control sequence.  On the other hand, XR#1-pg is just the
-  % page number, and we want to fully expand that so we can get a link
-  % in pdf output.
-  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
-  %
-  % use the same \entry macro we use to generate the TOC and index.
-  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
-  \writeentry
-}}
-
-
-\message{localization,}
-
-% For single-language documents, @documentlanguage is usually given very
-% early, just after @documentencoding.  Single argument is the language
-% (de) or locale (de_DE) abbreviation.
-%
-{
-  \catcode`\_ = \active
-  \globaldefs=1
-\parseargdef\documentlanguage{%
-  \tex % read txi-??.tex file in plain TeX.
-    % Read the file by the name they passed if it exists.
-    \let_ = \normalunderscore  % normal _ character for filename test
-    \openin 1 txi-#1.tex
-    \ifeof 1
-      \documentlanguagetrywithoutunderscore #1_\finish
-    \else
-      \globaldefs = 1  % everything in the txi-LL files needs to persist
-      \input txi-#1.tex
-    \fi
-    \closein 1
-  \endgroup % end raw TeX
-}
-%
-% If they passed de_DE, and txi-de_DE.tex doesn't exist,
-% try txi-de.tex.
-%
-\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
-  \openin 1 txi-#1.tex
-  \ifeof 1
-    \errhelp = \nolanghelp
-    \errmessage{Cannot read language file txi-#1.tex}%
-  \else
-    \globaldefs = 1  % everything in the txi-LL files needs to persist
-    \input txi-#1.tex
-  \fi
-  \closein 1
-}
-}% end of special _ catcode
-%
-\newhelp\nolanghelp{The given language definition file cannot be found or
-is empty.  Maybe you need to install it?  Putting it in the current
-directory should work if nowhere else does.}
-
-% This macro is called from txi-??.tex files; the first argument is the
-% \language name to set (without the "\lang@" prefix), the second and
-% third args are \{left,right}hyphenmin.
-%
-% The language names to pass are determined when the format is built.
-% See the etex.log file created at that time, e.g.,
-% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
-%
-% With TeX Live 2008, etex now includes hyphenation patterns for all
-% available languages.  This means we can support hyphenation in
-% Texinfo, at least to some extent.  (This still doesn't solve the
-% accented characters problem.)
-%
-\catcode`@=11
-\def\txisetlanguage#1#2#3{%
-  % do not set the language if the name is undefined in the current TeX.
-  \expandafter\ifx\csname lang@#1\endcsname \relax
-    \message{no patterns for #1}%
-  \else
-    \global\language = \csname lang@#1\endcsname
-  \fi
-  % but there is no harm in adjusting the hyphenmin values regardless.
-  \global\lefthyphenmin = #2\relax
-  \global\righthyphenmin = #3\relax
-}
-
-% XeTeX and LuaTeX can handle native Unicode.
-% Their default I/O is UTF-8 sequence instead of byte-wise.
-% Other TeX engine (pdfTeX etc.) I/O is byte-wise.
-%
-\newif\iftxinativeunicodecapable
-\newif\iftxiusebytewiseio
-
-\ifx\XeTeXrevision\thisisundefined
-  \ifx\luatexversion\thisisundefined
-    \txinativeunicodecapablefalse
-    \txiusebytewiseiotrue
-  \else
-    \txinativeunicodecapabletrue
-    \txiusebytewiseiofalse
-  \fi
-\else
-  \txinativeunicodecapabletrue
-  \txiusebytewiseiofalse
-\fi
-
-% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex
-% for non-UTF-8 (byte-wise) encodings.
-%
-\def\setbytewiseio{%
-  \ifx\XeTeXrevision\thisisundefined
-  \else
-    \XeTeXdefaultencoding "bytes"  % For subsequent files to be read
-    \XeTeXinputencoding "bytes"  % For document root file
-    % Unfortunately, there seems to be no corresponding XeTeX command for
-    % output encoding.  This is a problem for auxiliary index and TOC files.
-    % The only solution would be perhaps to write out @U{...} sequences in
-    % place of non-ASCII characters.
-  \fi
-
-  \ifx\luatexversion\thisisundefined
-  \else
-    \directlua{
-    local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub
-    local function convert_char (char)
-      return utf8_char(byte(char))
-    end
-
-    local function convert_line (line)
-      return gsub(line, ".", convert_char)
-    end
-
-    callback.register("process_input_buffer", convert_line)
-
-    local function convert_line_out (line)
-      local line_out = ""
-      for c in string.utfvalues(line) do
-         line_out = line_out .. string.char(c)
-      end
-      return line_out
-    end
-
-    callback.register("process_output_buffer", convert_line_out)
-    }
-  \fi
-
-  \txiusebytewiseiotrue
-}
-
-
-% Helpers for encodings.
-% Set the catcode of characters 128 through 255 to the specified number.
-%
-\def\setnonasciicharscatcode#1{%
-   \count255=128
-   \loop\ifnum\count255<256
-      \global\catcode\count255=#1\relax
-      \advance\count255 by 1
-   \repeat
-}
-
-\def\setnonasciicharscatcodenonglobal#1{%
-   \count255=128
-   \loop\ifnum\count255<256
-      \catcode\count255=#1\relax
-      \advance\count255 by 1
-   \repeat
-}
-
-% @documentencoding sets the definition of non-ASCII characters
-% according to the specified encoding.
-%
-\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
-\def\documentencodingzzz#1{%
-  %
-  % Encoding being declared for the document.
-  \def\declaredencoding{\csname #1.enc\endcsname}%
-  %
-  % Supported encodings: names converted to tokens in order to be able
-  % to compare them with \ifx.
-  \def\ascii{\csname US-ASCII.enc\endcsname}%
-  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
-  \def\latone{\csname ISO-8859-1.enc\endcsname}%
-  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
-  \def\utfeight{\csname UTF-8.enc\endcsname}%
-  %
-  \ifx \declaredencoding \ascii
-     \asciichardefs
-  %
-  \else \ifx \declaredencoding \lattwo
-     \iftxinativeunicodecapable
-       \setbytewiseio
-     \fi
-     \setnonasciicharscatcode\active
-     \lattwochardefs
-  %
-  \else \ifx \declaredencoding \latone
-     \iftxinativeunicodecapable
-       \setbytewiseio
-     \fi
-     \setnonasciicharscatcode\active
-     \latonechardefs
-  %
-  \else \ifx \declaredencoding \latnine
-     \iftxinativeunicodecapable
-       \setbytewiseio
-     \fi
-     \setnonasciicharscatcode\active
-     \latninechardefs
-  %
-  \else \ifx \declaredencoding \utfeight
-     \iftxinativeunicodecapable
-       % For native Unicode (XeTeX and LuaTeX)
-       \nativeunicodechardefs
-     \else
-       % For UTF-8 byte sequence (TeX, eTeX and pdfTeX)
-       \setnonasciicharscatcode\active
-       % since we already invoked \utfeightchardefs at the top level
-       % (below), do not re-invoke it, then our check for duplicated
-       % definitions triggers.  Making non-ascii chars active is enough.
-     \fi
-  %
-  \else
-    \message{Ignoring unknown document encoding: #1.}%
-  %
-  \fi % utfeight
-  \fi % latnine
-  \fi % latone
-  \fi % lattwo
-  \fi % ascii
-}
-
-% emacs-page
-% A message to be logged when using a character that isn't available
-% the default font encoding (OT1).
-%
-\def\missingcharmsg#1{\message{Character missing, sorry: #1.}}
-
-% Take account of \c (plain) vs. \, (Texinfo) difference.
-\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
-
-% First, make active non-ASCII characters in order for them to be
-% correctly categorized when TeX reads the replacement text of
-% macros containing the character definitions.
-\setnonasciicharscatcode\active
-%
-
-\def\gdefchar#1#2{%
-\gdef#1{%
-   \ifpassthroughchars
-     \string#1%
-   \else
-     #2%
-   \fi
-}}
-
-% Latin1 (ISO-8859-1) character definitions.
-\def\latonechardefs{%
-  \gdefchar^^a0{\tie}
-  \gdefchar^^a1{\exclamdown}
-  \gdefchar^^a2{{\tcfont \char162}} % cent
-  \gdefchar^^a3{\pounds}
-  \gdefchar^^a4{{\tcfont \char164}} % currency
-  \gdefchar^^a5{{\tcfont \char165}} % yen
-  \gdefchar^^a6{{\tcfont \char166}} % broken bar
-  \gdefchar^^a7{\S}
-  \gdefchar^^a8{\"{}}
-  \gdefchar^^a9{\copyright}
-  \gdefchar^^aa{\ordf}
-  \gdefchar^^ab{\guillemetleft}
-  \gdefchar^^ac{\ensuremath\lnot}
-  \gdefchar^^ad{\-}
-  \gdefchar^^ae{\registeredsymbol}
-  \gdefchar^^af{\={}}
-  %
-  \gdefchar^^b0{\textdegree}
-  \gdefchar^^b1{$\pm$}
-  \gdefchar^^b2{$^2$}
-  \gdefchar^^b3{$^3$}
-  \gdefchar^^b4{\'{}}
-  \gdefchar^^b5{$\mu$}
-  \gdefchar^^b6{\P}
-  \gdefchar^^b7{\ensuremath\cdot}
-  \gdefchar^^b8{\cedilla\ }
-  \gdefchar^^b9{$^1$}
-  \gdefchar^^ba{\ordm}
-  \gdefchar^^bb{\guillemetright}
-  \gdefchar^^bc{$1\over4$}
-  \gdefchar^^bd{$1\over2$}
-  \gdefchar^^be{$3\over4$}
-  \gdefchar^^bf{\questiondown}
-  %
-  \gdefchar^^c0{\`A}
-  \gdefchar^^c1{\'A}
-  \gdefchar^^c2{\^A}
-  \gdefchar^^c3{\~A}
-  \gdefchar^^c4{\"A}
-  \gdefchar^^c5{\ringaccent A}
-  \gdefchar^^c6{\AE}
-  \gdefchar^^c7{\cedilla C}
-  \gdefchar^^c8{\`E}
-  \gdefchar^^c9{\'E}
-  \gdefchar^^ca{\^E}
-  \gdefchar^^cb{\"E}
-  \gdefchar^^cc{\`I}
-  \gdefchar^^cd{\'I}
-  \gdefchar^^ce{\^I}
-  \gdefchar^^cf{\"I}
-  %
-  \gdefchar^^d0{\DH}
-  \gdefchar^^d1{\~N}
-  \gdefchar^^d2{\`O}
-  \gdefchar^^d3{\'O}
-  \gdefchar^^d4{\^O}
-  \gdefchar^^d5{\~O}
-  \gdefchar^^d6{\"O}
-  \gdefchar^^d7{$\times$}
-  \gdefchar^^d8{\O}
-  \gdefchar^^d9{\`U}
-  \gdefchar^^da{\'U}
-  \gdefchar^^db{\^U}
-  \gdefchar^^dc{\"U}
-  \gdefchar^^dd{\'Y}
-  \gdefchar^^de{\TH}
-  \gdefchar^^df{\ss}
-  %
-  \gdefchar^^e0{\`a}
-  \gdefchar^^e1{\'a}
-  \gdefchar^^e2{\^a}
-  \gdefchar^^e3{\~a}
-  \gdefchar^^e4{\"a}
-  \gdefchar^^e5{\ringaccent a}
-  \gdefchar^^e6{\ae}
-  \gdefchar^^e7{\cedilla c}
-  \gdefchar^^e8{\`e}
-  \gdefchar^^e9{\'e}
-  \gdefchar^^ea{\^e}
-  \gdefchar^^eb{\"e}
-  \gdefchar^^ec{\`{\dotless i}}
-  \gdefchar^^ed{\'{\dotless i}}
-  \gdefchar^^ee{\^{\dotless i}}
-  \gdefchar^^ef{\"{\dotless i}}
-  %
-  \gdefchar^^f0{\dh}
-  \gdefchar^^f1{\~n}
-  \gdefchar^^f2{\`o}
-  \gdefchar^^f3{\'o}
-  \gdefchar^^f4{\^o}
-  \gdefchar^^f5{\~o}
-  \gdefchar^^f6{\"o}
-  \gdefchar^^f7{$\div$}
-  \gdefchar^^f8{\o}
-  \gdefchar^^f9{\`u}
-  \gdefchar^^fa{\'u}
-  \gdefchar^^fb{\^u}
-  \gdefchar^^fc{\"u}
-  \gdefchar^^fd{\'y}
-  \gdefchar^^fe{\th}
-  \gdefchar^^ff{\"y}
-}
-
-% Latin9 (ISO-8859-15) encoding character definitions.
-\def\latninechardefs{%
-  % Encoding is almost identical to Latin1.
-  \latonechardefs
-  %
-  \gdefchar^^a4{\euro}
-  \gdefchar^^a6{\v S}
-  \gdefchar^^a8{\v s}
-  \gdefchar^^b4{\v Z}
-  \gdefchar^^b8{\v z}
-  \gdefchar^^bc{\OE}
-  \gdefchar^^bd{\oe}
-  \gdefchar^^be{\"Y}
-}
-
-% Latin2 (ISO-8859-2) character definitions.
-\def\lattwochardefs{%
-  \gdefchar^^a0{\tie}
-  \gdefchar^^a1{\ogonek{A}}
-  \gdefchar^^a2{\u{}}
-  \gdefchar^^a3{\L}
-  \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}}
-  \gdefchar^^a5{\v L}
-  \gdefchar^^a6{\'S}
-  \gdefchar^^a7{\S}
-  \gdefchar^^a8{\"{}}
-  \gdefchar^^a9{\v S}
-  \gdefchar^^aa{\cedilla S}
-  \gdefchar^^ab{\v T}
-  \gdefchar^^ac{\'Z}
-  \gdefchar^^ad{\-}
-  \gdefchar^^ae{\v Z}
-  \gdefchar^^af{\dotaccent Z}
-  %
-  \gdefchar^^b0{\textdegree}
-  \gdefchar^^b1{\ogonek{a}}
-  \gdefchar^^b2{\ogonek{ }}
-  \gdefchar^^b3{\l}
-  \gdefchar^^b4{\'{}}
-  \gdefchar^^b5{\v l}
-  \gdefchar^^b6{\'s}
-  \gdefchar^^b7{\v{}}
-  \gdefchar^^b8{\cedilla\ }
-  \gdefchar^^b9{\v s}
-  \gdefchar^^ba{\cedilla s}
-  \gdefchar^^bb{\v t}
-  \gdefchar^^bc{\'z}
-  \gdefchar^^bd{\H{}}
-  \gdefchar^^be{\v z}
-  \gdefchar^^bf{\dotaccent z}
-  %
-  \gdefchar^^c0{\'R}
-  \gdefchar^^c1{\'A}
-  \gdefchar^^c2{\^A}
-  \gdefchar^^c3{\u A}
-  \gdefchar^^c4{\"A}
-  \gdefchar^^c5{\'L}
-  \gdefchar^^c6{\'C}
-  \gdefchar^^c7{\cedilla C}
-  \gdefchar^^c8{\v C}
-  \gdefchar^^c9{\'E}
-  \gdefchar^^ca{\ogonek{E}}
-  \gdefchar^^cb{\"E}
-  \gdefchar^^cc{\v E}
-  \gdefchar^^cd{\'I}
-  \gdefchar^^ce{\^I}
-  \gdefchar^^cf{\v D}
-  %
-  \gdefchar^^d0{\DH}
-  \gdefchar^^d1{\'N}
-  \gdefchar^^d2{\v N}
-  \gdefchar^^d3{\'O}
-  \gdefchar^^d4{\^O}
-  \gdefchar^^d5{\H O}
-  \gdefchar^^d6{\"O}
-  \gdefchar^^d7{$\times$}
-  \gdefchar^^d8{\v R}
-  \gdefchar^^d9{\ringaccent U}
-  \gdefchar^^da{\'U}
-  \gdefchar^^db{\H U}
-  \gdefchar^^dc{\"U}
-  \gdefchar^^dd{\'Y}
-  \gdefchar^^de{\cedilla T}
-  \gdefchar^^df{\ss}
-  %
-  \gdefchar^^e0{\'r}
-  \gdefchar^^e1{\'a}
-  \gdefchar^^e2{\^a}
-  \gdefchar^^e3{\u a}
-  \gdefchar^^e4{\"a}
-  \gdefchar^^e5{\'l}
-  \gdefchar^^e6{\'c}
-  \gdefchar^^e7{\cedilla c}
-  \gdefchar^^e8{\v c}
-  \gdefchar^^e9{\'e}
-  \gdefchar^^ea{\ogonek{e}}
-  \gdefchar^^eb{\"e}
-  \gdefchar^^ec{\v e}
-  \gdefchar^^ed{\'{\dotless{i}}}
-  \gdefchar^^ee{\^{\dotless{i}}}
-  \gdefchar^^ef{\v d}
-  %
-  \gdefchar^^f0{\dh}
-  \gdefchar^^f1{\'n}
-  \gdefchar^^f2{\v n}
-  \gdefchar^^f3{\'o}
-  \gdefchar^^f4{\^o}
-  \gdefchar^^f5{\H o}
-  \gdefchar^^f6{\"o}
-  \gdefchar^^f7{$\div$}
-  \gdefchar^^f8{\v r}
-  \gdefchar^^f9{\ringaccent u}
-  \gdefchar^^fa{\'u}
-  \gdefchar^^fb{\H u}
-  \gdefchar^^fc{\"u}
-  \gdefchar^^fd{\'y}
-  \gdefchar^^fe{\cedilla t}
-  \gdefchar^^ff{\dotaccent{}}
-}
-
-% UTF-8 character definitions.
-%
-% This code to support UTF-8 is based on LaTeX's utf8.def, with some
-% changes for Texinfo conventions.  It is included here under the GPL by
-% permission from Frank Mittelbach and the LaTeX team.
-%
-\newcount\countUTFx
-\newcount\countUTFy
-\newcount\countUTFz
-
-\gdef\UTFviiiTwoOctets#1#2{\expandafter
-   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
-%
-\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
-   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
-%
-\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
-   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
-
-\gdef\UTFviiiDefined#1{%
-  \ifx #1\relax
-    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
-  \else
-    \expandafter #1%
-  \fi
-}
-
-% Give non-ASCII bytes the active definitions for processing UTF-8 sequences
-\begingroup
-  \catcode`\~13
-  \catcode`\$12
-  \catcode`\"12
-
-  % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp
-  % substituting ~ and $ with a character token of that value.
-  \def\UTFviiiLoop{%
-    \global\catcode\countUTFx\active
-    \uccode`\~\countUTFx
-    \uccode`\$\countUTFx
-    \uppercase\expandafter{\UTFviiiTmp}%
-    \advance\countUTFx by 1
-    \ifnum\countUTFx < \countUTFy
-      \expandafter\UTFviiiLoop
-    \fi}
-
-  % For bytes other than the first in a UTF-8 sequence.  Not expected to
-  % be expanded except when writing to auxiliary files.
-  \countUTFx = "80
-  \countUTFy = "C2
-  \def\UTFviiiTmp{%
-    \gdef~{%
-        \ifpassthroughchars $\fi}}%
-  \UTFviiiLoop
-
-  \countUTFx = "C2
-  \countUTFy = "E0
-  \def\UTFviiiTmp{%
-    \gdef~{%
-        \ifpassthroughchars $%
-        \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%
-  \UTFviiiLoop
-
-  \countUTFx = "E0
-  \countUTFy = "F0
-  \def\UTFviiiTmp{%
-    \gdef~{%
-        \ifpassthroughchars $%
-        \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%
-  \UTFviiiLoop
-
-  \countUTFx = "F0
-  \countUTFy = "F4
-  \def\UTFviiiTmp{%
-    \gdef~{%
-        \ifpassthroughchars $%
-        \else\expandafter\UTFviiiFourOctets\expandafter$\fi
-        }}%
-  \UTFviiiLoop
-\endgroup
-
-\def\globallet{\global\let} % save some \expandafter's below
-
-% @U{xxxx} to produce U+xxxx, if we support it.
-\def\U#1{%
-  \expandafter\ifx\csname uni:#1\endcsname \relax
-    \iftxinativeunicodecapable
-      % Any Unicode characters can be used by native Unicode.
-      % However, if the font does not have the glyph, the letter will miss.
-      \begingroup
-        \uccode`\.="#1\relax
-        \uppercase{.}
-      \endgroup
-    \else
-      \errhelp = \EMsimple     
-      \errmessage{Unicode character U+#1 not supported, sorry}%
-    \fi
-  \else
-    \csname uni:#1\endcsname
-  \fi
-}
-
-% These macros are used here to construct the name of a control
-% sequence to be defined.
-\def\UTFviiiTwoOctetsName#1#2{%
-  \csname u8:#1\string #2\endcsname}%
-\def\UTFviiiThreeOctetsName#1#2#3{%
-  \csname u8:#1\string #2\string #3\endcsname}%
-\def\UTFviiiFourOctetsName#1#2#3#4{%
-  \csname u8:#1\string #2\string #3\string #4\endcsname}%
-
-% For UTF-8 byte sequence (TeX, e-TeX and pdfTeX)
-% Definition macro to replace the Unicode character
-% Definition macro that is used by @U command
-%
-\begingroup
-  \catcode`\"=12
-  \catcode`\<=12
-  \catcode`\.=12
-  \catcode`\,=12
-  \catcode`\;=12
-  \catcode`\!=12
-  \catcode`\~=13
-  \gdef\DeclareUnicodeCharacterUTFviii#1#2{%
-    \countUTFz = "#1\relax
-    \begingroup
-      \parseXMLCharref
-    
-      % Give \u8:... its definition.  The sequence of seven \expandafter's
-      % expands after the \gdef three times, e.g.
-      %
-      % 1.  \UTFviiTwoOctetsName B1 B2
-      % 2.  \csname u8:B1 \string B2 \endcsname
-      % 3.  \u8: B1 B2  (a single control sequence token)
-      %
-      \expandafter\expandafter
-      \expandafter\expandafter
-      \expandafter\expandafter
-      \expandafter\gdef       \UTFviiiTmp{#2}%
-      % 
-      \expandafter\ifx\csname uni:#1\endcsname \relax \else
-       \message{Internal error, already defined: #1}%
-      \fi
-      %
-      % define an additional control sequence for this code point.
-      \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
-    \endgroup}
-  %
-  % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
-  % to the corresponding UTF-8 sequence.
-  \gdef\parseXMLCharref{%
-    \ifnum\countUTFz < "A0\relax
-      \errhelp = \EMsimple
-      \errmessage{Cannot define Unicode char value < 00A0}%
-    \else\ifnum\countUTFz < "800\relax
-      \parseUTFviiiA,%
-      \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
-    \else\ifnum\countUTFz < "10000\relax
-      \parseUTFviiiA;%
-      \parseUTFviiiA,%
-      \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
-    \else
-      \parseUTFviiiA;%
-      \parseUTFviiiA,%
-      \parseUTFviiiA!%
-      \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
-    \fi\fi\fi
-  }
-
-  % Extract a byte from the end of the UTF-8 representation of \countUTFx.
-  % It must be a non-initial byte in the sequence.
-  % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
-  % of the bytes.
-  \gdef\parseUTFviiiA#1{%
-    \countUTFx = \countUTFz
-    \divide\countUTFz by 64
-    \countUTFy = \countUTFz  % Save to be the future value of \countUTFz.
-    \multiply\countUTFz by 64
-    
-    % \countUTFz is now \countUTFx with the last 5 bits cleared.  Subtract
-    % in order to get the last five bits.
-    \advance\countUTFx by -\countUTFz
-
-    % Convert this to the byte in the UTF-8 sequence.
-    \advance\countUTFx by 128
-    \uccode `#1\countUTFx
-    \countUTFz = \countUTFy}
-
-  % Used to put a UTF-8 byte sequence into \UTFviiiTmp
-  % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
-  %    sequence.
-  % #2 is one of the \UTFviii*OctetsName macros.
-  % #3 is always a full stop (.)
-  % #4 is a template for the other bytes in the sequence.  The values for these
-  %    bytes is substituted in here with \uppercase using the \uccode's.
-  \gdef\parseUTFviiiB#1#2#3#4{%
-    \advance\countUTFz by "#10\relax
-    \uccode `#3\countUTFz
-    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
-\endgroup
-
-% For native Unicode (XeTeX and LuaTeX)
-% Definition macro that is set catcode other non global
-%
-\def\DeclareUnicodeCharacterNativeOther#1#2{%
-  \catcode"#1=\other
-}
-
-% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
-% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
-% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
-% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
-% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
-% 
-% Many of our renditions are less than wonderful, and all the missing
-% characters are available somewhere.  Loading the necessary fonts
-% awaits user request.  We can't truly support Unicode without
-% reimplementing everything that's been done in LaTeX for many years,
-% plus probably using luatex or xetex, and who knows what else.
-% We won't be doing that here in this simple file.  But we can try to at
-% least make most of the characters not bomb out.
-%
-\def\unicodechardefs{%
-  \DeclareUnicodeCharacter{00A0}{\tie}%
-  \DeclareUnicodeCharacter{00A1}{\exclamdown}%
-  \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
-  \DeclareUnicodeCharacter{00A3}{\pounds}%
-  \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
-  \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
-  \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
-  \DeclareUnicodeCharacter{00A7}{\S}%
-  \DeclareUnicodeCharacter{00A8}{\"{ }}%
-  \DeclareUnicodeCharacter{00A9}{\copyright}%
-  \DeclareUnicodeCharacter{00AA}{\ordf}%
-  \DeclareUnicodeCharacter{00AB}{\guillemetleft}%
-  \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}%
-  \DeclareUnicodeCharacter{00AD}{\-}%
-  \DeclareUnicodeCharacter{00AE}{\registeredsymbol}%
-  \DeclareUnicodeCharacter{00AF}{\={ }}%
-  %
-  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%
-  \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
-  \DeclareUnicodeCharacter{00B2}{$^2$}%
-  \DeclareUnicodeCharacter{00B3}{$^3$}%
-  \DeclareUnicodeCharacter{00B4}{\'{ }}%
-  \DeclareUnicodeCharacter{00B5}{$\mu$}%
-  \DeclareUnicodeCharacter{00B6}{\P}%
-  \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}%
-  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}%
-  \DeclareUnicodeCharacter{00B9}{$^1$}%
-  \DeclareUnicodeCharacter{00BA}{\ordm}%
-  \DeclareUnicodeCharacter{00BB}{\guillemetright}%
-  \DeclareUnicodeCharacter{00BC}{$1\over4$}%
-  \DeclareUnicodeCharacter{00BD}{$1\over2$}%
-  \DeclareUnicodeCharacter{00BE}{$3\over4$}%
-  \DeclareUnicodeCharacter{00BF}{\questiondown}%
-  %
-  \DeclareUnicodeCharacter{00C0}{\`A}%
-  \DeclareUnicodeCharacter{00C1}{\'A}%
-  \DeclareUnicodeCharacter{00C2}{\^A}%
-  \DeclareUnicodeCharacter{00C3}{\~A}%
-  \DeclareUnicodeCharacter{00C4}{\"A}%
-  \DeclareUnicodeCharacter{00C5}{\AA}%
-  \DeclareUnicodeCharacter{00C6}{\AE}%
-  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}%
-  \DeclareUnicodeCharacter{00C8}{\`E}%
-  \DeclareUnicodeCharacter{00C9}{\'E}%
-  \DeclareUnicodeCharacter{00CA}{\^E}%
-  \DeclareUnicodeCharacter{00CB}{\"E}%
-  \DeclareUnicodeCharacter{00CC}{\`I}%
-  \DeclareUnicodeCharacter{00CD}{\'I}%
-  \DeclareUnicodeCharacter{00CE}{\^I}%
-  \DeclareUnicodeCharacter{00CF}{\"I}%
-  %
-  \DeclareUnicodeCharacter{00D0}{\DH}%
-  \DeclareUnicodeCharacter{00D1}{\~N}%
-  \DeclareUnicodeCharacter{00D2}{\`O}%
-  \DeclareUnicodeCharacter{00D3}{\'O}%
-  \DeclareUnicodeCharacter{00D4}{\^O}%
-  \DeclareUnicodeCharacter{00D5}{\~O}%
-  \DeclareUnicodeCharacter{00D6}{\"O}%
-  \DeclareUnicodeCharacter{00D7}{\ensuremath\times}%
-  \DeclareUnicodeCharacter{00D8}{\O}%
-  \DeclareUnicodeCharacter{00D9}{\`U}%
-  \DeclareUnicodeCharacter{00DA}{\'U}%
-  \DeclareUnicodeCharacter{00DB}{\^U}%
-  \DeclareUnicodeCharacter{00DC}{\"U}%
-  \DeclareUnicodeCharacter{00DD}{\'Y}%
-  \DeclareUnicodeCharacter{00DE}{\TH}%
-  \DeclareUnicodeCharacter{00DF}{\ss}%
-  %
-  \DeclareUnicodeCharacter{00E0}{\`a}%
-  \DeclareUnicodeCharacter{00E1}{\'a}%
-  \DeclareUnicodeCharacter{00E2}{\^a}%
-  \DeclareUnicodeCharacter{00E3}{\~a}%
-  \DeclareUnicodeCharacter{00E4}{\"a}%
-  \DeclareUnicodeCharacter{00E5}{\aa}%
-  \DeclareUnicodeCharacter{00E6}{\ae}%
-  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}%
-  \DeclareUnicodeCharacter{00E8}{\`e}%
-  \DeclareUnicodeCharacter{00E9}{\'e}%
-  \DeclareUnicodeCharacter{00EA}{\^e}%
-  \DeclareUnicodeCharacter{00EB}{\"e}%
-  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}%
-  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}%
-  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}%
-  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}%
-  %
-  \DeclareUnicodeCharacter{00F0}{\dh}%
-  \DeclareUnicodeCharacter{00F1}{\~n}%
-  \DeclareUnicodeCharacter{00F2}{\`o}%
-  \DeclareUnicodeCharacter{00F3}{\'o}%
-  \DeclareUnicodeCharacter{00F4}{\^o}%
-  \DeclareUnicodeCharacter{00F5}{\~o}%
-  \DeclareUnicodeCharacter{00F6}{\"o}%
-  \DeclareUnicodeCharacter{00F7}{\ensuremath\div}%
-  \DeclareUnicodeCharacter{00F8}{\o}%
-  \DeclareUnicodeCharacter{00F9}{\`u}%
-  \DeclareUnicodeCharacter{00FA}{\'u}%
-  \DeclareUnicodeCharacter{00FB}{\^u}%
-  \DeclareUnicodeCharacter{00FC}{\"u}%
-  \DeclareUnicodeCharacter{00FD}{\'y}%
-  \DeclareUnicodeCharacter{00FE}{\th}%
-  \DeclareUnicodeCharacter{00FF}{\"y}%
-  %
-  \DeclareUnicodeCharacter{0100}{\=A}%
-  \DeclareUnicodeCharacter{0101}{\=a}%
-  \DeclareUnicodeCharacter{0102}{\u{A}}%
-  \DeclareUnicodeCharacter{0103}{\u{a}}%
-  \DeclareUnicodeCharacter{0104}{\ogonek{A}}%
-  \DeclareUnicodeCharacter{0105}{\ogonek{a}}%
-  \DeclareUnicodeCharacter{0106}{\'C}%
-  \DeclareUnicodeCharacter{0107}{\'c}%
-  \DeclareUnicodeCharacter{0108}{\^C}%
-  \DeclareUnicodeCharacter{0109}{\^c}%
-  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}%
-  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}%
-  \DeclareUnicodeCharacter{010C}{\v{C}}%
-  \DeclareUnicodeCharacter{010D}{\v{c}}%
-  \DeclareUnicodeCharacter{010E}{\v{D}}%
-  \DeclareUnicodeCharacter{010F}{d'}%
-  %
-  \DeclareUnicodeCharacter{0110}{\DH}%
-  \DeclareUnicodeCharacter{0111}{\dh}%
-  \DeclareUnicodeCharacter{0112}{\=E}%
-  \DeclareUnicodeCharacter{0113}{\=e}%
-  \DeclareUnicodeCharacter{0114}{\u{E}}%
-  \DeclareUnicodeCharacter{0115}{\u{e}}%
-  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}%
-  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}%
-  \DeclareUnicodeCharacter{0118}{\ogonek{E}}%
-  \DeclareUnicodeCharacter{0119}{\ogonek{e}}%
-  \DeclareUnicodeCharacter{011A}{\v{E}}%
-  \DeclareUnicodeCharacter{011B}{\v{e}}%
-  \DeclareUnicodeCharacter{011C}{\^G}%
-  \DeclareUnicodeCharacter{011D}{\^g}%
-  \DeclareUnicodeCharacter{011E}{\u{G}}%
-  \DeclareUnicodeCharacter{011F}{\u{g}}%
-  %
-  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}%
-  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}%
-  \DeclareUnicodeCharacter{0122}{\cedilla{G}}%
-  \DeclareUnicodeCharacter{0123}{\cedilla{g}}%
-  \DeclareUnicodeCharacter{0124}{\^H}%
-  \DeclareUnicodeCharacter{0125}{\^h}%
-  \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}%
-  \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}%
-  \DeclareUnicodeCharacter{0128}{\~I}%
-  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}%
-  \DeclareUnicodeCharacter{012A}{\=I}%
-  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}%
-  \DeclareUnicodeCharacter{012C}{\u{I}}%
-  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}%
-  \DeclareUnicodeCharacter{012E}{\ogonek{I}}%
-  \DeclareUnicodeCharacter{012F}{\ogonek{i}}%
-  %
-  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}%
-  \DeclareUnicodeCharacter{0131}{\dotless{i}}%
-  \DeclareUnicodeCharacter{0132}{IJ}%
-  \DeclareUnicodeCharacter{0133}{ij}%
-  \DeclareUnicodeCharacter{0134}{\^J}%
-  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}%
-  \DeclareUnicodeCharacter{0136}{\cedilla{K}}%
-  \DeclareUnicodeCharacter{0137}{\cedilla{k}}%
-  \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}%
-  \DeclareUnicodeCharacter{0139}{\'L}%
-  \DeclareUnicodeCharacter{013A}{\'l}%
-  \DeclareUnicodeCharacter{013B}{\cedilla{L}}%
-  \DeclareUnicodeCharacter{013C}{\cedilla{l}}%
-  \DeclareUnicodeCharacter{013D}{L'}% should kern
-  \DeclareUnicodeCharacter{013E}{l'}% should kern
-  \DeclareUnicodeCharacter{013F}{L\U{00B7}}%
-  %
-  \DeclareUnicodeCharacter{0140}{l\U{00B7}}%
-  \DeclareUnicodeCharacter{0141}{\L}%
-  \DeclareUnicodeCharacter{0142}{\l}%
-  \DeclareUnicodeCharacter{0143}{\'N}%
-  \DeclareUnicodeCharacter{0144}{\'n}%
-  \DeclareUnicodeCharacter{0145}{\cedilla{N}}%
-  \DeclareUnicodeCharacter{0146}{\cedilla{n}}%
-  \DeclareUnicodeCharacter{0147}{\v{N}}%
-  \DeclareUnicodeCharacter{0148}{\v{n}}%
-  \DeclareUnicodeCharacter{0149}{'n}%
-  \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}%
-  \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}%
-  \DeclareUnicodeCharacter{014C}{\=O}%
-  \DeclareUnicodeCharacter{014D}{\=o}%
-  \DeclareUnicodeCharacter{014E}{\u{O}}%
-  \DeclareUnicodeCharacter{014F}{\u{o}}%
-  %
-  \DeclareUnicodeCharacter{0150}{\H{O}}%
-  \DeclareUnicodeCharacter{0151}{\H{o}}%
-  \DeclareUnicodeCharacter{0152}{\OE}%
-  \DeclareUnicodeCharacter{0153}{\oe}%
-  \DeclareUnicodeCharacter{0154}{\'R}%
-  \DeclareUnicodeCharacter{0155}{\'r}%
-  \DeclareUnicodeCharacter{0156}{\cedilla{R}}%
-  \DeclareUnicodeCharacter{0157}{\cedilla{r}}%
-  \DeclareUnicodeCharacter{0158}{\v{R}}%
-  \DeclareUnicodeCharacter{0159}{\v{r}}%
-  \DeclareUnicodeCharacter{015A}{\'S}%
-  \DeclareUnicodeCharacter{015B}{\'s}%
-  \DeclareUnicodeCharacter{015C}{\^S}%
-  \DeclareUnicodeCharacter{015D}{\^s}%
-  \DeclareUnicodeCharacter{015E}{\cedilla{S}}%
-  \DeclareUnicodeCharacter{015F}{\cedilla{s}}%
-  %
-  \DeclareUnicodeCharacter{0160}{\v{S}}%
-  \DeclareUnicodeCharacter{0161}{\v{s}}%
-  \DeclareUnicodeCharacter{0162}{\cedilla{T}}%
-  \DeclareUnicodeCharacter{0163}{\cedilla{t}}%
-  \DeclareUnicodeCharacter{0164}{\v{T}}%
-  \DeclareUnicodeCharacter{0165}{\v{t}}%
-  \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}%
-  \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}%
-  \DeclareUnicodeCharacter{0168}{\~U}%
-  \DeclareUnicodeCharacter{0169}{\~u}%
-  \DeclareUnicodeCharacter{016A}{\=U}%
-  \DeclareUnicodeCharacter{016B}{\=u}%
-  \DeclareUnicodeCharacter{016C}{\u{U}}%
-  \DeclareUnicodeCharacter{016D}{\u{u}}%
-  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}%
-  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}%
-  %
-  \DeclareUnicodeCharacter{0170}{\H{U}}%
-  \DeclareUnicodeCharacter{0171}{\H{u}}%
-  \DeclareUnicodeCharacter{0172}{\ogonek{U}}%
-  \DeclareUnicodeCharacter{0173}{\ogonek{u}}%
-  \DeclareUnicodeCharacter{0174}{\^W}%
-  \DeclareUnicodeCharacter{0175}{\^w}%
-  \DeclareUnicodeCharacter{0176}{\^Y}%
-  \DeclareUnicodeCharacter{0177}{\^y}%
-  \DeclareUnicodeCharacter{0178}{\"Y}%
-  \DeclareUnicodeCharacter{0179}{\'Z}%
-  \DeclareUnicodeCharacter{017A}{\'z}%
-  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}%
-  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}%
-  \DeclareUnicodeCharacter{017D}{\v{Z}}%
-  \DeclareUnicodeCharacter{017E}{\v{z}}%
-  \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}%
-  %
-  \DeclareUnicodeCharacter{01C4}{D\v{Z}}%
-  \DeclareUnicodeCharacter{01C5}{D\v{z}}%
-  \DeclareUnicodeCharacter{01C6}{d\v{z}}%
-  \DeclareUnicodeCharacter{01C7}{LJ}%
-  \DeclareUnicodeCharacter{01C8}{Lj}%
-  \DeclareUnicodeCharacter{01C9}{lj}%
-  \DeclareUnicodeCharacter{01CA}{NJ}%
-  \DeclareUnicodeCharacter{01CB}{Nj}%
-  \DeclareUnicodeCharacter{01CC}{nj}%
-  \DeclareUnicodeCharacter{01CD}{\v{A}}%
-  \DeclareUnicodeCharacter{01CE}{\v{a}}%
-  \DeclareUnicodeCharacter{01CF}{\v{I}}%
-  %
-  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}%
-  \DeclareUnicodeCharacter{01D1}{\v{O}}%
-  \DeclareUnicodeCharacter{01D2}{\v{o}}%
-  \DeclareUnicodeCharacter{01D3}{\v{U}}%
-  \DeclareUnicodeCharacter{01D4}{\v{u}}%
-  %
-  \DeclareUnicodeCharacter{01E2}{\={\AE}}%
-  \DeclareUnicodeCharacter{01E3}{\={\ae}}%
-  \DeclareUnicodeCharacter{01E6}{\v{G}}%
-  \DeclareUnicodeCharacter{01E7}{\v{g}}%
-  \DeclareUnicodeCharacter{01E8}{\v{K}}%
-  \DeclareUnicodeCharacter{01E9}{\v{k}}%
-  %
-  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}%
-  \DeclareUnicodeCharacter{01F1}{DZ}%
-  \DeclareUnicodeCharacter{01F2}{Dz}%
-  \DeclareUnicodeCharacter{01F3}{dz}%
-  \DeclareUnicodeCharacter{01F4}{\'G}%
-  \DeclareUnicodeCharacter{01F5}{\'g}%
-  \DeclareUnicodeCharacter{01F8}{\`N}%
-  \DeclareUnicodeCharacter{01F9}{\`n}%
-  \DeclareUnicodeCharacter{01FC}{\'{\AE}}%
-  \DeclareUnicodeCharacter{01FD}{\'{\ae}}%
-  \DeclareUnicodeCharacter{01FE}{\'{\O}}%
-  \DeclareUnicodeCharacter{01FF}{\'{\o}}%
-  %
-  \DeclareUnicodeCharacter{021E}{\v{H}}%
-  \DeclareUnicodeCharacter{021F}{\v{h}}%
-  %
-  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}%
-  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}%
-  \DeclareUnicodeCharacter{0228}{\cedilla{E}}%
-  \DeclareUnicodeCharacter{0229}{\cedilla{e}}%
-  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}%
-  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}%
-  %
-  \DeclareUnicodeCharacter{0232}{\=Y}%
-  \DeclareUnicodeCharacter{0233}{\=y}%
-  \DeclareUnicodeCharacter{0237}{\dotless{j}}%
-  %
-  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
-  %
-  % Greek letters upper case
-  \DeclareUnicodeCharacter{0391}{{\it A}}%
-  \DeclareUnicodeCharacter{0392}{{\it B}}%
-  \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}%
-  \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}%
-  \DeclareUnicodeCharacter{0395}{{\it E}}%
-  \DeclareUnicodeCharacter{0396}{{\it Z}}%
-  \DeclareUnicodeCharacter{0397}{{\it H}}%
-  \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}%
-  \DeclareUnicodeCharacter{0399}{{\it I}}%
-  \DeclareUnicodeCharacter{039A}{{\it K}}%
-  \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}%
-  \DeclareUnicodeCharacter{039C}{{\it M}}%
-  \DeclareUnicodeCharacter{039D}{{\it N}}%
-  \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}%
-  \DeclareUnicodeCharacter{039F}{{\it O}}%
-  \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}%
-  \DeclareUnicodeCharacter{03A1}{{\it P}}%
-  %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
-  \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}%
-  \DeclareUnicodeCharacter{03A4}{{\it T}}%
-  \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}%
-  \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}%
-  \DeclareUnicodeCharacter{03A7}{{\it X}}%
-  \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}%
-  \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}%
-  %
-  % Vowels with accents
-  \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}%
-  \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}%
-  \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}%
-  \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}%
-  \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}%
-  \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}%
-  %
-  % Standalone accent
-  \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}%
-  %
-  % Greek letters lower case
-  \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}%
-  \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}%
-  \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}%
-  \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}%
-  \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}%
-  \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}%
-  \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}%
-  \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}%
-  \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}%
-  \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}%
-  \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}%
-  \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}%
-  \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}%
-  \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}%
-  \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron
-  \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}%
-  \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}%
-  \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}%
-  \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}%
-  \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}%
-  \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}%
-  \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}%
-  \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}%
-  \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}%
-  \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}%
-  %
-  % More Greek vowels with accents
-  \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}%
-  \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}%
-  \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}%
-  \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}%
-  \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}%
-  %
-  % Variant Greek letters
-  \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}%
-  \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}%
-  \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}%
-  %
-  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}%
-  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}%
-  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}%
-  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}%
-  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}%
-  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}%
-  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}%
-  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}%
-  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}%
-  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}%
-  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}%
-  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}%
-  %
-  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}%
-  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}%
-  %
-  \DeclareUnicodeCharacter{1E20}{\=G}%
-  \DeclareUnicodeCharacter{1E21}{\=g}%
-  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}%
-  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}%
-  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}%
-  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}%
-  \DeclareUnicodeCharacter{1E26}{\"H}%
-  \DeclareUnicodeCharacter{1E27}{\"h}%
-  %
-  \DeclareUnicodeCharacter{1E30}{\'K}%
-  \DeclareUnicodeCharacter{1E31}{\'k}%
-  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}%
-  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}%
-  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}%
-  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}%
-  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}%
-  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}%
-  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}%
-  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}%
-  \DeclareUnicodeCharacter{1E3E}{\'M}%
-  \DeclareUnicodeCharacter{1E3F}{\'m}%
-  %
-  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}%
-  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}%
-  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}%
-  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}%
-  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}%
-  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}%
-  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}%
-  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}%
-  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}%
-  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}%
-  %
-  \DeclareUnicodeCharacter{1E54}{\'P}%
-  \DeclareUnicodeCharacter{1E55}{\'p}%
-  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}%
-  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}%
-  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}%
-  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}%
-  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}%
-  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}%
-  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}%
-  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}%
-  %
-  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}%
-  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}%
-  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}%
-  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}%
-  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}%
-  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}%
-  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}%
-  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}%
-  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}%
-  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}%
-  %
-  \DeclareUnicodeCharacter{1E7C}{\~V}%
-  \DeclareUnicodeCharacter{1E7D}{\~v}%
-  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}%
-  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}%
-  %
-  \DeclareUnicodeCharacter{1E80}{\`W}%
-  \DeclareUnicodeCharacter{1E81}{\`w}%
-  \DeclareUnicodeCharacter{1E82}{\'W}%
-  \DeclareUnicodeCharacter{1E83}{\'w}%
-  \DeclareUnicodeCharacter{1E84}{\"W}%
-  \DeclareUnicodeCharacter{1E85}{\"w}%
-  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}%
-  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}%
-  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}%
-  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}%
-  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}%
-  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}%
-  \DeclareUnicodeCharacter{1E8C}{\"X}%
-  \DeclareUnicodeCharacter{1E8D}{\"x}%
-  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}%
-  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}%
-  %
-  \DeclareUnicodeCharacter{1E90}{\^Z}%
-  \DeclareUnicodeCharacter{1E91}{\^z}%
-  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}%
-  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}%
-  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}%
-  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}%
-  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}%
-  \DeclareUnicodeCharacter{1E97}{\"t}%
-  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}%
-  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}%
-  %
-  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}%
-  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}%
-  %
-  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}%
-  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}%
-  \DeclareUnicodeCharacter{1EBC}{\~E}%
-  \DeclareUnicodeCharacter{1EBD}{\~e}%
-  %
-  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}%
-  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}%
-  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}%
-  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}%
-  %
-  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}%
-  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}%
-  %
-  \DeclareUnicodeCharacter{1EF2}{\`Y}%
-  \DeclareUnicodeCharacter{1EF3}{\`y}%
-  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}%
-  %
-  \DeclareUnicodeCharacter{1EF8}{\~Y}%
-  \DeclareUnicodeCharacter{1EF9}{\~y}%
-  %
-  % Punctuation
-  \DeclareUnicodeCharacter{2013}{--}%
-  \DeclareUnicodeCharacter{2014}{---}%
-  \DeclareUnicodeCharacter{2018}{\quoteleft}%
-  \DeclareUnicodeCharacter{2019}{\quoteright}%
-  \DeclareUnicodeCharacter{201A}{\quotesinglbase}%
-  \DeclareUnicodeCharacter{201C}{\quotedblleft}%
-  \DeclareUnicodeCharacter{201D}{\quotedblright}%
-  \DeclareUnicodeCharacter{201E}{\quotedblbase}%
-  \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}%
-  \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}%
-  \DeclareUnicodeCharacter{2022}{\bullet}%
-  \DeclareUnicodeCharacter{202F}{\thinspace}%
-  \DeclareUnicodeCharacter{2026}{\dots}%
-  \DeclareUnicodeCharacter{2039}{\guilsinglleft}%
-  \DeclareUnicodeCharacter{203A}{\guilsinglright}%
-  %
-  \DeclareUnicodeCharacter{20AC}{\euro}%
-  %
-  \DeclareUnicodeCharacter{2192}{\expansion}%
-  \DeclareUnicodeCharacter{21D2}{\result}%
-  %
-  % Mathematical symbols
-  \DeclareUnicodeCharacter{2200}{\ensuremath\forall}%
-  \DeclareUnicodeCharacter{2203}{\ensuremath\exists}%
-  \DeclareUnicodeCharacter{2208}{\ensuremath\in}%
-  \DeclareUnicodeCharacter{2212}{\minus}%
-  \DeclareUnicodeCharacter{2217}{\ast}%
-  \DeclareUnicodeCharacter{221E}{\ensuremath\infty}%
-  \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}%
-  \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}%
-  \DeclareUnicodeCharacter{2229}{\ensuremath\cap}%
-  \DeclareUnicodeCharacter{2261}{\equiv}%
-  \DeclareUnicodeCharacter{2264}{\ensuremath\leq}%
-  \DeclareUnicodeCharacter{2265}{\ensuremath\geq}%
-  \DeclareUnicodeCharacter{2282}{\ensuremath\subset}%
-  \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}%
-  %
-  \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}%
-  \DeclareUnicodeCharacter{2032}{\ensuremath\prime}%
-  \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}%
-  \DeclareUnicodeCharacter{2111}{\ensuremath\Im}%
-  \DeclareUnicodeCharacter{2113}{\ensuremath\ell}%
-  \DeclareUnicodeCharacter{2118}{\ensuremath\wp}%
-  \DeclareUnicodeCharacter{211C}{\ensuremath\Re}%
-  \DeclareUnicodeCharacter{2127}{\ensuremath\mho}%
-  \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}%
-  \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}%
-  \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}%
-  \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}%
-  \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}%
-  \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}%
-  \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}%
-  \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}%
-  \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}%
-  \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}%
-  \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}%
-  \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}%
-  \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}%
-  \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}%
-  \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}%
-  \DeclareUnicodeCharacter{21BE}{\ensuremath\upharpoonright}%
-  \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}%
-  \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}%
-  \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}%
-  \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}%
-  \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}%
-  \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}%
-  \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}%
-  \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}%
-  \DeclareUnicodeCharacter{21DD}{\ensuremath\leadsto}%
-  \DeclareUnicodeCharacter{2201}{\ensuremath\complement}%
-  \DeclareUnicodeCharacter{2202}{\ensuremath\partial}%
-  \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}%
-  \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}%
-  \DeclareUnicodeCharacter{2209}{\ensuremath\notin}%
-  \DeclareUnicodeCharacter{220B}{\ensuremath\owns}%
-  \DeclareUnicodeCharacter{220F}{\ensuremath\prod}%
-  \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}%
-  \DeclareUnicodeCharacter{2211}{\ensuremath\sum}%
-  \DeclareUnicodeCharacter{2213}{\ensuremath\mp}%
-  \DeclareUnicodeCharacter{2218}{\ensuremath\circ}%
-  \DeclareUnicodeCharacter{221A}{\ensuremath\surd}%
-  \DeclareUnicodeCharacter{221D}{\ensuremath\propto}%
-  \DeclareUnicodeCharacter{2220}{\ensuremath\angle}%
-  \DeclareUnicodeCharacter{2223}{\ensuremath\mid}%
-  \DeclareUnicodeCharacter{2228}{\ensuremath\vee}%
-  \DeclareUnicodeCharacter{222A}{\ensuremath\cup}%
-  \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}%
-  \DeclareUnicodeCharacter{222E}{\ensuremath\oint}%
-  \DeclareUnicodeCharacter{223C}{\ensuremath\sim}%
-  \DeclareUnicodeCharacter{2240}{\ensuremath\wr}%
-  \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}%
-  \DeclareUnicodeCharacter{2245}{\ensuremath\cong}%
-  \DeclareUnicodeCharacter{2248}{\ensuremath\approx}%
-  \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}%
-  \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}%
-  \DeclareUnicodeCharacter{2260}{\ensuremath\neq}%
-  \DeclareUnicodeCharacter{226A}{\ensuremath\ll}%
-  \DeclareUnicodeCharacter{226B}{\ensuremath\gg}%
-  \DeclareUnicodeCharacter{227A}{\ensuremath\prec}%
-  \DeclareUnicodeCharacter{227B}{\ensuremath\succ}%
-  \DeclareUnicodeCharacter{2283}{\ensuremath\supset}%
-  \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}%
-  \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}%
-  \DeclareUnicodeCharacter{228F}{\ensuremath\sqsubset}%
-  \DeclareUnicodeCharacter{2290}{\ensuremath\sqsupset}%
-  \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}%
-  \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}%
-  \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}%
-  \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}%
-  \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}%
-  \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}%
-  \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}%
-  \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}%
-  \DeclareUnicodeCharacter{2299}{\ensuremath\odot}%
-  \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}%
-  \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}%
-  \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}%
-  \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}%
-  \DeclareUnicodeCharacter{22A8}{\ensuremath\models}%
-  \DeclareUnicodeCharacter{22B4}{\ensuremath\unlhd}%
-  \DeclareUnicodeCharacter{22B5}{\ensuremath\unrhd}%
-  \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}%
-  \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}%
-  \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}%
-  \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}%
-  \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}%
-  \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}%
-  \DeclareUnicodeCharacter{22C6}{\ensuremath\star}%
-  \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}%
-  \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}%
-  \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}%
-  \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}%
-  \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}%
-  \DeclareUnicodeCharacter{2322}{\ensuremath\frown}%
-  \DeclareUnicodeCharacter{2323}{\ensuremath\smile}%
-  %
-  \DeclareUnicodeCharacter{25A1}{\ensuremath\Box}%
-  \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}%
-  \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}%
-  \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}%
-  \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}%
-  \DeclareUnicodeCharacter{25C7}{\ensuremath\Diamond}%
-  \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}%
-  \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}%
-  \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}%
-  \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}%
-  \DeclareUnicodeCharacter{266D}{\ensuremath\flat}%
-  \DeclareUnicodeCharacter{266E}{\ensuremath\natural}%
-  \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}%
-  \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}%
-  \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}%
-  \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}%
-  \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}%
-  \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}%
-  \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}%
-  \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}%
-  \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}%
-  \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}%
-  \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}%
-  \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}%
-  \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}%
-  \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}%
-  \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}%
-  \DeclareUnicodeCharacter{2A1D}{\ensuremath\Join}%
-  \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}%
-  \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}%
-  \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}%
-  %
-  \global\mathchardef\checkmark="1370% actually the square root sign
-  \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}%
-}% end of \unicodechardefs
-
-% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command)
-% It makes the setting that replace UTF-8 byte sequence.
-\def\utfeightchardefs{%
-  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii
-  \unicodechardefs
-}
-
-% Whether the active definitions of non-ASCII characters expand to
-% non-active tokens with the same character code.  This is used to
-% write characters literally, instead of using active definitions for
-% printing the correct glyphs.
-\newif\ifpassthroughchars
-\passthroughcharsfalse
-
-% For native Unicode (XeTeX and LuaTeX)
-% Definition macro to replace / pass-through the Unicode character
-%
-\def\DeclareUnicodeCharacterNative#1#2{%
-  \catcode"#1=\active
-  \def\dodeclareunicodecharacternative##1##2##3{%
-    \begingroup
-      \uccode`\~="##2\relax
-      \uppercase{\gdef~}{%
-        \ifpassthroughchars
-          ##1%
-        \else
-          ##3%
-        \fi
-      }
-    \endgroup
-  }
-  \begingroup
-    \uccode`\.="#1\relax
-    \uppercase{\def\UTFNativeTmp{.}}%
-    \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
-  \endgroup
-}
-
-% Native Unicode (XeTeX and LuaTeX) character replacing definitions
-% It makes the setting that replace the Unicode characters.
-\def\nativeunicodechardefs{%
-  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative
-  \unicodechardefs
-}
-
-% For native Unicode (XeTeX and LuaTeX).  Make the character token expand
-% to the sequences given in \unicodechardefs for printing.
-\def\DeclareUnicodeCharacterNativeAtU#1#2{%
-  \def\UTFAtUTmp{#2}
-  \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp
-}
-
-% Native Unicode (XeTeX and LuaTeX) @U command definitions
-\def\nativeunicodechardefsatu{%
-  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU
-  \unicodechardefs
-}
-
-% US-ASCII character definitions.
-\def\asciichardefs{% nothing need be done
-   \relax
-}
-
-% define all the unicode characters we know about, for the sake of @U.
-\iftxinativeunicodecapable
-  \nativeunicodechardefsatu
-\else
-  \utfeightchardefs
-\fi
-
-
-% Make non-ASCII characters printable again for compatibility with
-% existing Texinfo documents that may use them, even without declaring a
-% document encoding.
-%
-\setnonasciicharscatcode \other
-
-
-\message{formatting,}
-
-\newdimen\defaultparindent \defaultparindent = 15pt
-
-\chapheadingskip = 15pt plus 4pt minus 2pt
-\secheadingskip = 12pt plus 3pt minus 2pt
-\subsecheadingskip = 9pt plus 2pt minus 2pt
-
-% Prevent underfull vbox error messages.
-\vbadness = 10000
-
-% Don't be very finicky about underfull hboxes, either.
-\hbadness = 6666
-
-% Following George Bush, get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything.  We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize.  We call this whenever the paper size is set.
-%
-\def\setemergencystretch{%
-  \ifx\emergencystretch\thisisundefined
-    % Allow us to assign to \emergencystretch anyway.
-    \def\emergencystretch{\dimen0}%
-  \else
-    \emergencystretch = .15\hsize
-  \fi
-}
-
-% Parameters in order: 1) textheight; 2) textwidth;
-% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
-% 7) physical page height; 8) physical page width.
-%
-% We also call \setleading{\textleading}, so the caller should define
-% \textleading.  The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6#7#8{%
-  \voffset = #3\relax
-  \topskip = #6\relax
-  \splittopskip = \topskip
-  %
-  \vsize = #1\relax
-  \advance\vsize by \topskip
-  \outervsize = \vsize
-  \advance\outervsize by 2\topandbottommargin
-  \txipageheight = \vsize
-  %
-  \hsize = #2\relax
-  \outerhsize = \hsize
-  \advance\outerhsize by 0.5in
-  \txipagewidth = \hsize
-  %
-  \normaloffset = #4\relax
-  \bindingoffset = #5\relax
-  %
-  \ifpdf
-    \pdfpageheight #7\relax
-    \pdfpagewidth #8\relax
-    % if we don't reset these, they will remain at "1 true in" of
-    % whatever layout pdftex was dumped with.
-    \pdfhorigin = 1 true in
-    \pdfvorigin = 1 true in
-  \else
-    \ifx\XeTeXrevision\thisisundefined
-    \else
-      \pdfpageheight #7\relax
-      \pdfpagewidth #8\relax
-      % XeTeX does not have \pdfhorigin and \pdfvorigin.
-    \fi
-  \fi
-  %
-  \setleading{\textleading}
-  %
-  \parindent = \defaultparindent
-  \setemergencystretch
-}
-
-% @letterpaper (the default).
-\def\letterpaper{{\globaldefs = 1
-  \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 13.2pt
-  %
-  % If page is nothing but text, make it come out even.
-  \internalpagesizes{607.2pt}{6in}% that's 46 lines
-                    {\voffset}{.25in}%
-                    {\bindingoffset}{36pt}%
-                    {11in}{8.5in}%
-}}
-
-% Use @smallbook to reset parameters for 7x9.25 trim size.
-\def\smallbook{{\globaldefs = 1
-  \parskip = 2pt plus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{7.5in}{5in}%
-                    {-.2in}{0in}%
-                    {\bindingoffset}{16pt}%
-                    {9.25in}{7in}%
-  %
-  \lispnarrowing = 0.3in
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = .5cm
-}}
-
-% Use @smallerbook to reset parameters for 6x9 trim size.
-% (Just testing, parameters still in flux.)
-\def\smallerbook{{\globaldefs = 1
-  \parskip = 1.5pt plus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{7.4in}{4.8in}%
-                    {-.2in}{-.4in}%
-                    {0pt}{14pt}%
-                    {9in}{6in}%
-  %
-  \lispnarrowing = 0.25in
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = .4cm
-}}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{{\globaldefs = 1
-  \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 13.2pt
-  %
-  % Double-side printing via postscript on Laserjet 4050
-  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
-  % To change the settings for a different printer or situation, adjust
-  % \normaloffset until the front-side and back-side texts align.  Then
-  % do the same for \bindingoffset.  You can set these for testing in
-  % your texinfo source file like this:
-  % @tex
-  % \global\normaloffset = -6mm
-  % \global\bindingoffset = 10mm
-  % @end tex
-  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
-                    {\voffset}{\hoffset}%
-                    {\bindingoffset}{44pt}%
-                    {297mm}{210mm}%
-  %
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = 5mm
-}}
-
-% Use @afivepaper to print on European A5 paper.
-% From romildo@urano.iceb.ufop.br, 2 July 2000.
-% He also recommends making @example and @lisp be small.
-\def\afivepaper{{\globaldefs = 1
-  \parskip = 2pt plus 1pt minus 0.1pt
-  \textleading = 12.5pt
-  %
-  \internalpagesizes{160mm}{120mm}%
-                    {\voffset}{\hoffset}%
-                    {\bindingoffset}{8pt}%
-                    {210mm}{148mm}%
-  %
-  \lispnarrowing = 0.2in
-  \tolerance = 800
-  \hfuzz = 1.2pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = 2mm
-  \tableindent = 12mm
-}}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper.
-\def\afourlatex{{\globaldefs = 1
-  \afourpaper
-  \internalpagesizes{237mm}{150mm}%
-                    {\voffset}{4.6mm}%
-                    {\bindingoffset}{7mm}%
-                    {297mm}{210mm}%
-  %
-  % Must explicitly reset to 0 because we call \afourpaper.
-  \globaldefs = 0
-}}
-
-% Use @afourwide to print on A4 paper in landscape format.
-\def\afourwide{{\globaldefs = 1
-  \afourpaper
-  \internalpagesizes{241mm}{165mm}%
-                    {\voffset}{-2.95mm}%
-                    {\bindingoffset}{7mm}%
-                    {297mm}{210mm}%
-  \globaldefs = 0
-}}
-
-% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
-% Perhaps we should allow setting the margins, \topskip, \parskip,
-% and/or leading, also. Or perhaps we should compute them somehow.
-%
-\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
-\def\pagesizesyyy#1,#2,#3\finish{{%
-  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
-  \globaldefs = 1
-  %
-  \parskip = 3pt plus 2pt minus 1pt
-  \setleading{\textleading}%
-  %
-  \dimen0 = #1\relax
-  \advance\dimen0 by \voffset
-  %
-  \dimen2 = \hsize
-  \advance\dimen2 by \normaloffset
-  %
-  \internalpagesizes{#1}{\hsize}%
-                    {\voffset}{\normaloffset}%
-                    {\bindingoffset}{44pt}%
-                    {\dimen0}{\dimen2}%
-}}
-
-% Set default to letter.
-%
-\letterpaper
-
-
-\message{and turning on texinfo input format.}
-
-\def^^L{\par} % remove \outer, so ^L can appear in an @comment
-
-% DEL is a comment character, in case @c does not suffice.
-\catcode`\^^? = 14
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other \def\normaldoublequote{"}
-\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
-\catcode`\+=\other \def\normalplus{+}
-\catcode`\<=\other \def\normalless{<}
-\catcode`\>=\other \def\normalgreater{>}
-\catcode`\^=\other \def\normalcaret{^}
-\catcode`\_=\other \def\normalunderscore{_}
-\catcode`\|=\other \def\normalverticalbar{|}
-\catcode`\~=\other \def\normaltilde{~}
-
-% This macro is used to make a character print one way in \tt
-% (where it can probably be output as-is), and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise.  Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
-
-% Same as above, but check for italic font.  Actually this also catches
-% non-italic slanted fonts since it is impossible to distinguish them from
-% italic fonts.  But since this is only used by $ and it uses \sl anyway
-% this is not a problem.
-\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
-
-% Set catcodes for Texinfo file
-
-% Active characters for printing the wanted glyph.
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-%
-\catcode`\"=\active
-\def\activedoublequote{{\tt\char34}}
-\let"=\activedoublequote
-\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
-\chardef\hatchar=`\^
-\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
-\let\realunder=_
-
-\catcode`\|=\active \def|{{\tt\char124}}
-
-\chardef \less=`\<
-\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
-\chardef \gtr=`\>
-\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
-\catcode`\+=\active \def+{{\tt \char 43}}
-\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-\catcode`\-=\active \let-=\normaldash
-
-
-% used for headline/footline in the output routine, in case the page
-% breaks in the middle of an @tex block.
-\def\texinfochars{%
-  \let< = \activeless
-  \let> = \activegtr
-  \let~ = \activetilde 
-  \let^ = \activehat
-  \markupsetuplqdefault \markupsetuprqdefault 
-  \let\b = \strong
-  \let\i = \smartitalic
-  % in principle, all other definitions in \tex have to be undone too.
-}
-
-% Used sometimes to turn off (effectively) the active characters even after
-% parsing them.
-\def\turnoffactive{%
-  \normalturnoffactive
-  \otherbackslash
-}
-
-\catcode`\@=0
-
-% \backslashcurfont outputs one backslash character in current font,
-% as in \char`\\.
-\global\chardef\backslashcurfont=`\\
-\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
-
-% \realbackslash is an actual character `\' with catcode other, and
-% \doublebackslash is two of them (for the pdf outlines).
-{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
-
-% In Texinfo, backslash is an active character; it prints the backslash
-% in fixed width font.
-\catcode`\\=\active  % @ for escape char from now on.
-
-% Print a typewriter backslash.  For math mode, we can't simply use
-% \backslashcurfont: the story here is that in math mode, the \char
-% of \backslashcurfont ends up printing the roman \ from the math symbol
-% font (because \char in math mode uses the \mathcode, and plain.tex
-% sets \mathcode`\\="026E).  Hence we use an explicit \mathchar,
-% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
-% ignored family value; char position "5C).  We can't use " for the
-% usual hex value because it has already been made active.
-
-@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
-@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
-
-% \rawbackslash defines an active \ to do \backslashcurfont.
-% \otherbackslash defines an active \ to be a literal `\' character with
-% catcode other.  We switch back and forth between these.
-@gdef@rawbackslash{@let\=@backslashcurfont}
-@gdef@otherbackslash{@let\=@realbackslash}
-
-% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
-% the literal character `\'.
-%
-{@catcode`- = @active
- @gdef@normalturnoffactive{%
-   @passthroughcharstrue
-   @let-=@normaldash
-   @let"=@normaldoublequote
-   @let$=@normaldollar %$ font-lock fix
-   @let+=@normalplus
-   @let<=@normalless
-   @let>=@normalgreater
-   @let^=@normalcaret
-   @let_=@normalunderscore
-   @let|=@normalverticalbar
-   @let~=@normaltilde
-   @let\=@ttbackslash
-   @markupsetuplqdefault
-   @markupsetuprqdefault
-   @unsepspaces
- }
-}
-
-% If a .fmt file is being used, characters that might appear in a file
-% name cannot be active until we have parsed the command line.
-% So turn them off again, and have @fixbackslash turn them back on.
-@catcode`+=@other @catcode`@_=@other
-
-% \enablebackslashhack - allow file to begin `\input texinfo'
-%
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-% If the file did not have a `\input texinfo', then it is turned off after
-% the first line; otherwise the first `\' in the file would cause an error.
-% This is used on the very last line of this file, texinfo.tex.
-% We also use @c to call @fixbackslash, in case ends of lines are hidden.
-{
-@catcode`@^=7
-@catcode`@^^M=13@gdef@enablebackslashhack{%
-  @global@let\ = @eatinput%
-  @catcode`@^^M=13%
-  @def@c{@fixbackslash@c}%
-  % Definition for the newline at the end of this file.
-  @def ^^M{@let^^M@secondlinenl}%
-  % Definition for a newline in the main Texinfo file.
-  @gdef @secondlinenl{@fixbackslash}%
-}}
-
-{@catcode`@^=7 @catcode`@^^M=13%
-@gdef@eatinput input texinfo#1^^M{@fixbackslash}}
-
-% Emergency active definition of newline, in case an active newline token
-% appears by mistake.
-{@catcode`@^=7 @catcode13=13%
-@gdef@enableemergencynewline{%
-  @gdef^^M{%
-    @par%
-    %<warning: active newline>@par%
-}}}
-
-
-@gdef@fixbackslash{%
-  @ifx\@eatinput @let\ = @ttbackslash @fi
-  @catcode13=5 % regular end of line
-  @enableemergencynewline
-  @let@c=@texinfoc
-  % Also turn back on active characters that might appear in the input
-  % file name, in case not using a pre-dumped format.
-  @catcode`+=@active
-  @catcode`@_=@active
-  %
-  % If texinfo.cnf is present on the system, read it.
-  % Useful for site-wide @afourpaper, etc.  This macro, @fixbackslash, gets
-  % called at the beginning of every Texinfo file.  Not opening texinfo.cnf
-  % directly in this file, texinfo.tex, makes it possible to make a format
-  % file for Texinfo.
-  %
-  @openin 1 texinfo.cnf
-  @ifeof 1 @else @input texinfo.cnf @fi
-  @closein 1
-}
-
-
-% Say @foo, not \foo, in error messages.
-@escapechar = `@@
-
-% These (along with & and #) are made active for url-breaking, so need
-% active definitions as the normal characters.
-@def@normaldot{.}
-@def@normalquest{?}
-@def@normalslash{/}
-
-% These look ok in all fonts, so just make them not special.
-% @hashchar{} gets its own user-level command, because of #line.
-@catcode`@& = @other @def@normalamp{&}
-@catcode`@# = @other @def@normalhash{#}
-@catcode`@% = @other @def@normalpercent{%}
-
-@let @hashchar = @normalhash
-
-@c Finally, make ` and ' active, so that txicodequoteundirected and
-@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
-@c don't make ` and ' active, @code will not get them as active chars.
-@c Do this last of all since we use ` in the previous @catcode assignments.
-@catcode`@'=@active
-@catcode`@`=@active
-@markupsetuplqdefault
-@markupsetuprqdefault
-
-@c Local variables:
-@c eval: (add-hook 'write-file-hooks 'time-stamp)
-@c page-delimiter: "^\\\\message\\|emacs-page"
-@c time-stamp-start: "def\\\\texinfoversion{"
-@c time-stamp-format: "%:y-%02m-%02d.%02H"
-@c time-stamp-end: "}"
-@c End:
-
-@c vim:sw=2:
-
-@ignore
-   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
-@end ignore
-@enablebackslashhack
diff --git a/configh.dos b/configh.dos
deleted file mode 100644 (file)
index 58bfeb0..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/* configh.dos -- hand-massaged config.h file for MS-DOS builds         -*-C-*-
-
-Copyright (C) 1994-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Include this header to make __DJGPP_MINOR__ available because DJGPP ports
-   of GCC 4.3.0 and later no longer do it automatically.  */
-#include <sys/version.h>
-
-/* Many things are defined already by a system header.  */
-#include <sys/config.h>
-
-#if __DJGPP__ > 2 || __DJGPP_MINOR__ > 1
-
-/* Define to 1 if 'sys_siglist' is declared by <signal.h> or <unistd.h>. */
-# define SYS_SIGLIST_DECLARED 1
-
-/* Define to 1 if the C library defines the variable '_sys_siglist'.  */
-# define HAVE_DECL_SYS_SIGLIST 1
-
-#else
-
-/* Define NSIG.  */
-# define NSIG SIGMAX
-
-#endif
-
-/* Use high resolution file timestamps if nonzero. */
-#define FILE_TIMESTAMP_HI_RES 0
-
-/* Define to 1 if you have 'alloca', as a function or macro. */
-#define HAVE_ALLOCA 1
-
-/* Define to 1 if you have the fdopen function.  */
-#define HAVE_FDOPEN 1
-
-/* Define to 1 if you have the 'getgroups' function. */
-#define HAVE_GETGROUPS 1
-
-/* Define to 1 if you have the <memory.h> header file.  */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the mkstemp function.  */
-#define HAVE_MKSTEMP 1
-
-/* Define to 1 if you have the 'mktemp' function. */
-#define HAVE_MKTEMP 1
-
-/* Define to 1 if you have the 'setlinebuf' function. */
-#define HAVE_SETLINEBUF 1
-
-/* Define to 1 if you have the 'setvbuf' function. */
-#define HAVE_SETVBUF 1
-
-#define SCCS_GET "get"
-
-/* Define to 'unsigned long' or 'unsigned long long'
-   if <inttypes.h> doesn't define.  */
-#define uintmax_t unsigned long long
-
-/* Define the type of the first arg to select().  */
-#define fd_set_size_t int
-
-/* Define to 1 if you have the select function.  */
-#define HAVE_SELECT 1
-
-/* Define to 1 if you have the stricmp function.  */
-#define HAVE_STRICMP 1
-
-/* Define to 1 if you have the 'strncasecmp' function. */
-#define HAVE_STRNCASECMP 1
-
-/* Name of the package */
-#define PACKAGE "make"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "bug-make@gnu.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "GNU make"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GNU make 4.2.1"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "make"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "4.2.1"
-
-/* Output sync sypport */
-#define NO_OUTPUT_SYNC
-
-/* Version number of package */
-#define VERSION "4.2.1"
-
-/* Build host information. */
-#define MAKE_HOST "i386-pc-msdosdjgpp"
-
-/* Grok DOS paths (drive specs and backslash path element separators) */
-#define HAVE_DOS_PATHS
index bc6269126a927270c1cb6f8f8822c29da1e0947e..852601d391a80ea87fe4b35f54eecd26530048e3 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GNU make 4.2.1.
+# Generated by GNU Autoconf 2.69 for GNU make 4.3.
 #
 # Report bugs to <bug-make@gnu.org>.
 #
@@ -580,12 +580,13 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='GNU make'
 PACKAGE_TARNAME='make'
-PACKAGE_VERSION='4.2.1'
-PACKAGE_STRING='GNU make 4.2.1'
+PACKAGE_VERSION='4.3'
+PACKAGE_STRING='GNU make 4.3'
 PACKAGE_BUGREPORT='bug-make@gnu.org'
 PACKAGE_URL='http://www.gnu.org/software/make/'
 
-ac_unique_file="vpath.c"
+ac_unique_file="src/vpath.c"
+ac_config_libobj_dir=lib
 # Factoring default headers for most tests.
 ac_includes_default="\
 #include <stdio.h>
@@ -622,25 +623,24 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
+ac_func_list=
+ac_header_list=
 gt_needs=
-ac_subst_vars='am__EXEEXT_FALSE
+ac_subst_vars='gltests_LTLIBOBJS
+gltests_LIBOBJS
+gl_LTLIBOBJS
+gl_LIBOBJS
+am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
+LIBOBJS
 WINDOWSENV_FALSE
 WINDOWSENV_TRUE
 MAKE_HOST
-USE_LOCAL_GLOB_FALSE
-USE_LOCAL_GLOB_TRUE
-GLOBLIB
-GLOBINC
 AM_LDFLAGS
 USE_CUSTOMS_FALSE
 USE_CUSTOMS_TRUE
 REMOTE
-GETLOADAVG_LIBS
-KMEM_GROUP
-NEED_SETGID
-LIBOBJS
 HAVE_GUILE_FALSE
 HAVE_GUILE_TRUE
 GUILE_LIBS
@@ -648,10 +648,7 @@ GUILE_CFLAGS
 PKG_CONFIG_LIBDIR
 PKG_CONFIG_PATH
 PKG_CONFIG
-ALLOCA
 POSUB
-LTLIBINTL
-LIBINTL
 INTLLIBS
 LTLIBICONV
 LIBICONV
@@ -667,6 +664,378 @@ MSGFMT
 GETTEXT_MACRO_VERSION
 USE_NLS
 SED
+PERL
+LIBGNU_LTLIBDEPS
+LIBGNU_LIBDEPS
+gltests_WITNESS
+HAVE_UNISTD_H
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H
+NEXT_UNISTD_H
+WINDOWS_STAT_INODES
+WINDOWS_64_BIT_OFF_T
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H
+NEXT_SYS_TYPES_H
+NEXT_AS_FIRST_DIRECTIVE_STRING_H
+NEXT_STRING_H
+UNDEFINE_STRTOK_R
+REPLACE_STRSIGNAL
+REPLACE_STRERROR_R
+REPLACE_STRERROR
+REPLACE_STRTOK_R
+REPLACE_STRCASESTR
+REPLACE_STRSTR
+REPLACE_STRNLEN
+REPLACE_STRNDUP
+REPLACE_STRNCAT
+REPLACE_STRDUP
+REPLACE_STRCHRNUL
+REPLACE_STPNCPY
+REPLACE_MEMMEM
+REPLACE_MEMCHR
+HAVE_STRVERSCMP
+HAVE_DECL_STRSIGNAL
+HAVE_DECL_STRERROR_R
+HAVE_DECL_STRTOK_R
+HAVE_STRCASESTR
+HAVE_STRSEP
+HAVE_STRPBRK
+HAVE_DECL_STRNLEN
+HAVE_DECL_STRNDUP
+HAVE_DECL_STRDUP
+HAVE_STRCHRNUL
+HAVE_STPNCPY
+HAVE_STPCPY
+HAVE_RAWMEMCHR
+HAVE_DECL_MEMRCHR
+HAVE_MEMPCPY
+HAVE_DECL_MEMMEM
+HAVE_MEMCHR
+HAVE_FFSLL
+HAVE_FFSL
+HAVE_EXPLICIT_BZERO
+HAVE_MBSLEN
+GNULIB_STRVERSCMP
+GNULIB_STRSIGNAL
+GNULIB_STRERROR_R
+GNULIB_STRERROR
+GNULIB_MBSTOK_R
+GNULIB_MBSSEP
+GNULIB_MBSSPN
+GNULIB_MBSPBRK
+GNULIB_MBSCSPN
+GNULIB_MBSCASESTR
+GNULIB_MBSPCASECMP
+GNULIB_MBSNCASECMP
+GNULIB_MBSCASECMP
+GNULIB_MBSSTR
+GNULIB_MBSRCHR
+GNULIB_MBSCHR
+GNULIB_MBSNLEN
+GNULIB_MBSLEN
+GNULIB_STRTOK_R
+GNULIB_STRCASESTR
+GNULIB_STRSTR
+GNULIB_STRSEP
+GNULIB_STRPBRK
+GNULIB_STRNLEN
+GNULIB_STRNDUP
+GNULIB_STRNCAT
+GNULIB_STRDUP
+GNULIB_STRCHRNUL
+GNULIB_STPNCPY
+GNULIB_STPCPY
+GNULIB_RAWMEMCHR
+GNULIB_MEMRCHR
+GNULIB_MEMPCPY
+GNULIB_MEMMEM
+GNULIB_MEMCHR
+GNULIB_FFSLL
+GNULIB_FFSL
+GNULIB_EXPLICIT_BZERO
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H
+NEXT_STDLIB_H
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H
+NEXT_STDIO_H
+REPLACE_VSPRINTF
+REPLACE_VSNPRINTF
+REPLACE_VPRINTF
+REPLACE_VFPRINTF
+REPLACE_VDPRINTF
+REPLACE_VASPRINTF
+REPLACE_TMPFILE
+REPLACE_STDIO_WRITE_FUNCS
+REPLACE_STDIO_READ_FUNCS
+REPLACE_SPRINTF
+REPLACE_SNPRINTF
+REPLACE_RENAMEAT
+REPLACE_RENAME
+REPLACE_REMOVE
+REPLACE_PRINTF
+REPLACE_POPEN
+REPLACE_PERROR
+REPLACE_OBSTACK_PRINTF
+REPLACE_GETLINE
+REPLACE_GETDELIM
+REPLACE_FTELLO
+REPLACE_FTELL
+REPLACE_FSEEKO
+REPLACE_FSEEK
+REPLACE_FREOPEN
+REPLACE_FPURGE
+REPLACE_FPRINTF
+REPLACE_FOPEN
+REPLACE_FFLUSH
+REPLACE_FDOPEN
+REPLACE_FCLOSE
+REPLACE_DPRINTF
+HAVE_VDPRINTF
+HAVE_VASPRINTF
+HAVE_RENAMEAT
+HAVE_POPEN
+HAVE_PCLOSE
+HAVE_FTELLO
+HAVE_FSEEKO
+HAVE_DPRINTF
+HAVE_DECL_VSNPRINTF
+HAVE_DECL_SNPRINTF
+HAVE_DECL_OBSTACK_PRINTF
+HAVE_DECL_GETLINE
+HAVE_DECL_GETDELIM
+HAVE_DECL_FTELLO
+HAVE_DECL_FSEEKO
+HAVE_DECL_FPURGE
+GNULIB_VSPRINTF_POSIX
+GNULIB_VSNPRINTF
+GNULIB_VPRINTF_POSIX
+GNULIB_VPRINTF
+GNULIB_VFPRINTF_POSIX
+GNULIB_VFPRINTF
+GNULIB_VDPRINTF
+GNULIB_VSCANF
+GNULIB_VFSCANF
+GNULIB_VASPRINTF
+GNULIB_TMPFILE
+GNULIB_STDIO_H_SIGPIPE
+GNULIB_STDIO_H_NONBLOCKING
+GNULIB_SPRINTF_POSIX
+GNULIB_SNPRINTF
+GNULIB_SCANF
+GNULIB_RENAMEAT
+GNULIB_RENAME
+GNULIB_REMOVE
+GNULIB_PUTS
+GNULIB_PUTCHAR
+GNULIB_PUTC
+GNULIB_PRINTF_POSIX
+GNULIB_PRINTF
+GNULIB_POPEN
+GNULIB_PERROR
+GNULIB_PCLOSE
+GNULIB_OBSTACK_PRINTF_POSIX
+GNULIB_OBSTACK_PRINTF
+GNULIB_GETLINE
+GNULIB_GETDELIM
+GNULIB_GETCHAR
+GNULIB_GETC
+GNULIB_FWRITE
+GNULIB_FTELLO
+GNULIB_FTELL
+GNULIB_FSEEKO
+GNULIB_FSEEK
+GNULIB_FSCANF
+GNULIB_FREOPEN
+GNULIB_FREAD
+GNULIB_FPUTS
+GNULIB_FPUTC
+GNULIB_FPURGE
+GNULIB_FPRINTF_POSIX
+GNULIB_FPRINTF
+GNULIB_FOPEN
+GNULIB_FGETS
+GNULIB_FGETC
+GNULIB_FFLUSH
+GNULIB_FDOPEN
+GNULIB_FCLOSE
+GNULIB_DPRINTF
+GL_GENERATE_STDINT_H_FALSE
+GL_GENERATE_STDINT_H_TRUE
+STDINT_H
+HAVE_SYS_INTTYPES_H
+HAVE_SYS_BITYPES_H
+HAVE_C99_STDINT_H
+WINT_T_SUFFIX
+WCHAR_T_SUFFIX
+SIG_ATOMIC_T_SUFFIX
+SIZE_T_SUFFIX
+PTRDIFF_T_SUFFIX
+HAVE_SIGNED_WINT_T
+HAVE_SIGNED_WCHAR_T
+HAVE_SIGNED_SIG_ATOMIC_T
+BITSIZEOF_WINT_T
+BITSIZEOF_WCHAR_T
+BITSIZEOF_SIG_ATOMIC_T
+BITSIZEOF_SIZE_T
+BITSIZEOF_PTRDIFF_T
+HAVE_STDINT_H
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H
+NEXT_STDINT_H
+HAVE_SYS_TYPES_H
+HAVE_INTTYPES_H
+HAVE_WCHAR_H
+GNULIB_OVERRIDES_WINT_T
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H
+NEXT_STDDEF_H
+GL_GENERATE_STDDEF_H_FALSE
+GL_GENERATE_STDDEF_H_TRUE
+STDDEF_H
+HAVE_WCHAR_T
+HAVE_MAX_ALIGN_T
+REPLACE_NULL
+HAVE__BOOL
+GL_GENERATE_STDBOOL_H_FALSE
+GL_GENERATE_STDBOOL_H_TRUE
+STDBOOL_H
+APPLE_UNIVERSAL_BUILD
+USE_SYSTEM_GLOB
+USE_SYSTEM_GLOB_FALSE
+USE_SYSTEM_GLOB_TRUE
+GL_GENERATE_LIMITS_H_FALSE
+GL_GENERATE_LIMITS_H_TRUE
+LIMITS_H
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H
+NEXT_LIMITS_H
+HOST_CPU_C_ABI
+HOST_CPU
+LTLIBINTL
+LIBINTL
+GETLOADAVG_LIBS
+REPLACE_WCTOMB
+REPLACE_UNSETENV
+REPLACE_STRTOLD
+REPLACE_STRTOD
+REPLACE_SETSTATE
+REPLACE_SETENV
+REPLACE_REALPATH
+REPLACE_REALLOC
+REPLACE_RANDOM_R
+REPLACE_RANDOM
+REPLACE_QSORT_R
+REPLACE_PUTENV
+REPLACE_PTSNAME_R
+REPLACE_PTSNAME
+REPLACE_MKSTEMP
+REPLACE_MBTOWC
+REPLACE_MALLOC
+REPLACE_INITSTATE
+REPLACE_CANONICALIZE_FILE_NAME
+REPLACE_CALLOC
+HAVE_DECL_UNSETENV
+HAVE_UNLOCKPT
+HAVE_SYS_LOADAVG_H
+HAVE_STRUCT_RANDOM_DATA
+HAVE_STRTOULL
+HAVE_STRTOLL
+HAVE_STRTOLD
+HAVE_STRTOD
+HAVE_DECL_SETSTATE
+HAVE_SETSTATE
+HAVE_DECL_SETENV
+HAVE_SETENV
+HAVE_SECURE_GETENV
+HAVE_RPMATCH
+HAVE_REALPATH
+HAVE_REALLOCARRAY
+HAVE_RANDOM_R
+HAVE_RANDOM_H
+HAVE_RANDOM
+HAVE_QSORT_R
+HAVE_PTSNAME_R
+HAVE_PTSNAME
+HAVE_POSIX_OPENPT
+HAVE_MKSTEMPS
+HAVE_MKSTEMP
+HAVE_MKOSTEMPS
+HAVE_MKOSTEMP
+HAVE_MKDTEMP
+HAVE_MBTOWC
+HAVE_DECL_INITSTATE
+HAVE_INITSTATE
+HAVE_GRANTPT
+HAVE_GETSUBOPT
+HAVE_DECL_GETLOADAVG
+HAVE_CANONICALIZE_FILE_NAME
+HAVE_ATOLL
+HAVE__EXIT
+GNULIB_WCTOMB
+GNULIB_UNSETENV
+GNULIB_UNLOCKPT
+GNULIB_SYSTEM_POSIX
+GNULIB_STRTOULL
+GNULIB_STRTOLL
+GNULIB_STRTOLD
+GNULIB_STRTOD
+GNULIB_SETENV
+GNULIB_SECURE_GETENV
+GNULIB_RPMATCH
+GNULIB_REALPATH
+GNULIB_REALLOC_POSIX
+GNULIB_REALLOCARRAY
+GNULIB_RANDOM_R
+GNULIB_RANDOM
+GNULIB_QSORT_R
+GNULIB_PUTENV
+GNULIB_PTSNAME_R
+GNULIB_PTSNAME
+GNULIB_POSIX_OPENPT
+GNULIB_MKSTEMPS
+GNULIB_MKSTEMP
+GNULIB_MKOSTEMPS
+GNULIB_MKOSTEMP
+GNULIB_MKDTEMP
+GNULIB_MBTOWC
+GNULIB_MALLOC_POSIX
+GNULIB_GRANTPT
+GNULIB_GETSUBOPT
+GNULIB_GETLOADAVG
+GNULIB_CANONICALIZE_FILE_NAME
+GNULIB_CALLOC_POSIX
+GNULIB_ATOLL
+GNULIB__EXIT
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H
+NEXT_FCNTL_H
+REPLACE_OPENAT
+REPLACE_OPEN
+REPLACE_FCNTL
+REPLACE_CREAT
+HAVE_OPENAT
+HAVE_FCNTL
+GNULIB_OPENAT
+GNULIB_OPEN
+GNULIB_NONBLOCKING
+GNULIB_FCNTL
+GNULIB_CREAT
+EOVERFLOW_VALUE
+EOVERFLOW_HIDDEN
+ENOLINK_VALUE
+ENOLINK_HIDDEN
+EMULTIHOP_VALUE
+EMULTIHOP_HIDDEN
+GL_GENERATE_ERRNO_H_FALSE
+GL_GENERATE_ERRNO_H_TRUE
+ERRNO_H
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H
+NEXT_ERRNO_H
+PRAGMA_COLUMNS
+PRAGMA_SYSTEM_HEADER
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE
+INCLUDE_NEXT
+HAVE_WINSOCK2_H
+HAVE_MSVC_INVALID_PARAMETER_HANDLER
+HAVE_ALLOCA_H
+GL_GENERATE_ALLOCA_H_FALSE
+GL_GENERATE_ALLOCA_H_TRUE
+ALLOCA_H
+ALLOCA
 host_os
 host_vendor
 host_cpu
@@ -675,10 +1044,146 @@ build_os
 build_vendor
 build_cpu
 build
-ac_ct_AR
-PERL
-AR
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS
+UNISTD_H_HAVE_WINSOCK2_H
+REPLACE_WRITE
+REPLACE_USLEEP
+REPLACE_UNLINKAT
+REPLACE_UNLINK
+REPLACE_TTYNAME_R
+REPLACE_TRUNCATE
+REPLACE_SYMLINKAT
+REPLACE_SYMLINK
+REPLACE_SLEEP
+REPLACE_RMDIR
+REPLACE_READLINKAT
+REPLACE_READLINK
+REPLACE_READ
+REPLACE_PWRITE
+REPLACE_PREAD
+REPLACE_LSEEK
+REPLACE_LINKAT
+REPLACE_LINK
+REPLACE_LCHOWN
+REPLACE_ISATTY
+REPLACE_GETPASS
+REPLACE_GETPAGESIZE
+REPLACE_GETGROUPS
+REPLACE_GETLOGIN_R
+REPLACE_GETDTABLESIZE
+REPLACE_GETDOMAINNAME
+REPLACE_GETCWD
+REPLACE_FTRUNCATE
+REPLACE_FCHOWNAT
+REPLACE_FACCESSAT
+REPLACE_DUP2
+REPLACE_DUP
+REPLACE_CLOSE
+REPLACE_CHOWN
+REPLACE_ACCESS
+HAVE_SYS_PARAM_H
+HAVE_OS_H
+HAVE_DECL_TTYNAME_R
+HAVE_DECL_TRUNCATE
+HAVE_DECL_SETHOSTNAME
+HAVE_DECL_GETUSERSHELL
+HAVE_DECL_GETPAGESIZE
+HAVE_DECL_GETLOGIN_R
+HAVE_DECL_GETLOGIN
+HAVE_DECL_GETDOMAINNAME
+HAVE_DECL_FDATASYNC
+HAVE_DECL_FCHDIR
+HAVE_DECL_ENVIRON
+HAVE_USLEEP
+HAVE_UNLINKAT
+HAVE_SYMLINKAT
+HAVE_SYMLINK
+HAVE_SLEEP
+HAVE_SETHOSTNAME
+HAVE_READLINKAT
+HAVE_READLINK
+HAVE_PWRITE
+HAVE_PREAD
+HAVE_PIPE2
+HAVE_PIPE
+HAVE_LINKAT
+HAVE_LINK
+HAVE_LCHOWN
+HAVE_GROUP_MEMBER
+HAVE_GETPASS
+HAVE_GETPAGESIZE
+HAVE_GETLOGIN
+HAVE_GETHOSTNAME
+HAVE_GETGROUPS
+HAVE_GETDTABLESIZE
+HAVE_FTRUNCATE
+HAVE_FSYNC
+HAVE_FDATASYNC
+HAVE_FCHOWNAT
+HAVE_FCHDIR
+HAVE_FACCESSAT
+HAVE_EUIDACCESS
+HAVE_DUP3
+HAVE_DUP2
+HAVE_COPY_FILE_RANGE
+HAVE_CHOWN
+GNULIB_WRITE
+GNULIB_USLEEP
+GNULIB_UNLINKAT
+GNULIB_UNLINK
+GNULIB_UNISTD_H_SIGPIPE
+GNULIB_UNISTD_H_NONBLOCKING
+GNULIB_TTYNAME_R
+GNULIB_TRUNCATE
+GNULIB_SYMLINKAT
+GNULIB_SYMLINK
+GNULIB_SLEEP
+GNULIB_SETHOSTNAME
+GNULIB_RMDIR
+GNULIB_READLINKAT
+GNULIB_READLINK
+GNULIB_READ
+GNULIB_PWRITE
+GNULIB_PREAD
+GNULIB_PIPE2
+GNULIB_PIPE
+GNULIB_LSEEK
+GNULIB_LINKAT
+GNULIB_LINK
+GNULIB_LCHOWN
+GNULIB_ISATTY
+GNULIB_GROUP_MEMBER
+GNULIB_GETUSERSHELL
+GNULIB_GETPASS
+GNULIB_GETPAGESIZE
+GNULIB_GETLOGIN_R
+GNULIB_GETLOGIN
+GNULIB_GETHOSTNAME
+GNULIB_GETGROUPS
+GNULIB_GETDTABLESIZE
+GNULIB_GETDOMAINNAME
+GNULIB_GETCWD
+GNULIB_FTRUNCATE
+GNULIB_FSYNC
+GNULIB_FDATASYNC
+GNULIB_FCHOWNAT
+GNULIB_FCHDIR
+GNULIB_FACCESSAT
+GNULIB_EUIDACCESS
+GNULIB_ENVIRON
+GNULIB_DUP3
+GNULIB_DUP2
+GNULIB_DUP
+GNULIB_COPY_FILE_RANGE
+GNULIB_CLOSE
+GNULIB_CHOWN
+GNULIB_CHDIR
+GNULIB_ACCESS
+GL_COND_LIBTOOL_FALSE
+GL_COND_LIBTOOL_TRUE
 RANLIB
+ARFLAGS
+AR
 EGREP
 GREP
 CPP
@@ -689,7 +1194,6 @@ am__nodep
 AMDEPBACKSLASH
 AMDEP_FALSE
 AMDEP_TRUE
-am__quote
 am__include
 DEPDIR
 OBJEXT
@@ -764,12 +1268,14 @@ PACKAGE_VERSION
 PACKAGE_TARNAME
 PACKAGE_NAME
 PATH_SEPARATOR
-SHELL'
+SHELL
+am__quote'
 ac_subst_files='MAINT_MAKEFILE'
 ac_user_opts='
 enable_option_checking
 enable_silent_rules
 enable_dependency_tracking
+enable_cross_guesses
 enable_nls
 with_gnu_ld
 enable_rpath
@@ -781,6 +1287,7 @@ with_customs
 enable_case_insensitive_file_system
 enable_job_server
 enable_load
+enable_posix_spawn
 with_dmalloc
 '
       ac_precious_vars='build_alias
@@ -1347,7 +1854,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures GNU make 4.2.1 to adapt to many kinds of systems.
+\`configure' configures GNU make 4.3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1418,7 +1925,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GNU make 4.2.1:";;
+     short | recursive ) echo "Configuration of GNU make 4.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1432,6 +1939,8 @@ Optional Features:
                           do not reject slow dependency extractors
   --disable-dependency-tracking
                           speeds up one-time build
+  --enable-cross-guesses={conservative|risky}
+                          specify policy for cross-compilation guesses
   --disable-nls           do not use Native Language Support
   --disable-rpath         do not hardcode runtime library paths
   --disable-largefile     omit support for large files
@@ -1439,6 +1948,7 @@ Optional Features:
                           assume file systems are case insensitive
   --disable-job-server    disallow recursive make communication during -jN
   --disable-load          disable support for the 'load' operation
+  --disable-posix-spawn   disable support for posix_spawn()
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1538,7 +2048,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GNU make configure 4.2.1
+GNU make configure 4.3
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1791,52 +2301,6 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_header_compile
 
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-        test -z "$ac_c_werror_flag" ||
-        test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-        test "$cross_compiling" = yes ||
-        test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
 # ac_fn_c_check_type LINENO TYPE VAR INCLUDES
 # -------------------------------------------
 # Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -1891,6 +2355,52 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_type
 
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
 # ac_fn_c_check_func LINENO FUNC VAR
 # ----------------------------------
 # Tests whether FUNC exists, setting the cache variable VAR accordingly
@@ -1958,6 +2468,189 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_func
 
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+       return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+       return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
 # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
 # ---------------------------------------------
 # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
@@ -2064,7 +2757,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by GNU make $as_me 4.2.1, which was
+It was created by GNU make $as_me 4.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2344,6 +3037,18 @@ $as_echo "$as_me: creating cache $cache_file" >&6;}
   >$cache_file
 fi
 
+as_fn_append ac_func_list " _set_invalid_parameter_handler"
+as_fn_append ac_header_list " sys/socket.h"
+as_fn_append ac_func_list " fcntl"
+as_fn_append ac_header_list " unistd.h"
+as_fn_append ac_func_list " symlink"
+as_fn_append ac_func_list " getdtablesize"
+as_fn_append ac_header_list " sys/param.h"
+as_fn_append ac_func_list " getprogname"
+as_fn_append ac_func_list " getexecname"
+as_fn_append ac_header_list " limits.h"
+as_fn_append ac_header_list " wchar.h"
+as_fn_append ac_header_list " stdint.h"
 gt_needs="$gt_needs "
 # Check that the precious variables saved in the cache have kept the same
 # value.
@@ -2418,7 +3123,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 # Autoconf setup
 ac_aux_dir=
-for ac_dir in config "$srcdir"/config; do
+for ac_dir in build-aux "$srcdir"/build-aux; do
   if test -f "$ac_dir/install-sh"; then
     ac_aux_dir=$ac_dir
     ac_install_sh="$ac_aux_dir/install-sh -c"
@@ -2434,7 +3139,7 @@ for ac_dir in config "$srcdir"/config; do
   fi
 done
 if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
 fi
 
 # These three variables are undocumented and unsupported,
@@ -2447,14 +3152,17 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 
 
-ac_config_headers="$ac_config_headers config.h"
+ac_config_headers="$ac_config_headers src/config.h"
+
+
 
 
 # Automake setup
 # We have to enable "foreign" because ChangeLog is auto-generated
-# We cannot enable -Werror because gettext 0.18.1 has invalid content
-# When we update gettext to 0.18.3 or better we can add it again.
-am__api_version='1.15'
+# Automake 1.15 and gnulib don't get along: gnulib has some strange error
+# in the way it handles getloadavg.c which causes make distcheck to fail.
+# http://lists.gnu.org/archive/html/bug-gnulib/2018-06/msg00024.html
+am__api_version='1.16'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -2940,7 +3648,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='make'
- VERSION='4.2.1'
+ VERSION='4.3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2970,8 +3678,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
 # For better backward compatibility.  To be removed once Automake 1.9.x
 # dies out for good.  For more background, see:
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
-# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
 # We need awk for the "check" target (and possibly the TAP driver).  The
@@ -3022,7 +3730,7 @@ END
 Aborting the configuration process, to ensure you take notice of the issue.
 
 You can download and install GNU coreutils to get an 'rm' implementation
-that behaves properly: <http://www.gnu.org/software/coreutils/>.
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
 
 If you want to complete the configuration process using your problematic
 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
@@ -3039,45 +3747,45 @@ DEPDIR="${am__leading_dot}deps"
 
 ac_config_commands="$ac_config_commands depfiles"
 
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
 am__doit:
-       @echo this is the am__doit target
+       @echo this is the am__doit target >confinc.out
 .PHONY: am__doit
 END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
 am__include="#"
 am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from 'make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
-  am__include=include
-  am__quote=
-  _am_result=GNU
-  ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   case `$am_make -s -f confmf 2> /dev/null` in #(
-   *the\ am__doit\ target*)
-     am__include=.include
-     am__quote="\""
-     _am_result=BSD
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  case $?:`cat confinc.out 2>/dev/null` in #(
+  '0:this is the am__doit target') :
+    case $s in #(
+  BSD) :
+    am__include='.include' am__quote='"' ;; #(
+  *) :
+    am__include='include' am__quote='' ;;
+esac ;; #(
+  *) :
      ;;
-   esac
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
+esac
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
 
 # Check whether --enable-dependency-tracking was given.
 if test "${enable_dependency_tracking+set}" = set; then :
@@ -4491,6 +5199,9 @@ $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
 
 $as_echo "#define _MINIX 1" >>confdefs.h
 
+
+$as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h
+
   fi
 
 
@@ -4526,15 +5237,85 @@ $as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
 
   $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
 
+  $as_echo "#define _DARWIN_C_SOURCE 1" >>confdefs.h
+
   $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
 
+  $as_echo "#define _NETBSD_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _OPENBSD_SOURCE 1" >>confdefs.h
+
   $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
 
+  $as_echo "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h
+
+  $as_echo "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h
+
+  $as_echo "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h
+
+  $as_echo "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h
+
+  $as_echo "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h
+
+  $as_echo "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h
+
+  $as_echo "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h
+
   $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5
+$as_echo_n "checking whether _XOPEN_SOURCE should be defined... " >&6; }
+if ${ac_cv_should_define__xopen_source+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_should_define__xopen_source=no
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
+          #include <wchar.h>
+          mbstate_t x;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #define _XOPEN_SOURCE 500
+             #include <wchar.h>
+             mbstate_t x;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_should_define__xopen_source=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5
+$as_echo "$ac_cv_should_define__xopen_source" >&6; }
+  test $ac_cv_should_define__xopen_source = yes &&
+    $as_echo "#define _XOPEN_SOURCE 500" >>confdefs.h
+
+  $as_echo "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
@@ -5260,7 +6041,157 @@ fi
 
 
 
-if test -n "$ac_tool_prefix"; then
+# Configure gnulib
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5
+$as_echo_n "checking for Minix Amsterdam compiler... " >&6; }
+if ${gl_cv_c_amsterdam_compiler+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __ACK__
+Amsterdam
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Amsterdam" >/dev/null 2>&1; then :
+  gl_cv_c_amsterdam_compiler=yes
+else
+  gl_cv_c_amsterdam_compiler=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5
+$as_echo "$gl_cv_c_amsterdam_compiler" >&6; }
+
+      if test $gl_cv_c_amsterdam_compiler = yes; then
+    if test -z "$AR"; then
+      AR='cc -c.a'
+    fi
+    if test -z "$ARFLAGS"; then
+      ARFLAGS='-o'
+    fi
+  else
+                                                :
+  fi
+
+        if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR="ar"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+  if test -z "$ARFLAGS"; then
+    ARFLAGS='cr'
+  fi
+
+
+
+  if test -z "$RANLIB"; then
+    if test $gl_cv_c_amsterdam_compiler = yes; then
+      RANLIB=':'
+    else
+            if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
   RANLIB="$ac_cv_prog_RANLIB"
 fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                    Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+    fi
+  fi
 
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
+
+
+  # Pre-early section.
+
+
+
+  # Code from module absolute-header:
+  # Code from module access:
+  # Code from module alloca:
+  # Code from module alloca-opt:
+  # Code from module close:
+  # Code from module concat-filename:
+  # Code from module dirname-lgpl:
+  # Code from module dosname:
+  # Code from module double-slash-root:
+  # Code from module dup2:
+  # Code from module errno:
+  # Code from module error:
+  # Code from module exitfail:
+  # Code from module extensions:
+  # Code from module extern-inline:
+  # Code from module fcntl:
+  # Code from module fcntl-h:
+  # Code from module fd-hook:
+  # Code from module fdl:
+  # Code from module filename:
+  # Code from module findprog-in:
+  # Code from module getdtablesize:
+  # Code from module getloadavg:
+  # Code from module getprogname:
+  # Code from module gettext-h:
+  # Code from module host-cpu-c-abi:
+  # Code from module include_next:
+  # Code from module intprops:
+  # Code from module limits-h:
+  # Code from module make-glob:
+  # Code from module malloc-posix:
+  # Code from module msvc-inval:
+  # Code from module msvc-nothrow:
+  # Code from module multiarch:
+  # Code from module snippet/_Noreturn:
+  # Code from module snippet/arg-nonnull:
+  # Code from module snippet/c++defs:
+  # Code from module snippet/warn-on-use:
+  # Code from module ssize_t:
+  # Code from module stdbool:
+  # Code from module stddef:
+  # Code from module stdint:
+  # Code from module stdio:
+  # Code from module stdlib:
+  # Code from module stpcpy:
+  # Code from module strerror:
+  # Code from module strerror-override:
+  # Code from module string:
+  # Code from module sys_types:
+  # Code from module unistd:
+  # Code from module verify:
+  # Code from module xalloc:
+  # Code from module xalloc-die:
+  # Code from module xalloc-oversized:
+  # Code from module xconcat-filename:
+
+
+
+
+
+
+
+                        # Check whether --enable-cross-guesses was given.
+if test "${enable_cross_guesses+set}" = set; then :
+  enableval=$enable_cross_guesses; if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-cross-guesses" >&5
+$as_echo "$as_me: WARNING: invalid argument supplied to --enable-cross-guesses" >&2;}
+       enableval=conservative
+     fi
+     gl_cross_guesses="$enableval"
 else
-  # Passes both tests.
-ac_preproc_ok=:
-break
+  gl_cross_guesses=conservative
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
+  if test $gl_cross_guesses = risky; then
+    gl_cross_guess_normal="guessing yes"
+    gl_cross_guess_inverted="guessing no"
+  else
+    gl_cross_guess_normal="guessing no"
+    gl_cross_guess_inverted="guessing yes"
+  fi
+          LIBC_FATAL_STDERR_=1
+  export LIBC_FATAL_STDERR_
+
+
+  GNULIB_ACCESS=0;
+  GNULIB_CHDIR=0;
+  GNULIB_CHOWN=0;
+  GNULIB_CLOSE=0;
+  GNULIB_COPY_FILE_RANGE=0;
+  GNULIB_DUP=0;
+  GNULIB_DUP2=0;
+  GNULIB_DUP3=0;
+  GNULIB_ENVIRON=0;
+  GNULIB_EUIDACCESS=0;
+  GNULIB_FACCESSAT=0;
+  GNULIB_FCHDIR=0;
+  GNULIB_FCHOWNAT=0;
+  GNULIB_FDATASYNC=0;
+  GNULIB_FSYNC=0;
+  GNULIB_FTRUNCATE=0;
+  GNULIB_GETCWD=0;
+  GNULIB_GETDOMAINNAME=0;
+  GNULIB_GETDTABLESIZE=0;
+  GNULIB_GETGROUPS=0;
+  GNULIB_GETHOSTNAME=0;
+  GNULIB_GETLOGIN=0;
+  GNULIB_GETLOGIN_R=0;
+  GNULIB_GETPAGESIZE=0;
+  GNULIB_GETPASS=0;
+  GNULIB_GETUSERSHELL=0;
+  GNULIB_GROUP_MEMBER=0;
+  GNULIB_ISATTY=0;
+  GNULIB_LCHOWN=0;
+  GNULIB_LINK=0;
+  GNULIB_LINKAT=0;
+  GNULIB_LSEEK=0;
+  GNULIB_PIPE=0;
+  GNULIB_PIPE2=0;
+  GNULIB_PREAD=0;
+  GNULIB_PWRITE=0;
+  GNULIB_READ=0;
+  GNULIB_READLINK=0;
+  GNULIB_READLINKAT=0;
+  GNULIB_RMDIR=0;
+  GNULIB_SETHOSTNAME=0;
+  GNULIB_SLEEP=0;
+  GNULIB_SYMLINK=0;
+  GNULIB_SYMLINKAT=0;
+  GNULIB_TRUNCATE=0;
+  GNULIB_TTYNAME_R=0;
+  GNULIB_UNISTD_H_NONBLOCKING=0;
+  GNULIB_UNISTD_H_SIGPIPE=0;
+  GNULIB_UNLINK=0;
+  GNULIB_UNLINKAT=0;
+  GNULIB_USLEEP=0;
+  GNULIB_WRITE=0;
+    HAVE_CHOWN=1;
+  HAVE_COPY_FILE_RANGE=1;
+  HAVE_DUP2=1;
+  HAVE_DUP3=1;
+  HAVE_EUIDACCESS=1;
+  HAVE_FACCESSAT=1;
+  HAVE_FCHDIR=1;
+  HAVE_FCHOWNAT=1;
+  HAVE_FDATASYNC=1;
+  HAVE_FSYNC=1;
+  HAVE_FTRUNCATE=1;
+  HAVE_GETDTABLESIZE=1;
+  HAVE_GETGROUPS=1;
+  HAVE_GETHOSTNAME=1;
+  HAVE_GETLOGIN=1;
+  HAVE_GETPAGESIZE=1;
+  HAVE_GETPASS=1;
+  HAVE_GROUP_MEMBER=1;
+  HAVE_LCHOWN=1;
+  HAVE_LINK=1;
+  HAVE_LINKAT=1;
+  HAVE_PIPE=1;
+  HAVE_PIPE2=1;
+  HAVE_PREAD=1;
+  HAVE_PWRITE=1;
+  HAVE_READLINK=1;
+  HAVE_READLINKAT=1;
+  HAVE_SETHOSTNAME=1;
+  HAVE_SLEEP=1;
+  HAVE_SYMLINK=1;
+  HAVE_SYMLINKAT=1;
+  HAVE_UNLINKAT=1;
+  HAVE_USLEEP=1;
+  HAVE_DECL_ENVIRON=1;
+  HAVE_DECL_FCHDIR=1;
+  HAVE_DECL_FDATASYNC=1;
+  HAVE_DECL_GETDOMAINNAME=1;
+  HAVE_DECL_GETLOGIN=1;
+  HAVE_DECL_GETLOGIN_R=1;
+  HAVE_DECL_GETPAGESIZE=1;
+  HAVE_DECL_GETUSERSHELL=1;
+  HAVE_DECL_SETHOSTNAME=1;
+  HAVE_DECL_TRUNCATE=1;
+  HAVE_DECL_TTYNAME_R=1;
+  HAVE_OS_H=0;
+  HAVE_SYS_PARAM_H=0;
+  REPLACE_ACCESS=0;
+  REPLACE_CHOWN=0;
+  REPLACE_CLOSE=0;
+  REPLACE_DUP=0;
+  REPLACE_DUP2=0;
+  REPLACE_FACCESSAT=0;
+  REPLACE_FCHOWNAT=0;
+  REPLACE_FTRUNCATE=0;
+  REPLACE_GETCWD=0;
+  REPLACE_GETDOMAINNAME=0;
+  REPLACE_GETDTABLESIZE=0;
+  REPLACE_GETLOGIN_R=0;
+  REPLACE_GETGROUPS=0;
+  REPLACE_GETPAGESIZE=0;
+  REPLACE_GETPASS=0;
+  REPLACE_ISATTY=0;
+  REPLACE_LCHOWN=0;
+  REPLACE_LINK=0;
+  REPLACE_LINKAT=0;
+  REPLACE_LSEEK=0;
+  REPLACE_PREAD=0;
+  REPLACE_PWRITE=0;
+  REPLACE_READ=0;
+  REPLACE_READLINK=0;
+  REPLACE_READLINKAT=0;
+  REPLACE_RMDIR=0;
+  REPLACE_SLEEP=0;
+  REPLACE_SYMLINK=0;
+  REPLACE_SYMLINKAT=0;
+  REPLACE_TRUNCATE=0;
+  REPLACE_TTYNAME_R=0;
+  REPLACE_UNLINK=0;
+  REPLACE_UNLINKAT=0;
+  REPLACE_USLEEP=0;
+  REPLACE_WRITE=0;
+  UNISTD_H_HAVE_WINSOCK2_H=0;
+  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
 
-    done
-    ac_cv_prog_CPP=$CPP
 
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-                    Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  # Broken: fails on valid input.
-continue
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  # Passes both tests.
-ac_preproc_ok=:
-break
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
 
 else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
 
-# Extract the first word of "ar", so it can be a program name with args.
-set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+$as_echo_n "checking for working alloca.h... " >&6; }
+if ${ac_cv_working_alloca_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+                         if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_working_alloca_h=yes
 else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="ar"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
-
-  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
-fi
+  ac_cv_working_alloca_h=no
 fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+$as_echo "$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
 
+$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
 
-# Perl is needed for the test suite (only)
-# Extract the first word of "perl", so it can be a program name with args.
-set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PERL+:} false; then :
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+$as_echo_n "checking for alloca... " >&6; }
+if ${ac_cv_func_alloca_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$PERL"; then
-  ac_cv_prog_PERL="$PERL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_PERL="perl"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  ifdef HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+void *alloca (size_t);
+#    endif
+#   endif
+#  endif
+# endif
+#endif
 
-  test -z "$ac_cv_prog_PERL" && ac_cv_prog_PERL="perl"
+int
+main ()
+{
+char *p = (char *) alloca (1);
+                                   if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_func_alloca_works=yes
+else
+  ac_cv_func_alloca_works=no
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 fi
-PERL=$ac_cv_prog_PERL
-if test -n "$PERL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+$as_echo "$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
 
 
 
-# Needed for w32/Makefile.am
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in ar lib "link -lib"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
+
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+$as_echo "#define C_ALLOCA 1" >>confdefs.h
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
+if ${ac_cv_os_cray+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
 
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "webecray" >/dev/null 2>&1; then :
+  ac_cv_os_cray=yes
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_cv_os_cray=no
 fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
+$as_echo "$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
 
+    break
+fi
 
-    test -n "$AR" && break
   done
 fi
-if test -z "$AR"; then
-  ac_ct_AR=$AR
-  for ac_prog in ar lib "link -lib"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+$as_echo_n "checking stack direction for C alloca... " >&6; }
+if ${ac_cv_c_stack_direction+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+  if test "$cross_compiling" = yes; then :
+  ac_cv_c_stack_direction=0
 else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AR="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+find_stack_direction (int *addr, int depth)
+{
+  int dir, dummy = 0;
+  if (! addr)
+    addr = &dummy;
+  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+  return dir + dummy;
+}
 
+int
+main (int argc, char **argv)
+{
+  return find_stack_direction (0, argc + !argv + 20) < 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_stack_direction=1
+else
+  ac_cv_c_stack_direction=-1
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+$as_echo "$ac_cv_c_stack_direction" >&6; }
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
 fi
 
 
-  test -n "$ac_ct_AR" && break
+
+
+  for ac_func in $ac_func_list
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
 done
 
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
+
+
+
+
+  if test $ac_cv_func__set_invalid_parameter_handler = yes; then
+    HAVE_MSVC_INVALID_PARAMETER_HANDLER=1
+
+$as_echo "#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1" >>confdefs.h
+
   else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
+    HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
   fi
+
+
+
+
+
+  for ac_header in $ac_header_list
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
 fi
 
-: ${AR=ar}
+done
+
+
+
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
-$as_echo_n "checking the archiver ($AR) interface... " >&6; }
-if ${am_cv_ar_interface+:} false; then :
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
+$as_echo_n "checking whether // is distinct from /... " >&6; }
+if ${gl_cv_double_slash_root+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-   am_cv_ar_interface=ar
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int some_variable = 0;
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'
-      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
-  (eval $am_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
-        am_cv_ar_interface=ar
+   if test x"$cross_compiling" = xyes ; then
+        # When cross-compiling, there is no way to tell whether // is special
+        # short of a list of hosts.  However, the only known hosts to date
+        # that have a distinct // are Apollo DomainOS (too old to port to),
+        # Cygwin, and z/OS.  If anyone knows of another system for which // has
+        # special semantics and is distinct from /, please report it to
+        # <bug-gnulib@gnu.org>.
+        case $host in
+          *-cygwin | i370-ibm-openedition)
+            gl_cv_double_slash_root=yes ;;
+          *)
+            # Be optimistic and assume that / and // are the same when we
+            # don't know.
+            gl_cv_double_slash_root='unknown, assuming no' ;;
+        esac
       else
-        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'
-        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
-  (eval $am_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-        if test "$ac_status" -eq 0; then
-          am_cv_ar_interface=lib
+        set x `ls -di / // 2>/dev/null`
+        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
+          gl_cv_double_slash_root=no
         else
-          am_cv_ar_interface=unknown
+          gl_cv_double_slash_root=yes
         fi
       fi
-      rm -f conftest.lib libconftest.a
-
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
+$as_echo "$gl_cv_double_slash_root" >&6; }
+  if test "$gl_cv_double_slash_root" = yes; then
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
-$as_echo "$am_cv_ar_interface" >&6; }
+$as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
 
-case $am_cv_ar_interface in
-ar)
-  ;;
-lib)
-  # Microsoft lib, so override with the ar-lib wrapper script.
-  # FIXME: It is wrong to rewrite AR.
-  # But if we don't then we get into trouble of one sort or another.
-  # A longer-term fix would be to have automake use am__AR in this case,
-  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
-  # similar.
-  AR="$am_aux_dir/ar-lib $AR"
-  ;;
-unknown)
-  as_fn_error $? "could not determine $AR interface" "$LINENO" 5
-  ;;
-esac
+  fi
 
 
-# Specialized system macros
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the preprocessor supports include_next" >&5
+$as_echo_n "checking whether the preprocessor supports include_next... " >&6; }
+if ${gl_cv_have_include_next+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+  rm -rf conftestd1a conftestd1b conftestd2
+     mkdir conftestd1a conftestd1b conftestd2
+                                                  cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+     gl_save_CPPFLAGS="$CPPFLAGS"
+     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_have_include_next=yes
+else
+  CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <conftest.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_have_include_next=buggy
+else
+  gl_cv_have_include_next=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     CPPFLAGS="$gl_save_CPPFLAGS"
+     rm -rf conftestd1a conftestd1b conftestd2
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_have_include_next" >&5
+$as_echo "$gl_cv_have_include_next" >&6; }
+  PRAGMA_SYSTEM_HEADER=
+  if test $gl_cv_have_include_next = yes; then
+    INCLUDE_NEXT=include_next
+    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    if test -n "$GCC"; then
+      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+    fi
+  else
+    if test $gl_cv_have_include_next = buggy; then
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    else
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+    fi
+  fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system header files limit the line length" >&5
+$as_echo_n "checking whether system header files limit the line length... " >&6; }
+if ${gl_cv_pragma_columns+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test "x$host_alias" = x; then
-  ac_cv_host=$ac_cv_build
-else
-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
-fi
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#ifdef __TANDEM
+choke me
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "choke me" >/dev/null 2>&1; then :
+  gl_cv_pragma_columns=yes
+else
+  gl_cv_pragma_columns=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
-case $ac_cv_host in
-*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
-esac
-host=$ac_cv_host
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_host
-shift
-host_cpu=$1
-host_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-host_os=$*
-IFS=$ac_save_IFS
-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+rm -f conftest*
+
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_pragma_columns" >&5
+$as_echo "$gl_cv_pragma_columns" >&6; }
+  if test $gl_cv_pragma_columns = yes; then
+    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+  else
+    PRAGMA_COLUMNS=
+  fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
-$as_echo_n "checking for library containing strerror... " >&6; }
-if ${ac_cv_search_strerror+:} false; then :
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
+$as_echo_n "checking for complete errno.h... " >&6; }
+if ${gl_cv_header_errno_h_complete+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
+#endif
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
 #endif
-char strerror ();
-int
-main ()
-{
-return strerror ();
-  ;
-  return 0;
-}
-_ACEOF
-for ac_lib in '' cposix; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_strerror=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_strerror+:} false; then :
-  break
-fi
-done
-if ${ac_cv_search_strerror+:} false; then :
 
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "booboo" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_complete=no
 else
-  ac_cv_search_strerror=no
+  gl_cv_header_errno_h_complete=yes
 fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
-$as_echo "$ac_cv_search_strerror" >&6; }
-ac_res=$ac_cv_search_strerror
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+rm -f conftest*
+
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_complete" >&5
+$as_echo "$gl_cv_header_errno_h_complete" >&6; }
+  if test $gl_cv_header_errno_h_complete = yes; then
+    ERRNO_H=''
+  else
 
 
 
-# Enable gettext, in "external" mode.
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_errno_h='<'errno.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <errno.h>" >&5
+$as_echo_n "checking absolute name of <errno.h>... " >&6; }
+if ${gl_cv_next_errno_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_SED" || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
 
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <errno.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'errno.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_errno_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_errno_h
+           gl_cv_next_errno_h='"'$gl_header'"'
+
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_errno_h" >&5
+$as_echo "$gl_cv_next_errno_h" >&6; }
+     fi
+     NEXT_ERRNO_H=$gl_cv_next_errno_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'errno.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_errno_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_ERRNO_H=$gl_next_as_first_directive
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
-$as_echo_n "checking whether NLS is requested... " >&6; }
-    # Check whether --enable-nls was given.
-if test "${enable_nls+set}" = set; then :
-  enableval=$enable_nls; USE_NLS=$enableval
+
+
+    ERRNO_H='errno.h'
+  fi
+
+   if test -n "$ERRNO_H"; then
+  GL_GENERATE_ERRNO_H_TRUE=
+  GL_GENERATE_ERRNO_H_FALSE='#'
 else
-  USE_NLS=yes
+  GL_GENERATE_ERRNO_H_TRUE='#'
+  GL_GENERATE_ERRNO_H_FALSE=
 fi
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
-$as_echo "$USE_NLS" >&6; }
 
+  if test -n "$ERRNO_H"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EMULTIHOP value" >&5
+$as_echo_n "checking for EMULTIHOP value... " >&6; }
+if ${gl_cv_header_errno_h_EMULTIHOP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
 
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
 
-      GETTEXT_MACRO_VERSION=0.19
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_EMULTIHOP=yes
+else
+  gl_cv_header_errno_h_EMULTIHOP=no
+fi
+rm -f conftest*
 
+      if test $gl_cv_header_errno_h_EMULTIHOP = no; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EMULTIHOP
+yes
+#endif
 
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_EMULTIHOP=hidden
+fi
+rm -f conftest*
+
+        if test $gl_cv_header_errno_h_EMULTIHOP = hidden; then
+                              if ac_fn_c_compute_int "$LINENO" "EMULTIHOP" "gl_cv_header_errno_h_EMULTIHOP"        "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+"; then :
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
 fi
 
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
+        fi
+      fi
+
 fi
-rm -f conf$$.file
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EMULTIHOP" >&5
+$as_echo "$gl_cv_header_errno_h_EMULTIHOP" >&6; }
+    case $gl_cv_header_errno_h_EMULTIHOP in
+      yes | no)
+        EMULTIHOP_HIDDEN=0; EMULTIHOP_VALUE=
+        ;;
+      *)
+        EMULTIHOP_HIDDEN=1; EMULTIHOP_VALUE="$gl_cv_header_errno_h_EMULTIHOP"
+        ;;
+    esac
 
-# Extract the first word of "msgfmt", so it can be a program name with args.
-set dummy msgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGFMT+:} false; then :
+
+  fi
+
+
+  if test -n "$ERRNO_H"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK value" >&5
+$as_echo_n "checking for ENOLINK value... " >&6; }
+if ${gl_cv_header_errno_h_ENOLINK+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case "$MSGFMT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
-    ;;
-esac
-fi
-MSGFMT="$ac_cv_path_MSGFMT"
-if test "$MSGFMT" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
-$as_echo "$MSGFMT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
-  # Extract the first word of "gmsgfmt", so it can be a program name with args.
-set dummy gmsgfmt; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GMSGFMT+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $GMSGFMT in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
-  ;;
-esac
-fi
-GMSGFMT=$ac_cv_path_GMSGFMT
-if test -n "$GMSGFMT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
-$as_echo "$GMSGFMT" >&6; }
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_ENOLINK=yes
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  gl_cv_header_errno_h_ENOLINK=no
 fi
+rm -f conftest*
 
+      if test $gl_cv_header_errno_h_ENOLINK = no; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ENOLINK
+yes
+#endif
 
-    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
-    *) MSGFMT_015=$MSGFMT ;;
-  esac
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_ENOLINK=hidden
+fi
+rm -f conftest*
 
-  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
-    *) GMSGFMT_015=$GMSGFMT ;;
-  esac
+        if test $gl_cv_header_errno_h_ENOLINK = hidden; then
+                              if ac_fn_c_compute_int "$LINENO" "ENOLINK" "gl_cv_header_errno_h_ENOLINK"        "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+"; then :
 
+fi
 
+        fi
+      fi
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_ENOLINK" >&5
+$as_echo "$gl_cv_header_errno_h_ENOLINK" >&6; }
+    case $gl_cv_header_errno_h_ENOLINK in
+      yes | no)
+        ENOLINK_HIDDEN=0; ENOLINK_VALUE=
+        ;;
+      *)
+        ENOLINK_HIDDEN=1; ENOLINK_VALUE="$gl_cv_header_errno_h_ENOLINK"
+        ;;
+    esac
 
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
-fi
-rm -f conf$$.file
 
-# Extract the first word of "xgettext", so it can be a program name with args.
-set dummy xgettext; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_XGETTEXT+:} false; then :
+  fi
+
+
+  if test -n "$ERRNO_H"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW value" >&5
+$as_echo_n "checking for EOVERFLOW value... " >&6; }
+if ${gl_cv_header_errno_h_EOVERFLOW+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case "$XGETTEXT" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
-     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
-            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
-    ;;
-esac
-fi
-XGETTEXT="$ac_cv_path_XGETTEXT"
-if test "$XGETTEXT" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
-$as_echo "$XGETTEXT" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
-    rm -f messages.po
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
-    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
-    *) XGETTEXT_015=$XGETTEXT ;;
-  esac
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
 
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_EOVERFLOW=yes
+else
+  gl_cv_header_errno_h_EOVERFLOW=no
+fi
+rm -f conftest*
 
+      if test $gl_cv_header_errno_h_EOVERFLOW = no; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
-fi
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef EOVERFLOW
+yes
+#endif
 
-# Find out how to test for executable files. Don't use a zero-byte file,
-# as systems may use methods other than mode bits to determine executability.
-cat >conf$$.file <<_ASEOF
-#! /bin/sh
-exit 0
-_ASEOF
-chmod +x conf$$.file
-if test -x conf$$.file >/dev/null 2>&1; then
-  ac_executable_p="test -x"
-else
-  ac_executable_p="test -f"
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  gl_cv_header_errno_h_EOVERFLOW=hidden
 fi
-rm -f conf$$.file
+rm -f conftest*
+
+        if test $gl_cv_header_errno_h_EOVERFLOW = hidden; then
+                              if ac_fn_c_compute_int "$LINENO" "EOVERFLOW" "gl_cv_header_errno_h_EOVERFLOW"        "
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+"; then :
 
-# Extract the first word of "msgmerge", so it can be a program name with args.
-set dummy msgmerge; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_MSGMERGE+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case "$MSGMERGE" in
-  [\\/]* | ?:[\\/]*)
-    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
-    ;;
-  *)
-    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH; do
-      IFS="$ac_save_IFS"
-      test -z "$ac_dir" && ac_dir=.
-      for ac_exec_ext in '' $ac_executable_extensions; do
-        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
-          echo "$as_me: trying $ac_dir/$ac_word..." >&5
-          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
-            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
-            break 2
-          fi
-        fi
-      done
-    done
-    IFS="$ac_save_IFS"
-  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
-    ;;
-esac
-fi
-MSGMERGE="$ac_cv_path_MSGMERGE"
-if test "$MSGMERGE" != ":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
-$as_echo "$MSGMERGE" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
 fi
 
+        fi
+      fi
 
-        test -n "$localedir" || localedir='${datadir}/locale'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_errno_h_EOVERFLOW" >&5
+$as_echo "$gl_cv_header_errno_h_EOVERFLOW" >&6; }
+    case $gl_cv_header_errno_h_EOVERFLOW in
+      yes | no)
+        EOVERFLOW_HIDDEN=0; EOVERFLOW_VALUE=
+        ;;
+      *)
+        EOVERFLOW_HIDDEN=1; EOVERFLOW_VALUE="$gl_cv_header_errno_h_EOVERFLOW"
+        ;;
+    esac
 
 
-    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+  fi
 
 
-  ac_config_commands="$ac_config_commands po-directories"
-
-
-
-      if test "X$prefix" = "XNONE"; then
-    acl_final_prefix="$ac_default_prefix"
-  else
-    acl_final_prefix="$prefix"
-  fi
-  if test "X$exec_prefix" = "XNONE"; then
-    acl_final_exec_prefix='${prefix}'
-  else
-    acl_final_exec_prefix="$exec_prefix"
-  fi
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
-  prefix="$acl_save_prefix"
-
-
-
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default"
+if test "x$ac_cv_have_decl_strerror_r" = xyes; then :
+  ac_have_decl=1
 else
-  with_gnu_ld=no
+  ac_have_decl=0
 fi
 
-# Prepare PATH_SEPARATOR.
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
-  # contains only /bin. Note that ksh looks also at the FPATH variable,
-  # so we have to set that as well for the test.
-  PATH_SEPARATOR=:
-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
-           || PATH_SEPARATOR=';'
-       }
-fi
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRERROR_R $ac_have_decl
+_ACEOF
 
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
-      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
-        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${acl_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$acl_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      acl_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-        test "$with_gnu_ld" != no && break
-        ;;
-      *)
-        test "$with_gnu_ld" != yes && break
-        ;;
-      esac
-    fi
-  done
-  IFS="$acl_save_ifs"
-else
-  acl_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
+for ac_func in strerror_r
+do :
+  ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r"
+if test "x$ac_cv_func_strerror_r" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STRERROR_R 1
+_ACEOF
 
-LD="$acl_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
 fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${acl_cv_prog_gnu_ld+:} false; then :
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5
+$as_echo_n "checking whether strerror_r returns char *... " >&6; }
+if ${ac_cv_func_strerror_r_char_p+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  acl_cv_prog_gnu_ld=yes
-  ;;
-*)
-  acl_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
-$as_echo "$acl_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$acl_cv_prog_gnu_ld
-
 
+    ac_cv_func_strerror_r_char_p=no
+    if test $ac_cv_have_decl_strerror_r = yes; then
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
 
+         char buf[100];
+         char x = *strerror_r (0, buf, sizeof buf);
+         char *p = strerror_r (0, buf, sizeof buf);
+         return !p || x;
 
-                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
-$as_echo_n "checking for shared library run path origin... " >&6; }
-if ${acl_cv_rpath+:} false; then :
-  $as_echo_n "(cached) " >&6
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_func_strerror_r_char_p=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    else
+      # strerror_r is not declared.  Choose between
+      # systems that have relatively inaccessible declarations for the
+      # function.  BeOS and DEC UNIX 4.0 fall in this category, but the
+      # former has a strerror_r that returns char*, while the latter
+      # has a strerror_r that returns `int'.
+      # This test should segfault on the DEC system.
+      if test "$cross_compiling" = yes; then :
+  :
 else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+       extern char *strerror_r ();
+int
+main ()
+{
+char buf[100];
+         char x = *strerror_r (0, buf, sizeof buf);
+         return ! isalpha (x);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_strerror_r_char_p=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
 
-    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
-    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
-    . ./conftest.sh
-    rm -f ./conftest.sh
-    acl_cv_rpath=done
+    fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
-$as_echo "$acl_cv_rpath" >&6; }
-  wl="$acl_cv_wl"
-  acl_libext="$acl_cv_libext"
-  acl_shlibext="$acl_cv_shlibext"
-  acl_libname_spec="$acl_cv_libname_spec"
-  acl_library_names_spec="$acl_cv_library_names_spec"
-  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
-  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
-  acl_hardcode_direct="$acl_cv_hardcode_direct"
-  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
-    # Check whether --enable-rpath was given.
-if test "${enable_rpath+set}" = set; then :
-  enableval=$enable_rpath; :
-else
-  enable_rpath=yes
-fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_char_p" >&5
+$as_echo "$ac_cv_func_strerror_r_char_p" >&6; }
+if test $ac_cv_func_strerror_r_char_p = yes; then
 
+$as_echo "#define STRERROR_R_CHAR_P 1" >>confdefs.h
 
+fi
 
 
-  acl_libdirstem=lib
-  acl_libdirstem2=
-  case "$host_os" in
-    solaris*)
-                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
-$as_echo_n "checking for 64-bit host... " >&6; }
-if ${gl_cv_solaris_64bit+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+  XGETTEXT_EXTRA_OPTIONS=
 
-#ifdef _LP64
-sixtyfour bits
-#endif
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
-  gl_cv_solaris_64bit=yes
-else
-  gl_cv_solaris_64bit=no
-fi
-rm -f conftest*
 
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
-$as_echo "$gl_cv_solaris_64bit" >&6; }
-      if test $gl_cv_solaris_64bit = yes; then
-        acl_libdirstem=lib/64
-        case "$host_cpu" in
-          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
-          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
-        esac
-      fi
-      ;;
-    *)
-      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
-      if test -n "$searchpath"; then
-        acl_save_IFS="${IFS=   }"; IFS=":"
-        for searchdir in $searchpath; do
-          if test -d "$searchdir"; then
-            case "$searchdir" in
-              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
-              */../ | */.. )
-                # Better ignore directories of this form. They are misleading.
-                ;;
-              *) searchdir=`cd "$searchdir" && pwd`
-                 case "$searchdir" in
-                   */lib64 ) acl_libdirstem=lib64 ;;
-                 esac ;;
-            esac
-          fi
-        done
-        IFS="$acl_save_IFS"
-      fi
-      ;;
-  esac
-  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
 
+  GNULIB_CREAT=0;
+  GNULIB_FCNTL=0;
+  GNULIB_NONBLOCKING=0;
+  GNULIB_OPEN=0;
+  GNULIB_OPENAT=0;
+    HAVE_FCNTL=1;
+  HAVE_OPENAT=1;
+  REPLACE_CREAT=0;
+  REPLACE_FCNTL=0;
+  REPLACE_OPEN=0;
+  REPLACE_OPENAT=0;
 
 
 
@@ -6482,468 +7485,293 @@ $as_echo "$gl_cv_solaris_64bit" >&6; }
 
 
 
-    use_additional=yes
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
+$as_echo_n "checking for working fcntl.h... " >&6; }
+if ${gl_cv_header_working_fcntl_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                  # Guess 'no' on native Windows.
+          mingw*) gl_cv_header_working_fcntl_h='no' ;;
+          *)      gl_cv_header_working_fcntl_h=cross-compiling ;;
+        esac
 
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+           #include <sys/stat.h>
+           #if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <io.h>
+           # include <stdlib.h>
+           # defined sleep(n) _sleep ((n) * 1000)
+           #endif
+           #include <fcntl.h>
+           #ifndef O_NOATIME
+            #define O_NOATIME 0
+           #endif
+           #ifndef O_NOFOLLOW
+            #define O_NOFOLLOW 0
+           #endif
+           static int const constants[] =
+            {
+              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+            };
 
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
+int
+main ()
+{
 
+            int result = !constants;
+            #if HAVE_SYMLINK
+            {
+              static char const sym[] = "conftest.sym";
+              if (symlink ("/dev/null", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              if (unlink (sym) != 0 || symlink (".", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              unlink (sym);
+            }
+            #endif
+            {
+              static char const file[] = "confdefs.h";
+              int fd = open (file, O_RDONLY | O_NOATIME);
+              if (fd < 0)
+                result |= 8;
+              else
+                {
+                  struct stat st0;
+                  if (fstat (fd, &st0) != 0)
+                    result |= 16;
+                  else
+                    {
+                      char c;
+                      sleep (1);
+                      if (read (fd, &c, 1) != 1)
+                        result |= 24;
+                      else
+                        {
+                          if (close (fd) != 0)
+                            result |= 32;
+                          else
+                            {
+                              struct stat st1;
+                              if (stat (file, &st1) != 0)
+                                result |= 40;
+                              else
+                                if (st0.st_atime != st1.st_atime)
+                                  result |= 64;
+                            }
+                        }
+                    }
+                }
+            }
+            return result;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_header_working_fcntl_h=yes
+else
+  case $? in #(
+        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+         *) gl_cv_header_working_fcntl_h='no';;
+        esac
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
 
-# Check whether --with-libiconv-prefix was given.
-if test "${with_libiconv_prefix+set}" = set; then :
-  withval=$with_libiconv_prefix;
-    if test "X$withval" = "Xno"; then
-      use_additional=no
-    else
-      if test "X$withval" = "X"; then
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_fcntl_h" >&5
+$as_echo "$gl_cv_header_working_fcntl_h" >&6; }
 
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
 
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
+cat >>confdefs.h <<_ACEOF
+#define HAVE_WORKING_O_NOATIME $ac_val
+_ACEOF
 
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-        if test "$acl_libdirstem2" != "$acl_libdirstem" \
-           && ! test -d "$withval/$acl_libdirstem"; then
-          additional_libdir="$withval/$acl_libdirstem2"
-        fi
-      fi
-    fi
 
-fi
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
 
-      LIBICONV=
-  LTLIBICONV=
-  INCICONV=
-  LIBICONV_PREFIX=
-      HAVE_LIBICONV=
-  rpathdirs=
-  ltrpathdirs=
-  names_already_handled=
-  names_next_round='iconv '
-  while test -n "$names_next_round"; do
-    names_this_round="$names_next_round"
-    names_next_round=
-    for name in $names_this_round; do
-      already_handled=
-      for n in $names_already_handled; do
-        if test "$n" = "$name"; then
-          already_handled=yes
-          break
-        fi
-      done
-      if test -z "$already_handled"; then
-        names_already_handled="$names_already_handled $name"
-                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
-        eval value=\"\$HAVE_LIB$uppername\"
-        if test -n "$value"; then
-          if test "$value" = yes; then
-            eval value=\"\$LIB$uppername\"
-            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
-            eval value=\"\$LTLIB$uppername\"
-            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
-          else
-                                    :
-          fi
-        else
-                              found_dir=
-          found_la=
-          found_so=
-          found_a=
-          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
-          if test -n "$acl_shlibext"; then
-            shrext=".$acl_shlibext"             # typically: shrext=.so
-          else
-            shrext=
-          fi
-          if test $use_additional = yes; then
-            dir="$additional_libdir"
-                                    if test -n "$acl_shlibext"; then
-              if test -f "$dir/$libname$shrext"; then
-                found_dir="$dir"
-                found_so="$dir/$libname$shrext"
-              else
-                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
-                  ver=`(cd "$dir" && \
-                        for f in "$libname$shrext".*; do echo "$f"; done \
-                        | sed -e "s,^$libname$shrext\\\\.,," \
-                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
-                        | sed 1q ) 2>/dev/null`
-                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
-                    found_dir="$dir"
-                    found_so="$dir/$libname$shrext.$ver"
-                  fi
-                else
-                  eval library_names=\"$acl_library_names_spec\"
-                  for f in $library_names; do
-                    if test -f "$dir/$f"; then
-                      found_dir="$dir"
-                      found_so="$dir/$f"
-                      break
-                    fi
-                  done
-                fi
-              fi
-            fi
-                        if test "X$found_dir" = "X"; then
-              if test -f "$dir/$libname.$acl_libext"; then
-                found_dir="$dir"
-                found_a="$dir/$libname.$acl_libext"
-              fi
-            fi
-            if test "X$found_dir" != "X"; then
-              if test -f "$dir/$libname.la"; then
-                found_la="$dir/$libname.la"
-              fi
-            fi
-          fi
-          if test "X$found_dir" = "X"; then
-            for x in $LDFLAGS $LTLIBICONV; do
+cat >>confdefs.h <<_ACEOF
+#define HAVE_WORKING_O_NOFOLLOW $ac_val
+_ACEOF
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-              case "$x" in
-                -L*)
-                  dir=`echo "X$x" | sed -e 's/^X-L//'`
-                                    if test -n "$acl_shlibext"; then
-                    if test -f "$dir/$libname$shrext"; then
-                      found_dir="$dir"
-                      found_so="$dir/$libname$shrext"
-                    else
-                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
-                        ver=`(cd "$dir" && \
-                              for f in "$libname$shrext".*; do echo "$f"; done \
-                              | sed -e "s,^$libname$shrext\\\\.,," \
-                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
-                              | sed 1q ) 2>/dev/null`
-                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
-                          found_dir="$dir"
-                          found_so="$dir/$libname$shrext.$ver"
-                        fi
-                      else
-                        eval library_names=\"$acl_library_names_spec\"
-                        for f in $library_names; do
-                          if test -f "$dir/$f"; then
-                            found_dir="$dir"
-                            found_so="$dir/$f"
-                            break
-                          fi
-                        done
-                      fi
-                    fi
-                  fi
-                                    if test "X$found_dir" = "X"; then
-                    if test -f "$dir/$libname.$acl_libext"; then
-                      found_dir="$dir"
-                      found_a="$dir/$libname.$acl_libext"
-                    fi
-                  fi
-                  if test "X$found_dir" != "X"; then
-                    if test -f "$dir/$libname.la"; then
-                      found_la="$dir/$libname.la"
-                    fi
-                  fi
-                  ;;
-              esac
-              if test "X$found_dir" != "X"; then
-                break
-              fi
-            done
-          fi
-          if test "X$found_dir" != "X"; then
-                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
-            if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no \
-                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
-                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
-                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-              else
-                                                                                haveit=
-                for x in $ltrpathdirs; do
-                  if test "X$x" = "X$found_dir"; then
-                    haveit=yes
-                    break
-                  fi
-                done
-                if test -z "$haveit"; then
-                  ltrpathdirs="$ltrpathdirs $found_dir"
-                fi
-                                if test "$acl_hardcode_direct" = yes; then
-                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-                else
-                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
-                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-                                                            haveit=
-                    for x in $rpathdirs; do
-                      if test "X$x" = "X$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      rpathdirs="$rpathdirs $found_dir"
-                    fi
-                  else
-                                                                                haveit=
-                    for x in $LDFLAGS $LIBICONV; do
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = xyes; then :
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
+else
 
-                      if test "X$x" = "X-L$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
-                    fi
-                    if test "$acl_hardcode_minus_L" != no; then
-                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
-                    else
-                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
-                    fi
-                  fi
-                fi
-              fi
-            else
-              if test "X$found_a" != "X"; then
-                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
-              else
-                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
-              fi
-            fi
-                        additional_includedir=
-            case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
-                if test "$name" = 'iconv'; then
-                  LIBICONV_PREFIX="$basedir"
-                fi
-                additional_includedir="$basedir/include"
-                ;;
-              */$acl_libdirstem2 | */$acl_libdirstem2/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
-                if test "$name" = 'iconv'; then
-                  LIBICONV_PREFIX="$basedir"
-                fi
-                additional_includedir="$basedir/include"
-                ;;
-            esac
-            if test "X$additional_includedir" != "X"; then
-                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
-                haveit=
-                if test "X$additional_includedir" = "X/usr/local/include"; then
-                  if test -n "$GCC"; then
-                    case $host_os in
-                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                    esac
-                  fi
-                fi
-                if test -z "$haveit"; then
-                  for x in $CPPFLAGS $INCICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-                    if test "X$x" = "X-I$additional_includedir"; then
-                      haveit=yes
-                      break
-                    fi
-                  done
-                  if test -z "$haveit"; then
-                    if test -d "$additional_includedir"; then
-                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
-                    fi
-                  fi
-                fi
-              fi
-            fi
-                        if test -n "$found_la"; then
-                                                        save_libdir="$libdir"
-              case "$found_la" in
-                */* | *\\*) . "$found_la" ;;
-                *) . "./$found_la" ;;
-              esac
-              libdir="$save_libdir"
-                            for dep in $dependency_libs; do
-                case "$dep" in
-                  -L*)
-                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
-                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
-                      haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
-                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
-                        if test -n "$GCC"; then
-                          case $host_os in
-                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                          esac
-                        fi
-                      fi
-                      if test -z "$haveit"; then
-                        haveit=
-                        for x in $LDFLAGS $LIBICONV; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
 
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
-                          fi
-                        fi
-                        haveit=
-                        for x in $LDFLAGS $LTLIBICONV; do
+fi
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
+ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
+if test "x$ac_cv_type_mode_t" = xyes; then :
 
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
-                          fi
-                        fi
-                      fi
-                    fi
-                    ;;
-                  -R*)
-                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
-                    if test "$enable_rpath" != no; then
-                                                                  haveit=
-                      for x in $rpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        rpathdirs="$rpathdirs $dir"
-                      fi
-                                                                  haveit=
-                      for x in $ltrpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        ltrpathdirs="$ltrpathdirs $dir"
-                      fi
-                    fi
-                    ;;
-                  -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
-                    ;;
-                  *.la)
-                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
-                    ;;
-                  *)
-                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
-                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
-                    ;;
-                esac
-              done
-            fi
-          else
-                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
-            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
-          fi
-        fi
-      fi
-    done
-  done
-  if test "X$rpathdirs" != "X"; then
-    if test -n "$acl_hardcode_libdir_separator"; then
-                        alldirs=
-      for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
-      done
-            acl_save_libdir="$libdir"
-      libdir="$alldirs"
-      eval flag=\"$acl_hardcode_libdir_flag_spec\"
-      libdir="$acl_save_libdir"
-      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
-    else
-            for found_dir in $rpathdirs; do
-        acl_save_libdir="$libdir"
-        libdir="$found_dir"
-        eval flag=\"$acl_hardcode_libdir_flag_spec\"
-        libdir="$acl_save_libdir"
-        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
-      done
-    fi
-  fi
-  if test "X$ltrpathdirs" != "X"; then
-            for found_dir in $ltrpathdirs; do
-      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
-    done
-  fi
+else
 
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
 
+fi
 
 
+  ac_fn_c_check_func "$LINENO" "eaccess" "ac_cv_func_eaccess"
+if test "x$ac_cv_func_eaccess" = xyes; then :
 
+else
 
+$as_echo "#define eaccess access" >>confdefs.h
 
+fi
 
 
 
 
+ac_fn_c_check_decl "$LINENO" "getdtablesize" "ac_cv_have_decl_getdtablesize" "$ac_includes_default"
+if test "x$ac_cv_have_decl_getdtablesize" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
 
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETDTABLESIZE $ac_have_decl
+_ACEOF
 
 
+  GNULIB__EXIT=0;
+  GNULIB_ATOLL=0;
+  GNULIB_CALLOC_POSIX=0;
+  GNULIB_CANONICALIZE_FILE_NAME=0;
+  GNULIB_GETLOADAVG=0;
+  GNULIB_GETSUBOPT=0;
+  GNULIB_GRANTPT=0;
+  GNULIB_MALLOC_POSIX=0;
+  GNULIB_MBTOWC=0;
+  GNULIB_MKDTEMP=0;
+  GNULIB_MKOSTEMP=0;
+  GNULIB_MKOSTEMPS=0;
+  GNULIB_MKSTEMP=0;
+  GNULIB_MKSTEMPS=0;
+  GNULIB_POSIX_OPENPT=0;
+  GNULIB_PTSNAME=0;
+  GNULIB_PTSNAME_R=0;
+  GNULIB_PUTENV=0;
+  GNULIB_QSORT_R=0;
+  GNULIB_RANDOM=0;
+  GNULIB_RANDOM_R=0;
+  GNULIB_REALLOCARRAY=0;
+  GNULIB_REALLOC_POSIX=0;
+  GNULIB_REALPATH=0;
+  GNULIB_RPMATCH=0;
+  GNULIB_SECURE_GETENV=0;
+  GNULIB_SETENV=0;
+  GNULIB_STRTOD=0;
+  GNULIB_STRTOLD=0;
+  GNULIB_STRTOLL=0;
+  GNULIB_STRTOULL=0;
+  GNULIB_SYSTEM_POSIX=0;
+  GNULIB_UNLOCKPT=0;
+  GNULIB_UNSETENV=0;
+  GNULIB_WCTOMB=0;
+    HAVE__EXIT=1;
+  HAVE_ATOLL=1;
+  HAVE_CANONICALIZE_FILE_NAME=1;
+  HAVE_DECL_GETLOADAVG=1;
+  HAVE_GETSUBOPT=1;
+  HAVE_GRANTPT=1;
+  HAVE_INITSTATE=1;
+  HAVE_DECL_INITSTATE=1;
+  HAVE_MBTOWC=1;
+  HAVE_MKDTEMP=1;
+  HAVE_MKOSTEMP=1;
+  HAVE_MKOSTEMPS=1;
+  HAVE_MKSTEMP=1;
+  HAVE_MKSTEMPS=1;
+  HAVE_POSIX_OPENPT=1;
+  HAVE_PTSNAME=1;
+  HAVE_PTSNAME_R=1;
+  HAVE_QSORT_R=1;
+  HAVE_RANDOM=1;
+  HAVE_RANDOM_H=1;
+  HAVE_RANDOM_R=1;
+  HAVE_REALLOCARRAY=1;
+  HAVE_REALPATH=1;
+  HAVE_RPMATCH=1;
+  HAVE_SECURE_GETENV=1;
+  HAVE_SETENV=1;
+  HAVE_DECL_SETENV=1;
+  HAVE_SETSTATE=1;
+  HAVE_DECL_SETSTATE=1;
+  HAVE_STRTOD=1;
+  HAVE_STRTOLD=1;
+  HAVE_STRTOLL=1;
+  HAVE_STRTOULL=1;
+  HAVE_STRUCT_RANDOM_DATA=1;
+  HAVE_SYS_LOADAVG_H=0;
+  HAVE_UNLOCKPT=1;
+  HAVE_DECL_UNSETENV=1;
+  REPLACE_CALLOC=0;
+  REPLACE_CANONICALIZE_FILE_NAME=0;
+  REPLACE_INITSTATE=0;
+  REPLACE_MALLOC=0;
+  REPLACE_MBTOWC=0;
+  REPLACE_MKSTEMP=0;
+  REPLACE_PTSNAME=0;
+  REPLACE_PTSNAME_R=0;
+  REPLACE_PUTENV=0;
+  REPLACE_QSORT_R=0;
+  REPLACE_RANDOM=0;
+  REPLACE_RANDOM_R=0;
+  REPLACE_REALLOC=0;
+  REPLACE_REALPATH=0;
+  REPLACE_SETENV=0;
+  REPLACE_SETSTATE=0;
+  REPLACE_STRTOD=0;
+  REPLACE_STRTOLD=0;
+  REPLACE_UNSETENV=0;
+  REPLACE_WCTOMB=0;
 
 
 
 
 
 
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#ifdef _MSC_VER
+MicrosoftCompiler
+#endif
 
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "MicrosoftCompiler" >/dev/null 2>&1; then :
+  gl_asmext='asm'
+     gl_c_asm_opt='-c -Fa'
 
+else
+  gl_asmext='s'
+     gl_c_asm_opt='-S'
 
+fi
+rm -f conftest*
 
 
 
 
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
-$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
-if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking host CPU and C ABI" >&5
+$as_echo_n "checking host CPU and C ABI... " >&6; }
+if ${gl_cv_host_cpu_c_abi+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  case "$host_cpu" in
+
+       i[34567]86 )
+         gl_cv_host_cpu_c_abi=i386
+         ;;
+
+       x86_64 )
+         # On x86_64 systems, the C compiler may be generating code in one of
+         # these ABIs:
+         # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+         # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+         #   with native Windows (mingw, MSVC).
+         # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+         # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <CoreFoundation/CFPreferences.h>
-int
-main ()
-{
-CFPreferencesCopyAppValue(NULL, NULL)
-  ;
-  return 0;
-}
+#if (defined __x86_64__ || defined __amd64__ \
+                     || defined _M_X64 || defined _M_AMD64)
+                 int ok;
+                #else
+                 error fail
+                #endif
+
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gt_cv_func_CFPreferencesCopyAppValue=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __ILP32__ || defined _ILP32
+                    int ok;
+                   #else
+                    error fail
+                   #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=x86_64-x32
 else
-  gt_cv_func_CFPreferencesCopyAppValue=no
+  gl_cv_host_cpu_c_abi=x86_64
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     LIBS="$gt_save_LIBS"
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  gl_cv_host_cpu_c_abi=i386
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
-$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+
+       alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] )
+         gl_cv_host_cpu_c_abi=alpha
+         ;;
+
+       arm* | aarch64 )
+         # Assume arm with EABI.
+         # On arm64 systems, the C compiler may be generating code in one of
+         # these ABIs:
+         # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+         # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+         # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __aarch64__
+                 int ok;
+                #else
+                 error fail
+                #endif
 
-$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __ILP32__ || defined _ILP32
+                   int ok;
+                  #else
+                   error fail
+                  #endif
 
-  fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
-$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
-if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
-  $as_echo_n "(cached) " >&6
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=arm64-ilp32
 else
-  gt_save_LIBS="$LIBS"
-     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  gl_cv_host_cpu_c_abi=arm64
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  # Don't distinguish little-endian and big-endian arm, since they
+            # don't require different machine code for simple operations and
+            # since the user can distinguish them through the preprocessor
+            # defines __ARMEL__ vs. __ARMEB__.
+            # But distinguish arm which passes floating-point arguments and
+            # return values in integer registers (r0, r1, ...) - this is
+            # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which
+            # passes them in float registers (s0, s1, ...) and double registers
+            # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer
+            # sets the preprocessor defines __ARM_PCS (for the first case) and
+            # __ARM_PCS_VFP (for the second case), but older GCC does not.
+            echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c
+            # Look for a reference to the register d0 in the .s file.
+            { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null 2>&1
+            if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then
+              gl_cv_host_cpu_c_abi=armhf
+            else
+              gl_cv_host_cpu_c_abi=arm
+            fi
+            rm -f conftest*
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+
+       hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+         # On hppa, the C compiler may be generating 32-bit code or 64-bit
+         # code. In the latter case, it defines _LP64 and __LP64__.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <CoreFoundation/CFLocale.h>
-int
-main ()
-{
-CFLocaleCopyCurrent();
-  ;
-  return 0;
-}
+#ifdef __LP64__
+                 int ok;
+                #else
+                 error fail
+                #endif
+
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  gt_cv_func_CFLocaleCopyCurrent=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=hppa64
 else
-  gt_cv_func_CFLocaleCopyCurrent=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     LIBS="$gt_save_LIBS"
+  gl_cv_host_cpu_c_abi=hppa
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
-$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
-  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
 
-$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+       ia64* )
+         # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+         # 32-bit code. In the latter case, it defines _ILP32.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef _ILP32
+                 int ok;
+                #else
+                 error fail
+                #endif
 
-  fi
-  INTL_MACOSX_LIBS=
-  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
-    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
-  fi
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=ia64-ilp32
+else
+  gl_cv_host_cpu_c_abi=ia64
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
 
+       mips* )
+         # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+         # at 32.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+                 int ok;
+                #else
+                 error fail
+                #endif
 
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=mips64
+else
+  # In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but
+            # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32.
+            # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but
+            # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32.
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if (_MIPS_SIM == _ABIN32)
+                    int ok;
+                   #else
+                    error fail
+                   #endif
 
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=mipsn32
+else
+  gl_cv_host_cpu_c_abi=mips
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+
+       powerpc* )
+         # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+         # No need to distinguish them here; the caller may distinguish
+         # them based on the OS.
+         # On powerpc64 systems, the C compiler may still be generating
+         # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+         # be generating 64-bit code.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __powerpc64__ || defined _ARCH_PPC64
+                 int ok;
+                #else
+                 error fail
+                #endif
 
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # On powerpc64, there are two ABIs on Linux: The AIX compatible
+            # one and the ELFv2 one. The latter defines _CALL_ELF=2.
+            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined _CALL_ELF && _CALL_ELF == 2
+                    int ok;
+                   #else
+                    error fail
+                   #endif
 
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=powerpc64-elfv2
+else
+  gl_cv_host_cpu_c_abi=powerpc64
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-  LIBINTL=
-  LTLIBINTL=
-  POSUB=
+else
+  gl_cv_host_cpu_c_abi=powerpc
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
 
-    case " $gt_needs " in
-    *" need-formatstring-macros "*) gt_api_version=3 ;;
-    *" need-ngettext "*) gt_api_version=2 ;;
-    *) gt_api_version=1 ;;
-  esac
-  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
-  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+       rs6000 )
+         gl_cv_host_cpu_c_abi=powerpc
+         ;;
 
-    if test "$USE_NLS" = "yes"; then
-    gt_use_preinstalled_gnugettext=no
+       riscv32 | riscv64 )
+         # There are 2 architectures (with variants): rv32* and rv64*.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if __riscv_xlen == 64
+                  int ok;
+                #else
+                  error fail
+                #endif
 
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cpu=riscv64
+else
+  cpu=riscv32
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+         # Size of 'long' and 'void *':
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __LP64__
+                  int ok;
+                #else
+                  error fail
+                #endif
 
-        if test $gt_api_version -ge 3; then
-          gt_revision_test_code='
-#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
-#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
-#endif
-typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
-'
-        else
-          gt_revision_test_code=
-        fi
-        if test $gt_api_version -ge 2; then
-          gt_expression_test_code=' + * ngettext ("", "", 0)'
-        else
-          gt_expression_test_code=
-        fi
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  main_abi=lp64
+else
+  main_abi=ilp32
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         # Float ABIs:
+         # __riscv_float_abi_double:
+         #   'float' and 'double' are passed in floating-point registers.
+         # __riscv_float_abi_single:
+         #   'float' are passed in floating-point registers.
+         # __riscv_float_abi_soft:
+         #   No values are passed in floating-point registers.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __riscv_float_abi_double
+                  int ok;
+                #else
+                  error fail
+                #endif
 
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
-$as_echo_n "checking for GNU gettext in libc... " >&6; }
-if eval \${$gt_func_gnugettext_libc+:} false; then :
-  $as_echo_n "(cached) " >&6
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  float_abi=d
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#if defined __riscv_float_abi_single
+                     int ok;
+                   #else
+                     error fail
+                   #endif
 
-#include <libintl.h>
-$gt_revision_test_code
-extern int _nl_msg_cat_cntr;
-extern int *_nl_domain_bindings;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  float_abi=f
+else
+  float_abi=''
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-int
-main ()
-{
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}"
+         ;;
 
-bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+       s390* )
+         # On s390x, the C compiler may be generating 64-bit (= s390x) code
+         # or 31-bit (= s390) code.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __LP64__ || defined __s390x__
+                  int ok;
+                #else
+                  error fail
+                #endif
 
-  ;
-  return 0;
-}
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$gt_func_gnugettext_libc=yes"
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=s390x
 else
-  eval "$gt_func_gnugettext_libc=no"
+  gl_cv_host_cpu_c_abi=s390
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
+
+       sparc | sparc64 )
+         # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+         # C compiler still generates 32-bit code.
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if defined __sparcv9 || defined __arch64__
+                 int ok;
+                #else
+                 error fail
+                #endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_host_cpu_c_abi=sparc64
+else
+  gl_cv_host_cpu_c_abi=sparc
 fi
-eval ac_res=\$$gt_func_gnugettext_libc
-              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         ;;
 
-        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+       *)
+         gl_cv_host_cpu_c_abi="$host_cpu"
+         ;;
+     esac
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi" >&5
+$as_echo "$gl_cv_host_cpu_c_abi" >&6; }
 
+    HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'`
+  HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi"
 
 
 
-          am_save_CPPFLAGS="$CPPFLAGS"
+  # This was
+  #   AC_DEFINE_UNQUOTED([__${HOST_CPU}__])
+  #   AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__])
+  # earlier, but KAI C++ 3.2d doesn't like this.
+  sed -e 's/-/_/g' >> confdefs.h <<EOF
+#ifndef __${HOST_CPU}__
+#define __${HOST_CPU}__ 1
+#endif
+#ifndef __${HOST_CPU_C_ABI}__
+#define __${HOST_CPU_C_ABI}__ 1
+#endif
+EOF
 
-  for element in $INCICONV; do
-    haveit=
-    for x in $CPPFLAGS; do
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-      if test "X$x" = "X$element"; then
-        haveit=yes
-        break
-      fi
-    done
-    if test -z "$haveit"; then
-      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
-    fi
-  done
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
-$as_echo_n "checking for iconv... " >&6; }
-if ${am_cv_func_iconv+:} false; then :
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_limits_h='<'limits.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <limits.h>" >&5
+$as_echo_n "checking absolute name of <limits.h>... " >&6; }
+if ${gl_cv_next_limits_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-    am_cv_func_iconv="no, consider installing GNU libiconv"
-    am_cv_lib_iconv=no
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+             if test $ac_cv_header_limits_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#include <limits.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'limits.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_limits_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_limits_h
+           gl_cv_next_limits_h='"'$gl_header'"'
+          else
+               gl_cv_next_limits_h='<'limits.h'>'
+             fi
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_limits_h" >&5
+$as_echo "$gl_cv_next_limits_h" >&6; }
+     fi
+     NEXT_LIMITS_H=$gl_cv_next_limits_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'limits.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_limits_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_LIMITS_H=$gl_next_as_first_directive
+
+
 
-#include <stdlib.h>
-#include <iconv.h>
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc." >&5
+$as_echo_n "checking whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.... " >&6; }
+if ${gl_cv_header_limits_width+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+            #endif
+            #include <limits.h>
+            long long llm = LLONG_MAX;
+            int wb = WORD_BIT;
+            int ullw = ULLONG_WIDTH;
 
 int
 main ()
 {
-iconv_t cd = iconv_open("","");
-           iconv(cd,NULL,NULL,NULL,NULL);
-           iconv_close(cd);
+
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  am_cv_func_iconv=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_header_limits_width=yes
+else
+  gl_cv_header_limits_width=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    if test "$am_cv_func_iconv" != yes; then
-      am_save_LIBS="$LIBS"
-      LIBS="$LIBS $LIBICONV"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_limits_width" >&5
+$as_echo "$gl_cv_header_limits_width" >&6; }
+  if test "$gl_cv_header_limits_width" = yes; then
+    LIMITS_H=
+  else
+    LIMITS_H=limits.h
+  fi
 
-#include <stdlib.h>
-#include <iconv.h>
+   if test -n "$LIMITS_H"; then
+  GL_GENERATE_LIMITS_H_TRUE=
+  GL_GENERATE_LIMITS_H_FALSE='#'
+else
+  GL_GENERATE_LIMITS_H_TRUE='#'
+  GL_GENERATE_LIMITS_H_FALSE=
+fi
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether malloc, realloc, calloc are POSIX compliant" >&5
+$as_echo_n "checking whether malloc, realloc, calloc are POSIX compliant... " >&6; }
+if ${gl_cv_func_malloc_posix+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
 int
 main ()
 {
-iconv_t cd = iconv_open("","");
-             iconv(cd,NULL,NULL,NULL,NULL);
-             iconv_close(cd);
+#if defined _WIN32 && ! defined __CYGWIN__
+             choke me
+             #endif
+
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  am_cv_lib_iconv=yes
-        am_cv_func_iconv=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_func_malloc_posix=yes
+else
+  gl_cv_func_malloc_posix=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-      LIBS="$am_save_LIBS"
-    fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
-$as_echo "$am_cv_func_iconv" >&6; }
-  if test "$am_cv_func_iconv" = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
-$as_echo_n "checking for working iconv... " >&6; }
-if ${am_cv_func_iconv_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_malloc_posix" >&5
+$as_echo "$gl_cv_func_malloc_posix" >&6; }
 
-                  am_save_LIBS="$LIBS"
-      if test $am_cv_lib_iconv = yes; then
-        LIBS="$LIBS $LIBICONV"
-      fi
-      am_cv_func_iconv_works=no
-      for ac_iconv_const in '' 'const'; do
-        if test "$cross_compiling" = yes; then :
-  case "$host_os" in
-             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
-             *)            am_cv_func_iconv_works="guessing yes" ;;
-           esac
-else
+
+
+
+
+    gl_cv_c_multiarch=no
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+#ifndef __APPLE_CC__
+         not a universal capable compiler
+        #endif
+        typedef int dummy;
 
-#include <iconv.h>
-#include <string.h>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
 
-#ifndef ICONV_CONST
-# define ICONV_CONST $ac_iconv_const
-#endif
+               arch=
+     prev=
+     for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+       if test -n "$prev"; then
+         case $word in
+           i?86 | x86_64 | ppc | ppc64)
+             if test -z "$arch" || test "$arch" = "$word"; then
+               arch="$word"
+             else
+               gl_cv_c_multiarch=yes
+             fi
+             ;;
+         esac
+         prev=
+       else
+         if test "x$word" = "x-arch"; then
+           prev=arch
+         fi
+       fi
+     done
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test $gl_cv_c_multiarch = yes; then
+    APPLE_UNIVERSAL_BUILD=1
+  else
+    APPLE_UNIVERSAL_BUILD=0
+  fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
+$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
+if ${ac_cv_header_stdbool_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <stdbool.h>
+
+             #ifdef __cplusplus
+              typedef bool Bool;
+             #else
+              typedef _Bool Bool;
+              #ifndef bool
+               "error: bool is not defined"
+              #endif
+              #ifndef false
+               "error: false is not defined"
+              #endif
+              #if false
+               "error: false is not 0"
+              #endif
+              #ifndef true
+               "error: true is not defined"
+              #endif
+              #if true != 1
+               "error: true is not 1"
+              #endif
+             #endif
+
+             #ifndef __bool_true_false_are_defined
+              "error: __bool_true_false_are_defined is not defined"
+             #endif
+
+             struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;
+
+             char a[true == 1 ? 1 : -1];
+             char b[false == 0 ? 1 : -1];
+             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+             char d[(bool) 0.5 == true ? 1 : -1];
+             /* See body of main program for 'e'.  */
+             char f[(Bool) 0.0 == false ? 1 : -1];
+             char g[true];
+             char h[sizeof (Bool)];
+             char i[sizeof s.t];
+             enum { j = false, k = true, l = false * true, m = true * 256 };
+             /* The following fails for
+                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+             Bool n[m];
+             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+             char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+             /* Catch a bug in an HP-UX C compiler.  See
+                https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+                https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+              */
+             Bool q = true;
+             Bool *pq = &q;
+             bool *qq = &q;
 
 int
 main ()
 {
-int result = 0;
-  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
-     returns.  */
-  {
-    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
-    if (cd_utf8_to_88591 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
-        char buf[10];
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = strlen (input);
-        char *outptr = buf;
-        size_t outbytesleft = sizeof (buf);
-        size_t res = iconv (cd_utf8_to_88591,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if (res == 0)
-          result |= 1;
-        iconv_close (cd_utf8_to_88591);
-      }
-  }
-  /* Test against Solaris 10 bug: Failures are not distinguishable from
-     successful returns.  */
-  {
-    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
-    if (cd_ascii_to_88591 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\263";
-        char buf[10];
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = strlen (input);
-        char *outptr = buf;
-        size_t outbytesleft = sizeof (buf);
-        size_t res = iconv (cd_ascii_to_88591,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if (res == 0)
-          result |= 2;
-        iconv_close (cd_ascii_to_88591);
-      }
-  }
-  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
-  {
-    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
-    if (cd_88591_to_utf8 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\304";
-        static char buf[2] = { (char)0xDE, (char)0xAD };
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = 1;
-        char *outptr = buf;
-        size_t outbytesleft = 1;
-        size_t res = iconv (cd_88591_to_utf8,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
-          result |= 4;
-        iconv_close (cd_88591_to_utf8);
-      }
-  }
-#if 0 /* This bug could be worked around by the caller.  */
-  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
-  {
-    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
-    if (cd_88591_to_utf8 != (iconv_t)(-1))
-      {
-        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
-        char buf[50];
-        ICONV_CONST char *inptr = input;
-        size_t inbytesleft = strlen (input);
-        char *outptr = buf;
-        size_t outbytesleft = sizeof (buf);
-        size_t res = iconv (cd_88591_to_utf8,
-                            &inptr, &inbytesleft,
-                            &outptr, &outbytesleft);
-        if ((int)res > 0)
-          result |= 8;
-        iconv_close (cd_88591_to_utf8);
-      }
-  }
-#endif
-  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
-     provided.  */
-  if (/* Try standardized names.  */
-      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
-      /* Try IRIX, OSF/1 names.  */
-      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
-      /* Try AIX names.  */
-      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
-      /* Try HP-UX names.  */
-      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
-    result |= 16;
-  return result;
+
+             bool e = &s;
+             *pq |= q; *pq |= ! q;
+             *qq |= q; *qq |= ! q;
+             /* Refer to every declared value, to avoid compiler optimizations.  */
+             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+                     + !m + !n + !o + !p + !q + !pq + !qq);
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  am_cv_func_iconv_works=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdbool_h=yes
+else
+  ac_cv_header_stdbool_h=no
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+$as_echo "$ac_cv_header_stdbool_h" >&6; }
+   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
 
-        test "$am_cv_func_iconv_works" = no || break
-      done
-      LIBS="$am_save_LIBS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
-$as_echo "$am_cv_func_iconv_works" >&6; }
-    case "$am_cv_func_iconv_works" in
-      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
-      *)   am_func_iconv=yes ;;
-    esac
-  else
-    am_func_iconv=no am_cv_lib_iconv=no
-  fi
-  if test "$am_func_iconv" = yes; then
 
-$as_echo "#define HAVE_ICONV 1" >>confdefs.h
 
-  fi
-  if test "$am_cv_lib_iconv" = yes; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
-$as_echo_n "checking how to link with libiconv... " >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
-$as_echo "$LIBICONV" >&6; }
-  else
-            CPPFLAGS="$am_save_CPPFLAGS"
-    LIBICONV=
-    LTLIBICONV=
-  fi
 
+    REPLACE_NULL=0;
+  HAVE_MAX_ALIGN_T=1;
+  HAVE_WCHAR_T=1;
 
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t" >&5
+$as_echo_n "checking for wchar_t... " >&6; }
+if ${gt_cv_c_wchar_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+            wchar_t foo = (wchar_t)'\0';
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gt_cv_c_wchar_t=yes
+else
+  gt_cv_c_wchar_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wchar_t" >&5
+$as_echo "$gt_cv_c_wchar_t" >&6; }
+  if test $gt_cv_c_wchar_t = yes; then
 
+$as_echo "#define HAVE_WCHAR_T 1" >>confdefs.h
 
+  fi
 
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5
+$as_echo_n "checking for wint_t... " >&6; }
+if ${gt_cv_c_wint_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+   before <wchar.h>.  */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+            wint_t foo = (wchar_t)'\0';
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gt_cv_c_wint_t=yes
+else
+  gt_cv_c_wint_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_c_wint_t" >&5
+$as_echo "$gt_cv_c_wint_t" >&6; }
+  if test $gt_cv_c_wint_t = yes; then
 
-    use_additional=yes
+$as_echo "#define HAVE_WINT_T 1" >>confdefs.h
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
 
-    eval additional_includedir=\"$includedir\"
-    eval additional_libdir=\"$libdir\"
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wint_t is too small" >&5
+$as_echo_n "checking whether wint_t is too small... " >&6; }
+if ${gl_cv_type_wint_t_too_small+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+   included before <wchar.h>.  */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+#endif
+#include <wchar.h>
+              int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
 
+int
+main ()
+{
 
-# Check whether --with-libintl-prefix was given.
-if test "${with_libintl_prefix+set}" = set; then :
-  withval=$with_libintl_prefix;
-    if test "X$withval" = "Xno"; then
-      use_additional=no
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_type_wint_t_too_small=no
+else
+  gl_cv_type_wint_t_too_small=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_wint_t_too_small" >&5
+$as_echo "$gl_cv_type_wint_t_too_small" >&6; }
+    if test $gl_cv_type_wint_t_too_small = yes; then
+      GNULIB_OVERRIDES_WINT_T=1
     else
-      if test "X$withval" = "X"; then
+      GNULIB_OVERRIDES_WINT_T=0
+    fi
+  else
+    GNULIB_OVERRIDES_WINT_T=0
+  fi
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
 
-          eval additional_includedir=\"$includedir\"
-          eval additional_libdir=\"$libdir\"
 
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-      else
-        additional_includedir="$withval/include"
-        additional_libdir="$withval/$acl_libdirstem"
-        if test "$acl_libdirstem2" != "$acl_libdirstem" \
-           && ! test -d "$withval/$acl_libdirstem"; then
-          additional_libdir="$withval/$acl_libdirstem2"
-        fi
-      fi
-    fi
 
-fi
 
-      LIBINTL=
-  LTLIBINTL=
-  INCINTL=
-  LIBINTL_PREFIX=
-      HAVE_LIBINTL=
-  rpathdirs=
-  ltrpathdirs=
-  names_already_handled=
-  names_next_round='intl '
-  while test -n "$names_next_round"; do
-    names_this_round="$names_next_round"
-    names_next_round=
-    for name in $names_this_round; do
-      already_handled=
-      for n in $names_already_handled; do
-        if test "$n" = "$name"; then
-          already_handled=yes
-          break
-        fi
-      done
-      if test -z "$already_handled"; then
-        names_already_handled="$names_already_handled $name"
-                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
-        eval value=\"\$HAVE_LIB$uppername\"
-        if test -n "$value"; then
-          if test "$value" = yes; then
-            eval value=\"\$LIB$uppername\"
-            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
-            eval value=\"\$LTLIB$uppername\"
-            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
-          else
-                                    :
-          fi
-        else
-                              found_dir=
-          found_la=
-          found_so=
-          found_a=
-          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
-          if test -n "$acl_shlibext"; then
-            shrext=".$acl_shlibext"             # typically: shrext=.so
-          else
-            shrext=
-          fi
-          if test $use_additional = yes; then
-            dir="$additional_libdir"
-                                    if test -n "$acl_shlibext"; then
-              if test -f "$dir/$libname$shrext"; then
-                found_dir="$dir"
-                found_so="$dir/$libname$shrext"
-              else
-                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
-                  ver=`(cd "$dir" && \
-                        for f in "$libname$shrext".*; do echo "$f"; done \
-                        | sed -e "s,^$libname$shrext\\\\.,," \
-                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
-                        | sed 1q ) 2>/dev/null`
-                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
-                    found_dir="$dir"
-                    found_so="$dir/$libname$shrext.$ver"
-                  fi
-                else
-                  eval library_names=\"$acl_library_names_spec\"
-                  for f in $library_names; do
-                    if test -f "$dir/$f"; then
-                      found_dir="$dir"
-                      found_so="$dir/$f"
-                      break
-                    fi
-                  done
-                fi
-              fi
-            fi
-                        if test "X$found_dir" = "X"; then
-              if test -f "$dir/$libname.$acl_libext"; then
-                found_dir="$dir"
-                found_a="$dir/$libname.$acl_libext"
-              fi
-            fi
-            if test "X$found_dir" != "X"; then
-              if test -f "$dir/$libname.la"; then
-                found_la="$dir/$libname.la"
-              fi
-            fi
-          fi
-          if test "X$found_dir" = "X"; then
-            for x in $LDFLAGS $LTLIBINTL; do
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-              case "$x" in
-                -L*)
-                  dir=`echo "X$x" | sed -e 's/^X-L//'`
-                                    if test -n "$acl_shlibext"; then
-                    if test -f "$dir/$libname$shrext"; then
-                      found_dir="$dir"
-                      found_so="$dir/$libname$shrext"
-                    else
-                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
-                        ver=`(cd "$dir" && \
-                              for f in "$libname$shrext".*; do echo "$f"; done \
-                              | sed -e "s,^$libname$shrext\\\\.,," \
-                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
-                              | sed 1q ) 2>/dev/null`
-                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
-                          found_dir="$dir"
-                          found_so="$dir/$libname$shrext.$ver"
-                        fi
-                      else
-                        eval library_names=\"$acl_library_names_spec\"
-                        for f in $library_names; do
-                          if test -f "$dir/$f"; then
-                            found_dir="$dir"
-                            found_so="$dir/$f"
-                            break
-                          fi
-                        done
-                      fi
-                    fi
-                  fi
-                                    if test "X$found_dir" = "X"; then
-                    if test -f "$dir/$libname.$acl_libext"; then
-                      found_dir="$dir"
-                      found_a="$dir/$libname.$acl_libext"
-                    fi
-                  fi
-                  if test "X$found_dir" != "X"; then
-                    if test -f "$dir/$libname.la"; then
-                      found_la="$dir/$libname.la"
-                    fi
-                  fi
-                  ;;
-              esac
-              if test "X$found_dir" != "X"; then
-                break
-              fi
-            done
-          fi
-          if test "X$found_dir" != "X"; then
-                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
-            if test "X$found_so" != "X"; then
-                                                        if test "$enable_rpath" = no \
-                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
-                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
-                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-              else
-                                                                                haveit=
-                for x in $ltrpathdirs; do
-                  if test "X$x" = "X$found_dir"; then
-                    haveit=yes
-                    break
-                  fi
-                done
-                if test -z "$haveit"; then
-                  ltrpathdirs="$ltrpathdirs $found_dir"
-                fi
-                                if test "$acl_hardcode_direct" = yes; then
-                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-                else
-                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
-                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-                                                            haveit=
-                    for x in $rpathdirs; do
-                      if test "X$x" = "X$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      rpathdirs="$rpathdirs $found_dir"
-                    fi
-                  else
-                                                                                haveit=
-                    for x in $LDFLAGS $LIBINTL; do
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-                      if test "X$x" = "X-L$found_dir"; then
-                        haveit=yes
-                        break
-                      fi
-                    done
-                    if test -z "$haveit"; then
-                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
-                    fi
-                    if test "$acl_hardcode_minus_L" != no; then
-                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
-                    else
-                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
-                    fi
-                  fi
-                fi
-              fi
-            else
-              if test "X$found_a" != "X"; then
-                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
-              else
-                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
-              fi
-            fi
-                        additional_includedir=
-            case "$found_dir" in
-              */$acl_libdirstem | */$acl_libdirstem/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
-                if test "$name" = 'intl'; then
-                  LIBINTL_PREFIX="$basedir"
-                fi
-                additional_includedir="$basedir/include"
-                ;;
-              */$acl_libdirstem2 | */$acl_libdirstem2/)
-                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
-                if test "$name" = 'intl'; then
-                  LIBINTL_PREFIX="$basedir"
-                fi
-                additional_includedir="$basedir/include"
-                ;;
-            esac
-            if test "X$additional_includedir" != "X"; then
-                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
-                haveit=
-                if test "X$additional_includedir" = "X/usr/local/include"; then
-                  if test -n "$GCC"; then
-                    case $host_os in
-                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                    esac
-                  fi
-                fi
-                if test -z "$haveit"; then
-                  for x in $CPPFLAGS $INCINTL; do
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-                    if test "X$x" = "X-I$additional_includedir"; then
-                      haveit=yes
-                      break
-                    fi
-                  done
-                  if test -z "$haveit"; then
-                    if test -d "$additional_includedir"; then
-                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
-                    fi
-                  fi
-                fi
-              fi
-            fi
-                        if test -n "$found_la"; then
-                                                        save_libdir="$libdir"
-              case "$found_la" in
-                */* | *\\*) . "$found_la" ;;
-                *) . "./$found_la" ;;
-              esac
-              libdir="$save_libdir"
-                            for dep in $dependency_libs; do
-                case "$dep" in
-                  -L*)
-                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
-                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
-                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
-                      haveit=
-                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
-                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
-                        if test -n "$GCC"; then
-                          case $host_os in
-                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
-                          esac
-                        fi
-                      fi
-                      if test -z "$haveit"; then
-                        haveit=
-                        for x in $LDFLAGS $LIBINTL; do
+$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
-                          fi
-                        fi
-                        haveit=
-                        for x in $LDFLAGS $LTLIBINTL; do
+$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
 
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
 
-                          if test "X$x" = "X-L$additional_libdir"; then
-                            haveit=yes
-                            break
-                          fi
-                        done
-                        if test -z "$haveit"; then
-                          if test -d "$additional_libdir"; then
-                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
-                          fi
-                        fi
-                      fi
-                    fi
-                    ;;
-                  -R*)
-                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
-                    if test "$enable_rpath" != no; then
-                                                                  haveit=
-                      for x in $rpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        rpathdirs="$rpathdirs $dir"
-                      fi
-                                                                  haveit=
-                      for x in $ltrpathdirs; do
-                        if test "X$x" = "X$dir"; then
-                          haveit=yes
-                          break
-                        fi
-                      done
-                      if test -z "$haveit"; then
-                        ltrpathdirs="$ltrpathdirs $dir"
-                      fi
-                    fi
-                    ;;
-                  -l*)
-                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
-                    ;;
-                  *.la)
-                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
-                    ;;
-                  *)
-                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
-                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
-                    ;;
-                esac
-              done
-            fi
-          else
-                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
-            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
-          fi
-        fi
-      fi
-    done
-  done
-  if test "X$rpathdirs" != "X"; then
-    if test -n "$acl_hardcode_libdir_separator"; then
-                        alldirs=
-      for found_dir in $rpathdirs; do
-        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
-      done
-            acl_save_libdir="$libdir"
-      libdir="$alldirs"
-      eval flag=\"$acl_hardcode_libdir_flag_spec\"
-      libdir="$acl_save_libdir"
-      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
-    else
-            for found_dir in $rpathdirs; do
-        acl_save_libdir="$libdir"
-        libdir="$found_dir"
-        eval flag=\"$acl_hardcode_libdir_flag_spec\"
-        libdir="$acl_save_libdir"
-        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
-      done
-    fi
+
+  if test $ac_cv_header_wchar_h = yes; then
+    HAVE_WCHAR_H=1
+  else
+    HAVE_WCHAR_H=0
   fi
-  if test "X$ltrpathdirs" != "X"; then
-            for found_dir in $ltrpathdirs; do
-      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
-    done
+
+
+      if test $ac_cv_header_inttypes_h = yes; then
+    HAVE_INTTYPES_H=1
+  else
+    HAVE_INTTYPES_H=0
+  fi
+
+
+      if test $ac_cv_header_sys_types_h = yes; then
+    HAVE_SYS_TYPES_H=1
+  else
+    HAVE_SYS_TYPES_H=0
   fi
 
 
 
 
 
-          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
-$as_echo_n "checking for GNU gettext in libintl... " >&6; }
-if eval \${$gt_func_gnugettext_libintl+:} false; then :
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stdint_h='<'stdint.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdint.h>" >&5
+$as_echo_n "checking absolute name of <stdint.h>... " >&6; }
+if ${gl_cv_next_stdint_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  gt_save_CPPFLAGS="$CPPFLAGS"
-            CPPFLAGS="$CPPFLAGS $INCINTL"
-            gt_save_LIBS="$LIBS"
-            LIBS="$LIBS $LIBINTL"
-                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-#include <libintl.h>
-$gt_revision_test_code
-extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);
+             if test $ac_cv_header_stdint_h = yes; then
 
-int
-main ()
-{
 
-bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
 
-  ;
-  return 0;
-}
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdint.h>
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$gt_func_gnugettext_libintl=yes"
-else
-  eval "$gt_func_gnugettext_libintl=no"
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stdint.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stdint_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stdint_h
+           gl_cv_next_stdint_h='"'$gl_header'"'
+          else
+               gl_cv_next_stdint_h='<'stdint.h'>'
+             fi
+
+
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-                        if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
-              LIBS="$LIBS $LIBICONV"
-              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdint_h" >&5
+$as_echo "$gl_cv_next_stdint_h" >&6; }
+     fi
+     NEXT_STDINT_H=$gl_cv_next_stdint_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stdint.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stdint_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDINT_H=$gl_next_as_first_directive
 
-#include <libintl.h>
-$gt_revision_test_code
-extern int _nl_msg_cat_cntr;
-extern
-#ifdef __cplusplus
-"C"
-#endif
-const char *_nl_expand_alias (const char *);
 
-int
-main ()
-{
 
-bindtextdomain ("", "");
-return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  LIBINTL="$LIBINTL $LIBICONV"
-                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
-                 eval "$gt_func_gnugettext_libintl=yes"
-
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-            fi
-            CPPFLAGS="$gt_save_CPPFLAGS"
-            LIBS="$gt_save_LIBS"
-fi
-eval ac_res=\$$gt_func_gnugettext_libintl
-              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-        fi
-
-                                        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
-           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
-                && test "$PACKAGE" != gettext-runtime \
-                && test "$PACKAGE" != gettext-tools; }; then
-          gt_use_preinstalled_gnugettext=yes
-        else
-                    LIBINTL=
-          LTLIBINTL=
-          INCINTL=
-        fi
-
-
-
-    if test -n "$INTL_MACOSX_LIBS"; then
-      if test "$gt_use_preinstalled_gnugettext" = "yes" \
-         || test "$nls_cv_use_gnu_gettext" = "yes"; then
-                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
-        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
-      fi
-    fi
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes" \
-       || test "$nls_cv_use_gnu_gettext" = "yes"; then
-
-$as_echo "#define ENABLE_NLS 1" >>confdefs.h
-
-    else
-      USE_NLS=no
-    fi
-  fi
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
-$as_echo_n "checking whether to use NLS... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
-$as_echo "$USE_NLS" >&6; }
-  if test "$USE_NLS" = "yes"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
-$as_echo_n "checking where the gettext function comes from... " >&6; }
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
-        gt_source="external libintl"
-      else
-        gt_source="libc"
-      fi
-    else
-      gt_source="included intl directory"
-    fi
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
-$as_echo "$gt_source" >&6; }
+  if test $ac_cv_header_stdint_h = yes; then
+    HAVE_STDINT_H=1
+  else
+    HAVE_STDINT_H=0
   fi
 
-  if test "$USE_NLS" = "yes"; then
-
-    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
-      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
-$as_echo_n "checking how to link with libintl... " >&6; }
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
-$as_echo "$LIBINTL" >&6; }
-
-  for element in $INCINTL; do
-    haveit=
-    for x in $CPPFLAGS; do
-
-  acl_save_prefix="$prefix"
-  prefix="$acl_final_prefix"
-  acl_save_exec_prefix="$exec_prefix"
-  exec_prefix="$acl_final_exec_prefix"
-  eval x=\"$x\"
-  exec_prefix="$acl_save_exec_prefix"
-  prefix="$acl_save_prefix"
-
-      if test "X$x" = "X$element"; then
-        haveit=yes
-        break
-      fi
-    done
-    if test -z "$haveit"; then
-      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
-    fi
-  done
-
-      fi
 
+    if test $ac_cv_header_stdint_h = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h conforms to C99" >&5
+$as_echo_n "checking whether stdint.h conforms to C99... " >&6; }
+if ${gl_cv_header_working_stdint_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gl_cv_header_working_stdint_h=no
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
 
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
 
-$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
 
-    fi
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
 
-        POSUB=po
-  fi
 
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible.  */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
+       || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
 
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+  ((t) ((t) 0 < (t) -1 \
+        ? (t) -1 \
+        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+  int check_PTRDIFF:
+      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+      ? 1 : -1;
+  /* Detect bug in FreeBSD 6.0 / ia64.  */
+  int check_SIG_ATOMIC:
+      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+      ? 1 : -1;
+  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+  int check_WCHAR:
+      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+      ? 1 : -1;
+  /* Detect bug in mingw.  */
+  int check_WINT:
+      WINT_MIN == TYPE_MINIMUM (wint_t)
+      && WINT_MAX == TYPE_MAXIMUM (wint_t)
+      ? 1 : -1;
+
+  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
+  int check_UINT8_C:
+        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+  int check_UINT16_C:
+        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
+#ifdef UINT8_MAX
+  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
 
-    INTLLIBS="$LIBINTL"
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+                                                    if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                         # Guess yes on native Windows.
+                 mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+                         # In general, assume it works.
+                 *)      gl_cv_header_working_stdint_h="guessing yes" ;;
+               esac
 
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
 
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
 
 
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
 
-# This test must come as early as possible after the compiler configuration
-# tests, because the choice of the file model can (in principle) affect
-# whether functions and headers are available, whether they work, etc.
-# Check whether --enable-largefile was given.
-if test "${enable_largefile+set}" = set; then :
-  enableval=$enable_largefile;
-fi
 
-if test "$enable_largefile" != no; then
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+  {
+#ifdef INT8_MAX
+    MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+    MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+    MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+    MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+    MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+    MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+    MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+    MVAL (UINT64_MAX),
+#endif
+    NULL
+  };
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
-$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
-if ${ac_cv_sys_largefile_CC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_sys_largefile_CC=no
-     if test "$GCC" != yes; then
-       ac_save_CC=$CC
-       while :; do
-        # IRIX 6.2 and later do not support large files by default,
-        # so use the C compiler's -n32 option if that helps.
-        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
 int
 main ()
 {
 
+  const char **mv;
+  for (mv = macro_values; *mv != NULL; mv++)
+    {
+      const char *value = *mv;
+      /* Test whether it looks like a cast expression.  */
+      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+          || strncmp (value, "((int)"/*)*/, 6) == 0
+          || strncmp (value, "((signed short)"/*)*/, 15) == 0
+          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+        return mv - macro_values + 1;
+    }
+  return 0;
+
   ;
   return 0;
 }
 _ACEOF
-        if ac_fn_c_try_compile "$LINENO"; then :
-  break
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_header_working_stdint_h=yes
 fi
-rm -f core conftest.err conftest.$ac_objext
-        CC="$CC -n32"
-        if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_largefile_CC=' -n32'; break
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext
-        break
-       done
-       CC=$ac_save_CC
-       rm -f conftest.$ac_ext
-    fi
+
+
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
-$as_echo "$ac_cv_sys_largefile_CC" >&6; }
-  if test "$ac_cv_sys_largefile_CC" != no; then
-    CC=$CC$ac_cv_sys_largefile_CC
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_working_stdint_h" >&5
+$as_echo "$gl_cv_header_working_stdint_h" >&6; }
   fi
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
-if ${ac_cv_sys_file_offset_bits+:} false; then :
+  HAVE_C99_STDINT_H=0
+  HAVE_SYS_BITYPES_H=0
+  HAVE_SYS_INTTYPES_H=0
+  STDINT_H=stdint.h
+  case "$gl_cv_header_working_stdint_h" in
+    *yes)
+      HAVE_C99_STDINT_H=1
+                  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h predates C++11" >&5
+$as_echo_n "checking whether stdint.h predates C++11... " >&6; }
+if ${gl_cv_header_stdint_predates_cxx11_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  while :; do
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  gl_cv_header_stdint_predates_cxx11_h=yes
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
+
+
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+
+
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+
 int
 main ()
 {
@@ -8102,21 +9065,49 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_file_offset_bits=no; break
+  gl_cv_header_stdint_predates_cxx11_h=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_predates_cxx11_h" >&5
+$as_echo "$gl_cv_header_stdint_predates_cxx11_h" >&6; }
+
+      if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then
+
+$as_echo "#define __STDC_CONSTANT_MACROS 1" >>confdefs.h
+
+
+$as_echo "#define __STDC_LIMIT_MACROS 1" >>confdefs.h
+
+      fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stdint.h has UINTMAX_WIDTH etc." >&5
+$as_echo_n "checking whether stdint.h has UINTMAX_WIDTH etc.... " >&6; }
+if ${gl_cv_header_stdint_width+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gl_cv_header_stdint_width=no
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#define _FILE_OFFSET_BITS 64
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
+
+              /* Work if build is not clean.  */
+              #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+              #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+               #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+              #endif
+              #include <stdint.h>
+
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+              int iw = UINTMAX_WIDTH;
+
 int
 main ()
 {
@@ -8126,42 +9117,150 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_file_offset_bits=64; break
+  gl_cv_header_stdint_width=yes
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  ac_cv_sys_file_offset_bits=unknown
-  break
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_header_stdint_width" >&5
+$as_echo "$gl_cv_header_stdint_width" >&6; }
+      if test "$gl_cv_header_stdint_width" = yes; then
+        STDINT_H=
+      fi
+      ;;
+    *)
+                  for ac_header in sys/inttypes.h sys/bitypes.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
 done
+
+      if test $ac_cv_header_sys_inttypes_h = yes; then
+        HAVE_SYS_INTTYPES_H=1
+      fi
+      if test $ac_cv_header_sys_bitypes_h = yes; then
+        HAVE_SYS_BITYPES_H=1
+      fi
+
+
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+  for gltype in ptrdiff_t size_t ; do
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+$as_echo_n "checking for bit size of $gltype... " >&6; }
+if eval \${gl_cv_bitsizeof_${gltype}+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+#include <limits.h>"; then :
+
+else
+  result=unknown
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
-$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
-case $ac_cv_sys_file_offset_bits in #(
-  no | unknown) ;;
-  *)
-cat >>confdefs.h <<_ACEOF
-#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+
+       eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+    eval result=\$gl_cv_bitsizeof_${gltype}
+    if test $result = unknown; then
+                                                result=0
+    fi
+    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    cat >>confdefs.h <<_ACEOF
+#define BITSIZEOF_${GLTYPE} $result
 _ACEOF
-;;
-esac
-rm -rf conftest*
-  if test $ac_cv_sys_file_offset_bits = unknown; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
-$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
-if ${ac_cv_sys_large_files+:} false; then :
+
+    eval BITSIZEOF_${GLTYPE}=\$result
+  done
+
+
+  fi
+
+
+  for gltype in sig_atomic_t wchar_t wint_t ; do
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bit size of $gltype" >&5
+$as_echo_n "checking for bit size of $gltype... " >&6; }
+if eval \${gl_cv_bitsizeof_${gltype}+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "sizeof ($gltype) * CHAR_BIT" "result"        "
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+#include <limits.h>"; then :
+
+else
+  result=unknown
+fi
+
+       eval gl_cv_bitsizeof_${gltype}=\$result
+
+fi
+eval ac_res=\$gl_cv_bitsizeof_${gltype}
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+    eval result=\$gl_cv_bitsizeof_${gltype}
+    if test $result = unknown; then
+                                                result=0
+    fi
+    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    cat >>confdefs.h <<_ACEOF
+#define BITSIZEOF_${GLTYPE} $result
+_ACEOF
+
+    eval BITSIZEOF_${GLTYPE}=\$result
+  done
+
+
+
+
+  for gltype in sig_atomic_t wchar_t wint_t ; do
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $gltype is signed" >&5
+$as_echo_n "checking whether $gltype is signed... " >&6; }
+if eval \${gl_cv_type_${gltype}_signed+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  while :; do
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
+
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];
 int
 main ()
 {
@@ -8171,21 +9270,75 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_large_files=no; break
+  result=yes
+else
+  result=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+       eval gl_cv_type_${gltype}_signed=\$result
+
+fi
+eval ac_res=\$gl_cv_type_${gltype}_signed
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+    eval result=\$gl_cv_type_${gltype}_signed
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    if test "$result" = yes; then
+      cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGNED_${GLTYPE} 1
+_ACEOF
+
+      eval HAVE_SIGNED_${GLTYPE}=1
+    else
+      eval HAVE_SIGNED_${GLTYPE}=0
+    fi
+  done
+
+
+  gl_cv_type_ptrdiff_t_signed=yes
+  gl_cv_type_size_t_signed=no
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+
+
+  for gltype in ptrdiff_t size_t ; do
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+$as_echo_n "checking for $gltype integer literal suffix... " >&6; }
+if eval \${gl_cv_type_${gltype}_suffix+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval gl_cv_type_${gltype}_suffix=no
+       eval result=\$gl_cv_type_${gltype}_signed
+       if test "$result" = yes; then
+         glsufu=
+       else
+         glsufu=u
+       fi
+       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+         case $glsuf in
+           '')  gltype1='int';;
+           l)   gltype1='long int';;
+           ll)  gltype1='long long int';;
+           i64) gltype1='__int64';;
+           u)   gltype1='unsigned int';;
+           ul)  gltype1='unsigned long int';;
+           ull) gltype1='unsigned long long int';;
+           ui64)gltype1='unsigned __int64';;
+         esac
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#define _LARGE_FILES 1
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-                      && LARGE_OFF_T % 2147483647 == 1)
-                     ? 1 : -1];
+
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+              extern $gltype foo;
+              extern $gltype1 foo;
 int
 main ()
 {
@@ -8195,816 +9348,5909 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_large_files=1; break
+  eval gl_cv_type_${gltype}_suffix=\$glsuf
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  ac_cv_sys_large_files=unknown
-  break
-done
+         eval result=\$gl_cv_type_${gltype}_suffix
+         test "$result" != no && break
+       done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
-$as_echo "$ac_cv_sys_large_files" >&6; }
-case $ac_cv_sys_large_files in #(
-  no | unknown) ;;
-  *)
-cat >>confdefs.h <<_ACEOF
-#define _LARGE_FILES $ac_cv_sys_large_files
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    eval result=\$gl_cv_type_${gltype}_suffix
+    test "$result" = no && result=
+    eval ${GLTYPE}_SUFFIX=\$result
+    cat >>confdefs.h <<_ACEOF
+#define ${GLTYPE}_SUFFIX $result
 _ACEOF
-;;
-esac
-rm -rf conftest*
-  fi
 
+  done
 
-fi
 
+  fi
 
-# Checks for libraries.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getpwnam" >&5
-$as_echo_n "checking for library containing getpwnam... " >&6; }
-if ${ac_cv_search_getpwnam+:} false; then :
+
+  for gltype in sig_atomic_t wchar_t wint_t ; do
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $gltype integer literal suffix" >&5
+$as_echo_n "checking for $gltype integer literal suffix... " >&6; }
+if eval \${gl_cv_type_${gltype}_suffix+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  eval gl_cv_type_${gltype}_suffix=no
+       eval result=\$gl_cv_type_${gltype}_signed
+       if test "$result" = yes; then
+         glsufu=
+       else
+         glsufu=u
+       fi
+       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+         case $glsuf in
+           '')  gltype1='int';;
+           l)   gltype1='long int';;
+           ll)  gltype1='long long int';;
+           i64) gltype1='__int64';;
+           u)   gltype1='unsigned int';;
+           ul)  gltype1='unsigned long int';;
+           ull) gltype1='unsigned long long int';;
+           ui64)gltype1='unsigned __int64';;
+         esac
+         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char getpwnam ();
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+
+              extern $gltype foo;
+              extern $gltype1 foo;
 int
 main ()
 {
-return getpwnam ();
+
   ;
   return 0;
 }
 _ACEOF
-for ac_lib in '' sun; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_getpwnam=$ac_res
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval gl_cv_type_${gltype}_suffix=\$glsuf
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_getpwnam+:} false; then :
-  break
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+         eval result=\$gl_cv_type_${gltype}_suffix
+         test "$result" != no && break
+       done
 fi
-done
-if ${ac_cv_search_getpwnam+:} false; then :
+eval ac_res=\$gl_cv_type_${gltype}_suffix
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    eval result=\$gl_cv_type_${gltype}_suffix
+    test "$result" = no && result=
+    eval ${GLTYPE}_SUFFIX=\$result
+    cat >>confdefs.h <<_ACEOF
+#define ${GLTYPE}_SUFFIX $result
+_ACEOF
 
-else
-  ac_cv_search_getpwnam=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getpwnam" >&5
-$as_echo "$ac_cv_search_getpwnam" >&6; }
-ac_res=$ac_cv_search_getpwnam
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  done
 
-fi
 
 
-# Checks for header files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
+          if test $GNULIB_OVERRIDES_WINT_T = 1; then
+    BITSIZEOF_WINT_T=32
+  fi
+
+      ;;
+  esac
+
+
+
+  LIMITS_H='limits.h'
+   if test -n "$LIMITS_H"; then
+  GL_GENERATE_LIMITS_H_TRUE=
+  GL_GENERATE_LIMITS_H_FALSE='#'
+else
+  GL_GENERATE_LIMITS_H_TRUE='#'
+  GL_GENERATE_LIMITS_H_FALSE=
+fi
+
+
+
+
+
+
+
+   if test -n "$STDINT_H"; then
+  GL_GENERATE_STDINT_H_TRUE=
+  GL_GENERATE_STDINT_H_FALSE='#'
+else
+  GL_GENERATE_STDINT_H_TRUE='#'
+  GL_GENERATE_STDINT_H_FALSE=
+fi
+
+
+
+  GNULIB_DPRINTF=0;
+  GNULIB_FCLOSE=0;
+  GNULIB_FDOPEN=0;
+  GNULIB_FFLUSH=0;
+  GNULIB_FGETC=0;
+  GNULIB_FGETS=0;
+  GNULIB_FOPEN=0;
+  GNULIB_FPRINTF=0;
+  GNULIB_FPRINTF_POSIX=0;
+  GNULIB_FPURGE=0;
+  GNULIB_FPUTC=0;
+  GNULIB_FPUTS=0;
+  GNULIB_FREAD=0;
+  GNULIB_FREOPEN=0;
+  GNULIB_FSCANF=0;
+  GNULIB_FSEEK=0;
+  GNULIB_FSEEKO=0;
+  GNULIB_FTELL=0;
+  GNULIB_FTELLO=0;
+  GNULIB_FWRITE=0;
+  GNULIB_GETC=0;
+  GNULIB_GETCHAR=0;
+  GNULIB_GETDELIM=0;
+  GNULIB_GETLINE=0;
+  GNULIB_OBSTACK_PRINTF=0;
+  GNULIB_OBSTACK_PRINTF_POSIX=0;
+  GNULIB_PCLOSE=0;
+  GNULIB_PERROR=0;
+  GNULIB_POPEN=0;
+  GNULIB_PRINTF=0;
+  GNULIB_PRINTF_POSIX=0;
+  GNULIB_PUTC=0;
+  GNULIB_PUTCHAR=0;
+  GNULIB_PUTS=0;
+  GNULIB_REMOVE=0;
+  GNULIB_RENAME=0;
+  GNULIB_RENAMEAT=0;
+  GNULIB_SCANF=0;
+  GNULIB_SNPRINTF=0;
+  GNULIB_SPRINTF_POSIX=0;
+  GNULIB_STDIO_H_NONBLOCKING=0;
+  GNULIB_STDIO_H_SIGPIPE=0;
+  GNULIB_TMPFILE=0;
+  GNULIB_VASPRINTF=0;
+  GNULIB_VFSCANF=0;
+  GNULIB_VSCANF=0;
+  GNULIB_VDPRINTF=0;
+  GNULIB_VFPRINTF=0;
+  GNULIB_VFPRINTF_POSIX=0;
+  GNULIB_VPRINTF=0;
+  GNULIB_VPRINTF_POSIX=0;
+  GNULIB_VSNPRINTF=0;
+  GNULIB_VSPRINTF_POSIX=0;
+    HAVE_DECL_FPURGE=1;
+  HAVE_DECL_FSEEKO=1;
+  HAVE_DECL_FTELLO=1;
+  HAVE_DECL_GETDELIM=1;
+  HAVE_DECL_GETLINE=1;
+  HAVE_DECL_OBSTACK_PRINTF=1;
+  HAVE_DECL_SNPRINTF=1;
+  HAVE_DECL_VSNPRINTF=1;
+  HAVE_DPRINTF=1;
+  HAVE_FSEEKO=1;
+  HAVE_FTELLO=1;
+  HAVE_PCLOSE=1;
+  HAVE_POPEN=1;
+  HAVE_RENAMEAT=1;
+  HAVE_VASPRINTF=1;
+  HAVE_VDPRINTF=1;
+  REPLACE_DPRINTF=0;
+  REPLACE_FCLOSE=0;
+  REPLACE_FDOPEN=0;
+  REPLACE_FFLUSH=0;
+  REPLACE_FOPEN=0;
+  REPLACE_FPRINTF=0;
+  REPLACE_FPURGE=0;
+  REPLACE_FREOPEN=0;
+  REPLACE_FSEEK=0;
+  REPLACE_FSEEKO=0;
+  REPLACE_FTELL=0;
+  REPLACE_FTELLO=0;
+  REPLACE_GETDELIM=0;
+  REPLACE_GETLINE=0;
+  REPLACE_OBSTACK_PRINTF=0;
+  REPLACE_PERROR=0;
+  REPLACE_POPEN=0;
+  REPLACE_PRINTF=0;
+  REPLACE_REMOVE=0;
+  REPLACE_RENAME=0;
+  REPLACE_RENAMEAT=0;
+  REPLACE_SNPRINTF=0;
+  REPLACE_SPRINTF=0;
+  REPLACE_STDIO_READ_FUNCS=0;
+  REPLACE_STDIO_WRITE_FUNCS=0;
+  REPLACE_TMPFILE=0;
+  REPLACE_VASPRINTF=0;
+  REPLACE_VDPRINTF=0;
+  REPLACE_VFPRINTF=0;
+  REPLACE_VPRINTF=0;
+  REPLACE_VSNPRINTF=0;
+  REPLACE_VSPRINTF=0;
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
+$as_echo_n "checking for C/C++ restrict keyword... " >&6; }
+if ${ac_cv_c_restrict+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_cv_c_restrict=no
+   # The order here caters to the fact that C++ does not require restrict.
+   for ac_kw in __restrict __restrict__ _Restrict restrict; do
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
+typedef int *int_ptr;
+           int foo (int_ptr $ac_kw ip) { return ip[0]; }
+           int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
+           int bar (int ip[$ac_kw]) { return ip[0]; }
 
 int
 main ()
 {
+int s[1];
+           int *$ac_kw t = s;
+           t[0] = 0;
+           return foo (t) + bar (t);
 
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
+  ac_cv_c_restrict=$ac_kw
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     test "$ac_cv_c_restrict" != no && break
+   done
 
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
+$as_echo "$ac_cv_c_restrict" >&6; }
+
+ case $ac_cv_c_restrict in
+   restrict) ;;
+   no) $as_echo "#define restrict /**/" >>confdefs.h
+ ;;
+   *)  cat >>confdefs.h <<_ACEOF
+#define restrict $ac_cv_c_restrict
+_ACEOF
+ ;;
+ esac
+
+
+  GNULIB_EXPLICIT_BZERO=0;
+  GNULIB_FFSL=0;
+  GNULIB_FFSLL=0;
+  GNULIB_MEMCHR=0;
+  GNULIB_MEMMEM=0;
+  GNULIB_MEMPCPY=0;
+  GNULIB_MEMRCHR=0;
+  GNULIB_RAWMEMCHR=0;
+  GNULIB_STPCPY=0;
+  GNULIB_STPNCPY=0;
+  GNULIB_STRCHRNUL=0;
+  GNULIB_STRDUP=0;
+  GNULIB_STRNCAT=0;
+  GNULIB_STRNDUP=0;
+  GNULIB_STRNLEN=0;
+  GNULIB_STRPBRK=0;
+  GNULIB_STRSEP=0;
+  GNULIB_STRSTR=0;
+  GNULIB_STRCASESTR=0;
+  GNULIB_STRTOK_R=0;
+  GNULIB_MBSLEN=0;
+  GNULIB_MBSNLEN=0;
+  GNULIB_MBSCHR=0;
+  GNULIB_MBSRCHR=0;
+  GNULIB_MBSSTR=0;
+  GNULIB_MBSCASECMP=0;
+  GNULIB_MBSNCASECMP=0;
+  GNULIB_MBSPCASECMP=0;
+  GNULIB_MBSCASESTR=0;
+  GNULIB_MBSCSPN=0;
+  GNULIB_MBSPBRK=0;
+  GNULIB_MBSSPN=0;
+  GNULIB_MBSSEP=0;
+  GNULIB_MBSTOK_R=0;
+  GNULIB_STRERROR=0;
+  GNULIB_STRERROR_R=0;
+  GNULIB_STRSIGNAL=0;
+  GNULIB_STRVERSCMP=0;
+  HAVE_MBSLEN=0;
+    HAVE_EXPLICIT_BZERO=1;
+  HAVE_FFSL=1;
+  HAVE_FFSLL=1;
+  HAVE_MEMCHR=1;
+  HAVE_DECL_MEMMEM=1;
+  HAVE_MEMPCPY=1;
+  HAVE_DECL_MEMRCHR=1;
+  HAVE_RAWMEMCHR=1;
+  HAVE_STPCPY=1;
+  HAVE_STPNCPY=1;
+  HAVE_STRCHRNUL=1;
+  HAVE_DECL_STRDUP=1;
+  HAVE_DECL_STRNDUP=1;
+  HAVE_DECL_STRNLEN=1;
+  HAVE_STRPBRK=1;
+  HAVE_STRSEP=1;
+  HAVE_STRCASESTR=1;
+  HAVE_DECL_STRTOK_R=1;
+  HAVE_DECL_STRERROR_R=1;
+  HAVE_DECL_STRSIGNAL=1;
+  HAVE_STRVERSCMP=1;
+  REPLACE_MEMCHR=0;
+  REPLACE_MEMMEM=0;
+  REPLACE_STPNCPY=0;
+  REPLACE_STRCHRNUL=0;
+  REPLACE_STRDUP=0;
+  REPLACE_STRNCAT=0;
+  REPLACE_STRNDUP=0;
+  REPLACE_STRNLEN=0;
+  REPLACE_STRSTR=0;
+  REPLACE_STRCASESTR=0;
+  REPLACE_STRTOK_R=0;
+  REPLACE_STRERROR=0;
+  REPLACE_STRERROR_R=0;
+  REPLACE_STRSIGNAL=0;
+  UNDEFINE_STRTOK_R=0;
+
+
+     REPLACE_STRERROR_0=0
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror(0) succeeds" >&5
+$as_echo_n "checking whether strerror(0) succeeds... " >&6; }
+if ${gl_cv_func_strerror_0_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                        # Guess yes on glibc systems.
+         *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # Guess yes on musl systems.
+         *-musl*)       gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # Guess yes on native Windows.
+         mingw*)        gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # If we don't know, obey --enable-cross-guesses.
+         *)             gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
+       esac
+
+else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <string.h>
+           #include <errno.h>
 
+int
+main ()
+{
+int result = 0;
+           char *str;
+           errno = 0;
+           str = strerror (0);
+           if (!*str) result |= 1;
+           if (errno) result |= 2;
+           if (strstr (str, "nknown") || strstr (str, "ndefined"))
+             result |= 4;
+           return result;
+  ;
+  return 0;
+}
 _ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
-
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_strerror_0_works=yes
 else
-  ac_cv_header_stdc=no
+  gl_cv_func_strerror_0_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f conftest*
+
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_strerror_0_works" >&5
+$as_echo "$gl_cv_func_strerror_0_works" >&6; }
+  case "$gl_cv_func_strerror_0_works" in
+    *yes) ;;
+    *)
+      REPLACE_STRERROR_0=1
 
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
+$as_echo "#define REPLACE_STRERROR_0 1" >>confdefs.h
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
+      ;;
+  esac
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_string_h='<'string.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <string.h>" >&5
+$as_echo_n "checking absolute name of <string.h>... " >&6; }
+if ${gl_cv_next_string_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
 
-fi
 
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-                  (('a' <= (c) && (c) <= 'i') \
-                    || ('j' <= (c) && (c) <= 'r') \
-                    || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-       || toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
+#include <string.h>
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'string.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
 
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
+        gl_cv_absolute_string_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_string_h
+           gl_cv_next_string_h='"'$gl_header'"'
 
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_string_h" >&5
+$as_echo "$gl_cv_next_string_h" >&6; }
+     fi
+     NEXT_STRING_H=$gl_cv_next_string_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'string.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_string_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STRING_H=$gl_next_as_first_directive
 
-ac_header_dirent=no
-for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
-  as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
-$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
-if eval \${$as_ac_Header+:} false; then :
+
+
+
+
+
+
+
+
+
+
+
+
+    WINDOWS_64_BIT_OFF_T=0
+
+
+
+
+
+$as_echo "#define _USE_STD_STAT 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_sys_types_h='<'sys/types.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <sys/types.h>" >&5
+$as_echo_n "checking absolute name of <sys/types.h>... " >&6; }
+if ${gl_cv_next_sys_types_h+:} false; then :
   $as_echo_n "(cached) " >&6
 else
+
+
+
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <sys/types.h>
-#include <$ac_hdr>
-
-int
-main ()
-{
-if ((DIR *) 0)
-return 0;
-  ;
-  return 0;
-}
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$as_ac_Header=yes"
-else
-  eval "$as_ac_Header=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'sys/types.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_sys_types_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_sys_types_h
+           gl_cv_next_sys_types_h='"'$gl_header'"'
+
+
 fi
-eval ac_res=\$$as_ac_Header
-              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
-_ACEOF
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_sys_types_h" >&5
+$as_echo "$gl_cv_next_sys_types_h" >&6; }
+     fi
+     NEXT_SYS_TYPES_H=$gl_cv_next_sys_types_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'sys/types.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_sys_types_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H=$gl_next_as_first_directive
 
-ac_header_dirent=$ac_hdr; break
+
+
+
+
+
+
+
+
+
+
+
+    WINDOWS_STAT_INODES=0
+
+
+
+
+   if false; then
+  GL_COND_LIBTOOL_TRUE=
+  GL_COND_LIBTOOL_FALSE='#'
+else
+  GL_COND_LIBTOOL_TRUE='#'
+  GL_COND_LIBTOOL_FALSE=
 fi
 
-done
-# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
-if test $ac_header_dirent = dirent.h; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
-$as_echo_n "checking for library containing opendir... " >&6; }
-if ${ac_cv_search_opendir+:} false; then :
+  gl_cond_libtool=false
+  gl_libdeps=
+  gl_ltlibdeps=
+  gl_m4_base='m4'
+
+
+
+
+
+
+
+
+
+  gl_source_base='lib'
+
+
+
+      case "$host_os" in
+    mingw*) REPLACE_ACCESS=1 ;;
+  esac
+
+  if test $REPLACE_ACCESS = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS access.$ac_objext"
+
+  fi
+
+
+
+
+
+          GNULIB_ACCESS=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_ACCESS 1" >>confdefs.h
+
+
+
+
+
+  if test $ac_cv_func_alloca_works = no; then
+    :
+  fi
+
+  # Define an additional variable used in the Makefile substitution.
+  if test $ac_cv_working_alloca_h = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca as a compiler built-in" >&5
+$as_echo_n "checking for alloca as a compiler built-in... " >&6; }
+if ${gl_cv_rpl_alloca+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+        Need own alloca
 #endif
-char opendir ();
-int
-main ()
-{
-return opendir ();
-  ;
-  return 0;
-}
+
 _ACEOF
-for ac_lib in '' dir; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_opendir=$ac_res
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Need own alloca" >/dev/null 2>&1; then :
+  gl_cv_rpl_alloca=yes
+else
+  gl_cv_rpl_alloca=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_opendir+:} false; then :
-  break
+rm -f conftest*
+
+
 fi
-done
-if ${ac_cv_search_opendir+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_rpl_alloca" >&5
+$as_echo "$gl_cv_rpl_alloca" >&6; }
+    if test $gl_cv_rpl_alloca = yes; then
+
+$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+
+      ALLOCA_H=alloca.h
+    else
+                  ALLOCA_H=
+    fi
+  else
+    ALLOCA_H=alloca.h
+  fi
 
+   if test -n "$ALLOCA_H"; then
+  GL_GENERATE_ALLOCA_H_TRUE=
+  GL_GENERATE_ALLOCA_H_FALSE='#'
 else
-  ac_cv_search_opendir=no
+  GL_GENERATE_ALLOCA_H_TRUE='#'
+  GL_GENERATE_ALLOCA_H_FALSE=
 fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
-$as_echo "$ac_cv_search_opendir" >&6; }
-ac_res=$ac_cv_search_opendir
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
-fi
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
-$as_echo_n "checking for library containing opendir... " >&6; }
-if ${ac_cv_search_opendir+:} false; then :
+  if test $ac_cv_working_alloca_h = yes; then
+    HAVE_ALLOCA_H=1
+  else
+    HAVE_ALLOCA_H=0
+  fi
+
+
+
+
+
+
+    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+      REPLACE_CLOSE=1
+    fi
+
+
+
+
+
+
+  if test $ac_cv_header_sys_socket_h != yes; then
+                    for ac_header in winsock2.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_WINSOCK2_H 1
+_ACEOF
+
+fi
+
+done
+
+  fi
+  if test "$ac_cv_header_winsock2_h" = yes; then
+    HAVE_WINSOCK2_H=1
+    UNISTD_H_HAVE_WINSOCK2_H=1
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+  else
+    HAVE_WINSOCK2_H=0
+  fi
+
+
+    if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
+                        REPLACE_CLOSE=1
+    fi
+
+
+
+  if test $REPLACE_CLOSE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS close.$ac_objext"
+
+  fi
+
+
+
+
+
+          GNULIB_CLOSE=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_CLOSE 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether // is distinct from /" >&5
+$as_echo_n "checking whether // is distinct from /... " >&6; }
+if ${gl_cv_double_slash_root+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_func_search_save_LIBS=$LIBS
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+   if test x"$cross_compiling" = xyes ; then
+        # When cross-compiling, there is no way to tell whether // is special
+        # short of a list of hosts.  However, the only known hosts to date
+        # that have a distinct // are Apollo DomainOS (too old to port to),
+        # Cygwin, and z/OS.  If anyone knows of another system for which // has
+        # special semantics and is distinct from /, please report it to
+        # <bug-gnulib@gnu.org>.
+        case $host in
+          *-cygwin | i370-ibm-openedition)
+            gl_cv_double_slash_root=yes ;;
+          *)
+            # Be optimistic and assume that / and // are the same when we
+            # don't know.
+            gl_cv_double_slash_root='unknown, assuming no' ;;
+        esac
+      else
+        set x `ls -di / // 2>/dev/null`
+        if test "$2" = "$4" && wc //dev/null >/dev/null 2>&1; then
+          gl_cv_double_slash_root=no
+        else
+          gl_cv_double_slash_root=yes
+        fi
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_double_slash_root" >&5
+$as_echo "$gl_cv_double_slash_root" >&6; }
+  if test "$gl_cv_double_slash_root" = yes; then
+
+$as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
+
+  fi
+
+
+
+
+
+
+$as_echo "#define HAVE_DUP2 1" >>confdefs.h
+
+
+  if test $HAVE_DUP2 = 1; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dup2 works" >&5
+$as_echo_n "checking whether dup2 works... " >&6; }
+if ${gl_cv_func_dup2_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+           mingw*) # on this platform, dup2 always returns 0 for success
+             gl_cv_func_dup2_works="guessing no" ;;
+           cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+             gl_cv_func_dup2_works="guessing no" ;;
+           aix* | freebsd*)
+                   # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
+                   # not EBADF.
+             gl_cv_func_dup2_works="guessing no" ;;
+           haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
+             gl_cv_func_dup2_works="guessing no" ;;
+           *-android*) # implemented using dup3(), which fails if oldfd == newfd
+             gl_cv_func_dup2_works="guessing no" ;;
+           os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
+             gl_cv_func_dup2_works="guessing no" ;;
+           *) gl_cv_func_dup2_works="guessing yes" ;;
+         esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char opendir ();
+         #include <errno.h>
+             #include <fcntl.h>
+             #include <limits.h>
+             #include <sys/resource.h>
+             #include <unistd.h>
+             #ifndef RLIM_SAVED_CUR
+             # define RLIM_SAVED_CUR RLIM_INFINITY
+             #endif
+             #ifndef RLIM_SAVED_MAX
+             # define RLIM_SAVED_MAX RLIM_INFINITY
+             #endif
+
 int
 main ()
 {
-return opendir ();
+int result = 0;
+             int bad_fd = INT_MAX;
+             struct rlimit rlim;
+             if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+                 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+                 && rlim.rlim_cur != RLIM_INFINITY
+                 && rlim.rlim_cur != RLIM_SAVED_MAX
+                 && rlim.rlim_cur != RLIM_SAVED_CUR)
+               bad_fd = rlim.rlim_cur;
+             #ifdef FD_CLOEXEC
+               if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
+                 result |= 1;
+             #endif
+             if (dup2 (1, 1) != 1)
+               result |= 2;
+             #ifdef FD_CLOEXEC
+               if (fcntl (1, F_GETFD) != FD_CLOEXEC)
+                 result |= 4;
+             #endif
+             close (0);
+             if (dup2 (0, 0) != -1)
+               result |= 8;
+             /* Many gnulib modules require POSIX conformance of EBADF.  */
+             if (dup2 (2, bad_fd) == -1 && errno != EBADF)
+               result |= 16;
+             /* Flush out some cygwin core dumps.  */
+             if (dup2 (2, -1) != -1 || errno != EBADF)
+               result |= 32;
+             dup2 (2, 255);
+             dup2 (2, 256);
+             /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
+             {
+               int fd = open (".", O_RDONLY);
+               if (fd == -1)
+                 result |= 64;
+               else if (dup2 (fd, fd + 1) == -1)
+                 result |= 128;
+
+               close (fd);
+             }
+             return result;
   ;
   return 0;
 }
+
 _ACEOF
-for ac_lib in '' x; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_opendir=$ac_res
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_dup2_works=yes
+else
+  gl_cv_func_dup2_works=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_opendir+:} false; then :
-  break
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dup2_works" >&5
+$as_echo "$gl_cv_func_dup2_works" >&6; }
+    case "$gl_cv_func_dup2_works" in
+      *yes) ;;
+      *)
+        REPLACE_DUP2=1
+        for ac_func in setdtablesize
+do :
+  ac_fn_c_check_func "$LINENO" "setdtablesize" "ac_cv_func_setdtablesize"
+if test "x$ac_cv_func_setdtablesize" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SETDTABLESIZE 1
+_ACEOF
+
 fi
 done
-if ${ac_cv_search_opendir+:} false; then :
 
+        ;;
+    esac
+  fi
+
+
+  if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS dup2.$ac_objext"
+
+
+  fi
+
+
+
+
+
+          GNULIB_DUP2=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_DUP2 1" >>confdefs.h
+
+
+
+
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for error_at_line" >&5
+$as_echo_n "checking for error_at_line... " >&6; }
+if ${ac_cv_lib_error_at_line+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  ac_cv_search_opendir=no
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <error.h>
+int
+main ()
+{
+error_at_line (0, 0, "", 0, "an error occurred");
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_error_at_line=yes
+else
+  ac_cv_lib_error_at_line=no
 fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
-$as_echo "$ac_cv_search_opendir" >&6; }
-ac_res=$ac_cv_search_opendir
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_error_at_line" >&5
+$as_echo "$ac_cv_lib_error_at_line" >&6; }
+
+  if test $ac_cv_lib_error_at_line = no; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS error.$ac_objext"
+
+
+
+  :
+
+  fi
+
+
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error:3:c-format"
+
+
+
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS --flag=error_at_line:5:c-format"
+
+
+
+
+
+
+
+  if test $ac_cv_func_fcntl = no; then
+
+
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+  else
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl handles F_DUPFD correctly" >&5
+$as_echo_n "checking whether fcntl handles F_DUPFD correctly... " >&6; }
+if ${gl_cv_func_fcntl_f_dupfd_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case $host_os in
+            aix* | cygwin* | haiku*)
+               gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
+            *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
+          esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <errno.h>
+              #include <fcntl.h>
+              #include <limits.h>
+              #include <sys/resource.h>
+              #include <unistd.h>
+              #ifndef RLIM_SAVED_CUR
+              # define RLIM_SAVED_CUR RLIM_INFINITY
+              #endif
+              #ifndef RLIM_SAVED_MAX
+              # define RLIM_SAVED_MAX RLIM_INFINITY
+              #endif
 
+int
+main ()
+{
+int result = 0;
+              int bad_fd = INT_MAX;
+              struct rlimit rlim;
+              if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+                  && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+                  && rlim.rlim_cur != RLIM_INFINITY
+                  && rlim.rlim_cur != RLIM_SAVED_MAX
+                  && rlim.rlim_cur != RLIM_SAVED_CUR)
+                bad_fd = rlim.rlim_cur;
+              if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
+              if (errno != EINVAL) result |= 2;
+              if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
+              if (errno != EINVAL) result |= 8;
+              /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
+              {
+                int fd;
+                fd = open (".", O_RDONLY);
+                if (fd == -1)
+                  result |= 16;
+                else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
+                  result |= 32;
+
+                close (fd);
+              }
+              return result;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_fcntl_f_dupfd_works=yes
+else
+  gl_cv_func_fcntl_f_dupfd_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_works" >&5
+$as_echo "$gl_cv_func_fcntl_f_dupfd_works" >&6; }
+    case $gl_cv_func_fcntl_f_dupfd_works in
+      *yes) ;;
+      *)
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
-$as_echo_n "checking whether stat file-mode macros are broken... " >&6; }
-if ${ac_cv_header_stat_broken+:} false; then :
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+
+$as_echo "#define FCNTL_DUPFD_BUGGY 1" >>confdefs.h
+ ;;
+    esac
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fcntl understands F_DUPFD_CLOEXEC" >&5
+$as_echo_n "checking whether fcntl understands F_DUPFD_CLOEXEC... " >&6; }
+if ${gl_cv_func_fcntl_f_dupfd_cloexec+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/stat.h>
 
-#if defined S_ISBLK && defined S_IFDIR
-extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
+#include <fcntl.h>
+#ifndef F_DUPFD_CLOEXEC
+choke me
 #endif
 
-#if defined S_ISBLK && defined S_IFCHR
-extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
-#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef __linux__
+/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
+   it to support the semantics on older kernels that failed with EINVAL.  */
+choke me
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_func_fcntl_f_dupfd_cloexec=yes
+else
+  gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  gl_cv_func_fcntl_f_dupfd_cloexec=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_fcntl_f_dupfd_cloexec" >&5
+$as_echo "$gl_cv_func_fcntl_f_dupfd_cloexec" >&6; }
+    if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then
+
+
+
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+
+          fi
+  fi
+
+
+  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS fcntl.$ac_objext"
+
+  fi
+
+
+
+
+
+          GNULIB_FCNTL=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_FCNTL 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_fcntl_h='<'fcntl.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <fcntl.h>" >&5
+$as_echo_n "checking absolute name of <fcntl.h>... " >&6; }
+if ${gl_cv_next_fcntl_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <fcntl.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'fcntl.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_fcntl_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_fcntl_h
+           gl_cv_next_fcntl_h='"'$gl_header'"'
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_fcntl_h" >&5
+$as_echo "$gl_cv_next_fcntl_h" >&6; }
+     fi
+     NEXT_FCNTL_H=$gl_cv_next_fcntl_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'fcntl.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_fcntl_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_FCNTL_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  if test $ac_cv_func_getdtablesize = yes &&
+     test $ac_cv_have_decl_getdtablesize = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getdtablesize works" >&5
+$as_echo_n "checking whether getdtablesize works... " >&6; }
+if ${gl_cv_func_getdtablesize_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+                                                   case "$host_os" in
+         vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
+         *)
+                                                       if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
+                  gl_cv_func_getdtablesize_works="guessing no" ;;
+                *) gl_cv_func_getdtablesize_works="guessing yes" ;;
+              esac
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <unistd.h>
+int
+main ()
+{
+int size = getdtablesize();
+                if (dup2 (0, getdtablesize()) != -1)
+                  return 1;
+                if (size != getdtablesize())
+                  return 2;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_getdtablesize_works=yes
+else
+  gl_cv_func_getdtablesize_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+           ;;
+       esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_getdtablesize_works" >&5
+$as_echo "$gl_cv_func_getdtablesize_works" >&6; }
+    case "$gl_cv_func_getdtablesize_works" in
+      *yes | "no (limitation)") ;;
+      *) REPLACE_GETDTABLESIZE=1 ;;
+    esac
+  else
+    HAVE_GETDTABLESIZE=0
+  fi
+
+  if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getdtablesize.$ac_objext"
+
+    :
+  fi
+
+
+
+
+
+          GNULIB_GETDTABLESIZE=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_GETDTABLESIZE 1" >>confdefs.h
+
+
+
+
+
+# Persuade glibc <stdlib.h> to declare getloadavg().
+
+
+gl_save_LIBS=$LIBS
+
+# getloadavg is present in libc on glibc >= 2.2, Mac OS X, FreeBSD >= 2.0,
+# NetBSD >= 0.9, OpenBSD >= 2.0, Solaris >= 7.
+HAVE_GETLOADAVG=1
+ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg"
+if test "x$ac_cv_func_getloadavg" = xyes; then :
+
+else
+  gl_func_getloadavg_done=no
+
+   # Some systems with -lutil have (and need) -lkvm as well, some do not.
+   # On Solaris, -lkvm requires nlist from -lelf, so check that first
+   # to get the right answer into the cache.
+   # For kstat on solaris, we need to test for libelf and libkvm to force the
+   # definition of SVR4 below.
+   if test $gl_func_getloadavg_done = no; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for elf_begin in -lelf" >&5
+$as_echo_n "checking for elf_begin in -lelf... " >&6; }
+if ${ac_cv_lib_elf_elf_begin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lelf  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char elf_begin ();
+int
+main ()
+{
+return elf_begin ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_elf_elf_begin=yes
+else
+  ac_cv_lib_elf_elf_begin=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_elf_elf_begin" >&5
+$as_echo "$ac_cv_lib_elf_elf_begin" >&6; }
+if test "x$ac_cv_lib_elf_elf_begin" = xyes; then :
+  LIBS="-lelf $LIBS"
+fi
+
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kvm_open in -lkvm" >&5
+$as_echo_n "checking for kvm_open in -lkvm... " >&6; }
+if ${ac_cv_lib_kvm_kvm_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkvm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char kvm_open ();
+int
+main ()
+{
+return kvm_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_kvm_kvm_open=yes
+else
+  ac_cv_lib_kvm_kvm_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kvm_kvm_open" >&5
+$as_echo "$ac_cv_lib_kvm_kvm_open" >&6; }
+if test "x$ac_cv_lib_kvm_kvm_open" = xyes; then :
+  LIBS="-lkvm $LIBS"
+fi
+
+     # Check for the 4.4BSD definition of getloadavg.
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lutil" >&5
+$as_echo_n "checking for getloadavg in -lutil... " >&6; }
+if ${ac_cv_lib_util_getloadavg+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lutil  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getloadavg ();
+int
+main ()
+{
+return getloadavg ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_util_getloadavg=yes
+else
+  ac_cv_lib_util_getloadavg=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_getloadavg" >&5
+$as_echo "$ac_cv_lib_util_getloadavg" >&6; }
+if test "x$ac_cv_lib_util_getloadavg" = xyes; then :
+  LIBS="-lutil $LIBS" gl_func_getloadavg_done=yes
+fi
+
+   fi
+
+   if test $gl_func_getloadavg_done = no; then
+     # There is a commonly available library for RS/6000 AIX.
+     # Since it is not a standard part of AIX, it might be installed locally.
+     gl_getloadavg_LIBS=$LIBS
+     LIBS="-L/usr/local/lib $LIBS"
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lgetloadavg" >&5
+$as_echo_n "checking for getloadavg in -lgetloadavg... " >&6; }
+if ${ac_cv_lib_getloadavg_getloadavg+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgetloadavg  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getloadavg ();
+int
+main ()
+{
+return getloadavg ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_getloadavg_getloadavg=yes
+else
+  ac_cv_lib_getloadavg_getloadavg=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_getloadavg_getloadavg" >&5
+$as_echo "$ac_cv_lib_getloadavg_getloadavg" >&6; }
+if test "x$ac_cv_lib_getloadavg_getloadavg" = xyes; then :
+  LIBS="-lgetloadavg $LIBS" gl_func_getloadavg_done=yes
+else
+  LIBS=$gl_getloadavg_LIBS
+fi
+
+   fi
+
+   # Set up the replacement function if necessary.
+   if test $gl_func_getloadavg_done = no; then
+     HAVE_GETLOADAVG=0
+
+     # Solaris has libkstat which does not require root.
+     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5
+$as_echo_n "checking for kstat_open in -lkstat... " >&6; }
+if ${ac_cv_lib_kstat_kstat_open+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lkstat  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char kstat_open ();
+int
+main ()
+{
+return kstat_open ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_kstat_kstat_open=yes
+else
+  ac_cv_lib_kstat_kstat_open=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kstat_kstat_open" >&5
+$as_echo "$ac_cv_lib_kstat_kstat_open" >&6; }
+if test "x$ac_cv_lib_kstat_kstat_open" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBKSTAT 1
+_ACEOF
+
+  LIBS="-lkstat $LIBS"
+
+fi
+
+     test $ac_cv_lib_kstat_kstat_open = yes && gl_func_getloadavg_done=yes
+
+     # AIX has libperfstat which does not require root
+     if test $gl_func_getloadavg_done = no; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perfstat_cpu_total in -lperfstat" >&5
+$as_echo_n "checking for perfstat_cpu_total in -lperfstat... " >&6; }
+if ${ac_cv_lib_perfstat_perfstat_cpu_total+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lperfstat  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char perfstat_cpu_total ();
+int
+main ()
+{
+return perfstat_cpu_total ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_perfstat_perfstat_cpu_total=yes
+else
+  ac_cv_lib_perfstat_perfstat_cpu_total=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_perfstat_perfstat_cpu_total" >&5
+$as_echo "$ac_cv_lib_perfstat_perfstat_cpu_total" >&6; }
+if test "x$ac_cv_lib_perfstat_perfstat_cpu_total" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPERFSTAT 1
+_ACEOF
+
+  LIBS="-lperfstat $LIBS"
+
+fi
+
+       test $ac_cv_lib_perfstat_perfstat_cpu_total = yes && gl_func_getloadavg_done=yes
+     fi
+
+     if test $gl_func_getloadavg_done = no; then
+       ac_fn_c_check_header_mongrel "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes; then :
+  gl_func_getloadavg_done=yes
+
+$as_echo "#define DGUX 1" >>confdefs.h
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dg_sys_info in -ldgc" >&5
+$as_echo_n "checking for dg_sys_info in -ldgc... " >&6; }
+if ${ac_cv_lib_dgc_dg_sys_info+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldgc  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dg_sys_info ();
+int
+main ()
+{
+return dg_sys_info ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dgc_dg_sys_info=yes
+else
+  ac_cv_lib_dgc_dg_sys_info=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dgc_dg_sys_info" >&5
+$as_echo "$ac_cv_lib_dgc_dg_sys_info" >&6; }
+if test "x$ac_cv_lib_dgc_dg_sys_info" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBDGC 1
+_ACEOF
+
+  LIBS="-ldgc $LIBS"
+
+fi
+
+fi
+
+
+     fi
+   fi
+fi
+
+
+if test "x$gl_save_LIBS" = x; then
+  GETLOADAVG_LIBS=$LIBS
+else
+  GETLOADAVG_LIBS=`echo "$LIBS" | sed "s!$gl_save_LIBS!!"`
+fi
+LIBS=$gl_save_LIBS
+
+
+# Test whether the system declares getloadavg. Solaris has the function
+# but declares it in <sys/loadavg.h>, not <stdlib.h>.
+for ac_header in sys/loadavg.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/loadavg.h" "ac_cv_header_sys_loadavg_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_loadavg_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_SYS_LOADAVG_H 1
+_ACEOF
+
+fi
+
+done
+
+if test $ac_cv_header_sys_loadavg_h = yes; then
+  HAVE_SYS_LOADAVG_H=1
+else
+  HAVE_SYS_LOADAVG_H=0
+fi
+ac_fn_c_check_decl "$LINENO" "getloadavg" "ac_cv_have_decl_getloadavg" "#if HAVE_SYS_LOADAVG_H
+    /* OpenIndiana has a bug: <sys/time.h> must be included before
+       <sys/loadavg.h>.  */
+    # include <sys/time.h>
+    # include <sys/loadavg.h>
+    #endif
+    #include <stdlib.h>
+"
+if test "x$ac_cv_have_decl_getloadavg" = xyes; then :
+
+else
+  HAVE_DECL_GETLOADAVG=0
+fi
+
+
+  if test $HAVE_GETLOADAVG = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS getloadavg.$ac_objext"
+
+
+# Figure out what our getloadavg.c needs.
+
+
+
+# On HPUX9, an unprivileged user can get load averages this way.
+if test $gl_func_getloadavg_done = no; then
+  for ac_func in pstat_getdynamic
+do :
+  ac_fn_c_check_func "$LINENO" "pstat_getdynamic" "ac_cv_func_pstat_getdynamic"
+if test "x$ac_cv_func_pstat_getdynamic" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PSTAT_GETDYNAMIC 1
+_ACEOF
+ gl_func_getloadavg_done=yes
+fi
+done
+
+fi
+
+# We cannot check for <dwarf.h>, because Solaris 2 does not use dwarf (it
+# uses stabs), but it is still SVR4.  We cannot check for <elf.h> because
+# Irix 4.0.5F has the header but not the library.
+if test $gl_func_getloadavg_done = no && test "$ac_cv_lib_elf_elf_begin" = yes \
+    && test "$ac_cv_lib_kvm_kvm_open" = yes; then
+  gl_func_getloadavg_done=yes
+
+$as_echo "#define SVR4 1" >>confdefs.h
+
+fi
+
+if test $gl_func_getloadavg_done = no; then
+  ac_fn_c_check_header_mongrel "$LINENO" "inq_stats/cpustats.h" "ac_cv_header_inq_stats_cpustats_h" "$ac_includes_default"
+if test "x$ac_cv_header_inq_stats_cpustats_h" = xyes; then :
+  gl_func_getloadavg_done=yes
+
+$as_echo "#define UMAX 1" >>confdefs.h
+
+
+$as_echo "#define UMAX4_3 1" >>confdefs.h
+
+fi
+
+
+fi
+
+if test $gl_func_getloadavg_done = no; then
+  ac_fn_c_check_header_mongrel "$LINENO" "sys/cpustats.h" "ac_cv_header_sys_cpustats_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_cpustats_h" = xyes; then :
+  gl_func_getloadavg_done=yes; $as_echo "#define UMAX 1" >>confdefs.h
+
+fi
+
+
+fi
+
+if test $gl_func_getloadavg_done = no; then
+  for ac_header in mach/mach.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default"
+if test "x$ac_cv_header_mach_mach_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_MACH_MACH_H 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+for ac_header in nlist.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "nlist.h" "ac_cv_header_nlist_h" "$ac_includes_default"
+if test "x$ac_cv_header_nlist_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_NLIST_H 1
+_ACEOF
+ ac_fn_c_check_member "$LINENO" "struct nlist" "n_un.n_name" "ac_cv_member_struct_nlist_n_un_n_name" "#include <nlist.h>
+"
+if test "x$ac_cv_member_struct_nlist_n_un_n_name" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_NLIST_N_UN_N_NAME 1
+_ACEOF
+
+
+fi
+
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <nlist.h>
+int
+main ()
+{
+struct nlist x;
+                    #ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
+                    x.n_un.n_name = "";
+                    #else
+                    x.n_name = "";
+                    #endif
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+$as_echo "#define N_NAME_POINTER 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+
+done
+
+  fi
+
+
+
+
+
+          GNULIB_GETLOADAVG=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_GETLOADAVG 1" >>confdefs.h
+
+
+
+
+
+
+  ac_found=0
+  ac_fn_c_check_decl "$LINENO" "program_invocation_name" "ac_cv_have_decl_program_invocation_name" "#include <errno.h>
+"
+if test "x$ac_cv_have_decl_program_invocation_name" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PROGRAM_INVOCATION_NAME $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+  ac_found=1
+fi
+
+  ac_fn_c_check_decl "$LINENO" "program_invocation_short_name" "ac_cv_have_decl_program_invocation_short_name" "#include <errno.h>
+"
+if test "x$ac_cv_have_decl_program_invocation_short_name" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+  ac_found=1
+fi
+
+  ac_fn_c_check_decl "$LINENO" "__argv" "ac_cv_have_decl___argv" "#include <stdlib.h>
+"
+if test "x$ac_cv_have_decl___argv" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL___ARGV $ac_have_decl
+_ACEOF
+if test $ac_have_decl = 1; then :
+  ac_found=1
+fi
+
+
+  # Incur the cost of this test only if none of the above worked.
+  if test $ac_found = 0; then
+    # On OpenBSD 5.1, using the global __progname variable appears to be
+    # the only way to implement getprogname.
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether __progname is defined in default libraries" >&5
+$as_echo_n "checking whether __progname is defined in default libraries... " >&6; }
+if ${gl_cv_var___progname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+        gl_cv_var___progname=
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+extern char *__progname;
+int
+main ()
+{
+return *__progname;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gl_cv_var___progname=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_var___progname" >&5
+$as_echo "$gl_cv_var___progname" >&6; }
+    if test "$gl_cv_var___progname" = yes; then
+
+$as_echo "#define HAVE_VAR___PROGNAME 1" >>confdefs.h
+
+    fi
+  fi
+
+
+
+
+
+  # Check the system to see if it provides GNU glob.  If not, use our
+  # local version.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if system libc has GNU glob" >&5
+$as_echo_n "checking if system libc has GNU glob... " >&6; }
+if ${make_cv_sys_gnu_glob+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #include <features.h>
+  #include <glob.h>
+  #include <fnmatch.h>
+  #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+  # include <gnu-versions.h>
+  # if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2
+     gnu glob
+  # endif
+  #endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "gnu glob" >/dev/null 2>&1; then :
+  make_cv_sys_gnu_glob=yes
+else
+  make_cv_sys_gnu_glob=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sys_gnu_glob" >&5
+$as_echo "$make_cv_sys_gnu_glob" >&6; }
+  # Tell automake about this, so it can build the right .c files.
+   if test "$make_cv_sys_gnu_glob" = yes; then
+  USE_SYSTEM_GLOB_TRUE=
+  USE_SYSTEM_GLOB_FALSE='#'
+else
+  USE_SYSTEM_GLOB_TRUE='#'
+  USE_SYSTEM_GLOB_FALSE=
+fi
+
+  # Tell build.sh which to use
+  USE_SYSTEM_GLOB="$make_cv_sys_gnu_glob"
+
+
+
+
+  if test $gl_cv_func_malloc_posix = yes; then
+
+$as_echo "#define HAVE_MALLOC_POSIX 1" >>confdefs.h
+
+  else
+    REPLACE_MALLOC=1
+  fi
+
+  if test $REPLACE_MALLOC = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS malloc.$ac_objext"
+
+  fi
+
+
+
+
+
+          GNULIB_MALLOC_POSIX=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_MALLOC_POSIX 1" >>confdefs.h
+
+
+
+
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS msvc-inval.$ac_objext"
+
+  fi
+
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS msvc-nothrow.$ac_objext"
+
+  fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define GNULIB_MSVC_NOTHROW 1
+_ACEOF
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5
+$as_echo_n "checking for ssize_t... " >&6; }
+if ${gt_cv_ssize_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+int
+main ()
+{
+int x = sizeof (ssize_t *) + sizeof (ssize_t);
+            return !x;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gt_cv_ssize_t=yes
+else
+  gt_cv_ssize_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_ssize_t" >&5
+$as_echo "$gt_cv_ssize_t" >&6; }
+  if test $gt_cv_ssize_t = no; then
+
+$as_echo "#define ssize_t int" >>confdefs.h
+
+  fi
+
+
+
+
+
+          if test "$ac_cv_header_stdbool_h" = yes; then
+    case "$host_os" in
+      solaris*)
+        if test -z "$GCC"; then
+          STDBOOL_H='stdbool.h'
+        else
+          STDBOOL_H=''
+        fi
+        ;;
+      *)
+        STDBOOL_H=''
+        ;;
+    esac
+  else
+    STDBOOL_H='stdbool.h'
+  fi
+
+   if test -n "$STDBOOL_H"; then
+  GL_GENERATE_STDBOOL_H_TRUE=
+  GL_GENERATE_STDBOOL_H_FALSE='#'
+else
+  GL_GENERATE_STDBOOL_H_TRUE='#'
+  GL_GENERATE_STDBOOL_H_FALSE=
+fi
+
+
+  if test "$ac_cv_type__Bool" = yes; then
+    HAVE__BOOL=1
+  else
+    HAVE__BOOL=0
+  fi
+
+
+
+
+
+  STDDEF_H=
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for good max_align_t" >&5
+$as_echo_n "checking for good max_align_t... " >&6; }
+if ${gl_cv_type_max_align_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+            unsigned int s = sizeof (max_align_t);
+            #if defined __GNUC__ || defined __IBM__ALIGNOF__
+            int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+            int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+            #endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_type_max_align_t=yes
+else
+  gl_cv_type_max_align_t=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_type_max_align_t" >&5
+$as_echo "$gl_cv_type_max_align_t" >&6; }
+  if test $gl_cv_type_max_align_t = no; then
+    HAVE_MAX_ALIGN_T=0
+    STDDEF_H=stddef.h
+  fi
+
+  if test $gt_cv_c_wchar_t = no; then
+    HAVE_WCHAR_T=0
+    STDDEF_H=stddef.h
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NULL can be used in arbitrary expressions" >&5
+$as_echo_n "checking whether NULL can be used in arbitrary expressions... " >&6; }
+if ${gl_cv_decl_null_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+      int test[2 * (sizeof NULL == sizeof (void *)) -1];
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_decl_null_works=yes
+else
+  gl_cv_decl_null_works=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_decl_null_works" >&5
+$as_echo "$gl_cv_decl_null_works" >&6; }
+  if test $gl_cv_decl_null_works = no; then
+    REPLACE_NULL=1
+    STDDEF_H=stddef.h
+  fi
+
+
+   if test -n "$STDDEF_H"; then
+  GL_GENERATE_STDDEF_H_TRUE=
+  GL_GENERATE_STDDEF_H_FALSE='#'
+else
+  GL_GENERATE_STDDEF_H_TRUE='#'
+  GL_GENERATE_STDDEF_H_FALSE=
+fi
+
+  if test -n "$STDDEF_H"; then
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stddef_h='<'stddef.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stddef.h>" >&5
+$as_echo_n "checking absolute name of <stddef.h>... " >&6; }
+if ${gl_cv_next_stddef_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stddef.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stddef.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stddef_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stddef_h
+           gl_cv_next_stddef_h='"'$gl_header'"'
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stddef_h" >&5
+$as_echo "$gl_cv_next_stddef_h" >&6; }
+     fi
+     NEXT_STDDEF_H=$gl_cv_next_stddef_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stddef.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stddef_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDDEF_H=$gl_next_as_first_directive
+
+
+
+
+  fi
+
+
+
+
+  $as_echo "#define __USE_MINGW_ANSI_STDIO 1" >>confdefs.h
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stdio_h='<'stdio.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdio.h>" >&5
+$as_echo_n "checking absolute name of <stdio.h>... " >&6; }
+if ${gl_cv_next_stdio_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stdio.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stdio_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stdio_h
+           gl_cv_next_stdio_h='"'$gl_header'"'
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdio_h" >&5
+$as_echo "$gl_cv_next_stdio_h" >&6; }
+     fi
+     NEXT_STDIO_H=$gl_cv_next_stdio_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stdio.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stdio_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDIO_H=$gl_next_as_first_directive
+
+
+
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking which flavor of printf attribute matches inttypes macros" >&5
+$as_echo_n "checking which flavor of printf attribute matches inttypes macros... " >&6; }
+if ${gl_cv_func_printf_attribute_flavor+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #define __STDC_FORMAT_MACROS 1
+       #include <stdio.h>
+       #include <inttypes.h>
+       /* For non-mingw systems, compilation will trivially succeed.
+          For mingw, compilation will succeed for older mingw (system
+          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+       #if (defined _WIN32 && ! defined __CYGWIN__) && \
+         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+       #endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gl_cv_func_printf_attribute_flavor=system
+else
+  gl_cv_func_printf_attribute_flavor=gnu
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_printf_attribute_flavor" >&5
+$as_echo "$gl_cv_func_printf_attribute_flavor" >&6; }
+  if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+
+$as_echo "#define GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU 1" >>confdefs.h
+
+  fi
+
+      GNULIB_FSCANF=1
+
+
+cat >>confdefs.h <<_ACEOF
+#define GNULIB_FSCANF 1
+_ACEOF
+
+
+  GNULIB_SCANF=1
+
+
+cat >>confdefs.h <<_ACEOF
+#define GNULIB_SCANF 1
+_ACEOF
+
+
+  GNULIB_FGETC=1
+  GNULIB_GETC=1
+  GNULIB_GETCHAR=1
+  GNULIB_FGETS=1
+  GNULIB_FREAD=1
+
+
+      GNULIB_FPRINTF=1
+  GNULIB_PRINTF=1
+  GNULIB_VFPRINTF=1
+  GNULIB_VPRINTF=1
+  GNULIB_FPUTC=1
+  GNULIB_PUTC=1
+  GNULIB_PUTCHAR=1
+  GNULIB_FPUTS=1
+  GNULIB_PUTS=1
+  GNULIB_FWRITE=1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_stdlib_h='<'stdlib.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <stdlib.h>" >&5
+$as_echo_n "checking absolute name of <stdlib.h>... " >&6; }
+if ${gl_cv_next_stdlib_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'stdlib.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_stdlib_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_stdlib_h
+           gl_cv_next_stdlib_h='"'$gl_header'"'
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_stdlib_h" >&5
+$as_echo "$gl_cv_next_stdlib_h" >&6; }
+     fi
+     NEXT_STDLIB_H=$gl_cv_next_stdlib_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'stdlib.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_stdlib_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_STDLIB_H=$gl_next_as_first_directive
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  for ac_func in stpcpy
+do :
+  ac_fn_c_check_func "$LINENO" "stpcpy" "ac_cv_func_stpcpy"
+if test "x$ac_cv_func_stpcpy" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STPCPY 1
+_ACEOF
+
+fi
+done
+
+  if test $ac_cv_func_stpcpy = no; then
+    HAVE_STPCPY=0
+  fi
+
+  if test $HAVE_STPCPY = 0; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS stpcpy.$ac_objext"
+
+
+  :
+
+  fi
+
+
+
+
+
+          GNULIB_STPCPY=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_STPCPY 1" >>confdefs.h
+
+
+
+
+
+
+
+
+  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strerror function" >&5
+$as_echo_n "checking for working strerror function... " >&6; }
+if ${gl_cv_func_working_strerror+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+                          # Guess yes on glibc systems.
+           *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
+                          # Guess yes on musl systems.
+           *-musl*)       gl_cv_func_working_strerror="guessing yes" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+           *)             gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
+         esac
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+int
+main ()
+{
+if (!*strerror (-2)) return 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  gl_cv_func_working_strerror=yes
+else
+  gl_cv_func_working_strerror=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_working_strerror" >&5
+$as_echo "$gl_cv_func_working_strerror" >&6; }
+    case "$gl_cv_func_working_strerror" in
+      *yes) ;;
+      *)
+                        REPLACE_STRERROR=1
+        ;;
+    esac
+
+  else
+            REPLACE_STRERROR=1
+  fi
+
+  if test $REPLACE_STRERROR = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strerror.$ac_objext"
+
+  fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define GNULIB_STRERROR 1
+_ACEOF
+
+
+
+
+
+
+
+          GNULIB_STRERROR=1
+
+
+
+
+
+$as_echo "#define GNULIB_TEST_STRERROR 1" >>confdefs.h
+
+
+
+
+
+  if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
+
+
+
+
+
+
+
+
+  gl_LIBOBJS="$gl_LIBOBJS strerror-override.$ac_objext"
+
+
+
+
+
+  if test $ac_cv_header_sys_socket_h != yes; then
+                    for ac_header in winsock2.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_WINSOCK2_H 1
+_ACEOF
+
+fi
+
+done
+
+  fi
+  if test "$ac_cv_header_winsock2_h" = yes; then
+    HAVE_WINSOCK2_H=1
+    UNISTD_H_HAVE_WINSOCK2_H=1
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+  else
+    HAVE_WINSOCK2_H=0
+  fi
+
+
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+     if test $gl_cv_have_include_next = yes; then
+       gl_cv_next_unistd_h='<'unistd.h'>'
+     else
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking absolute name of <unistd.h>" >&5
+$as_echo_n "checking absolute name of <unistd.h>... " >&6; }
+if ${gl_cv_next_unistd_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+             if test $ac_cv_header_unistd_h = yes; then
+
+
+
+
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+_ACEOF
+                case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+
+  case "$host_os" in
+    mingw*)
+                                          gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+      gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo 'unistd.h' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+
+        gl_cv_absolute_unistd_h=`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&5 |
+  sed -n "$gl_absolute_header_sed"`
+
+           gl_header=$gl_cv_absolute_unistd_h
+           gl_cv_next_unistd_h='"'$gl_header'"'
+          else
+               gl_cv_next_unistd_h='<'unistd.h'>'
+             fi
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_next_unistd_h" >&5
+$as_echo "$gl_cv_next_unistd_h" >&6; }
+     fi
+     NEXT_UNISTD_H=$gl_cv_next_unistd_h
+
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'unistd.h'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=$gl_cv_next_unistd_h
+     fi
+     NEXT_AS_FIRST_DIRECTIVE_UNISTD_H=$gl_next_as_first_directive
+
+
+
+
+  if test $ac_cv_header_unistd_h = yes; then
+    HAVE_UNISTD_H=1
+  else
+    HAVE_UNISTD_H=0
+  fi
+
+
+
+
+
+
+
+
+
+
+  :
+  # End of code from modules
+
+
+
+
+
+
+
+
+
+  gltests_libdeps=
+  gltests_ltlibdeps=
+
+
+
+
+
+
+
+
+
+  gl_source_base='tests'
+  gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+
+  gl_module_indicator_condition=$gltests_WITNESS
+
+
+
+
+
+
+
+
+
+  LIBGNU_LIBDEPS="$gl_libdeps"
+
+  LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+# Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="ar"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Perl is needed for the test suite (only)
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PERL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PERL"; then
+  ac_cv_prog_PERL="$PERL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_PERL="perl"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_PERL" && ac_cv_prog_PERL="perl"
+fi
+fi
+PERL=$ac_cv_prog_PERL
+if test -n "$PERL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+$as_echo "$PERL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+# Specialized system macros
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
+if ${ac_cv_search_strerror+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_strerror=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_strerror+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_strerror+:} false; then :
+
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+              not a universal capable compiler
+            #endif
+            typedef int dummy;
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+       # Check for potential -arch flags.  It is not universal unless
+       # there are at least two -arch flags with different values.
+       ac_arch=
+       ac_prev=
+       for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+        if test -n "$ac_prev"; then
+          case $ac_word in
+            i?86 | x86_64 | ppc | ppc64)
+              if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+                ac_arch=$ac_word
+              else
+                ac_cv_c_bigendian=universal
+                break
+              fi
+              ;;
+          esac
+          ac_prev=
+        elif test "x$ac_word" = "x-arch"; then
+          ac_prev=arch
+        fi
+       done
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+            #include <sys/param.h>
+
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+                    && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+                    && LITTLE_ENDIAN)
+             bogus endian macros
+            #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+               #include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+                not big endian
+               #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+             bogus endian macros
+            #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+                not big endian
+               #endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
+else
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+                 { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+               short int ascii_ii[] =
+                 { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+               int use_ascii (int i) {
+                 return ascii_mm[i] + ascii_ii[i];
+               }
+               short int ebcdic_ii[] =
+                 { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+               short int ebcdic_mm[] =
+                 { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+               int use_ebcdic (int i) {
+                 return ebcdic_mm[i] + ebcdic_ii[i];
+               }
+               extern int foo;
+
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+             ac_cv_c_bigendian=yes
+           fi
+           if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+             if test "$ac_cv_c_bigendian" = unknown; then
+               ac_cv_c_bigendian=no
+             else
+               # finding both strings is unlikely to happen, but who knows?
+               ac_cv_c_bigendian=unknown
+             fi
+           fi
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+            /* Are we little or big endian?  From Harbison&Steele.  */
+            union
+            {
+              long int l;
+              char c[sizeof (long int)];
+            } u;
+            u.l = 1;
+            return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
+else
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+
+# Enable gettext, in "external" mode.
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+$as_echo_n "checking whether NLS is requested... " >&6; }
+    # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then :
+  enableval=$enable_nls; USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+
+
+
+
+      GETTEXT_MACRO_VERSION=0.19
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGFMT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GMSGFMT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+$as_echo "$GMSGFMT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+    rm -f messages.po
+
+    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGMERGE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+        test -n "$localedir" || localedir='${datadir}/locale'
+
+
+    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+  ac_config_commands="$ac_config_commands po-directories"
+
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${acl_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$acl_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break
+        ;;
+      *)
+        test "$with_gnu_ld" != yes && break
+        ;;
+      esac
+    fi
+  done
+  IFS="$acl_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${acl_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes
+  ;;
+*)
+  acl_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+$as_echo "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+$as_echo_n "checking for shared library run path origin... " >&6; }
+if ${acl_cv_rpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+$as_echo "$acl_cv_rpath" >&6; }
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath was given.
+if test "${enable_rpath+set}" = set; then :
+  enableval=$enable_rpath; :
+else
+  enable_rpath=yes
+fi
+
+
+
+
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+  gl_cv_solaris_64bit=yes
+else
+  gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS=   }"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then :
+  withval=$with_libiconv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  LIBICONV_PREFIX=
+      HAVE_LIBICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
+if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <CoreFoundation/CFPreferences.h>
+int
+main ()
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_func_CFPreferencesCopyAppValue=yes
+else
+  gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+
+  fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
+if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <CoreFoundation/CFLocale.h>
+int
+main ()
+{
+CFLocaleCopyCurrent();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_func_CFLocaleCopyCurrent=yes
+else
+  gt_cv_func_CFLocaleCopyCurrent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+
+  fi
+  INTL_MACOSX_LIBS=
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+  fi
+
+
+
+
+
+
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+    case " $gt_needs " in
+    *" need-formatstring-macros "*) gt_api_version=3 ;;
+    *" need-ngettext "*) gt_api_version=2 ;;
+    *) gt_api_version=1 ;;
+  esac
+  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+    if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+
+
+        if test $gt_api_version -ge 3; then
+          gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+'
+        else
+          gt_revision_test_code=
+        fi
+        if test $gt_api_version -ge 2; then
+          gt_expression_test_code=' + * ngettext ("", "", 0)'
+        else
+          gt_expression_test_code=
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+$as_echo_n "checking for GNU gettext in libc... " >&6; }
+if eval \${$gt_func_gnugettext_libc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$gt_func_gnugettext_libc=yes"
+else
+  eval "$gt_func_gnugettext_libc=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$gt_func_gnugettext_libc
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+$as_echo_n "checking for iconv... " >&6; }
+if ${am_cv_func_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+$as_echo "$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+$as_echo_n "checking for working iconv... " >&6; }
+if ${am_cv_func_iconv_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+                  am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main ()
+{
+int result = 0;
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    result |= 16;
+  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+$as_echo "$am_cv_func_iconv_works" >&6; }
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+$as_echo_n "checking how to link with libiconv... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+$as_echo "$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then :
+  withval=$with_libintl_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBINTL=
+  LTLIBINTL=
+  INCINTL=
+  LIBINTL_PREFIX=
+      HAVE_LIBINTL=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='intl '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+              else
+                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'intl'; then
+                  LIBINTL_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'intl'; then
+                  LIBINTL_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+    done
+  fi
 
-#if defined S_ISLNK && defined S_IFREG
-extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
-#endif
 
-#if defined S_ISSOCK && defined S_IFREG
-extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
-#endif
 
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stat_broken=no
-else
-  ac_cv_header_stat_broken=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
-$as_echo "$ac_cv_header_stat_broken" >&6; }
-if test $ac_cv_header_stat_broken = yes; then
 
-$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h
 
-fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
-$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
-if ${ac_cv_header_time+:} false; then :
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+$as_echo_n "checking for GNU gettext in libintl... " >&6; }
+if eval \${$gt_func_gnugettext_libintl+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
 
 int
 main ()
 {
-if ((struct tm *) 0)
-return 0;
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_time=yes
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$gt_func_gnugettext_libintl=yes"
 else
-  ac_cv_header_time=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
-$as_echo "$ac_cv_header_time" >&6; }
-if test $ac_cv_header_time = yes; then
-
-$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
-
-fi
-
-for ac_header in stdlib.h locale.h unistd.h limits.h fcntl.h string.h \
-                  memory.h sys/param.h sys/resource.h sys/time.h sys/timeb.h \
-                  sys/select.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
+  eval "$gt_func_gnugettext_libintl=no"
 fi
-
-done
-
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if ${ac_cv_c_const+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+                        if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
 int
 main ()
 {
 
-#ifndef __cplusplus
-  /* Ultrix mips cc rejects this sort of thing.  */
-  typedef int charset[2];
-  const charset cs = { 0, 0 };
-  /* SunOS 4.1.1 cc rejects this.  */
-  char const *const *pcpcc;
-  char **ppc;
-  /* NEC SVR4.0.2 mips cc rejects this.  */
-  struct point {int x, y;};
-  static struct point const zero = {0,0};
-  /* AIX XL C 1.02.0.0 rejects this.
-     It does not let you subtract one const X* pointer from another in
-     an arm of an if-expression whose if-part is not a constant
-     expression */
-  const char *g = "string";
-  pcpcc = &g + (g ? g-g : 0);
-  /* HPUX 7.0 cc rejects these. */
-  ++pcpcc;
-  ppc = (char**) pcpcc;
-  pcpcc = (char const *const *) ppc;
-  { /* SCO 3.2v4 cc rejects this sort of thing.  */
-    char tx;
-    char *t = &tx;
-    char const *s = 0 ? (char *) 0 : (char const *) 0;
-
-    *t++ = 0;
-    if (s) return 0;
-  }
-  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
-    int x[] = {25, 17};
-    const int *foo = &x[0];
-    ++foo;
-  }
-  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
-    typedef const int *iptr;
-    iptr p = 0;
-    ++p;
-  }
-  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
-    struct s { int j; const int *ap[3]; } bx;
-    struct s *b = &bx; b->j = 5;
-  }
-  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
-    const int foo = 10;
-    if (!foo) return 0;
-  }
-  return !cs[0] && !zero.x;
-#endif
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
 
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_const=yes
-else
-  ac_cv_c_const=no
+if ac_fn_c_try_link "$LINENO"; then :
+  LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
-if test $ac_cv_c_const = no; then
+eval ac_res=\$$gt_func_gnugettext_libintl
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+        fi
 
-$as_echo "#define const /**/" >>confdefs.h
+                                        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+                    LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
 
-fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
-$as_echo_n "checking return type of signal handlers... " >&6; }
-if ${ac_cv_type_signal+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <signal.h>
 
-int
-main ()
-{
-return *(signal (0, 0)) (0) == 1;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_type_signal=int
-else
-  ac_cv_type_signal=void
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
-$as_echo "$ac_cv_type_signal" >&6; }
+    if test -n "$INTL_MACOSX_LIBS"; then
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+      fi
+    fi
 
-cat >>confdefs.h <<_ACEOF
-#define RETSIGTYPE $ac_cv_type_signal
-_ACEOF
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
 
+$as_echo "#define ENABLE_NLS 1" >>confdefs.h
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
-$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
-if ${ac_cv_type_uid_t+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+$as_echo_n "checking whether to use NLS... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+  if test "$USE_NLS" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+$as_echo_n "checking where the gettext function comes from... " >&6; }
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+$as_echo "$gt_source" >&6; }
+  fi
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "uid_t" >/dev/null 2>&1; then :
-  ac_cv_type_uid_t=yes
-else
-  ac_cv_type_uid_t=no
-fi
-rm -f conftest*
+  if test "$USE_NLS" = "yes"; then
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
-$as_echo "$ac_cv_type_uid_t" >&6; }
-if test $ac_cv_type_uid_t = no; then
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+$as_echo_n "checking how to link with libintl... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+$as_echo "$LIBINTL" >&6; }
 
-$as_echo "#define uid_t int" >>confdefs.h
+  for element in $INCINTL; do
+    haveit=
+    for x in $CPPFLAGS; do
 
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
 
-$as_echo "#define gid_t int" >>confdefs.h
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
 
-fi
+      fi
 
-ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
-if test "x$ac_cv_type_pid_t" = xyes; then :
 
-else
+$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define pid_t int
-_ACEOF
 
-fi
+$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
 
-ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
-if test "x$ac_cv_type_off_t" = xyes; then :
+    fi
 
-else
+        POSUB=po
+  fi
 
-cat >>confdefs.h <<_ACEOF
-#define off_t long int
-_ACEOF
 
-fi
 
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
+    INTLLIBS="$LIBINTL"
 
-else
 
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
 
-fi
 
-ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
-if test "x$ac_cv_type_ssize_t" = xyes; then :
 
-else
 
-cat >>confdefs.h <<_ACEOF
-#define ssize_t int
-_ACEOF
 
+# This test must come as early as possible after the compiler configuration
+# tests, because the choice of the file model can (in principle) affect
+# whether functions and headers are available, whether they work, etc.
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
 fi
 
+if test "$enable_largefile" != no; then
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
-$as_echo_n "checking for unsigned long long int... " >&6; }
-if ${ac_cv_type_unsigned_long_long_int+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_cv_type_unsigned_long_long_int=yes
-     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
-       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-  /* For now, do not test the preprocessor; as of 2007 there are too many
-         implementations with broken preprocessors.  Perhaps this can
-         be revisited in 2012.  In the meantime, code should not expect
-         #if to work with literals wider than 32 bits.  */
-      /* Test literals.  */
-      long long int ll = 9223372036854775807ll;
-      long long int nll = -9223372036854775807LL;
-      unsigned long long int ull = 18446744073709551615ULL;
-      /* Test constant expressions.   */
-      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
-                     ? 1 : -1)];
-      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
-                     ? 1 : -1)];
-      int i = 63;
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
 int
 main ()
 {
-/* Test availability of runtime routines for shift and division.  */
-      long long int llmax = 9223372036854775807ll;
-      unsigned long long int ullmax = 18446744073709551615ull;
-      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
-              | (llmax / ll) | (llmax % ll)
-              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
-              | (ullmax / ull) | (ullmax % ull));
+
   ;
   return 0;
 }
-
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-
-else
-  ac_cv_type_unsigned_long_long_int=no
+        if ac_fn_c_try_compile "$LINENO"; then :
+  break
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     fi
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
-$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
-  if test $ac_cv_type_unsigned_long_long_int = yes; then
-
-$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
-
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
   fi
 
-
-
-  ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default"
-if test "x$ac_cv_type_uintmax_t" = xyes; then :
-
-$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h
-
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  test $ac_cv_type_unsigned_long_long_int = yes \
-       && ac_type='unsigned long long int' \
-       || ac_type='unsigned long int'
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
-cat >>confdefs.h <<_ACEOF
-#define uintmax_t $ac_type
+  ;
+  return 0;
+}
 _ACEOF
-
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
 
-
-
-# Find out whether our struct stat returns nanosecond resolution timestamps.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanoseconds field of struct stat" >&5
-$as_echo_n "checking for nanoseconds field of struct stat... " >&6; }
-if ${ac_cv_struct_st_mtim_nsec+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_save_CPPFLAGS="$CPPFLAGS"
-    ac_cv_struct_st_mtim_nsec=no
-    # st_mtim.tv_nsec -- the usual case
-    # st_mtim._tv_nsec -- Solaris 2.6, if
-    #  (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1
-    #   && !defined __EXTENSIONS__)
-    # st_mtim.st__tim.tv_nsec -- UnixWare 2.1.2
-    # st_mtime_n -- AIX 5.2 and above
-    # st_mtimespec.tv_nsec -- Darwin (Mac OSX)
-    for ac_val in st_mtim.tv_nsec st_mtim._tv_nsec st_mtim.st__tim.tv_nsec st_mtime_n st_mtimespec.tv_nsec; do
-      CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <sys/types.h>
-#include <sys/stat.h>
-
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
 int
 main ()
 {
-struct stat s; s.ST_MTIM_NSEC;
+
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_struct_st_mtim_nsec=$ac_val; break
+  ac_cv_sys_large_files=no; break
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    done
-    CPPFLAGS="$ac_save_CPPFLAGS"
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_st_mtim_nsec" >&5
-$as_echo "$ac_cv_struct_st_mtim_nsec" >&6; }
-
-  if test $ac_cv_struct_st_mtim_nsec != no; then
-
-cat >>confdefs.h <<_ACEOF
-#define ST_MTIM_NSEC $ac_cv_struct_st_mtim_nsec
-_ACEOF
-
-  fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use high resolution file timestamps" >&5
-$as_echo_n "checking whether to use high resolution file timestamps... " >&6; }
-if ${make_cv_file_timestamp_hi_res+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-   make_cv_file_timestamp_hi_res=no
-  if test "$ac_cv_struct_st_mtim_nsec" != no; then :
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
 int
 main ()
 {
-char a[0x7fffffff < (uintmax_t)-1 >> 30 ? 1 : -1];
+
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  make_cv_file_timestamp_hi_res=yes
+  ac_cv_sys_large_files=1; break
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_file_timestamp_hi_res" >&5
-$as_echo "$make_cv_file_timestamp_hi_res" >&6; }
-if test "$make_cv_file_timestamp_hi_res" = yes; then :
-  val=1
-else
-  val=0
+  ac_cv_sys_large_files=unknown
+  break
+done
 fi
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
 cat >>confdefs.h <<_ACEOF
-#define FILE_TIMESTAMP_HI_RES $val
+#define _LARGE_FILES $ac_cv_sys_large_files
 _ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
 
 
-if test "$make_cv_file_timestamp_hi_res" = yes; then :
-   # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
-  # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
-$as_echo_n "checking for library containing clock_gettime... " >&6; }
-if ${ac_cv_search_clock_gettime+:} false; then :
+fi
+
+
+# Checks for libraries.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getpwnam" >&5
+$as_echo_n "checking for library containing getpwnam... " >&6; }
+if ${ac_cv_search_getpwnam+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_func_search_save_LIBS=$LIBS
@@ -9017,16 +15263,16 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char clock_gettime ();
+char getpwnam ();
 int
 main ()
 {
-return clock_gettime ();
+return getpwnam ();
   ;
   return 0;
 }
 _ACEOF
-for ac_lib in '' rt posix4; do
+for ac_lib in '' sun; do
   if test -z "$ac_lib"; then
     ac_res="none required"
   else
@@ -9034,53 +15280,43 @@ for ac_lib in '' rt posix4; do
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
   fi
   if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_clock_gettime=$ac_res
+  ac_cv_search_getpwnam=$ac_res
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext
-  if ${ac_cv_search_clock_gettime+:} false; then :
+  if ${ac_cv_search_getpwnam+:} false; then :
   break
 fi
 done
-if ${ac_cv_search_clock_gettime+:} false; then :
+if ${ac_cv_search_getpwnam+:} false; then :
 
 else
-  ac_cv_search_clock_gettime=no
+  ac_cv_search_getpwnam=no
 fi
 rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
-$as_echo "$ac_cv_search_clock_gettime" >&6; }
-ac_res=$ac_cv_search_clock_gettime
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getpwnam" >&5
+$as_echo "$ac_cv_search_getpwnam" >&6; }
+ac_res=$ac_cv_search_getpwnam
 if test "$ac_res" != no; then :
   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
 
-  if test "$ac_cv_search_clock_gettime" != no; then :
-
-$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
-
-
-fi
-
-fi
-
-# Check for DOS-style pathnames.
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system uses MSDOS-style paths" >&5
-$as_echo_n "checking whether system uses MSDOS-style paths... " >&6; }
-if ${ac_cv_dos_paths+:} false; then :
+# Checks for header files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __EMX__ && !defined __MSYS__ && !defined __CYGWIN__
-neither MSDOS nor Windows nor OS2
-#endif
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
 
 int
 main ()
@@ -9091,1494 +15327,1516 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_dos_paths=yes
+  ac_cv_header_stdc=yes
 else
-  ac_cv_dos_paths=no
+  ac_cv_header_stdc=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_dos_paths" >&5
-$as_echo "$ac_cv_dos_paths" >&6; }
 
-  if test x"$ac_cv_dos_paths" = xyes; then :
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DOS_PATHS 1
 _ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
 
+else
+  ac_cv_header_stdc=no
 fi
+rm -f conftest*
 
+fi
 
-# See if we have a standard version of gettimeofday().  Since actual
-# implementations can differ, just make sure we have the most common
-# one.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for standard gettimeofday" >&5
-$as_echo_n "checking for standard gettimeofday... " >&6; }
-if ${ac_cv_func_gettimeofday+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_func_gettimeofday=no
-   if test "$cross_compiling" = yes; then :
-  ac_cv_func_gettimeofday="no (cross-compiling)"
-else
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/time.h>
-                  int main ()
-                  {
-                    struct timeval t; t.tv_sec = -1; t.tv_usec = -1;
-                    exit (gettimeofday (&t, 0) != 0
-                          || t.tv_sec < 0 || t.tv_usec < 0);
-                  }
+#include <stdlib.h>
+
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_gettimeofday=yes
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
 else
-  ac_cv_func_gettimeofday=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+  ac_cv_header_stdc=no
 fi
+rm -f conftest*
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gettimeofday" >&5
-$as_echo "$ac_cv_func_gettimeofday" >&6; }
-if test "$ac_cv_func_gettimeofday" = yes; then :
-
-$as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
-
 
-fi
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
 
-for ac_func in strdup strndup mkstemp mktemp fdopen fileno \
-                dup dup2 getcwd realpath sigsetmask sigaction \
-                getgroups seteuid setegid setlinebuf setreuid setregid \
-                getrlimit setrlimit setvbuf pipe strerror strsignal \
-                lstat readlink atexit isatty ttyname pselect
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
 _ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
 
-fi
-done
-
-
-# We need to check declarations, not just existence, because on Tru64 this
-# function is not declared without special flags, which themselves cause
-# other problems.  We'll just use our own.
-ac_fn_c_check_decl "$LINENO" "bsd_signal" "ac_cv_have_decl_bsd_signal" "#define _GNU_SOURCE 1
-#include <signal.h>
-"
-if test "x$ac_cv_have_decl_bsd_signal" = xyes; then :
-  ac_have_decl=1
 else
-  ac_have_decl=0
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_BSD_SIGNAL $ac_have_decl
-_ACEOF
-
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
 
-for ac_header in vfork.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
-if test "x$ac_cv_header_vfork_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VFORK_H 1
-_ACEOF
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
 
 fi
 
-done
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
 
-for ac_func in fork vfork
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_ac_Header=yes"
+else
+  eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
 _ACEOF
 
+ac_header_dirent=$ac_hdr; break
 fi
-done
 
-if test "x$ac_cv_func_fork" = xyes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
-$as_echo_n "checking for working fork... " >&6; }
-if ${ac_cv_func_fork_works+:} false; then :
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_func_fork_works=cross
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-$ac_includes_default
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
 int
 main ()
 {
-
-         /* By Ruediger Kuhlmann. */
-         return fork () < 0;
-
+return opendir ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_fork_works=yes
+for ac_lib in '' dir; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
 else
-  ac_cv_func_fork_works=no
+  ac_cv_search_opendir=no
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
-$as_echo "$ac_cv_func_fork_works" >&6; }
 
 else
-  ac_cv_func_fork_works=$ac_cv_func_fork
-fi
-if test "x$ac_cv_func_fork_works" = xcross; then
-  case $host in
-    *-*-amigaos* | *-*-msdosdjgpp*)
-      # Override, as these systems have only a dummy fork() stub
-      ac_cv_func_fork_works=no
-      ;;
-    *)
-      ac_cv_func_fork_works=yes
-      ;;
-  esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
-$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
-fi
-ac_cv_func_vfork_works=$ac_cv_func_vfork
-if test "x$ac_cv_func_vfork" = xyes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
-$as_echo_n "checking for working vfork... " >&6; }
-if ${ac_cv_func_vfork_works+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_func_vfork_works=cross
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-/* Thanks to Paul Eggert for this test.  */
-$ac_includes_default
-#include <sys/wait.h>
-#ifdef HAVE_VFORK_H
-# include <vfork.h>
-#endif
-/* On some sparc systems, changes by the child to local and incoming
-   argument registers are propagated back to the parent.  The compiler
-   is told about this with #include <vfork.h>, but some compilers
-   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
-   static variable whose address is put into a register that is
-   clobbered by the vfork.  */
-static void
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
-sparc_address_test (int arg)
-# else
-sparc_address_test (arg) int arg;
+extern "C"
 #endif
-{
-  static pid_t child;
-  if (!child) {
-    child = vfork ();
-    if (child < 0) {
-      perror ("vfork");
-      _exit(2);
-    }
-    if (!child) {
-      arg = getpid();
-      write(-1, "", 0);
-      _exit (arg);
-    }
-  }
-}
-
+char opendir ();
 int
 main ()
 {
-  pid_t parent = getpid ();
-  pid_t child;
-
-  sparc_address_test (0);
-
-  child = vfork ();
-
-  if (child == 0) {
-    /* Here is another test for sparc vfork register problems.  This
-       test uses lots of local variables, at least as many local
-       variables as main has allocated so far including compiler
-       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
-       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
-       reuse the register of parent for one of the local variables,
-       since it will think that parent can't possibly be used any more
-       in this routine.  Assigning to the local variable will thus
-       munge parent in the parent process.  */
-    pid_t
-      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
-      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
-    /* Convince the compiler that p..p7 are live; otherwise, it might
-       use the same hardware register for all 8 local variables.  */
-    if (p != p1 || p != p2 || p != p3 || p != p4
-       || p != p5 || p != p6 || p != p7)
-      _exit(1);
-
-    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
-       from child file descriptors.  If the child closes a descriptor
-       before it execs or exits, this munges the parent's descriptor
-       as well.  Test for this by closing stdout in the child.  */
-    _exit(close(fileno(stdout)) != 0);
-  } else {
-    int status;
-    struct stat st;
-
-    while (wait(&status) != child)
-      ;
-    return (
-        /* Was there some problem with vforking?  */
-        child < 0
-
-        /* Did the child fail?  (This shouldn't happen.)  */
-        || status
-
-        /* Did the vfork/compiler bug occur?  */
-        || parent != getpid()
-
-        /* Did the file descriptor bug occur?  */
-        || fstat(fileno(stdout), &st) != 0
-        );
-  }
+return opendir ();
+  ;
+  return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_vfork_works=yes
-else
-  ac_cv_func_vfork_works=no
+for ac_lib in '' x; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
 fi
+done
+if ${ac_cv_search_opendir+:} false; then :
 
+else
+  ac_cv_search_opendir=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
-$as_echo "$ac_cv_func_vfork_works" >&6; }
-
-fi;
-if test "x$ac_cv_func_fork_works" = xcross; then
-  ac_cv_func_vfork_works=$ac_cv_func_vfork
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
-$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
-if test "x$ac_cv_func_vfork_works" = xyes; then
+fi
 
-$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
+fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
+$as_echo_n "checking whether stat file-mode macros are broken... " >&6; }
+if ${ac_cv_header_stat_broken+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/stat.h>
 
-$as_echo "#define vfork fork" >>confdefs.h
-
-fi
-if test "x$ac_cv_func_fork_works" = xyes; then
+#if defined S_ISBLK && defined S_IFDIR
+extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
+#endif
 
-$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
+#if defined S_ISBLK && defined S_IFCHR
+extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
+#endif
 
-fi
+#if defined S_ISLNK && defined S_IFREG
+extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
+#endif
 
+#if defined S_ISSOCK && defined S_IFREG
+extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
+#endif
 
-if ${ac_cv_func_setvbuf_reversed+:} false; then :
-  $as_echo_n "(cached) " >&6
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stat_broken=no
 else
-  ac_cv_func_setvbuf_reversed=no
+  ac_cv_header_stat_broken=yes
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
+$as_echo "$ac_cv_header_stat_broken" >&6; }
+if test $ac_cv_header_stat_broken = yes; then
 
-
-
-# Rumor has it that strcasecmp lives in -lresolv on some odd systems.
-# It doesn't hurt much to use our own if we can't find it so I don't
-# make the effort here.
-for ac_func in strcasecmp strncasecmp strcmpi strncmpi stricmp strnicmp
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+$as_echo "#define STAT_MACROS_BROKEN 1" >>confdefs.h
 
 fi
-done
-
 
-# strcoll() is used by the GNU glob library
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strcoll" >&5
-$as_echo_n "checking for working strcoll... " >&6; }
-if ${ac_cv_func_strcoll_works+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
   $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_func_strcoll_works=no
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-$ac_includes_default
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
 int
 main ()
 {
-return (strcoll ("abc", "def") >= 0 ||
-        strcoll ("ABC", "DEF") >= 0 ||
-        strcoll ("123", "456") >= 0)
+if ((struct tm *) 0)
+return 0;
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_strcoll_works=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_time=yes
 else
-  ac_cv_func_strcoll_works=no
+  ac_cv_header_time=no
 fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strcoll_works" >&5
-$as_echo "$ac_cv_func_strcoll_works" >&6; }
-if test $ac_cv_func_strcoll_works = yes; then
 
-$as_echo "#define HAVE_STRCOLL 1" >>confdefs.h
+for ac_header in stdlib.h locale.h unistd.h limits.h fcntl.h string.h \
+                  memory.h sys/param.h sys/resource.h sys/time.h sys/timeb.h \
+                  sys/select.h sys/file.h spawn.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
 fi
 
+done
+
 
-# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
-# for constant arguments.  Useless!
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
-$as_echo_n "checking for working alloca.h... " >&6; }
-if ${ac_cv_working_alloca_h+:} false; then :
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <alloca.h>
+
 int
 main ()
 {
-char *p = (char *) alloca (2 * sizeof (int));
-                         if (p) return 0;
+
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this sort of thing.  */
+  typedef int charset[2];
+  const charset cs = { 0, 0 };
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this sort of thing.  */
+    char tx;
+    char *t = &tx;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; } bx;
+    struct s *b = &bx; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_working_alloca_h=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
 else
-  ac_cv_working_alloca_h=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+  ac_cv_c_const=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
-$as_echo "$ac_cv_working_alloca_h" >&6; }
-if test $ac_cv_working_alloca_h = yes; then
-
-$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5
+$as_echo_n "checking return type of signal handlers... " >&6; }
+if ${ac_cv_type_signal+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
-$as_echo_n "checking for alloca... " >&6; }
-if ${ac_cv_func_alloca_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
-#  include <malloc.h>
-#  define alloca _alloca
-# else
-#  ifdef HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else
-#   ifdef _AIX
- #pragma alloca
-#   else
-#    ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca (size_t);
-#    endif
-#   endif
-#  endif
-# endif
-#endif
-
 int
 main ()
 {
-char *p = (char *) alloca (1);
-                                   if (p) return 0;
+return *(signal (0, 0)) (0) == 1;
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_func_alloca_works=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_type_signal=int
 else
-  ac_cv_func_alloca_works=no
+  ac_cv_type_signal=void
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
-$as_echo "$ac_cv_func_alloca_works" >&6; }
-
-if test $ac_cv_func_alloca_works = yes; then
-
-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
-
-else
-  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
-# that cause trouble.  Some versions do not even contain alloca or
-# contain a buggy version.  If you still want to use their alloca,
-# use ar to extract alloca.o from them instead of compiling alloca.c.
-
-ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5
+$as_echo "$ac_cv_type_signal" >&6; }
 
-$as_echo "#define C_ALLOCA 1" >>confdefs.h
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
-$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if ${ac_cv_os_cray+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
+$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
+if ${ac_cv_type_uid_t+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#if defined CRAY && ! defined CRAY2
-webecray
-#else
-wenotbecray
-#endif
+#include <sys/types.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "webecray" >/dev/null 2>&1; then :
-  ac_cv_os_cray=yes
+  $EGREP "uid_t" >/dev/null 2>&1; then :
+  ac_cv_type_uid_t=yes
 else
-  ac_cv_os_cray=no
+  ac_cv_type_uid_t=no
 fi
 rm -f conftest*
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
-$as_echo "$ac_cv_os_cray" >&6; }
-if test $ac_cv_os_cray = yes; then
-  for ac_func in _getb67 GETB67 getb67; do
-    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
+$as_echo "$ac_cv_type_uid_t" >&6; }
+if test $ac_cv_type_uid_t = no; then
 
-cat >>confdefs.h <<_ACEOF
-#define CRAY_STACKSEG_END $ac_func
-_ACEOF
+$as_echo "#define uid_t int" >>confdefs.h
 
-    break
-fi
 
-  done
+$as_echo "#define gid_t int" >>confdefs.h
+
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
-$as_echo_n "checking stack direction for C alloca... " >&6; }
-if ${ac_cv_c_stack_direction+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_c_stack_direction=0
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-int
-find_stack_direction (int *addr, int depth)
-{
-  int dir, dummy = 0;
-  if (! addr)
-    addr = &dummy;
-  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
-  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
-  return dir + dummy;
-}
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = xyes; then :
 
-int
-main (int argc, char **argv)
-{
-  return find_stack_direction (0, argc + !argv + 20) < 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_stack_direction=1
 else
-  ac_cv_c_stack_direction=-1
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
-$as_echo "$ac_cv_c_stack_direction" >&6; }
 cat >>confdefs.h <<_ACEOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
+#define pid_t int
 _ACEOF
 
-
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5
-$as_echo_n "checking whether closedir returns void... " >&6; }
-if ${ac_cv_func_closedir_void+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  ac_cv_func_closedir_void=yes
+ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_off_t" = xyes; then :
+
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$ac_includes_default
-#include <$ac_header_dirent>
-#ifndef __cplusplus
-int closedir ();
-#endif
 
-int
-main ()
-{
-return closedir (opendir (".")) != 0;
-  ;
-  return 0;
-}
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_func_closedir_void=no
-else
-  ac_cv_func_closedir_void=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5
-$as_echo "$ac_cv_func_closedir_void" >&6; }
-if test $ac_cv_func_closedir_void = yes; then
-
-$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h
 
-fi
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
 
+else
 
-# See if the user wants to add (or not) GNU Guile support
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
 
+fi
 
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
 
+else
 
+cat >>confdefs.h <<_ACEOF
+#define ssize_t int
+_ACEOF
 
+fi
 
 
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
-       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
+$as_echo_n "checking for unsigned long long int... " >&6; }
+if ${ac_cv_type_unsigned_long_long_int+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $PKG_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  ac_cv_type_unsigned_long_long_int=yes
+     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  /* For now, do not test the preprocessor; as of 2007 there are too many
+         implementations with broken preprocessors.  Perhaps this can
+         be revisited in 2012.  In the meantime, code should not expect
+         #if to work with literals wider than 32 bits.  */
+      /* Test literals.  */
+      long long int ll = 9223372036854775807ll;
+      long long int nll = -9223372036854775807LL;
+      unsigned long long int ull = 18446744073709551615ULL;
+      /* Test constant expressions.   */
+      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+                     ? 1 : -1)];
+      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+                     ? 1 : -1)];
+      int i = 63;
+int
+main ()
+{
+/* Test availability of runtime routines for shift and division.  */
+      long long int llmax = 9223372036854775807ll;
+      unsigned long long int ullmax = 18446744073709551615ull;
+      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+              | (llmax / ll) | (llmax % ll)
+              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+              | (ullmax / ull) | (ullmax % ull));
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
 
-  ;;
-esac
-fi
-PKG_CONFIG=$ac_cv_path_PKG_CONFIG
-if test -n "$PKG_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
-$as_echo "$PKG_CONFIG" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_cv_type_unsigned_long_long_int=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     fi
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
+$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
 
+$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
 
-fi
-if test -z "$ac_cv_path_PKG_CONFIG"; then
-  ac_pt_PKG_CONFIG=$PKG_CONFIG
-  # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $ac_pt_PKG_CONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
   fi
-done
-  done
-IFS=$as_save_IFS
 
-  ;;
-esac
-fi
-ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
-if test -n "$ac_pt_PKG_CONFIG"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
-$as_echo "$ac_pt_PKG_CONFIG" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
-  if test "x$ac_pt_PKG_CONFIG" = x; then
-    PKG_CONFIG=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    PKG_CONFIG=$ac_pt_PKG_CONFIG
-  fi
+
+  ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintmax_t" = xyes; then :
+
+$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h
+
 else
-  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
-fi
+  test $ac_cv_type_unsigned_long_long_int = yes \
+       && ac_type='unsigned long long int' \
+       || ac_type='unsigned long int'
 
-fi
-if test -n "$PKG_CONFIG"; then
-       _pkg_min_version=0.9.0
-       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
-$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
-       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       else
-               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-               PKG_CONFIG=""
-       fi
-fi
+cat >>confdefs.h <<_ACEOF
+#define uintmax_t $ac_type
+_ACEOF
 
-# Check whether --with-guile was given.
-if test "${with_guile+set}" = set; then :
-  withval=$with_guile;
 fi
 
 
-# For some strange reason, at least on Ubuntu, each version of Guile
-# comes with it's own PC file so we have to specify them as individual
-# packages.  Ugh.
-if test "x$with_guile" != xno; then :
 
-pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5
-$as_echo_n "checking for GUILE... " >&6; }
+# Find out whether our struct stat returns nanosecond resolution timestamps.
 
-if test -n "$GUILE_CFLAGS"; then
-    pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "guile-2.0") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-2.0" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes
-else
-  pkg_failed=yes
-fi
- else
-    pkg_failed=untried
-fi
-if test -n "$GUILE_LIBS"; then
-    pkg_cv_GUILE_LIBS="$GUILE_LIBS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-2.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "guile-2.0") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-2.0" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanoseconds field of struct stat" >&5
+$as_echo_n "checking for nanoseconds field of struct stat... " >&6; }
+if ${ac_cv_struct_st_mtim_nsec+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  pkg_failed=yes
+  ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_cv_struct_st_mtim_nsec=no
+    # st_mtim.tv_nsec -- the usual case
+    # st_mtim._tv_nsec -- Solaris 2.6, if
+    #  (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1
+    #   && !defined __EXTENSIONS__)
+    # st_mtim.st__tim.tv_nsec -- UnixWare 2.1.2
+    # st_mtime_n -- AIX 5.2 and above
+    # st_mtimespec.tv_nsec -- Darwin (Mac OSX)
+    for ac_val in st_mtim.tv_nsec st_mtim._tv_nsec st_mtim.st__tim.tv_nsec st_mtime_n st_mtimespec.tv_nsec; do
+      CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int
+main ()
+{
+struct stat s; s.ST_MTIM_NSEC;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_struct_st_mtim_nsec=$ac_val; break
 fi
- else
-    pkg_failed=untried
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    done
+    CPPFLAGS="$ac_save_CPPFLAGS"
+
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_st_mtim_nsec" >&5
+$as_echo "$ac_cv_struct_st_mtim_nsec" >&6; }
 
+  if test $ac_cv_struct_st_mtim_nsec != no; then
 
+cat >>confdefs.h <<_ACEOF
+#define ST_MTIM_NSEC $ac_cv_struct_st_mtim_nsec
+_ACEOF
 
-if test $pkg_failed = yes; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  fi
 
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use high resolution file timestamps" >&5
+$as_echo_n "checking whether to use high resolution file timestamps... " >&6; }
+if ${make_cv_file_timestamp_hi_res+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-        _pkg_short_errors_supported=no
+   make_cv_file_timestamp_hi_res=no
+  if test "$ac_cv_struct_st_mtim_nsec" != no; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+int
+main ()
+{
+char a[0x7fffffff < (uintmax_t)-1 >> 30 ? 1 : -1];
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  make_cv_file_timestamp_hi_res=yes
 fi
-        if test $_pkg_short_errors_supported = yes; then
-               GUILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "guile-2.0" 2>&1`
-        else
-               GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-2.0" 2>&1`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$GUILE_PKG_ERRORS" >&5
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_file_timestamp_hi_res" >&5
+$as_echo "$make_cv_file_timestamp_hi_res" >&6; }
+if test "$make_cv_file_timestamp_hi_res" = yes; then :
+  val=1
+else
+  val=0
+fi
 
-pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5
-$as_echo_n "checking for GUILE... " >&6; }
+cat >>confdefs.h <<_ACEOF
+#define FILE_TIMESTAMP_HI_RES $val
+_ACEOF
 
-if test -n "$GUILE_CFLAGS"; then
-    pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-1.8" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes
+
+if test "$make_cv_file_timestamp_hi_res" = yes; then :
+   # Solaris 2.5.1 needs -lposix4 to get the clock_gettime function.
+  # Solaris 7 prefers the library name -lrt to the obsolescent name -lposix4.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
+$as_echo_n "checking for library containing clock_gettime... " >&6; }
+if ${ac_cv_search_clock_gettime+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  pkg_failed=yes
-fi
- else
-    pkg_failed=untried
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime ();
+int
+main ()
+{
+return clock_gettime ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' rt posix4; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_clock_gettime=$ac_res
 fi
-if test -n "$GUILE_LIBS"; then
-    pkg_cv_GUILE_LIBS="$GUILE_LIBS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-1.8" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_clock_gettime+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_clock_gettime+:} false; then :
+
 else
-  pkg_failed=yes
+  ac_cv_search_clock_gettime=no
 fi
- else
-    pkg_failed=untried
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
+$as_echo "$ac_cv_search_clock_gettime" >&6; }
+ac_res=$ac_cv_search_clock_gettime
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
 
+fi
 
+  if test "$ac_cv_search_clock_gettime" != no; then :
+
+$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
 
-if test $pkg_failed = yes; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
 
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
-else
-        _pkg_short_errors_supported=no
 fi
-        if test $_pkg_short_errors_supported = yes; then
-               GUILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "guile-1.8" 2>&1`
-        else
-               GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-1.8" 2>&1`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$GUILE_PKG_ERRORS" >&5
 
-       have_guile=no
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-       have_guile=no
-else
-       GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS
-       GUILE_LIBS=$pkg_cv_GUILE_LIBS
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       have_guile=yes
 fi
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
 
-pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5
-$as_echo_n "checking for GUILE... " >&6; }
+# Check for DOS-style pathnames.
 
-if test -n "$GUILE_CFLAGS"; then
-    pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-1.8" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes
-else
-  pkg_failed=yes
-fi
- else
-    pkg_failed=untried
-fi
-if test -n "$GUILE_LIBS"; then
-    pkg_cv_GUILE_LIBS="$GUILE_LIBS"
- elif test -n "$PKG_CONFIG"; then
-    if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-1.8\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "guile-1.8") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-  pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-1.8" 2>/dev/null`
-                     test "x$?" != "x0" && pkg_failed=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether system uses MSDOS-style paths" >&5
+$as_echo_n "checking whether system uses MSDOS-style paths... " >&6; }
+if ${ac_cv_dos_paths+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  pkg_failed=yes
-fi
- else
-    pkg_failed=untried
-fi
-
 
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-if test $pkg_failed = yes; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __EMX__ && !defined __MSYS__ && !defined __CYGWIN__
+neither MSDOS nor Windows nor OS2
+#endif
 
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
-else
-        _pkg_short_errors_supported=no
-fi
-        if test $_pkg_short_errors_supported = yes; then
-               GUILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "guile-1.8" 2>&1`
-        else
-               GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-1.8" 2>&1`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$GUILE_PKG_ERRORS" >&5
+int
+main ()
+{
 
-       have_guile=no
-elif test $pkg_failed = untried; then
-       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-       have_guile=no
-else
-       GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS
-       GUILE_LIBS=$pkg_cv_GUILE_LIBS
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       have_guile=yes
-fi
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_dos_paths=yes
 else
-       GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS
-       GUILE_LIBS=$pkg_cv_GUILE_LIBS
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-       have_guile=yes
+  ac_cv_dos_paths=no
 fi
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_dos_paths" >&5
+$as_echo "$ac_cv_dos_paths" >&6; }
 
-if test "$have_guile" = yes; then :
+  if test x"$ac_cv_dos_paths" = xyes; then :
 
-$as_echo "#define HAVE_GUILE 1" >>confdefs.h
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DOS_PATHS 1
+_ACEOF
 
 fi
 
- if test "$have_guile" = yes; then
-  HAVE_GUILE_TRUE=
-  HAVE_GUILE_FALSE='#'
+
+# See if we have a standard version of gettimeofday().  Since actual
+# implementations can differ, just make sure we have the most common
+# one.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for standard gettimeofday" >&5
+$as_echo_n "checking for standard gettimeofday... " >&6; }
+if ${ac_cv_func_gettimeofday+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  HAVE_GUILE_TRUE='#'
-  HAVE_GUILE_FALSE=
+  ac_cv_func_gettimeofday=no
+   if test "$cross_compiling" = yes; then :
+  ac_cv_func_gettimeofday="no (cross-compiling)"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/time.h>
+                  int main ()
+                  {
+                    struct timeval t; t.tv_sec = -1; t.tv_usec = -1;
+                    return gettimeofday (&t, 0) != 0
+                          || t.tv_sec < 0 || t.tv_usec < 0;
+                  }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_gettimeofday=yes
+else
+  ac_cv_func_gettimeofday=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gettimeofday" >&5
+$as_echo "$ac_cv_func_gettimeofday" >&6; }
+if test "$ac_cv_func_gettimeofday" = yes; then :
 
-ac_have_func=no # yes means we've found a way to get the load average.
-
-# Make sure getloadavg.c is where it belongs, at configure-time.
-test -f "$srcdir/$ac_config_libobj_dir/getloadavg.c" ||
-  as_fn_error $? "$srcdir/$ac_config_libobj_dir/getloadavg.c is missing" "$LINENO" 5
+$as_echo "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
 
-ac_save_LIBS=$LIBS
 
-# Check for getloadavg, but be sure not to touch the cache variable.
-(ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg"
-if test "x$ac_cv_func_getloadavg" = xyes; then :
-  exit 0
-else
-  exit 1
 fi
-) && ac_have_func=yes
 
-# On HPUX9, an unprivileged user can get load averages through this function.
-for ac_func in pstat_getdynamic
+for ac_func in strdup strndup memrchr umask mkstemp mktemp fdopen \
+                dup dup2 getcwd realpath sigsetmask sigaction \
+                getgroups seteuid setegid setlinebuf setreuid setregid \
+                getrlimit setrlimit setvbuf pipe strsignal \
+                lstat readlink atexit isatty ttyname pselect posix_spawn \
+                posix_spawnattr_setsigmask
 do :
-  ac_fn_c_check_func "$LINENO" "pstat_getdynamic" "ac_cv_func_pstat_getdynamic"
-if test "x$ac_cv_func_pstat_getdynamic" = xyes; then :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_PSTAT_GETDYNAMIC 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 fi
 done
 
 
-# Solaris has libkstat which does not require root.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5
-$as_echo_n "checking for kstat_open in -lkstat... " >&6; }
-if ${ac_cv_lib_kstat_kstat_open+:} false; then :
-  $as_echo_n "(cached) " >&6
+# We need to check declarations, not just existence, because on Tru64 this
+# function is not declared without special flags, which themselves cause
+# other problems.  We'll just use our own.
+ac_fn_c_check_decl "$LINENO" "bsd_signal" "ac_cv_have_decl_bsd_signal" "#define _GNU_SOURCE 1
+#include <signal.h>
+"
+if test "x$ac_cv_have_decl_bsd_signal" = xyes; then :
+  ac_have_decl=1
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lkstat  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+  ac_have_decl=0
+fi
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char kstat_open ();
-int
-main ()
-{
-return kstat_open ();
-  ;
-  return 0;
-}
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_BSD_SIGNAL $ac_have_decl
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_kstat_kstat_open=yes
-else
-  ac_cv_lib_kstat_kstat_open=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kstat_kstat_open" >&5
-$as_echo "$ac_cv_lib_kstat_kstat_open" >&6; }
-if test "x$ac_cv_lib_kstat_kstat_open" = xyes; then :
+
+
+for ac_header in vfork.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "vfork.h" "ac_cv_header_vfork_h" "$ac_includes_default"
+if test "x$ac_cv_header_vfork_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBKSTAT 1
+#define HAVE_VFORK_H 1
 _ACEOF
 
-  LIBS="-lkstat $LIBS"
-
 fi
 
-test $ac_cv_lib_kstat_kstat_open = yes && ac_have_func=yes
+done
+
+for ac_func in fork vfork
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
 
-# Some systems with -lutil have (and need) -lkvm as well, some do not.
-# On Solaris, -lkvm requires nlist from -lelf, so check that first
-# to get the right answer into the cache.
-# For kstat on solaris, we need libelf to force the definition of SVR4 below.
-if test $ac_have_func = no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for elf_begin in -lelf" >&5
-$as_echo_n "checking for elf_begin in -lelf... " >&6; }
-if ${ac_cv_lib_elf_elf_begin+:} false; then :
+if test "x$ac_cv_func_fork" = xyes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5
+$as_echo_n "checking for working fork... " >&6; }
+if ${ac_cv_func_fork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lelf  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_fork_works=cross
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char elf_begin ();
+$ac_includes_default
 int
 main ()
 {
-return elf_begin ();
+
+         /* By Ruediger Kuhlmann. */
+         return fork () < 0;
+
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_elf_elf_begin=yes
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_fork_works=yes
 else
-  ac_cv_lib_elf_elf_begin=no
+  ac_cv_func_fork_works=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_elf_elf_begin" >&5
-$as_echo "$ac_cv_lib_elf_elf_begin" >&6; }
-if test "x$ac_cv_lib_elf_elf_begin" = xyes; then :
-  LIBS="-lelf $LIBS"
+
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5
+$as_echo "$ac_cv_func_fork_works" >&6; }
 
+else
+  ac_cv_func_fork_works=$ac_cv_func_fork
 fi
-if test $ac_have_func = no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kvm_open in -lkvm" >&5
-$as_echo_n "checking for kvm_open in -lkvm... " >&6; }
-if ${ac_cv_lib_kvm_kvm_open+:} false; then :
+if test "x$ac_cv_func_fork_works" = xcross; then
+  case $host in
+    *-*-amigaos* | *-*-msdosdjgpp*)
+      # Override, as these systems have only a dummy fork() stub
+      ac_cv_func_fork_works=no
+      ;;
+    *)
+      ac_cv_func_fork_works=yes
+      ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5
+$as_echo_n "checking for working vfork... " >&6; }
+if ${ac_cv_func_vfork_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lkvm  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_vfork_works=cross
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
+/* Thanks to Paul Eggert for this test.  */
+$ac_includes_default
+#include <sys/wait.h>
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+   argument registers are propagated back to the parent.  The compiler
+   is told about this with #include <vfork.h>, but some compilers
+   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
+   static variable whose address is put into a register that is
+   clobbered by the vfork.  */
+static void
 #ifdef __cplusplus
-extern "C"
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
 #endif
-char kvm_open ();
+{
+  static pid_t child;
+  if (!child) {
+    child = vfork ();
+    if (child < 0) {
+      perror ("vfork");
+      _exit(2);
+    }
+    if (!child) {
+      arg = getpid();
+      write(-1, "", 0);
+      _exit (arg);
+    }
+  }
+}
+
 int
 main ()
 {
-return kvm_open ();
-  ;
-  return 0;
+  pid_t parent = getpid ();
+  pid_t child;
+
+  sparc_address_test (0);
+
+  child = vfork ();
+
+  if (child == 0) {
+    /* Here is another test for sparc vfork register problems.  This
+       test uses lots of local variables, at least as many local
+       variables as main has allocated so far including compiler
+       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
+       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
+       reuse the register of parent for one of the local variables,
+       since it will think that parent can't possibly be used any more
+       in this routine.  Assigning to the local variable will thus
+       munge parent in the parent process.  */
+    pid_t
+      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+    /* Convince the compiler that p..p7 are live; otherwise, it might
+       use the same hardware register for all 8 local variables.  */
+    if (p != p1 || p != p2 || p != p3 || p != p4
+       || p != p5 || p != p6 || p != p7)
+      _exit(1);
+
+    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+       from child file descriptors.  If the child closes a descriptor
+       before it execs or exits, this munges the parent's descriptor
+       as well.  Test for this by closing stdout in the child.  */
+    _exit(close(fileno(stdout)) != 0);
+  } else {
+    int status;
+    struct stat st;
+
+    while (wait(&status) != child)
+      ;
+    return (
+        /* Was there some problem with vforking?  */
+        child < 0
+
+        /* Did the child fail?  (This shouldn't happen.)  */
+        || status
+
+        /* Did the vfork/compiler bug occur?  */
+        || parent != getpid()
+
+        /* Did the file descriptor bug occur?  */
+        || fstat(fileno(stdout), &st) != 0
+        );
+  }
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_kvm_kvm_open=yes
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_vfork_works=yes
 else
-  ac_cv_lib_kvm_kvm_open=no
+  ac_cv_func_vfork_works=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_kvm_kvm_open" >&5
-$as_echo "$ac_cv_lib_kvm_kvm_open" >&6; }
-if test "x$ac_cv_lib_kvm_kvm_open" = xyes; then :
-  LIBS="-lkvm $LIBS"
+
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5
+$as_echo "$ac_cv_func_vfork_works" >&6; }
 
-  # Check for the 4.4BSD definition of getloadavg.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lutil" >&5
-$as_echo_n "checking for getloadavg in -lutil... " >&6; }
-if ${ac_cv_lib_util_getloadavg+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lutil  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+  ac_cv_func_vfork_works=$ac_cv_func_vfork
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
+$as_echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_VFORK 1" >>confdefs.h
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char getloadavg ();
-int
-main ()
-{
-return getloadavg ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_util_getloadavg=yes
 else
-  ac_cv_lib_util_getloadavg=no
+
+$as_echo "#define vfork fork" >>confdefs.h
+
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+$as_echo "#define HAVE_WORKING_FORK 1" >>confdefs.h
+
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_getloadavg" >&5
-$as_echo "$ac_cv_lib_util_getloadavg" >&6; }
-if test "x$ac_cv_lib_util_getloadavg" = xyes; then :
-  LIBS="-lutil $LIBS" ac_have_func=yes ac_cv_func_getloadavg_setgid=yes
+
+
+if ${ac_cv_func_setvbuf_reversed+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_func_setvbuf_reversed=no
 fi
 
+
+
+# Rumor has it that strcasecmp lives in -lresolv on some odd systems.
+# It doesn't hurt much to use our own if we can't find it so I don't
+# make the effort here.
+for ac_func in strcasecmp strncasecmp strcmpi strncmpi stricmp strnicmp
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
 fi
+done
+
 
-if test $ac_have_func = no; then
-  # There is a commonly available library for RS/6000 AIX.
-  # Since it is not a standard part of AIX, it might be installed locally.
-  ac_getloadavg_LIBS=$LIBS
-  LIBS="-L/usr/local/lib $LIBS"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getloadavg in -lgetloadavg" >&5
-$as_echo_n "checking for getloadavg in -lgetloadavg... " >&6; }
-if ${ac_cv_lib_getloadavg_getloadavg+:} false; then :
+# strcoll() is used by the GNU glob library
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working strcoll" >&5
+$as_echo_n "checking for working strcoll... " >&6; }
+if ${ac_cv_func_strcoll_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lgetloadavg  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_strcoll_works=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char getloadavg ();
+$ac_includes_default
 int
 main ()
 {
-return getloadavg ();
+return (strcoll ("abc", "def") >= 0 ||
+        strcoll ("ABC", "DEF") >= 0 ||
+        strcoll ("123", "456") >= 0)
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_getloadavg_getloadavg=yes
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_strcoll_works=yes
 else
-  ac_cv_lib_getloadavg_getloadavg=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+  ac_cv_func_strcoll_works=no
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_getloadavg_getloadavg" >&5
-$as_echo "$ac_cv_lib_getloadavg_getloadavg" >&6; }
-if test "x$ac_cv_lib_getloadavg_getloadavg" = xyes; then :
-  LIBS="-lgetloadavg $LIBS"
-else
-  LIBS=$ac_getloadavg_LIBS
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strcoll_works" >&5
+$as_echo "$ac_cv_func_strcoll_works" >&6; }
+if test $ac_cv_func_strcoll_works = yes; then
 
-# Make sure it is really in the library, if we think we found it,
-# otherwise set up the replacement function.
-for ac_func in getloadavg
-do :
-  ac_fn_c_check_func "$LINENO" "getloadavg" "ac_cv_func_getloadavg"
-if test "x$ac_cv_func_getloadavg" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_GETLOADAVG 1
-_ACEOF
-
-else
-  case " $LIBOBJS " in
-  *" getloadavg.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS getloadavg.$ac_objext"
- ;;
-esac
-
-
-$as_echo "#define C_GETLOADAVG 1" >>confdefs.h
-
-# Figure out what our getloadavg.c needs.
-ac_have_func=no
-ac_fn_c_check_header_mongrel "$LINENO" "sys/dg_sys_info.h" "ac_cv_header_sys_dg_sys_info_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_dg_sys_info_h" = xyes; then :
-  ac_have_func=yes
+$as_echo "#define HAVE_STRCOLL 1" >>confdefs.h
 
-$as_echo "#define DGUX 1" >>confdefs.h
+fi
 
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dg_sys_info in -ldgc" >&5
-$as_echo_n "checking for dg_sys_info in -ldgc... " >&6; }
-if ${ac_cv_lib_dgc_dg_sys_info+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5
+$as_echo_n "checking whether closedir returns void... " >&6; }
+if ${ac_cv_func_closedir_void+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldgc  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_closedir_void=yes
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
+$ac_includes_default
+#include <$ac_header_dirent>
+#ifndef __cplusplus
+int closedir ();
 #endif
-char dg_sys_info ();
+
 int
 main ()
 {
-return dg_sys_info ();
+return closedir (opendir (".")) != 0;
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dgc_dg_sys_info=yes
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_closedir_void=no
 else
-  ac_cv_lib_dgc_dg_sys_info=no
+  ac_cv_func_closedir_void=yes
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dgc_dg_sys_info" >&5
-$as_echo "$ac_cv_lib_dgc_dg_sys_info" >&6; }
-if test "x$ac_cv_lib_dgc_dg_sys_info" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBDGC 1
-_ACEOF
-
-  LIBS="-ldgc $LIBS"
 
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5
+$as_echo "$ac_cv_func_closedir_void" >&6; }
+if test $ac_cv_func_closedir_void = yes; then
+
+$as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h
 
 fi
 
 
+# dir.c and our glob.c use dirent.d_type if available
 
-ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
-if test "x$ac_cv_header_locale_h" = xyes; then :
 
-fi
+  ac_fn_c_check_member "$LINENO" "struct dirent" "d_type" "ac_cv_member_struct_dirent_d_type" "
+#include <sys/types.h>
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+#else
+# define dirent direct
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+#endif
 
+"
+if test "x$ac_cv_member_struct_dirent_d_type" = xyes; then :
 
-for ac_func in setlocale
-do :
-  ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale"
-if test "x$ac_cv_func_setlocale" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SETLOCALE 1
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_DIRENT_D_TYPE 1
 _ACEOF
 
+
 fi
-done
 
 
-# We cannot check for <dwarf.h>, because Solaris 2 does not use dwarf (it
-# uses stabs), but it is still SVR4.  We cannot check for <elf.h> because
-# Irix 4.0.5F has the header but not the library.
-if test $ac_have_func = no && test "$ac_cv_lib_elf_elf_begin" = yes \
-    && test "$ac_cv_lib_kvm_kvm_open" = yes; then
-  ac_have_func=yes
 
-$as_echo "#define SVR4 1" >>confdefs.h
+# See if the user wants to add (or not) GNU Guile support
 
+# Check whether --with-guile was given.
+if test "${with_guile+set}" = set; then :
+  withval=$with_guile;
 fi
 
-if test $ac_have_func = no; then
-  ac_fn_c_check_header_mongrel "$LINENO" "inq_stats/cpustats.h" "ac_cv_header_inq_stats_cpustats_h" "$ac_includes_default"
-if test "x$ac_cv_header_inq_stats_cpustats_h" = xyes; then :
-  ac_have_func=yes
 
-$as_echo "#define UMAX 1" >>confdefs.h
+# Annoyingly, each version of Guile comes with it's own PC file so we have to
+# specify them as individual packages.  Ugh.
 
 
-$as_echo "#define UMAX4_3 1" >>confdefs.h
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
 
 fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
 fi
 
-if test $ac_have_func = no; then
-  ac_fn_c_check_header_mongrel "$LINENO" "sys/cpustats.h" "ac_cv_header_sys_cpustats_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_cpustats_h" = xyes; then :
-  ac_have_func=yes; $as_echo "#define UMAX 1" >>confdefs.h
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+fi
 
+if test "x$with_guile" != xno; then :
+   guile_versions="3.0 2.2 2.0 1.8"
+  guile_version=no
+  have_guile=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU Guile" >&5
+$as_echo_n "checking for GNU Guile... " >&6; }
+  for v in $guile_versions; do
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-\$v\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "guile-$v") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  guile_version=$v; have_guile=yes; break
 fi
+  done
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_version" >&5
+$as_echo "$guile_version" >&6; }
+  if test "$have_guile" = yes; then :
 
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUILE" >&5
+$as_echo_n "checking for GUILE... " >&6; }
 
+if test -n "$GUILE_CFLAGS"; then
+    pkg_cv_GUILE_CFLAGS="$GUILE_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-\$guile_version\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "guile-$guile_version") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GUILE_CFLAGS=`$PKG_CONFIG --cflags "guile-$guile_version" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
 fi
-
-if test $ac_have_func = no; then
-  for ac_header in mach/mach.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default"
-if test "x$ac_cv_header_mach_mach_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_MACH_MACH_H 1
-_ACEOF
-
+ else
+    pkg_failed=untried
 fi
-
-done
-
+if test -n "$GUILE_LIBS"; then
+    pkg_cv_GUILE_LIBS="$GUILE_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"guile-\$guile_version\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "guile-$guile_version") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GUILE_LIBS=`$PKG_CONFIG --libs "guile-$guile_version" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
 fi
 
-for ac_header in nlist.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "nlist.h" "ac_cv_header_nlist_h" "$ac_includes_default"
-if test "x$ac_cv_header_nlist_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_NLIST_H 1
-_ACEOF
- ac_fn_c_check_member "$LINENO" "struct nlist" "n_un.n_name" "ac_cv_member_struct_nlist_n_un_n_name" "#include <nlist.h>
-"
-if test "x$ac_cv_member_struct_nlist_n_un_n_name" = xyes; then :
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_NLIST_N_UN_N_NAME 1
-_ACEOF
 
 
-$as_echo "#define NLIST_NAME_UNION 1" >>confdefs.h
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
 fi
+        if test $_pkg_short_errors_supported = yes; then
+               GUILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "guile-$guile_version" 2>&1`
+        else
+               GUILE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "guile-$guile_version" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$GUILE_PKG_ERRORS" >&5
 
+       as_fn_error $? "Package requirements (guile-$guile_version) were not met:
 
-fi
+$GUILE_PKG_ERRORS
 
-done
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
 
-fi
-done
+Alternatively, you may set the environment variables GUILE_CFLAGS
+and GUILE_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
 
+Alternatively, you may set the environment variables GUILE_CFLAGS
+and GUILE_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
 
-# Some definitions of getloadavg require that the program be installed setgid.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getloadavg requires setgid" >&5
-$as_echo_n "checking whether getloadavg requires setgid... " >&6; }
-if ${ac_cv_func_getloadavg_setgid+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include "$srcdir/$ac_config_libobj_dir/getloadavg.c"
-#ifdef LDAV_PRIVILEGED
-Yowza Am I SETGID yet
-#endif
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "Yowza Am I SETGID yet" >/dev/null 2>&1; then :
-  ac_cv_func_getloadavg_setgid=yes
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
 else
-  ac_cv_func_getloadavg_setgid=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getloadavg_setgid" >&5
-$as_echo "$ac_cv_func_getloadavg_setgid" >&6; }
-if test $ac_cv_func_getloadavg_setgid = yes; then
-  NEED_SETGID=true
-
-$as_echo "#define GETLOADAVG_PRIVILEGED 1" >>confdefs.h
+       GUILE_CFLAGS=$pkg_cv_GUILE_CFLAGS
+       GUILE_LIBS=$pkg_cv_GUILE_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
-else
-  NEED_SETGID=false
 fi
+    # Unfortunately Guile requires a C99 compiler but GNU make doesn't, so
+    # verify we can actually compile the header.
+    keep_CPPFLAGS="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $pkg_cv_GUILE_CFLAGS"
+    ac_fn_c_check_header_compile "$LINENO" "libguile.h" "ac_cv_header_libguile_h" "/* Avoid configuration error warnings. */
+"
+if test "x$ac_cv_header_libguile_h" = xyes; then :
 
-if test $ac_cv_func_getloadavg_setgid = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking group of /dev/kmem" >&5
-$as_echo_n "checking group of /dev/kmem... " >&6; }
-if ${ac_cv_group_kmem+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-   # On Solaris, /dev/kmem is a symlink.  Get info on the real file.
-  ac_ls_output=`ls -lgL /dev/kmem 2>/dev/null`
-  # If we got an error (system does not support symlinks), try without -L.
-  test -z "$ac_ls_output" && ac_ls_output=`ls -lg /dev/kmem`
-  ac_cv_group_kmem=`$as_echo "$ac_ls_output" \
-    | sed -ne 's/[      ][      ]*/ /g;
-              s/^.[sSrwx-]* *[0-9]* *\([^0-9]*\)  *.*/\1/;
-              / /s/.* //;p;'`
+$as_echo "#define HAVE_GUILE 1" >>confdefs.h
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_group_kmem" >&5
-$as_echo "$ac_cv_group_kmem" >&6; }
-  KMEM_GROUP=$ac_cv_group_kmem
-fi
-if test "x$ac_save_LIBS" = x; then
-  GETLOADAVG_LIBS=$LIBS
 else
-  GETLOADAVG_LIBS=`$as_echo "$LIBS" | sed "s|$ac_save_LIBS||"`
+  have_guile=no
 fi
-LIBS=$ac_save_LIBS
-
 
 
-# AC_FUNC_GETLOADAVG is documented to set the NLIST_STRUCT value, but it
-# doesn't.  So, we will.
+    CPPFLAGS="$keep_CPPFLAGS"
 
-if test "$ac_cv_header_nlist_h" = yes; then :
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <nlist.h>
-int
-main ()
-{
-struct nlist nl;
-          nl.n_name = "string";
-          return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  make_cv_nlist_struct=yes
-else
-  make_cv_nlist_struct=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  if test "$make_cv_nlist_struct" = yes; then :
-
-$as_echo "#define NLIST_STRUCT 1" >>confdefs.h
-
 
 fi
 
+ if test "$have_guile" = "yes"; then
+  HAVE_GUILE_TRUE=
+  HAVE_GUILE_FALSE='#'
+else
+  HAVE_GUILE_TRUE='#'
+  HAVE_GUILE_FALSE=
 fi
 
+
 ac_fn_c_check_decl "$LINENO" "sys_siglist" "ac_cv_have_decl_sys_siglist" "$ac_includes_default
 #include <signal.h>
 /* NetBSD declares sys_siglist in unistd.h.  */
@@ -11415,6 +17673,73 @@ $as_echo "#define MAKE_SYMLINKS 1" >>confdefs.h
 
 fi
 
+# Use posix_spawn if we have support and the user didn't disable it
+
+# Check whether --enable-posix-spawn was given.
+if test "${enable_posix_spawn+set}" = set; then :
+  enableval=$enable_posix_spawn; make_cv_posix_spawn="$enableval" user_posix_spawn="$enableval"
+else
+  make_cv_posix_spawn="yes"
+fi
+
+
+case /$ac_cv_header_spawn/$ac_cv_func_posix_spawn/ in #(
+  */no/*) :
+    make_cv_posix_spawn=no ;; #(
+  *) :
+     ;;
+esac
+
+if test "$make_cv_posix_spawn" = yes; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for posix_spawn that fails synchronously" >&5
+$as_echo_n "checking for posix_spawn that fails synchronously... " >&6; }
+if ${make_cv_synchronous_posix_spawn+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  make_cv_synchronous_posix_spawn=no
+     if test "$cross_compiling" = yes; then :
+  make_cv_synchronous_posix_spawn="no (cross-compiling)"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+       #include <spawn.h>
+       #include <string.h>
+
+       extern char **environ;
+
+       int main() {
+         char* path = strdup("./non-existent");
+         char *argv[2];
+         argv[0] = path;
+         argv[1] =  0;
+         return posix_spawn(0, path, 0, 0, argv, environ);
+       }
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  make_cv_synchronous_posix_spawn=no
+else
+  make_cv_synchronous_posix_spawn=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_synchronous_posix_spawn" >&5
+$as_echo "$make_cv_synchronous_posix_spawn" >&6; }
+fi
+
+case /$user_posix_spawn/$make_cv_posix_spawn/$make_cv_synchronous_posix_spawn/ in #(
+  */no/*) :
+    make_cv_posix_spawn=no ;; #(
+  *) :
+
+$as_echo "#define USE_POSIX_SPAWN 1" >>confdefs.h
+
+   ;;
+esac
+
 # Find the SCCS commands, so we can include them in our default rules.
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for location of SCCS get command" >&5
 fi
 rm -f s.conftest conftoast
 
-# Check the system to see if it provides GNU glob.  If not, use our
-# local version.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if system libc has GNU glob" >&5
-$as_echo_n "checking if system libc has GNU glob... " >&6; }
-if ${make_cv_sys_gnu_glob+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#include <features.h>
-#include <glob.h>
-#include <fnmatch.h>
-
-#define GLOB_INTERFACE_VERSION 1
-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
-# include <gnu-versions.h>
-# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
-   gnu glob
-# endif
-#endif
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "gnu glob" >/dev/null 2>&1; then :
-  make_cv_sys_gnu_glob=yes
-else
-  make_cv_sys_gnu_glob=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_cv_sys_gnu_glob" >&5
-$as_echo "$make_cv_sys_gnu_glob" >&6; }
-if test "$make_cv_sys_gnu_glob" = no; then :
-   GLOBINC='-I$(srcdir)/glob'
-  GLOBLIB=glob/libglob.a
-
-fi
-
-
-
-# Tell automake about this, so it can build the right .c files.
- if test "$make_cv_sys_gnu_glob" = no; then
-  USE_LOCAL_GLOB_TRUE=
-  USE_LOCAL_GLOB_FALSE='#'
-else
-  USE_LOCAL_GLOB_TRUE='#'
-  USE_LOCAL_GLOB_FALSE=
-fi
-
-
 # Let the makefile know what our build host is
 
 
@@ -11662,9 +17936,18 @@ if test "x$make_cv_load" = xno && test "x$user_load" = xyes; then :
 
 fi
 
+if test "x$make_cv_posix_spawn" = xno && test "x$user_posix_spawn" = xyes; then :
+   echo
+  echo "WARNING: posix_spawn() is not supported on this system."
+  echo
+
+fi
+
 # Specify what files are to be created.
-ac_config_files="$ac_config_files Makefile glob/Makefile po/Makefile.in config/Makefile doc/Makefile w32/Makefile tests/config-flags.pm"
+ac_config_files="$ac_config_files Makefile build.cfg lib/Makefile po/Makefile.in doc/Makefile tests/config-flags.pm"
 
+# We don't need this: the standard automake output suffices for POSIX systems.
+#mk/Posix.mk
 
 # OK, do it!
 
@@ -11805,6 +18088,75 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then
+  as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_ALLOCA_H_TRUE}" && test -z "${GL_GENERATE_ALLOCA_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_ALLOCA_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_ERRNO_H_TRUE}" && test -z "${GL_GENERATE_ERRNO_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_ERRNO_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_SYSTEM_GLOB_TRUE}" && test -z "${USE_SYSTEM_GLOB_FALSE}"; then
+  as_fn_error $? "conditional \"USE_SYSTEM_GLOB\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDBOOL_H_TRUE}" && test -z "${GL_GENERATE_STDBOOL_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_STDBOOL_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDDEF_H_TRUE}" && test -z "${GL_GENERATE_STDDEF_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_STDDEF_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_LIMITS_H_TRUE}" && test -z "${GL_GENERATE_LIMITS_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_LIMITS_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${GL_GENERATE_STDINT_H_TRUE}" && test -z "${GL_GENERATE_STDINT_H_FALSE}"; then
+  as_fn_error $? "conditional \"GL_GENERATE_STDINT_H\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+    gl_libobjs=
+    gl_ltlibobjs=
+    if test -n "$gl_LIBOBJS"; then
+      # Remove the extension.
+      sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+        gl_libobjs="$gl_libobjs $i.$ac_objext"
+        gl_ltlibobjs="$gl_ltlibobjs $i.lo"
+      done
+    fi
+    gl_LIBOBJS=$gl_libobjs
+
+    gl_LTLIBOBJS=$gl_ltlibobjs
+
+
+
+    gltests_libobjs=
+    gltests_ltlibobjs=
+    if test -n "$gltests_LIBOBJS"; then
+      # Remove the extension.
+      sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+        gltests_libobjs="$gltests_libobjs $i.$ac_objext"
+        gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
+      done
+    fi
+    gltests_LIBOBJS=$gltests_libobjs
+
+    gltests_LTLIBOBJS=$gltests_ltlibobjs
+
+
+
 if test -z "${HAVE_GUILE_TRUE}" && test -z "${HAVE_GUILE_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GUILE\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -11813,10 +18165,6 @@ if test -z "${USE_CUSTOMS_TRUE}" && test -z "${USE_CUSTOMS_FALSE}"; then
   as_fn_error $? "conditional \"USE_CUSTOMS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${USE_LOCAL_GLOB_TRUE}" && test -z "${USE_LOCAL_GLOB_FALSE}"; then
-  as_fn_error $? "conditional \"USE_LOCAL_GLOB\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${WINDOWSENV_TRUE}" && test -z "${WINDOWSENV_FALSE}"; then
   as_fn_error $? "conditional \"WINDOWSENV\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -12222,7 +18570,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GNU make $as_me 4.2.1, which was
+This file was extended by GNU make $as_me 4.3, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -12290,7 +18638,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-GNU make config.status 4.2.1
+GNU make config.status 4.3
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -12409,7 +18757,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 #
 # INIT-COMMANDS
 #
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
 # Capture the value of obsolete ALL_LINGUAS because we need it to compute
     # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
     # from automake < 1.5.
@@ -12426,15 +18774,14 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 for ac_config_target in $ac_config_targets
 do
   case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
     "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-    "glob/Makefile") CONFIG_FILES="$CONFIG_FILES glob/Makefile" ;;
+    "build.cfg") CONFIG_FILES="$CONFIG_FILES build.cfg" ;;
+    "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;;
     "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
-    "config/Makefile") CONFIG_FILES="$CONFIG_FILES config/Makefile" ;;
     "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
-    "w32/Makefile") CONFIG_FILES="$CONFIG_FILES w32/Makefile" ;;
     "tests/config-flags.pm") CONFIG_FILES="$CONFIG_FILES tests/config-flags.pm" ;;
 
   *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
@@ -13074,29 +19421,35 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
   # Older Autoconf quotes --file arguments for eval, but not when files
   # are listed without --file.  Let's play safe and only enable the eval
   # if we detect the quoting.
-  case $CONFIG_FILES in
-  *\'*) eval set x "$CONFIG_FILES" ;;
-  *)   set x $CONFIG_FILES ;;
-  esac
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  case $CONFIG_FILES in #(
+  *\'*) :
+    eval set x "$CONFIG_FILES" ;; #(
+  *) :
+    set x $CONFIG_FILES ;; #(
+  *) :
+     ;;
+esac
   shift
-  for mf
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
   do
     # Strip MF so we end up with the name of the file.
-    mf=`echo "$mf" | sed -e 's/:.*$//'`
-    # Check whether this is an Automake generated Makefile or not.
-    # We used to match only the files named 'Makefile.in', but
-    # some people rename them; so instead we look at the file content.
-    # Grep'ing the first line is not enough: some people post-process
-    # each Makefile.in and add a new line on top of each file to say so.
-    # Grep'ing the whole file is not good either: AIX grep has a line
+    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
     # limit of 2048, but all sed's we know have understand at least 4000.
-    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-      dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-        X"$mf" : 'X\(//\)[^/]' \| \
-        X"$mf" : 'X\(//\)$' \| \
-        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$mf" |
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$am_mf" : 'X\(//\)[^/]' \| \
+        X"$am_mf" : 'X\(//\)$' \| \
+        X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
            s//\1/
            q
@@ -13114,53 +19467,48 @@ $as_echo X"$mf" |
            q
          }
          s/.*/./; q'`
-    else
-      continue
-    fi
-    # Extract the definition of DEPDIR, am__include, and am__quote
-    # from the Makefile without running 'make'.
-    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-    test -z "$DEPDIR" && continue
-    am__include=`sed -n 's/^am__include = //p' < "$mf"`
-    test -z "$am__include" && continue
-    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-    # Find all dependency output files, they are included files with
-    # $(DEPDIR) in their names.  We invoke sed twice because it is the
-    # simplest approach to changing $(DEPDIR) to its actual value in the
-    # expansion.
-    for file in `sed -n "
-      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
-      # Make sure the directory exists.
-      test -f "$dirpart/$file" && continue
-      fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-        X"$file" : 'X\(//\)[^/]' \| \
-        X"$file" : 'X\(//\)$' \| \
-        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-           s//\1/
-           q
-         }
-         /^X\(\/\/\)[^/].*/{
+    am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$am_mf" : 'X\(//\)$' \| \
+        X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
            s//\1/
            q
          }
-         /^X\(\/\/\)$/{
+         /^X\/\(\/\/\)$/{
            s//\1/
            q
          }
-         /^X\(\/\).*/{
+         /^X\/\(\/\).*/{
            s//\1/
            q
          }
          s/.*/./; q'`
-      as_dir=$dirpart/$fdir; as_fn_mkdir_p
-      # echo "creating $dirpart/$file"
-      echo '# dummy' > "$dirpart/$file"
-    done
+    { echo "$as_me:$LINENO: cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles" >&5
+   (cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } || am_rc=$?
   done
+  if test $am_rc -ne 0; then
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+  { am_dirpart=; unset am_dirpart;}
+  { am_filepart=; unset am_filepart;}
+  { am_mf=; unset am_mf;}
+  { am_rc=; unset am_rc;}
+  rm -f conftest-deps.mk
 }
  ;;
     "po-directories":C)
@@ -13316,11 +19664,3 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
 
-# We only generate the build.sh if we have a build.sh.in; we won't have
-# one before we've created a distribution.
-if test -f "$srcdir/build.sh.in"; then :
-   ./config.status --file build.sh
-  chmod +x build.sh
-
-fi
-
index 64ec8701aa254301f3f33122fabb1940731cdd1e..cd49a2c51584806236209ef29aec334007987b31 100644 (file)
@@ -1,6 +1,6 @@
 # Process this file with autoconf to produce a configure script.
 #
-# Copyright (C) 1993-2016 Free Software Foundation, Inc.
+# Copyright (C) 1993-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
 # You should have received a copy of the GNU General Public License along with
 # this program.  If not, see <http://www.gnu.org/licenses/>.
 
-AC_INIT([GNU make],[4.2.1],[bug-make@gnu.org])
+AC_INIT([GNU make],[4.3],[bug-make@gnu.org])
 
 AC_PREREQ([2.69])
 
 # Autoconf setup
-AC_CONFIG_AUX_DIR([config])
-AC_CONFIG_SRCDIR([vpath.c])
-AC_CONFIG_HEADERS([config.h])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_SRCDIR([src/vpath.c])
+AC_CONFIG_HEADERS([src/config.h])
+
+AC_CONFIG_LIBOBJ_DIR([lib])
 
 # Automake setup
 # We have to enable "foreign" because ChangeLog is auto-generated
-# We cannot enable -Werror because gettext 0.18.1 has invalid content
-# When we update gettext to 0.18.3 or better we can add it again.
-AM_INIT_AUTOMAKE([1.15 foreign -Werror -Wall])
+# Automake 1.15 and gnulib don't get along: gnulib has some strange error
+# in the way it handles getloadavg.c which causes make distcheck to fail.
+# http://lists.gnu.org/archive/html/bug-gnulib/2018-06/msg00024.html
+AM_INIT_AUTOMAKE([1.16.1 foreign -Werror -Wall])
 
 # Checks for programs.
 AC_USE_SYSTEM_EXTENSIONS
 AC_PROG_CC
+
+# Configure gnulib
+gl_EARLY
+gl_INIT
+
 AC_PROG_INSTALL
 AC_PROG_RANLIB
 AC_PROG_CPP
@@ -41,14 +49,12 @@ AC_CHECK_PROG([AR], [ar], [ar], [ar])
 # Perl is needed for the test suite (only)
 AC_CHECK_PROG([PERL], [perl], [perl], [perl])
 
-# Needed for w32/Makefile.am
-AM_PROG_AR
-
 # Specialized system macros
 AC_CANONICAL_HOST
 AC_AIX
 AC_ISC_POSIX
 AC_MINIX
+AC_C_BIGENDIAN
 
 # Enable gettext, in "external" mode.
 AM_GNU_GETTEXT_VERSION([0.19.4])
@@ -69,7 +75,7 @@ AC_HEADER_STAT
 AC_HEADER_TIME
 AC_CHECK_HEADERS([stdlib.h locale.h unistd.h limits.h fcntl.h string.h \
                   memory.h sys/param.h sys/resource.h sys/time.h sys/timeb.h \
-                  sys/select.h])
+                  sys/select.h sys/file.h spawn.h])
 
 AM_PROG_CC_C_O
 AC_C_CONST
@@ -121,8 +127,8 @@ AC_CACHE_CHECK([for standard gettimeofday], [ac_cv_func_gettimeofday],
                   int main ()
                   {
                     struct timeval t; t.tv_sec = -1; t.tv_usec = -1;
-                    exit (gettimeofday (&t, 0) != 0
-                          || t.tv_sec < 0 || t.tv_usec < 0);
+                    return gettimeofday (&t, 0) != 0
+                          || t.tv_sec < 0 || t.tv_usec < 0;
                   }]])],
                   [ac_cv_func_gettimeofday=yes],
                   [ac_cv_func_gettimeofday=no],
@@ -132,11 +138,12 @@ AS_IF([test "$ac_cv_func_gettimeofday" = yes],
             [Define to 1 if you have a standard gettimeofday function])
 ])
 
-AC_CHECK_FUNCS([strdup strndup mkstemp mktemp fdopen fileno \
+AC_CHECK_FUNCS([strdup strndup memrchr umask mkstemp mktemp fdopen \
                 dup dup2 getcwd realpath sigsetmask sigaction \
                 getgroups seteuid setegid setlinebuf setreuid setregid \
-                getrlimit setrlimit setvbuf pipe strerror strsignal \
-                lstat readlink atexit isatty ttyname pselect])
+                getrlimit setrlimit setvbuf pipe strsignal \
+                lstat readlink atexit isatty ttyname pselect posix_spawn \
+                posix_spawnattr_setsigmask])
 
 # We need to check declarations, not just existence, because on Tru64 this
 # function is not declared without special flags, which themselves cause
@@ -155,47 +162,44 @@ AC_CHECK_FUNCS([strcasecmp strncasecmp strcmpi strncmpi stricmp strnicmp])
 
 # strcoll() is used by the GNU glob library
 AC_FUNC_STRCOLL
-
-AC_FUNC_ALLOCA
 AC_FUNC_CLOSEDIR_VOID
 
+# dir.c and our glob.c use dirent.d_type if available
+AC_STRUCT_DIRENT_D_TYPE
+
 # See if the user wants to add (or not) GNU Guile support
-PKG_PROG_PKG_CONFIG
 AC_ARG_WITH([guile], [AS_HELP_STRING([--with-guile],
             [Support GNU Guile for embedded scripting])])
 
-# For some strange reason, at least on Ubuntu, each version of Guile
-# comes with it's own PC file so we have to specify them as individual
-# packages.  Ugh.
-AS_IF([test "x$with_guile" != xno],
-[ PKG_CHECK_MODULES([GUILE], [guile-2.0], [have_guile=yes],
-  [PKG_CHECK_MODULES([GUILE], [guile-1.8], [have_guile=yes],
-    [have_guile=no])])
-])
-
-AS_IF([test "$have_guile" = yes],
-      [AC_DEFINE([HAVE_GUILE], [1], [Embed GNU Guile support])])
-
-AM_CONDITIONAL([HAVE_GUILE], [test "$have_guile" = yes])
-
-AC_FUNC_GETLOADAVG
-
-# AC_FUNC_GETLOADAVG is documented to set the NLIST_STRUCT value, but it
-# doesn't.  So, we will.
+# Annoyingly, each version of Guile comes with it's own PC file so we have to
+# specify them as individual packages.  Ugh.
+PKG_PROG_PKG_CONFIG
 
-AS_IF([test "$ac_cv_header_nlist_h" = yes],
-[ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <nlist.h>]],
-        [[struct nlist nl;
-          nl.n_name = "string";
-          return 0;]])],
-        [make_cv_nlist_struct=yes],
-        [make_cv_nlist_struct=no])
-  AS_IF([test "$make_cv_nlist_struct" = yes],
-  [ AC_DEFINE([NLIST_STRUCT], [1],
-       [Define to 1 if struct nlist.n_name is a pointer rather than an array.])
+AS_IF([test "x$with_guile" != xno],
+[ guile_versions="3.0 2.2 2.0 1.8"
+  guile_version=no
+  have_guile=no
+  AC_MSG_CHECKING([for GNU Guile])
+  for v in $guile_versions; do
+    PKG_CHECK_EXISTS([guile-$v], [guile_version=$v; have_guile=yes; break], [])
+  done
+  AC_MSG_RESULT([$guile_version])
+  AS_IF([test "$have_guile" = yes],
+  [ PKG_CHECK_MODULES(GUILE, [guile-$guile_version])
+    # Unfortunately Guile requires a C99 compiler but GNU make doesn't, so
+    # verify we can actually compile the header.
+    keep_CPPFLAGS="$CPPFLAGS"
+    CPPFLAGS="$CPPFLAGS $pkg_cv_GUILE_CFLAGS"
+    AC_CHECK_HEADER([libguile.h],
+                    [AC_DEFINE([HAVE_GUILE], [1], [Embed GNU Guile support])],
+                    [have_guile=no],
+                    [/* Avoid configuration error warnings. */])
+    CPPFLAGS="$keep_CPPFLAGS"
   ])
 ])
 
+AM_CONDITIONAL([HAVE_GUILE], [test "$have_guile" = "yes"])
+
 AC_CHECK_DECLS([sys_siglist, _sys_siglist, __sys_siglist], , ,
   [AC_INCLUDES_DEFAULT
 #include <signal.h>
@@ -364,6 +368,43 @@ AS_IF([test "$ac_cv_func_lstat" = yes && test "$ac_cv_func_readlink" = yes],
               [Define to 1 to enable symbolic link timestamp checking.])
 ])
 
+# Use posix_spawn if we have support and the user didn't disable it
+
+AC_ARG_ENABLE([posix-spawn],
+  AC_HELP_STRING([--disable-posix-spawn],
+                 [disable support for posix_spawn()]),
+  [make_cv_posix_spawn="$enableval" user_posix_spawn="$enableval"],
+  [make_cv_posix_spawn="yes"])
+
+AS_CASE([/$ac_cv_header_spawn/$ac_cv_func_posix_spawn/],
+  [*/no/*], [make_cv_posix_spawn=no])
+
+AS_IF([test "$make_cv_posix_spawn" = yes],
+  AC_CACHE_CHECK([for posix_spawn that fails synchronously],
+    [make_cv_synchronous_posix_spawn],
+    [make_cv_synchronous_posix_spawn=no
+     AC_RUN_IFELSE([AC_LANG_SOURCE([[
+       #include <spawn.h>
+       #include <string.h>
+
+       extern char **environ;
+
+       int main() {
+         char* path = strdup("./non-existent");
+         char *argv[[2]];
+         argv[[0]] = path;
+         argv[[1]] =  0;
+         return posix_spawn(0, path, 0, 0, argv, environ);
+       }]])],
+       [make_cv_synchronous_posix_spawn=no],
+       [make_cv_synchronous_posix_spawn=yes],
+       [make_cv_synchronous_posix_spawn="no (cross-compiling)"])]))
+
+AS_CASE([/$user_posix_spawn/$make_cv_posix_spawn/$make_cv_synchronous_posix_spawn/],
+  [*/no/*], [make_cv_posix_spawn=no],
+  [AC_DEFINE(USE_POSIX_SPAWN, 1, [Define to 1 to use posix_spawn().])
+  ])
+
 # Find the SCCS commands, so we can include them in our default rules.
 
 AC_CACHE_CHECK([for location of SCCS get command], [make_cv_path_sccs_get], [
@@ -391,33 +432,6 @@ AS_IF([(/usr/sccs/admin -n s.conftest || admin -n s.conftest) >/dev/null 2>&1 &&
 ])
 rm -f s.conftest conftoast
 
-# Check the system to see if it provides GNU glob.  If not, use our
-# local version.
-AC_CACHE_CHECK([if system libc has GNU glob], [make_cv_sys_gnu_glob],
-[ AC_EGREP_CPP([gnu glob],[
-#include <features.h>
-#include <glob.h>
-#include <fnmatch.h>
-
-#define GLOB_INTERFACE_VERSION 1
-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
-# include <gnu-versions.h>
-# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
-   gnu glob
-# endif
-#endif],
-        [make_cv_sys_gnu_glob=yes],
-        [make_cv_sys_gnu_glob=no])])
-AS_IF([test "$make_cv_sys_gnu_glob" = no],
-[ GLOBINC='-I$(srcdir)/glob'
-  GLOBLIB=glob/libglob.a
-])
-AC_SUBST([GLOBINC])
-AC_SUBST([GLOBLIB])
-
-# Tell automake about this, so it can build the right .c files.
-AM_CONDITIONAL([USE_LOCAL_GLOB], [test "$make_cv_sys_gnu_glob" = no])
-
 # Let the makefile know what our build host is
 
 AC_DEFINE_UNQUOTED([MAKE_HOST],["$host"],[Build host information.])
@@ -500,21 +514,22 @@ AS_IF([test "x$make_cv_load" = xno && test "x$user_load" = xyes],
   echo
 ])
 
+AS_IF([test "x$make_cv_posix_spawn" = xno && test "x$user_posix_spawn" = xyes],
+[ echo
+  echo "WARNING: posix_spawn() is not supported on this system."
+  echo
+])
+
 # Specify what files are to be created.
-AC_CONFIG_FILES([Makefile glob/Makefile po/Makefile.in config/Makefile \
-                 doc/Makefile w32/Makefile tests/config-flags.pm])
+AC_CONFIG_FILES([Makefile build.cfg lib/Makefile po/Makefile.in doc/Makefile \
+                 tests/config-flags.pm])
+# We don't need this: the standard automake output suffices for POSIX systems.
+#mk/Posix.mk
 
 # OK, do it!
 
 AC_OUTPUT
 
-# We only generate the build.sh if we have a build.sh.in; we won't have
-# one before we've created a distribution.
-AS_IF([test -f "$srcdir/build.sh.in"],
-[ ./config.status --file build.sh
-  chmod +x build.sh
-])
-
 dnl Local Variables:
 dnl comment-start: "dnl "
 dnl comment-end: ""
diff --git a/configure.bat b/configure.bat
deleted file mode 100644 (file)
index 3c41f38..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-@echo off\r
-rem Copyright (C) 1994-2016 Free Software Foundation, Inc.\r
-rem This file is part of GNU Make.\r
-rem\r
-rem GNU Make is free software; you can redistribute it and/or modify it under\r
-rem the terms of the GNU General Public License as published by the Free\r
-rem Software Foundation; either version 3 of the License, or (at your option)\r
-rem any later version.\r
-rem\r
-rem GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
-rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
-rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
-rem more details.\r
-rem\r
-rem You should have received a copy of the GNU General Public License along\r
-rem with this program.  If not, see <http://www.gnu.org/licenses/>.\r
-\r
-echo Configuring MAKE for DJGPP\r
-\r
-rem The SmallEnv trick protects against too small environment block,\r
-rem in which case the values will be truncated and the whole thing\r
-rem goes awry.  COMMAND.COM will say "Out of environment space", but\r
-rem many people don't care, so we force them to care by refusing to go.\r
-\r
-rem Where is the srcdir?\r
-set XSRC=.\r
-if not "%XSRC%"=="." goto SmallEnv\r
-if "%1%"=="" goto SrcDone\r
-set XSRC=%1\r
-if not "%XSRC%"=="%1" goto SmallEnv\r
-\r
-:SrcDone\r
-\r
-update %XSRC%/configh.dos ./config.h\r
-\r
-rem Do they have Make?\r
-redir -o junk.$$$ -eo make -n -f NUL\r
-rem REDIR will return 1 if it cannot run Make.\r
-rem If it can run Make, it will usually return 2,\r
-rem but 0 is also OK with us.\r
-if errorlevel 2 goto MakeOk\r
-if not errorlevel 1 goto MakeOk\r
-if exist junk.$$$ del junk.$$$\r
-echo No Make program found--use DOSBUILD.BAT to build Make.\r
-goto End\r
-\r
-rem They do have Make. Generate the Makefile.\r
-\r
-:MakeOk\r
-del junk.$$$\r
-update %XSRC%/Makefile.DOS ./Makefile\r
-echo Done.\r
-if not "%XSRC%"=="." echo Invoke Make thus: "make srcdir=%XSRC%"\r
-goto End\r
-\r
-:SmallEnv\r
-echo Your environment is too small.  Please enlarge it and run me again.\r
-\r
-:End\r
-set XRSC=\r
diff --git a/debug.h b/debug.h
deleted file mode 100644 (file)
index 17c394b..0000000
--- a/debug.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Debugging macros and interface.
-Copyright (C) 1999-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#define DB_NONE         (0x000)
-#define DB_BASIC        (0x001)
-#define DB_VERBOSE      (0x002)
-#define DB_JOBS         (0x004)
-#define DB_IMPLICIT     (0x008)
-#define DB_MAKEFILES    (0x100)
-
-#define DB_ALL          (0xfff)
-
-extern int db_level;
-
-#define ISDB(_l)    ((_l)&db_level)
-
-#define DBS(_l,_x)  do{ if(ISDB(_l)) {print_spaces (depth); \
-                                      printf _x; fflush (stdout);} }while(0)
-
-#define DBF(_l,_x)  do{ if(ISDB(_l)) {print_spaces (depth); \
-                                      printf (_x, file->name); \
-                                      fflush (stdout);} }while(0)
-
-#define DB(_l,_x)   do{ if(ISDB(_l)) {printf _x; fflush (stdout);} }while(0)
diff --git a/default.c b/default.c
deleted file mode 100644 (file)
index 3d865c7..0000000
--- a/default.c
+++ /dev/null
@@ -1,757 +0,0 @@
-/* Data base of default implicit rules for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "filedef.h"
-#include "variable.h"
-#include "rule.h"
-#include "dep.h"
-#include "job.h"
-#include "commands.h"
-
-/* Define GCC_IS_NATIVE if gcc is the native development environment on
-   your system (gcc/bison/flex vs cc/yacc/lex).  */
-#if defined(__MSDOS__) || defined(__EMX__)
-# define GCC_IS_NATIVE
-#endif
-
-
-/* This is the default list of suffixes for suffix rules.
-   '.s' must come last, so that a '.o' file will be made from
-   a '.c' or '.p' or ... file rather than from a .s file.  */
-
-static char default_suffixes[]
-#ifdef VMS
-  /* VMS should include all UNIX/POSIX + some VMS extensions */
-  = ".out .exe .a .olb .hlb .tlb .mlb .ln .o .obj .c .cxx .cc .cpp .pas .p \
-.for .f .r .y .l .ym .yl .mar .s .ss .i .ii .mod .sym .def .h .info .dvi \
-.tex .texinfo .texi .txinfo .mem .hlp .brn .rnh .rno .rnt .rnx .w .ch .cweb \
-.web .com .sh .elc .el";
-#elif defined(__EMX__)
-  = ".out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S \
-.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \
-.w .ch .web .sh .elc .el .obj .exe .dll .lib";
-#else
-  = ".out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S \
-.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \
-.w .ch .web .sh .elc .el";
-#endif
-
-static struct pspec default_pattern_rules[] =
-  {
-#ifdef VMS
-    { "(%)", "%",
-        "@if f$$search(\"$@\") .eqs. \"\" then $(LIBRARY)/CREATE/"
-         "$(or "
-          "$(patsubst %,TEXT,$(filter %.tlb %.TLB,$@)),"
-          "$(patsubst %,HELP,$(filter %.hlb %.HLB,$@)),"
-          "$(patsubst %,MACRO,$(filter %.mlb %.MLB,$@)),"
-          "$(and "
-           "$(patsubst %,SHARE,$(filter %.olb %.OLB,$@)),"
-           "$(patsubst %,SHARE,$(filter %.exe %.EXE,$<))),"
-          "OBJECT)"
-         " $@\n"
-        "$(AR) $(ARFLAGS) $@ $<" },
-
-#else
-    { "(%)", "%",
-        "$(AR) $(ARFLAGS) $@ $<" },
-#endif
-    /* The X.out rules are only in BSD's default set because
-       BSD Make has no null-suffix rules, so 'foo.out' and
-       'foo' are the same thing.  */
-#ifdef VMS
-    { "%.exe", "%",
-        "$(CP) $< $@" },
-
-#endif
-    { "%.out", "%",
-        "@rm -f $@ \n cp $< $@" },
-
-    /* Syntax is "ctangle foo.w foo.ch foo.c".  */
-    { "%.c", "%.w %.ch",
-        "$(CTANGLE) $^ $@" },
-    { "%.tex", "%.w %.ch",
-        "$(CWEAVE) $^ $@" },
-
-    { 0, 0, 0 }
-  };
-
-static struct pspec default_terminal_rules[] =
-  {
-#ifdef VMS
-
-    /* RCS.  */
-    { "%", "%$$5lv", /* Multinet style */
-        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
-    { "%", "[.$$rcs]%$$5lv", /* Multinet style */
-        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
-    { "%", "%_v", /* Normal style */
-        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
-    { "%", "[.rcs]%_v", /* Normal style */
-        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
-
-    /* SCCS.  */
-        /* ain't no SCCS on vms */
-
-#else
-    /* RCS.  */
-    { "%", "%,v",
-        "$(CHECKOUT,v)" },
-    { "%", "RCS/%,v",
-        "$(CHECKOUT,v)" },
-    { "%", "RCS/%",
-        "$(CHECKOUT,v)" },
-
-    /* SCCS.  */
-    { "%", "s.%",
-        "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" },
-    { "%", "SCCS/s.%",
-        "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" },
-#endif /* !VMS */
-    { 0, 0, 0 }
-  };
-
-static const char *default_suffix_rules[] =
-  {
-#ifdef VMS
-    ".o",
-    "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".obj",
-    "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".s",
-    "$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".S",
-    "$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".c",
-    "$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".cc",
-    "$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".C",
-    "$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".cpp",
-    "$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".f",
-    "$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".m",
-    "$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".p",
-    "$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".F",
-    "$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".r",
-    "$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".mod",
-    "$(COMPILE.mod) -o $@ -e $@ $^",
-
-    ".def.sym",
-    "$(COMPILE.def) -o $@ $<",
-
-    ".sh",
-    "copy $< >$@",
-
-    ".obj.exe",
-    "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
-    ".mar.exe",
-    "$(COMPILE.mar) $^ \n $(LINK.obj) $(subst .mar,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
-    ".s.o",
-    "$(COMPILE.s) -o $@ $<",
-    ".s.exe",
-    "$(COMPILE.s) $^ \n $(LINK.obj) $(subst .s,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
-    ".c.exe",
-    "$(COMPILE.c) $^ \n $(LINK.obj) $(subst .c,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
-    ".cc.exe",
-#ifdef GCC_IS_NATIVE
-    "$(COMPILE.cc) $^ \n $(LINK.obj) $(CXXSTARTUP),sys$$disk:[]$(subst .cc,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@",
-#else
-    "$(COMPILE.cc) $^ \n $(CXXLINK.obj) $(subst .cc,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@",
-    ".cxx.exe",
-    "$(COMPILE.cxx) $^ \n $(CXXLINK.obj) $(subst .cxx,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@",
-#endif
-    ".for.exe",
-    "$(COMPILE.for) $^ \n $(LINK.obj) $(subst .for,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
-    ".pas.exe",
-    "$(COMPILE.pas) $^ \n $(LINK.obj) $(subst .pas,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
-
-    ".com",
-    "copy $< >$@",
-
-    ".mar.obj",
-    "$(COMPILE.mar) /obj=$@ $<",
-    ".s.obj",
-    "$(COMPILE.s) /obj=$@ $<",
-    ".ss.obj",
-    "$(COMPILE.s) /obj=$@ $<",
-    ".c.i",
-    "$(COMPILE.c)/prep /list=$@ $<",
-    ".c.s",
-    "$(COMPILE.c)/noobj/machine /list=$@ $<",
-    ".i.s",
-    "$(COMPILE.c)/noprep/noobj/machine /list=$@ $<",
-    ".c.obj",
-    "$(COMPILE.c) /obj=$@ $<",
-    ".c.o",
-    "$(COMPILE.c) /obj=$@ $<",
-    ".cc.ii",
-    "$(COMPILE.cc)/prep /list=$@ $<",
-    ".cc.ss",
-    "$(COMPILE.cc)/noobj/machine /list=$@ $<",
-    ".ii.ss",
-    "$(COMPILE.cc)/noprep/noobj/machine /list=$@ $<",
-    ".cc.obj",
-    "$(COMPILE.cc) /obj=$@ $<",
-    ".cc.o",
-    "$(COMPILE.cc) /obj=$@ $<",
-    ".cxx.obj",
-    "$(COMPILE.cxx) /obj=$@ $<",
-    ".cxx.o",
-    "$(COMPILE.cxx) /obj=$@ $<",
-    ".for.obj",
-    "$(COMPILE.for) /obj=$@ $<",
-    ".for.o",
-    "$(COMPILE.for) /obj=$@ $<",
-    ".pas.obj",
-    "$(COMPILE.pas) /obj=$@ $<",
-    ".pas.o",
-    "$(COMPILE.pas) /obj=$@ $<",
-
-    ".y.c",
-    "$(YACC.y) $< \n rename y_tab.c $@",
-    ".l.c",
-    "$(LEX.l) $< \n rename lexyy.c $@",
-
-    ".texinfo.info",
-    "$(MAKEINFO) $<",
-
-    ".tex.dvi",
-    "$(TEX) $<",
-
-    ".cpp.o",
-    "$(COMPILE.cpp) $(OUTPUT_OPTION) $<",
-    ".f.o",
-    "$(COMPILE.f) $(OUTPUT_OPTION) $<",
-    ".m.o",
-    "$(COMPILE.m) $(OUTPUT_OPTION) $<",
-    ".p.o",
-    "$(COMPILE.p) $(OUTPUT_OPTION) $<",
-    ".r.o",
-    "$(COMPILE.r) $(OUTPUT_OPTION) $<",
-    ".mod.o",
-    "$(COMPILE.mod) -o $@ $<",
-
-    ".c.ln",
-    "$(LINT.c) -C$* $<",
-    ".y.ln",
-    "$(YACC.y) $< \n rename y_tab.c $@",
-
-    ".l.ln",
-    "@$(RM) $*.c\n $(LEX.l) $< > $*.c\n$(LINT.c) -i $*.c -o $@\n $(RM) $*.c",
-
-#else /* ! VMS */
-
-    ".o",
-    "$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".s",
-    "$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".S",
-    "$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".c",
-    "$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".cc",
-    "$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".C",
-    "$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".cpp",
-    "$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".f",
-    "$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".m",
-    "$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".p",
-    "$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".F",
-    "$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".r",
-    "$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@",
-    ".mod",
-    "$(COMPILE.mod) -o $@ -e $@ $^",
-
-    ".def.sym",
-    "$(COMPILE.def) -o $@ $<",
-
-    ".sh",
-    "cat $< >$@ \n chmod a+x $@",
-
-    ".s.o",
-    "$(COMPILE.s) -o $@ $<",
-    ".S.o",
-    "$(COMPILE.S) -o $@ $<",
-    ".c.o",
-    "$(COMPILE.c) $(OUTPUT_OPTION) $<",
-    ".cc.o",
-    "$(COMPILE.cc) $(OUTPUT_OPTION) $<",
-    ".C.o",
-    "$(COMPILE.C) $(OUTPUT_OPTION) $<",
-    ".cpp.o",
-    "$(COMPILE.cpp) $(OUTPUT_OPTION) $<",
-    ".f.o",
-    "$(COMPILE.f) $(OUTPUT_OPTION) $<",
-    ".m.o",
-    "$(COMPILE.m) $(OUTPUT_OPTION) $<",
-    ".p.o",
-    "$(COMPILE.p) $(OUTPUT_OPTION) $<",
-    ".F.o",
-    "$(COMPILE.F) $(OUTPUT_OPTION) $<",
-    ".r.o",
-    "$(COMPILE.r) $(OUTPUT_OPTION) $<",
-    ".mod.o",
-    "$(COMPILE.mod) -o $@ $<",
-
-    ".c.ln",
-    "$(LINT.c) -C$* $<",
-    ".y.ln",
-#ifndef __MSDOS__
-    "$(YACC.y) $< \n $(LINT.c) -C$* y.tab.c \n $(RM) y.tab.c",
-#else
-    "$(YACC.y) $< \n $(LINT.c) -C$* y_tab.c \n $(RM) y_tab.c",
-#endif
-    ".l.ln",
-    "@$(RM) $*.c\n $(LEX.l) $< > $*.c\n$(LINT.c) -i $*.c -o $@\n $(RM) $*.c",
-
-    ".y.c",
-#ifndef __MSDOS__
-    "$(YACC.y) $< \n mv -f y.tab.c $@",
-#else
-    "$(YACC.y) $< \n mv -f y_tab.c $@",
-#endif
-    ".l.c",
-    "@$(RM) $@ \n $(LEX.l) $< > $@",
-    ".ym.m",
-    "$(YACC.m) $< \n mv -f y.tab.c $@",
-    ".lm.m",
-    "@$(RM) $@ \n $(LEX.m) $< > $@",
-
-    ".F.f",
-    "$(PREPROCESS.F) $(OUTPUT_OPTION) $<",
-    ".r.f",
-    "$(PREPROCESS.r) $(OUTPUT_OPTION) $<",
-
-    /* This might actually make lex.yy.c if there's no %R% directive in $*.l,
-       but in that case why were you trying to make $*.r anyway?  */
-    ".l.r",
-    "$(LEX.l) $< > $@ \n mv -f lex.yy.r $@",
-
-    ".S.s",
-    "$(PREPROCESS.S) $< > $@",
-
-    ".texinfo.info",
-    "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@",
-
-    ".texi.info",
-    "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@",
-
-    ".txinfo.info",
-    "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@",
-
-    ".tex.dvi",
-    "$(TEX) $<",
-
-    ".texinfo.dvi",
-    "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<",
-
-    ".texi.dvi",
-    "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<",
-
-    ".txinfo.dvi",
-    "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<",
-
-    ".w.c",
-    "$(CTANGLE) $< - $@",       /* The '-' says there is no '.ch' file.  */
-
-    ".web.p",
-    "$(TANGLE) $<",
-
-    ".w.tex",
-    "$(CWEAVE) $< - $@",        /* The '-' says there is no '.ch' file.  */
-
-    ".web.tex",
-    "$(WEAVE) $<",
-
-#endif /* !VMS */
-
-    0, 0,
-  };
-
-static const char *default_variables[] =
-  {
-#ifdef VMS
-#ifdef __ALPHA
-    "ARCH", "ALPHA",
-#endif
-#ifdef __ia64
-    "ARCH", "IA64",
-#endif
-#ifdef __VAX
-    "ARCH", "VAX",
-#endif
-    "AR", "library",
-    "LIBRARY", "library",
-    "ARFLAGS", "/replace",
-    "AS", "macro",
-    "MACRO", "macro",
-#ifdef GCC_IS_NATIVE
-    "CC", "gcc",
-#else
-    "CC", "cc",
-#endif
-    "CD", "builtin_cd",
-    "ECHO", "builtin_echo",
-#ifdef GCC_IS_NATIVE
-    "C++", "gcc/plus",
-    "CXX", "gcc/plus",
-#else
-    "C++", "cxx",
-    "CXX", "cxx",
-#ifndef __ia64
-    "CXXLD", "cxxlink",
-    "CXXLINK", "cxxlink",
-#else
-    /* CXXLINK is not used on VMS/IA64 */
-    "CXXLD", "link",
-    "CXXLINK", "link",
-#endif
-#endif
-    "CO", "co",
-    "CPP", "$(CC) /preprocess_only",
-    "FC", "fortran",
-    /* System V uses these, so explicit rules using them should work.
-       However, there is no way to make implicit rules use them and FC.  */
-    "F77", "$(FC)",
-    "F77FLAGS", "$(FFLAGS)",
-    "LD", "link",
-    "LEX", "lex",
-    "PC", "pascal",
-    "YACC", "bison/yacc",
-    "YFLAGS", "/Define/Verbose",
-    "BISON", "bison",
-    "MAKEINFO", "makeinfo",
-    "TEX", "tex",
-    "TEXINDEX", "texindex",
-
-    "RM", "delete/nolog",
-
-    "CSTARTUP", "",
-#ifdef GCC_IS_NATIVE
-    "CRT0", ",sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crt0.obj",
-    "CXXSTARTUP", "gnu_cc_library:crtbegin.obj",
-    "CXXRT0", ",sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crtend.obj,gnu_cc_library:gxx_main.obj",
-    "LXLIBS", ",gnu_cc_library:libstdcxx.olb/lib,gnu_cc_library:libgccplus.olb/lib",
-    "LDLIBS", ",gnu_cc_library:libgcc.olb/lib",
-#else
-    "CRT0", "",
-    "CXXSTARTUP", "",
-    "CXXRT0", "",
-    "LXLIBS", "",
-    "LDLIBS", "",
-#endif
-
-    "LINK.o", "$(LD) $(LDFLAGS)",
-    "LINK.obj", "$(LD) $(LDFLAGS)",
-#ifndef GCC_IS_NATIVE
-    "CXXLINK.obj", "$(CXXLD) $(LDFLAGS)",
-    "COMPILE.cxx", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-#endif
-    "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-    "LINK.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-    "COMPILE.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-    "COMPILE.C", "$(COMPILE.cc)",
-    "COMPILE.cpp", "$(COMPILE.cc)",
-    "LINK.C", "$(LINK.cc)",
-    "LINK.cpp", "$(LINK.cc)",
-    "YACC.y", "$(YACC) $(YFLAGS)",
-    "LEX.l", "$(LEX) $(LFLAGS)",
-    "YACC.m", "$(YACC) $(YFLAGS)",
-    "LEX.m", "$(LEX) $(LFLAGS) -t",
-    "COMPILE.for", "$(FC) $(FFLAGS) $(TARGET_ARCH)",
-    "COMPILE.f", "$(FC) $(FFLAGS) $(TARGET_ARCH) -c",
-    "LINK.f", "$(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c",
-    "LINK.r", "$(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.pas", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-    "COMPILE.def", "$(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)",
-    "COMPILE.mod", "$(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)",
-    "COMPILE.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.mar", "$(MACRO) $(MACROFLAGS)",
-    "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)",
-    "LINK.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)",
-    "COMPILE.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c",
-    "PREPROCESS.S", "$(CC) -E $(CPPFLAGS)",
-    "PREPROCESS.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F",
-    "PREPROCESS.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F",
-    "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-
-    "MV", "rename/new_version",
-    "CP", "copy",
-    ".LIBPATTERNS", "%.olb lib%.a",
-
-#else /* !VMS */
-
-    "AR", "ar",
-    "ARFLAGS", "rv",
-    "AS", "as",
-#ifdef GCC_IS_NATIVE
-    "CC", "gcc",
-# ifdef __MSDOS__
-    "CXX", "gpp",       /* g++ is an invalid name on MSDOS */
-# else
-    "CXX", "gcc",
-# endif /* __MSDOS__ */
-    "OBJC", "gcc",
-#else
-    "CC", "cc",
-    "CXX", "g++",
-    "OBJC", "cc",
-#endif
-
-    /* This expands to $(CO) $(COFLAGS) $< $@ if $@ does not exist,
-       and to the empty string if $@ does exist.  */
-    "CHECKOUT,v", "+$(if $(wildcard $@),,$(CO) $(COFLAGS) $< $@)",
-    "CO", "co",
-    "COFLAGS", "",
-
-    "CPP", "$(CC) -E",
-#ifdef  CRAY
-    "CF77PPFLAGS", "-P",
-    "CF77PP", "/lib/cpp",
-    "CFT", "cft77",
-    "CF", "cf77",
-    "FC", "$(CF)",
-#else   /* Not CRAY.  */
-#ifdef  _IBMR2
-    "FC", "xlf",
-#else
-#ifdef  __convex__
-    "FC", "fc",
-#else
-    "FC", "f77",
-#endif /* __convex__ */
-#endif /* _IBMR2 */
-    /* System V uses these, so explicit rules using them should work.
-       However, there is no way to make implicit rules use them and FC.  */
-    "F77", "$(FC)",
-    "F77FLAGS", "$(FFLAGS)",
-#endif  /* Cray.  */
-    "GET", SCCS_GET,
-    "LD", "ld",
-#ifdef GCC_IS_NATIVE
-    "LEX", "flex",
-#else
-    "LEX", "lex",
-#endif
-    "LINT", "lint",
-    "M2C", "m2c",
-#ifdef  pyr
-    "PC", "pascal",
-#else
-#ifdef  CRAY
-    "PC", "PASCAL",
-    "SEGLDR", "segldr",
-#else
-    "PC", "pc",
-#endif  /* CRAY.  */
-#endif  /* pyr.  */
-#ifdef GCC_IS_NATIVE
-    "YACC", "bison -y",
-#else
-    "YACC", "yacc",     /* Or "bison -y"  */
-#endif
-    "MAKEINFO", "makeinfo",
-    "TEX", "tex",
-    "TEXI2DVI", "texi2dvi",
-    "WEAVE", "weave",
-    "CWEAVE", "cweave",
-    "TANGLE", "tangle",
-    "CTANGLE", "ctangle",
-
-    "RM", "rm -f",
-
-    "LINK.o", "$(CC) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-#ifndef HAVE_CASE_INSENSITIVE_FS
-    /* On case-insensitive filesystems, treat *.C files as *.c files,
-       to avoid erroneously compiling C sources as C++, which will
-       probably fail.  */
-    "COMPILE.C", "$(COMPILE.cc)",
-#else
-    "COMPILE.C", "$(COMPILE.c)",
-#endif
-    "COMPILE.cpp", "$(COMPILE.cc)",
-    "LINK.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-#ifndef HAVE_CASE_INSENSITIVE_FS
-    "LINK.C", "$(LINK.cc)",
-#else
-    "LINK.C", "$(LINK.c)",
-#endif
-    "LINK.cpp", "$(LINK.cc)",
-    "YACC.y", "$(YACC) $(YFLAGS)",
-    "LEX.l", "$(LEX) $(LFLAGS) -t",
-    "YACC.m", "$(YACC) $(YFLAGS)",
-    "LEX.m", "$(LEX) $(LFLAGS) -t",
-    "COMPILE.f", "$(FC) $(FFLAGS) $(TARGET_ARCH) -c",
-    "LINK.f", "$(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c",
-    "LINK.r", "$(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "COMPILE.def", "$(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)",
-    "COMPILE.mod", "$(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)",
-    "COMPILE.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
-    "LINK.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
-    "LINK.s", "$(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)",
-    "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)",
-    "LINK.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)",
-    "COMPILE.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c",
-    "PREPROCESS.S", "$(CC) -E $(CPPFLAGS)",
-    "PREPROCESS.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F",
-    "PREPROCESS.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F",
-    "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
-
-#ifndef NO_MINUS_C_MINUS_O
-    "OUTPUT_OPTION", "-o $@",
-#endif
-
-#ifdef  SCCS_GET_MINUS_G
-    "SCCS_OUTPUT_OPTION", "-G$@",
-#endif
-
-#if defined(_AMIGA)
-    ".LIBPATTERNS", "%.lib",
-#elif defined(__MSDOS__)
-    ".LIBPATTERNS", "lib%.a $(DJDIR)/lib/lib%.a",
-#elif defined(__APPLE__)
-    ".LIBPATTERNS", "lib%.dylib lib%.a",
-#elif defined(__CYGWIN__) || defined(WINDOWS32)
-    ".LIBPATTERNS", "lib%.dll.a %.dll.a lib%.a %.lib lib%.dll %.dll",
-#else
-    ".LIBPATTERNS", "lib%.so lib%.a",
-#endif
-
-#endif /* !VMS */
-    /* Make this assignment to avoid undefined variable warnings.  */
-    "GNUMAKEFLAGS", "",
-    0, 0
-  };
-\f
-/* Set up the default .SUFFIXES list.  */
-
-void
-set_default_suffixes (void)
-{
-  suffix_file = enter_file (strcache_add (".SUFFIXES"));
-  suffix_file->builtin = 1;
-
-  if (no_builtin_rules_flag)
-    define_variable_cname ("SUFFIXES", "", o_default, 0);
-  else
-    {
-      struct dep *d;
-      const char *p = default_suffixes;
-      suffix_file->deps = enter_prereqs (PARSE_SIMPLE_SEQ ((char **)&p, struct dep),
-                                         NULL);
-      for (d = suffix_file->deps; d; d = d->next)
-        d->file->builtin = 1;
-
-      define_variable_cname ("SUFFIXES", default_suffixes, o_default, 0);
-    }
-}
-
-/* Enter the default suffix rules as file rules.  This used to be done in
-   install_default_implicit_rules, but that loses because we want the
-   suffix rules installed before reading makefiles, and the pattern rules
-   installed after.  */
-
-void
-install_default_suffix_rules (void)
-{
-  const char **s;
-
-  if (no_builtin_rules_flag)
-    return;
-
-  for (s = default_suffix_rules; *s != 0; s += 2)
-    {
-      struct file *f = enter_file (strcache_add (s[0]));
-      /* This function should run before any makefile is parsed.  */
-      assert (f->cmds == 0);
-      f->cmds = xmalloc (sizeof (struct commands));
-      f->cmds->fileinfo.filenm = 0;
-      f->cmds->commands = xstrdup (s[1]);
-      f->cmds->command_lines = 0;
-      f->cmds->recipe_prefix = RECIPEPREFIX_DEFAULT;
-      f->builtin = 1;
-    }
-}
-
-
-/* Install the default pattern rules.  */
-
-void
-install_default_implicit_rules (void)
-{
-  struct pspec *p;
-
-  if (no_builtin_rules_flag)
-    return;
-
-  for (p = default_pattern_rules; p->target != 0; ++p)
-    install_pattern_rule (p, 0);
-
-  for (p = default_terminal_rules; p->target != 0; ++p)
-    install_pattern_rule (p, 1);
-}
-
-void
-define_default_variables (void)
-{
-  const char **s;
-
-  if (no_builtin_variables_flag)
-    return;
-
-  for (s = default_variables; *s != 0; s += 2)
-    define_variable (s[0], strlen (s[0]), s[1], o_default, 1);
-}
-
-void
-undefine_default_variables (void)
-{
-  const char **s;
-
-  for (s = default_variables; *s != 0; s += 2)
-    undefine_variable_global (s[0], strlen (s[0]), o_default);
-}
diff --git a/dep.h b/dep.h
deleted file mode 100644 (file)
index 7f5076e..0000000
--- a/dep.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* Definitions of dependency data structures for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* Structure used in chains of names, for parsing and globbing.  */
-
-#define NAMESEQ(_t)     \
-    _t *next;           \
-    const char *name
-
-struct nameseq
-  {
-    NAMESEQ (struct nameseq);
-  };
-
-/* Flag bits for the second argument to 'read_makefile'.
-   These flags are saved in the 'flags' field of each
-   'struct goaldep' in the chain returned by 'read_all_makefiles'.  */
-
-#define RM_NO_DEFAULT_GOAL      (1 << 0) /* Do not set default goal.  */
-#define RM_INCLUDED             (1 << 1) /* Search makefile search path.  */
-#define RM_DONTCARE             (1 << 2) /* No error if it doesn't exist.  */
-#define RM_NO_TILDE             (1 << 3) /* Don't expand ~ in file name.  */
-#define RM_NOFLAG               0
-
-/* Structure representing one dependency of a file.
-   Each struct file's 'deps' points to a chain of these, through 'next'.
-   'stem' is the stem for this dep line of static pattern rule or NULL.  */
-
-#define DEP(_t)                                 \
-    NAMESEQ (_t);                               \
-    struct file *file;                          \
-    const char *stem;                           \
-    unsigned short flags : 8;                   \
-    unsigned short changed : 1;                 \
-    unsigned short ignore_mtime : 1;            \
-    unsigned short staticpattern : 1;           \
-    unsigned short need_2nd_expansion : 1
-
-struct dep
-  {
-    DEP (struct dep);
-  };
-
-/* Structure representing one goal.
-   The goals to be built constitute a chain of these, chained through 'next'.
-   'stem' is not used, but it's simpler to include and ignore it.  */
-
-struct goaldep
-  {
-    DEP (struct goaldep);
-    unsigned short error;
-    floc floc;
-  };
-
-/* Options for parsing lists of filenames.  */
-
-#define PARSEFS_NONE    0x0000
-#define PARSEFS_NOSTRIP 0x0001
-#define PARSEFS_NOAR    0x0002
-#define PARSEFS_NOGLOB  0x0004
-#define PARSEFS_EXISTS  0x0008
-#define PARSEFS_NOCACHE 0x0010
-
-#define PARSE_FILE_SEQ(_s,_t,_c,_p,_f) \
-            (_t *)parse_file_seq ((_s),sizeof (_t),(_c),(_p),(_f))
-#define PARSE_SIMPLE_SEQ(_s,_t) \
-            (_t *)parse_file_seq ((_s),sizeof (_t),MAP_NUL,NULL,PARSEFS_NONE)
-
-#ifdef VMS
-void *parse_file_seq ();
-#else
-void *parse_file_seq (char **stringp, unsigned int size,
-                      int stopmap, const char *prefix, int flags);
-#endif
-
-char *tilde_expand (const char *name);
-
-#ifndef NO_ARCHIVES
-struct nameseq *ar_glob (const char *arname, const char *member_pattern, unsigned int size);
-#endif
-
-#define dep_name(d)        ((d)->name ? (d)->name : (d)->file->name)
-
-#define alloc_seq_elt(_t)   xcalloc (sizeof (_t))
-void free_ns_chain (struct nameseq *n);
-
-#if defined(MAKE_MAINTAINER_MODE) && defined(__GNUC__)
-/* Use inline to get real type-checking.  */
-#define SI static inline
-SI struct nameseq *alloc_ns()      { return alloc_seq_elt (struct nameseq); }
-SI struct dep *alloc_dep()         { return alloc_seq_elt (struct dep); }
-SI struct goaldep *alloc_goaldep() { return alloc_seq_elt (struct goaldep); }
-
-SI void free_ns(struct nameseq *n)      { free (n); }
-SI void free_dep(struct dep *d)         { free_ns ((struct nameseq *)d); }
-SI void free_goaldep(struct goaldep *g) { free_dep ((struct dep *)g); }
-
-SI void free_dep_chain(struct dep *d)      { free_ns_chain((struct nameseq *)d); }
-SI void free_goal_chain(struct goaldep *g) { free_dep_chain((struct dep *)g); }
-#else
-# define alloc_ns()          alloc_seq_elt (struct nameseq)
-# define alloc_dep()         alloc_seq_elt (struct dep)
-# define alloc_goaldep()     alloc_seq_elt (struct goaldep)
-
-# define free_ns(_n)         free (_n)
-# define free_dep(_d)        free_ns (_d)
-# define free_goaldep(_g)    free_dep (_g)
-
-# define free_dep_chain(_d)  free_ns_chain ((struct nameseq *)(_d))
-# define free_goal_chain(_g) free_ns_chain ((struct nameseq *)(_g))
-#endif
-
-struct dep *copy_dep_chain (const struct dep *d);
-
-struct goaldep *read_all_makefiles (const char **makefiles);
-void eval_buffer (char *buffer, const floc *floc);
-enum update_status update_goal_chain (struct goaldep *goals);
diff --git a/dir.c b/dir.c
deleted file mode 100644 (file)
index f34bbf5..0000000
--- a/dir.c
+++ /dev/null
@@ -1,1321 +0,0 @@
-/* Directory hashing for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "hash.h"
-#include "filedef.h"
-#include "dep.h"
-
-#ifdef  HAVE_DIRENT_H
-# include <dirent.h>
-# define NAMLEN(dirent) strlen((dirent)->d_name)
-# ifdef VMS
-/* its prototype is in vmsdir.h, which is not needed for HAVE_DIRENT_H */
-const char *vmsify (const char *name, int type);
-# endif
-#else
-# define dirent direct
-# define NAMLEN(dirent) (dirent)->d_namlen
-# ifdef HAVE_SYS_NDIR_H
-#  include <sys/ndir.h>
-# endif
-# ifdef HAVE_SYS_DIR_H
-#  include <sys/dir.h>
-# endif
-# ifdef HAVE_NDIR_H
-#  include <ndir.h>
-# endif
-# ifdef HAVE_VMSDIR_H
-#  include "vmsdir.h"
-# endif /* HAVE_VMSDIR_H */
-#endif
-
-/* In GNU systems, <dirent.h> defines this macro for us.  */
-#ifdef _D_NAMLEN
-# undef NAMLEN
-# define NAMLEN(d) _D_NAMLEN(d)
-#endif
-
-#if (defined (POSIX) || defined (VMS) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__)
-/* Posix does not require that the d_ino field be present, and some
-   systems do not provide it. */
-# define REAL_DIR_ENTRY(dp) 1
-# define FAKE_DIR_ENTRY(dp)
-#else
-# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
-# define FAKE_DIR_ENTRY(dp) (dp->d_ino = 1)
-#endif /* POSIX */
-\f
-#ifdef __MSDOS__
-#include <ctype.h>
-#include <fcntl.h>
-
-/* If it's MSDOS that doesn't have _USE_LFN, disable LFN support.  */
-#ifndef _USE_LFN
-#define _USE_LFN 0
-#endif
-
-static const char *
-dosify (const char *filename)
-{
-  static char dos_filename[14];
-  char *df;
-  int i;
-
-  if (filename == 0 || _USE_LFN)
-    return filename;
-
-  /* FIXME: what about filenames which violate
-     8+3 constraints, like "config.h.in", or ".emacs"?  */
-  if (strpbrk (filename, "\"*+,;<=>?[\\]|") != 0)
-    return filename;
-
-  df = dos_filename;
-
-  /* First, transform the name part.  */
-  for (i = 0; i < 8 && ! STOP_SET (*filename, MAP_DOT|MAP_NUL); ++i)
-    *df++ = tolower ((unsigned char)*filename++);
-
-  /* Now skip to the next dot.  */
-  while (! STOP_SET (*filename, MAP_DOT|MAP_NUL))
-    ++filename;
-  if (*filename != '\0')
-    {
-      *df++ = *filename++;
-      for (i = 0; i < 3 && ! STOP_SET (*filename, MAP_DOT|MAP_NUL); ++i)
-        *df++ = tolower ((unsigned char)*filename++);
-    }
-
-  /* Look for more dots.  */
-  while (! STOP_SET (*filename, MAP_DOT|MAP_NUL))
-    ++filename;
-  if (*filename == '.')
-    return filename;
-  *df = 0;
-  return dos_filename;
-}
-#endif /* __MSDOS__ */
-
-#ifdef WINDOWS32
-#include "pathstuff.h"
-#endif
-
-#ifdef _AMIGA
-#include <ctype.h>
-#endif
-
-#ifdef HAVE_CASE_INSENSITIVE_FS
-static const char *
-downcase (const char *filename)
-{
-  static PATH_VAR (new_filename);
-  char *df;
-
-  if (filename == 0)
-    return 0;
-
-  df = new_filename;
-  while (*filename != '\0')
-    {
-      *df++ = tolower ((unsigned char)*filename);
-      ++filename;
-    }
-
-  *df = 0;
-
-  return new_filename;
-}
-#endif /* HAVE_CASE_INSENSITIVE_FS */
-
-#ifdef VMS
-
-static char *
-downcase_inplace(char *filename)
-{
-  char *name;
-  name = filename;
-  while (*name != '\0')
-    {
-      *name = tolower ((unsigned char)*name);
-      ++name;
-    }
-  return filename;
-}
-
-#ifndef _USE_STD_STAT
-/* VMS 8.2 fixed the VMS stat output to have unique st_dev and st_ino
-   when _USE_STD_STAT is used on the compile line.
-
-   Prior to _USE_STD_STAT support, the st_dev is a pointer to thread
-   static memory containing the device of the last filename looked up.
-
-   Todo: find out if the ino_t still needs to be faked on a directory.
- */
-
-/* Define this if the older VMS_INO_T is needed */
-#define VMS_INO_T 1
-
-static int
-vms_hash (const char *name)
-{
-  int h = 0;
-
-  while (*name)
-    {
-      unsigned char uc = *name;
-      int g;
-#ifdef HAVE_CASE_INSENSITIVE_FS
-      h = (h << 4) + (isupper (uc) ? tolower (uc) : uc);
-#else
-      h = (h << 4) + uc;
-#endif
-      name++;
-      g = h & 0xf0000000;
-      if (g)
-        {
-          h = h ^ (g >> 24);
-          h = h ^ g;
-        }
-    }
-  return h;
-}
-
-/* fake stat entry for a directory */
-static int
-vmsstat_dir (const char *name, struct stat *st)
-{
-  char *s;
-  int h;
-  DIR *dir;
-
-  dir = opendir (name);
-  if (dir == 0)
-    return -1;
-  closedir (dir);
-  s = strchr (name, ':');       /* find device */
-  if (s)
-    {
-      /* to keep the compiler happy we said "const char *name", now we cheat */
-      *s++ = 0;
-      st->st_dev = (char *)vms_hash (name);
-      h = vms_hash (s);
-      *(s-1) = ':';
-    }
-  else
-    {
-      st->st_dev = 0;
-      h = vms_hash (name);
-    }
-
-  st->st_ino[0] = h & 0xff;
-  st->st_ino[1] = h & 0xff00;
-  st->st_ino[2] = h >> 16;
-
-  return 0;
-}
-
-# define stat(__path, __sbuf) vmsstat_dir (__path, __sbuf)
-
-#endif /* _USE_STD_STAT */
-#endif /* VMS */
-\f
-/* Hash table of directories.  */
-
-#ifndef DIRECTORY_BUCKETS
-#define DIRECTORY_BUCKETS 199
-#endif
-
-struct directory_contents
-  {
-    dev_t dev;                  /* Device and inode numbers of this dir.  */
-#ifdef WINDOWS32
-    /* Inode means nothing on WINDOWS32. Even file key information is
-     * unreliable because it is random per file open and undefined for remote
-     * filesystems. The most unique attribute I can come up with is the fully
-     * qualified name of the directory. Beware though, this is also
-     * unreliable. I'm open to suggestion on a better way to emulate inode.  */
-    char *path_key;
-    time_t ctime;
-    time_t mtime;        /* controls check for stale directory cache */
-    int fs_flags;     /* FS_FAT, FS_NTFS, ... */
-# define FS_FAT      0x1
-# define FS_NTFS     0x2
-# define FS_UNKNOWN  0x4
-#else
-# ifdef VMS_INO_T
-    ino_t ino[3];
-# else
-    ino_t ino;
-# endif
-#endif /* WINDOWS32 */
-    struct hash_table dirfiles; /* Files in this directory.  */
-    DIR *dirstream;             /* Stream reading this directory.  */
-  };
-
-static unsigned long
-directory_contents_hash_1 (const void *key_0)
-{
-  const struct directory_contents *key = key_0;
-  unsigned long hash;
-
-#ifdef WINDOWS32
-  hash = 0;
-  ISTRING_HASH_1 (key->path_key, hash);
-  hash ^= ((unsigned int) key->dev << 4) ^ (unsigned int) key->ctime;
-#else
-# ifdef VMS_INO_T
-  hash = (((unsigned int) key->dev << 4)
-          ^ ((unsigned int) key->ino[0]
-             + (unsigned int) key->ino[1]
-             + (unsigned int) key->ino[2]));
-# else
-  hash = ((unsigned int) key->dev << 4) ^ (unsigned int) key->ino;
-# endif
-#endif /* WINDOWS32 */
-  return hash;
-}
-
-static unsigned long
-directory_contents_hash_2 (const void *key_0)
-{
-  const struct directory_contents *key = key_0;
-  unsigned long hash;
-
-#ifdef WINDOWS32
-  hash = 0;
-  ISTRING_HASH_2 (key->path_key, hash);
-  hash ^= ((unsigned int) key->dev << 4) ^ (unsigned int) ~key->ctime;
-#else
-# ifdef VMS_INO_T
-  hash = (((unsigned int) key->dev << 4)
-          ^ ~((unsigned int) key->ino[0]
-              + (unsigned int) key->ino[1]
-              + (unsigned int) key->ino[2]));
-# else
-  hash = ((unsigned int) key->dev << 4) ^ (unsigned int) ~key->ino;
-# endif
-#endif /* WINDOWS32 */
-
-  return hash;
-}
-
-/* Sometimes it's OK to use subtraction to get this value:
-     result = X - Y;
-   But, if we're not sure of the type of X and Y they may be too large for an
-   int (on a 64-bit system for example).  So, use ?: instead.
-   See Savannah bug #15534.
-
-   NOTE!  This macro has side-effects!
-*/
-
-#define MAKECMP(_x,_y)  ((_x)<(_y)?-1:((_x)==(_y)?0:1))
-
-static int
-directory_contents_hash_cmp (const void *xv, const void *yv)
-{
-  const struct directory_contents *x = xv;
-  const struct directory_contents *y = yv;
-  int result;
-
-#ifdef WINDOWS32
-  ISTRING_COMPARE (x->path_key, y->path_key, result);
-  if (result)
-    return result;
-  result = MAKECMP(x->ctime, y->ctime);
-  if (result)
-    return result;
-#else
-# ifdef VMS_INO_T
-  result = MAKECMP(x->ino[0], y->ino[0]);
-  if (result)
-    return result;
-  result = MAKECMP(x->ino[1], y->ino[1]);
-  if (result)
-    return result;
-  result = MAKECMP(x->ino[2], y->ino[2]);
-  if (result)
-    return result;
-# else
-  result = MAKECMP(x->ino, y->ino);
-  if (result)
-    return result;
-# endif
-#endif /* WINDOWS32 */
-
-  return MAKECMP(x->dev, y->dev);
-}
-
-/* Table of directory contents hashed by device and inode number.  */
-static struct hash_table directory_contents;
-
-struct directory
-  {
-    const char *name;                   /* Name of the directory.  */
-
-    /* The directory's contents.  This data may be shared by several
-       entries in the hash table, which refer to the same directory
-       (identified uniquely by 'dev' and 'ino') under different names.  */
-    struct directory_contents *contents;
-  };
-
-static unsigned long
-directory_hash_1 (const void *key)
-{
-  return_ISTRING_HASH_1 (((const struct directory *) key)->name);
-}
-
-static unsigned long
-directory_hash_2 (const void *key)
-{
-  return_ISTRING_HASH_2 (((const struct directory *) key)->name);
-}
-
-static int
-directory_hash_cmp (const void *x, const void *y)
-{
-  return_ISTRING_COMPARE (((const struct directory *) x)->name,
-                          ((const struct directory *) y)->name);
-}
-
-/* Table of directories hashed by name.  */
-static struct hash_table directories;
-
-/* Never have more than this many directories open at once.  */
-
-#define MAX_OPEN_DIRECTORIES 10
-
-static unsigned int open_directories = 0;
-
-
-/* Hash table of files in each directory.  */
-
-struct dirfile
-  {
-    const char *name;           /* Name of the file.  */
-    size_t length;
-    short impossible;           /* This file is impossible.  */
-  };
-
-static unsigned long
-dirfile_hash_1 (const void *key)
-{
-  return_ISTRING_HASH_1 (((struct dirfile const *) key)->name);
-}
-
-static unsigned long
-dirfile_hash_2 (const void *key)
-{
-  return_ISTRING_HASH_2 (((struct dirfile const *) key)->name);
-}
-
-static int
-dirfile_hash_cmp (const void *xv, const void *yv)
-{
-  const struct dirfile *x = xv;
-  const struct dirfile *y = yv;
-  int result = x->length - y->length;
-  if (result)
-    return result;
-  return_ISTRING_COMPARE (x->name, y->name);
-}
-
-#ifndef DIRFILE_BUCKETS
-#define DIRFILE_BUCKETS 107
-#endif
-\f
-static int dir_contents_file_exists_p (struct directory_contents *dir,
-                                       const char *filename);
-static struct directory *find_directory (const char *name);
-
-/* Find the directory named NAME and return its 'struct directory'.  */
-
-static struct directory *
-find_directory (const char *name)
-{
-  struct directory *dir;
-  struct directory **dir_slot;
-  struct directory dir_key;
-
-  dir_key.name = name;
-  dir_slot = (struct directory **) hash_find_slot (&directories, &dir_key);
-  dir = *dir_slot;
-
-  if (HASH_VACANT (dir))
-    {
-      /* The directory was not found.  Create a new entry for it.  */
-      const char *p = name + strlen (name);
-      struct stat st;
-      int r;
-
-      dir = xmalloc (sizeof (struct directory));
-#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS)
-      /* Todo: Why is this only needed on VMS? */
-      {
-        char *lname = downcase_inplace (xstrdup (name));
-        dir->name = strcache_add_len (lname, p - name);
-        free (lname);
-      }
-#else
-      dir->name = strcache_add_len (name, p - name);
-#endif
-      hash_insert_at (&directories, dir, dir_slot);
-      /* The directory is not in the name hash table.
-         Find its device and inode numbers, and look it up by them.  */
-
-#if defined(WINDOWS32)
-      {
-        char tem[MAXPATHLEN], *tstart, *tend;
-
-        /* Remove any trailing slashes.  Windows32 stat fails even on
-           valid directories if they end in a slash. */
-        memcpy (tem, name, p - name + 1);
-        tstart = tem;
-        if (tstart[1] == ':')
-          tstart += 2;
-        for (tend = tem + (p - name - 1);
-             tend > tstart && (*tend == '/' || *tend == '\\');
-             tend--)
-          *tend = '\0';
-
-        r = stat (tem, &st);
-      }
-#else
-      EINTRLOOP (r, stat (name, &st));
-#endif
-
-      if (r < 0)
-        {
-        /* Couldn't stat the directory.  Mark this by
-           setting the 'contents' member to a nil pointer.  */
-          dir->contents = 0;
-        }
-      else
-        {
-          /* Search the contents hash table; device and inode are the key.  */
-
-#ifdef WINDOWS32
-          char *w32_path;
-#endif
-          struct directory_contents *dc;
-          struct directory_contents **dc_slot;
-          struct directory_contents dc_key;
-
-          dc_key.dev = st.st_dev;
-#ifdef WINDOWS32
-          dc_key.path_key = w32_path = w32ify (name, 1);
-          dc_key.ctime = st.st_ctime;
-#else
-# ifdef VMS_INO_T
-          dc_key.ino[0] = st.st_ino[0];
-          dc_key.ino[1] = st.st_ino[1];
-          dc_key.ino[2] = st.st_ino[2];
-# else
-          dc_key.ino = st.st_ino;
-# endif
-#endif
-          dc_slot = (struct directory_contents **) hash_find_slot (&directory_contents, &dc_key);
-          dc = *dc_slot;
-
-          if (HASH_VACANT (dc))
-            {
-              /* Nope; this really is a directory we haven't seen before.  */
-#ifdef WINDOWS32
-              char  fs_label[BUFSIZ];
-              char  fs_type[BUFSIZ];
-              unsigned long  fs_serno;
-              unsigned long  fs_flags;
-              unsigned long  fs_len;
-#endif
-              dc = (struct directory_contents *)
-                xmalloc (sizeof (struct directory_contents));
-
-              /* Enter it in the contents hash table.  */
-              dc->dev = st.st_dev;
-#ifdef WINDOWS32
-              dc->path_key = xstrdup (w32_path);
-              dc->ctime = st.st_ctime;
-              dc->mtime = st.st_mtime;
-
-              /* NTFS is the only WINDOWS32 filesystem that bumps mtime on a
-                 directory when files are added/deleted from a directory.  */
-              w32_path[3] = '\0';
-              if (GetVolumeInformation (w32_path, fs_label, sizeof (fs_label),
-                                        &fs_serno, &fs_len, &fs_flags, fs_type,
-                                        sizeof (fs_type)) == FALSE)
-                dc->fs_flags = FS_UNKNOWN;
-              else if (!strcmp (fs_type, "FAT"))
-                dc->fs_flags = FS_FAT;
-              else if (!strcmp (fs_type, "NTFS"))
-                dc->fs_flags = FS_NTFS;
-              else
-                dc->fs_flags = FS_UNKNOWN;
-#else
-# ifdef VMS_INO_T
-              dc->ino[0] = st.st_ino[0];
-              dc->ino[1] = st.st_ino[1];
-              dc->ino[2] = st.st_ino[2];
-# else
-              dc->ino = st.st_ino;
-# endif
-#endif /* WINDOWS32 */
-              hash_insert_at (&directory_contents, dc, dc_slot);
-              ENULLLOOP (dc->dirstream, opendir (name));
-              if (dc->dirstream == 0)
-                /* Couldn't open the directory.  Mark this by setting the
-                   'files' member to a nil pointer.  */
-                dc->dirfiles.ht_vec = 0;
-              else
-                {
-                  hash_init (&dc->dirfiles, DIRFILE_BUCKETS,
-                             dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp);
-                  /* Keep track of how many directories are open.  */
-                  ++open_directories;
-                  if (open_directories == MAX_OPEN_DIRECTORIES)
-                    /* We have too many directories open already.
-                       Read the entire directory and then close it.  */
-                    dir_contents_file_exists_p (dc, 0);
-                }
-            }
-
-          /* Point the name-hashed entry for DIR at its contents data.  */
-          dir->contents = dc;
-        }
-    }
-
-  return dir;
-}
-\f
-/* Return 1 if the name FILENAME is entered in DIR's hash table.
-   FILENAME must contain no slashes.  */
-
-static int
-dir_contents_file_exists_p (struct directory_contents *dir,
-                            const char *filename)
-{
-  struct dirfile *df;
-  struct dirent *d;
-#ifdef WINDOWS32
-  struct stat st;
-  int rehash = 0;
-#endif
-
-  if (dir == 0 || dir->dirfiles.ht_vec == 0)
-    /* The directory could not be stat'd or opened.  */
-    return 0;
-
-#ifdef __MSDOS__
-  filename = dosify (filename);
-#endif
-
-#ifdef HAVE_CASE_INSENSITIVE_FS
-  filename = downcase (filename);
-#endif
-
-#ifdef __EMX__
-  if (filename != 0)
-    _fnlwr (filename); /* lower case for FAT drives */
-#endif
-  if (filename != 0)
-    {
-      struct dirfile dirfile_key;
-
-      if (*filename == '\0')
-        {
-          /* Checking if the directory exists.  */
-          return 1;
-        }
-      dirfile_key.name = filename;
-      dirfile_key.length = strlen (filename);
-      df = hash_find_item (&dir->dirfiles, &dirfile_key);
-      if (df)
-        return !df->impossible;
-    }
-
-  /* The file was not found in the hashed list.
-     Try to read the directory further.  */
-
-  if (dir->dirstream == 0)
-    {
-#ifdef WINDOWS32
-      /*
-       * Check to see if directory has changed since last read. FAT
-       * filesystems force a rehash always as mtime does not change
-       * on directories (ugh!).
-       */
-      if (dir->path_key)
-        {
-          if ((dir->fs_flags & FS_FAT) != 0)
-            {
-              dir->mtime = time ((time_t *) 0);
-              rehash = 1;
-            }
-          else if (stat (dir->path_key, &st) == 0 && st.st_mtime > dir->mtime)
-            {
-              /* reset date stamp to show most recent re-process.  */
-              dir->mtime = st.st_mtime;
-              rehash = 1;
-            }
-
-          /* If it has been already read in, all done.  */
-          if (!rehash)
-            return 0;
-
-          /* make sure directory can still be opened; if not return.  */
-          dir->dirstream = opendir (dir->path_key);
-          if (!dir->dirstream)
-            return 0;
-        }
-      else
-#endif
-        /* The directory has been all read in.  */
-        return 0;
-    }
-
-  while (1)
-    {
-      /* Enter the file in the hash table.  */
-      unsigned int len;
-      struct dirfile dirfile_key;
-      struct dirfile **dirfile_slot;
-
-      ENULLLOOP (d, readdir (dir->dirstream));
-      if (d == 0)
-        {
-          if (errno)
-            pfatal_with_name ("INTERNAL: readdir");
-          break;
-        }
-
-#if defined(VMS) && defined(HAVE_DIRENT_H)
-      /* In VMS we get file versions too, which have to be stripped off.
-         Some versions of VMS return versions on Unix files even when
-         the feature option to strip them is set.  */
-      {
-        char *p = strrchr (d->d_name, ';');
-        if (p)
-          *p = '\0';
-      }
-#endif
-      if (!REAL_DIR_ENTRY (d))
-        continue;
-
-      len = NAMLEN (d);
-      dirfile_key.name = d->d_name;
-      dirfile_key.length = len;
-      dirfile_slot = (struct dirfile **) hash_find_slot (&dir->dirfiles, &dirfile_key);
-#ifdef WINDOWS32
-      /*
-       * If re-reading a directory, don't cache files that have
-       * already been discovered.
-       */
-      if (! rehash || HASH_VACANT (*dirfile_slot))
-#endif
-        {
-          df = xmalloc (sizeof (struct dirfile));
-#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS)
-          /* TODO: Why is this only needed on VMS? */
-          df->name = strcache_add_len (downcase_inplace (d->d_name), len);
-#else
-          df->name = strcache_add_len (d->d_name, len);
-#endif
-          df->length = len;
-          df->impossible = 0;
-          hash_insert_at (&dir->dirfiles, df, dirfile_slot);
-        }
-      /* Check if the name matches the one we're searching for.  */
-      if (filename != 0 && patheq (d->d_name, filename))
-        return 1;
-    }
-
-  /* If the directory has been completely read in,
-     close the stream and reset the pointer to nil.  */
-  if (d == 0)
-    {
-      --open_directories;
-      closedir (dir->dirstream);
-      dir->dirstream = 0;
-    }
-  return 0;
-}
-
-/* Return 1 if the name FILENAME in directory DIRNAME
-   is entered in the dir hash table.
-   FILENAME must contain no slashes.  */
-
-int
-dir_file_exists_p (const char *dirname, const char *filename)
-{
-#ifdef VMS
-  if ((filename != NULL) && (dirname != NULL))
-    {
-      int want_vmsify;
-      want_vmsify = (strpbrk (dirname, ":<[") != NULL);
-      if (want_vmsify)
-        filename = vmsify (filename, 0);
-    }
-#endif
-  return dir_contents_file_exists_p (find_directory (dirname)->contents,
-                                     filename);
-}
-\f
-/* Return 1 if the file named NAME exists.  */
-
-int
-file_exists_p (const char *name)
-{
-  const char *dirend;
-  const char *dirname;
-  const char *slash;
-
-#ifndef NO_ARCHIVES
-  if (ar_name (name))
-    return ar_member_date (name) != (time_t) -1;
-#endif
-
-  dirend = strrchr (name, '/');
-#ifdef VMS
-  if (dirend == 0)
-    {
-      dirend = strrchr (name, ']');
-      dirend == NULL ? dirend : dirend++;
-    }
-  if (dirend == 0)
-    {
-      dirend = strrchr (name, '>');
-      dirend == NULL ? dirend : dirend++;
-    }
-  if (dirend == 0)
-    {
-      dirend = strrchr (name, ':');
-      dirend == NULL ? dirend : dirend++;
-    }
-#endif /* VMS */
-#ifdef HAVE_DOS_PATHS
-  /* Forward and backslashes might be mixed.  We need the rightmost one.  */
-  {
-    const char *bslash = strrchr (name, '\\');
-    if (!dirend || bslash > dirend)
-      dirend = bslash;
-    /* The case of "d:file".  */
-    if (!dirend && name[0] && name[1] == ':')
-      dirend = name + 1;
-  }
-#endif /* HAVE_DOS_PATHS */
-  if (dirend == 0)
-#ifndef _AMIGA
-    return dir_file_exists_p (".", name);
-#else /* !AMIGA */
-    return dir_file_exists_p ("", name);
-#endif /* AMIGA */
-
-  slash = dirend;
-  if (dirend == name)
-    dirname = "/";
-  else
-    {
-      char *p;
-#ifdef HAVE_DOS_PATHS
-  /* d:/ and d: are *very* different...  */
-      if (dirend < name + 3 && name[1] == ':' &&
-          (*dirend == '/' || *dirend == '\\' || *dirend == ':'))
-        dirend++;
-#endif
-      p = alloca (dirend - name + 1);
-      memcpy (p, name, dirend - name);
-      p[dirend - name] = '\0';
-      dirname = p;
-    }
-#ifdef VMS
-  if (*slash == '/')
-    slash++;
-#else
-  slash++;
-#endif
-  return dir_file_exists_p (dirname, slash);
-}
-\f
-/* Mark FILENAME as 'impossible' for 'file_impossible_p'.
-   This means an attempt has been made to search for FILENAME
-   as an intermediate file, and it has failed.  */
-
-void
-file_impossible (const char *filename)
-{
-  const char *dirend;
-  const char *p = filename;
-  struct directory *dir;
-  struct dirfile *new;
-
-  dirend = strrchr (p, '/');
-#ifdef VMS
-  if (dirend == NULL)
-    {
-      dirend = strrchr (p, ']');
-      dirend == NULL ? dirend : dirend++;
-    }
-  if (dirend == NULL)
-    {
-      dirend = strrchr (p, '>');
-      dirend == NULL ? dirend : dirend++;
-    }
-  if (dirend == NULL)
-    {
-      dirend = strrchr (p, ':');
-      dirend == NULL ? dirend : dirend++;
-    }
-#endif
-#ifdef HAVE_DOS_PATHS
-  /* Forward and backslashes might be mixed.  We need the rightmost one.  */
-  {
-    const char *bslash = strrchr (p, '\\');
-    if (!dirend || bslash > dirend)
-      dirend = bslash;
-    /* The case of "d:file".  */
-    if (!dirend && p[0] && p[1] == ':')
-      dirend = p + 1;
-  }
-#endif /* HAVE_DOS_PATHS */
-  if (dirend == 0)
-#ifdef _AMIGA
-    dir = find_directory ("");
-#else /* !AMIGA */
-    dir = find_directory (".");
-#endif /* AMIGA */
-  else
-    {
-      const char *dirname;
-      const char *slash = dirend;
-      if (dirend == p)
-        dirname = "/";
-      else
-        {
-          char *cp;
-#ifdef HAVE_DOS_PATHS
-          /* d:/ and d: are *very* different...  */
-          if (dirend < p + 3 && p[1] == ':' &&
-              (*dirend == '/' || *dirend == '\\' || *dirend == ':'))
-            dirend++;
-#endif
-          cp = alloca (dirend - p + 1);
-          memcpy (cp, p, dirend - p);
-          cp[dirend - p] = '\0';
-          dirname = cp;
-        }
-      dir = find_directory (dirname);
-#ifdef VMS
-      if (*slash == '/')
-        filename = p = slash + 1;
-      else
-        filename = p = slash;
-#else
-      filename = p = slash + 1;
-#endif
-    }
-
-  if (dir->contents == 0)
-    /* The directory could not be stat'd.  We allocate a contents
-       structure for it, but leave it out of the contents hash table.  */
-    dir->contents = xcalloc (sizeof (struct directory_contents));
-
-  if (dir->contents->dirfiles.ht_vec == 0)
-    {
-      hash_init (&dir->contents->dirfiles, DIRFILE_BUCKETS,
-                 dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp);
-    }
-
-  /* Make a new entry and put it in the table.  */
-
-  new = xmalloc (sizeof (struct dirfile));
-  new->length = strlen (filename);
-#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS)
-  /* todo: Why is this only needed on VMS? */
-  new->name = strcache_add_len (downcase (filename), new->length);
-#else
-  new->name = strcache_add_len (filename, new->length);
-#endif
-  new->impossible = 1;
-  hash_insert (&dir->contents->dirfiles, new);
-}
-\f
-/* Return nonzero if FILENAME has been marked impossible.  */
-
-int
-file_impossible_p (const char *filename)
-{
-  const char *dirend;
-  struct directory_contents *dir;
-  struct dirfile *dirfile;
-  struct dirfile dirfile_key;
-#ifdef VMS
-  int want_vmsify = 0;
-#endif
-
-  dirend = strrchr (filename, '/');
-#ifdef VMS
-  if (dirend == NULL)
-    {
-      want_vmsify = (strpbrk (filename, "]>:^") != NULL);
-      dirend = strrchr (filename, ']');
-    }
-  if (dirend == NULL && want_vmsify)
-    dirend = strrchr (filename, '>');
-  if (dirend == NULL && want_vmsify)
-    dirend = strrchr (filename, ':');
-#endif
-#ifdef HAVE_DOS_PATHS
-  /* Forward and backslashes might be mixed.  We need the rightmost one.  */
-  {
-    const char *bslash = strrchr (filename, '\\');
-    if (!dirend || bslash > dirend)
-      dirend = bslash;
-    /* The case of "d:file".  */
-    if (!dirend && filename[0] && filename[1] == ':')
-      dirend = filename + 1;
-  }
-#endif /* HAVE_DOS_PATHS */
-  if (dirend == 0)
-#ifdef _AMIGA
-    dir = find_directory ("")->contents;
-#else /* !AMIGA */
-    dir = find_directory (".")->contents;
-#endif /* AMIGA */
-  else
-    {
-      const char *dirname;
-      const char *slash = dirend;
-      if (dirend == filename)
-        dirname = "/";
-      else
-        {
-          char *cp;
-#ifdef HAVE_DOS_PATHS
-          /* d:/ and d: are *very* different...  */
-          if (dirend < filename + 3 && filename[1] == ':' &&
-              (*dirend == '/' || *dirend == '\\' || *dirend == ':'))
-            dirend++;
-#endif
-          cp = alloca (dirend - filename + 1);
-          memcpy (cp, filename, dirend - filename);
-          cp[dirend - filename] = '\0';
-          dirname = cp;
-        }
-      dir = find_directory (dirname)->contents;
-#ifdef VMS
-      if (*slash == '/')
-        filename = slash + 1;
-      else
-        filename = slash;
-#else
-      filename = slash + 1;
-#endif
-    }
-
-  if (dir == 0 || dir->dirfiles.ht_vec == 0)
-    /* There are no files entered for this directory.  */
-    return 0;
-
-#ifdef __MSDOS__
-  filename = dosify (filename);
-#endif
-#ifdef HAVE_CASE_INSENSITIVE_FS
-  filename = downcase (filename);
-#endif
-#ifdef VMS
-  if (want_vmsify)
-    filename = vmsify (filename, 1);
-#endif
-
-  dirfile_key.name = filename;
-  dirfile_key.length = strlen (filename);
-  dirfile = hash_find_item (&dir->dirfiles, &dirfile_key);
-  if (dirfile)
-    return dirfile->impossible;
-
-  return 0;
-}
-\f
-/* Return the already allocated name in the
-   directory hash table that matches DIR.  */
-
-const char *
-dir_name (const char *dir)
-{
-  return find_directory (dir)->name;
-}
-\f
-/* Print the data base of directories.  */
-
-void
-print_dir_data_base (void)
-{
-  unsigned int files;
-  unsigned int impossible;
-  struct directory **dir_slot;
-  struct directory **dir_end;
-
-  puts (_("\n# Directories\n"));
-
-  files = impossible = 0;
-
-  dir_slot = (struct directory **) directories.ht_vec;
-  dir_end = dir_slot + directories.ht_size;
-  for ( ; dir_slot < dir_end; dir_slot++)
-    {
-      struct directory *dir = *dir_slot;
-      if (! HASH_VACANT (dir))
-        {
-          if (dir->contents == 0)
-            printf (_("# %s: could not be stat'd.\n"), dir->name);
-          else if (dir->contents->dirfiles.ht_vec == 0)
-            {
-#ifdef WINDOWS32
-              printf (_("# %s (key %s, mtime %I64u): could not be opened.\n"),
-                      dir->name, dir->contents->path_key,
-                      (unsigned long long)dir->contents->mtime);
-#else  /* WINDOWS32 */
-#ifdef VMS_INO_T
-              printf (_("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"),
-                      dir->name, dir->contents->dev,
-                      dir->contents->ino[0], dir->contents->ino[1],
-                      dir->contents->ino[2]);
-#else
-              printf (_("# %s (device %ld, inode %ld): could not be opened.\n"),
-                      dir->name, (long int) dir->contents->dev,
-                      (long int) dir->contents->ino);
-#endif
-#endif /* WINDOWS32 */
-            }
-          else
-            {
-              unsigned int f = 0;
-              unsigned int im = 0;
-              struct dirfile **files_slot;
-              struct dirfile **files_end;
-
-              files_slot = (struct dirfile **) dir->contents->dirfiles.ht_vec;
-              files_end = files_slot + dir->contents->dirfiles.ht_size;
-              for ( ; files_slot < files_end; files_slot++)
-                {
-                  struct dirfile *df = *files_slot;
-                  if (! HASH_VACANT (df))
-                    {
-                      if (df->impossible)
-                        ++im;
-                      else
-                        ++f;
-                    }
-                }
-#ifdef WINDOWS32
-              printf (_("# %s (key %s, mtime %I64u): "),
-                      dir->name, dir->contents->path_key,
-                      (unsigned long long)dir->contents->mtime);
-#else  /* WINDOWS32 */
-#ifdef VMS_INO_T
-              printf (_("# %s (device %d, inode [%d,%d,%d]): "),
-                      dir->name, dir->contents->dev,
-                      dir->contents->ino[0], dir->contents->ino[1],
-                      dir->contents->ino[2]);
-#else
-              printf (_("# %s (device %ld, inode %ld): "),
-                      dir->name,
-                      (long)dir->contents->dev, (long)dir->contents->ino);
-#endif
-#endif /* WINDOWS32 */
-              if (f == 0)
-                fputs (_("No"), stdout);
-              else
-                printf ("%u", f);
-              fputs (_(" files, "), stdout);
-              if (im == 0)
-                fputs (_("no"), stdout);
-              else
-                printf ("%u", im);
-              fputs (_(" impossibilities"), stdout);
-              if (dir->contents->dirstream == 0)
-                puts (".");
-              else
-                puts (_(" so far."));
-              files += f;
-              impossible += im;
-            }
-        }
-    }
-
-  fputs ("\n# ", stdout);
-  if (files == 0)
-    fputs (_("No"), stdout);
-  else
-    printf ("%u", files);
-  fputs (_(" files, "), stdout);
-  if (impossible == 0)
-    fputs (_("no"), stdout);
-  else
-    printf ("%u", impossible);
-  printf (_(" impossibilities in %lu directories.\n"), directories.ht_fill);
-}
-\f
-/* Hooks for globbing.  */
-
-/* Structure describing state of iterating through a directory hash table.  */
-
-struct dirstream
-  {
-    struct directory_contents *contents; /* The directory being read.  */
-    struct dirfile **dirfile_slot; /* Current slot in table.  */
-  };
-
-/* Forward declarations.  */
-static __ptr_t open_dirstream (const char *);
-static struct dirent *read_dirstream (__ptr_t);
-
-static __ptr_t
-open_dirstream (const char *directory)
-{
-  struct dirstream *new;
-  struct directory *dir = find_directory (directory);
-
-  if (dir->contents == 0 || dir->contents->dirfiles.ht_vec == 0)
-    /* DIR->contents is nil if the directory could not be stat'd.
-       DIR->contents->dirfiles is nil if it could not be opened.  */
-    return 0;
-
-  /* Read all the contents of the directory now.  There is no benefit
-     in being lazy, since glob will want to see every file anyway.  */
-
-  dir_contents_file_exists_p (dir->contents, 0);
-
-  new = xmalloc (sizeof (struct dirstream));
-  new->contents = dir->contents;
-  new->dirfile_slot = (struct dirfile **) new->contents->dirfiles.ht_vec;
-
-  return (__ptr_t) new;
-}
-
-static struct dirent *
-read_dirstream (__ptr_t stream)
-{
-  static char *buf;
-  static unsigned int bufsz;
-
-  struct dirstream *const ds = (struct dirstream *) stream;
-  struct directory_contents *dc = ds->contents;
-  struct dirfile **dirfile_end = (struct dirfile **) dc->dirfiles.ht_vec + dc->dirfiles.ht_size;
-
-  while (ds->dirfile_slot < dirfile_end)
-    {
-      struct dirfile *df = *ds->dirfile_slot++;
-      if (! HASH_VACANT (df) && !df->impossible)
-        {
-          /* The glob interface wants a 'struct dirent', so mock one up.  */
-          struct dirent *d;
-          unsigned int len = df->length + 1;
-          unsigned int sz = sizeof (*d) - sizeof (d->d_name) + len;
-          if (sz > bufsz)
-            {
-              bufsz *= 2;
-              if (sz > bufsz)
-                bufsz = sz;
-              buf = xrealloc (buf, bufsz);
-            }
-          d = (struct dirent *) buf;
-#ifdef __MINGW32__
-# if __MINGW32_MAJOR_VERSION < 3 || (__MINGW32_MAJOR_VERSION == 3 && \
-                                     __MINGW32_MINOR_VERSION == 0)
-          d->d_name = xmalloc (len);
-# endif
-#endif
-          FAKE_DIR_ENTRY (d);
-#ifdef _DIRENT_HAVE_D_NAMLEN
-          d->d_namlen = len - 1;
-#endif
-#ifdef _DIRENT_HAVE_D_TYPE
-          d->d_type = DT_UNKNOWN;
-#endif
-          memcpy (d->d_name, df->name, len);
-          return d;
-        }
-    }
-
-  return 0;
-}
-
-/* On 64 bit ReliantUNIX (5.44 and above) in LFS mode, stat() is actually a
- * macro for stat64().  If stat is a macro, make a local wrapper function to
- * invoke it.
- *
- * On MS-Windows, stat() "succeeds" for foo/bar/. where foo/bar is a
- * regular file; fix that here.
- */
-#if !defined(stat) && !defined(WINDOWS32) || defined(VMS)
-# ifndef VMS
-#  ifndef HAVE_SYS_STAT_H
-int stat (const char *path, struct stat *sbuf);
-#  endif
-# else
-    /* We are done with the fake stat.  Go back to the real stat */
-#   ifdef stat
-#     undef stat
-#   endif
-# endif
-# define local_stat stat
-#else
-static int
-local_stat (const char *path, struct stat *buf)
-{
-  int e;
-#ifdef WINDOWS32
-  size_t plen = strlen (path);
-
-  /* Make sure the parent of "." exists and is a directory, not a
-     file.  This is because 'stat' on Windows normalizes the argument
-     foo/. => foo without checking first that foo is a directory.  */
-  if (plen > 1 && path[plen - 1] == '.'
-      && (path[plen - 2] == '/' || path[plen - 2] == '\\'))
-    {
-      char parent[MAXPATHLEN];
-
-      strncpy (parent, path, plen - 2);
-      parent[plen - 2] = '\0';
-      if (stat (parent, buf) < 0 || !_S_ISDIR (buf->st_mode))
-        return -1;
-    }
-#endif
-
-  EINTRLOOP (e, stat (path, buf));
-  return e;
-}
-#endif
-
-void
-dir_setup_glob (glob_t *gl)
-{
-  gl->gl_opendir = open_dirstream;
-  gl->gl_readdir = read_dirstream;
-  gl->gl_closedir = free;
-  gl->gl_stat = local_stat;
-  /* We don't bother setting gl_lstat, since glob never calls it.
-     The slot is only there for compatibility with 4.4 BSD.  */
-}
-
-void
-hash_init_directories (void)
-{
-  hash_init (&directories, DIRECTORY_BUCKETS,
-             directory_hash_1, directory_hash_2, directory_hash_cmp);
-  hash_init (&directory_contents, DIRECTORY_BUCKETS,
-             directory_contents_hash_1, directory_contents_hash_2,
-             directory_contents_hash_cmp);
-}
index 11aa4d45fc2cef98366dd495240d317e78f81e1e..7bcf1c2b898cbf6640d9b2cccebb872cb2b237e7 100644 (file)
@@ -1,5 +1,5 @@
 # -*-Makefile-*-, or close enough
-# Copyright (C) 2000-2016 Free Software Foundation, Inc.
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
index e5d2f7dc500f4d502b8a2b263a1d9d453a85b66a..fcabd94e7b5a9a69a75719cadaa94d752b2908db 100644 (file)
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -15,7 +15,7 @@
 @SET_MAKE@
 
 # -*-Makefile-*-, or close enough
-# Copyright (C) 2000-2016 Free Software Foundation, Inc.
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
@@ -106,21 +106,45 @@ build_triplet = @build@
 host_triplet = @host@
 subdir = doc
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \
-       $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \
-       $(top_srcdir)/config/intlmacosx.m4 \
-       $(top_srcdir)/config/lib-ld.m4 \
-       $(top_srcdir)/config/lib-link.m4 \
-       $(top_srcdir)/config/lib-prefix.m4 \
-       $(top_srcdir)/config/longlong.m4 $(top_srcdir)/config/nls.m4 \
-       $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \
-       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+       $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+       $(top_srcdir)/m4/acinclude.m4 $(top_srcdir)/m4/alloca.m4 \
+       $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/close.m4 \
+       $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dospaths.m4 \
+       $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \
+       $(top_srcdir)/m4/eaccess.m4 $(top_srcdir)/m4/errno_h.m4 \
+       $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/extensions.m4 \
+       $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fcntl-o.m4 \
+       $(top_srcdir)/m4/fcntl.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+       $(top_srcdir)/m4/findprog-in.m4 \
+       $(top_srcdir)/m4/getdtablesize.m4 \
+       $(top_srcdir)/m4/getloadavg.m4 $(top_srcdir)/m4/getprogname.m4 \
+       $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+       $(top_srcdir)/m4/gnulib-comp.m4 \
+       $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/include_next.m4 \
+       $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \
+       $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+       $(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/longlong.m4 \
+       $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+       $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/off_t.m4 \
+       $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \
+       $(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdint.m4 \
+       $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+       $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strerror.m4 \
+       $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/sys_socket_h.m4 \
+       $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/unistd_h.m4 \
+       $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \
+       $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/version.texi \
        $(srcdir)/stamp-vti $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_HEADER = $(top_builddir)/src/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_@AM_V@)
@@ -166,8 +190,8 @@ am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@)
 am__v_texidevnull_0 = > /dev/null
 am__v_texidevnull_1 = 
 INFO_DEPS = $(srcdir)/make.info
-TEXINFO_TEX = $(top_srcdir)/config/texinfo.tex
-am__TEXINFO_TEX_DIR = $(top_srcdir)/config
+TEXINFO_TEX = $(top_srcdir)/build-aux/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/build-aux
 DVIS = make.dvi
 PDFS = make.pdf
 PSS = make.ps
@@ -213,18 +237,27 @@ am__uninstall_files_from_dir = { \
   }
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 am__DIST_COMMON = $(make_TEXINFOS) $(srcdir)/Makefile.in \
-       $(top_srcdir)/config/mdate-sh $(top_srcdir)/config/texinfo.tex
+       $(top_srcdir)/build-aux/mdate-sh \
+       $(top_srcdir)/build-aux/texinfo.tex
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_LDFLAGS = @AM_LDFLAGS@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
 AR = @AR@
+ARFLAGS = @ARFLAGS@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -237,16 +270,349 @@ ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
 EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
 EXEEXT = @EXEEXT@
 GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
 GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
-GLOBINC = @GLOBINC@
-GLOBLIB = @GLOBLIB@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
 GREP = @GREP@
 GUILE_CFLAGS = @GUILE_CFLAGS@
 GUILE_LIBS = @GUILE_LIBS@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMCHR = @HAVE_MEMCHR@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOST_CPU = @HOST_CPU@
+HOST_CPU_C_ABI = @HOST_CPU_C_ABI@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -254,12 +620,14 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
 INTLLIBS = @INTLLIBS@
 INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-KMEM_GROUP = @KMEM_GROUP@
 LDFLAGS = @LDFLAGS@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
 LIBICONV = @LIBICONV@
 LIBINTL = @LIBINTL@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIMITS_H = @LIMITS_H@
 LTLIBICONV = @LTLIBICONV@
 LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
@@ -269,7 +637,26 @@ MKDIR_P = @MKDIR_P@
 MSGFMT = @MSGFMT@
 MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
-NEED_SETGID = @NEED_SETGID@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
 OBJEXT = @OBJEXT@
 PACKAGE = @PACKAGE@
 PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
@@ -284,14 +671,136 @@ PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
 POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
 RANLIB = @RANLIB@
 REMOTE = @REMOTE@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WRITE = @REPLACE_WRITE@
 SED = @SED@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
 STRIP = @STRIP@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
 USE_NLS = @USE_NLS@
+USE_SYSTEM_GLOB = @USE_SYSTEM_GLOB@
 VERSION = @VERSION@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
 XGETTEXT = @XGETTEXT@
 XGETTEXT_015 = @XGETTEXT_015@
 XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
@@ -299,7 +808,6 @@ abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -318,6 +826,11 @@ datarootdir = @datarootdir@
 docdir = @docdir@
 dvidir = @dvidir@
 exec_prefix = @exec_prefix@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
 host = @host@
 host_alias = @host_alias@
 host_cpu = @host_cpu@
@@ -373,8 +886,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
          *config.status*) \
            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
          *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
        esac;
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -436,7 +949,7 @@ make.html: make.texi $(srcdir)/version.texi $(make_TEXINFOS)
 $(srcdir)/version.texi:  $(srcdir)/stamp-vti
 $(srcdir)/stamp-vti: make.texi $(top_srcdir)/configure
        @(dir=.; test -f ./make.texi || dir=$(srcdir); \
-       set `$(SHELL) $(top_srcdir)/config/mdate-sh $$dir/make.texi`; \
+       set `$(SHELL) $(top_srcdir)/build-aux/mdate-sh $$dir/make.texi`; \
        echo "@set UPDATED $$1 $$2 $$3"; \
        echo "@set UPDATED-MONTH $$2 $$3"; \
        echo "@set EDITION $(VERSION)"; \
@@ -553,7 +1066,10 @@ ctags CTAGS:
 cscope cscopelist:
 
 
-distdir: $(DISTFILES)
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
        list='$(DISTFILES)'; \
index 9c3bbe56e91de3ec7bcb6c58154034a2d7ad4090..542edaad258a2cfecffb25e35338547dfe16f291 100644 (file)
@@ -6,7 +6,7 @@
 
 @display
 Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-@uref{http://fsf.org/}
+@uref{https://fsf.org/}
 
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.
@@ -414,7 +414,7 @@ The Free Software Foundation may publish new, revised versions
 of the GNU Free Documentation License from time to time.  Such new
 versions will be similar in spirit to the present version, but may
 differ in detail to address new problems or concerns.  See
-@uref{http://www.gnu.org/copyleft/}.
+@uref{https://www.gnu.org/copyleft/}.
 
 Each version of the License is given a distinguishing version number.
 If the Document specifies that a particular numbered version of this
diff --git a/doc/make.1 b/doc/make.1
new file mode 100644 (file)
index 0000000..dbd023f
--- /dev/null
@@ -0,0 +1,379 @@
+.TH MAKE 1 "28 February 2016" "GNU" "User Commands"
+.SH NAME
+make \- GNU make utility to maintain groups of programs
+.SH SYNOPSIS
+.B make
+[\fIOPTION\fR]... [\fITARGET\fR]...
+.SH DESCRIPTION
+.LP
+The
+.I make
+utility will determine automatically which pieces of a large program need to
+be recompiled, and issue the commands to recompile them.  The manual describes
+the GNU implementation of
+.BR make ,
+which was written by Richard Stallman and Roland McGrath, and is currently
+maintained by Paul Smith.  Our examples show C programs, since they are very
+common, but you can use
+.B make
+with any programming language whose compiler can be run with a shell command.
+In fact,
+.B make
+is not limited to programs.  You can use it to describe any task where some
+files must be updated automatically from others whenever the others change.
+.LP
+To prepare to use
+.BR make ,
+you must write a file called the
+.I makefile
+that describes the relationships among files in your program, and the states
+the commands for updating each file.  In a program, typically the executable
+file is updated from object files, which are in turn made by compiling source
+files.
+.LP
+Once a suitable makefile exists, each time you change some source files,
+this simple shell command:
+.sp 1
+.RS
+.B make
+.RE
+.sp 1
+suffices to perform all necessary recompilations.
+The
+.B make
+program uses the makefile description and the last-modification times of the
+files to decide which of the files need to be updated.  For each of those
+files, it issues the commands recorded in the makefile.
+.LP
+.B make
+executes commands in the
+.I makefile
+to update one or more target
+.IR names ,
+where
+.I name
+is typically a program.
+If no
+.B \-f
+option is present,
+.B make
+will look for the makefiles
+.IR GNUmakefile ,
+.IR makefile ,
+and
+.IR Makefile ,
+in that order.
+.LP
+Normally you should call your makefile either
+.I makefile
+or
+.IR Makefile .
+(We recommend
+.I Makefile
+because it appears prominently near the beginning of a directory
+listing, right near other important files such as
+.IR  README .)
+The first name checked,
+.IR GNUmakefile ,
+is not recommended for most makefiles.  You should use this name if you have a
+makefile that is specific to GNU
+.BR make ,
+and will not be understood by other versions of
+.BR make .
+If
+.I makefile
+is '\-', the standard input is read.
+.LP
+.B make
+updates a target if it depends on prerequisite files
+that have been modified since the target was last modified,
+or if the target does not exist.
+.SH OPTIONS
+.sp 1
+.TP 0.5i
+\fB\-b\fR, \fB\-m\fR
+These options are ignored for compatibility with other versions of
+.BR make .
+.TP 0.5i
+\fB\-B\fR, \fB\-\-always\-make\fR
+Unconditionally make all targets.
+.TP 0.5i
+\fB\-C\fR \fIdir\fR, \fB\-\-directory\fR=\fIdir\fR
+Change to directory
+.I dir
+before reading the makefiles or doing anything else.
+If multiple
+.B \-C
+options are specified, each is interpreted relative to the
+previous one:
+.BR "\-C " /
+.BR "\-C " etc
+is equivalent to
+.BR "\-C " /etc.
+This is typically used with recursive invocations of
+.BR make .
+.TP 0.5i
+.B \-d
+Print debugging information in addition to normal processing.
+The debugging information says which files are being considered for
+remaking, which file-times are being compared and with what results,
+which files actually need to be remade, which implicit rules are
+considered and which are applied---everything interesting about how
+.B make
+decides what to do.
+.TP 0.5i
+.BI \-\-debug "[=FLAGS]"
+Print debugging information in addition to normal processing.
+If the
+.I FLAGS
+are omitted, then the behavior is the same as if
+.B \-d
+was specified.
+.I FLAGS
+may be
+.I a
+for all debugging output (same as using
+.BR \-d ),
+.I b
+for basic debugging,
+.I v
+for more verbose basic debugging,
+.I i
+for showing implicit rules,
+.I j
+for details on invocation of commands, and
+.I m
+for debugging while remaking makefiles.  Use
+.I n
+to disable all previous debugging flags.
+.TP 0.5i
+\fB\-e\fR, \fB\-\-environment\-overrides\fR
+Give variables taken from the environment precedence over variables
+from makefiles.
+.TP 0.5i
+\fB\-E\fR \fIstring\fR, \fB\-\-eval\fR \fIstring\fR
+Interpret \fIstring\fR using the \fBeval\fR function, before parsing any
+makefiles.
+.TP 0.5i
+\fB\-f\fR \fIfile\fR, \fB\-\-file\fR=\fIfile\fR, \fB\-\-makefile\fR=\fIFILE\fR
+Use
+.I file
+as a makefile.
+.TP 0.5i
+\fB\-i\fR, \fB\-\-ignore\-errors\fR
+Ignore all errors in commands executed to remake files.
+.TP 0.5i
+\fB\-I\fR \fIdir\fR, \fB\-\-include\-dir\fR=\fIdir\fR
+Specifies a directory
+.I dir
+to search for included makefiles.
+If several
+.B \-I
+options are used to specify several directories, the directories are
+searched in the order specified.
+Unlike the arguments to other flags of
+.BR make ,
+directories given with
+.B \-I
+flags may come directly after the flag:
+.BI \-I dir
+is allowed, as well as
+.B \-I
+.IR dir .
+This syntax is allowed for compatibility with the C
+preprocessor's
+.B \-I
+flag.
+.TP 0.5i
+\fB\-j\fR [\fIjobs\fR], \fB\-\-jobs\fR[=\fIjobs\fR]
+Specifies the number of
+.I jobs
+(commands) to run simultaneously.
+If there is more than one
+.B \-j
+option, the last one is effective.
+If the
+.B \-j
+option is given without an argument,
+.BR make
+will not limit the number of jobs that can run simultaneously.
+.TP 0.5i
+\fB\-k\fR, \fB\-\-keep\-going\fR
+Continue as much as possible after an error.
+While the target that failed, and those that depend on it, cannot
+be remade, the other dependencies of these targets can be processed
+all the same.
+.TP 0.5i
+\fB\-l\fR [\fIload\fR], \fB\-\-load\-average\fR[=\fIload\fR]
+Specifies that no new jobs (commands) should be started if there are
+others jobs running and the load average is at least
+.I load
+(a floating-point number).
+With no argument, removes a previous load limit.
+.TP 0.5i
+\fB\-L\fR, \fB\-\-check\-symlink\-times\fR
+Use the latest mtime between symlinks and target.
+.TP 0.5i
+\fB\-n\fR, \fB\-\-just\-print\fR, \fB\-\-dry\-run\fR, \fB\-\-recon\fR
+Print the commands that would be executed, but do not execute them (except in
+certain circumstances).
+.TP 0.5i
+\fB\-o\fR \fIfile\fR, \fB\-\-old\-file\fR=\fIfile\fR, \fB\-\-assume\-old\fR=\fIfile\fR
+Do not remake the file
+.I file
+even if it is older than its dependencies, and do not remake anything
+on account of changes in
+.IR file .
+Essentially the file is treated as very old and its rules are ignored.
+.TP 0.5i
+\fB\-O\fR[\fItype\fR], \fB\-\-output\-sync\fR[=\fItype\fR]
+When running multiple jobs in parallel with \fB-j\fR, ensure the output of
+each job is collected together rather than interspersed with output from
+other jobs.  If
+.I type
+is not specified or is
+.B target
+the output from the entire recipe for each target is grouped together.  If
+.I type
+is
+.B line
+the output from each command line within a recipe is grouped together.
+If
+.I type
+is
+.B recurse
+output from an entire recursive make is grouped together.  If
+.I type
+is
+.B none
+output synchronization is disabled.
+.TP 0.5i
+\fB\-p\fR, \fB\-\-print\-data\-base\fR
+Print the data base (rules and variable values) that results from
+reading the makefiles; then execute as usual or as otherwise
+specified.
+This also prints the version information given by the
+.B \-v
+switch (see below).
+To print the data base without trying to remake any files, use
+.IR "make \-p \-f/dev/null" .
+.TP 0.5i
+\fB\-q\fR, \fB\-\-question\fR
+``Question mode''.
+Do not run any commands, or print anything; just return an exit status
+that is zero if the specified targets are already up to date, nonzero
+otherwise.
+.TP 0.5i
+\fB\-r\fR, \fB\-\-no\-builtin\-rules\fR
+Eliminate use of the built\-in implicit rules.
+Also clear out the default list of suffixes for suffix rules.
+.TP 0.5i
+\fB\-R\fR, \fB\-\-no\-builtin\-variables\fR
+Don't define any built\-in variables.
+.TP 0.5i
+\fB\-s\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR
+Silent operation; do not print the commands as they are executed.
+.TP 0.5i
+.B \-\-no\-silent
+Cancel the effect of the \fB\-s\fR option.
+.TP 0.5i
+\fB\-S\fR, \fB\-\-no\-keep\-going\fR, \fB\-\-stop\fR
+Cancel the effect of the
+.B \-k
+option.
+.TP 0.5i
+\fB\-t\fR, \fB\-\-touch\fR
+Touch files (mark them up to date without really changing them)
+instead of running their commands.
+This is used to pretend that the commands were done, in order to fool
+future invocations of
+.BR make .
+.TP 0.5i
+.B \-\-trace
+Information about the disposition of each target is printed (why the target is
+being rebuilt and what commands are run to rebuild it).
+.TP 0.5i
+\fB\-v\fR, \fB\-\-version\fR
+Print the version of the
+.B make
+program plus a copyright, a list of authors and a notice that there
+is no warranty.
+.TP 0.5i
+\fB\-w\fR, \fB\-\-print\-directory\fR
+Print a message containing the working directory
+before and after other processing.
+This may be useful for tracking down errors from complicated nests of
+recursive
+.B make
+commands.
+.TP 0.5i
+.B \-\-no\-print\-directory
+Turn off
+.BR \-w ,
+even if it was turned on implicitly.
+.TP 0.5i
+\fB\-W\fR \fIfile\fR, \fB\-\-what\-if\fR=\fIfile\fR, \fB\-\-new\-file\fR=\fIfile\fR, \fB\-\-assume\-new\fR=\fIfile\fR
+Pretend that the target
+.I file
+has just been modified.
+When used with the
+.B \-n
+flag, this shows you what would happen if you were to modify that file.
+Without
+.BR \-n ,
+it is almost the same as running a
+.I touch
+command on the given file before running
+.BR make ,
+except that the modification time is changed only in the imagination of
+.BR make .
+.TP 0.5i
+.B \-\-warn\-undefined\-variables
+Warn when an undefined variable is referenced.
+.SH "EXIT STATUS"
+GNU
+.B make
+exits with a status of zero if all makefiles were successfully parsed
+and no targets that were built failed.  A status of one will be returned
+if the
+.B \-q
+flag was used and
+.B make
+determines that a target needs to be rebuilt.  A status of two will be
+returned if any errors were encountered.
+.SH "SEE ALSO"
+The full documentation for
+.B make
+is maintained as a Texinfo manual.  If the
+.B info
+and
+.B make
+programs are properly installed at your site, the command
+.IP
+.B info make
+.PP
+should give you access to the complete manual.
+.SH BUGS
+See the chapter ``Problems and Bugs'' in
+.IR "The GNU Make Manual" .
+.SH AUTHOR
+This manual page contributed by Dennis Morse of Stanford University.
+Further updates contributed by Mike Frysinger.  It has been reworked by Roland
+McGrath.  Maintained by Paul Smith.
+.SH "COPYRIGHT"
+Copyright \(co 1992-1993, 1996-2020 Free Software Foundation, Inc.
+This file is part of
+.IR "GNU make" .
+.LP
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+.LP
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+.LP
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see
+.IR http://www.gnu.org/licenses/ .
index 5e39e990a4b75583ca28950763b168d7bf183546..b84710fd6f21f84516d52bbe3a30f477fce276a7 100644 (file)
@@ -1,15 +1,16 @@
-This is make.info, produced by makeinfo version 6.1 from make.texi.
+This is make.info, produced by makeinfo version 6.6 from make.texi.
 
 This file documents the GNU 'make' utility, which determines
 automatically which pieces of a large program need to be recompiled, and
 issues the commands to recompile them.
 
-   This is Edition 0.74, last updated 21 May 2016, of 'The GNU Make
-Manual', for GNU 'make' version 4.2.1.
+   This is Edition 0.75, last updated 19 January 2020, of 'The GNU Make
+Manual', for GNU 'make' version 4.3.
 
    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Free
+Software Foundation, Inc.
 
      Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU Free Documentation License,
@@ -29,177 +30,178 @@ END-INFO-DIR-ENTRY
 
 \1f
 Indirect:
-make.info-1: 1353
-make.info-2: 307140
+make.info-1: 1379
+make.info-2: 301593
 \1f
 Tag Table:
 (Indirect)
-Node: Top\7f1353
-Node: Overview\7f16535
-Node: Preparing\7f17548
-Node: Reading\7f18516
-Node: Bugs\7f19443
-Node: Introduction\7f21272
-Node: Rule Introduction\7f22865
-Node: Simple Makefile\7f24798
-Node: How Make Works\7f28534
-Node: Variables Simplify\7f31183
-Node: make Deduces\7f33389
-Node: Combine By Prerequisite\7f35122
-Node: Cleanup\7f36151
-Node: Makefiles\7f37569
-Node: Makefile Contents\7f38405
-Node: Splitting Lines\7f41578
-Node: Makefile Names\7f43338
-Node: Include\7f44945
-Ref: Include-Footnote-1\7f48689
-Node: MAKEFILES Variable\7f48823
-Node: Remaking Makefiles\7f50364
-Node: Overriding Makefiles\7f54589
-Node: Reading Makefiles\7f56617
-Node: Secondary Expansion\7f60079
-Node: Rules\7f67540
-Node: Rule Example\7f70213
-Node: Rule Syntax\7f71066
-Node: Prerequisite Types\7f73661
-Node: Wildcards\7f76528
-Node: Wildcard Examples\7f78247
-Node: Wildcard Pitfall\7f79597
-Node: Wildcard Function\7f81386
-Node: Directory Search\7f83170
-Node: General Search\7f84305
-Node: Selective Search\7f86012
-Node: Search Algorithm\7f89002
-Node: Recipes/Search\7f91520
-Node: Implicit/Search\7f92843
-Node: Libraries/Search\7f93785
-Node: Phony Targets\7f95756
-Node: Force Targets\7f100593
-Node: Empty Targets\7f101630
-Node: Special Targets\7f102932
-Node: Multiple Targets\7f110805
-Node: Multiple Rules\7f112665
-Node: Static Pattern\7f114883
-Node: Static Usage\7f115535
-Node: Static versus Implicit\7f119254
-Node: Double-Colon\7f120994
-Node: Automatic Prerequisites\7f122754
-Node: Recipes\7f127015
-Node: Recipe Syntax\7f128187
-Node: Splitting Recipe Lines\7f130302
-Node: Variables in Recipes\7f133455
-Node: Echoing\7f134781
-Node: Execution\7f136056
-Ref: Execution-Footnote-1\7f137469
-Node: One Shell\7f137614
-Node: Choosing the Shell\7f140929
-Node: Parallel\7f145073
-Node: Parallel Output\7f147742
-Node: Parallel Input\7f152169
-Node: Errors\7f153288
-Node: Interrupts\7f156952
-Node: Recursion\7f158535
-Node: MAKE Variable\7f160632
-Node: Variables/Recursion\7f162875
-Node: Options/Recursion\7f168320
-Node: -w Option\7f174326
-Node: Canned Recipes\7f175321
-Node: Empty Recipes\7f178304
-Node: Using Variables\7f179744
-Node: Reference\7f183172
-Node: Flavors\7f184730
-Node: Advanced\7f190709
-Node: Substitution Refs\7f191214
-Node: Computed Names\7f192767
-Node: Values\7f197315
-Node: Setting\7f198232
-Node: Appending\7f201271
-Node: Override Directive\7f205215
-Node: Multi-Line\7f206842
-Node: Undefine Directive\7f209666
-Node: Environment\7f210755
-Node: Target-specific\7f213007
-Node: Pattern-specific\7f216034
-Node: Suppressing Inheritance\7f217881
-Node: Special Variables\7f219334
-Node: Conditionals\7f225743
-Node: Conditional Example\7f226456
-Node: Conditional Syntax\7f229019
-Node: Testing Flags\7f234779
-Node: Functions\7f235880
-Node: Syntax of Functions\7f237440
-Node: Text Functions\7f239774
-Node: File Name Functions\7f248339
-Node: Conditional Functions\7f253565
-Node: Foreach Function\7f255940
-Node: File Function\7f259153
-Node: Call Function\7f261710
-Node: Value Function\7f264595
-Node: Eval Function\7f266032
-Node: Origin Function\7f268308
-Node: Flavor Function\7f271534
-Node: Make Control Functions\7f272578
-Node: Shell Function\7f274264
-Node: Guile Function\7f276023
-Node: Running\7f276773
-Node: Makefile Arguments\7f278754
-Node: Goals\7f279470
-Node: Instead of Execution\7f284209
-Node: Avoiding Compilation\7f287924
-Node: Overriding\7f289899
-Node: Testing\7f292211
-Node: Options Summary\7f294095
-Node: Implicit Rules\7f307140
-Node: Using Implicit\7f309277
-Node: Catalogue of Rules\7f312796
-Node: Implicit Variables\7f322140
-Node: Chained Rules\7f327213
-Node: Pattern Rules\7f331223
-Node: Pattern Intro\7f332757
-Node: Pattern Examples\7f335339
-Node: Automatic Variables\7f337146
-Node: Pattern Match\7f344498
-Node: Match-Anything Rules\7f347821
-Node: Canceling Rules\7f351700
-Node: Last Resort\7f352414
-Node: Suffix Rules\7f354243
-Node: Implicit Rule Search\7f357968
-Node: Archives\7f361467
-Node: Archive Members\7f362172
-Node: Archive Update\7f363782
-Node: Archive Symbols\7f365693
-Node: Archive Pitfalls\7f366926
-Node: Archive Suffix Rules\7f367648
-Node: Extending make\7f369196
-Node: Guile Integration\7f370341
-Node: Guile Types\7f371569
-Node: Guile Interface\7f373989
-Node: Guile Example\7f375275
-Node: Loading Objects\7f377466
-Node: load Directive\7f378956
-Node: Remaking Loaded Objects\7f381710
-Node: Loaded Object API\7f382344
-Node: Loaded Object Example\7f389106
-Node: Integrating make\7f391353
-Node: Job Slots\7f392104
-Node: POSIX Jobserver\7f395536
-Node: Windows Jobserver\7f397930
-Node: Terminal Output\7f399283
-Node: Features\7f401672
-Node: Missing\7f410841
-Node: Makefile Conventions\7f414566
-Node: Makefile Basics\7f415545
-Node: Utilities in Makefiles\7f418712
-Node: Command Variables\7f421211
-Node: DESTDIR\7f424451
-Node: Directory Variables\7f426618
-Node: Standard Targets\7f441975
-Node: Install Command Categories\7f456081
-Node: Quick Reference\7f460607
-Node: Error Messages\7f473321
-Node: Complex Makefile\7f481217
-Node: GNU Free Documentation License\7f489835
-Node: Concept Index\7f514977
-Node: Name Index\7f586485
+Node: Top\7f1379
+Node: Overview\7f16646
+Node: Preparing\7f17659
+Node: Reading\7f18627
+Node: Bugs\7f19554
+Node: Introduction\7f21383
+Node: Rule Introduction\7f22976
+Node: Simple Makefile\7f24909
+Node: How Make Works\7f28645
+Node: Variables Simplify\7f31294
+Node: make Deduces\7f33500
+Node: Combine By Prerequisite\7f35233
+Node: Cleanup\7f36262
+Node: Makefiles\7f37680
+Node: Makefile Contents\7f38575
+Node: Splitting Lines\7f41748
+Node: Makefile Names\7f44231
+Node: Include\7f45838
+Ref: Include-Footnote-1\7f49582
+Node: MAKEFILES Variable\7f49716
+Node: Remaking Makefiles\7f51257
+Node: Overriding Makefiles\7f55587
+Node: Reading Makefiles\7f57615
+Node: Parsing Makefiles\7f61057
+Node: Secondary Expansion\7f62915
+Node: Rules\7f70363
+Node: Rule Example\7f73036
+Node: Rule Syntax\7f73884
+Node: Prerequisite Types\7f76479
+Node: Wildcards\7f79346
+Node: Wildcard Examples\7f81065
+Node: Wildcard Pitfall\7f82415
+Node: Wildcard Function\7f84204
+Node: Directory Search\7f85988
+Node: General Search\7f87123
+Node: Selective Search\7f88830
+Node: Search Algorithm\7f91820
+Node: Recipes/Search\7f94338
+Node: Implicit/Search\7f95661
+Node: Libraries/Search\7f96603
+Node: Phony Targets\7f98574
+Node: Force Targets\7f103411
+Node: Empty Targets\7f104448
+Node: Special Targets\7f105750
+Node: Multiple Targets\7f113550
+Node: Multiple Rules\7f117783
+Node: Static Pattern\7f120001
+Node: Static Usage\7f120653
+Node: Static versus Implicit\7f124372
+Node: Double-Colon\7f126112
+Node: Automatic Prerequisites\7f127872
+Node: Recipes\7f132133
+Node: Recipe Syntax\7f133305
+Node: Splitting Recipe Lines\7f135420
+Node: Variables in Recipes\7f138573
+Node: Echoing\7f139899
+Node: Execution\7f141111
+Ref: Execution-Footnote-1\7f142524
+Node: One Shell\7f142669
+Node: Choosing the Shell\7f145987
+Node: Parallel\7f150131
+Node: Parallel Output\7f152800
+Node: Parallel Input\7f157227
+Node: Errors\7f158346
+Node: Interrupts\7f161981
+Node: Recursion\7f164342
+Node: MAKE Variable\7f166439
+Node: Variables/Recursion\7f168682
+Node: Options/Recursion\7f174127
+Node: -w Option\7f180133
+Node: Canned Recipes\7f181128
+Node: Empty Recipes\7f184111
+Node: Using Variables\7f185551
+Node: Reference\7f188979
+Node: Flavors\7f190789
+Node: Advanced\7f196768
+Node: Substitution Refs\7f197273
+Node: Computed Names\7f198875
+Node: Values\7f203423
+Node: Setting\7f204340
+Node: Appending\7f207379
+Node: Override Directive\7f211350
+Node: Multi-Line\7f212977
+Node: Undefine Directive\7f215840
+Node: Environment\7f216929
+Node: Target-specific\7f219181
+Node: Pattern-specific\7f222208
+Node: Suppressing Inheritance\7f224055
+Node: Special Variables\7f225508
+Node: Conditionals\7f233749
+Node: Conditional Example\7f234462
+Node: Conditional Syntax\7f237025
+Node: Testing Flags\7f242785
+Node: Functions\7f243886
+Node: Syntax of Functions\7f245446
+Node: Text Functions\7f247780
+Node: File Name Functions\7f256341
+Node: Conditional Functions\7f261567
+Node: Foreach Function\7f263943
+Node: File Function\7f267156
+Node: Call Function\7f269713
+Node: Value Function\7f272598
+Node: Eval Function\7f274035
+Node: Origin Function\7f276311
+Node: Flavor Function\7f279537
+Node: Make Control Functions\7f280581
+Node: Shell Function\7f282267
+Node: Guile Function\7f284026
+Node: Running\7f284776
+Node: Makefile Arguments\7f286757
+Node: Goals\7f287473
+Node: Instead of Execution\7f292212
+Node: Avoiding Compilation\7f295927
+Node: Overriding\7f297902
+Node: Testing\7f301593
+Node: Options Summary\7f303477
+Node: Implicit Rules\7f315181
+Node: Using Implicit\7f317318
+Node: Catalogue of Rules\7f320837
+Node: Implicit Variables\7f330181
+Node: Chained Rules\7f335254
+Node: Pattern Rules\7f339475
+Node: Pattern Intro\7f341009
+Node: Pattern Examples\7f343160
+Node: Automatic Variables\7f344967
+Node: Pattern Match\7f352342
+Node: Match-Anything Rules\7f355665
+Node: Canceling Rules\7f359586
+Node: Last Resort\7f360300
+Node: Suffix Rules\7f362129
+Node: Implicit Rule Search\7f365863
+Node: Archives\7f369414
+Node: Archive Members\7f370119
+Node: Archive Update\7f371729
+Node: Archive Symbols\7f373640
+Node: Archive Pitfalls\7f374873
+Node: Archive Suffix Rules\7f375595
+Node: Extending make\7f377143
+Node: Guile Integration\7f378288
+Node: Guile Types\7f379516
+Node: Guile Interface\7f381936
+Node: Guile Example\7f383222
+Node: Loading Objects\7f385413
+Node: load Directive\7f386903
+Node: Remaking Loaded Objects\7f389657
+Node: Loaded Object API\7f390291
+Node: Loaded Object Example\7f397053
+Node: Integrating make\7f399300
+Node: Job Slots\7f400051
+Node: POSIX Jobserver\7f403483
+Node: Windows Jobserver\7f405951
+Node: Terminal Output\7f407304
+Node: Features\7f409693
+Node: Missing\7f418862
+Node: Makefile Conventions\7f422590
+Node: Makefile Basics\7f423569
+Node: Utilities in Makefiles\7f426736
+Node: Command Variables\7f429235
+Node: DESTDIR\7f432475
+Node: Directory Variables\7f434642
+Node: Standard Targets\7f449999
+Node: Install Command Categories\7f464105
+Node: Quick Reference\7f468631
+Node: Error Messages\7f481345
+Node: Complex Makefile\7f490140
+Node: GNU Free Documentation License\7f498758
+Node: Concept Index\7f523916
+Node: Name Index\7f596081
 \1f
 End Tag Table
index 5d67dc86f85cbdb8002ddde72f0de466bb0793d9..abd0357a1bc437b131c55d8bd39dbfb734909c05 100644 (file)
@@ -1,15 +1,16 @@
-This is make.info, produced by makeinfo version 6.1 from make.texi.
+This is make.info, produced by makeinfo version 6.6 from make.texi.
 
 This file documents the GNU 'make' utility, which determines
 automatically which pieces of a large program need to be recompiled, and
 issues the commands to recompile them.
 
-   This is Edition 0.74, last updated 21 May 2016, of 'The GNU Make
-Manual', for GNU 'make' version 4.2.1.
+   This is Edition 0.75, last updated 19 January 2020, of 'The GNU Make
+Manual', for GNU 'make' version 4.3.
 
    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Free
+Software Foundation, Inc.
 
      Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU Free Documentation License,
@@ -37,12 +38,13 @@ This file documents the GNU 'make' utility, which determines
 automatically which pieces of a large program need to be recompiled, and
 issues the commands to recompile them.
 
-   This is Edition 0.74, last updated 21 May 2016, of 'The GNU Make
-Manual', for GNU 'make' version 4.2.1.
+   This is Edition 0.75, last updated 19 January 2020, of 'The GNU Make
+Manual', for GNU 'make' version 4.3.
 
    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Free
+Software Foundation, Inc.
 
      Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU Free Documentation License,
@@ -113,7 +115,8 @@ Writing Makefiles
 * Remaking Makefiles::          How makefiles get remade.
 * Overriding Makefiles::        How to override part of one makefile
                                   with another makefile.
-* Reading Makefiles::           How makefiles are parsed.
+* Reading Makefiles::           How makefiles are read in.
+* Parsing Makefiles::           How makefiles are parsed.
 * Secondary Expansion::         How and when secondary expansion is performed.
 
 What Makefiles Contain
@@ -868,7 +871,8 @@ reading a data base called the "makefile".
 * Remaking Makefiles::          How makefiles get remade.
 * Overriding Makefiles::        How to override part of one makefile
                                   with another makefile.
-* Reading Makefiles::           How makefiles are parsed.
+* Reading Makefiles::           How makefiles are read in.
+* Parsing Makefiles::           How makefiles are parsed.
 * Secondary Expansion::         How and when secondary expansion is performed.
 
 \1f
@@ -977,6 +981,28 @@ handling is modified slightly to conform to POSIX.2: first, whitespace
 preceding a backslash is not removed and second, consecutive
 backslash/newlines are not condensed.
 
+Splitting Without Adding Whitespace
+...................................
+
+If you need to split a line but do _not_ want any whitespace added, you
+can utilize a subtle trick: replace your backslash/newline pairs with
+the three characters dollar sign/backslash/newline:
+
+     var := one$\
+            word
+
+   After 'make' removes the backslash/newline and condenses the
+following line into a single space, this is equivalent to:
+
+     var := one$ word
+
+   Then 'make' will perform variable expansion.  The variable reference
+'$ ' refers to a variable with the one-character name " " (space) which
+does not exist, and so expands to the empty string, giving a final
+assignment which is the equivalent of:
+
+     var := oneword
+
 \1f
 File: make.info,  Node: Makefile Names,  Next: Include,  Prev: Makefile Contents,  Up: Makefiles
 
@@ -1137,16 +1163,17 @@ Sometimes makefiles can be remade from other files, such as RCS or SCCS
 files.  If a makefile can be remade from other files, you probably want
 'make' to get an up-to-date version of the makefile to read in.
 
-   To this end, after reading in all makefiles, 'make' will consider
-each as a goal target and attempt to update it.  If a makefile has a
-rule which says how to update it (found either in that very makefile or
-in another one) or if an implicit rule applies to it (*note Using
-Implicit Rules: Implicit Rules.), it will be updated if necessary.
-After all makefiles have been checked, if any have actually been
-changed, 'make' starts with a clean slate and reads all the makefiles
-over again.  (It will also attempt to update each of them over again,
-but normally this will not change them again, since they are already up
-to date.)
+   To this end, after reading in all makefiles 'make' will consider each
+as a goal target and attempt to update it.  If a makefile has a rule
+which says how to update it (found either in that very makefile or in
+another one) or if an implicit rule applies to it (*note Using Implicit
+Rules: Implicit Rules.), it will be updated if necessary.  After all
+makefiles have been checked, if any have actually been changed, 'make'
+starts with a clean slate and reads all the makefiles over again.  (It
+will also attempt to update each of them over again, but normally this
+will not change them again, since they are already up to date.)  Each
+restart will cause the special variable 'MAKE_RESTARTS' to be updated
+(*note Special Variables::).
 
    If you know that one or more of your makefiles cannot be remade and
 you want to keep 'make' from performing an implicit rule search on them,
@@ -1251,30 +1278,31 @@ it--otherwise it would apply the same match-anything rule to 'force'
 itself and create a prerequisite loop!
 
 \1f
-File: make.info,  Node: Reading Makefiles,  Next: Secondary Expansion,  Prev: Overriding Makefiles,  Up: Makefiles
+File: make.info,  Node: Reading Makefiles,  Next: Parsing Makefiles,  Prev: Overriding Makefiles,  Up: Makefiles
 
 3.7 How 'make' Reads a Makefile
 ===============================
 
 GNU 'make' does its work in two distinct phases.  During the first phase
 it reads all the makefiles, included makefiles, etc.  and internalizes
-all the variables and their values, implicit and explicit rules, and
-constructs a dependency graph of all the targets and their
-prerequisites.  During the second phase, 'make' uses these internal
-structures to determine what targets will need to be rebuilt and to
-invoke the rules necessary to do so.
+all the variables and their values and implicit and explicit rules, and
+builds a dependency graph of all the targets and their prerequisites.
+During the second phase, 'make' uses this internalized data to determine
+which targets need to be updated and run the recipes necessary to update
+them.
 
    It's important to understand this two-phase approach because it has a
 direct impact on how variable and function expansion happens; this is
-often a source of some confusion when writing makefiles.  Here we will
-present a summary of the phases in which expansion happens for different
-constructs within the makefile.  We say that expansion is "immediate" if
-it happens during the first phase: in this case 'make' will expand any
-variables or functions in that section of a construct as the makefile is
-parsed.  We say that expansion is "deferred" if expansion is not
-performed immediately.  Expansion of a deferred construct is not
-performed until either the construct appears later in an immediate
-context, or until the second phase.
+often a source of some confusion when writing makefiles.  Below is a
+summary of the different constructs that can be found in a makefile, and
+the phase in which expansion happens for each part of the construct.
+
+   We say that expansion is "immediate" if it happens during the first
+phase: 'make' will expand that part of the construct as the makefile is
+parsed.  We say that expansion is "deferred" if it is not immediate.
+Expansion of a deferred construct part is delayed until the expansion is
+used: either when it is referenced in an immediate context, or when it
+is needed during the second phase.
 
    You may not be familiar with some of these constructs yet.  You can
 reference this section as you become familiar with them, in later
@@ -1320,11 +1348,11 @@ Variable definitions are parsed as follows:
        IMMEDIATE
      endef
 
-   For the append operator, '+=', the right-hand side is considered
+   For the append operator '+=', the right-hand side is considered
 immediate if the variable was previously set as a simple variable (':='
 or '::='), and deferred otherwise.
 
-   For the shell assignment operator, '!=', the right-hand side is
+   For the shell assignment operator '!=', the right-hand side is
 evaluated immediately and handed to the shell.  The result is stored in
 the variable named on the left, and that variable becomes a simple
 variable (and will thus be re-evaluated on each reference).
@@ -1348,23 +1376,78 @@ A rule is always expanded the same way, regardless of the form:
              DEFERRED
 
    That is, the target and prerequisite sections are expanded
-immediately, and the recipe used to construct the target is always
-deferred.  This general rule is true for explicit rules, pattern rules,
-suffix rules, static pattern rules, and simple prerequisite definitions.
+immediately, and the recipe used to build the target is always deferred.
+This is true for explicit rules, pattern rules, suffix rules, static
+pattern rules, and simple prerequisite definitions.
+
+\1f
+File: make.info,  Node: Parsing Makefiles,  Next: Secondary Expansion,  Prev: Reading Makefiles,  Up: Makefiles
+
+3.8 How Makefiles Are Parsed
+============================
+
+GNU 'make' parses makefiles line-by-line.  Parsing proceeds using the
+following steps:
+
+  1. Read in a full logical line, including backslash-escaped lines
+     (*note Splitting Long Lines: Splitting Lines.).
+
+  2. Remove comments (*note What Makefiles Contain: Makefile Contents.).
+
+  3. If the line begins with the recipe prefix character and we are in a
+     rule context, add the line to the current recipe and read the next
+     line (*note Recipe Syntax::).
+
+  4. Expand elements of the line which appear in an _immediate_
+     expansion context (*note How 'make' Reads a Makefile: Reading
+     Makefiles.).
+
+  5. Scan the line for a separator character, such as ':' or '=', to
+     determine whether the line is a macro assignment or a rule (*note
+     Recipe Syntax::).
+
+  6. Internalize the resulting operation and read the next line.
+
+   An important consequence of this is that a macro can expand to an
+entire rule, _if it is one line long_.  This will work:
+
+     myrule = target : ; echo built
+
+     $(myrule)
+
+   However, this will not work because 'make' does not re-split lines
+after it has expanded them:
+
+     define myrule
+     target:
+             echo built
+     endef
+
+     $(myrule)
+
+   The above makefile results in the definition of a target 'target'
+with prerequisites 'echo' and 'built', as if the makefile contained
+'target: echo built', rather than a rule with a recipe.  Newlines still
+present in a line after expansion is complete are ignored as normal
+whitespace.
+
+   In order to properly expand a multi-line macro you must use the
+'eval' function: this causes the 'make' parser to be run on the results
+of the expanded macro (*note Eval Function::).
 
 \1f
-File: make.info,  Node: Secondary Expansion,  Prev: Reading Makefiles,  Up: Makefiles
+File: make.info,  Node: Secondary Expansion,  Prev: Parsing Makefiles,  Up: Makefiles
 
-3.8 Secondary Expansion
+3.9 Secondary Expansion
 =======================
 
-In the previous section we learned that GNU 'make' works in two distinct
-phases: a read-in phase and a target-update phase (*note How 'make'
-Reads a Makefile: Reading Makefiles.).  GNU make also has the ability to
-enable a _second expansion_ of the prerequisites (only) for some or all
-targets defined in the makefile.  In order for this second expansion to
-occur, the special target '.SECONDEXPANSION' must be defined before the
-first prerequisite list that makes use of this feature.
+Previously we learned that GNU 'make' works in two distinct phases: a
+read-in phase and a target-update phase (*note How 'make' Reads a
+Makefile: Reading Makefiles.).  GNU make also has the ability to enable
+a _second expansion_ of the prerequisites (only) for some or all targets
+defined in the makefile.  In order for this second expansion to occur,
+the special target '.SECONDEXPANSION' must be defined before the first
+prerequisite list that makes use of this feature.
 
    If that special target is defined then in between the two phases
 mentioned above, right at the end of the read-in phase, all the
@@ -1603,7 +1686,7 @@ with a tab to identify it as a recipe.
 
    * How to update the file 'foo.o': by running 'cc' as stated.  The
      recipe does not explicitly mention 'defs.h', but we presume that
-     'foo.c' includes it, and that that is why 'defs.h' was added to the
+     'foo.c' includes it, and that is why 'defs.h' was added to the
      prerequisites.
 
 \1f
@@ -2521,12 +2604,11 @@ Certain names have special meanings if they appear as targets.
      executing them.  The recipe for '.SILENT' is ignored.
 
      If mentioned as a target with no prerequisites, '.SILENT' says not
-     to print any recipes before executing them.  This usage of
-     '.SILENT' is supported only for historical compatibility.  We
-     recommend you use the more selective ways to silence specific
-     recipes.  *Note Recipe Echoing: Echoing.  If you want to silence
-     all recipes for a particular run of 'make', use the '-s' or
-     '--silent' option (*note Options Summary::).
+     to print any recipes before executing them.  You may also use more
+     selective ways to silence specific recipe command lines.  *Note
+     Recipe Echoing: Echoing.  If you want to silence all recipes for a
+     particular run of 'make', use the '-s' or '--silent' option (*note
+     Options Summary::).
 
 '.EXPORT_ALL_VARIABLES'
 
@@ -2578,25 +2660,36 @@ File: make.info,  Node: Multiple Targets,  Next: Multiple Rules,  Prev: Special
 4.10 Multiple Targets in a Rule
 ===============================
 
-A rule with multiple targets is equivalent to writing many rules, each
-with one target, and all identical aside from that.  The same recipe
-applies to all the targets, but its effect may vary because you can
-substitute the actual target name into the recipe using '$@'.  The rule
-contributes the same prerequisites to all the targets also.
+When an explicit rule has multiple targets they can be treated in one of
+two possible ways: as independent targets or as grouped targets.  The
+manner in which they are treated is determined by the separator that
+appears after the list of targets.
 
-   This is useful in two cases.
+Rules with Independent Targets
+..............................
+
+Rules that use the standard target separator, ':', define independent
+targets.  This is equivalent to writing the same rule once for each
+target, with duplicated prerequisites and recipes.  Typically, the
+recipe would use automatic variables such as '$@' to specify which
+target is being built.
+
+   Rules with independent targets are useful in two cases:
 
    * You want just prerequisites, no recipe.  For example:
 
           kbd.o command.o files.o: command.h
 
      gives an additional prerequisite to each of the three object files
-     mentioned.
+     mentioned.  It is equivalent to writing:
+
+          kbd.o: command.h
+          command.o: command.h
+          files.o: command.h
 
-   * Similar recipes work for all the targets.  The recipes do not need
-     to be absolutely identical, since the automatic variable '$@' can
-     be used to substitute the particular target to be remade into the
-     commands (*note Automatic Variables::).  For example:
+   * Similar recipes work for all the targets.  The automatic variable
+     '$@' can be used to substitute the particular target to be remade
+     into the commands (*note Automatic Variables::).  For example:
 
           bigoutput littleoutput : text.g
                   generate text.g -$(subst output,,$@) > $@
@@ -2619,6 +2712,51 @@ cannot do this with multiple targets in an ordinary rule, but you can do
 it with a "static pattern rule".  *Note Static Pattern Rules: Static
 Pattern.
 
+Rules with Grouped Targets
+..........................
+
+If instead of independent targets you have a recipe that generates
+multiple files from a single invocation, you can express that
+relationship by declaring your rule to use _grouped targets_.  A grouped
+target rule uses the separator '&:' (the '&' here is used to imply
+"all").
+
+   When 'make' builds any one of the grouped targets, it understands
+that all the other targets in the group are also created as a result of
+the invocation of the recipe.  Furthermore, if only some of the grouped
+targets are out of date or missing 'make' will realize that running the
+recipe will update all of the targets.
+
+   As an example, this rule defines a grouped target:
+
+     foo bar biz &: baz boz
+             echo $^ > foo
+             echo $^ > bar
+             echo $^ > biz
+
+   During the execution of a grouped target's recipe, the automatic
+variable '$@' is set to the name of the particular target in the group
+which triggered the rule.  Caution must be used if relying on this
+variable in the recipe of a grouped target rule.
+
+   Unlike independent targets, a grouped target rule _must_ include a
+recipe.  However, targets that are members of a grouped target may also
+appear in independent target rule definitions that do not have recipes.
+
+   Each target may have only one recipe associated with it.  If a
+grouped target appears in either an independent target rule or in
+another grouped target rule with a recipe, you will get a warning and
+the latter recipe will replace the former recipe.  Additionally the
+target will be removed from the previous group and appear only in the
+new group.
+
+   If you would like a target to appear in multiple groups, then you
+must use the double-colon grouped target separator, '&::' when declaring
+all of the groups containing that target.  Grouped double-colon targets
+are each considered independently, and each grouped double-colon rule's
+recipe is executed at most once, if at least one of its multiple targets
+requires updating.
+
 \1f
 File: make.info,  Node: Multiple Rules,  Next: Static Pattern,  Prev: Multiple Targets,  Up: Rules
 
@@ -3186,8 +3324,7 @@ thinks are necessary without actually doing them.
    The '-s' or '--silent' flag to 'make' prevents all echoing, as if all
 recipes started with '@'.  A rule in the makefile for the special target
 '.SILENT' without prerequisites has the same effect (*note Special
-Built-in Target Names: Special Targets.).  '.SILENT' is essentially
-obsolete since '@' is more flexible.
+Built-in Target Names: Special Targets.).
 
 \1f
 File: make.info,  Node: Execution,  Next: Parallel,  Prev: Echoing,  Up: Recipes
@@ -3209,7 +3346,7 @@ recipe line.  Then 'make' will invoke one shell to run the entire line,
 and the shell will execute the statements in sequence.  For example:
 
      foo : bar/lose
-             cd $(@D) && gobble $(@F) > ../$@
+             cd $(<D) && gobble $(<F) > ../$@
 
 Here we use the shell AND operator ('&&') so that if the 'cd' command
 fails, the script will fail without trying to invoke the 'gobble'
@@ -3288,7 +3425,7 @@ or
              print "@f\n";
 
    As a special feature, if 'SHELL' is determined to be a POSIX-style
-shell, the special prefix characters in "internal" recipe lines will
+shell, the special prefix characters in "internal" recipe lines will be
 _removed_ before the recipe is processed.  This feature is intended to
 allow existing makefiles to add the '.ONESHELL' special target and still
 run properly without extensive modifications.  Since the special prefix
@@ -3606,8 +3743,7 @@ This causes 'make' to continue even if 'rm' is unable to remove a file.
    When you run 'make' with the '-i' or '--ignore-errors' flag, errors
 are ignored in all recipes of all rules.  A rule in the makefile for the
 special target '.IGNORE' has the same effect, if there are no
-prerequisites.  These ways of ignoring errors are obsolete because '-'
-is more flexible.
+prerequisites.  This is less flexible but sometimes useful.
 
    When errors are to be ignored, because of either a '-' or the '-i'
 flag, 'make' treats an error return just like success, except that it
@@ -3679,6 +3815,20 @@ target is updated in some atomic fashion, or exists only to record a
 modification-time (its contents do not matter), or must exist at all
 times to prevent other sorts of trouble.
 
+   Although 'make' does its best to clean up there are certain
+situations in which cleanup is impossible.  For example, 'make' may be
+killed by an uncatchable signal.  Or, one of the programs make invokes
+may be killed or crash, leaving behind an up-to-date but corrupt target
+file: 'make' will not realize that this failure requires the target to
+be cleaned.  Or 'make' itself may encounter a bug and crash.
+
+   For these reasons it's best to write _defensive recipes_, which won't
+leave behind corrupted targets even if they fail.  Most commonly these
+recipes create temporary files rather than updating the target directly,
+then rename the temporary file to the final target name.  Some compilers
+already behave this way, so that you don't need to write a defensive
+recipe.
+
 \1f
 File: make.info,  Node: Recursion,  Next: Canned Recipes,  Prev: Interrupts,  Up: Recipes
 
@@ -4261,8 +4411,12 @@ is precisely 'c'.  (Don't actually write your makefiles this way!)
    A dollar sign followed by a character other than a dollar sign,
 open-parenthesis or open-brace treats that single character as the
 variable name.  Thus, you could reference the variable 'x' with '$x'.
-However, this practice is strongly discouraged, except in the case of
-the automatic variables (*note Automatic Variables::).
+However, this practice can lead to confusion (e.g., '$foo' refers to the
+variable 'f' followed by the string 'oo') so we recommend using
+parentheses or braces around all variables, even single-letter
+variables, unless omitting them gives significant readability
+improvements.  One place where readability is often improved is
+automatic variables (*note Automatic Variables::).
 
 \1f
 File: make.info,  Node: Flavors,  Next: Advanced,  Prev: Reference,  Up: Using Variables
@@ -4445,16 +4599,16 @@ followed by whitespace or at the end of the value in order to be
 replaced; other occurrences of A in the value are unaltered.  For
 example:
 
-     foo := a.o b.o c.o
+     foo := a.o b.o l.a c.o
      bar := $(foo:.o=.c)
 
-sets 'bar' to 'a.c b.c c.c'.  *Note Setting Variables: Setting.
+sets 'bar' to 'a.c b.c l.a c.c'.  *Note Setting Variables: Setting.
 
-   A substitution reference is actually an abbreviation for use of the
-'patsubst' expansion function (*note Functions for String Substitution
-and Analysis: Text Functions.).  We provide substitution references as
-well as 'patsubst' for compatibility with other implementations of
-'make'.
+   A substitution reference is shorthand for the 'patsubst' expansion
+function (*note Functions for String Substitution and Analysis: Text
+Functions.): '$(VAR:A=B)' is equivalent to '$(patsubst %A,%B,VAR)'.  We
+provide substitution references as well as 'patsubst' for compatibility
+with other implementations of 'make'.
 
    Another type of substitution reference lets you use the full power of
 the 'patsubst' function.  It has the same form '$(VAR:A=B)' described
@@ -4465,10 +4619,10 @@ Substitution and Analysis: Text Functions, for a description of the
 
 For example:
 
-     foo := a.o b.o c.o
+     foo := a.o b.o l.a c.o
      bar := $(foo:%.o=%.c)
 
-sets 'bar' to 'a.c b.c c.c'.
+sets 'bar' to 'a.c b.c l.a c.c'.
 
 \1f
 File: make.info,  Node: Computed Names,  Prev: Substitution Refs,  Up: Advanced
@@ -4724,7 +4878,8 @@ defined.  You do this with a line containing '+=', like this:
      objects += another.o
 
 This takes the value of the variable 'objects', and adds the text
-'another.o' to it (preceded by a single space).  Thus:
+'another.o' to it (preceded by a single space, if it has a value
+already).  Thus:
 
      objects = main.o foo.o bar.o utils.o
      objects += another.o
@@ -4875,10 +5030,22 @@ Recipes.), and also sections of makefile syntax to use with 'eval'
 the variable being defined and an (optional) assignment operator, and
 nothing more.  The value to give the variable appears on the following
 lines.  The end of the value is marked by a line containing just the
-word 'endef'.  Aside from this difference in syntax, 'define' works just
-like any other variable definition.  The variable name may contain
-function and variable references, which are expanded when the directive
-is read to find the actual variable name to use.
+word 'endef'.
+
+   Aside from this difference in syntax, 'define' works just like any
+other variable definition.  The variable name may contain function and
+variable references, which are expanded when the directive is read to
+find the actual variable name to use.
+
+   The final newline before the 'endef' is not included in the value; if
+you want your value to contain a trailing newline you must include a
+blank line.  For example in order to define a variable that contains a
+newline character you must use _two_ empty lines, not one:
+
+     define newline
+
+
+     endef
 
    You may omit the variable assignment operator if you prefer.  If
 omitted, 'make' assumes it to be '=' and creates a recursively-expanded
@@ -4893,16 +5060,11 @@ directives and report an error if they are not all properly closed with
 considered part of a recipe, so any 'define' or 'endef' strings
 appearing on such a line will not be considered 'make' directives.
 
-     define two-lines =
+     define two-lines
      echo foo
      echo $(bar)
      endef
 
-   The value in an ordinary assignment cannot contain a newline; but the
-newlines that separate the lines of the value in a 'define' become part
-of the variable's value (except for the final newline which precedes the
-'endef' and is not considered part of the value).
-
    When used in a recipe, the previous example is functionally
 equivalent to this:
 
@@ -5324,6 +5486,49 @@ GNU 'make' supports some variables that have special properties.
      Expands to a list of directories that 'make' searches for included
      makefiles (*note Including Other Makefiles: Include.).
 
+'.EXTRA_PREREQS'
+     Each word in this variable is a new prerequisite which is added to
+     targets for which it is set.  These prerequisites differ from
+     normal prerequisites in that they do not appear in any of the
+     automatic variables (*note Automatic Variables::).  This allows
+     prerequisites to be defined which do not impact the recipe.
+
+     Consider a rule to link a program:
+
+          myprog: myprog.o file1.o file2.o
+                 $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+
+     Now suppose you want to enhance this makefile to ensure that
+     updates to the compiler cause the program to be re-linked.  You can
+     add the compiler as a prerequisite, but you must ensure that it's
+     not passed as an argument to link command.  You'll need something
+     like this:
+
+          myprog: myprog.o file1.o file2.o $(CC)
+                 $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(filter-out $(CC),$^) $(LDLIBS)
+
+     Then consider having multiple extra prerequisites: they would all
+     have to be filtered out.  Using '.EXTRA_PREREQS' and
+     target-specific variables provides a simpler solution:
+
+          myprog: myprog.o file1.o file2.o
+                 $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+          myprog: .EXTRA_PREREQS = $(CC)
+
+     This feature can also be useful if you want to add prerequisites to
+     a makefile you cannot easily modify: you can create a new file such
+     as 'extra.mk':
+
+          myprog: .EXTRA_PREREQS = $(CC)
+
+     then invoke 'make -f extra.mk -f Makefile'.
+
+     Setting '.EXTRA_PREREQS' globally will cause those prerequisites to
+     be added to all targets (which did not themselves override it with
+     a target-specific value).  Note 'make' is smart enough not to add a
+     prerequisite listed in '.EXTRA_PREREQS' as a prerequisite to
+     itself.
+
 \1f
 File: make.info,  Node: Conditionals,  Next: Functions,  Prev: Using Variables,  Up: Top
 
@@ -5706,7 +5911,7 @@ Here are some functions that operate on strings:
 
           $(subst ee,EE,feet on the street)
 
-     substitutes the string 'fEEt on the strEEt'.
+     produces the value 'fEEt on the strEEt'.
 
 '$(patsubst PATTERN,REPLACEMENT,TEXT)'
      Finds whitespace-separated words in TEXT that match PATTERN and
@@ -6066,7 +6271,7 @@ expanded.
      The 'if' function provides support for conditional expansion in a
      functional context (as opposed to the GNU 'make' makefile
      conditionals such as 'ifeq' (*note Syntax of Conditionals:
-     Conditional Syntax.).
+     Conditional Syntax.)).
 
      The first argument, CONDITION, first has all preceding and trailing
      whitespace stripped, then is expanded.  If it expands to any
@@ -7017,333 +7222,3 @@ have overridden.  This is to use the 'override' directive, which is a
 line that looks like this: 'override VARIABLE = VALUE' (*note The
 'override' Directive: Override Directive.).
 
-\1f
-File: make.info,  Node: Testing,  Next: Options Summary,  Prev: Overriding,  Up: Running
-
-9.6 Testing the Compilation of a Program
-========================================
-
-Normally, when an error happens in executing a shell command, 'make'
-gives up immediately, returning a nonzero status.  No further recipes
-are executed for any target.  The error implies that the goal cannot be
-correctly remade, and 'make' reports this as soon as it knows.
-
-   When you are compiling a program that you have just changed, this is
-not what you want.  Instead, you would rather that 'make' try compiling
-every file that can be tried, to show you as many compilation errors as
-possible.
-
-   On these occasions, you should use the '-k' or '--keep-going' flag.
-This tells 'make' to continue to consider the other prerequisites of the
-pending targets, remaking them if necessary, before it gives up and
-returns nonzero status.  For example, after an error in compiling one
-object file, 'make -k' will continue compiling other object files even
-though it already knows that linking them will be impossible.  In
-addition to continuing after failed shell commands, 'make -k' will
-continue as much as possible after discovering that it does not know how
-to make a target or prerequisite file.  This will always cause an error
-message, but without '-k', it is a fatal error (*note Summary of
-Options: Options Summary.).
-
-   The usual behavior of 'make' assumes that your purpose is to get the
-goals up to date; once 'make' learns that this is impossible, it might
-as well report the failure immediately.  The '-k' flag says that the
-real purpose is to test as much as possible of the changes made in the
-program, perhaps to find several independent problems so that you can
-correct them all before the next attempt to compile.  This is why Emacs'
-'M-x compile' command passes the '-k' flag by default.
-
-\1f
-File: make.info,  Node: Options Summary,  Prev: Testing,  Up: Running
-
-9.7 Summary of Options
-======================
-
-Here is a table of all the options 'make' understands:
-
-'-b'
-'-m'
-     These options are ignored for compatibility with other versions of
-     'make'.
-
-'-B'
-'--always-make'
-     Consider all targets out-of-date.  GNU 'make' proceeds to consider
-     targets and their prerequisites using the normal algorithms;
-     however, all targets so considered are always remade regardless of
-     the status of their prerequisites.  To avoid infinite recursion, if
-     'MAKE_RESTARTS' (*note Other Special Variables: Special Variables.)
-     is set to a number greater than 0 this option is disabled when
-     considering whether to remake makefiles (*note How Makefiles Are
-     Remade: Remaking Makefiles.).
-
-'-C DIR'
-'--directory=DIR'
-     Change to directory DIR before reading the makefiles.  If multiple
-     '-C' options are specified, each is interpreted relative to the
-     previous one: '-C / -C etc' is equivalent to '-C /etc'.  This is
-     typically used with recursive invocations of 'make' (*note
-     Recursive Use of 'make': Recursion.).
-
-'-d'
-
-     Print debugging information in addition to normal processing.  The
-     debugging information says which files are being considered for
-     remaking, which file-times are being compared and with what
-     results, which files actually need to be remade, which implicit
-     rules are considered and which are applied--everything interesting
-     about how 'make' decides what to do.  The '-d' option is equivalent
-     to '--debug=a' (see below).
-
-'--debug[=OPTIONS]'
-
-     Print debugging information in addition to normal processing.
-     Various levels and types of output can be chosen.  With no
-     arguments, print the "basic" level of debugging.  Possible
-     arguments are below; only the first character is considered, and
-     values must be comma- or space-separated.
-
-     'a (all)'
-          All types of debugging output are enabled.  This is equivalent
-          to using '-d'.
-
-     'b (basic)'
-          Basic debugging prints each target that was found to be
-          out-of-date, and whether the build was successful or not.
-
-     'v (verbose)'
-          A level above 'basic'; includes messages about which makefiles
-          were parsed, prerequisites that did not need to be rebuilt,
-          etc.  This option also enables 'basic' messages.
-
-     'i (implicit)'
-          Prints messages describing the implicit rule searches for each
-          target.  This option also enables 'basic' messages.
-
-     'j (jobs)'
-          Prints messages giving details on the invocation of specific
-          sub-commands.
-
-     'm (makefile)'
-          By default, the above messages are not enabled while trying to
-          remake the makefiles.  This option enables messages while
-          rebuilding makefiles, too.  Note that the 'all' option does
-          enable this option.  This option also enables 'basic'
-          messages.
-
-     'n (none)'
-          Disable all debugging currently enabled.  If additional
-          debugging flags are encountered after this they will still
-          take effect.
-
-'-e'
-'--environment-overrides'
-     Give variables taken from the environment precedence over variables
-     from makefiles.  *Note Variables from the Environment: Environment.
-
-'--eval=STRING'
-
-     Evaluate STRING as makefile syntax.  This is a command-line version
-     of the 'eval' function (*note Eval Function::).  The evaluation is
-     performed after the default rules and variables have been defined,
-     but before any makefiles are read.
-
-'-f FILE'
-'--file=FILE'
-'--makefile=FILE'
-     Read the file named FILE as a makefile.  *Note Writing Makefiles:
-     Makefiles.
-
-'-h'
-'--help'
-
-     Remind you of the options that 'make' understands and then exit.
-
-'-i'
-'--ignore-errors'
-     Ignore all errors in recipes executed to remake files.  *Note
-     Errors in Recipes: Errors.
-
-'-I DIR'
-'--include-dir=DIR'
-     Specifies a directory DIR to search for included makefiles.  *Note
-     Including Other Makefiles: Include.  If several '-I' options are
-     used to specify several directories, the directories are searched
-     in the order specified.
-
-'-j [JOBS]'
-'--jobs[=JOBS]'
-     Specifies the number of recipes (jobs) to run simultaneously.  With
-     no argument, 'make' runs as many recipes simultaneously as
-     possible.  If there is more than one '-j' option, the last one is
-     effective.  *Note Parallel Execution: Parallel, for more
-     information on how recipes are run.  Note that this option is
-     ignored on MS-DOS.
-
-'-k'
-'--keep-going'
-     Continue as much as possible after an error.  While the target that
-     failed, and those that depend on it, cannot be remade, the other
-     prerequisites of these targets can be processed all the same.
-     *Note Testing the Compilation of a Program: Testing.
-
-'-l [LOAD]'
-'--load-average[=LOAD]'
-'--max-load[=LOAD]'
-     Specifies that no new recipes should be started if there are other
-     recipes running and the load average is at least LOAD (a
-     floating-point number).  With no argument, removes a previous load
-     limit.  *Note Parallel Execution: Parallel.
-
-'-L'
-'--check-symlink-times'
-     On systems that support symbolic links, this option causes 'make'
-     to consider the timestamps on any symbolic links in addition to the
-     timestamp on the file referenced by those links.  When this option
-     is provided, the most recent timestamp among the file and the
-     symbolic links is taken as the modification time for this target
-     file.
-
-'-n'
-'--just-print'
-'--dry-run'
-'--recon'
-
-     Print the recipe that would be executed, but do not execute it
-     (except in certain circumstances).  *Note Instead of Executing
-     Recipes: Instead of Execution.
-
-'-o FILE'
-'--old-file=FILE'
-'--assume-old=FILE'
-     Do not remake the file FILE even if it is older than its
-     prerequisites, and do not remake anything on account of changes in
-     FILE.  Essentially the file is treated as very old and its rules
-     are ignored.  *Note Avoiding Recompilation of Some Files: Avoiding
-     Compilation.
-
-'-O[TYPE]'
-'--output-sync[=TYPE]'
-     Ensure that the complete output from each recipe is printed in one
-     uninterrupted sequence.  This option is only useful when using the
-     '--jobs' option to run multiple recipes simultaneously (*note
-     Parallel Execution: Parallel.) Without this option output will be
-     displayed as it is generated by the recipes.
-
-     With no type or the type 'target', output from the entire recipe of
-     each target is grouped together.  With the type 'line', output from
-     each line in the recipe is grouped together.  With the type
-     'recurse', the output from an entire recursive make is grouped
-     together.  With the type 'none', no output synchronization is
-     performed.  *Note Output During Parallel Execution: Parallel
-     Output.
-
-'-p'
-'--print-data-base'
-     Print the data base (rules and variable values) that results from
-     reading the makefiles; then execute as usual or as otherwise
-     specified.  This also prints the version information given by the
-     '-v' switch (see below).  To print the data base without trying to
-     remake any files, use 'make -qp'.  To print the data base of
-     predefined rules and variables, use 'make -p -f /dev/null'.  The
-     data base output contains file name and line number information for
-     recipe and variable definitions, so it can be a useful debugging
-     tool in complex environments.
-
-'-q'
-'--question'
-     "Question mode".  Do not run any recipes, or print anything; just
-     return an exit status that is zero if the specified targets are
-     already up to date, one if any remaking is required, or two if an
-     error is encountered.  *Note Instead of Executing Recipes: Instead
-     of Execution.
-
-'-r'
-'--no-builtin-rules'
-     Eliminate use of the built-in implicit rules (*note Using Implicit
-     Rules: Implicit Rules.).  You can still define your own by writing
-     pattern rules (*note Defining and Redefining Pattern Rules: Pattern
-     Rules.).  The '-r' option also clears out the default list of
-     suffixes for suffix rules (*note Old-Fashioned Suffix Rules: Suffix
-     Rules.).  But you can still define your own suffixes with a rule
-     for '.SUFFIXES', and then define your own suffix rules.  Note that
-     only _rules_ are affected by the '-r' option; default variables
-     remain in effect (*note Variables Used by Implicit Rules: Implicit
-     Variables.); see the '-R' option below.
-
-'-R'
-'--no-builtin-variables'
-     Eliminate use of the built-in rule-specific variables (*note
-     Variables Used by Implicit Rules: Implicit Variables.).  You can
-     still define your own, of course.  The '-R' option also
-     automatically enables the '-r' option (see above), since it doesn't
-     make sense to have implicit rules without any definitions for the
-     variables that they use.
-
-'-s'
-'--silent'
-'--quiet'
-
-     Silent operation; do not print the recipes as they are executed.
-     *Note Recipe Echoing: Echoing.
-
-'-S'
-'--no-keep-going'
-'--stop'
-
-     Cancel the effect of the '-k' option.  This is never necessary
-     except in a recursive 'make' where '-k' might be inherited from the
-     top-level 'make' via 'MAKEFLAGS' (*note Recursive Use of 'make':
-     Recursion.) or if you set '-k' in 'MAKEFLAGS' in your environment.
-
-'-t'
-'--touch'
-
-     Touch files (mark them up to date without really changing them)
-     instead of running their recipes.  This is used to pretend that the
-     recipes were done, in order to fool future invocations of 'make'.
-     *Note Instead of Executing Recipes: Instead of Execution.
-
-'--trace'
-     Show tracing information for 'make' execution.  Prints the entire
-     recipe to be executed, even for recipes that are normally silent
-     (due to '.SILENT' or '@').  Also prints the makefile name and line
-     number where the recipe was defined, and information on why the
-     target is being rebuilt.
-
-'-v'
-'--version'
-     Print the version of the 'make' program plus a copyright, a list of
-     authors, and a notice that there is no warranty; then exit.
-
-'-w'
-'--print-directory'
-     Print a message containing the working directory both before and
-     after executing the makefile.  This may be useful for tracking down
-     errors from complicated nests of recursive 'make' commands.  *Note
-     Recursive Use of 'make': Recursion.  (In practice, you rarely need
-     to specify this option since 'make' does it for you; see *note The
-     '--print-directory' Option: -w Option.)
-
-'--no-print-directory'
-     Disable printing of the working directory under '-w'.  This option
-     is useful when '-w' is turned on automatically, but you do not want
-     to see the extra messages.  *Note The '--print-directory' Option:
-     -w Option.
-
-'-W FILE'
-'--what-if=FILE'
-'--new-file=FILE'
-'--assume-new=FILE'
-     Pretend that the target FILE has just been modified.  When used
-     with the '-n' flag, this shows you what would happen if you were to
-     modify that file.  Without '-n', it is almost the same as running a
-     'touch' command on the given file before running 'make', except
-     that the modification time is changed only in the imagination of
-     'make'.  *Note Instead of Executing Recipes: Instead of Execution.
-
-'--warn-undefined-variables'
-     Issue a warning message whenever 'make' sees a reference to an
-     undefined variable.  This can be helpful when you are trying to
-     debug makefiles which use variables in complex ways.
-
index e52cb17e095efb108b94fc948abb51a6c902b3eb..8af29d7f8b72babaad566ce374b824c183b76a5e 100644 (file)
@@ -1,15 +1,16 @@
-This is make.info, produced by makeinfo version 6.1 from make.texi.
+This is make.info, produced by makeinfo version 6.6 from make.texi.
 
 This file documents the GNU 'make' utility, which determines
 automatically which pieces of a large program need to be recompiled, and
 issues the commands to recompile them.
 
-   This is Edition 0.74, last updated 21 May 2016, of 'The GNU Make
-Manual', for GNU 'make' version 4.2.1.
+   This is Edition 0.75, last updated 19 January 2020, of 'The GNU Make
+Manual', for GNU 'make' version 4.3.
 
    Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
-2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software Foundation, Inc.
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Free
+Software Foundation, Inc.
 
      Permission is granted to copy, distribute and/or modify this
      document under the terms of the GNU Free Documentation License,
@@ -27,6 +28,337 @@ START-INFO-DIR-ENTRY
 * Make: (make).            Remake files automatically.
 END-INFO-DIR-ENTRY
 
+\1f
+File: make.info,  Node: Testing,  Next: Options Summary,  Prev: Overriding,  Up: Running
+
+9.6 Testing the Compilation of a Program
+========================================
+
+Normally, when an error happens in executing a shell command, 'make'
+gives up immediately, returning a nonzero status.  No further recipes
+are executed for any target.  The error implies that the goal cannot be
+correctly remade, and 'make' reports this as soon as it knows.
+
+   When you are compiling a program that you have just changed, this is
+not what you want.  Instead, you would rather that 'make' try compiling
+every file that can be tried, to show you as many compilation errors as
+possible.
+
+   On these occasions, you should use the '-k' or '--keep-going' flag.
+This tells 'make' to continue to consider the other prerequisites of the
+pending targets, remaking them if necessary, before it gives up and
+returns nonzero status.  For example, after an error in compiling one
+object file, 'make -k' will continue compiling other object files even
+though it already knows that linking them will be impossible.  In
+addition to continuing after failed shell commands, 'make -k' will
+continue as much as possible after discovering that it does not know how
+to make a target or prerequisite file.  This will always cause an error
+message, but without '-k', it is a fatal error (*note Summary of
+Options: Options Summary.).
+
+   The usual behavior of 'make' assumes that your purpose is to get the
+goals up to date; once 'make' learns that this is impossible, it might
+as well report the failure immediately.  The '-k' flag says that the
+real purpose is to test as much as possible of the changes made in the
+program, perhaps to find several independent problems so that you can
+correct them all before the next attempt to compile.  This is why Emacs'
+'M-x compile' command passes the '-k' flag by default.
+
+\1f
+File: make.info,  Node: Options Summary,  Prev: Testing,  Up: Running
+
+9.7 Summary of Options
+======================
+
+Here is a table of all the options 'make' understands:
+
+'-b'
+'-m'
+     These options are ignored for compatibility with other versions of
+     'make'.
+
+'-B'
+'--always-make'
+     Consider all targets out-of-date.  GNU 'make' proceeds to consider
+     targets and their prerequisites using the normal algorithms;
+     however, all targets so considered are always remade regardless of
+     the status of their prerequisites.  To avoid infinite recursion, if
+     'MAKE_RESTARTS' (*note Other Special Variables: Special Variables.)
+     is set to a number greater than 0 this option is disabled when
+     considering whether to remake makefiles (*note How Makefiles Are
+     Remade: Remaking Makefiles.).
+
+'-C DIR'
+'--directory=DIR'
+     Change to directory DIR before reading the makefiles.  If multiple
+     '-C' options are specified, each is interpreted relative to the
+     previous one: '-C / -C etc' is equivalent to '-C /etc'.  This is
+     typically used with recursive invocations of 'make' (*note
+     Recursive Use of 'make': Recursion.).
+
+'-d'
+
+     Print debugging information in addition to normal processing.  The
+     debugging information says which files are being considered for
+     remaking, which file-times are being compared and with what
+     results, which files actually need to be remade, which implicit
+     rules are considered and which are applied--everything interesting
+     about how 'make' decides what to do.  The '-d' option is equivalent
+     to '--debug=a' (see below).
+
+'--debug[=OPTIONS]'
+
+     Print debugging information in addition to normal processing.
+     Various levels and types of output can be chosen.  With no
+     arguments, print the "basic" level of debugging.  Possible
+     arguments are below; only the first character is considered, and
+     values must be comma- or space-separated.
+
+     'a (all)'
+          All types of debugging output are enabled.  This is equivalent
+          to using '-d'.
+
+     'b (basic)'
+          Basic debugging prints each target that was found to be
+          out-of-date, and whether the build was successful or not.
+
+     'v (verbose)'
+          A level above 'basic'; includes messages about which makefiles
+          were parsed, prerequisites that did not need to be rebuilt,
+          etc.  This option also enables 'basic' messages.
+
+     'i (implicit)'
+          Prints messages describing the implicit rule searches for each
+          target.  This option also enables 'basic' messages.
+
+     'j (jobs)'
+          Prints messages giving details on the invocation of specific
+          sub-commands.
+
+     'm (makefile)'
+          By default, the above messages are not enabled while trying to
+          remake the makefiles.  This option enables messages while
+          rebuilding makefiles, too.  Note that the 'all' option does
+          enable this option.  This option also enables 'basic'
+          messages.
+
+     'n (none)'
+          Disable all debugging currently enabled.  If additional
+          debugging flags are encountered after this they will still
+          take effect.
+
+'-e'
+'--environment-overrides'
+     Give variables taken from the environment precedence over variables
+     from makefiles.  *Note Variables from the Environment: Environment.
+
+'-E STRING'
+'--eval=STRING'
+
+     Evaluate STRING as makefile syntax.  This is a command-line version
+     of the 'eval' function (*note Eval Function::).  The evaluation is
+     performed after the default rules and variables have been defined,
+     but before any makefiles are read.
+
+'-f FILE'
+'--file=FILE'
+'--makefile=FILE'
+     Read the file named FILE as a makefile.  *Note Writing Makefiles:
+     Makefiles.
+
+'-h'
+'--help'
+
+     Remind you of the options that 'make' understands and then exit.
+
+'-i'
+'--ignore-errors'
+     Ignore all errors in recipes executed to remake files.  *Note
+     Errors in Recipes: Errors.
+
+'-I DIR'
+'--include-dir=DIR'
+     Specifies a directory DIR to search for included makefiles.  *Note
+     Including Other Makefiles: Include.  If several '-I' options are
+     used to specify several directories, the directories are searched
+     in the order specified.
+
+'-j [JOBS]'
+'--jobs[=JOBS]'
+     Specifies the number of recipes (jobs) to run simultaneously.  With
+     no argument, 'make' runs as many recipes simultaneously as
+     possible.  If there is more than one '-j' option, the last one is
+     effective.  *Note Parallel Execution: Parallel, for more
+     information on how recipes are run.  Note that this option is
+     ignored on MS-DOS.
+
+'-k'
+'--keep-going'
+     Continue as much as possible after an error.  While the target that
+     failed, and those that depend on it, cannot be remade, the other
+     prerequisites of these targets can be processed all the same.
+     *Note Testing the Compilation of a Program: Testing.
+
+'-l [LOAD]'
+'--load-average[=LOAD]'
+'--max-load[=LOAD]'
+     Specifies that no new recipes should be started if there are other
+     recipes running and the load average is at least LOAD (a
+     floating-point number).  With no argument, removes a previous load
+     limit.  *Note Parallel Execution: Parallel.
+
+'-L'
+'--check-symlink-times'
+     On systems that support symbolic links, this option causes 'make'
+     to consider the timestamps on any symbolic links in addition to the
+     timestamp on the file referenced by those links.  When this option
+     is provided, the most recent timestamp among the file and the
+     symbolic links is taken as the modification time for this target
+     file.
+
+'-n'
+'--just-print'
+'--dry-run'
+'--recon'
+
+     Print the recipe that would be executed, but do not execute it
+     (except in certain circumstances).  *Note Instead of Executing
+     Recipes: Instead of Execution.
+
+'-o FILE'
+'--old-file=FILE'
+'--assume-old=FILE'
+     Do not remake the file FILE even if it is older than its
+     prerequisites, and do not remake anything on account of changes in
+     FILE.  Essentially the file is treated as very old and its rules
+     are ignored.  *Note Avoiding Recompilation of Some Files: Avoiding
+     Compilation.
+
+'-O[TYPE]'
+'--output-sync[=TYPE]'
+     Ensure that the complete output from each recipe is printed in one
+     uninterrupted sequence.  This option is only useful when using the
+     '--jobs' option to run multiple recipes simultaneously (*note
+     Parallel Execution: Parallel.) Without this option output will be
+     displayed as it is generated by the recipes.
+
+     With no type or the type 'target', output from the entire recipe of
+     each target is grouped together.  With the type 'line', output from
+     each line in the recipe is grouped together.  With the type
+     'recurse', the output from an entire recursive make is grouped
+     together.  With the type 'none', no output synchronization is
+     performed.  *Note Output During Parallel Execution: Parallel
+     Output.
+
+'-p'
+'--print-data-base'
+     Print the data base (rules and variable values) that results from
+     reading the makefiles; then execute as usual or as otherwise
+     specified.  This also prints the version information given by the
+     '-v' switch (see below).  To print the data base without trying to
+     remake any files, use 'make -qp'.  To print the data base of
+     predefined rules and variables, use 'make -p -f /dev/null'.  The
+     data base output contains file name and line number information for
+     recipe and variable definitions, so it can be a useful debugging
+     tool in complex environments.
+
+'-q'
+'--question'
+     "Question mode".  Do not run any recipes, or print anything; just
+     return an exit status that is zero if the specified targets are
+     already up to date, one if any remaking is required, or two if an
+     error is encountered.  *Note Instead of Executing Recipes: Instead
+     of Execution.
+
+'-r'
+'--no-builtin-rules'
+     Eliminate use of the built-in implicit rules (*note Using Implicit
+     Rules: Implicit Rules.).  You can still define your own by writing
+     pattern rules (*note Defining and Redefining Pattern Rules: Pattern
+     Rules.).  The '-r' option also clears out the default list of
+     suffixes for suffix rules (*note Old-Fashioned Suffix Rules: Suffix
+     Rules.).  But you can still define your own suffixes with a rule
+     for '.SUFFIXES', and then define your own suffix rules.  Note that
+     only _rules_ are affected by the '-r' option; default variables
+     remain in effect (*note Variables Used by Implicit Rules: Implicit
+     Variables.); see the '-R' option below.
+
+'-R'
+'--no-builtin-variables'
+     Eliminate use of the built-in rule-specific variables (*note
+     Variables Used by Implicit Rules: Implicit Variables.).  You can
+     still define your own, of course.  The '-R' option also
+     automatically enables the '-r' option (see above), since it doesn't
+     make sense to have implicit rules without any definitions for the
+     variables that they use.
+
+'-s'
+'--silent'
+'--quiet'
+
+     Silent operation; do not print the recipes as they are executed.
+     *Note Recipe Echoing: Echoing.
+
+'-S'
+'--no-keep-going'
+'--stop'
+
+     Cancel the effect of the '-k' option.  This is never necessary
+     except in a recursive 'make' where '-k' might be inherited from the
+     top-level 'make' via 'MAKEFLAGS' (*note Recursive Use of 'make':
+     Recursion.) or if you set '-k' in 'MAKEFLAGS' in your environment.
+
+'-t'
+'--touch'
+
+     Touch files (mark them up to date without really changing them)
+     instead of running their recipes.  This is used to pretend that the
+     recipes were done, in order to fool future invocations of 'make'.
+     *Note Instead of Executing Recipes: Instead of Execution.
+
+'--trace'
+     Show tracing information for 'make' execution.  Prints the entire
+     recipe to be executed, even for recipes that are normally silent
+     (due to '.SILENT' or '@').  Also prints the makefile name and line
+     number where the recipe was defined, and information on why the
+     target is being rebuilt.
+
+'-v'
+'--version'
+     Print the version of the 'make' program plus a copyright, a list of
+     authors, and a notice that there is no warranty; then exit.
+
+'-w'
+'--print-directory'
+     Print a message containing the working directory both before and
+     after executing the makefile.  This may be useful for tracking down
+     errors from complicated nests of recursive 'make' commands.  *Note
+     Recursive Use of 'make': Recursion.  (In practice, you rarely need
+     to specify this option since 'make' does it for you; see *note The
+     '--print-directory' Option: -w Option.)
+
+'--no-print-directory'
+     Disable printing of the working directory under '-w'.  This option
+     is useful when '-w' is turned on automatically, but you do not want
+     to see the extra messages.  *Note The '--print-directory' Option:
+     -w Option.
+
+'-W FILE'
+'--what-if=FILE'
+'--new-file=FILE'
+'--assume-new=FILE'
+     Pretend that the target FILE has just been modified.  When used
+     with the '-n' flag, this shows you what would happen if you were to
+     modify that file.  Without '-n', it is almost the same as running a
+     'touch' command on the given file before running 'make', except
+     that the modification time is changed only in the imagination of
+     'make'.  *Note Instead of Executing Recipes: Instead of Execution.
+
+'--warn-undefined-variables'
+     Issue a warning message whenever 'make' sees a reference to an
+     undefined variable.  This can be helpful when you are trying to
+     debug makefiles which use variables in complex ways.
+
 \1f
 File: make.info,  Node: Implicit Rules,  Next: Archives,  Prev: Running,  Up: Top
 
@@ -599,6 +931,11 @@ linking with a single 'cc' command.  The optimized rule is used in
 preference to the step-by-step chain because it comes earlier in the
 ordering of rules.
 
+   Finally, for performance reasons 'make' will not consider
+non-terminal match-anything rules (i.e., '%:') when searching for a rule
+to build a prerequisite of an implicit rule (*note Match-Anything
+Rules::).
+
 \1f
 File: make.info,  Node: Pattern Rules,  Next: Last Resort,  Prev: Chained Rules,  Up: Implicit Rules
 
@@ -676,16 +1013,10 @@ pattern.  *Note Last Resort::.
 will choose the "best fit" rule.  *Note How Patterns Match: Pattern
 Match.
 
-   Pattern rules may have more than one target.  Unlike normal rules,
-this does not act as many different rules with the same prerequisites
-and recipe.  If a pattern rule has multiple targets, 'make' knows that
-the rule's recipe is responsible for making all of the targets.  The
-recipe is executed only once to make all the targets.  When searching
-for a pattern rule to match a target, the target patterns of a rule
-other than the one that matches the target in need of a rule are
-incidental: 'make' worries only about giving a recipe and prerequisites
-to the file presently in question.  However, when this file's recipe is
-run, the other targets are marked as having been updated themselves.
+   Pattern rules may have more than one target; however, every target
+must contain a '%' character.  Pattern rules are always treated as
+grouped targets (*note Multiple Targets in a Rule: Multiple Targets.)
+regardless of whether they use the ':' or '&:' separator.
 
 \1f
 File: make.info,  Node: Pattern Examples,  Next: Automatic Variables,  Prev: Pattern Intro,  Up: Pattern Rules
@@ -781,8 +1112,9 @@ prerequisite lists.
 
 '$?'
      The names of all the prerequisites that are newer than the target,
-     with spaces between them.  For prerequisites which are archive
-     members, only the named member is used (*note Archives::).
+     with spaces between them.  If the target does not exist, all
+     prerequisites will be included.  For prerequisites which are
+     archive members, only the named member is used (*note Archives::).
 
 '$^'
      The names of all the prerequisites, with spaces between them.  For
@@ -837,12 +1169,11 @@ files.  This rule copies just the changed object files into the archive:
 names, and three have values that are lists of file names.  These seven
 have variants that get just the file's directory name or just the file
 name within the directory.  The variant variables' names are formed by
-appending 'D' or 'F', respectively.  These variants are semi-obsolete in
-GNU 'make' since the functions 'dir' and 'notdir' can be used to get a
-similar effect (*note Functions for File Names: File Name Functions.).
-Note, however, that the 'D' variants all omit the trailing slash which
-always appears in the output of the 'dir' function.  Here is a table of
-the variants:
+appending 'D' or 'F', respectively.  The functions 'dir' and 'notdir'
+can be used to obtain a similar effect (*note Functions for File Names:
+File Name Functions.).  Note, however, that the 'D' variants all omit
+the trailing slash which always appears in the output of the 'dir'
+function.  Here is a table of the variants:
 
 '$(@D)'
      The directory part of the file name of the target, with the
@@ -1009,10 +1340,10 @@ remade from any other files; therefore, 'make' can save time by not
 looking for ways to remake them.
 
    If you do not mark the match-anything rule as terminal, then it is
-non-terminal.  A non-terminal match-anything rule cannot apply to a file
-name that indicates a specific type of data.  A file name indicates a
-specific type of data if some non-match-anything implicit rule target
-matches it.
+non-terminal.  A non-terminal match-anything rule cannot apply to a
+prerequisite of an implicit rule, or to a file name that indicates a
+specific type of data.  A file name indicates a specific type of data if
+some non-match-anything implicit rule target matches it.
 
    For example, the file name 'foo.c' matches the target for the pattern
 rule '%.c : %.y' (the rule to run Yacc).  Regardless of whether this
@@ -1123,8 +1454,8 @@ with old makefiles.  They come in two kinds: "double-suffix" and
 suffix and the source suffix.  It matches any file whose name ends with
 the target suffix.  The corresponding implicit prerequisite is made by
 replacing the target suffix with the source suffix in the file name.  A
-two-suffix rule whose target and source suffixes are '.o' and '.c' is
-equivalent to the pattern rule '%.o : %.c'.
+two-suffix rule '.c.o' (whose target and source suffixes are '.o' and
+'.c') is equivalent to the pattern rule '%.o : %.c'.
 
    A single-suffix rule is defined by a single suffix, which is the
 source suffix.  It matches any file name, and the corresponding implicit
@@ -1223,8 +1554,9 @@ rule.
      or N.  If the target pattern contains a slash, it is matched
      against T; otherwise, against N.
 
-  3. If any rule in that list is _not_ a match-anything rule, then
-     remove all non-terminal match-anything rules from the list.
+  3. If any rule in that list is _not_ a match-anything rule, or if T is
+     a prerequisite of an implicit rule, then remove all non-terminal
+     match-anything rules from the list.
 
   4. Remove from the list all rules with no recipe.
 
@@ -2139,7 +2471,8 @@ On POSIX systems the jobserver is implemented as a simple UNIX pipe.
 The pipe will be pre-loaded with one single-character token for each
 available job.  To obtain an extra slot you must read a single character
 from the jobserver pipe; to release a slot you must write a single
-character back into the jobserver pipe.
+character back into the jobserver pipe.  Note that the read side of the
+jobserver pipe is set to "blocking" mode.
 
    To access the pipe you must parse the 'MAKEFLAGS' variable and look
 for the argument string '--jobserver-auth=R,W' where 'R' and 'W' are
@@ -2499,7 +2832,7 @@ features.
      (*note Searching Directories for Prerequisites: Directory Search.)
      have their names changed inside recipes.  We feel it is much
      cleaner to always use automatic variables and thus make this
-     feature obsolete.
+     feature unnecessary.
 
    * In some Unix 'make's, the automatic variable '$*' appearing in the
      prerequisites of a rule has the amazingly strange "feature" of
@@ -4100,16 +4433,19 @@ the file and line number containing the problem.
 'multiple target patterns. Stop.'
 'target pattern contains no `%'. Stop.'
 'mixed implicit and static pattern rules. Stop.'
-     These are generated for malformed static pattern rules.  The first
-     means there's no pattern in the target section of the rule; the
-     second means there are multiple patterns in the target section; the
-     third means the target doesn't contain a pattern character ('%');
-     and the fourth means that all three parts of the static pattern
-     rule contain pattern characters ('%')-only the first two parts
-     should.  If you see these errors and you aren't trying to create a
-     static pattern rule, check the value of any variables in your
-     target and prerequisite lists to be sure they do not contain
-     colons.  *Note Syntax of Static Pattern Rules: Static Usage.
+     These errors are generated for malformed static pattern rules
+     (*note Syntax of Static Pattern Rules: Static Usage.).  The first
+     means the target-pattern part of the rule is empty; the second
+     means there are multiple pattern characters ('%') in the
+     target-pattern part; the third means there are no pattern
+     characters in the target-pattern part; and the fourth means that
+     all three parts of the static pattern rule contain pattern
+     characters ('%')-the first part should not contain pattern
+     characters.
+
+     If you see these errors and you aren't trying to create a static
+     pattern rule, check the value of any variables in your target and
+     prerequisite lists to be sure they do not contain colons.
 
 'warning: -jN forced in submake: disabling jobserver mode.'
      This warning and the next are generated if 'make' detects error
@@ -4135,6 +4471,20 @@ the file and line number containing the problem.
      case, the child will generate this warning message and proceed with
      its build in a sequential manner.
 
+'warning: ignoring prerequisites on suffix rule definition'
+     According to POSIX, a suffix rule cannot contain prerequisites.  If
+     a rule that could be a suffix rule has prerequisites it is
+     interpreted as a simple explicit rule, with an odd target name.
+     This requirement is obeyed when POSIX-conforming mode is enabled
+     (the '.POSIX' target is defined).  In versions of GNU 'make' prior
+     to 4.3, no warning was emitted and a suffix rule was created,
+     however all prerequisites were ignored and were not part of the
+     suffix rule.  Starting with GNU 'make' 4.3 the behavior is the
+     same, and in addition this warning is generated.  In a future
+     version the POSIX-conforming behavior will be the only behavior: no
+     rule with a prerequisite can be suffix rule and this warning will
+     be removed.
+
 \1f
 File: make.info,  Node: Complex Makefile,  Next: GNU Free Documentation License,  Prev: Error Messages,  Up: Top
 
@@ -4372,13 +4722,13 @@ distribution kits.
 \1f
 File: make.info,  Node: GNU Free Documentation License,  Next: Concept Index,  Prev: Complex Makefile,  Up: Top
 
-C.1 GNU Free Documentation License
-==================================
+Appendix D GNU Free Documentation License
+*****************************************
 
                      Version 1.3, 3 November 2008
 
      Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-     <http://fsf.org/>
+     <https://fsf.org/>
 
      Everyone is permitted to copy and distribute verbatim copies
      of this license document, but changing it is not allowed.
@@ -4775,7 +5125,7 @@ C.1 GNU Free Documentation License
      the GNU Free Documentation License from time to time.  Such new
      versions will be similar in spirit to the present version, but may
      differ in detail to address new problems or concerns.  See
-     <http://www.gnu.org/copyleft/>.
+     <https://www.gnu.org/copyleft/>.
 
      Each version of the License is given a distinguishing version
      number.  If the Document specifies that a particular numbered
@@ -4861,7 +5211,7 @@ Index of Concepts
 * Menu:
 
 * !=:                                    Setting.             (line   6)
-* !=, expansion:                         Reading Makefiles.   (line  33)
+* !=, expansion:                         Reading Makefiles.   (line  34)
 * # (comments), in makefile:             Makefile Contents.   (line  41)
 * # (comments), in recipes:              Recipe Syntax.       (line  29)
 * #include:                              Automatic Prerequisites.
@@ -4883,21 +5233,21 @@ Index of Concepts
                                                               (line  67)
 * +, and recipes:                        MAKE Variable.       (line  18)
 * +=:                                    Appending.           (line   6)
-* +=, expansion:                         Reading Makefiles.   (line  33)
-* +=, expansion <1>:                     Reading Makefiles.   (line  33)
+* +=, expansion:                         Reading Makefiles.   (line  34)
+* +=, expansion <1>:                     Reading Makefiles.   (line  34)
 * ,v (RCS file extension):               Catalogue of Rules.  (line 163)
 * - (in recipes):                        Errors.              (line  19)
 * -, and define:                         Canned Recipes.      (line  49)
 * --always-make:                         Options Summary.     (line  15)
 * --assume-new:                          Instead of Execution.
                                                               (line  41)
-* --assume-new <1>:                      Options Summary.     (line 284)
+* --assume-new <1>:                      Options Summary.     (line 285)
 * --assume-new, and recursion:           Options/Recursion.   (line  22)
 * --assume-old:                          Avoiding Compilation.
                                                               (line   6)
-* --assume-old <1>:                      Options Summary.     (line 163)
+* --assume-old <1>:                      Options Summary.     (line 164)
 * --assume-old, and recursion:           Options/Recursion.   (line  22)
-* --check-symlink-times:                 Options Summary.     (line 144)
+* --check-symlink-times:                 Options Summary.     (line 145)
 * --debug:                               Options Summary.     (line  43)
 * --directory:                           Recursion.           (line  20)
 * --directory <1>:                       Options Summary.     (line  26)
@@ -4906,77 +5256,77 @@ Index of Concepts
 * --dry-run:                             Echoing.             (line  18)
 * --dry-run <1>:                         Instead of Execution.
                                                               (line  14)
-* --dry-run <2>:                         Options Summary.     (line 154)
+* --dry-run <2>:                         Options Summary.     (line 155)
 * --environment-overrides:               Options Summary.     (line  85)
-* --eval:                                Options Summary.     (line  89)
+* --eval:                                Options Summary.     (line  90)
 * --file:                                Makefile Names.      (line  23)
 * --file <1>:                            Makefile Arguments.  (line   6)
-* --file <2>:                            Options Summary.     (line  97)
+* --file <2>:                            Options Summary.     (line  98)
 * --file, and recursion:                 Options/Recursion.   (line  22)
-* --help:                                Options Summary.     (line 103)
+* --help:                                Options Summary.     (line 104)
 * --ignore-errors:                       Errors.              (line  30)
-* --ignore-errors <1>:                   Options Summary.     (line 108)
+* --ignore-errors <1>:                   Options Summary.     (line 109)
 * --include-dir:                         Include.             (line  53)
-* --include-dir <1>:                     Options Summary.     (line 113)
+* --include-dir <1>:                     Options Summary.     (line 114)
 * --jobs:                                Parallel.            (line   6)
-* --jobs <1>:                            Options Summary.     (line 120)
+* --jobs <1>:                            Options Summary.     (line 121)
 * --jobs, and recursion:                 Options/Recursion.   (line  25)
 * --just-print:                          Echoing.             (line  18)
 * --just-print <1>:                      Instead of Execution.
                                                               (line  14)
-* --just-print <2>:                      Options Summary.     (line 153)
-* --keep-going:                          Errors.              (line  47)
+* --just-print <2>:                      Options Summary.     (line 154)
+* --keep-going:                          Errors.              (line  46)
 * --keep-going <1>:                      Testing.             (line  16)
-* --keep-going <2>:                      Options Summary.     (line 129)
+* --keep-going <2>:                      Options Summary.     (line 130)
 * --load-average:                        Parallel.            (line  35)
-* --load-average <1>:                    Options Summary.     (line 136)
+* --load-average <1>:                    Options Summary.     (line 137)
 * --makefile:                            Makefile Names.      (line  23)
 * --makefile <1>:                        Makefile Arguments.  (line   6)
-* --makefile <2>:                        Options Summary.     (line  98)
+* --makefile <2>:                        Options Summary.     (line  99)
 * --max-load:                            Parallel.            (line  35)
-* --max-load <1>:                        Options Summary.     (line 137)
+* --max-load <1>:                        Options Summary.     (line 138)
 * --new-file:                            Instead of Execution.
                                                               (line  41)
-* --new-file <1>:                        Options Summary.     (line 283)
+* --new-file <1>:                        Options Summary.     (line 284)
 * --new-file, and recursion:             Options/Recursion.   (line  22)
-* --no-builtin-rules:                    Options Summary.     (line 209)
-* --no-builtin-variables:                Options Summary.     (line 222)
-* --no-keep-going:                       Options Summary.     (line 238)
+* --no-builtin-rules:                    Options Summary.     (line 210)
+* --no-builtin-variables:                Options Summary.     (line 223)
+* --no-keep-going:                       Options Summary.     (line 239)
 * --no-print-directory:                  -w Option.           (line  20)
-* --no-print-directory <1>:              Options Summary.     (line 275)
+* --no-print-directory <1>:              Options Summary.     (line 276)
 * --old-file:                            Avoiding Compilation.
                                                               (line   6)
-* --old-file <1>:                        Options Summary.     (line 162)
+* --old-file <1>:                        Options Summary.     (line 163)
 * --old-file, and recursion:             Options/Recursion.   (line  22)
 * --output-sync:                         Parallel Output.     (line  11)
-* --output-sync <1>:                     Options Summary.     (line 171)
-* --print-data-base:                     Options Summary.     (line 187)
-* --print-directory:                     Options Summary.     (line 267)
+* --output-sync <1>:                     Options Summary.     (line 172)
+* --print-data-base:                     Options Summary.     (line 188)
+* --print-directory:                     Options Summary.     (line 268)
 * --print-directory, and --directory:    -w Option.           (line  20)
 * --print-directory, and recursion:      -w Option.           (line  20)
 * --print-directory, disabling:          -w Option.           (line  20)
 * --question:                            Instead of Execution.
                                                               (line  32)
-* --question <1>:                        Options Summary.     (line 201)
+* --question <1>:                        Options Summary.     (line 202)
 * --quiet:                               Echoing.             (line  24)
-* --quiet <1>:                           Options Summary.     (line 232)
+* --quiet <1>:                           Options Summary.     (line 233)
 * --recon:                               Echoing.             (line  18)
 * --recon <1>:                           Instead of Execution.
                                                               (line  14)
-* --recon <2>:                           Options Summary.     (line 155)
+* --recon <2>:                           Options Summary.     (line 156)
 * --silent:                              Echoing.             (line  24)
-* --silent <1>:                          Options Summary.     (line 231)
-* --stop:                                Options Summary.     (line 239)
+* --silent <1>:                          Options Summary.     (line 232)
+* --stop:                                Options Summary.     (line 240)
 * --touch:                               Instead of Execution.
                                                               (line  24)
-* --touch <1>:                           Options Summary.     (line 247)
+* --touch <1>:                           Options Summary.     (line 248)
 * --touch, and recursion:                MAKE Variable.       (line  35)
-* --trace:                               Options Summary.     (line 254)
-* --version:                             Options Summary.     (line 262)
-* --warn-undefined-variables:            Options Summary.     (line 292)
+* --trace:                               Options Summary.     (line 255)
+* --version:                             Options Summary.     (line 263)
+* --warn-undefined-variables:            Options Summary.     (line 293)
 * --what-if:                             Instead of Execution.
                                                               (line  41)
-* --what-if <1>:                         Options Summary.     (line 282)
+* --what-if <1>:                         Options Summary.     (line 283)
 * -b:                                    Options Summary.     (line   9)
 * -B:                                    Options Summary.     (line  14)
 * -C:                                    Recursion.           (line  20)
@@ -4985,26 +5335,27 @@ Index of Concepts
 * -C, and recursion:                     Options/Recursion.   (line  22)
 * -d:                                    Options Summary.     (line  33)
 * -e:                                    Options Summary.     (line  84)
+* -E:                                    Options Summary.     (line  89)
 * -e (shell flag):                       Automatic Prerequisites.
                                                               (line  65)
 * -f:                                    Makefile Names.      (line  23)
 * -f <1>:                                Makefile Arguments.  (line   6)
-* -f <2>:                                Options Summary.     (line  96)
+* -f <2>:                                Options Summary.     (line  97)
 * -f, and recursion:                     Options/Recursion.   (line  22)
-* -h:                                    Options Summary.     (line 102)
+* -h:                                    Options Summary.     (line 103)
 * -I:                                    Include.             (line  53)
 * -i:                                    Errors.              (line  30)
-* -i <1>:                                Options Summary.     (line 107)
-* -I <1>:                                Options Summary.     (line 112)
+* -i <1>:                                Options Summary.     (line 108)
+* -I <1>:                                Options Summary.     (line 113)
 * -j:                                    Parallel.            (line   6)
-* -j <1>:                                Options Summary.     (line 119)
+* -j <1>:                                Options Summary.     (line 120)
 * -j, and archive update:                Archive Pitfalls.    (line   6)
 * -j, and recursion:                     Options/Recursion.   (line  25)
-* -k:                                    Errors.              (line  47)
+* -k:                                    Errors.              (line  46)
 * -k <1>:                                Testing.             (line  16)
-* -k <2>:                                Options Summary.     (line 128)
-* -l:                                    Options Summary.     (line 135)
-* -L:                                    Options Summary.     (line 143)
+* -k <2>:                                Options Summary.     (line 129)
+* -l:                                    Options Summary.     (line 136)
+* -L:                                    Options Summary.     (line 144)
 * -l (library search):                   Libraries/Search.    (line   6)
 * -l (load average):                     Parallel.            (line  35)
 * -m:                                    Options Summary.     (line  10)
@@ -5015,31 +5366,31 @@ Index of Concepts
 * -n:                                    Echoing.             (line  18)
 * -n <1>:                                Instead of Execution.
                                                               (line  14)
-* -n <2>:                                Options Summary.     (line 152)
+* -n <2>:                                Options Summary.     (line 153)
 * -O:                                    Parallel Output.     (line  11)
 * -o:                                    Avoiding Compilation.
                                                               (line   6)
-* -o <1>:                                Options Summary.     (line 161)
-* -O <1>:                                Options Summary.     (line 170)
+* -o <1>:                                Options Summary.     (line 162)
+* -O <1>:                                Options Summary.     (line 171)
 * -o, and recursion:                     Options/Recursion.   (line  22)
-* -p:                                    Options Summary.     (line 186)
+* -p:                                    Options Summary.     (line 187)
 * -q:                                    Instead of Execution.
                                                               (line  32)
-* -q <1>:                                Options Summary.     (line 200)
-* -r:                                    Options Summary.     (line 208)
-* -R:                                    Options Summary.     (line 221)
+* -q <1>:                                Options Summary.     (line 201)
+* -r:                                    Options Summary.     (line 209)
+* -R:                                    Options Summary.     (line 222)
 * -s:                                    Echoing.             (line  24)
-* -s <1>:                                Options Summary.     (line 230)
-* -S:                                    Options Summary.     (line 237)
+* -s <1>:                                Options Summary.     (line 231)
+* -S:                                    Options Summary.     (line 238)
 * -t:                                    Instead of Execution.
                                                               (line  24)
-* -t <1>:                                Options Summary.     (line 246)
+* -t <1>:                                Options Summary.     (line 247)
 * -t, and recursion:                     MAKE Variable.       (line  35)
-* -v:                                    Options Summary.     (line 261)
+* -v:                                    Options Summary.     (line 262)
 * -W:                                    Instead of Execution.
                                                               (line  41)
-* -w:                                    Options Summary.     (line 266)
-* -W <1>:                                Options Summary.     (line 281)
+* -w:                                    Options Summary.     (line 267)
+* -W <1>:                                Options Summary.     (line 282)
 * -w, and -C:                            -w Option.           (line  20)
 * -W, and recursion:                     Options/Recursion.   (line  22)
 * -w, and recursion:                     -w Option.           (line  20)
@@ -5087,11 +5438,11 @@ Index of Concepts
 * := <1>:                                Setting.             (line   6)
 * =:                                     Flavors.             (line  10)
 * = <1>:                                 Setting.             (line   6)
-* =, expansion:                          Reading Makefiles.   (line  33)
+* =, expansion:                          Reading Makefiles.   (line  34)
 * ? (wildcard character):                Wildcards.           (line   6)
 * ?=:                                    Flavors.             (line 135)
 * ?= <1>:                                Setting.             (line   6)
-* ?=, expansion:                         Reading Makefiles.   (line  33)
+* ?=, expansion:                         Reading Makefiles.   (line  34)
 * @ (in recipes):                        Echoing.             (line   6)
 * @, and define:                         Canned Recipes.      (line  49)
 * [...] (wildcard characters):           Wildcards.           (line   6)
@@ -5184,16 +5535,16 @@ Index of Concepts
 * ctangle <1>:                           Implicit Variables.  (line 103)
 * cweave:                                Catalogue of Rules.  (line 149)
 * cweave <1>:                            Implicit Variables.  (line  97)
-* data base of make rules:               Options Summary.     (line 187)
+* data base of make rules:               Options Summary.     (line 188)
 * deducing recipes (implicit rules):     make Deduces.        (line   6)
 * default directories for included makefiles: Include.        (line  53)
 * default goal:                          How Make Works.      (line  11)
 * default goal <1>:                      Rules.               (line  11)
 * default makefile name:                 Makefile Names.      (line   6)
 * default rules, last-resort:            Last Resort.         (line   6)
-* define, expansion:                     Reading Makefiles.   (line  33)
+* define, expansion:                     Reading Makefiles.   (line  34)
 * defining variables verbatim:           Multi-Line.          (line   6)
-* deletion of target files:              Errors.              (line  64)
+* deletion of target files:              Errors.              (line  63)
 * deletion of target files <1>:          Interrupts.          (line   6)
 * directive:                             Makefile Contents.   (line  28)
 * directories, creating installation:    Directory Variables. (line  20)
@@ -5220,7 +5571,7 @@ Index of Concepts
 * E2BIG:                                 Options/Recursion.   (line  58)
 * echoing of recipes:                    Echoing.             (line   6)
 * editor:                                Introduction.        (line  22)
-* Emacs (M-x compile):                   Errors.              (line  62)
+* Emacs (M-x compile):                   Errors.              (line  61)
 * empty recipes:                         Empty Recipes.       (line   6)
 * empty targets:                         Empty Targets.       (line   6)
 * environment:                           Environment.         (line   6)
@@ -5242,7 +5593,7 @@ Index of Concepts
 * exit status of make:                   Running.             (line  18)
 * expansion, secondary:                  Secondary Expansion. (line   6)
 * explicit rule, definition of:          Makefile Contents.   (line  10)
-* explicit rule, expansion:              Reading Makefiles.   (line  92)
+* explicit rule, expansion:              Reading Makefiles.   (line  93)
 * explicit rules, secondary expansion of: Secondary Expansion.
                                                               (line 104)
 * exporting variables:                   Variables/Recursion. (line   6)
@@ -5306,21 +5657,22 @@ Index of Concepts
 * goal, default:                         How Make Works.      (line  11)
 * goal, default <1>:                     Rules.               (line  11)
 * goal, how to specify:                  Goals.               (line   6)
+* grouped targets:                       Multiple Targets.    (line  61)
 * Guile:                                 Guile Function.      (line   6)
 * Guile <1>:                             Guile Integration.   (line   6)
 * Guile example:                         Guile Example.       (line   6)
 * guile, conversion of types:            Guile Types.         (line   6)
 * home directory:                        Wildcards.           (line  11)
 * IEEE Standard 1003.2:                  Overview.            (line  13)
-* ifdef, expansion:                      Reading Makefiles.   (line  82)
-* ifeq, expansion:                       Reading Makefiles.   (line  82)
-* ifndef, expansion:                     Reading Makefiles.   (line  82)
-* ifneq, expansion:                      Reading Makefiles.   (line  82)
+* ifdef, expansion:                      Reading Makefiles.   (line  83)
+* ifeq, expansion:                       Reading Makefiles.   (line  83)
+* ifndef, expansion:                     Reading Makefiles.   (line  83)
+* ifneq, expansion:                      Reading Makefiles.   (line  83)
 * implicit rule:                         Implicit Rules.      (line   6)
 * implicit rule, and directory search:   Implicit/Search.     (line   6)
 * implicit rule, and VPATH:              Implicit/Search.     (line   6)
 * implicit rule, definition of:          Makefile Contents.   (line  16)
-* implicit rule, expansion:              Reading Makefiles.   (line  92)
+* implicit rule, expansion:              Reading Makefiles.   (line  93)
 * implicit rule, how to use:             Using Implicit.      (line   6)
 * implicit rule, introduction to:        make Deduces.        (line   6)
 * implicit rule, predefined:             Catalogue of Rules.  (line   6)
@@ -5333,6 +5685,7 @@ Index of Concepts
 * including (MAKEFILE_LIST variable):    Special Variables.   (line   8)
 * including other makefiles:             Include.             (line   6)
 * incompatibilities:                     Missing.             (line   6)
+* independent targets:                   Multiple Targets.    (line  14)
 * Info, rule to format:                  Catalogue of Rules.  (line 156)
 * inheritance, suppressing:              Suppressing Inheritance.
                                                               (line   6)
@@ -5369,8 +5722,8 @@ Index of Concepts
 * lint:                                  Catalogue of Rules.  (line 143)
 * lint <1>:                              Implicit Variables.  (line  80)
 * lint, rule to run:                     Catalogue of Rules.  (line 143)
-* list of all prerequisites:             Automatic Variables. (line  61)
-* list of changed prerequisites:         Automatic Variables. (line  51)
+* list of all prerequisites:             Automatic Variables. (line  62)
+* list of changed prerequisites:         Automatic Variables. (line  52)
 * load average:                          Parallel.            (line  35)
 * load directive:                        load Directive.      (line   6)
 * loaded object API:                     Loaded Object API.   (line   6)
@@ -5406,11 +5759,12 @@ Index of Concepts
 * makefile, including:                   Include.             (line   6)
 * makefile, overriding:                  Overriding Makefiles.
                                                               (line   6)
-* makefile, parsing:                     Reading Makefiles.   (line   6)
+* makefile, reading:                     Reading Makefiles.   (line   6)
 * makefile, remaking of:                 Remaking Makefiles.  (line   6)
 * makefile, simple:                      Simple Makefile.     (line   6)
 * makefiles, and MAKEFILE_LIST variable: Special Variables.   (line   8)
 * makefiles, and special variables:      Special Variables.   (line   6)
+* makefiles, parsing:                    Parsing Makefiles.   (line   6)
 * makeinfo:                              Catalogue of Rules.  (line 156)
 * makeinfo <1>:                          Implicit Variables.  (line  84)
 * match-anything rule:                   Match-Anything Rules.
@@ -5426,7 +5780,7 @@ Index of Concepts
 * multiple rules for one target:         Multiple Rules.      (line   6)
 * multiple rules for one target (::):    Double-Colon.        (line   6)
 * multiple targets:                      Multiple Targets.    (line   6)
-* multiple targets, in pattern rule:     Pattern Intro.       (line  53)
+* multiple targets, in pattern rule:     Pattern Intro.       (line  44)
 * name of makefile:                      Makefile Names.      (line   6)
 * name of makefile, how to specify:      Makefile Names.      (line  31)
 * nested variable reference:             Computed Names.      (line   6)
@@ -5451,7 +5805,7 @@ Index of Concepts
 * order-only prerequisites:              Prerequisite Types.  (line   6)
 * origin of variable:                    Origin Function.     (line   6)
 * output during parallel execution:      Parallel Output.     (line   6)
-* output during parallel execution <1>:  Options Summary.     (line 171)
+* output during parallel execution <1>:  Options Summary.     (line 172)
 * overriding makefiles:                  Overriding Makefiles.
                                                               (line   6)
 * overriding variables with arguments:   Overriding.          (line   6)
@@ -5460,13 +5814,14 @@ Index of Concepts
 * parallel execution, and archive update: Archive Pitfalls.   (line   6)
 * parallel execution, input during:      Parallel Input.      (line   6)
 * parallel execution, output during:     Parallel Output.     (line   6)
-* parallel execution, output during <1>: Options Summary.     (line 171)
-* parallel execution, overriding:        Special Targets.     (line 142)
+* parallel execution, output during <1>: Options Summary.     (line 172)
+* parallel execution, overriding:        Special Targets.     (line 141)
 * parallel output to terminal:           Terminal Output.     (line   6)
+* parsing makefiles:                     Parsing Makefiles.   (line   6)
 * parts of makefile rule:                Rule Introduction.   (line   6)
 * Pascal, rule to compile:               Catalogue of Rules.  (line  45)
 * pattern rule:                          Pattern Intro.       (line   6)
-* pattern rule, expansion:               Reading Makefiles.   (line  92)
+* pattern rule, expansion:               Reading Makefiles.   (line  93)
 * pattern rules, order of:               Pattern Match.       (line  30)
 * pattern rules, static (not implicit):  Static Pattern.      (line   6)
 * pattern rules, static, syntax of:      Static Usage.        (line   6)
@@ -5481,19 +5836,19 @@ Index of Concepts
 * portability:                           Features.            (line   6)
 * POSIX:                                 Overview.            (line  13)
 * POSIX <1>:                             Options/Recursion.   (line  61)
-* POSIX-conforming mode, setting:        Special Targets.     (line 157)
+* POSIX-conforming mode, setting:        Special Targets.     (line 156)
 * post-installation commands:            Install Command Categories.
                                                               (line   6)
 * pre-installation commands:             Install Command Categories.
                                                               (line   6)
 * precious targets:                      Special Targets.     (line  32)
-* predefined rules and variables, printing: Options Summary.  (line 187)
+* predefined rules and variables, printing: Options Summary.  (line 188)
 * prefix, adding:                        File Name Functions. (line  78)
 * prerequisite:                          Rules.               (line   6)
 * prerequisite pattern, implicit:        Pattern Intro.       (line  22)
 * prerequisite pattern, static (not implicit): Static Usage.  (line  30)
 * prerequisite types:                    Prerequisite Types.  (line   6)
-* prerequisite, expansion:               Reading Makefiles.   (line  92)
+* prerequisite, expansion:               Reading Makefiles.   (line  93)
 * prerequisites:                         Rule Syntax.         (line  47)
 * prerequisites, and automatic variables: Automatic Variables.
                                                               (line  17)
@@ -5501,8 +5856,8 @@ Index of Concepts
 * prerequisites, automatic generation <1>: Automatic Prerequisites.
                                                               (line   6)
 * prerequisites, introduction to:        Rule Introduction.   (line   8)
-* prerequisites, list of all:            Automatic Variables. (line  61)
-* prerequisites, list of changed:        Automatic Variables. (line  51)
+* prerequisites, list of all:            Automatic Variables. (line  62)
+* prerequisites, list of changed:        Automatic Variables. (line  52)
 * prerequisites, normal:                 Prerequisite Types.  (line   6)
 * prerequisites, order-only:             Prerequisite Types.  (line   6)
 * prerequisites, varying (static pattern): Static Pattern.    (line   6)
@@ -5538,7 +5893,7 @@ Index of Concepts
 * realclean (standard target):           Goals.               (line  86)
 * realpath:                              File Name Functions. (line 113)
 * recipe:                                Simple Makefile.     (line  74)
-* recipe execution, single invocation:   Special Targets.     (line 150)
+* recipe execution, single invocation:   Special Targets.     (line 149)
 * recipe lines, single shell:            One Shell.           (line   6)
 * recipe syntax:                         Recipe Syntax.       (line   6)
 * recipe, execution:                     Execution.           (line   6)
@@ -5594,10 +5949,11 @@ Index of Concepts
 * remaking loaded objects:               Remaking Loaded Objects.
                                                               (line   6)
 * remaking makefiles:                    Remaking Makefiles.  (line   6)
-* removal of target files:               Errors.              (line  64)
+* removal of target files:               Errors.              (line  63)
 * removal of target files <1>:           Interrupts.          (line   6)
 * removing duplicate words:              Text Functions.      (line 155)
 * removing targets on failure:           Special Targets.     (line  71)
+* removing whitespace from split lines:  Splitting Lines.     (line  40)
 * removing, to clean up:                 Cleanup.             (line   6)
 * reporting bugs:                        Bugs.                (line   6)
 * rm:                                    Implicit Variables.  (line 106)
@@ -5697,7 +6053,7 @@ Index of Concepts
 * stem:                                  Static Usage.        (line  17)
 * stem <1>:                              Pattern Match.       (line   6)
 * stem, shortest:                        Pattern Match.       (line  38)
-* stem, variable for:                    Automatic Variables. (line  77)
+* stem, variable for:                    Automatic Variables. (line  78)
 * stopping make:                         Make Control Functions.
                                                               (line  11)
 * strings, searching for:                Text Functions.      (line 104)
@@ -5726,10 +6082,10 @@ Index of Concepts
 * target:                                Rules.               (line   6)
 * target pattern, implicit:              Pattern Intro.       (line   9)
 * target pattern, static (not implicit): Static Usage.        (line  17)
-* target, deleting on error:             Errors.              (line  64)
+* target, deleting on error:             Errors.              (line  63)
 * target, deleting on interrupt:         Interrupts.          (line   6)
-* target, expansion:                     Reading Makefiles.   (line  92)
-* target, multiple in pattern rule:      Pattern Intro.       (line  53)
+* target, expansion:                     Reading Makefiles.   (line  93)
+* target, multiple in pattern rule:      Pattern Intro.       (line  44)
 * target, multiple rules for one:        Multiple Rules.      (line   6)
 * target, touching:                      Instead of Execution.
                                                               (line  24)
@@ -5739,6 +6095,8 @@ Index of Concepts
 * targets, built-in special:             Special Targets.     (line   6)
 * targets, empty:                        Empty Targets.       (line   6)
 * targets, force:                        Force Targets.       (line   6)
+* targets, grouped:                      Multiple Targets.    (line  61)
+* targets, independent:                  Multiple Targets.    (line  14)
 * targets, introduction to:              Rule Introduction.   (line   8)
 * targets, multiple:                     Multiple Targets.    (line   6)
 * targets, phony:                        Phony Targets.       (line   6)
@@ -5762,7 +6120,7 @@ Index of Concepts
 * traditional directory search (GPATH):  Search Algorithm.    (line  42)
 * types of prerequisites:                Prerequisite Types.  (line   6)
 * types, conversion of:                  Guile Types.         (line   6)
-* undefined variables, warning message:  Options Summary.     (line 292)
+* undefined variables, warning message:  Options Summary.     (line 293)
 * undefining variable:                   Undefine Directive.  (line   6)
 * updating archive symbol directories:   Archive Symbols.     (line   6)
 * updating loaded objects:               Remaking Loaded Objects.
@@ -5808,7 +6166,7 @@ Index of Concepts
 * variables, substitution reference:     Substitution Refs.   (line   6)
 * variables, target-specific:            Target-specific.     (line   6)
 * variables, unexpanded value:           Value Function.      (line   6)
-* variables, warning for undefined:      Options Summary.     (line 292)
+* variables, warning for undefined:      Options Summary.     (line 293)
 * varying prerequisites:                 Static Pattern.      (line   6)
 * verbatim variable definition:          Multi-Line.          (line   6)
 * vpath:                                 Directory Search.    (line   6)
@@ -5821,6 +6179,7 @@ Index of Concepts
 * Web, rule to run:                      Catalogue of Rules.  (line 149)
 * what if:                               Instead of Execution.
                                                               (line  41)
+* whitespace, avoiding on line split:    Splitting Lines.     (line  40)
 * whitespace, in variable values:        Flavors.             (line 107)
 * whitespace, stripping:                 Text Functions.      (line  80)
 * wildcard:                              Wildcards.           (line   6)
@@ -5873,22 +6232,22 @@ Index of Functions, Variables, & Directives
 * $(@F):                                 Automatic Variables. (line 119)
 * $(^D):                                 Automatic Variables. (line 142)
 * $(^F):                                 Automatic Variables. (line 143)
-* $*:                                    Automatic Variables. (line  73)
+* $*:                                    Automatic Variables. (line  74)
 * $*, and static pattern:                Static Usage.        (line  82)
-* $+:                                    Automatic Variables. (line  63)
+* $+:                                    Automatic Variables. (line  64)
 * $<:                                    Automatic Variables. (line  43)
 * $?:                                    Automatic Variables. (line  48)
 * $@:                                    Automatic Variables. (line  30)
-* $^:                                    Automatic Variables. (line  53)
-* $|:                                    Automatic Variables. (line  69)
+* $^:                                    Automatic Variables. (line  54)
+* $|:                                    Automatic Variables. (line  70)
 * % (automatic variable):                Automatic Variables. (line  37)
 * %D (automatic variable):               Automatic Variables. (line 129)
 * %F (automatic variable):               Automatic Variables. (line 130)
-* * (automatic variable):                Automatic Variables. (line  73)
+* * (automatic variable):                Automatic Variables. (line  74)
 * * (automatic variable), unsupported bizarre usage: Missing. (line  44)
 * *D (automatic variable):               Automatic Variables. (line 124)
 * *F (automatic variable):               Automatic Variables. (line 125)
-* + (automatic variable):                Automatic Variables. (line  63)
+* + (automatic variable):                Automatic Variables. (line  64)
 * +D (automatic variable):               Automatic Variables. (line 147)
 * +F (automatic variable):               Automatic Variables. (line 148)
 * -load:                                 load Directive.      (line  65)
@@ -5897,9 +6256,11 @@ Index of Functions, Variables, & Directives
 * .DEFAULT, and empty recipes:           Empty Recipes.       (line  16)
 * .DEFAULT_GOAL (define default goal):   Special Variables.   (line  34)
 * .DELETE_ON_ERROR:                      Special Targets.     (line  70)
-* .DELETE_ON_ERROR <1>:                  Errors.              (line  64)
-* .EXPORT_ALL_VARIABLES:                 Special Targets.     (line 135)
+* .DELETE_ON_ERROR <1>:                  Errors.              (line  63)
+* .EXPORT_ALL_VARIABLES:                 Special Targets.     (line 134)
 * .EXPORT_ALL_VARIABLES <1>:             Variables/Recursion. (line  99)
+* .EXTRA_PREREQS (prerequisites not added to automatic variables): Special Variables.
+                                                              (line 178)
 * .FEATURES (list of supported features): Special Variables.  (line 121)
 * .IGNORE:                               Special Targets.     (line  77)
 * .IGNORE <1>:                           Errors.              (line  30)
@@ -5909,12 +6270,12 @@ Index of Functions, Variables, & Directives
 * .LIBPATTERNS:                          Libraries/Search.    (line   6)
 * .LOADED:                               load Directive.      (line  62)
 * .LOW_RESOLUTION_TIME:                  Special Targets.     (line  90)
-* .NOTPARALLEL:                          Special Targets.     (line 141)
-* .ONESHELL:                             Special Targets.     (line 149)
+* .NOTPARALLEL:                          Special Targets.     (line 140)
+* .ONESHELL:                             Special Targets.     (line 148)
 * .ONESHELL <1>:                         One Shell.           (line   6)
 * .PHONY:                                Phony Targets.       (line  22)
 * .PHONY <1>:                            Special Targets.     (line   8)
-* .POSIX:                                Special Targets.     (line 156)
+* .POSIX:                                Special Targets.     (line 155)
 * .POSIX <1>:                            Options/Recursion.   (line  61)
 * .PRECIOUS:                             Special Targets.     (line  31)
 * .PRECIOUS <1>:                         Interrupts.          (line  22)
@@ -5943,10 +6304,10 @@ Index of Functions, Variables, & Directives
 * @ (automatic variable):                Automatic Variables. (line  30)
 * @D (automatic variable):               Automatic Variables. (line 113)
 * @F (automatic variable):               Automatic Variables. (line 119)
-* ^ (automatic variable):                Automatic Variables. (line  53)
+* ^ (automatic variable):                Automatic Variables. (line  54)
 * ^D (automatic variable):               Automatic Variables. (line 142)
 * ^F (automatic variable):               Automatic Variables. (line 143)
-* | (automatic variable):                Automatic Variables. (line  69)
+* | (automatic variable):                Automatic Variables. (line  70)
 * abspath:                               File Name Functions. (line 120)
 * addprefix:                             File Name Functions. (line  78)
 * addsuffix:                             File Name Functions. (line  67)
@@ -6075,7 +6436,7 @@ Index of Functions, Variables, & Directives
 * SHELL (recipe execution):              Execution.           (line   6)
 * sort:                                  Text Functions.      (line 147)
 * strip:                                 Text Functions.      (line  80)
-* subst:                                 Multiple Targets.    (line  28)
+* subst:                                 Multiple Targets.    (line  39)
 * subst <1>:                             Text Functions.      (line   9)
 * suffix:                                File Name Functions. (line  42)
 * SUFFIXES:                              Suffix Rules.        (line  81)
index 01bcec72cc879c1fcad8bd5b3cc105e18874aa1d..733c0b962de4f335db4edfa1a6900ccd6053586c 100644 (file)
@@ -3,7 +3,7 @@
 @setfilename make.info
 
 @include version.texi
-@set EDITION 0.74
+@set EDITION 0.75
 
 @settitle GNU @code{make}
 @setchapternewpage odd
@@ -26,8 +26,8 @@ of @cite{The GNU Make Manual}, for GNU @code{make} version @value{VERSION}.
 
 Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007,
-2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free Software
-Foundation, Inc.
+2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
+2020 Free Software Foundation, Inc.
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
@@ -143,7 +143,8 @@ Writing Makefiles
 * Remaking Makefiles::          How makefiles get remade.
 * Overriding Makefiles::        How to override part of one makefile
                                   with another makefile.
-* Reading Makefiles::           How makefiles are parsed.
+* Reading Makefiles::           How makefiles are read in.
+* Parsing Makefiles::           How makefiles are parsed.
 * Secondary Expansion::         How and when secondary expansion is performed.
 
 What Makefiles Contain
@@ -988,7 +989,8 @@ reading a data base called the @dfn{makefile}.
 * Remaking Makefiles::          How makefiles get remade.
 * Overriding Makefiles::        How to override part of one makefile
                                   with another makefile.
-* Reading Makefiles::           How makefiles are parsed.
+* Reading Makefiles::           How makefiles are read in.
+* Parsing Makefiles::           How makefiles are parsed.
 * Secondary Expansion::         How and when secondary expansion is performed.
 @end menu
 
@@ -1113,6 +1115,36 @@ handling is modified slightly to conform to POSIX.2: first, whitespace
 preceding a backslash is not removed and second, consecutive
 backslash/newlines are not condensed.
 
+@subsubheading Splitting Without Adding Whitespace
+@cindex whitespace, avoiding on line split
+@cindex removing whitespace from split lines
+
+If you need to split a line but do @emph{not} want any whitespace
+added, you can utilize a subtle trick: replace your backslash/newline
+pairs with the three characters dollar sign/backslash/newline:
+
+@example
+var := one$\
+       word
+@end example
+
+After @code{make} removes the backslash/newline and condenses the
+following line into a single space, this is equivalent to:
+
+@example
+var := one$ word
+@end example
+
+Then @code{make} will perform variable expansion.  The variable
+reference @samp{$ } refers to a variable with the one-character name
+`` '' (space) which does not exist, and so expands to the empty
+string, giving a final assignment which is the equivalent of:
+
+@example
+var := oneword
+@end example
+
+
 @node Makefile Names, Include, Makefile Contents, Makefiles
 @section What Name to Give Your Makefile
 @cindex makefile name
@@ -1313,7 +1345,7 @@ Sometimes makefiles can be remade from other files, such as RCS or SCCS
 files.  If a makefile can be remade from other files, you probably want
 @code{make} to get an up-to-date version of the makefile to read in.
 
-To this end, after reading in all makefiles, @code{make} will consider
+To this end, after reading in all makefiles @code{make} will consider
 each as a goal target and attempt to update it.  If a makefile has a
 rule which says how to update it (found either in that very makefile or
 in another one) or if an implicit rule applies to it (@pxref{Implicit
@@ -1322,7 +1354,8 @@ all makefiles have been checked, if any have actually been changed,
 @code{make} starts with a clean slate and reads all the makefiles over
 again.  (It will also attempt to update each of them over again, but
 normally this will not change them again, since they are already up to
-date.)@refill
+date.)  Each restart will cause the special variable
+@code{MAKE_RESTARTS} to be updated (@pxref{Special Variables}).@refill
 
 If you know that one or more of your makefiles cannot be remade and
 you want to keep @code{make} from performing an implicit rule search
@@ -1431,30 +1464,32 @@ empty recipe to prevent @code{make} from searching for an implicit rule to
 build it---otherwise it would apply the same match-anything rule to
 @file{force} itself and create a prerequisite loop!
 
-@node Reading Makefiles,  Secondary Expansion, Overriding Makefiles, Makefiles
+@node Reading Makefiles, Parsing Makefiles, Overriding Makefiles, Makefiles
 @section How @code{make} Reads a Makefile
 @cindex reading makefiles
-@cindex makefile, parsing
+@cindex makefile, reading
 
-GNU @code{make} does its work in two distinct phases.  During the first
-phase it reads all the makefiles, included makefiles, etc. and
-internalizes all the variables and their values, implicit and explicit
-rules, and constructs a dependency graph of all the targets and their
-prerequisites.  During the second phase, @code{make} uses these internal
-structures to determine what targets will need to be rebuilt and to
-invoke the rules necessary to do so.
+GNU @code{make} does its work in two distinct phases.  During the
+first phase it reads all the makefiles, included makefiles, etc. and
+internalizes all the variables and their values and implicit and
+explicit rules, and builds a dependency graph of all the targets and
+their prerequisites.  During the second phase, @code{make} uses this
+internalized data to determine which targets need to be updated and
+run the recipes necessary to update them.
 
 It's important to understand this two-phase approach because it has a
 direct impact on how variable and function expansion happens; this is
-often a source of some confusion when writing makefiles.  Here we will
-present a summary of the phases in which expansion happens for different
-constructs within the makefile.  We say that expansion is
-@dfn{immediate} if it happens during the first phase: in this case
-@code{make} will expand any variables or functions in that section of a
-construct as the makefile is parsed.  We say that expansion is
-@dfn{deferred} if expansion is not performed immediately.  Expansion of
-a deferred construct is not performed until either the construct appears
-later in an immediate context, or until the second phase.
+often a source of some confusion when writing makefiles.  Below is a
+summary of the different constructs that can be found in a makefile,
+and the phase in which expansion happens for each part of the
+construct.
+
+We say that expansion is @dfn{immediate} if it happens during the
+first phase: @code{make} will expand that part of the construct as the
+makefile is parsed.  We say that expansion is @dfn{deferred} if it is
+not immediate.  Expansion of a deferred construct part is delayed
+until the expansion is used: either when it is referenced in an
+immediate context, or when it is needed during the second phase.
 
 You may not be familiar with some of these constructs yet.  You can
 reference this section as you become familiar with them, in later
@@ -1507,14 +1542,14 @@ define @var{immediate} !=
 endef
 @end example
 
-For the append operator, @samp{+=}, the right-hand side is considered
+For the append operator @samp{+=}, the right-hand side is considered
 immediate if the variable was previously set as a simple variable
 (@samp{:=} or @samp{::=}), and deferred otherwise.
 
-For the shell assignment operator, @samp{!=}, the right-hand side is
-evaluated immediately and handed to the shell.  The result is stored in the
-variable named on the left, and that variable becomes a simple variable
-(and will thus be re-evaluated on each reference).
+For the shell assignment operator @samp{!=}, the right-hand side is
+evaluated immediately and handed to the shell.  The result is stored
+in the variable named on the left, and that variable becomes a simple
+variable (and will thus be re-evaluated on each reference).
 
 @subheading Conditional Directives
 @cindex ifdef, expansion
@@ -1543,23 +1578,89 @@ A rule is always expanded the same way, regardless of the form:
         @var{deferred}
 @end example
 
-That is, the target and prerequisite sections are expanded immediately,
-and the recipe used to construct the target is always deferred.  This
-general rule is true for explicit rules, pattern rules, suffix rules,
-static pattern rules, and simple prerequisite definitions.
+That is, the target and prerequisite sections are expanded
+immediately, and the recipe used to build the target is always
+deferred.  This is true for explicit rules, pattern rules, suffix
+rules, static pattern rules, and simple prerequisite definitions.
+
+@node Parsing Makefiles, Secondary Expansion, Reading Makefiles, Makefiles
+@section How Makefiles Are Parsed
+@cindex parsing makefiles
+@cindex makefiles, parsing
+
+GNU @code{make} parses makefiles line-by-line.  Parsing proceeds using
+the following steps:
+
+@enumerate
+@item
+Read in a full logical line, including backslash-escaped lines
+(@pxref{Splitting Lines, , Splitting Long Lines}).
+
+@item
+Remove comments (@pxref{Makefile Contents, , What Makefiles Contain}).
+
+@item
+If the line begins with the recipe prefix character and we are in a
+rule context, add the line to the current recipe and read the next
+line (@pxref{Recipe Syntax}).
 
-@node Secondary Expansion, , Reading Makefiles, Makefiles
+@item
+Expand elements of the line which appear in an @emph{immediate}
+expansion context (@pxref{Reading Makefiles, , How @code{make} Reads a
+Makefile}).@refill
+
+@item
+Scan the line for a separator character, such as @samp{:} or @samp{=},
+to determine whether the line is a macro assignment or a rule
+(@pxref{Recipe Syntax}).
+
+@item
+Internalize the resulting operation and read the next line.
+@end enumerate
+
+An important consequence of this is that a macro can expand to an
+entire rule, @emph{if it is one line long}.  This will work:
+
+@example
+myrule = target : ; echo built
+
+$(myrule)
+@end example
+
+However, this will not work because @code{make} does not re-split lines
+after it has expanded them:
+
+@example
+define myrule
+target:
+        echo built
+endef
+
+$(myrule)
+@end example
+
+The above makefile results in the definition of a target @samp{target}
+with prerequisites @samp{echo} and @samp{built}, as if the makefile
+contained @code{target: echo built}, rather than a rule with a recipe.
+Newlines still present in a line after expansion is complete are
+ignored as normal whitespace.
+
+In order to properly expand a multi-line macro you must use the
+@code{eval} function: this causes the @code{make} parser to be run on
+the results of the expanded macro (@pxref{Eval Function}).
+
+@node Secondary Expansion,  , Parsing Makefiles, Makefiles
 @section Secondary Expansion
 @cindex secondary expansion
 @cindex expansion, secondary
 
 @findex .SECONDEXPANSION
-In the previous section we learned that GNU @code{make} works in two
-distinct phases: a read-in phase and a target-update phase
-(@pxref{Reading Makefiles, , How @code{make} Reads a Makefile}).  GNU
-make also has the ability to enable a @emph{second expansion} of the
-prerequisites (only) for some or all targets defined in the makefile.
-In order for this second expansion to occur, the special target
+Previously we learned that GNU @code{make} works in two distinct
+phases: a read-in phase and a target-update phase (@pxref{Reading
+Makefiles, , How @code{make} Reads a Makefile}).  GNU make also has
+the ability to enable a @emph{second expansion} of the prerequisites
+(only) for some or all targets defined in the makefile.  In order for
+this second expansion to occur, the special target
 @code{.SECONDEXPANSION} must be defined before the first prerequisite
 list that makes use of this feature.
 
@@ -1831,8 +1932,8 @@ more recent than it.
 @item
 How to update the file @file{foo.o}: by running @code{cc} as stated.
 The recipe does not explicitly mention @file{defs.h}, but we presume
-that @file{foo.c} includes it, and that that is why @file{defs.h} was
-added to the prerequisites.
+that @file{foo.c} includes it, and that is why @file{defs.h} was added
+to the prerequisites.
 @end itemize
 @end ifnottex
 
@@ -2945,10 +3046,9 @@ If you specify prerequisites for @code{.SILENT}, then @code{make} will
 not print the recipe used to remake those particular files before
 executing them.  The recipe for @code{.SILENT} is ignored.
 
-If mentioned as a target with no prerequisites, @code{.SILENT} says not
-to print any recipes before executing them.  This usage of
-@samp{.SILENT} is supported only for historical compatibility.  We
-recommend you use the more selective ways to silence specific recipes.
+If mentioned as a target with no prerequisites, @code{.SILENT} says
+not to print any recipes before executing them.  You may also use more
+selective ways to silence specific recipe command lines.
 @xref{Echoing, ,Recipe Echoing}.  If you want to silence all recipes
 for a particular run of @code{make}, use the @samp{-s} or
 @w{@samp{--silent}} option (@pxref{Options Summary}).
@@ -3012,13 +3112,22 @@ both pieces to the suffix list.  In practice, suffixes normally begin with
 @cindex targets, multiple
 @cindex rule, with multiple targets
 
-A rule with multiple targets is equivalent to writing many rules, each with
-one target, and all identical aside from that.  The same recipe applies to
-all the targets, but its effect may vary because you can substitute the
-actual target name into the recipe using @samp{$@@}.  The rule contributes
-the same prerequisites to all the targets also.
+When an explicit rule has multiple targets they can be treated in one
+of two possible ways: as independent targets or as grouped targets.
+The manner in which they are treated is determined by the separator that
+appears after the list of targets.
+
+@subsubheading Rules with Independent Targets
+@cindex independent targets
+@cindex targets, independent
+
+Rules that use the standard target separator, @code{:}, define
+independent targets.  This is equivalent to writing the same rule once
+for each target, with duplicated prerequisites and recipes.  Typically,
+the recipe would use automatic variables such as @samp{$@@} to specify
+which target is being built.
 
-This is useful in two cases.
+Rules with independent targets are useful in two cases:
 
 @itemize @bullet
 @item
@@ -3030,13 +3139,18 @@ kbd.o command.o files.o: command.h
 
 @noindent
 gives an additional prerequisite to each of the three object files
-mentioned.
+mentioned.  It is equivalent to writing:
+
+@example
+kbd.o: command.h
+command.o: command.h
+files.o: command.h
+@end example
 
 @item
-Similar recipes work for all the targets.  The recipes do not need
-to be absolutely identical, since the automatic variable @samp{$@@}
-can be used to substitute the particular target to be remade into the
-commands (@pxref{Automatic Variables}).  For example:
+Similar recipes work for all the targets.  The automatic variable
+@samp{$@@} can be used to substitute the particular target to be
+remade into the commands (@pxref{Automatic Variables}).  For example:
 
 @example
 @group
@@ -3070,6 +3184,57 @@ You cannot do this with multiple targets in an ordinary rule, but you
 can do it with a @dfn{static pattern rule}.  @xref{Static Pattern,
 ,Static Pattern Rules}.
 
+@subsubheading Rules with Grouped Targets
+@cindex grouped targets
+@cindex targets, grouped
+
+If instead of independent targets you have a recipe that generates
+multiple files from a single invocation, you can express that
+relationship by declaring your rule to use @emph{grouped targets}.  A
+grouped target rule uses the separator @code{&:} (the @samp{&} here is
+used to imply ``all'').
+
+When @code{make} builds any one of the grouped targets, it understands
+that all the other targets in the group are also created as a result
+of the invocation of the recipe.  Furthermore, if only some of the
+grouped targets are out of date or missing @code{make} will realize
+that running the recipe will update all of the targets.
+
+As an example, this rule defines a grouped target:
+
+@example
+@group
+foo bar biz &: baz boz
+        echo $^ > foo
+        echo $^ > bar
+        echo $^ > biz
+@end group
+@end example
+
+During the execution of a grouped target's recipe, the automatic
+variable @samp{$@@} is set to the name of the particular target in the
+group which triggered the rule.  Caution must be used if relying on
+this variable in the recipe of a grouped target rule.
+
+Unlike independent targets, a grouped target rule @emph{must} include
+a recipe.  However, targets that are members of a grouped target may
+also appear in independent target rule definitions that do not have
+recipes.
+
+Each target may have only one recipe associated with it.  If a grouped
+target appears in either an independent target rule or in another
+grouped target rule with a recipe, you will get a warning and the
+latter recipe will replace the former recipe.  Additionally the target
+will be removed from the previous group and appear only in the new
+group.
+
+If you would like a target to appear in multiple groups, then you must
+use the double-colon grouped target separator, @code{&::} when
+declaring all of the groups containing that target.  Grouped
+double-colon targets are each considered independently, and each
+grouped double-colon rule's recipe is executed at most once, if at
+least one of its multiple targets requires updating.
+
 @node Multiple Rules, Static Pattern, Multiple Targets, Rules
 @section Multiple Rules for One Target
 @cindex multiple rules for one target
@@ -3788,8 +3953,7 @@ The @samp{-s} or @samp{--silent}
 flag to @code{make} prevents all echoing, as if all recipes
 started with @samp{@@}.  A rule in the makefile for the special target
 @code{.SILENT} without prerequisites has the same effect
-(@pxref{Special Targets, ,Special Built-in Target Names}).
-@code{.SILENT} is essentially obsolete since @samp{@@} is more flexible.@refill
+(@pxref{Special Targets, ,Special Built-in Target Names}).@refill
 
 @node Execution, Parallel, Echoing, Recipes
 @section Recipe Execution
@@ -3818,7 +3982,7 @@ the statements in sequence.  For example:
 
 @example
 foo : bar/lose
-        cd $(@@D) && gobble $(@@F) > ../$@@
+        cd $(<D) && gobble $(<F) > ../$@@
 @end example
 
 @noindent
@@ -3909,8 +4073,8 @@ show :
 
 As a special feature, if @code{SHELL} is determined to be a
 POSIX-style shell, the special prefix characters in ``internal''
-recipe lines will @emph{removed} before the recipe is processed.  This
-feature is intended to allow existing makefiles to add the
+recipe lines will be @emph{removed} before the recipe is processed.
+This feature is intended to allow existing makefiles to add the
 @code{.ONESHELL} special target and still run properly without
 extensive modifications.  Since the special prefix characters are not
 legal at the beginning of a line in a POSIX shell script this is not a
@@ -4283,8 +4447,7 @@ remove a file.
 When you run @code{make} with the @samp{-i} or @samp{--ignore-errors}
 flag, errors are ignored in all recipes of all rules.  A rule in the
 makefile for the special target @code{.IGNORE} has the same effect, if
-there are no prerequisites.  These ways of ignoring errors are obsolete
-because @samp{-} is more flexible.
+there are no prerequisites.  This is less flexible but sometimes useful.
 
 When errors are to be ignored, because of either a @samp{-} or the
 @samp{-i} flag, @code{make} treats an error return just like success,
@@ -4370,6 +4533,19 @@ target is updated in some atomic fashion, or exists only to record a
 modification-time (its contents do not matter), or must exist at all
 times to prevent other sorts of trouble.
 
+Although @code{make} does its best to clean up there are certain situations
+in which cleanup is impossible.  For example, @code{make} may be killed by
+an uncatchable signal.  Or, one of the programs make invokes may be killed
+or crash, leaving behind an up-to-date but corrupt target file: @code{make}
+will not realize that this failure requires the target to be cleaned.  Or
+@code{make} itself may encounter a bug and crash.
+
+For these reasons it's best to write @emph{defensive recipes}, which won't
+leave behind corrupted targets even if they fail.  Most commonly these
+recipes create temporary files rather than updating the target directly,
+then rename the temporary file to the final target name.  Some compilers
+already behave this way, so that you don't need to write a defensive recipe.
+
 @node Recursion, Canned Recipes, Interrupts, Recipes
 @section Recursive Use of @code{make}
 @cindex recursion
@@ -5117,8 +5293,12 @@ this way!)
 A dollar sign followed by a character other than a dollar sign,
 open-parenthesis or open-brace treats that single character as the
 variable name.  Thus, you could reference the variable @code{x} with
-@samp{$x}.  However, this practice is strongly discouraged, except in
-the case of the automatic variables (@pxref{Automatic Variables}).
+@samp{$x}.  However, this practice can lead to confusion (e.g.,
+@samp{$foo} refers to the variable @code{f} followed by the string
+@code{oo}) so we recommend using parentheses or braces around all
+variables, even single-letter variables, unless omitting them gives
+significant readability improvements.  One place where readability is
+often improved is automatic variables (@pxref{Automatic Variables}).
 
 @node Flavors, Advanced, Reference, Using Variables
 @section The Two Flavors of Variables
@@ -5358,17 +5538,19 @@ replaced; other occurrences of @var{a} in the value are unaltered.  For
 example:@refill
 
 @example
-foo := a.o b.o c.o
+foo := a.o b.o l.a c.o
 bar := $(foo:.o=.c)
 @end example
 
 @noindent
-sets @samp{bar} to @samp{a.c b.c c.c}.  @xref{Setting, ,Setting Variables}.
+sets @samp{bar} to @samp{a.c b.c l.a c.c}.  @xref{Setting, ,Setting Variables}.
 
-A substitution reference is actually an abbreviation for use of the
-@code{patsubst} expansion function (@pxref{Text Functions, ,Functions for String Substitution and Analysis}).  We provide
-substitution references as well as @code{patsubst} for compatibility with
-other implementations of @code{make}.
+A substitution reference is shorthand for the @code{patsubst}
+expansion function (@pxref{Text Functions, ,Functions for String Substitution and Analysis}):
+@samp{$(@var{var}:@var{a}=@var{b})} is equivalent to
+@samp{$(patsubst %@var{a},%@var{b},@var{var})}.  We provide
+substitution references as well as @code{patsubst} for compatibility
+with other implementations of @code{make}.
 
 @findex patsubst
 Another type of substitution reference lets you use the full power of
@@ -5383,13 +5565,13 @@ for a description of the @code{patsubst} function.@refill
 @group
 @exdent For example:
 
-foo := a.o b.o c.o
+foo := a.o b.o l.a c.o
 bar := $(foo:%.o=%.c)
 @end group
 @end example
 
 @noindent
-sets @samp{bar} to @samp{a.c b.c c.c}.
+sets @samp{bar} to @samp{a.c b.c l.a c.c}.
 
 @node Computed Names,  , Substitution Refs, Advanced
 @subsection Computed Variable Names
@@ -5722,7 +5904,8 @@ objects += another.o
 
 @noindent
 This takes the value of the variable @code{objects}, and adds the text
-@samp{another.o} to it (preceded by a single space).  Thus:
+@samp{another.o} to it (preceded by a single space, if it has a value
+already).  Thus:
 
 @example
 objects = main.o foo.o bar.o utils.o
@@ -5927,11 +6110,24 @@ The @code{define} directive is followed on the same line by the name
 of the variable being defined and an (optional) assignment operator,
 and nothing more.  The value to give the variable appears on the
 following lines.  The end of the value is marked by a line containing
-just the word @code{endef}.  Aside from this difference in syntax,
-@code{define} works just like any other variable definition.  The
-variable name may contain function and variable references, which are
-expanded when the directive is read to find the actual variable name
-to use.
+just the word @code{endef}.
+
+Aside from this difference in syntax, @code{define} works just like
+any other variable definition.  The variable name may contain function
+and variable references, which are expanded when the directive is read
+to find the actual variable name to use.
+
+The final newline before the @code{endef} is not included in the
+value; if you want your value to contain a trailing newline you must
+include a blank line.  For example in order to define a variable that
+contains a newline character you must use @emph{two} empty lines, not one:
+
+@example
+define newline
+
+
+endef
+@end example
 
 You may omit the variable assignment operator if you prefer.  If
 omitted, @code{make} assumes it to be @samp{=} and creates a
@@ -5948,17 +6144,12 @@ or @code{endef} strings appearing on such a line will not be
 considered @code{make} directives.
 
 @example
-define two-lines =
+define two-lines
 echo foo
 echo $(bar)
 endef
 @end example
 
-The value in an ordinary assignment cannot contain a newline; but the
-newlines that separate the lines of the value in a @code{define} become
-part of the variable's value (except for the final newline which precedes
-the @code{endef} and is not considered part of the value).@refill
-
 @need 800
 When used in a recipe, the previous example is functionally equivalent
 to this:
@@ -6453,6 +6644,57 @@ Supports dynamically loadable objects for creating custom extensions.
 Expands to a list of directories that @code{make} searches for
 included makefiles (@pxref{Include, , Including Other Makefiles}).
 
+@vindex .EXTRA_PREREQS @r{(prerequisites not added to automatic variables)}
+@item .EXTRA_PREREQS
+Each word in this variable is a new prerequisite which is added to
+targets for which it is set.  These prerequisites differ from normal
+prerequisites in that they do not appear in any of the automatic
+variables (@pxref{Automatic Variables}).  This allows prerequisites to
+be defined which do not impact the recipe.
+
+Consider a rule to link a program:
+
+@example
+myprog: myprog.o file1.o file2.o
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@@ $^ $(LDLIBS)
+@end example
+
+Now suppose you want to enhance this makefile to ensure that updates
+to the compiler cause the program to be re-linked.  You can add the
+compiler as a prerequisite, but you must ensure that it's not passed
+as an argument to link command.  You'll need something like this:
+
+@example
+myprog: myprog.o file1.o file2.o $(CC)
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@@ $(filter-out $(CC),$^) $(LDLIBS)
+@end example
+
+Then consider having multiple extra prerequisites: they would all have
+to be filtered out.  Using @code{.EXTRA_PREREQS} and target-specific
+variables provides a simpler solution:
+
+@example
+myprog: myprog.o file1.o file2.o
+       $(CC) $(CFLAGS) $(LDFLAGS) -o $@@ $^ $(LDLIBS)
+myprog: .EXTRA_PREREQS = $(CC)
+@end example
+
+This feature can also be useful if you want to add prerequisites to a
+makefile you cannot easily modify: you can create a new file such as
+@file{extra.mk}:
+
+@example
+myprog: .EXTRA_PREREQS = $(CC)
+@end example
+
+then invoke @code{make -f extra.mk -f Makefile}.
+
+Setting @code{.EXTRA_PREREQS} globally will cause those prerequisites
+to be added to all targets (which did not themselves override it with
+a target-specific value).  Note @code{make} is smart enough not to add
+a prerequisite listed in @code{.EXTRA_PREREQS} as a prerequisite to
+itself.
+
 @end table
 
 @node Conditionals, Functions, Using Variables, Top
@@ -6881,7 +7123,7 @@ the function call.  For example,
 $(subst ee,EE,feet on the street)
 @end example
 
-substitutes the string @samp{fEEt on the strEEt}.
+produces the value @samp{fEEt on the strEEt}.
 
 @item $(patsubst @var{pattern},@var{replacement},@var{text})
 @findex patsubst
@@ -7401,7 +7643,7 @@ will be expanded.
 The @code{if} function provides support for conditional expansion in a
 functional context (as opposed to the GNU @code{make} makefile
 conditionals such as @code{ifeq} (@pxref{Conditional Syntax, ,Syntax of
-Conditionals}).
+Conditionals})).
 
 The first argument, @var{condition}, first has all preceding and
 trailing whitespace stripped, then is expanded.  If it expands to any
@@ -8659,6 +8901,8 @@ Give variables taken from the environment precedence
 over variables from makefiles.
 @xref{Environment, ,Variables from the Environment}.
 
+@item -E @var{string}
+@cindex @code{-E}
 @item --eval=@var{string}
 @cindex @code{--eval}
 @c Extra blank line here makes the table look better.
@@ -9687,6 +9931,10 @@ and linking with a single @code{cc} command.  The optimized rule is used in
 preference to the step-by-step chain because it comes earlier in the
 ordering of rules.
 
+Finally, for performance reasons @code{make} will not consider non-terminal
+match-anything rules (i.e., @samp{%:}) when searching for a rule to
+build a prerequisite of an implicit rule (@pxref{Match-Anything Rules}).
+
 @node Pattern Rules, Last Resort, Chained Rules, Implicit Rules
 @section Defining and Redefining Pattern Rules
 
@@ -9767,20 +10015,13 @@ More than one pattern rule may match a target.  In this case
 @code{make} will choose the ``best fit'' rule.  @xref{Pattern Match,
 ,How Patterns Match}.
 
-@c !!! The end of of this paragraph should be rewritten.  --bob
-Pattern rules may have more than one target.  Unlike normal rules,
-this does not act as many different rules with the same prerequisites
-and recipe.  If a pattern rule has multiple targets, @code{make} knows
-that the rule's recipe is responsible for making all of the targets.
-The recipe is executed only once to make all the targets.  When
-searching for a pattern rule to match a target, the target patterns of
-a rule other than the one that matches the target in need of a rule
-are incidental: @code{make} worries only about giving a recipe and
-prerequisites to the file presently in question.  However, when this
-file's recipe is run, the other targets are marked as having been
-updated themselves.
 @cindex multiple targets, in pattern rule
 @cindex target, multiple in pattern rule
+Pattern rules may have more than one target; however, every target
+must contain a @code{%} character.  Pattern rules are always treated
+as grouped targets (@pxref{Multiple Targets, , Multiple Targets in a
+Rule}) regardless of whether they use the @code{:} or @code{&:}
+separator.
 
 @node Pattern Examples, Automatic Variables, Pattern Intro, Pattern Rules
 @subsection Pattern Rule Examples
@@ -9900,8 +10141,9 @@ implicit rule (@pxref{Implicit Rules}).
 @vindex ? @r{(automatic variable)}
 @item $?
 The names of all the prerequisites that are newer than the target, with
-spaces between them.  For prerequisites which are archive members, only
-the named member is used (@pxref{Archives}).
+spaces between them.  If the target does not exist, all prerequisites
+will be included.  For prerequisites which are archive members, only the
+named member is used (@pxref{Archives}).
 @cindex prerequisites, list of changed
 @cindex list of changed prerequisites
 
@@ -9971,15 +10213,15 @@ lib: foo.o bar.o lose.o win.o
 @end example
 
 Of the variables listed above, four have values that are single file
-names, and three have values that are lists of file names.  These seven
-have variants that get just the file's directory name or just the file
-name within the directory.  The variant variables' names are formed by
-appending @samp{D} or @samp{F}, respectively.  These variants are
-semi-obsolete in GNU @code{make} since the functions @code{dir} and
-@code{notdir} can be used to get a similar effect (@pxref{File Name
-Functions, , Functions for File Names}).  Note, however, that the
-@samp{D} variants all omit the trailing slash which always appears in
-the output of the @code{dir} function.  Here is a table of the variants:
+names, and three have values that are lists of file names.  These
+seven have variants that get just the file's directory name or just
+the file name within the directory.  The variant variables' names are
+formed by appending @samp{D} or @samp{F}, respectively.  The functions
+@code{dir} and @code{notdir} can be used to obtain a similar effect
+(@pxref{File Name Functions, , Functions for File Names}).  Note,
+however, that the @samp{D} variants all omit the trailing slash which
+always appears in the output of the @code{dir} function.  Here is a
+table of the variants:
 
 @table @samp
 @vindex $(@@D)
@@ -10182,9 +10424,10 @@ remade from any other files; therefore, @code{make} can save time by not
 looking for ways to remake them.@refill
 
 If you do not mark the match-anything rule as terminal, then it is
-non-terminal.  A non-terminal match-anything rule cannot apply to a file name
-that indicates a specific type of data.  A file name indicates a specific
-type of data if some non-match-anything implicit rule target matches it.
+non-terminal.  A non-terminal match-anything rule cannot apply to a
+prerequisite of an implicit rule, or to a file name that indicates a
+specific type of data.  A file name indicates a specific type of data
+if some non-match-anything implicit rule target matches it.
 
 For example, the file name @file{foo.c} matches the target for the pattern
 rule @samp{%.c : %.y} (the rule to run Yacc).  Regardless of whether this
@@ -10296,12 +10539,13 @@ general and clearer.  They are supported in GNU @code{make} for
 compatibility with old makefiles.  They come in two kinds:
 @dfn{double-suffix} and @dfn{single-suffix}.@refill
 
-A double-suffix rule is defined by a pair of suffixes: the target suffix
-and the source suffix.  It matches any file whose name ends with the
-target suffix.  The corresponding implicit prerequisite is made by
-replacing the target suffix with the source suffix in the file name.  A
-two-suffix rule whose target and source suffixes are @samp{.o} and
-@samp{.c} is equivalent to the pattern rule @samp{%.o : %.c}.
+A double-suffix rule is defined by a pair of suffixes: the target
+suffix and the source suffix.  It matches any file whose name ends
+with the target suffix.  The corresponding implicit prerequisite is
+made by replacing the target suffix with the source suffix in the file
+name.  A two-suffix rule @samp{.c.o} (whose target and source suffixes
+are @samp{.o} and @samp{.c}) is equivalent to the pattern rule
+@samp{%.o : %.c}.
 
 A single-suffix rule is defined by a single suffix, which is the source
 suffix.  It matches any file name, and the corresponding implicit
@@ -10420,8 +10664,9 @@ Make a list of all the pattern rules one of whose targets matches
 matched against @var{t}; otherwise, against @var{n}.
 
 @item
-If any rule in that list is @emph{not} a match-anything rule, then
-remove all non-terminal match-anything rules from the list.
+If any rule in that list is @emph{not} a match-anything rule, or if
+@var{t} is a prerequisite of an implicit rule, then remove all
+non-terminal match-anything rules from the list.
 
 @item
 Remove from the list all rules with no recipe.
@@ -11452,7 +11697,8 @@ On POSIX systems the jobserver is implemented as a simple UNIX pipe.
 The pipe will be pre-loaded with one single-character token for each
 available job.  To obtain an extra slot you must read a single
 character from the jobserver pipe; to release a slot you must write a
-single character back into the jobserver pipe.
+single character back into the jobserver pipe.  Note that the read
+side of the jobserver pipe is set to ``blocking'' mode.
 
 To access the pipe you must parse the @code{MAKEFLAGS} variable and
 look for the argument string @code{--jobserver-auth=R,W} where
@@ -11882,7 +12128,7 @@ In System V and 4.3 BSD @code{make}, files found by @code{VPATH}
 search (@pxref{Directory Search, ,Searching Directories for
 Prerequisites}) have their names changed inside recipes.  We feel it
 is much cleaner to always use automatic variables and thus make this
-feature obsolete.@refill
+feature unnecessary.@refill
 
 @item
 In some Unix @code{make}s, the automatic variable @code{$*} appearing in
@@ -12467,16 +12713,18 @@ of its arguments.  @xref{Functions, ,Functions for Transforming Text}.
 @itemx multiple target patterns.  Stop.
 @itemx target pattern contains no `%'.  Stop.
 @itemx mixed implicit and static pattern rules.  Stop.
-These are generated for malformed static pattern rules.  The first
-means there's no pattern in the target section of the rule; the second
-means there are multiple patterns in the target section; the third
-means the target doesn't contain a pattern character (@code{%}); and
-the fourth means that all three parts of the static pattern rule
-contain pattern characters (@code{%})--only the first two parts
-should.  If you see these errors and you aren't trying to create a
-static pattern rule, check the value of any variables in your target
-and prerequisite lists to be sure they do not contain colons.
-@xref{Static Usage, ,Syntax of Static Pattern Rules}.
+These errors are generated for malformed static pattern rules
+(@pxref{Static Usage, ,Syntax of Static Pattern Rules}).  The first
+means the target-pattern part of the rule is empty; the second means
+there are multiple pattern characters (@code{%}) in the target-pattern
+part; the third means there are no pattern characters in the
+target-pattern part; and the fourth means that all three parts of the
+static pattern rule contain pattern characters (@code{%})--the first
+part should not contain pattern characters.
+
+If you see these errors and you aren't trying to create a static
+pattern rule, check the value of any variables in your target and
+prerequisite lists to be sure they do not contain colons.
 
 @item warning: -jN forced in submake: disabling jobserver mode.
 This warning and the next are generated if @code{make} detects error
@@ -12502,6 +12750,18 @@ receive only part of the information necessary.  In this case, the child
 will generate this warning message and proceed with its build in a
 sequential manner.
 
+@item warning: ignoring prerequisites on suffix rule definition
+According to POSIX, a suffix rule cannot contain prerequisites.  If a rule
+that could be a suffix rule has prerequisites it is interpreted as a simple
+explicit rule, with an odd target name.  This requirement is obeyed when
+POSIX-conforming mode is enabled (the @code{.POSIX} target is defined).  In
+versions of GNU @code{make} prior to 4.3, no warning was emitted and a
+suffix rule was created, however all prerequisites were ignored and were not
+part of the suffix rule.  Starting with GNU @code{make} 4.3 the behavior is
+the same, and in addition this warning is generated.  In a future version
+the POSIX-conforming behavior will be the only behavior: no rule with a
+prerequisite can be suffix rule and this warning will be removed.
+
 @end table
 
 @node Complex Makefile, GNU Free Documentation License, Error Messages, Top
@@ -12784,7 +13044,7 @@ tar.zoo: $(SRCS) $(AUX)
 @end example
 
 @node GNU Free Documentation License, Concept Index, Complex Makefile, Top
-@appendixsec GNU Free Documentation License
+@appendix GNU Free Documentation License
 @cindex FDL, GNU Free Documentation License
 @include fdl.texi
 
index b119bad451b384f9baba133f4b55ab0f4fc95274..df1d34c1a3ab015c3dfbf2d792e8d193325f4e7b 100644 (file)
@@ -1,4 +1,4 @@
-@set UPDATED 21 May 2016
-@set UPDATED-MONTH May 2016
-@set EDITION 4.2.1
-@set VERSION 4.2.1
+@set UPDATED 19 January 2020
+@set UPDATED-MONTH January 2020
+@set EDITION 4.3
+@set VERSION 4.3
index b119bad451b384f9baba133f4b55ab0f4fc95274..df1d34c1a3ab015c3dfbf2d792e8d193325f4e7b 100644 (file)
@@ -1,4 +1,4 @@
-@set UPDATED 21 May 2016
-@set UPDATED-MONTH May 2016
-@set EDITION 4.2.1
-@set VERSION 4.2.1
+@set UPDATED 19 January 2020
+@set UPDATED-MONTH January 2020
+@set EDITION 4.3
+@set VERSION 4.3
diff --git a/dosbuild.bat b/dosbuild.bat
deleted file mode 100644 (file)
index 71e71e1..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-@echo off\r
-rem Copyright (C) 1998-2016 Free Software Foundation, Inc.\r
-rem This file is part of GNU Make.\r
-rem\r
-rem GNU Make is free software; you can redistribute it and/or modify it under\r
-rem the terms of the GNU General Public License as published by the Free\r
-rem Software Foundation; either version 3 of the License, or (at your option)\r
-rem any later version.\r
-rem\r
-rem GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
-rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
-rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
-rem more details.\r
-rem\r
-rem You should have received a copy of the GNU General Public License along\r
-rem with this program.  If not, see <http://www.gnu.org/licenses/>.\r
-\r
-echo Building Make for MSDOS\r
-\r
-rem Echo ON so they will see what is going on.\r
-@echo on\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g commands.c -o commands.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g output.c -o output.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g job.c -o job.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g dir.c -o dir.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g file.c -o file.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g misc.c -o misc.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g main.c -o main.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -DINCLUDEDIR=\"c:/djgpp/include\" -O2 -g read.c -o read.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -DLIBDIR=\"c:/djgpp/lib\" -O2 -g remake.c -o remake.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g rule.c -o rule.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g implicit.c -o implicit.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g default.c -o default.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g variable.c -o variable.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g expand.c -o expand.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g function.c -o function.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g vpath.c -o vpath.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g hash.c -o hash.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g strcache.c -o strcache.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g version.c -o version.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g ar.c -o ar.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g arscan.c -o arscan.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g signame.c -o signame.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g remote-stub.c -o remote-stub.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt.c -o getopt.o\r
-gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g getopt1.c -o getopt1.o\r
-@cd glob\r
-@if exist libglob.a del libglob.a\r
-gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g glob.c -o glob.o\r
-gcc -I. -c -DHAVE_CONFIG_H -I.. -O2 -g fnmatch.c -o fnmatch.o\r
-ar rv libglob.a glob.o fnmatch.o\r
-@echo off\r
-cd ..\r
-echo commands.o > respf.$$$\r
-for %%f in (job output dir file misc main read remake rule implicit default variable) do echo %%f.o >> respf.$$$\r
-for %%f in (expand function vpath hash strcache version ar arscan signame remote-stub getopt getopt1) do echo %%f.o >> respf.$$$\r
-echo glob/libglob.a >> respf.$$$\r
-rem gcc  -c -I. -I./glob -DHAVE_CONFIG_H -O2 -g guile.c -o guile.o\r
-rem echo guile.o >> respf.$$$\r
-@echo Linking...\r
-@echo on\r
-gcc -o make.new @respf.$$$\r
-@if exist make.exe echo Make.exe is now built!\r
-@if not exist make.exe echo Make.exe build failed...\r
-@if exist make.exe del respf.$$$\r
diff --git a/expand.c b/expand.c
deleted file mode 100644 (file)
index 0b5fd01..0000000
--- a/expand.c
+++ /dev/null
@@ -1,595 +0,0 @@
-/* Variable expansion functions for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "filedef.h"
-#include "job.h"
-#include "commands.h"
-#include "variable.h"
-#include "rule.h"
-
-/* Initially, any errors reported when expanding strings will be reported
-   against the file where the error appears.  */
-const floc **expanding_var = &reading_file;
-
-/* The next two describe the variable output buffer.
-   This buffer is used to hold the variable-expansion of a line of the
-   makefile.  It is made bigger with realloc whenever it is too small.
-   variable_buffer_length is the size currently allocated.
-   variable_buffer is the address of the buffer.
-
-   For efficiency, it's guaranteed that the buffer will always have
-   VARIABLE_BUFFER_ZONE extra bytes allocated.  This allows you to add a few
-   extra chars without having to call a function.  Note you should never use
-   these bytes unless you're _sure_ you have room (you know when the buffer
-   length was last checked.  */
-
-#define VARIABLE_BUFFER_ZONE    5
-
-static unsigned int variable_buffer_length;
-char *variable_buffer;
-
-/* Subroutine of variable_expand and friends:
-   The text to add is LENGTH chars starting at STRING to the variable_buffer.
-   The text is added to the buffer at PTR, and the updated pointer into
-   the buffer is returned as the value.  Thus, the value returned by
-   each call to variable_buffer_output should be the first argument to
-   the following call.  */
-
-char *
-variable_buffer_output (char *ptr, const char *string, unsigned int length)
-{
-  register unsigned int newlen = length + (ptr - variable_buffer);
-
-  if ((newlen + VARIABLE_BUFFER_ZONE) > variable_buffer_length)
-    {
-      unsigned int offset = ptr - variable_buffer;
-      variable_buffer_length = (newlen + 100 > 2 * variable_buffer_length
-                                ? newlen + 100
-                                : 2 * variable_buffer_length);
-      variable_buffer = xrealloc (variable_buffer, variable_buffer_length);
-      ptr = variable_buffer + offset;
-    }
-
-  memcpy (ptr, string, length);
-  return ptr + length;
-}
-
-/* Return a pointer to the beginning of the variable buffer.  */
-
-static char *
-initialize_variable_output (void)
-{
-  /* If we don't have a variable output buffer yet, get one.  */
-
-  if (variable_buffer == 0)
-    {
-      variable_buffer_length = 200;
-      variable_buffer = xmalloc (variable_buffer_length);
-      variable_buffer[0] = '\0';
-    }
-
-  return variable_buffer;
-}
-\f
-/* Recursively expand V.  The returned string is malloc'd.  */
-
-static char *allocated_variable_append (const struct variable *v);
-
-char *
-recursively_expand_for_file (struct variable *v, struct file *file)
-{
-  char *value;
-  const floc *this_var;
-  const floc **saved_varp;
-  struct variable_set_list *save = 0;
-  int set_reading = 0;
-
-  /* Don't install a new location if this location is empty.
-     This can happen for command-line variables, builtin variables, etc.  */
-  saved_varp = expanding_var;
-  if (v->fileinfo.filenm)
-    {
-      this_var = &v->fileinfo;
-      expanding_var = &this_var;
-    }
-
-  /* If we have no other file-reading context, use the variable's context. */
-  if (!reading_file)
-    {
-      set_reading = 1;
-      reading_file = &v->fileinfo;
-    }
-
-  if (v->expanding)
-    {
-      if (!v->exp_count)
-        /* Expanding V causes infinite recursion.  Lose.  */
-        OS (fatal, *expanding_var,
-            _("Recursive variable '%s' references itself (eventually)"),
-            v->name);
-      --v->exp_count;
-    }
-
-  if (file)
-    {
-      save = current_variable_set_list;
-      current_variable_set_list = file->variables;
-    }
-
-  v->expanding = 1;
-  if (v->append)
-    value = allocated_variable_append (v);
-  else
-    value = allocated_variable_expand (v->value);
-  v->expanding = 0;
-
-  if (set_reading)
-    reading_file = 0;
-
-  if (file)
-    current_variable_set_list = save;
-
-  expanding_var = saved_varp;
-
-  return value;
-}
-
-/* Expand a simple reference to variable NAME, which is LENGTH chars long.  */
-
-#ifdef __GNUC__
-__inline
-#endif
-static char *
-reference_variable (char *o, const char *name, unsigned int length)
-{
-  struct variable *v;
-  char *value;
-
-  v = lookup_variable (name, length);
-
-  if (v == 0)
-    warn_undefined (name, length);
-
-  /* If there's no variable by that name or it has no value, stop now.  */
-  if (v == 0 || (*v->value == '\0' && !v->append))
-    return o;
-
-  value = (v->recursive ? recursively_expand (v) : v->value);
-
-  o = variable_buffer_output (o, value, strlen (value));
-
-  if (v->recursive)
-    free (value);
-
-  return o;
-}
-\f
-/* Scan STRING for variable references and expansion-function calls.  Only
-   LENGTH bytes of STRING are actually scanned.  If LENGTH is -1, scan until
-   a null byte is found.
-
-   Write the results to LINE, which must point into 'variable_buffer'.  If
-   LINE is NULL, start at the beginning of the buffer.
-   Return a pointer to LINE, or to the beginning of the buffer if LINE is
-   NULL.
- */
-char *
-variable_expand_string (char *line, const char *string, long length)
-{
-  struct variable *v;
-  const char *p, *p1;
-  char *save;
-  char *o;
-  unsigned int line_offset;
-
-  if (!line)
-    line = initialize_variable_output ();
-  o = line;
-  line_offset = line - variable_buffer;
-
-  if (length == 0)
-    {
-      variable_buffer_output (o, "", 1);
-      return (variable_buffer);
-    }
-
-  /* We need a copy of STRING: due to eval, it's possible that it will get
-     freed as we process it (it might be the value of a variable that's reset
-     for example).  Also having a nil-terminated string is handy.  */
-  save = length < 0 ? xstrdup (string) : xstrndup (string, length);
-  p = save;
-
-  while (1)
-    {
-      /* Copy all following uninteresting chars all at once to the
-         variable output buffer, and skip them.  Uninteresting chars end
-         at the next $ or the end of the input.  */
-
-      p1 = strchr (p, '$');
-
-      o = variable_buffer_output (o, p, p1 != 0 ? (unsigned int)(p1 - p) : strlen (p) + 1);
-
-      if (p1 == 0)
-        break;
-      p = p1 + 1;
-
-      /* Dispatch on the char that follows the $.  */
-
-      switch (*p)
-        {
-        case '$':
-        case '\0':
-          /* $$ or $ at the end of the string means output one $ to the
-             variable output buffer.  */
-          o = variable_buffer_output (o, p1, 1);
-          break;
-
-        case '(':
-        case '{':
-          /* $(...) or ${...} is the general case of substitution.  */
-          {
-            char openparen = *p;
-            char closeparen = (openparen == '(') ? ')' : '}';
-            const char *begp;
-            const char *beg = p + 1;
-            char *op;
-            char *abeg = NULL;
-            const char *end, *colon;
-
-            op = o;
-            begp = p;
-            if (handle_function (&op, &begp))
-              {
-                o = op;
-                p = begp;
-                break;
-              }
-
-            /* Is there a variable reference inside the parens or braces?
-               If so, expand it before expanding the entire reference.  */
-
-            end = strchr (beg, closeparen);
-            if (end == 0)
-              /* Unterminated variable reference.  */
-              O (fatal, *expanding_var, _("unterminated variable reference"));
-            p1 = lindex (beg, end, '$');
-            if (p1 != 0)
-              {
-                /* BEG now points past the opening paren or brace.
-                   Count parens or braces until it is matched.  */
-                int count = 0;
-                for (p = beg; *p != '\0'; ++p)
-                  {
-                    if (*p == openparen)
-                      ++count;
-                    else if (*p == closeparen && --count < 0)
-                      break;
-                  }
-                /* If COUNT is >= 0, there were unmatched opening parens
-                   or braces, so we go to the simple case of a variable name
-                   such as '$($(a)'.  */
-                if (count < 0)
-                  {
-                    abeg = expand_argument (beg, p); /* Expand the name.  */
-                    beg = abeg;
-                    end = strchr (beg, '\0');
-                  }
-              }
-            else
-              /* Advance P to the end of this reference.  After we are
-                 finished expanding this one, P will be incremented to
-                 continue the scan.  */
-              p = end;
-
-            /* This is not a reference to a built-in function and
-               any variable references inside are now expanded.
-               Is the resultant text a substitution reference?  */
-
-            colon = lindex (beg, end, ':');
-            if (colon)
-              {
-                /* This looks like a substitution reference: $(FOO:A=B).  */
-                const char *subst_beg = colon + 1;
-                const char *subst_end = lindex (subst_beg, end, '=');
-                if (subst_end == 0)
-                  /* There is no = in sight.  Punt on the substitution
-                     reference and treat this as a variable name containing
-                     a colon, in the code below.  */
-                  colon = 0;
-                else
-                  {
-                    const char *replace_beg = subst_end + 1;
-                    const char *replace_end = end;
-
-                    /* Extract the variable name before the colon
-                       and look up that variable.  */
-                    v = lookup_variable (beg, colon - beg);
-                    if (v == 0)
-                      warn_undefined (beg, colon - beg);
-
-                    /* If the variable is not empty, perform the
-                       substitution.  */
-                    if (v != 0 && *v->value != '\0')
-                      {
-                        char *pattern, *replace, *ppercent, *rpercent;
-                        char *value = (v->recursive
-                                       ? recursively_expand (v)
-                                       : v->value);
-
-                        /* Copy the pattern and the replacement.  Add in an
-                           extra % at the beginning to use in case there
-                           isn't one in the pattern.  */
-                        pattern = alloca (subst_end - subst_beg + 2);
-                        *(pattern++) = '%';
-                        memcpy (pattern, subst_beg, subst_end - subst_beg);
-                        pattern[subst_end - subst_beg] = '\0';
-
-                        replace = alloca (replace_end - replace_beg + 2);
-                        *(replace++) = '%';
-                        memcpy (replace, replace_beg,
-                               replace_end - replace_beg);
-                        replace[replace_end - replace_beg] = '\0';
-
-                        /* Look for %.  Set the percent pointers properly
-                           based on whether we find one or not.  */
-                        ppercent = find_percent (pattern);
-                        if (ppercent)
-                          {
-                            ++ppercent;
-                            rpercent = find_percent (replace);
-                            if (rpercent)
-                              ++rpercent;
-                          }
-                        else
-                          {
-                            ppercent = pattern;
-                            rpercent = replace;
-                            --pattern;
-                            --replace;
-                          }
-
-                        o = patsubst_expand_pat (o, value, pattern, replace,
-                                                 ppercent, rpercent);
-
-                        if (v->recursive)
-                          free (value);
-                      }
-                  }
-              }
-
-            if (colon == 0)
-              /* This is an ordinary variable reference.
-                 Look up the value of the variable.  */
-                o = reference_variable (o, beg, end - beg);
-
-            free (abeg);
-          }
-          break;
-
-        default:
-          if (ISSPACE (p[-1]))
-            break;
-
-          /* A $ followed by a random char is a variable reference:
-             $a is equivalent to $(a).  */
-          o = reference_variable (o, p, 1);
-
-          break;
-        }
-
-      if (*p == '\0')
-        break;
-
-      ++p;
-    }
-
-  free (save);
-
-  variable_buffer_output (o, "", 1);
-  return (variable_buffer + line_offset);
-}
-\f
-/* Scan LINE for variable references and expansion-function calls.
-   Build in 'variable_buffer' the result of expanding the references and calls.
-   Return the address of the resulting string, which is null-terminated
-   and is valid only until the next time this function is called.  */
-
-char *
-variable_expand (const char *line)
-{
-  return variable_expand_string (NULL, line, (long)-1);
-}
-\f
-/* Expand an argument for an expansion function.
-   The text starting at STR and ending at END is variable-expanded
-   into a null-terminated string that is returned as the value.
-   This is done without clobbering 'variable_buffer' or the current
-   variable-expansion that is in progress.  */
-
-char *
-expand_argument (const char *str, const char *end)
-{
-  char *tmp, *alloc = NULL;
-  char *r;
-
-  if (str == end)
-    return xstrdup ("");
-
-  if (!end || *end == '\0')
-    return allocated_variable_expand (str);
-
-  if (end - str + 1 > 1000)
-    tmp = alloc = xmalloc (end - str + 1);
-  else
-    tmp = alloca (end - str + 1);
-
-  memcpy (tmp, str, end - str);
-  tmp[end - str] = '\0';
-
-  r = allocated_variable_expand (tmp);
-
-  free (alloc);
-
-  return r;
-}
-\f
-/* Expand LINE for FILE.  Error messages refer to the file and line where
-   FILE's commands were found.  Expansion uses FILE's variable set list.  */
-
-char *
-variable_expand_for_file (const char *line, struct file *file)
-{
-  char *result;
-  struct variable_set_list *savev;
-  const floc *savef;
-
-  if (file == 0)
-    return variable_expand (line);
-
-  savev = current_variable_set_list;
-  current_variable_set_list = file->variables;
-
-  savef = reading_file;
-  if (file->cmds && file->cmds->fileinfo.filenm)
-    reading_file = &file->cmds->fileinfo;
-  else
-    reading_file = 0;
-
-  result = variable_expand (line);
-
-  current_variable_set_list = savev;
-  reading_file = savef;
-
-  return result;
-}
-\f
-/* Like allocated_variable_expand, but for += target-specific variables.
-   First recursively construct the variable value from its appended parts in
-   any upper variable sets.  Then expand the resulting value.  */
-
-static char *
-variable_append (const char *name, unsigned int length,
-                 const struct variable_set_list *set, int local)
-{
-  const struct variable *v;
-  char *buf = 0;
-  /* If this set is local and the next is not a parent, then next is local.  */
-  int nextlocal = local && set->next_is_parent == 0;
-
-  /* If there's nothing left to check, return the empty buffer.  */
-  if (!set)
-    return initialize_variable_output ();
-
-  /* Try to find the variable in this variable set.  */
-  v = lookup_variable_in_set (name, length, set->set);
-
-  /* If there isn't one, or this one is private, try the set above us.  */
-  if (!v || (!local && v->private_var))
-    return variable_append (name, length, set->next, nextlocal);
-
-  /* If this variable type is append, first get any upper values.
-     If not, initialize the buffer.  */
-  if (v->append)
-    buf = variable_append (name, length, set->next, nextlocal);
-  else
-    buf = initialize_variable_output ();
-
-  /* Append this value to the buffer, and return it.
-     If we already have a value, first add a space.  */
-  if (buf > variable_buffer)
-    buf = variable_buffer_output (buf, " ", 1);
-
-  /* Either expand it or copy it, depending.  */
-  if (! v->recursive)
-    return variable_buffer_output (buf, v->value, strlen (v->value));
-
-  buf = variable_expand_string (buf, v->value, strlen (v->value));
-  return (buf + strlen (buf));
-}
-
-
-static char *
-allocated_variable_append (const struct variable *v)
-{
-  char *val;
-
-  /* Construct the appended variable value.  */
-
-  char *obuf = variable_buffer;
-  unsigned int olen = variable_buffer_length;
-
-  variable_buffer = 0;
-
-  val = variable_append (v->name, strlen (v->name),
-                         current_variable_set_list, 1);
-  variable_buffer_output (val, "", 1);
-  val = variable_buffer;
-
-  variable_buffer = obuf;
-  variable_buffer_length = olen;
-
-  return val;
-}
-
-/* Like variable_expand_for_file, but the returned string is malloc'd.
-   This function is called a lot.  It wants to be efficient.  */
-
-char *
-allocated_variable_expand_for_file (const char *line, struct file *file)
-{
-  char *value;
-
-  char *obuf = variable_buffer;
-  unsigned int olen = variable_buffer_length;
-
-  variable_buffer = 0;
-
-  value = variable_expand_for_file (line, file);
-
-  variable_buffer = obuf;
-  variable_buffer_length = olen;
-
-  return value;
-}
-
-/* Install a new variable_buffer context, returning the current one for
-   safe-keeping.  */
-
-void
-install_variable_buffer (char **bufp, unsigned int *lenp)
-{
-  *bufp = variable_buffer;
-  *lenp = variable_buffer_length;
-
-  variable_buffer = 0;
-  initialize_variable_output ();
-}
-
-/* Restore a previously-saved variable_buffer setting (free the current one).
- */
-
-void
-restore_variable_buffer (char *buf, unsigned int len)
-{
-  free (variable_buffer);
-
-  variable_buffer = buf;
-  variable_buffer_length = len;
-}
diff --git a/file.c b/file.c
deleted file mode 100644 (file)
index ae1c285..0000000
--- a/file.c
+++ /dev/null
@@ -1,1148 +0,0 @@
-/* Target file management for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "filedef.h"
-#include "dep.h"
-#include "job.h"
-#include "commands.h"
-#include "variable.h"
-#include "debug.h"
-#include "hash.h"
-
-
-/* Remember whether snap_deps has been invoked: we need this to be sure we
-   don't add new rules (via $(eval ...)) afterwards.  In the future it would
-   be nice to support this, but it means we'd need to re-run snap_deps() or
-   at least its functionality... it might mean changing snap_deps() to be run
-   per-file, so we can invoke it after the eval... or remembering which files
-   in the hash have been snapped (a new boolean flag?) and having snap_deps()
-   only work on files which have not yet been snapped. */
-int snapped_deps = 0;
-
-/* Hash table of files the makefile knows how to make.  */
-
-static unsigned long
-file_hash_1 (const void *key)
-{
-  return_ISTRING_HASH_1 (((struct file const *) key)->hname);
-}
-
-static unsigned long
-file_hash_2 (const void *key)
-{
-  return_ISTRING_HASH_2 (((struct file const *) key)->hname);
-}
-
-static int
-file_hash_cmp (const void *x, const void *y)
-{
-  return_ISTRING_COMPARE (((struct file const *) x)->hname,
-                          ((struct file const *) y)->hname);
-}
-
-static struct hash_table files;
-
-/* Whether or not .SECONDARY with no prerequisites was given.  */
-static int all_secondary = 0;
-
-/* Access the hash table of all file records.
-   lookup_file  given a name, return the struct file * for that name,
-                or nil if there is none.
-*/
-
-struct file *
-lookup_file (const char *name)
-{
-  struct file *f;
-  struct file file_key;
-#ifdef VMS
-  int want_vmsify;
-#ifndef WANT_CASE_SENSITIVE_TARGETS
-  char *lname;
-#endif
-#endif
-
-  assert (*name != '\0');
-
-  /* This is also done in parse_file_seq, so this is redundant
-     for names read from makefiles.  It is here for names passed
-     on the command line.  */
-#ifdef VMS
-   want_vmsify = (strpbrk (name, "]>:^") != NULL);
-# ifndef WANT_CASE_SENSITIVE_TARGETS
-  if (*name != '.')
-    {
-      const char *n;
-      char *ln;
-      lname = xstrdup (name);
-      for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
-        *ln = isupper ((unsigned char)*n) ? tolower ((unsigned char)*n) : *n;
-      *ln = '\0';
-      name = lname;
-    }
-# endif
-
-  while (name[0] == '[' && name[1] == ']' && name[2] != '\0')
-      name += 2;
-  while (name[0] == '<' && name[1] == '>' && name[2] != '\0')
-      name += 2;
-#endif
-  while (name[0] == '.'
-#ifdef HAVE_DOS_PATHS
-         && (name[1] == '/' || name[1] == '\\')
-#else
-         && name[1] == '/'
-#endif
-         && name[2] != '\0')
-    {
-      name += 2;
-      while (*name == '/'
-#ifdef HAVE_DOS_PATHS
-             || *name == '\\'
-#endif
-             )
-        /* Skip following slashes: ".//foo" is "foo", not "/foo".  */
-        ++name;
-    }
-
-  if (*name == '\0')
-    {
-      /* It was all slashes after a dot.  */
-#if defined(_AMIGA)
-      name = "";
-#else
-      name = "./";
-#endif
-#if defined(VMS)
-      /* TODO - This section is probably not needed. */
-      if (want_vmsify)
-        name = "[]";
-#endif
-    }
-  file_key.hname = name;
-  f = hash_find_item (&files, &file_key);
-#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
-  if (*name != '.')
-    free (lname);
-#endif
-
-  return f;
-}
-
-/* Look up a file record for file NAME and return it.
-   Create a new record if one doesn't exist.  NAME will be stored in the
-   new record so it should be constant or in the strcache etc.
- */
-
-struct file *
-enter_file (const char *name)
-{
-  struct file *f;
-  struct file *new;
-  struct file **file_slot;
-  struct file file_key;
-
-  assert (*name != '\0');
-  assert (! verify_flag || strcache_iscached (name));
-
-#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
-  if (*name != '.')
-    {
-      const char *n;
-      char *lname, *ln;
-      lname = xstrdup (name);
-      for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
-        if (isupper ((unsigned char)*n))
-          *ln = tolower ((unsigned char)*n);
-        else
-          *ln = *n;
-
-      *ln = '\0';
-      name = strcache_add (lname);
-      free (lname);
-    }
-#endif
-
-  file_key.hname = name;
-  file_slot = (struct file **) hash_find_slot (&files, &file_key);
-  f = *file_slot;
-  if (! HASH_VACANT (f) && !f->double_colon)
-    {
-      f->builtin = 0;
-      return f;
-    }
-
-  new = xcalloc (sizeof (struct file));
-  new->name = new->hname = name;
-  new->update_status = us_none;
-
-  if (HASH_VACANT (f))
-    {
-      new->last = new;
-      hash_insert_at (&files, new, file_slot);
-    }
-  else
-    {
-      /* There is already a double-colon entry for this file.  */
-      new->double_colon = f;
-      f->last->prev = new;
-      f->last = new;
-    }
-
-  return new;
-}
-\f
-/* Rehash FILE to NAME.  This is not as simple as resetting
-   the 'hname' member, since it must be put in a new hash bucket,
-   and possibly merged with an existing file called NAME.  */
-
-void
-rehash_file (struct file *from_file, const char *to_hname)
-{
-  struct file file_key;
-  struct file **file_slot;
-  struct file *to_file;
-  struct file *deleted_file;
-  struct file *f;
-
-  /* If it's already that name, we're done.  */
-  from_file->builtin = 0;
-  file_key.hname = to_hname;
-  if (! file_hash_cmp (from_file, &file_key))
-    return;
-
-  /* Find the end of the renamed list for the "from" file.  */
-  file_key.hname = from_file->hname;
-  while (from_file->renamed != 0)
-    from_file = from_file->renamed;
-  if (file_hash_cmp (from_file, &file_key))
-    /* hname changed unexpectedly!! */
-    abort ();
-
-  /* Remove the "from" file from the hash.  */
-  deleted_file = hash_delete (&files, from_file);
-  if (deleted_file != from_file)
-    /* from_file isn't the one stored in files */
-    abort ();
-
-  /* Find where the newly renamed file will go in the hash.  */
-  file_key.hname = to_hname;
-  file_slot = (struct file **) hash_find_slot (&files, &file_key);
-  to_file = *file_slot;
-
-  /* Change the hash name for this file.  */
-  from_file->hname = to_hname;
-  for (f = from_file->double_colon; f != 0; f = f->prev)
-    f->hname = to_hname;
-
-  /* If the new name doesn't exist yet just set it to the renamed file.  */
-  if (HASH_VACANT (to_file))
-    {
-      hash_insert_at (&files, from_file, file_slot);
-      return;
-    }
-
-  /* TO_FILE already exists under TO_HNAME.
-     We must retain TO_FILE and merge FROM_FILE into it.  */
-
-  if (from_file->cmds != 0)
-    {
-      if (to_file->cmds == 0)
-        to_file->cmds = from_file->cmds;
-      else if (from_file->cmds != to_file->cmds)
-        {
-          size_t l = strlen (from_file->name);
-          /* We have two sets of commands.  We will go with the
-             one given in the rule explicitly mentioning this name,
-             but give a message to let the user know what's going on.  */
-          if (to_file->cmds->fileinfo.filenm != 0)
-            error (&from_file->cmds->fileinfo,
-                   l + strlen (to_file->cmds->fileinfo.filenm) + INTSTR_LENGTH,
-                   _("Recipe was specified for file '%s' at %s:%lu,"),
-                   from_file->name, to_file->cmds->fileinfo.filenm,
-                   to_file->cmds->fileinfo.lineno);
-          else
-            error (&from_file->cmds->fileinfo, l,
-                   _("Recipe for file '%s' was found by implicit rule search,"),
-                   from_file->name);
-          l += strlen (to_hname);
-          error (&from_file->cmds->fileinfo, l,
-                 _("but '%s' is now considered the same file as '%s'."),
-                 from_file->name, to_hname);
-          error (&from_file->cmds->fileinfo, l,
-                 _("Recipe for '%s' will be ignored in favor of the one for '%s'."),
-                 to_hname, from_file->name);
-        }
-    }
-
-  /* Merge the dependencies of the two files.  */
-
-  if (to_file->deps == 0)
-    to_file->deps = from_file->deps;
-  else
-    {
-      struct dep *deps = to_file->deps;
-      while (deps->next != 0)
-        deps = deps->next;
-      deps->next = from_file->deps;
-    }
-
-  merge_variable_set_lists (&to_file->variables, from_file->variables);
-
-  if (to_file->double_colon && from_file->is_target && !from_file->double_colon)
-    OSS (fatal, NILF, _("can't rename single-colon '%s' to double-colon '%s'"),
-         from_file->name, to_hname);
-  if (!to_file->double_colon  && from_file->double_colon)
-    {
-      if (to_file->is_target)
-        OSS (fatal, NILF,
-             _("can't rename double-colon '%s' to single-colon '%s'"),
-             from_file->name, to_hname);
-      else
-        to_file->double_colon = from_file->double_colon;
-    }
-
-  if (from_file->last_mtime > to_file->last_mtime)
-    /* %%% Kludge so -W wins on a file that gets vpathized.  */
-    to_file->last_mtime = from_file->last_mtime;
-
-  to_file->mtime_before_update = from_file->mtime_before_update;
-
-#define MERGE(field) to_file->field |= from_file->field
-  MERGE (precious);
-  MERGE (tried_implicit);
-  MERGE (updating);
-  MERGE (updated);
-  MERGE (is_target);
-  MERGE (cmd_target);
-  MERGE (phony);
-  MERGE (loaded);
-  MERGE (ignore_vpath);
-#undef MERGE
-
-  to_file->builtin = 0;
-  from_file->renamed = to_file;
-}
-
-/* Rename FILE to NAME.  This is not as simple as resetting
-   the 'name' member, since it must be put in a new hash bucket,
-   and possibly merged with an existing file called NAME.  */
-
-void
-rename_file (struct file *from_file, const char *to_hname)
-{
-  rehash_file (from_file, to_hname);
-  while (from_file)
-    {
-      from_file->name = from_file->hname;
-      from_file = from_file->prev;
-    }
-}
-\f
-/* Remove all nonprecious intermediate files.
-   If SIG is nonzero, this was caused by a fatal signal,
-   meaning that a different message will be printed, and
-   the message will go to stderr rather than stdout.  */
-
-void
-remove_intermediates (int sig)
-{
-  struct file **file_slot;
-  struct file **file_end;
-  int doneany = 0;
-
-  /* If there's no way we will ever remove anything anyway, punt early.  */
-  if (question_flag || touch_flag || all_secondary)
-    return;
-
-  if (sig && just_print_flag)
-    return;
-
-  file_slot = (struct file **) files.ht_vec;
-  file_end = file_slot + files.ht_size;
-  for ( ; file_slot < file_end; file_slot++)
-    if (! HASH_VACANT (*file_slot))
-      {
-        struct file *f = *file_slot;
-        /* Is this file eligible for automatic deletion?
-           Yes, IFF: it's marked intermediate, it's not secondary, it wasn't
-           given on the command line, and it's either a -include makefile or
-           it's not precious.  */
-        if (f->intermediate && (f->dontcare || !f->precious)
-            && !f->secondary && !f->cmd_target)
-          {
-            int status;
-            if (f->update_status == us_none)
-              /* If nothing would have created this file yet,
-                 don't print an "rm" command for it.  */
-              continue;
-            if (just_print_flag)
-              status = 0;
-            else
-              {
-                status = unlink (f->name);
-                if (status < 0 && errno == ENOENT)
-                  continue;
-              }
-            if (!f->dontcare)
-              {
-                if (sig)
-                  OS (error, NILF,
-                      _("*** Deleting intermediate file '%s'"), f->name);
-                else
-                  {
-                    if (! doneany)
-                      DB (DB_BASIC, (_("Removing intermediate files...\n")));
-                    if (!silent_flag)
-                      {
-                        if (! doneany)
-                          {
-                            fputs ("rm ", stdout);
-                            doneany = 1;
-                          }
-                        else
-                          putchar (' ');
-                        fputs (f->name, stdout);
-                        fflush (stdout);
-                      }
-                  }
-                if (status < 0)
-                  perror_with_name ("unlink: ", f->name);
-              }
-          }
-      }
-
-  if (doneany && !sig)
-    {
-      putchar ('\n');
-      fflush (stdout);
-    }
-}
-\f
-/* Given a string containing prerequisites (fully expanded), break it up into
-   a struct dep list.  Enter each of these prereqs into the file database.
- */
-struct dep *
-split_prereqs (char *p)
-{
-  struct dep *new = PARSE_FILE_SEQ (&p, struct dep, MAP_PIPE, NULL,
-                                    PARSEFS_NONE);
-
-  if (*p)
-    {
-      /* Files that follow '|' are "order-only" prerequisites that satisfy the
-         dependency by existing: their modification times are irrelevant.  */
-      struct dep *ood;
-
-      ++p;
-      ood = PARSE_SIMPLE_SEQ (&p, struct dep);
-
-      if (! new)
-        new = ood;
-      else
-        {
-          struct dep *dp;
-          for (dp = new; dp->next != NULL; dp = dp->next)
-            ;
-          dp->next = ood;
-        }
-
-      for (; ood != NULL; ood = ood->next)
-        ood->ignore_mtime = 1;
-    }
-
-  return new;
-}
-
-/* Given a list of prerequisites, enter them into the file database.
-   If STEM is set then first expand patterns using STEM.  */
-struct dep *
-enter_prereqs (struct dep *deps, const char *stem)
-{
-  struct dep *d1;
-
-  if (deps == 0)
-    return 0;
-
-  /* If we have a stem, expand the %'s.  We use patsubst_expand to translate
-     the prerequisites' patterns into plain prerequisite names.  */
-  if (stem)
-    {
-      const char *pattern = "%";
-      char *buffer = variable_expand ("");
-      struct dep *dp = deps, *dl = 0;
-
-      while (dp != 0)
-        {
-          char *percent;
-          int nl = strlen (dp->name) + 1;
-          char *nm = alloca (nl);
-          memcpy (nm, dp->name, nl);
-          percent = find_percent (nm);
-          if (percent)
-            {
-              char *o;
-
-              /* We have to handle empty stems specially, because that
-                 would be equivalent to $(patsubst %,dp->name,) which
-                 will always be empty.  */
-              if (stem[0] == '\0')
-                {
-                  memmove (percent, percent+1, strlen (percent));
-                  o = variable_buffer_output (buffer, nm, strlen (nm) + 1);
-                }
-              else
-                o = patsubst_expand_pat (buffer, stem, pattern, nm,
-                                         pattern+1, percent+1);
-
-              /* If the name expanded to the empty string, ignore it.  */
-              if (buffer[0] == '\0')
-                {
-                  struct dep *df = dp;
-                  if (dp == deps)
-                    dp = deps = deps->next;
-                  else
-                    dp = dl->next = dp->next;
-                  free_dep (df);
-                  continue;
-                }
-
-              /* Save the name.  */
-              dp->name = strcache_add_len (buffer, o - buffer);
-            }
-          dp->stem = stem;
-          dp->staticpattern = 1;
-          dl = dp;
-          dp = dp->next;
-        }
-    }
-
-  /* Enter them as files, unless they need a 2nd expansion.  */
-  for (d1 = deps; d1 != 0; d1 = d1->next)
-    {
-      if (d1->need_2nd_expansion)
-        continue;
-
-      d1->file = lookup_file (d1->name);
-      if (d1->file == 0)
-        d1->file = enter_file (d1->name);
-      d1->staticpattern = 0;
-      d1->name = 0;
-    }
-
-  return deps;
-}
-
-/* Set the intermediate flag.  */
-
-static void
-set_intermediate (const void *item)
-{
-  struct file *f = (struct file *) item;
-  f->intermediate = 1;
-}
-
-/* Expand and parse each dependency line. */
-static void
-expand_deps (struct file *f)
-{
-  struct dep *d;
-  struct dep **dp;
-  const char *file_stem = f->stem;
-  int initialized = 0;
-
-  f->updating = 0;
-
-  /* Walk through the dependencies.  For any dependency that needs 2nd
-     expansion, expand it then insert the result into the list.  */
-  dp = &f->deps;
-  d = f->deps;
-  while (d != 0)
-    {
-      char *p;
-      struct dep *new, *next;
-      char *name = (char *)d->name;
-
-      if (! d->name || ! d->need_2nd_expansion)
-        {
-          /* This one is all set already.  */
-          dp = &d->next;
-          d = d->next;
-          continue;
-        }
-
-      /* If it's from a static pattern rule, convert the patterns into
-         "$*" so they'll expand properly.  */
-      if (d->staticpattern)
-        {
-          char *o = variable_expand ("");
-          o = subst_expand (o, name, "%", "$*", 1, 2, 0);
-          *o = '\0';
-          free (name);
-          d->name = name = xstrdup (variable_buffer);
-          d->staticpattern = 0;
-        }
-
-      /* We're going to do second expansion so initialize file variables for
-         the file. Since the stem for static pattern rules comes from
-         individual dep lines, we will temporarily set f->stem to d->stem.  */
-      if (!initialized)
-        {
-          initialize_file_variables (f, 0);
-          initialized = 1;
-        }
-
-      if (d->stem != 0)
-        f->stem = d->stem;
-
-      set_file_variables (f);
-
-      p = variable_expand_for_file (d->name, f);
-
-      if (d->stem != 0)
-        f->stem = file_stem;
-
-      /* At this point we don't need the name anymore: free it.  */
-      free (name);
-
-      /* Parse the prerequisites and enter them into the file database.  */
-      new = enter_prereqs (split_prereqs (p), d->stem);
-
-      /* If there were no prereqs here (blank!) then throw this one out.  */
-      if (new == 0)
-        {
-          *dp = d->next;
-          free_dep (d);
-          d = *dp;
-          continue;
-        }
-
-      /* Add newly parsed prerequisites.  */
-      next = d->next;
-      *dp = new;
-      for (dp = &new->next, d = new->next; d != 0; dp = &d->next, d = d->next)
-        ;
-      *dp = next;
-      d = *dp;
-    }
-}
-
-/* Reset the updating flag.  */
-
-static void
-reset_updating (const void *item)
-{
-  struct file *f = (struct file *) item;
-  f->updating = 0;
-}
-
-/* For each dependency of each file, make the 'struct dep' point
-   at the appropriate 'struct file' (which may have to be created).
-
-   Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT,
-   and various other special targets.  */
-
-void
-snap_deps (void)
-{
-  struct file *f;
-  struct file *f2;
-  struct dep *d;
-
-  /* Remember that we've done this.  Once we start snapping deps we can no
-     longer define new targets.  */
-  snapped_deps = 1;
-
-  /* Perform second expansion and enter each dependency name as a file.  We
-     must use hash_dump() here because within these loops we likely add new
-     files to the table, possibly causing an in-situ table expansion.
-
-     We only need to do this if second_expansion has been defined; if it
-     hasn't then all deps were expanded as the makefile was read in.  If we
-     ever change make to be able to unset .SECONDARY_EXPANSION this will have
-     to change.  */
-
-  if (second_expansion)
-    {
-      struct file **file_slot_0 = (struct file **) hash_dump (&files, 0, 0);
-      struct file **file_end = file_slot_0 + files.ht_fill;
-      struct file **file_slot;
-      const char *suffixes;
-
-      /* Expand .SUFFIXES: its prerequisites are used for $$* calc.  */
-      f = lookup_file (".SUFFIXES");
-      suffixes = f ? f->name : 0;
-      for (; f != 0; f = f->prev)
-        expand_deps (f);
-
-      /* For every target that's not .SUFFIXES, expand its prerequisites.  */
-
-      for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
-        for (f = *file_slot; f != 0; f = f->prev)
-          if (f->name != suffixes)
-            expand_deps (f);
-      free (file_slot_0);
-    }
-  else
-    /* We're not doing second expansion, so reset updating.  */
-    hash_map (&files, reset_updating);
-
-  /* Now manage all the special targets.  */
-
-  for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev)
-    for (d = f->deps; d != 0; d = d->next)
-      for (f2 = d->file; f2 != 0; f2 = f2->prev)
-        f2->precious = 1;
-
-  for (f = lookup_file (".LOW_RESOLUTION_TIME"); f != 0; f = f->prev)
-    for (d = f->deps; d != 0; d = d->next)
-      for (f2 = d->file; f2 != 0; f2 = f2->prev)
-        f2->low_resolution_time = 1;
-
-  for (f = lookup_file (".PHONY"); f != 0; f = f->prev)
-    for (d = f->deps; d != 0; d = d->next)
-      for (f2 = d->file; f2 != 0; f2 = f2->prev)
-        {
-          /* Mark this file as phony nonexistent target.  */
-          f2->phony = 1;
-          f2->is_target = 1;
-          f2->last_mtime = NONEXISTENT_MTIME;
-          f2->mtime_before_update = NONEXISTENT_MTIME;
-        }
-
-  for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev)
-    /* Mark .INTERMEDIATE deps as intermediate files.  */
-    for (d = f->deps; d != 0; d = d->next)
-      for (f2 = d->file; f2 != 0; f2 = f2->prev)
-        f2->intermediate = 1;
-    /* .INTERMEDIATE with no deps does nothing.
-       Marking all files as intermediates is useless since the goal targets
-       would be deleted after they are built.  */
-
-  for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev)
-    /* Mark .SECONDARY deps as both intermediate and secondary.  */
-    if (f->deps)
-      for (d = f->deps; d != 0; d = d->next)
-        for (f2 = d->file; f2 != 0; f2 = f2->prev)
-          f2->intermediate = f2->secondary = 1;
-    /* .SECONDARY with no deps listed marks *all* files that way.  */
-    else
-      {
-        all_secondary = 1;
-        hash_map (&files, set_intermediate);
-      }
-
-  f = lookup_file (".EXPORT_ALL_VARIABLES");
-  if (f != 0 && f->is_target)
-    export_all_variables = 1;
-
-  f = lookup_file (".IGNORE");
-  if (f != 0 && f->is_target)
-    {
-      if (f->deps == 0)
-        ignore_errors_flag = 1;
-      else
-        for (d = f->deps; d != 0; d = d->next)
-          for (f2 = d->file; f2 != 0; f2 = f2->prev)
-            f2->command_flags |= COMMANDS_NOERROR;
-    }
-
-  f = lookup_file (".SILENT");
-  if (f != 0 && f->is_target)
-    {
-      if (f->deps == 0)
-        silent_flag = 1;
-      else
-        for (d = f->deps; d != 0; d = d->next)
-          for (f2 = d->file; f2 != 0; f2 = f2->prev)
-            f2->command_flags |= COMMANDS_SILENT;
-    }
-
-  f = lookup_file (".NOTPARALLEL");
-  if (f != 0 && f->is_target)
-    not_parallel = 1;
-
-#ifndef NO_MINUS_C_MINUS_O
-  /* If .POSIX was defined, remove OUTPUT_OPTION to comply.  */
-  /* This needs more work: what if the user sets this in the makefile?
-  if (posix_pedantic)
-    define_variable_cname ("OUTPUT_OPTION", "", o_default, 1);
-  */
-#endif
-}
-\f
-/* Set the 'command_state' member of FILE and all its 'also_make's.  */
-
-void
-set_command_state (struct file *file, enum cmd_state state)
-{
-  struct dep *d;
-
-  file->command_state = state;
-
-  for (d = file->also_make; d != 0; d = d->next)
-    d->file->command_state = state;
-}
-\f
-/* Convert an external file timestamp to internal form.  */
-
-FILE_TIMESTAMP
-file_timestamp_cons (const char *fname, time_t stamp, long int ns)
-{
-  int offset = ORDINARY_MTIME_MIN + (FILE_TIMESTAMP_HI_RES ? ns : 0);
-  FILE_TIMESTAMP s = stamp;
-  FILE_TIMESTAMP product = (FILE_TIMESTAMP) s << FILE_TIMESTAMP_LO_BITS;
-  FILE_TIMESTAMP ts = product + offset;
-
-  if (! (s <= FILE_TIMESTAMP_S (ORDINARY_MTIME_MAX)
-         && product <= ts && ts <= ORDINARY_MTIME_MAX))
-    {
-      char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
-      const char *f = fname ? fname : _("Current time");
-      ts = s <= OLD_MTIME ? ORDINARY_MTIME_MIN : ORDINARY_MTIME_MAX;
-      file_timestamp_sprintf (buf, ts);
-      OSS (error, NILF,
-           _("%s: Timestamp out of range; substituting %s"), f, buf);
-    }
-
-  return ts;
-}
-\f
-/* Return the current time as a file timestamp, setting *RESOLUTION to
-   its resolution.  */
-FILE_TIMESTAMP
-file_timestamp_now (int *resolution)
-{
-  int r;
-  time_t s;
-  int ns;
-
-  /* Don't bother with high-resolution clocks if file timestamps have
-     only one-second resolution.  The code below should work, but it's
-     not worth the hassle of debugging it on hosts where it fails.  */
-#if FILE_TIMESTAMP_HI_RES
-# if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME
-  {
-    struct timespec timespec;
-    if (clock_gettime (CLOCK_REALTIME, &timespec) == 0)
-      {
-        r = 1;
-        s = timespec.tv_sec;
-        ns = timespec.tv_nsec;
-        goto got_time;
-      }
-  }
-# endif
-# if HAVE_GETTIMEOFDAY
-  {
-    struct timeval timeval;
-    if (gettimeofday (&timeval, 0) == 0)
-      {
-        r = 1000;
-        s = timeval.tv_sec;
-        ns = timeval.tv_usec * 1000;
-        goto got_time;
-      }
-  }
-# endif
-#endif
-
-  r = 1000000000;
-  s = time ((time_t *) 0);
-  ns = 0;
-
-#if FILE_TIMESTAMP_HI_RES
- got_time:
-#endif
-  *resolution = r;
-  return file_timestamp_cons (0, s, ns);
-}
-
-/* Place into the buffer P a printable representation of the file
-   timestamp TS.  */
-void
-file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts)
-{
-  time_t t = FILE_TIMESTAMP_S (ts);
-  struct tm *tm = localtime (&t);
-
-  if (tm)
-    sprintf (p, "%04d-%02d-%02d %02d:%02d:%02d",
-             tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
-             tm->tm_hour, tm->tm_min, tm->tm_sec);
-  else if (t < 0)
-    sprintf (p, "%ld", (long) t);
-  else
-    sprintf (p, "%lu", (unsigned long) t);
-  p += strlen (p);
-
-  /* Append nanoseconds as a fraction, but remove trailing zeros.  We don't
-     know the actual timestamp resolution, since clock_getres applies only to
-     local times, whereas this timestamp might come from a remote filesystem.
-     So removing trailing zeros is the best guess that we can do.  */
-  sprintf (p, ".%09d", FILE_TIMESTAMP_NS (ts));
-  p += strlen (p) - 1;
-  while (*p == '0')
-    p--;
-  p += *p != '.';
-
-  *p = '\0';
-}
-\f
-/* Print the data base of files.  */
-
-void
-print_prereqs (const struct dep *deps)
-{
-  const struct dep *ood = 0;
-
-  /* Print all normal dependencies; note any order-only deps.  */
-  for (; deps != 0; deps = deps->next)
-    if (! deps->ignore_mtime)
-      printf (" %s", dep_name (deps));
-    else if (! ood)
-      ood = deps;
-
-  /* Print order-only deps, if we have any.  */
-  if (ood)
-    {
-      printf (" | %s", dep_name (ood));
-      for (ood = ood->next; ood != 0; ood = ood->next)
-        if (ood->ignore_mtime)
-          printf (" %s", dep_name (ood));
-    }
-
-  putchar ('\n');
-}
-
-static void
-print_file (const void *item)
-{
-  const struct file *f = item;
-
-  /* If we're not using builtin targets, don't show them.
-
-     Ideally we'd be able to delete them altogether but currently there's no
-     facility to ever delete a file once it's been added.  */
-  if (no_builtin_rules_flag && f->builtin)
-    return;
-
-  putchar ('\n');
-
-  if (f->cmds && f->cmds->recipe_prefix != cmd_prefix)
-    {
-      fputs (".RECIPEPREFIX = ", stdout);
-      cmd_prefix = f->cmds->recipe_prefix;
-      if (cmd_prefix != RECIPEPREFIX_DEFAULT)
-        putchar (cmd_prefix);
-      putchar ('\n');
-    }
-
-  if (f->variables != 0)
-    print_target_variables (f);
-
-  if (!f->is_target)
-    puts (_("# Not a target:"));
-  printf ("%s:%s", f->name, f->double_colon ? ":" : "");
-  print_prereqs (f->deps);
-
-  if (f->precious)
-    puts (_("#  Precious file (prerequisite of .PRECIOUS)."));
-  if (f->phony)
-    puts (_("#  Phony target (prerequisite of .PHONY)."));
-  if (f->cmd_target)
-    puts (_("#  Command line target."));
-  if (f->dontcare)
-    puts (_("#  A default, MAKEFILES, or -include/sinclude makefile."));
-  if (f->builtin)
-    puts (_("#  Builtin rule"));
-  puts (f->tried_implicit
-        ? _("#  Implicit rule search has been done.")
-        : _("#  Implicit rule search has not been done."));
-  if (f->stem != 0)
-    printf (_("#  Implicit/static pattern stem: '%s'\n"), f->stem);
-  if (f->intermediate)
-    puts (_("#  File is an intermediate prerequisite."));
-  if (f->also_make != 0)
-    {
-      const struct dep *d;
-      fputs (_("#  Also makes:"), stdout);
-      for (d = f->also_make; d != 0; d = d->next)
-        printf (" %s", dep_name (d));
-      putchar ('\n');
-    }
-  if (f->last_mtime == UNKNOWN_MTIME)
-    puts (_("#  Modification time never checked."));
-  else if (f->last_mtime == NONEXISTENT_MTIME)
-    puts (_("#  File does not exist."));
-  else if (f->last_mtime == OLD_MTIME)
-    puts (_("#  File is very old."));
-  else
-    {
-      char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
-      file_timestamp_sprintf (buf, f->last_mtime);
-      printf (_("#  Last modified %s\n"), buf);
-    }
-  puts (f->updated
-        ? _("#  File has been updated.") : _("#  File has not been updated."));
-  switch (f->command_state)
-    {
-    case cs_running:
-      puts (_("#  Recipe currently running (THIS IS A BUG)."));
-      break;
-    case cs_deps_running:
-      puts (_("#  Dependencies recipe running (THIS IS A BUG)."));
-      break;
-    case cs_not_started:
-    case cs_finished:
-      switch (f->update_status)
-        {
-        case us_none:
-          break;
-        case us_success:
-          puts (_("#  Successfully updated."));
-          break;
-        case us_question:
-          assert (question_flag);
-          puts (_("#  Needs to be updated (-q is set)."));
-          break;
-        case us_failed:
-          puts (_("#  Failed to be updated."));
-          break;
-        }
-      break;
-    default:
-      puts (_("#  Invalid value in 'command_state' member!"));
-      fflush (stdout);
-      fflush (stderr);
-      abort ();
-    }
-
-  if (f->variables != 0)
-    print_file_variables (f);
-
-  if (f->cmds != 0)
-    print_commands (f->cmds);
-
-  if (f->prev)
-    print_file ((const void *) f->prev);
-}
-
-void
-print_file_data_base (void)
-{
-  puts (_("\n# Files"));
-
-  hash_map (&files, print_file);
-
-  fputs (_("\n# files hash-table stats:\n# "), stdout);
-  hash_print_stats (&files, stdout);
-}
-\f
-/* Verify the integrity of the data base of files.  */
-
-#define VERIFY_CACHED(_p,_n) \
-    do{                                                                       \
-        if (_p->_n && _p->_n[0] && !strcache_iscached (_p->_n))               \
-          error (NULL, strlen (_p->name) + CSTRLEN (# _n) + strlen (_p->_n),  \
-                 _("%s: Field '%s' not cached: %s"), _p->name, # _n, _p->_n); \
-    }while(0)
-
-static void
-verify_file (const void *item)
-{
-  const struct file *f = item;
-  const struct dep *d;
-
-  VERIFY_CACHED (f, name);
-  VERIFY_CACHED (f, hname);
-  VERIFY_CACHED (f, vpath);
-  VERIFY_CACHED (f, stem);
-
-  /* Check the deps.  */
-  for (d = f->deps; d != 0; d = d->next)
-    {
-      if (! d->need_2nd_expansion)
-        VERIFY_CACHED (d, name);
-      VERIFY_CACHED (d, stem);
-    }
-}
-
-void
-verify_file_data_base (void)
-{
-  hash_map (&files, verify_file);
-}
-
-#define EXPANSION_INCREMENT(_l)  ((((_l) / 500) + 1) * 500)
-
-char *
-build_target_list (char *value)
-{
-  static unsigned long last_targ_count = 0;
-
-  if (files.ht_fill != last_targ_count)
-    {
-      unsigned long max = EXPANSION_INCREMENT (strlen (value));
-      unsigned long len;
-      char *p;
-      struct file **fp = (struct file **) files.ht_vec;
-      struct file **end = &fp[files.ht_size];
-
-      /* Make sure we have at least MAX bytes in the allocated buffer.  */
-      value = xrealloc (value, max);
-
-      p = value;
-      len = 0;
-      for (; fp < end; ++fp)
-        if (!HASH_VACANT (*fp) && (*fp)->is_target)
-          {
-            struct file *f = *fp;
-            int l = strlen (f->name);
-
-            len += l + 1;
-            if (len > max)
-              {
-                unsigned long off = p - value;
-
-                max += EXPANSION_INCREMENT (l + 1);
-                value = xrealloc (value, max);
-                p = &value[off];
-              }
-
-            memcpy (p, f->name, l);
-            p += l;
-            *(p++) = ' ';
-          }
-      *(p-1) = '\0';
-
-      last_targ_count = files.ht_fill;
-    }
-
-  return value;
-}
-
-void
-init_hash_files (void)
-{
-  hash_init (&files, 1000, file_hash_1, file_hash_2, file_hash_cmp);
-}
-
-/* EOF */
diff --git a/filedef.h b/filedef.h
deleted file mode 100644 (file)
index 14b4187..0000000
--- a/filedef.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/* Definition of target file data structures for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* Structure that represents the info on one file
-   that the makefile says how to make.
-   All of these are chained together through 'next'.  */
-
-#include "hash.h"
-
-struct file
-  {
-    const char *name;
-    const char *hname;          /* Hashed filename */
-    const char *vpath;          /* VPATH/vpath pathname */
-    struct dep *deps;           /* all dependencies, including duplicates */
-    struct commands *cmds;      /* Commands to execute for this target.  */
-    const char *stem;           /* Implicit stem, if an implicit
-                                   rule has been used */
-    struct dep *also_make;      /* Targets that are made by making this.  */
-    struct file *prev;          /* Previous entry for same file name;
-                                   used when there are multiple double-colon
-                                   entries for the same file.  */
-    struct file *last;          /* Last entry for the same file name.  */
-
-    /* File that this file was renamed to.  After any time that a
-       file could be renamed, call 'check_renamed' (below).  */
-    struct file *renamed;
-
-    /* List of variable sets used for this file.  */
-    struct variable_set_list *variables;
-
-    /* Pattern-specific variable reference for this target, or null if there
-       isn't one.  Also see the pat_searched flag, below.  */
-    struct variable_set_list *pat_variables;
-
-    /* Immediate dependent that caused this target to be remade,
-       or nil if there isn't one.  */
-    struct file *parent;
-
-    /* For a double-colon entry, this is the first double-colon entry for
-       the same file.  Otherwise this is null.  */
-    struct file *double_colon;
-
-    FILE_TIMESTAMP last_mtime;  /* File's modtime, if already known.  */
-    FILE_TIMESTAMP mtime_before_update; /* File's modtime before any updating
-                                           has been performed.  */
-    unsigned int considered;    /* equal to 'considered' if file has been
-                                   considered on current scan of goal chain */
-    int command_flags;          /* Flags OR'd in for cmds; see commands.h.  */
-    enum update_status          /* Status of the last attempt to update.  */
-      {
-        us_success = 0,         /* Successfully updated.  Must be 0!  */
-        us_none,                /* No attempt to update has been made.  */
-        us_question,            /* Needs to be updated (-q is is set).  */
-        us_failed               /* Update failed.  */
-      } update_status ENUM_BITFIELD (2);
-    enum cmd_state              /* State of the commands.  */
-      {
-        cs_not_started = 0,     /* Not yet started.  Must be 0!  */
-        cs_deps_running,        /* Dep commands running.  */
-        cs_running,             /* Commands running.  */
-        cs_finished             /* Commands finished.  */
-      } command_state ENUM_BITFIELD (2);
-
-    unsigned int builtin:1;     /* True if the file is a builtin rule. */
-    unsigned int precious:1;    /* Non-0 means don't delete file on quit */
-    unsigned int loaded:1;      /* True if the file is a loaded object. */
-    unsigned int low_resolution_time:1; /* Nonzero if this file's time stamp
-                                           has only one-second resolution.  */
-    unsigned int tried_implicit:1; /* Nonzero if have searched
-                                      for implicit rule for making
-                                      this file; don't search again.  */
-    unsigned int updating:1;    /* Nonzero while updating deps of this file */
-    unsigned int updated:1;     /* Nonzero if this file has been remade.  */
-    unsigned int is_target:1;   /* Nonzero if file is described as target.  */
-    unsigned int cmd_target:1;  /* Nonzero if file was given on cmd line.  */
-    unsigned int phony:1;       /* Nonzero if this is a phony file
-                                   i.e., a prerequisite of .PHONY.  */
-    unsigned int intermediate:1;/* Nonzero if this is an intermediate file.  */
-    unsigned int secondary:1;   /* Nonzero means remove_intermediates should
-                                   not delete it.  */
-    unsigned int dontcare:1;    /* Nonzero if no complaint is to be made if
-                                   this target cannot be remade.  */
-    unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name.  */
-    unsigned int pat_searched:1;/* Nonzero if we already searched for
-                                   pattern-specific variables.  */
-    unsigned int no_diag:1;     /* True if the file failed to update and no
-                                   diagnostics has been issued (dontcare). */
-  };
-
-
-extern struct file *default_file;
-
-
-struct file *lookup_file (const char *name);
-struct file *enter_file (const char *name);
-struct dep *split_prereqs (char *prereqstr);
-struct dep *enter_prereqs (struct dep *prereqs, const char *stem);
-void remove_intermediates (int sig);
-void snap_deps (void);
-void rename_file (struct file *file, const char *name);
-void rehash_file (struct file *file, const char *name);
-void set_command_state (struct file *file, enum cmd_state state);
-void notice_finished_file (struct file *file);
-void init_hash_files (void);
-void verify_file_data_base (void);
-char *build_target_list (char *old_list);
-void print_prereqs (const struct dep *deps);
-void print_file_data_base (void);
-int try_implicit_rule (struct file *file, unsigned int depth);
-int stemlen_compare (const void *v1, const void *v2);
-
-#if FILE_TIMESTAMP_HI_RES
-# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
-    file_timestamp_cons (fname, (st).st_mtime, (st).ST_MTIM_NSEC)
-#else
-# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
-    file_timestamp_cons (fname, (st).st_mtime, 0)
-#endif
-
-/* If FILE_TIMESTAMP is 64 bits (or more), use nanosecond resolution.
-   (Multiply by 2**30 instead of by 10**9 to save time at the cost of
-   slightly decreasing the number of available timestamps.)  With
-   64-bit FILE_TIMESTAMP, this stops working on 2514-05-30 01:53:04
-   UTC, but by then uintmax_t should be larger than 64 bits.  */
-#define FILE_TIMESTAMPS_PER_S (FILE_TIMESTAMP_HI_RES ? 1000000000 : 1)
-#define FILE_TIMESTAMP_LO_BITS (FILE_TIMESTAMP_HI_RES ? 30 : 0)
-
-#define FILE_TIMESTAMP_S(ts) (((ts) - ORDINARY_MTIME_MIN) \
-                              >> FILE_TIMESTAMP_LO_BITS)
-#define FILE_TIMESTAMP_NS(ts) ((int) (((ts) - ORDINARY_MTIME_MIN) \
-                                      & ((1 << FILE_TIMESTAMP_LO_BITS) - 1)))
-
-/* Upper bound on length of string "YYYY-MM-DD HH:MM:SS.NNNNNNNNN"
-   representing a file timestamp.  The upper bound is not necessarily 29,
-   since the year might be less than -999 or greater than 9999.
-
-   Subtract one for the sign bit if in case file timestamps can be negative;
-   subtract FLOOR_LOG2_SECONDS_PER_YEAR to yield an upper bound on how many
-   file timestamp bits might affect the year;
-   302 / 1000 is log10 (2) rounded up;
-   add one for integer division truncation;
-   add one more for a minus sign if file timestamps can be negative;
-   add 4 to allow for any 4-digit epoch year (e.g. 1970);
-   add 25 to allow for "-MM-DD HH:MM:SS.NNNNNNNNN".  */
-#define FLOOR_LOG2_SECONDS_PER_YEAR 24
-#define FILE_TIMESTAMP_PRINT_LEN_BOUND \
-  (((sizeof (FILE_TIMESTAMP) * CHAR_BIT - 1 - FLOOR_LOG2_SECONDS_PER_YEAR) \
-    * 302 / 1000) \
-   + 1 + 1 + 4 + 25)
-
-FILE_TIMESTAMP file_timestamp_cons (char const *, time_t, long int);
-FILE_TIMESTAMP file_timestamp_now (int *);
-void file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts);
-
-/* Return the mtime of file F (a struct file *), caching it.
-   The value is NONEXISTENT_MTIME if the file does not exist.  */
-#define file_mtime(f) file_mtime_1 ((f), 1)
-/* Return the mtime of file F (a struct file *), caching it.
-   Don't search using vpath for the file--if it doesn't actually exist,
-   we don't find it.
-   The value is NONEXISTENT_MTIME if the file does not exist.  */
-#define file_mtime_no_search(f) file_mtime_1 ((f), 0)
-FILE_TIMESTAMP f_mtime (struct file *file, int search);
-#define file_mtime_1(f, v) \
-  ((f)->last_mtime == UNKNOWN_MTIME ? f_mtime ((f), v) : (f)->last_mtime)
-
-/* Special timestamp values.  */
-
-/* The file's timestamp is not yet known.  */
-#define UNKNOWN_MTIME 0
-
-/* The file does not exist.  */
-#define NONEXISTENT_MTIME 1
-
-/* The file does not exist, and we assume that it is older than any
-   actual file.  */
-#define OLD_MTIME 2
-
-/* The smallest and largest ordinary timestamps.  */
-#define ORDINARY_MTIME_MIN (OLD_MTIME + 1)
-#define ORDINARY_MTIME_MAX ((FILE_TIMESTAMP_S (NEW_MTIME) \
-                             << FILE_TIMESTAMP_LO_BITS) \
-                            + ORDINARY_MTIME_MIN + FILE_TIMESTAMPS_PER_S - 1)
-
-/* Modtime value to use for 'infinitely new'.  We used to get the current time
-   from the system and use that whenever we wanted 'new'.  But that causes
-   trouble when the machine running make and the machine holding a file have
-   different ideas about what time it is; and can also lose for 'force'
-   targets, which need to be considered newer than anything that depends on
-   them, even if said dependents' modtimes are in the future.  */
-#define NEW_MTIME INTEGER_TYPE_MAXIMUM (FILE_TIMESTAMP)
-
-#define check_renamed(file) \
-  while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here.  */
-
-/* Have we snapped deps yet?  */
-extern int snapped_deps;
diff --git a/function.c b/function.c
deleted file mode 100644 (file)
index b7f0e56..0000000
+++ /dev/null
@@ -1,2682 +0,0 @@
-/* Builtin function expansion for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "variable.h"
-#include "dep.h"
-#include "job.h"
-#include "commands.h"
-#include "debug.h"
-
-#ifdef _AMIGA
-#include "amiga.h"
-#endif
-
-
-struct function_table_entry
-  {
-    union {
-      char *(*func_ptr) (char *output, char **argv, const char *fname);
-      gmk_func_ptr alloc_func_ptr;
-    } fptr;
-    const char *name;
-    unsigned char len;
-    unsigned char minimum_args;
-    unsigned char maximum_args;
-    unsigned char expand_args:1;
-    unsigned char alloc_fn:1;
-  };
-
-static unsigned long
-function_table_entry_hash_1 (const void *keyv)
-{
-  const struct function_table_entry *key = keyv;
-  return_STRING_N_HASH_1 (key->name, key->len);
-}
-
-static unsigned long
-function_table_entry_hash_2 (const void *keyv)
-{
-  const struct function_table_entry *key = keyv;
-  return_STRING_N_HASH_2 (key->name, key->len);
-}
-
-static int
-function_table_entry_hash_cmp (const void *xv, const void *yv)
-{
-  const struct function_table_entry *x = xv;
-  const struct function_table_entry *y = yv;
-  int result = x->len - y->len;
-  if (result)
-    return result;
-  return_STRING_N_COMPARE (x->name, y->name, x->len);
-}
-
-static struct hash_table function_table;
-\f
-
-/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
-   each occurrence of SUBST with REPLACE. TEXT is null-terminated.  SLEN is
-   the length of SUBST and RLEN is the length of REPLACE.  If BY_WORD is
-   nonzero, substitutions are done only on matches which are complete
-   whitespace-delimited words.  */
-
-char *
-subst_expand (char *o, const char *text, const char *subst, const char *replace,
-              unsigned int slen, unsigned int rlen, int by_word)
-{
-  const char *t = text;
-  const char *p;
-
-  if (slen == 0 && !by_word)
-    {
-      /* The first occurrence of "" in any string is its end.  */
-      o = variable_buffer_output (o, t, strlen (t));
-      if (rlen > 0)
-        o = variable_buffer_output (o, replace, rlen);
-      return o;
-    }
-
-  do
-    {
-      if (by_word && slen == 0)
-        /* When matching by words, the empty string should match
-           the end of each word, rather than the end of the whole text.  */
-        p = end_of_token (next_token (t));
-      else
-        {
-          p = strstr (t, subst);
-          if (p == 0)
-            {
-              /* No more matches.  Output everything left on the end.  */
-              o = variable_buffer_output (o, t, strlen (t));
-              return o;
-            }
-        }
-
-      /* Output everything before this occurrence of the string to replace.  */
-      if (p > t)
-        o = variable_buffer_output (o, t, p - t);
-
-      /* If we're substituting only by fully matched words,
-         or only at the ends of words, check that this case qualifies.  */
-      if (by_word
-          && ((p > text && !ISSPACE (p[-1]))
-              || ! STOP_SET (p[slen], MAP_SPACE|MAP_NUL)))
-        /* Struck out.  Output the rest of the string that is
-           no longer to be replaced.  */
-        o = variable_buffer_output (o, subst, slen);
-      else if (rlen > 0)
-        /* Output the replacement string.  */
-        o = variable_buffer_output (o, replace, rlen);
-
-      /* Advance T past the string to be replaced.  */
-      t = p + slen;
-    } while (*t != '\0');
-
-  return o;
-}
-\f
-
-/* Store into VARIABLE_BUFFER at O the result of scanning TEXT
-   and replacing strings matching PATTERN with REPLACE.
-   If PATTERN_PERCENT is not nil, PATTERN has already been
-   run through find_percent, and PATTERN_PERCENT is the result.
-   If REPLACE_PERCENT is not nil, REPLACE has already been
-   run through find_percent, and REPLACE_PERCENT is the result.
-   Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
-   character _AFTER_ the %, not to the % itself.
-*/
-
-char *
-patsubst_expand_pat (char *o, const char *text,
-                     const char *pattern, const char *replace,
-                     const char *pattern_percent, const char *replace_percent)
-{
-  unsigned int pattern_prepercent_len, pattern_postpercent_len;
-  unsigned int replace_prepercent_len, replace_postpercent_len;
-  const char *t;
-  unsigned int len;
-  int doneany = 0;
-
-  /* Record the length of REPLACE before and after the % so we don't have to
-     compute these lengths more than once.  */
-  if (replace_percent)
-    {
-      replace_prepercent_len = replace_percent - replace - 1;
-      replace_postpercent_len = strlen (replace_percent);
-    }
-  else
-    {
-      replace_prepercent_len = strlen (replace);
-      replace_postpercent_len = 0;
-    }
-
-  if (!pattern_percent)
-    /* With no % in the pattern, this is just a simple substitution.  */
-    return subst_expand (o, text, pattern, replace,
-                         strlen (pattern), strlen (replace), 1);
-
-  /* Record the length of PATTERN before and after the %
-     so we don't have to compute it more than once.  */
-  pattern_prepercent_len = pattern_percent - pattern - 1;
-  pattern_postpercent_len = strlen (pattern_percent);
-
-  while ((t = find_next_token (&text, &len)) != 0)
-    {
-      int fail = 0;
-
-      /* Is it big enough to match?  */
-      if (len < pattern_prepercent_len + pattern_postpercent_len)
-        fail = 1;
-
-      /* Does the prefix match? */
-      if (!fail && pattern_prepercent_len > 0
-          && (*t != *pattern
-              || t[pattern_prepercent_len - 1] != pattern_percent[-2]
-              || !strneq (t + 1, pattern + 1, pattern_prepercent_len - 1)))
-        fail = 1;
-
-      /* Does the suffix match? */
-      if (!fail && pattern_postpercent_len > 0
-          && (t[len - 1] != pattern_percent[pattern_postpercent_len - 1]
-              || t[len - pattern_postpercent_len] != *pattern_percent
-              || !strneq (&t[len - pattern_postpercent_len],
-                          pattern_percent, pattern_postpercent_len - 1)))
-        fail = 1;
-
-      if (fail)
-        /* It didn't match.  Output the string.  */
-        o = variable_buffer_output (o, t, len);
-      else
-        {
-          /* It matched.  Output the replacement.  */
-
-          /* Output the part of the replacement before the %.  */
-          o = variable_buffer_output (o, replace, replace_prepercent_len);
-
-          if (replace_percent != 0)
-            {
-              /* Output the part of the matched string that
-                 matched the % in the pattern.  */
-              o = variable_buffer_output (o, t + pattern_prepercent_len,
-                                          len - (pattern_prepercent_len
-                                                 + pattern_postpercent_len));
-              /* Output the part of the replacement after the %.  */
-              o = variable_buffer_output (o, replace_percent,
-                                          replace_postpercent_len);
-            }
-        }
-
-      /* Output a space, but not if the replacement is "".  */
-      if (fail || replace_prepercent_len > 0
-          || (replace_percent != 0 && len + replace_postpercent_len > 0))
-        {
-          o = variable_buffer_output (o, " ", 1);
-          doneany = 1;
-        }
-    }
-  if (doneany)
-    /* Kill the last space.  */
-    --o;
-
-  return o;
-}
-
-/* Store into VARIABLE_BUFFER at O the result of scanning TEXT
-   and replacing strings matching PATTERN with REPLACE.
-   If PATTERN_PERCENT is not nil, PATTERN has already been
-   run through find_percent, and PATTERN_PERCENT is the result.
-   If REPLACE_PERCENT is not nil, REPLACE has already been
-   run through find_percent, and REPLACE_PERCENT is the result.
-   Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
-   character _AFTER_ the %, not to the % itself.
-*/
-
-char *
-patsubst_expand (char *o, const char *text, char *pattern, char *replace)
-{
-  const char *pattern_percent = find_percent (pattern);
-  const char *replace_percent = find_percent (replace);
-
-  /* If there's a percent in the pattern or replacement skip it.  */
-  if (replace_percent)
-    ++replace_percent;
-  if (pattern_percent)
-    ++pattern_percent;
-
-  return patsubst_expand_pat (o, text, pattern, replace,
-                              pattern_percent, replace_percent);
-}
-\f
-
-/* Look up a function by name.  */
-
-static const struct function_table_entry *
-lookup_function (const char *s)
-{
-  struct function_table_entry function_table_entry_key;
-  const char *e = s;
-
-  while (STOP_SET (*e, MAP_USERFUNC))
-    e++;
-
-  if (e == s || !STOP_SET(*e, MAP_NUL|MAP_SPACE))
-    return NULL;
-
-  function_table_entry_key.name = s;
-  function_table_entry_key.len = e - s;
-
-  return hash_find_item (&function_table, &function_table_entry_key);
-}
-\f
-
-/* Return 1 if PATTERN matches STR, 0 if not.  */
-
-int
-pattern_matches (const char *pattern, const char *percent, const char *str)
-{
-  unsigned int sfxlen, strlength;
-
-  if (percent == 0)
-    {
-      unsigned int len = strlen (pattern) + 1;
-      char *new_chars = alloca (len);
-      memcpy (new_chars, pattern, len);
-      percent = find_percent (new_chars);
-      if (percent == 0)
-        return streq (new_chars, str);
-      pattern = new_chars;
-    }
-
-  sfxlen = strlen (percent + 1);
-  strlength = strlen (str);
-
-  if (strlength < (percent - pattern) + sfxlen
-      || !strneq (pattern, str, percent - pattern))
-    return 0;
-
-  return !strcmp (percent + 1, str + (strlength - sfxlen));
-}
-\f
-
-/* Find the next comma or ENDPAREN (counting nested STARTPAREN and
-   ENDPARENtheses), starting at PTR before END.  Return a pointer to
-   next character.
-
-   If no next argument is found, return NULL.
-*/
-
-static char *
-find_next_argument (char startparen, char endparen,
-                    const char *ptr, const char *end)
-{
-  int count = 0;
-
-  for (; ptr < end; ++ptr)
-    if (*ptr == startparen)
-      ++count;
-
-    else if (*ptr == endparen)
-      {
-        --count;
-        if (count < 0)
-          return NULL;
-      }
-
-    else if (*ptr == ',' && !count)
-      return (char *)ptr;
-
-  /* We didn't find anything.  */
-  return NULL;
-}
-\f
-
-/* Glob-expand LINE.  The returned pointer is
-   only good until the next call to string_glob.  */
-
-static char *
-string_glob (char *line)
-{
-  static char *result = 0;
-  static unsigned int length;
-  struct nameseq *chain;
-  unsigned int idx;
-
-  chain = PARSE_FILE_SEQ (&line, struct nameseq, MAP_NUL, NULL,
-                          /* We do not want parse_file_seq to strip './'s.
-                             That would break examples like:
-                             $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)).  */
-                          PARSEFS_NOSTRIP|PARSEFS_NOCACHE|PARSEFS_EXISTS);
-
-  if (result == 0)
-    {
-      length = 100;
-      result = xmalloc (100);
-    }
-
-  idx = 0;
-  while (chain != 0)
-    {
-      struct nameseq *next = chain->next;
-      unsigned int len = strlen (chain->name);
-
-      if (idx + len + 1 > length)
-        {
-          length += (len + 1) * 2;
-          result = xrealloc (result, length);
-        }
-      memcpy (&result[idx], chain->name, len);
-      idx += len;
-      result[idx++] = ' ';
-
-      /* Because we used PARSEFS_NOCACHE above, we have to free() NAME.  */
-      free ((char *)chain->name);
-      free (chain);
-      chain = next;
-    }
-
-  /* Kill the last space and terminate the string.  */
-  if (idx == 0)
-    result[0] = '\0';
-  else
-    result[idx - 1] = '\0';
-
-  return result;
-}
-\f
-/*
-  Builtin functions
- */
-
-static char *
-func_patsubst (char *o, char **argv, const char *funcname UNUSED)
-{
-  o = patsubst_expand (o, argv[2], argv[0], argv[1]);
-  return o;
-}
-
-
-static char *
-func_join (char *o, char **argv, const char *funcname UNUSED)
-{
-  int doneany = 0;
-
-  /* Write each word of the first argument directly followed
-     by the corresponding word of the second argument.
-     If the two arguments have a different number of words,
-     the excess words are just output separated by blanks.  */
-  const char *tp;
-  const char *pp;
-  const char *list1_iterator = argv[0];
-  const char *list2_iterator = argv[1];
-  do
-    {
-      unsigned int len1, len2;
-
-      tp = find_next_token (&list1_iterator, &len1);
-      if (tp != 0)
-        o = variable_buffer_output (o, tp, len1);
-
-      pp = find_next_token (&list2_iterator, &len2);
-      if (pp != 0)
-        o = variable_buffer_output (o, pp, len2);
-
-      if (tp != 0 || pp != 0)
-        {
-          o = variable_buffer_output (o, " ", 1);
-          doneany = 1;
-        }
-    }
-  while (tp != 0 || pp != 0);
-  if (doneany)
-    /* Kill the last blank.  */
-    --o;
-
-  return o;
-}
-
-
-static char *
-func_origin (char *o, char **argv, const char *funcname UNUSED)
-{
-  /* Expand the argument.  */
-  struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
-  if (v == 0)
-    o = variable_buffer_output (o, "undefined", 9);
-  else
-    switch (v->origin)
-      {
-      default:
-      case o_invalid:
-        abort ();
-        break;
-      case o_default:
-        o = variable_buffer_output (o, "default", 7);
-        break;
-      case o_env:
-        o = variable_buffer_output (o, "environment", 11);
-        break;
-      case o_file:
-        o = variable_buffer_output (o, "file", 4);
-        break;
-      case o_env_override:
-        o = variable_buffer_output (o, "environment override", 20);
-        break;
-      case o_command:
-        o = variable_buffer_output (o, "command line", 12);
-        break;
-      case o_override:
-        o = variable_buffer_output (o, "override", 8);
-        break;
-      case o_automatic:
-        o = variable_buffer_output (o, "automatic", 9);
-        break;
-      }
-
-  return o;
-}
-
-static char *
-func_flavor (char *o, char **argv, const char *funcname UNUSED)
-{
-  struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
-
-  if (v == 0)
-    o = variable_buffer_output (o, "undefined", 9);
-  else
-    if (v->recursive)
-      o = variable_buffer_output (o, "recursive", 9);
-    else
-      o = variable_buffer_output (o, "simple", 6);
-
-  return o;
-}
-
-
-static char *
-func_notdir_suffix (char *o, char **argv, const char *funcname)
-{
-  /* Expand the argument.  */
-  const char *list_iterator = argv[0];
-  const char *p2;
-  int doneany =0;
-  unsigned int len=0;
-
-  int is_suffix = funcname[0] == 's';
-  int is_notdir = !is_suffix;
-  int stop = MAP_DIRSEP | (is_suffix ? MAP_DOT : 0);
-#ifdef VMS
-  /* For VMS list_iterator points to a comma separated list. To use the common
-     [find_]next_token, create a local copy and replace the commas with
-     spaces. Obviously, there is a problem if there is a ',' in the VMS filename
-     (can only happen on ODS5), the same problem as with spaces in filenames,
-     which seems to be present in make on all platforms. */
-  char *vms_list_iterator = alloca(strlen(list_iterator) + 1);
-  int i;
-  for (i = 0; list_iterator[i]; i++)
-    if (list_iterator[i] == ',')
-      vms_list_iterator[i] = ' ';
-    else
-      vms_list_iterator[i] = list_iterator[i];
-  vms_list_iterator[i] = list_iterator[i];
-  while ((p2 = find_next_token((const char**) &vms_list_iterator, &len)) != 0)
-#else
-  while ((p2 = find_next_token (&list_iterator, &len)) != 0)
-#endif
-    {
-      const char *p = p2 + len - 1;
-
-      while (p >= p2 && ! STOP_SET (*p, stop))
-        --p;
-
-      if (p >= p2)
-        {
-          if (is_notdir)
-            ++p;
-          else if (*p != '.')
-            continue;
-          o = variable_buffer_output (o, p, len - (p - p2));
-        }
-#ifdef HAVE_DOS_PATHS
-      /* Handle the case of "d:foo/bar".  */
-      else if (is_notdir && p2[0] && p2[1] == ':')
-        {
-          p = p2 + 2;
-          o = variable_buffer_output (o, p, len - (p - p2));
-        }
-#endif
-      else if (is_notdir)
-        o = variable_buffer_output (o, p2, len);
-
-      if (is_notdir || p >= p2)
-        {
-#ifdef VMS
-          if (vms_comma_separator)
-            o = variable_buffer_output (o, ",", 1);
-          else
-#endif
-          o = variable_buffer_output (o, " ", 1);
-
-          doneany = 1;
-        }
-    }
-
-  if (doneany)
-    /* Kill last space.  */
-    --o;
-
-  return o;
-}
-
-
-static char *
-func_basename_dir (char *o, char **argv, const char *funcname)
-{
-  /* Expand the argument.  */
-  const char *p3 = argv[0];
-  const char *p2;
-  int doneany = 0;
-  unsigned int len = 0;
-
-  int is_basename = funcname[0] == 'b';
-  int is_dir = !is_basename;
-  int stop = MAP_DIRSEP | (is_basename ? MAP_DOT : 0) | MAP_NUL;
-#ifdef VMS
-  /* As in func_notdir_suffix ... */
-  char *vms_p3 = alloca (strlen(p3) + 1);
-  int i;
-  for (i = 0; p3[i]; i++)
-    if (p3[i] == ',')
-      vms_p3[i] = ' ';
-    else
-      vms_p3[i] = p3[i];
-  vms_p3[i] = p3[i];
-  while ((p2 = find_next_token((const char**) &vms_p3, &len)) != 0)
-#else
-  while ((p2 = find_next_token (&p3, &len)) != 0)
-#endif
-    {
-      const char *p = p2 + len - 1;
-      while (p >= p2 && ! STOP_SET (*p, stop))
-        --p;
-
-      if (p >= p2 && (is_dir))
-        o = variable_buffer_output (o, p2, ++p - p2);
-      else if (p >= p2 && (*p == '.'))
-        o = variable_buffer_output (o, p2, p - p2);
-#ifdef HAVE_DOS_PATHS
-      /* Handle the "d:foobar" case */
-      else if (p2[0] && p2[1] == ':' && is_dir)
-        o = variable_buffer_output (o, p2, 2);
-#endif
-      else if (is_dir)
-#ifdef VMS
-        {
-          extern int vms_report_unix_paths;
-          if (vms_report_unix_paths)
-            o = variable_buffer_output (o, "./", 2);
-          else
-            o = variable_buffer_output (o, "[]", 2);
-        }
-#else
-#ifndef _AMIGA
-      o = variable_buffer_output (o, "./", 2);
-#else
-      ; /* Just a nop...  */
-#endif /* AMIGA */
-#endif /* !VMS */
-      else
-        /* The entire name is the basename.  */
-        o = variable_buffer_output (o, p2, len);
-
-#ifdef VMS
-      if (vms_comma_separator)
-        o = variable_buffer_output (o, ",", 1);
-      else
-#endif
-        o = variable_buffer_output (o, " ", 1);
-
-      doneany = 1;
-    }
-
-  if (doneany)
-    /* Kill last space.  */
-    --o;
-
-  return o;
-}
-
-static char *
-func_addsuffix_addprefix (char *o, char **argv, const char *funcname)
-{
-  int fixlen = strlen (argv[0]);
-  const char *list_iterator = argv[1];
-  int is_addprefix = funcname[3] == 'p';
-  int is_addsuffix = !is_addprefix;
-
-  int doneany = 0;
-  const char *p;
-  unsigned int len;
-
-  while ((p = find_next_token (&list_iterator, &len)) != 0)
-    {
-      if (is_addprefix)
-        o = variable_buffer_output (o, argv[0], fixlen);
-      o = variable_buffer_output (o, p, len);
-      if (is_addsuffix)
-        o = variable_buffer_output (o, argv[0], fixlen);
-      o = variable_buffer_output (o, " ", 1);
-      doneany = 1;
-    }
-
-  if (doneany)
-    /* Kill last space.  */
-    --o;
-
-  return o;
-}
-
-static char *
-func_subst (char *o, char **argv, const char *funcname UNUSED)
-{
-  o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]),
-                    strlen (argv[1]), 0);
-
-  return o;
-}
-
-
-static char *
-func_firstword (char *o, char **argv, const char *funcname UNUSED)
-{
-  unsigned int i;
-  const char *words = argv[0];    /* Use a temp variable for find_next_token */
-  const char *p = find_next_token (&words, &i);
-
-  if (p != 0)
-    o = variable_buffer_output (o, p, i);
-
-  return o;
-}
-
-static char *
-func_lastword (char *o, char **argv, const char *funcname UNUSED)
-{
-  unsigned int i;
-  const char *words = argv[0];    /* Use a temp variable for find_next_token */
-  const char *p = NULL;
-  const char *t;
-
-  while ((t = find_next_token (&words, &i)))
-    p = t;
-
-  if (p != 0)
-    o = variable_buffer_output (o, p, i);
-
-  return o;
-}
-
-static char *
-func_words (char *o, char **argv, const char *funcname UNUSED)
-{
-  int i = 0;
-  const char *word_iterator = argv[0];
-  char buf[20];
-
-  while (find_next_token (&word_iterator, NULL) != 0)
-    ++i;
-
-  sprintf (buf, "%d", i);
-  o = variable_buffer_output (o, buf, strlen (buf));
-
-  return o;
-}
-
-/* Set begpp to point to the first non-whitespace character of the string,
- * and endpp to point to the last non-whitespace character of the string.
- * If the string is empty or contains nothing but whitespace, endpp will be
- * begpp-1.
- */
-char *
-strip_whitespace (const char **begpp, const char **endpp)
-{
-  while (*begpp <= *endpp && ISSPACE (**begpp))
-    (*begpp) ++;
-  while (*endpp >= *begpp && ISSPACE (**endpp))
-    (*endpp) --;
-  return (char *)*begpp;
-}
-
-static void
-check_numeric (const char *s, const char *msg)
-{
-  const char *end = s + strlen (s) - 1;
-  const char *beg = s;
-  strip_whitespace (&s, &end);
-
-  for (; s <= end; ++s)
-    if (!ISDIGIT (*s))  /* ISDIGIT only evals its arg once: see makeint.h.  */
-      break;
-
-  if (s <= end || end - beg < 0)
-    OSS (fatal, *expanding_var, "%s: '%s'", msg, beg);
-}
-
-
-
-static char *
-func_word (char *o, char **argv, const char *funcname UNUSED)
-{
-  const char *end_p;
-  const char *p;
-  int i;
-
-  /* Check the first argument.  */
-  check_numeric (argv[0], _("non-numeric first argument to 'word' function"));
-  i = atoi (argv[0]);
-
-  if (i == 0)
-    O (fatal, *expanding_var,
-       _("first argument to 'word' function must be greater than 0"));
-
-  end_p = argv[1];
-  while ((p = find_next_token (&end_p, 0)) != 0)
-    if (--i == 0)
-      break;
-
-  if (i == 0)
-    o = variable_buffer_output (o, p, end_p - p);
-
-  return o;
-}
-
-static char *
-func_wordlist (char *o, char **argv, const char *funcname UNUSED)
-{
-  int start, count;
-
-  /* Check the arguments.  */
-  check_numeric (argv[0],
-                 _("non-numeric first argument to 'wordlist' function"));
-  check_numeric (argv[1],
-                 _("non-numeric second argument to 'wordlist' function"));
-
-  start = atoi (argv[0]);
-  if (start < 1)
-    ON (fatal, *expanding_var,
-        "invalid first argument to 'wordlist' function: '%d'", start);
-
-  count = atoi (argv[1]) - start + 1;
-
-  if (count > 0)
-    {
-      const char *p;
-      const char *end_p = argv[2];
-
-      /* Find the beginning of the "start"th word.  */
-      while (((p = find_next_token (&end_p, 0)) != 0) && --start)
-        ;
-
-      if (p)
-        {
-          /* Find the end of the "count"th word from start.  */
-          while (--count && (find_next_token (&end_p, 0) != 0))
-            ;
-
-          /* Return the stuff in the middle.  */
-          o = variable_buffer_output (o, p, end_p - p);
-        }
-    }
-
-  return o;
-}
-
-static char *
-func_findstring (char *o, char **argv, const char *funcname UNUSED)
-{
-  /* Find the first occurrence of the first string in the second.  */
-  if (strstr (argv[1], argv[0]) != 0)
-    o = variable_buffer_output (o, argv[0], strlen (argv[0]));
-
-  return o;
-}
-
-static char *
-func_foreach (char *o, char **argv, const char *funcname UNUSED)
-{
-  /* expand only the first two.  */
-  char *varname = expand_argument (argv[0], NULL);
-  char *list = expand_argument (argv[1], NULL);
-  const char *body = argv[2];
-
-  int doneany = 0;
-  const char *list_iterator = list;
-  const char *p;
-  unsigned int len;
-  struct variable *var;
-
-  /* Clean up the variable name by removing whitespace.  */
-  char *vp = next_token (varname);
-  end_of_token (vp)[0] = '\0';
-
-  push_new_variable_scope ();
-  var = define_variable (vp, strlen (vp), "", o_automatic, 0);
-
-  /* loop through LIST,  put the value in VAR and expand BODY */
-  while ((p = find_next_token (&list_iterator, &len)) != 0)
-    {
-      char *result = 0;
-
-      free (var->value);
-      var->value = xstrndup (p, len);
-
-      result = allocated_variable_expand (body);
-
-      o = variable_buffer_output (o, result, strlen (result));
-      o = variable_buffer_output (o, " ", 1);
-      doneany = 1;
-      free (result);
-    }
-
-  if (doneany)
-    /* Kill the last space.  */
-    --o;
-
-  pop_variable_scope ();
-  free (varname);
-  free (list);
-
-  return o;
-}
-
-struct a_word
-{
-  struct a_word *next;
-  struct a_word *chain;
-  char *str;
-  int length;
-  int matched;
-};
-
-static unsigned long
-a_word_hash_1 (const void *key)
-{
-  return_STRING_HASH_1 (((struct a_word const *) key)->str);
-}
-
-static unsigned long
-a_word_hash_2 (const void *key)
-{
-  return_STRING_HASH_2 (((struct a_word const *) key)->str);
-}
-
-static int
-a_word_hash_cmp (const void *x, const void *y)
-{
-  int result = ((struct a_word const *) x)->length - ((struct a_word const *) y)->length;
-  if (result)
-    return result;
-  return_STRING_COMPARE (((struct a_word const *) x)->str,
-                         ((struct a_word const *) y)->str);
-}
-
-struct a_pattern
-{
-  struct a_pattern *next;
-  char *str;
-  char *percent;
-  int length;
-};
-
-static char *
-func_filter_filterout (char *o, char **argv, const char *funcname)
-{
-  struct a_word *wordhead;
-  struct a_word **wordtail;
-  struct a_word *wp;
-  struct a_pattern *pathead;
-  struct a_pattern **pattail;
-  struct a_pattern *pp;
-
-  struct hash_table a_word_table;
-  int is_filter = funcname[CSTRLEN ("filter")] == '\0';
-  const char *pat_iterator = argv[0];
-  const char *word_iterator = argv[1];
-  int literals = 0;
-  int words = 0;
-  int hashing = 0;
-  char *p;
-  unsigned int len;
-
-  /* Chop ARGV[0] up into patterns to match against the words.
-     We don't need to preserve it because our caller frees all the
-     argument memory anyway.  */
-
-  pattail = &pathead;
-  while ((p = find_next_token (&pat_iterator, &len)) != 0)
-    {
-      struct a_pattern *pat = alloca (sizeof (struct a_pattern));
-
-      *pattail = pat;
-      pattail = &pat->next;
-
-      if (*pat_iterator != '\0')
-        ++pat_iterator;
-
-      pat->str = p;
-      p[len] = '\0';
-      pat->percent = find_percent (p);
-      if (pat->percent == 0)
-        literals++;
-
-      /* find_percent() might shorten the string so LEN is wrong.  */
-      pat->length = strlen (pat->str);
-    }
-  *pattail = 0;
-
-  /* Chop ARGV[1] up into words to match against the patterns.  */
-
-  wordtail = &wordhead;
-  while ((p = find_next_token (&word_iterator, &len)) != 0)
-    {
-      struct a_word *word = alloca (sizeof (struct a_word));
-
-      *wordtail = word;
-      wordtail = &word->next;
-
-      if (*word_iterator != '\0')
-        ++word_iterator;
-
-      p[len] = '\0';
-      word->str = p;
-      word->length = len;
-      word->matched = 0;
-      word->chain = 0;
-      words++;
-    }
-  *wordtail = 0;
-
-  /* Only use a hash table if arg list lengths justifies the cost.  */
-  hashing = (literals >= 2 && (literals * words) >= 10);
-  if (hashing)
-    {
-      hash_init (&a_word_table, words, a_word_hash_1, a_word_hash_2,
-                 a_word_hash_cmp);
-      for (wp = wordhead; wp != 0; wp = wp->next)
-        {
-          struct a_word *owp = hash_insert (&a_word_table, wp);
-          if (owp)
-            wp->chain = owp;
-        }
-    }
-
-  if (words)
-    {
-      int doneany = 0;
-
-      /* Run each pattern through the words, killing words.  */
-      for (pp = pathead; pp != 0; pp = pp->next)
-        {
-          if (pp->percent)
-            for (wp = wordhead; wp != 0; wp = wp->next)
-              wp->matched |= pattern_matches (pp->str, pp->percent, wp->str);
-          else if (hashing)
-            {
-              struct a_word a_word_key;
-              a_word_key.str = pp->str;
-              a_word_key.length = pp->length;
-              wp = hash_find_item (&a_word_table, &a_word_key);
-              while (wp)
-                {
-                  wp->matched |= 1;
-                  wp = wp->chain;
-                }
-            }
-          else
-            for (wp = wordhead; wp != 0; wp = wp->next)
-              wp->matched |= (wp->length == pp->length
-                              && strneq (pp->str, wp->str, wp->length));
-        }
-
-      /* Output the words that matched (or didn't, for filter-out).  */
-      for (wp = wordhead; wp != 0; wp = wp->next)
-        if (is_filter ? wp->matched : !wp->matched)
-          {
-            o = variable_buffer_output (o, wp->str, strlen (wp->str));
-            o = variable_buffer_output (o, " ", 1);
-            doneany = 1;
-          }
-
-      if (doneany)
-        /* Kill the last space.  */
-        --o;
-    }
-
-  if (hashing)
-    hash_free (&a_word_table, 0);
-
-  return o;
-}
-
-
-static char *
-func_strip (char *o, char **argv, const char *funcname UNUSED)
-{
-  const char *p = argv[0];
-  int doneany = 0;
-
-  while (*p != '\0')
-    {
-      int i=0;
-      const char *word_start;
-
-      NEXT_TOKEN (p);
-      word_start = p;
-      for (i=0; *p != '\0' && !ISSPACE (*p); ++p, ++i)
-        {}
-      if (!i)
-        break;
-      o = variable_buffer_output (o, word_start, i);
-      o = variable_buffer_output (o, " ", 1);
-      doneany = 1;
-    }
-
-  if (doneany)
-    /* Kill the last space.  */
-    --o;
-
-  return o;
-}
-
-/*
-  Print a warning or fatal message.
-*/
-static char *
-func_error (char *o, char **argv, const char *funcname)
-{
-  char **argvp;
-  char *msg, *p;
-  int len;
-
-  /* The arguments will be broken on commas.  Rather than create yet
-     another special case where function arguments aren't broken up,
-     just create a format string that puts them back together.  */
-  for (len=0, argvp=argv; *argvp != 0; ++argvp)
-    len += strlen (*argvp) + 2;
-
-  p = msg = alloca (len + 1);
-
-  for (argvp=argv; argvp[1] != 0; ++argvp)
-    {
-      strcpy (p, *argvp);
-      p += strlen (*argvp);
-      *(p++) = ',';
-      *(p++) = ' ';
-    }
-  strcpy (p, *argvp);
-
-  switch (*funcname)
-    {
-    case 'e':
-      OS (fatal, reading_file, "%s", msg);
-
-    case 'w':
-      OS (error, reading_file, "%s", msg);
-      break;
-
-    case 'i':
-      outputs (0, msg);
-      outputs (0, "\n");
-      break;
-
-    default:
-      OS (fatal, *expanding_var, "Internal error: func_error: '%s'", funcname);
-    }
-
-  /* The warning function expands to the empty string.  */
-  return o;
-}
-
-
-/*
-  chop argv[0] into words, and sort them.
- */
-static char *
-func_sort (char *o, char **argv, const char *funcname UNUSED)
-{
-  const char *t;
-  char **words;
-  int wordi;
-  char *p;
-  unsigned int len;
-
-  /* Find the maximum number of words we'll have.  */
-  t = argv[0];
-  wordi = 0;
-  while ((p = find_next_token (&t, NULL)) != 0)
-    {
-      ++t;
-      ++wordi;
-    }
-
-  words = xmalloc ((wordi == 0 ? 1 : wordi) * sizeof (char *));
-
-  /* Now assign pointers to each string in the array.  */
-  t = argv[0];
-  wordi = 0;
-  while ((p = find_next_token (&t, &len)) != 0)
-    {
-      ++t;
-      p[len] = '\0';
-      words[wordi++] = p;
-    }
-
-  if (wordi)
-    {
-      int i;
-
-      /* Now sort the list of words.  */
-      qsort (words, wordi, sizeof (char *), alpha_compare);
-
-      /* Now write the sorted list, uniquified.  */
-      for (i = 0; i < wordi; ++i)
-        {
-          len = strlen (words[i]);
-          if (i == wordi - 1 || strlen (words[i + 1]) != len
-              || strcmp (words[i], words[i + 1]))
-            {
-              o = variable_buffer_output (o, words[i], len);
-              o = variable_buffer_output (o, " ", 1);
-            }
-        }
-
-      /* Kill the last space.  */
-      --o;
-    }
-
-  free (words);
-
-  return o;
-}
-
-/*
-  $(if condition,true-part[,false-part])
-
-  CONDITION is false iff it evaluates to an empty string.  White
-  space before and after condition are stripped before evaluation.
-
-  If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is
-  evaluated (if it exists).  Because only one of the two PARTs is evaluated,
-  you can use $(if ...) to create side-effects (with $(shell ...), for
-  example).
-*/
-
-static char *
-func_if (char *o, char **argv, const char *funcname UNUSED)
-{
-  const char *begp = argv[0];
-  const char *endp = begp + strlen (argv[0]) - 1;
-  int result = 0;
-
-  /* Find the result of the condition: if we have a value, and it's not
-     empty, the condition is true.  If we don't have a value, or it's the
-     empty string, then it's false.  */
-
-  strip_whitespace (&begp, &endp);
-
-  if (begp <= endp)
-    {
-      char *expansion = expand_argument (begp, endp+1);
-
-      result = strlen (expansion);
-      free (expansion);
-    }
-
-  /* If the result is true (1) we want to eval the first argument, and if
-     it's false (0) we want to eval the second.  If the argument doesn't
-     exist we do nothing, otherwise expand it and add to the buffer.  */
-
-  argv += 1 + !result;
-
-  if (*argv)
-    {
-      char *expansion = expand_argument (*argv, NULL);
-
-      o = variable_buffer_output (o, expansion, strlen (expansion));
-
-      free (expansion);
-    }
-
-  return o;
-}
-
-/*
-  $(or condition1[,condition2[,condition3[...]]])
-
-  A CONDITION is false iff it evaluates to an empty string.  White
-  space before and after CONDITION are stripped before evaluation.
-
-  CONDITION1 is evaluated.  If it's true, then this is the result of
-  expansion.  If it's false, CONDITION2 is evaluated, and so on.  If none of
-  the conditions are true, the expansion is the empty string.
-
-  Once a CONDITION is true no further conditions are evaluated
-  (short-circuiting).
-*/
-
-static char *
-func_or (char *o, char **argv, const char *funcname UNUSED)
-{
-  for ( ; *argv ; ++argv)
-    {
-      const char *begp = *argv;
-      const char *endp = begp + strlen (*argv) - 1;
-      char *expansion;
-      int result = 0;
-
-      /* Find the result of the condition: if it's false keep going.  */
-
-      strip_whitespace (&begp, &endp);
-
-      if (begp > endp)
-        continue;
-
-      expansion = expand_argument (begp, endp+1);
-      result = strlen (expansion);
-
-      /* If the result is false keep going.  */
-      if (!result)
-        {
-          free (expansion);
-          continue;
-        }
-
-      /* It's true!  Keep this result and return.  */
-      o = variable_buffer_output (o, expansion, result);
-      free (expansion);
-      break;
-    }
-
-  return o;
-}
-
-/*
-  $(and condition1[,condition2[,condition3[...]]])
-
-  A CONDITION is false iff it evaluates to an empty string.  White
-  space before and after CONDITION are stripped before evaluation.
-
-  CONDITION1 is evaluated.  If it's false, then this is the result of
-  expansion.  If it's true, CONDITION2 is evaluated, and so on.  If all of
-  the conditions are true, the expansion is the result of the last condition.
-
-  Once a CONDITION is false no further conditions are evaluated
-  (short-circuiting).
-*/
-
-static char *
-func_and (char *o, char **argv, const char *funcname UNUSED)
-{
-  char *expansion;
-
-  while (1)
-    {
-      const char *begp = *argv;
-      const char *endp = begp + strlen (*argv) - 1;
-      int result;
-
-      /* An empty condition is always false.  */
-      strip_whitespace (&begp, &endp);
-      if (begp > endp)
-        return o;
-
-      expansion = expand_argument (begp, endp+1);
-      result = strlen (expansion);
-
-      /* If the result is false, stop here: we're done.  */
-      if (!result)
-        break;
-
-      /* Otherwise the result is true.  If this is the last one, keep this
-         result and quit.  Otherwise go on to the next one!  */
-
-      if (*(++argv))
-        free (expansion);
-      else
-        {
-          o = variable_buffer_output (o, expansion, result);
-          break;
-        }
-    }
-
-  free (expansion);
-
-  return o;
-}
-
-static char *
-func_wildcard (char *o, char **argv, const char *funcname UNUSED)
-{
-#ifdef _AMIGA
-   o = wildcard_expansion (argv[0], o);
-#else
-   char *p = string_glob (argv[0]);
-   o = variable_buffer_output (o, p, strlen (p));
-#endif
-   return o;
-}
-
-/*
-  $(eval <makefile string>)
-
-  Always resolves to the empty string.
-
-  Treat the arguments as a segment of makefile, and parse them.
-*/
-
-static char *
-func_eval (char *o, char **argv, const char *funcname UNUSED)
-{
-  char *buf;
-  unsigned int len;
-
-  /* Eval the buffer.  Pop the current variable buffer setting so that the
-     eval'd code can use its own without conflicting.  */
-
-  install_variable_buffer (&buf, &len);
-
-  eval_buffer (argv[0], NULL);
-
-  restore_variable_buffer (buf, len);
-
-  return o;
-}
-
-
-static char *
-func_value (char *o, char **argv, const char *funcname UNUSED)
-{
-  /* Look up the variable.  */
-  struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
-
-  /* Copy its value into the output buffer without expanding it.  */
-  if (v)
-    o = variable_buffer_output (o, v->value, strlen (v->value));
-
-  return o;
-}
-
-/*
-  \r is replaced on UNIX as well. Is this desirable?
- */
-static void
-fold_newlines (char *buffer, unsigned int *length, int trim_newlines)
-{
-  char *dst = buffer;
-  char *src = buffer;
-  char *last_nonnl = buffer - 1;
-  src[*length] = 0;
-  for (; *src != '\0'; ++src)
-    {
-      if (src[0] == '\r' && src[1] == '\n')
-        continue;
-      if (*src == '\n')
-        {
-          *dst++ = ' ';
-        }
-      else
-        {
-          last_nonnl = dst;
-          *dst++ = *src;
-        }
-    }
-
-  if (!trim_newlines && (last_nonnl < (dst - 2)))
-    last_nonnl = dst - 2;
-
-  *(++last_nonnl) = '\0';
-  *length = last_nonnl - buffer;
-}
-
-pid_t shell_function_pid = 0;
-static int shell_function_completed;
-
-void
-shell_completed (int exit_code, int exit_sig)
-{
-  char buf[256];
-
-  shell_function_pid = 0;
-  if (exit_sig == 0 && exit_code == 127)
-    shell_function_completed = -1;
-  else
-    shell_function_completed = 1;
-
-  sprintf (buf, "%d", exit_code);
-  define_variable_cname (".SHELLSTATUS", buf, o_override, 0);
-}
-
-#ifdef WINDOWS32
-/*untested*/
-
-#include <windows.h>
-#include <io.h>
-#include "sub_proc.h"
-
-
-int
-windows32_openpipe (int *pipedes, int errfd, pid_t *pid_p, char **command_argv, char **envp)
-{
-  SECURITY_ATTRIBUTES saAttr;
-  HANDLE hIn = INVALID_HANDLE_VALUE;
-  HANDLE hErr = INVALID_HANDLE_VALUE;
-  HANDLE hChildOutRd;
-  HANDLE hChildOutWr;
-  HANDLE hProcess, tmpIn, tmpErr;
-  DWORD e;
-
-  /* Set status for return.  */
-  pipedes[0] = pipedes[1] = -1;
-  *pid_p = (pid_t)-1;
-
-  saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);
-  saAttr.bInheritHandle = TRUE;
-  saAttr.lpSecurityDescriptor = NULL;
-
-  /* Standard handles returned by GetStdHandle can be NULL or
-     INVALID_HANDLE_VALUE if the parent process closed them.  If that
-     happens, we open the null device and pass its handle to
-     process_begin below as the corresponding handle to inherit.  */
-  tmpIn = GetStdHandle (STD_INPUT_HANDLE);
-  if (DuplicateHandle (GetCurrentProcess (), tmpIn,
-                       GetCurrentProcess (), &hIn,
-                       0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
-    {
-      e = GetLastError ();
-      if (e == ERROR_INVALID_HANDLE)
-        {
-          tmpIn = CreateFile ("NUL", GENERIC_READ,
-                              FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
-                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-          if (tmpIn != INVALID_HANDLE_VALUE
-              && DuplicateHandle (GetCurrentProcess (), tmpIn,
-                                  GetCurrentProcess (), &hIn,
-                                  0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
-            CloseHandle (tmpIn);
-        }
-      if (hIn == INVALID_HANDLE_VALUE)
-        {
-          ON (error, NILF,
-              _("windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"), e);
-          return -1;
-        }
-    }
-  tmpErr = (HANDLE)_get_osfhandle (errfd);
-  if (DuplicateHandle (GetCurrentProcess (), tmpErr,
-                       GetCurrentProcess (), &hErr,
-                       0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
-    {
-      e = GetLastError ();
-      if (e == ERROR_INVALID_HANDLE)
-        {
-          tmpErr = CreateFile ("NUL", GENERIC_WRITE,
-                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
-                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-          if (tmpErr != INVALID_HANDLE_VALUE
-              && DuplicateHandle (GetCurrentProcess (), tmpErr,
-                                  GetCurrentProcess (), &hErr,
-                                  0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
-            CloseHandle (tmpErr);
-        }
-      if (hErr == INVALID_HANDLE_VALUE)
-        {
-          ON (error, NILF,
-              _("windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"), e);
-          return -1;
-        }
-    }
-
-  if (! CreatePipe (&hChildOutRd, &hChildOutWr, &saAttr, 0))
-    {
-      ON (error, NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
-      return -1;
-    }
-
-  hProcess = process_init_fd (hIn, hChildOutWr, hErr);
-
-  if (!hProcess)
-    {
-      O (error, NILF, _("windows32_openpipe(): process_init_fd() failed\n"));
-      return -1;
-    }
-
-  /* make sure that CreateProcess() has Path it needs */
-  sync_Path_environment ();
-  /* 'sync_Path_environment' may realloc 'environ', so take note of
-     the new value.  */
-  envp = environ;
-
-  if (! process_begin (hProcess, command_argv, envp, command_argv[0], NULL))
-    {
-      /* register process for wait */
-      process_register (hProcess);
-
-      /* set the pid for returning to caller */
-      *pid_p = (pid_t) hProcess;
-
-      /* set up to read data from child */
-      pipedes[0] = _open_osfhandle ((intptr_t) hChildOutRd, O_RDONLY);
-
-      /* this will be closed almost right away */
-      pipedes[1] = _open_osfhandle ((intptr_t) hChildOutWr, O_APPEND);
-      return 0;
-    }
-  else
-    {
-      /* reap/cleanup the failed process */
-      process_cleanup (hProcess);
-
-      /* close handles which were duplicated, they weren't used */
-      if (hIn != INVALID_HANDLE_VALUE)
-        CloseHandle (hIn);
-      if (hErr != INVALID_HANDLE_VALUE)
-        CloseHandle (hErr);
-
-      /* close pipe handles, they won't be used */
-      CloseHandle (hChildOutRd);
-      CloseHandle (hChildOutWr);
-
-      return -1;
-    }
-}
-#endif
-
-
-#ifdef __MSDOS__
-FILE *
-msdos_openpipe (int* pipedes, int *pidp, char *text)
-{
-  FILE *fpipe=0;
-  /* MSDOS can't fork, but it has 'popen'.  */
-  struct variable *sh = lookup_variable ("SHELL", 5);
-  int e;
-  extern int dos_command_running, dos_status;
-
-  /* Make sure not to bother processing an empty line.  */
-  NEXT_TOKEN (text);
-  if (*text == '\0')
-    return 0;
-
-  if (sh)
-    {
-      char buf[PATH_MAX + 7];
-      /* This makes sure $SHELL value is used by $(shell), even
-         though the target environment is not passed to it.  */
-      sprintf (buf, "SHELL=%s", sh->value);
-      putenv (buf);
-    }
-
-  e = errno;
-  errno = 0;
-  dos_command_running = 1;
-  dos_status = 0;
-  /* If dos_status becomes non-zero, it means the child process
-     was interrupted by a signal, like SIGINT or SIGQUIT.  See
-     fatal_error_signal in commands.c.  */
-  fpipe = popen (text, "rt");
-  dos_command_running = 0;
-  if (!fpipe || dos_status)
-    {
-      pipedes[0] = -1;
-      *pidp = -1;
-      if (dos_status)
-        errno = EINTR;
-      else if (errno == 0)
-        errno = ENOMEM;
-      if (fpipe)
-        pclose (fpipe);
-      shell_completed (127, 0);
-    }
-  else
-    {
-      pipedes[0] = fileno (fpipe);
-      *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */
-      errno = e;
-    }
-  return fpipe;
-}
-#endif
-
-/*
-  Do shell spawning, with the naughty bits for different OSes.
- */
-
-#ifdef VMS
-
-/* VMS can't do $(shell ...)  */
-
-char *
-func_shell_base (char *o, char **argv, int trim_newlines)
-{
-  fprintf (stderr, "This platform does not support shell\n");
-  die (MAKE_TROUBLE);
-  return NULL;
-}
-
-#define func_shell 0
-
-#else
-#ifndef _AMIGA
-char *
-func_shell_base (char *o, char **argv, int trim_newlines)
-{
-  char *batch_filename = NULL;
-  int errfd;
-#ifdef __MSDOS__
-  FILE *fpipe;
-#endif
-  char **command_argv;
-  const char *error_prefix;
-  char **envp;
-  int pipedes[2];
-  pid_t pid;
-
-#ifndef __MSDOS__
-#ifdef WINDOWS32
-  /* Reset just_print_flag.  This is needed on Windows when batch files
-     are used to run the commands, because we normally refrain from
-     creating batch files under -n.  */
-  int j_p_f = just_print_flag;
-  just_print_flag = 0;
-#endif
-
-  /* Construct the argument list.  */
-  command_argv = construct_command_argv (argv[0], NULL, NULL, 0,
-                                         &batch_filename);
-  if (command_argv == 0)
-    {
-#ifdef WINDOWS32
-      just_print_flag = j_p_f;
-#endif
-      return o;
-    }
-#endif /* !__MSDOS__ */
-
-  /* Using a target environment for 'shell' loses in cases like:
-       export var = $(shell echo foobie)
-       bad := $(var)
-     because target_environment hits a loop trying to expand $(var) to put it
-     in the environment.  This is even more confusing when 'var' was not
-     explicitly exported, but just appeared in the calling environment.
-
-     See Savannah bug #10593.
-
-  envp = target_environment (NULL);
-  */
-
-  envp = environ;
-
-  /* For error messages.  */
-  if (reading_file && reading_file->filenm)
-    {
-      char *p = alloca (strlen (reading_file->filenm)+11+4);
-      sprintf (p, "%s:%lu: ", reading_file->filenm,
-               reading_file->lineno + reading_file->offset);
-      error_prefix = p;
-    }
-  else
-    error_prefix = "";
-
-  /* Set up the output in case the shell writes something.  */
-  output_start ();
-
-  errfd = (output_context && output_context->err >= 0
-           ? output_context->err : FD_STDERR);
-
-#if defined(__MSDOS__)
-  fpipe = msdos_openpipe (pipedes, &pid, argv[0]);
-  if (pipedes[0] < 0)
-    {
-      perror_with_name (error_prefix, "pipe");
-      return o;
-    }
-
-#elif defined(WINDOWS32)
-  windows32_openpipe (pipedes, errfd, &pid, command_argv, envp);
-  /* Restore the value of just_print_flag.  */
-  just_print_flag = j_p_f;
-
-  if (pipedes[0] < 0)
-    {
-      /* Open of the pipe failed, mark as failed execution.  */
-      shell_completed (127, 0);
-      perror_with_name (error_prefix, "pipe");
-      return o;
-    }
-
-#else
-  if (pipe (pipedes) < 0)
-    {
-      perror_with_name (error_prefix, "pipe");
-      return o;
-    }
-
-  /* Close handles that are unnecessary for the child process.  */
-  CLOSE_ON_EXEC(pipedes[1]);
-  CLOSE_ON_EXEC(pipedes[0]);
-
-  {
-    struct output out;
-    out.syncout = 1;
-    out.out = pipedes[1];
-    out.err = errfd;
-
-    pid = child_execute_job (&out, 1, command_argv, envp);
-  }
-
-  if (pid < 0)
-    {
-      perror_with_name (error_prefix, "fork");
-      return o;
-    }
-#endif
-
-  {
-    char *buffer;
-    unsigned int maxlen, i;
-    int cc;
-
-    /* Record the PID for reap_children.  */
-    shell_function_pid = pid;
-#ifndef  __MSDOS__
-    shell_function_completed = 0;
-
-    /* Free the storage only the child needed.  */
-    free (command_argv[0]);
-    free (command_argv);
-
-    /* Close the write side of the pipe.  We test for -1, since
-       pipedes[1] is -1 on MS-Windows, and some versions of MS
-       libraries barf when 'close' is called with -1.  */
-    if (pipedes[1] >= 0)
-      close (pipedes[1]);
-#endif
-
-    /* Set up and read from the pipe.  */
-
-    maxlen = 200;
-    buffer = xmalloc (maxlen + 1);
-
-    /* Read from the pipe until it gets EOF.  */
-    for (i = 0; ; i += cc)
-      {
-        if (i == maxlen)
-          {
-            maxlen += 512;
-            buffer = xrealloc (buffer, maxlen + 1);
-          }
-
-        EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i));
-        if (cc <= 0)
-          break;
-      }
-    buffer[i] = '\0';
-
-    /* Close the read side of the pipe.  */
-#ifdef  __MSDOS__
-    if (fpipe)
-      {
-        int st = pclose (fpipe);
-        shell_completed (st, 0);
-      }
-#else
-    (void) close (pipedes[0]);
-#endif
-
-    /* Loop until child_handler or reap_children()  sets
-       shell_function_completed to the status of our child shell.  */
-    while (shell_function_completed == 0)
-      reap_children (1, 0);
-
-    if (batch_filename)
-      {
-        DB (DB_VERBOSE, (_("Cleaning up temporary batch file %s\n"),
-                         batch_filename));
-        remove (batch_filename);
-        free (batch_filename);
-      }
-    shell_function_pid = 0;
-
-    /* shell_completed() will set shell_function_completed to 1 when the
-       child dies normally, or to -1 if it dies with status 127, which is
-       most likely an exec fail.  */
-
-    if (shell_function_completed == -1)
-      {
-        /* This likely means that the execvp failed, so we should just
-           write the error message in the pipe from the child.  */
-        fputs (buffer, stderr);
-        fflush (stderr);
-      }
-    else
-      {
-        /* The child finished normally.  Replace all newlines in its output
-           with spaces, and put that in the variable output buffer.  */
-        fold_newlines (buffer, &i, trim_newlines);
-        o = variable_buffer_output (o, buffer, i);
-      }
-
-    free (buffer);
-  }
-
-  return o;
-}
-
-#else   /* _AMIGA */
-
-/* Do the Amiga version of func_shell.  */
-
-char *
-func_shell_base (char *o, char **argv, int trim_newlines)
-{
-  /* Amiga can't fork nor spawn, but I can start a program with
-     redirection of my choice.  However, this means that we
-     don't have an opportunity to reopen stdout to trap it.  Thus,
-     we save our own stdout onto a new descriptor and dup a temp
-     file's descriptor onto our stdout temporarily.  After we
-     spawn the shell program, we dup our own stdout back to the
-     stdout descriptor.  The buffer reading is the same as above,
-     except that we're now reading from a file.  */
-
-#include <dos/dos.h>
-#include <proto/dos.h>
-
-  BPTR child_stdout;
-  char tmp_output[FILENAME_MAX];
-  unsigned int maxlen = 200, i;
-  int cc;
-  char * buffer, * ptr;
-  char ** aptr;
-  int len = 0;
-  char* batch_filename = NULL;
-
-  /* Construct the argument list.  */
-  command_argv = construct_command_argv (argv[0], NULL, NULL, 0,
-                                         &batch_filename);
-  if (command_argv == 0)
-    return o;
-
-  /* Note the mktemp() is a security hole, but this only runs on Amiga.
-     Ideally we would use output_tmpfile(), but this uses a special
-     Open(), not fopen(), and I'm not familiar enough with the code to mess
-     with it.  */
-  strcpy (tmp_output, "t:MakeshXXXXXXXX");
-  mktemp (tmp_output);
-  child_stdout = Open (tmp_output, MODE_NEWFILE);
-
-  for (aptr=command_argv; *aptr; aptr++)
-    len += strlen (*aptr) + 1;
-
-  buffer = xmalloc (len + 1);
-  ptr = buffer;
-
-  for (aptr=command_argv; *aptr; aptr++)
-    {
-      strcpy (ptr, *aptr);
-      ptr += strlen (ptr) + 1;
-      *ptr ++ = ' ';
-      *ptr = 0;
-    }
-
-  ptr[-1] = '\n';
-
-  Execute (buffer, NULL, child_stdout);
-  free (buffer);
-
-  Close (child_stdout);
-
-  child_stdout = Open (tmp_output, MODE_OLDFILE);
-
-  buffer = xmalloc (maxlen);
-  i = 0;
-  do
-    {
-      if (i == maxlen)
-        {
-          maxlen += 512;
-          buffer = xrealloc (buffer, maxlen + 1);
-        }
-
-      cc = Read (child_stdout, &buffer[i], maxlen - i);
-      if (cc > 0)
-        i += cc;
-    } while (cc > 0);
-
-  Close (child_stdout);
-
-  fold_newlines (buffer, &i, trim_newlines);
-  o = variable_buffer_output (o, buffer, i);
-  free (buffer);
-  return o;
-}
-#endif  /* _AMIGA */
-
-static char *
-func_shell (char *o, char **argv, const char *funcname UNUSED)
-{
-  return func_shell_base (o, argv, 1);
-}
-#endif  /* !VMS */
-
-#ifdef EXPERIMENTAL
-
-/*
-  equality. Return is string-boolean, i.e., the empty string is false.
- */
-static char *
-func_eq (char *o, char **argv, char *funcname UNUSED)
-{
-  int result = ! strcmp (argv[0], argv[1]);
-  o = variable_buffer_output (o,  result ? "1" : "", result);
-  return o;
-}
-
-
-/*
-  string-boolean not operator.
- */
-static char *
-func_not (char *o, char **argv, char *funcname UNUSED)
-{
-  const char *s = argv[0];
-  int result = 0;
-  NEXT_TOKEN (s);
-  result = ! (*s);
-  o = variable_buffer_output (o,  result ? "1" : "", result);
-  return o;
-}
-#endif
-\f
-
-#ifdef HAVE_DOS_PATHS
-# ifdef __CYGWIN__
-#  define IS_ABSOLUTE(n) ((n[0] && n[1] == ':') || STOP_SET (n[0], MAP_DIRSEP))
-# else
-#  define IS_ABSOLUTE(n) (n[0] && n[1] == ':')
-# endif
-# define ROOT_LEN 3
-#else
-#define IS_ABSOLUTE(n) (n[0] == '/')
-#define ROOT_LEN 1
-#endif
-
-/* Return the absolute name of file NAME which does not contain any '.',
-   '..' components nor any repeated path separators ('/').   */
-
-static char *
-abspath (const char *name, char *apath)
-{
-  char *dest;
-  const char *start, *end, *apath_limit;
-  unsigned long root_len = ROOT_LEN;
-
-  if (name[0] == '\0' || apath == NULL)
-    return NULL;
-
-  apath_limit = apath + GET_PATH_MAX;
-
-  if (!IS_ABSOLUTE(name))
-    {
-      /* It is unlikely we would make it until here but just to make sure. */
-      if (!starting_directory)
-        return NULL;
-
-      strcpy (apath, starting_directory);
-
-#ifdef HAVE_DOS_PATHS
-      if (STOP_SET (name[0], MAP_DIRSEP))
-        {
-          if (STOP_SET (name[1], MAP_DIRSEP))
-            {
-              /* A UNC.  Don't prepend a drive letter.  */
-              apath[0] = name[0];
-              apath[1] = name[1];
-              root_len = 2;
-            }
-          /* We have /foo, an absolute file name except for the drive
-             letter.  Assume the missing drive letter is the current
-             drive, which we can get if we remove from starting_directory
-             everything past the root directory.  */
-          apath[root_len] = '\0';
-        }
-#endif
-
-      dest = strchr (apath, '\0');
-    }
-  else
-    {
-#if defined(__CYGWIN__) && defined(HAVE_DOS_PATHS)
-      if (STOP_SET (name[0], MAP_DIRSEP))
-        root_len = 1;
-#endif
-      strncpy (apath, name, root_len);
-      apath[root_len] = '\0';
-      dest = apath + root_len;
-      /* Get past the root, since we already copied it.  */
-      name += root_len;
-#ifdef HAVE_DOS_PATHS
-      if (! STOP_SET (apath[root_len - 1], MAP_DIRSEP))
-        {
-          /* Convert d:foo into d:./foo and increase root_len.  */
-          apath[2] = '.';
-          apath[3] = '/';
-          dest++;
-          root_len++;
-          /* strncpy above copied one character too many.  */
-          name--;
-        }
-      else
-        apath[root_len - 1] = '/'; /* make sure it's a forward slash */
-#endif
-    }
-
-  for (start = end = name; *start != '\0'; start = end)
-    {
-      unsigned long len;
-
-      /* Skip sequence of multiple path-separators.  */
-      while (STOP_SET (*start, MAP_DIRSEP))
-        ++start;
-
-      /* Find end of path component.  */
-      for (end = start; ! STOP_SET (*end, MAP_DIRSEP|MAP_NUL); ++end)
-        ;
-
-      len = end - start;
-
-      if (len == 0)
-        break;
-      else if (len == 1 && start[0] == '.')
-        /* nothing */;
-      else if (len == 2 && start[0] == '.' && start[1] == '.')
-        {
-          /* Back up to previous component, ignore if at root already.  */
-          if (dest > apath + root_len)
-            for (--dest; ! STOP_SET (dest[-1], MAP_DIRSEP); --dest)
-              ;
-        }
-      else
-        {
-          if (! STOP_SET (dest[-1], MAP_DIRSEP))
-            *dest++ = '/';
-
-          if (dest + len >= apath_limit)
-            return NULL;
-
-          dest = memcpy (dest, start, len);
-          dest += len;
-          *dest = '\0';
-        }
-    }
-
-  /* Unless it is root strip trailing separator.  */
-  if (dest > apath + root_len && STOP_SET (dest[-1], MAP_DIRSEP))
-    --dest;
-
-  *dest = '\0';
-
-  return apath;
-}
-
-
-static char *
-func_realpath (char *o, char **argv, const char *funcname UNUSED)
-{
-  /* Expand the argument.  */
-  const char *p = argv[0];
-  const char *path = 0;
-  int doneany = 0;
-  unsigned int len = 0;
-
-  while ((path = find_next_token (&p, &len)) != 0)
-    {
-      if (len < GET_PATH_MAX)
-        {
-          char *rp;
-          struct stat st;
-          PATH_VAR (in);
-          PATH_VAR (out);
-
-          strncpy (in, path, len);
-          in[len] = '\0';
-
-#ifdef HAVE_REALPATH
-          ENULLLOOP (rp, realpath (in, out));
-#else
-          rp = abspath (in, out);
-#endif
-
-          if (rp)
-            {
-              int r;
-              EINTRLOOP (r, stat (out, &st));
-              if (r == 0)
-                {
-                  o = variable_buffer_output (o, out, strlen (out));
-                  o = variable_buffer_output (o, " ", 1);
-                  doneany = 1;
-                }
-            }
-        }
-    }
-
-  /* Kill last space.  */
-  if (doneany)
-    --o;
-
-  return o;
-}
-
-static char *
-func_file (char *o, char **argv, const char *funcname UNUSED)
-{
-  char *fn = argv[0];
-
-  if (fn[0] == '>')
-    {
-      FILE *fp;
-      const char *mode = "w";
-
-      /* We are writing a file.  */
-      ++fn;
-      if (fn[0] == '>')
-        {
-          mode = "a";
-          ++fn;
-        }
-      NEXT_TOKEN (fn);
-
-      if (fn[0] == '\0')
-        O (fatal, *expanding_var, _("file: missing filename"));
-
-      ENULLLOOP (fp, fopen (fn, mode));
-      if (fp == NULL)
-        OSS (fatal, reading_file, _("open: %s: %s"), fn, strerror (errno));
-
-      if (argv[1])
-        {
-          int l = strlen (argv[1]);
-          int nl = l == 0 || argv[1][l-1] != '\n';
-
-          if (fputs (argv[1], fp) == EOF || (nl && fputc ('\n', fp) == EOF))
-            OSS (fatal, reading_file, _("write: %s: %s"), fn, strerror (errno));
-        }
-      if (fclose (fp))
-        OSS (fatal, reading_file, _("close: %s: %s"), fn, strerror (errno));
-    }
-  else if (fn[0] == '<')
-    {
-      char *preo = o;
-      FILE *fp;
-
-      ++fn;
-      NEXT_TOKEN (fn);
-      if (fn[0] == '\0')
-        O (fatal, *expanding_var, _("file: missing filename"));
-
-      if (argv[1])
-        O (fatal, *expanding_var, _("file: too many arguments"));
-
-      ENULLLOOP (fp, fopen (fn, "r"));
-      if (fp == NULL)
-        {
-          if (errno == ENOENT)
-            return o;
-          OSS (fatal, reading_file, _("open: %s: %s"), fn, strerror (errno));
-        }
-
-      while (1)
-        {
-          char buf[1024];
-          size_t l = fread (buf, 1, sizeof (buf), fp);
-          if (l > 0)
-            o = variable_buffer_output (o, buf, l);
-
-          if (ferror (fp))
-            if (errno != EINTR)
-              OSS (fatal, reading_file, _("read: %s: %s"), fn, strerror (errno));
-          if (feof (fp))
-            break;
-        }
-      if (fclose (fp))
-        OSS (fatal, reading_file, _("close: %s: %s"), fn, strerror (errno));
-
-      /* Remove trailing newline.  */
-      if (o > preo && o[-1] == '\n')
-        if (--o > preo && o[-1] == '\r')
-          --o;
-    }
-  else
-    OS (fatal, *expanding_var, _("file: invalid file operation: %s"), fn);
-
-  return o;
-}
-
-static char *
-func_abspath (char *o, char **argv, const char *funcname UNUSED)
-{
-  /* Expand the argument.  */
-  const char *p = argv[0];
-  const char *path = 0;
-  int doneany = 0;
-  unsigned int len = 0;
-
-  while ((path = find_next_token (&p, &len)) != 0)
-    {
-      if (len < GET_PATH_MAX)
-        {
-          PATH_VAR (in);
-          PATH_VAR (out);
-
-          strncpy (in, path, len);
-          in[len] = '\0';
-
-          if (abspath (in, out))
-            {
-              o = variable_buffer_output (o, out, strlen (out));
-              o = variable_buffer_output (o, " ", 1);
-              doneany = 1;
-            }
-        }
-    }
-
-  /* Kill last space.  */
-  if (doneany)
-    --o;
-
-  return o;
-}
-
-/* Lookup table for builtin functions.
-
-   This doesn't have to be sorted; we use a straight lookup.  We might gain
-   some efficiency by moving most often used functions to the start of the
-   table.
-
-   If MAXIMUM_ARGS is 0, that means there is no maximum and all
-   comma-separated values are treated as arguments.
-
-   EXPAND_ARGS means that all arguments should be expanded before invocation.
-   Functions that do namespace tricks (foreach) don't automatically expand.  */
-
-static char *func_call (char *o, char **argv, const char *funcname);
-
-#define FT_ENTRY(_name, _min, _max, _exp, _func) \
-  { { (_func) }, STRING_SIZE_TUPLE(_name), (_min), (_max), (_exp), 0 }
-
-static struct function_table_entry function_table_init[] =
-{
- /*         Name            MIN MAX EXP? Function */
-  FT_ENTRY ("abspath",       0,  1,  1,  func_abspath),
-  FT_ENTRY ("addprefix",     2,  2,  1,  func_addsuffix_addprefix),
-  FT_ENTRY ("addsuffix",     2,  2,  1,  func_addsuffix_addprefix),
-  FT_ENTRY ("basename",      0,  1,  1,  func_basename_dir),
-  FT_ENTRY ("dir",           0,  1,  1,  func_basename_dir),
-  FT_ENTRY ("notdir",        0,  1,  1,  func_notdir_suffix),
-  FT_ENTRY ("subst",         3,  3,  1,  func_subst),
-  FT_ENTRY ("suffix",        0,  1,  1,  func_notdir_suffix),
-  FT_ENTRY ("filter",        2,  2,  1,  func_filter_filterout),
-  FT_ENTRY ("filter-out",    2,  2,  1,  func_filter_filterout),
-  FT_ENTRY ("findstring",    2,  2,  1,  func_findstring),
-  FT_ENTRY ("firstword",     0,  1,  1,  func_firstword),
-  FT_ENTRY ("flavor",        0,  1,  1,  func_flavor),
-  FT_ENTRY ("join",          2,  2,  1,  func_join),
-  FT_ENTRY ("lastword",      0,  1,  1,  func_lastword),
-  FT_ENTRY ("patsubst",      3,  3,  1,  func_patsubst),
-  FT_ENTRY ("realpath",      0,  1,  1,  func_realpath),
-  FT_ENTRY ("shell",         0,  1,  1,  func_shell),
-  FT_ENTRY ("sort",          0,  1,  1,  func_sort),
-  FT_ENTRY ("strip",         0,  1,  1,  func_strip),
-  FT_ENTRY ("wildcard",      0,  1,  1,  func_wildcard),
-  FT_ENTRY ("word",          2,  2,  1,  func_word),
-  FT_ENTRY ("wordlist",      3,  3,  1,  func_wordlist),
-  FT_ENTRY ("words",         0,  1,  1,  func_words),
-  FT_ENTRY ("origin",        0,  1,  1,  func_origin),
-  FT_ENTRY ("foreach",       3,  3,  0,  func_foreach),
-  FT_ENTRY ("call",          1,  0,  1,  func_call),
-  FT_ENTRY ("info",          0,  1,  1,  func_error),
-  FT_ENTRY ("error",         0,  1,  1,  func_error),
-  FT_ENTRY ("warning",       0,  1,  1,  func_error),
-  FT_ENTRY ("if",            2,  3,  0,  func_if),
-  FT_ENTRY ("or",            1,  0,  0,  func_or),
-  FT_ENTRY ("and",           1,  0,  0,  func_and),
-  FT_ENTRY ("value",         0,  1,  1,  func_value),
-  FT_ENTRY ("eval",          0,  1,  1,  func_eval),
-  FT_ENTRY ("file",          1,  2,  1,  func_file),
-#ifdef EXPERIMENTAL
-  FT_ENTRY ("eq",            2,  2,  1,  func_eq),
-  FT_ENTRY ("not",           0,  1,  1,  func_not),
-#endif
-};
-
-#define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry))
-\f
-
-/* These must come after the definition of function_table.  */
-
-static char *
-expand_builtin_function (char *o, int argc, char **argv,
-                         const struct function_table_entry *entry_p)
-{
-  char *p;
-
-  if (argc < (int)entry_p->minimum_args)
-    fatal (*expanding_var, strlen (entry_p->name),
-           _("insufficient number of arguments (%d) to function '%s'"),
-           argc, entry_p->name);
-
-  /* I suppose technically some function could do something with no arguments,
-     but so far no internal ones do, so just test it for all functions here
-     rather than in each one.  We can change it later if necessary.  */
-
-  if (!argc && !entry_p->alloc_fn)
-    return o;
-
-  if (!entry_p->fptr.func_ptr)
-    OS (fatal, *expanding_var,
-        _("unimplemented on this platform: function '%s'"), entry_p->name);
-
-  if (!entry_p->alloc_fn)
-    return entry_p->fptr.func_ptr (o, argv, entry_p->name);
-
-  /* This function allocates memory and returns it to us.
-     Write it to the variable buffer, then free it.  */
-
-  p = entry_p->fptr.alloc_func_ptr (entry_p->name, argc, argv);
-  if (p)
-    {
-      o = variable_buffer_output (o, p, strlen (p));
-      free (p);
-    }
-
-  return o;
-}
-
-/* Check for a function invocation in *STRINGP.  *STRINGP points at the
-   opening ( or { and is not null-terminated.  If a function invocation
-   is found, expand it into the buffer at *OP, updating *OP, incrementing
-   *STRINGP past the reference and returning nonzero.  If not, return zero.  */
-
-int
-handle_function (char **op, const char **stringp)
-{
-  const struct function_table_entry *entry_p;
-  char openparen = (*stringp)[0];
-  char closeparen = openparen == '(' ? ')' : '}';
-  const char *beg;
-  const char *end;
-  int count = 0;
-  char *abeg = NULL;
-  char **argv, **argvp;
-  int nargs;
-
-  beg = *stringp + 1;
-
-  entry_p = lookup_function (beg);
-
-  if (!entry_p)
-    return 0;
-
-  /* We found a builtin function.  Find the beginning of its arguments (skip
-     whitespace after the name).  */
-
-  beg += entry_p->len;
-  NEXT_TOKEN (beg);
-
-  /* Find the end of the function invocation, counting nested use of
-     whichever kind of parens we use.  Since we're looking, count commas
-     to get a rough estimate of how many arguments we might have.  The
-     count might be high, but it'll never be low.  */
-
-  for (nargs=1, end=beg; *end != '\0'; ++end)
-    if (*end == ',')
-      ++nargs;
-    else if (*end == openparen)
-      ++count;
-    else if (*end == closeparen && --count < 0)
-      break;
-
-  if (count >= 0)
-    fatal (*expanding_var, strlen (entry_p->name),
-           _("unterminated call to function '%s': missing '%c'"),
-           entry_p->name, closeparen);
-
-  *stringp = end;
-
-  /* Get some memory to store the arg pointers.  */
-  argvp = argv = alloca (sizeof (char *) * (nargs + 2));
-
-  /* Chop the string into arguments, then a nul.  As soon as we hit
-     MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the
-     last argument.
-
-     If we're expanding, store pointers to the expansion of each one.  If
-     not, make a duplicate of the string and point into that, nul-terminating
-     each argument.  */
-
-  if (entry_p->expand_args)
-    {
-      const char *p;
-      for (p=beg, nargs=0; p <= end; ++argvp)
-        {
-          const char *next;
-
-          ++nargs;
-
-          if (nargs == entry_p->maximum_args
-              || (! (next = find_next_argument (openparen, closeparen, p, end))))
-            next = end;
-
-          *argvp = expand_argument (p, next);
-          p = next + 1;
-        }
-    }
-  else
-    {
-      int len = end - beg;
-      char *p, *aend;
-
-      abeg = xmalloc (len+1);
-      memcpy (abeg, beg, len);
-      abeg[len] = '\0';
-      aend = abeg + len;
-
-      for (p=abeg, nargs=0; p <= aend; ++argvp)
-        {
-          char *next;
-
-          ++nargs;
-
-          if (nargs == entry_p->maximum_args
-              || (! (next = find_next_argument (openparen, closeparen, p, aend))))
-            next = aend;
-
-          *argvp = p;
-          *next = '\0';
-          p = next + 1;
-        }
-    }
-  *argvp = NULL;
-
-  /* Finally!  Run the function...  */
-  *op = expand_builtin_function (*op, nargs, argv, entry_p);
-
-  /* Free memory.  */
-  if (entry_p->expand_args)
-    for (argvp=argv; *argvp != 0; ++argvp)
-      free (*argvp);
-  else
-    free (abeg);
-
-  return 1;
-}
-\f
-
-/* User-defined functions.  Expand the first argument as either a builtin
-   function or a make variable, in the context of the rest of the arguments
-   assigned to $1, $2, ... $N.  $0 is the name of the function.  */
-
-static char *
-func_call (char *o, char **argv, const char *funcname UNUSED)
-{
-  static int max_args = 0;
-  char *fname;
-  char *body;
-  int flen;
-  int i;
-  int saved_args;
-  const struct function_table_entry *entry_p;
-  struct variable *v;
-
-  /* Clean up the name of the variable to be invoked.  */
-  fname = next_token (argv[0]);
-  end_of_token (fname)[0] = '\0';
-
-  /* Calling nothing is a no-op */
-  if (*fname == '\0')
-    return o;
-
-  /* Are we invoking a builtin function?  */
-
-  entry_p = lookup_function (fname);
-  if (entry_p)
-    {
-      /* How many arguments do we have?  */
-      for (i=0; argv[i+1]; ++i)
-        ;
-      return expand_builtin_function (o, i, argv+1, entry_p);
-    }
-
-  /* Not a builtin, so the first argument is the name of a variable to be
-     expanded and interpreted as a function.  Find it.  */
-  flen = strlen (fname);
-
-  v = lookup_variable (fname, flen);
-
-  if (v == 0)
-    warn_undefined (fname, flen);
-
-  if (v == 0 || *v->value == '\0')
-    return o;
-
-  body = alloca (flen + 4);
-  body[0] = '$';
-  body[1] = '(';
-  memcpy (body + 2, fname, flen);
-  body[flen+2] = ')';
-  body[flen+3] = '\0';
-
-  /* Set up arguments $(1) .. $(N).  $(0) is the function name.  */
-
-  push_new_variable_scope ();
-
-  for (i=0; *argv; ++i, ++argv)
-    {
-      char num[11];
-
-      sprintf (num, "%d", i);
-      define_variable (num, strlen (num), *argv, o_automatic, 0);
-    }
-
-  /* If the number of arguments we have is < max_args, it means we're inside
-     a recursive invocation of $(call ...).  Fill in the remaining arguments
-     in the new scope with the empty value, to hide them from this
-     invocation.  */
-
-  for (; i < max_args; ++i)
-    {
-      char num[11];
-
-      sprintf (num, "%d", i);
-      define_variable (num, strlen (num), "", o_automatic, 0);
-    }
-
-  /* Expand the body in the context of the arguments, adding the result to
-     the variable buffer.  */
-
-  v->exp_count = EXP_COUNT_MAX;
-
-  saved_args = max_args;
-  max_args = i;
-  o = variable_expand_string (o, body, flen+3);
-  max_args = saved_args;
-
-  v->exp_count = 0;
-
-  pop_variable_scope ();
-
-  return o + strlen (o);
-}
-
-void
-define_new_function (const floc *flocp, const char *name,
-                     unsigned int min, unsigned int max, unsigned int flags,
-                     gmk_func_ptr func)
-{
-  const char *e = name;
-  struct function_table_entry *ent;
-  size_t len;
-
-  while (STOP_SET (*e, MAP_USERFUNC))
-    e++;
-  len = e - name;
-
-  if (len == 0)
-    O (fatal, flocp, _("Empty function name"));
-  if (*name == '.' || *e != '\0')
-    OS (fatal, flocp, _("Invalid function name: %s"), name);
-  if (len > 255)
-    OS (fatal, flocp, _("Function name too long: %s"), name);
-  if (min > 255)
-    ONS (fatal, flocp,
-         _("Invalid minimum argument count (%u) for function %s"), min, name);
-  if (max > 255 || (max && max < min))
-    ONS (fatal, flocp,
-         _("Invalid maximum argument count (%u) for function %s"), max, name);
-
-  ent = xmalloc (sizeof (struct function_table_entry));
-  ent->name = name;
-  ent->len = len;
-  ent->minimum_args = min;
-  ent->maximum_args = max;
-  ent->expand_args = ANY_SET(flags, GMK_FUNC_NOEXPAND) ? 0 : 1;
-  ent->alloc_fn = 1;
-  ent->fptr.alloc_func_ptr = func;
-
-  hash_insert (&function_table, ent);
-}
-
-void
-hash_init_function_table (void)
-{
-  hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2,
-             function_table_entry_hash_1, function_table_entry_hash_2,
-             function_table_entry_hash_cmp);
-  hash_load (&function_table, function_table_init,
-             FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry));
-}
diff --git a/getloadavg.c b/getloadavg.c
deleted file mode 100644 (file)
index 10ae56a..0000000
+++ /dev/null
@@ -1,1026 +0,0 @@
-/* Get the system load averages.
-Copyright (C) 1985-2016 Free Software Foundation, Inc.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Compile-time symbols that this file uses:
-
-   HAVE_PSTAT_GETDYNAMIC       Define this if your system has the
-                                pstat_getdynamic function.  I think it
-                               is unique to HPUX9.  The best way to get the
-                               definition is through the AC_FUNC_GETLOADAVG
-                               macro that comes with autoconf 2.13 or newer.
-                               If that isn't an option, then just put
-                               AC_CHECK_FUNCS(pstat_getdynamic) in your
-                               configure.in file.
-   FIXUP_KERNEL_SYMBOL_ADDR()  Adjust address in returned struct nlist.
-   KERNEL_FILE                 Pathname of the kernel to nlist.
-   LDAV_CVT()                  Scale the load average from the kernel.
-                               Returns a double.
-   LDAV_SYMBOL                 Name of kernel symbol giving load average.
-   LOAD_AVE_TYPE               Type of the load average array in the kernel.
-                               Must be defined unless one of
-                               apollo, DGUX, NeXT, or UMAX is defined;
-                                or we have libkstat;
-                               otherwise, no load average is available.
-   NLIST_STRUCT                        Include nlist.h, not a.out.h, and
-                               the nlist n_name element is a pointer,
-                               not an array.
-   HAVE_STRUCT_NLIST_N_UN_N_NAME struct nlist has an n_un member, not n_name.
-   LINUX_LDAV_FILE             [__linux__]: File containing load averages.
-
-   Specific system predefines this file uses, aside from setting
-   default values if not emacs:
-
-   apollo
-   BSD                         Real BSD, not just BSD-like.
-   convex
-   DGUX
-   eunice                      UNIX emulator under VMS.
-   hpux
-   __MSDOS__                   No-op for MSDOS.
-   NeXT
-   sgi
-   sequent                     Sequent Dynix 3.x.x (BSD)
-   _SEQUENT_                   Sequent DYNIX/ptx 1.x.x (SYSV)
-   sony_news                    NEWS-OS (works at least for 4.1C)
-   UMAX
-   UMAX4_3
-   VMS
-   WINDOWS32                   No-op for Windows95/NT.
-   __linux__                   Linux: assumes /proc filesystem mounted.
-                               Support from Michael K. Johnson.
-   __NetBSD__                  NetBSD: assumes /kern filesystem mounted.
-
-   In addition, to avoid nesting many #ifdefs, we internally set
-   LDAV_DONE to indicate that the load average has been computed.
-
-   We also #define LDAV_PRIVILEGED if a program will require
-   special installation to be able to call getloadavg.  */
-
-/* This should always be first.  */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <sys/types.h>
-
-/* Both the Emacs and non-Emacs sections want this.  Some
-   configuration files' definitions for the LOAD_AVE_CVT macro (like
-   sparc.h's) use macros like FSCALE, defined here.  */
-#if defined (unix) || defined (__unix)
-# include <sys/param.h>
-#endif
-
-
-/* Exclude all the code except the test program at the end
-   if the system has its own 'getloadavg' function.
-
-   The declaration of 'errno' is needed by the test program
-   as well as the function itself, so it comes first.  */
-
-#include <errno.h>
-
-#ifndef errno
-extern int errno;
-#endif
-
-#if HAVE_LOCALE_H
-# include <locale.h>
-#endif
-#if !HAVE_SETLOCALE
-# define setlocale(Category, Locale) /* empty */
-#endif
-
-#ifndef HAVE_GETLOADAVG
-
-
-/* The existing Emacs configuration files define a macro called
-   LOAD_AVE_CVT, which accepts a value of type LOAD_AVE_TYPE, and
-   returns the load average multiplied by 100.  What we actually want
-   is a macro called LDAV_CVT, which returns the load average as an
-   unmultiplied double.
-
-   For backwards compatibility, we'll define LDAV_CVT in terms of
-   LOAD_AVE_CVT, but future machine config files should just define
-   LDAV_CVT directly.  */
-
-# if !defined(LDAV_CVT) && defined(LOAD_AVE_CVT)
-#  define LDAV_CVT(n) (LOAD_AVE_CVT (n) / 100.0)
-# endif
-
-# if !defined (BSD) && defined (ultrix)
-/* Ultrix behaves like BSD on Vaxen.  */
-#  define BSD
-# endif
-
-# ifdef NeXT
-/* NeXT in the 2.{0,1,2} releases defines BSD in <sys/param.h>, which
-   conflicts with the definition understood in this file, that this
-   really is BSD. */
-#  undef BSD
-
-/* NeXT defines FSCALE in <sys/param.h>.  However, we take FSCALE being
-   defined to mean that the nlist method should be used, which is not true.  */
-#  undef FSCALE
-# endif
-
-/* Same issues as for NeXT apply to the HURD-based GNU system.  */
-# ifdef __GNU__
-#  undef BSD
-#  undef FSCALE
-# endif /* __GNU__ */
-
-/* Set values that are different from the defaults, which are
-   set a little farther down with #ifndef.  */
-
-
-/* Some shorthands.  */
-
-# if defined (HPUX) && !defined (hpux)
-#  define hpux
-# endif
-
-# if defined (__hpux) && !defined (hpux)
-#  define hpux
-# endif
-
-# if defined (__sun) && !defined (sun)
-#  define sun
-# endif
-
-# if defined(hp300) && !defined(hpux)
-#  define MORE_BSD
-# endif
-
-# if defined(ultrix) && defined(mips)
-#  define decstation
-# endif
-
-# if defined (__SVR4) && !defined (SVR4)
-#  define SVR4
-# endif
-
-# if (defined(sun) && defined(SVR4)) || defined (SOLARIS2)
-#  define SUNOS_5
-# endif
-
-# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
-#  define OSF_ALPHA
-#  include <sys/mbuf.h>
-#  include <sys/socket.h>
-#  include <net/route.h>
-#  include <sys/table.h>
-# endif
-
-# if defined (__osf__) && (defined (mips) || defined (__mips__))
-#  define OSF_MIPS
-#  include <sys/table.h>
-# endif
-
-/* UTek's /bin/cc on the 4300 has no architecture specific cpp define by
-   default, but _MACH_IND_SYS_TYPES is defined in <sys/types.h>.  Combine
-   that with a couple of other things and we'll have a unique match.  */
-# if !defined (tek4300) && defined (unix) && defined (m68k) && defined (mc68000) && defined (mc68020) && defined (_MACH_IND_SYS_TYPES)
-#  define tek4300                      /* Define by emacs, but not by other users.  */
-# endif
-
-/* AC_FUNC_GETLOADAVG thinks QNX is SVR4, but it isn't. */
-# if defined(__QNX__)
-#  undef SVR4
-# endif
-
-/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars.  */
-# ifndef LOAD_AVE_TYPE
-
-#  ifdef MORE_BSD
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef sun
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef decstation
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef _SEQUENT_
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef sgi
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef SVR4
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef sony_news
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef sequent
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef OSF_ALPHA
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  if defined (ardent) && defined (titan)
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef tek4300
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  if defined(alliant) && defined(i860) /* Alliant FX/2800 */
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef _AIX
-#   define LOAD_AVE_TYPE long
-#  endif
-
-#  ifdef convex
-#   define LOAD_AVE_TYPE double
-#   ifndef LDAV_CVT
-#    define LDAV_CVT(n) (n)
-#   endif
-#  endif
-
-# endif /* No LOAD_AVE_TYPE.  */
-
-# ifdef OSF_ALPHA
-/* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1,
-   according to ghazi@noc.rutgers.edu.  */
-#  undef FSCALE
-#  define FSCALE 1024.0
-# endif
-
-# if defined(alliant) && defined(i860) /* Alliant FX/2800 */
-/* <sys/param.h> defines an incorrect value for FSCALE on an
-   Alliant FX/2800 Concentrix 2.2, according to ghazi@noc.rutgers.edu.  */
-#  undef FSCALE
-#  define FSCALE 100.0
-# endif
-
-
-# ifndef       FSCALE
-
-/* SunOS and some others define FSCALE in sys/param.h.  */
-
-#  ifdef MORE_BSD
-#   define FSCALE 2048.0
-#  endif
-
-#  if defined(MIPS) || defined(SVR4) || defined(decstation)
-#   define FSCALE 256
-#  endif
-
-#  if defined (sgi) || defined (sequent)
-/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined
-   above under #ifdef MIPS.  But we want the sgi value.  */
-#   undef FSCALE
-#   define     FSCALE 1000.0
-#  endif
-
-#  if defined (ardent) && defined (titan)
-#   define FSCALE 65536.0
-#  endif
-
-#  ifdef tek4300
-#   define FSCALE 100.0
-#  endif
-
-#  ifdef _AIX
-#   define FSCALE 65536.0
-#  endif
-
-# endif        /* Not FSCALE.  */
-
-# if !defined (LDAV_CVT) && defined (FSCALE)
-#  define      LDAV_CVT(n) (((double) (n)) / FSCALE)
-# endif
-
-
-# if defined(sgi) || (defined(mips) && !defined(BSD))
-#  define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
-# endif
-
-
-# if !defined (KERNEL_FILE) && defined (sequent)
-#  define KERNEL_FILE "/dynix"
-# endif
-
-# if !defined (KERNEL_FILE) && defined (hpux)
-#  define KERNEL_FILE "/hp-ux"
-# endif
-
-# if !defined(KERNEL_FILE) && (defined(_SEQUENT_) || defined(MIPS) || defined(SVR4) || defined(ISC) || defined (sgi) || (defined (ardent) && defined (titan)))
-#  define KERNEL_FILE "/unix"
-# endif
-
-
-# if !defined (LDAV_SYMBOL) && defined (alliant)
-#  define LDAV_SYMBOL "_Loadavg"
-# endif
-
-# if !defined(LDAV_SYMBOL) && ((defined(hpux) && !defined(hp9000s300)) || defined(_SEQUENT_) || defined(SVR4) || defined(ISC) || defined(sgi) || (defined (ardent) && defined (titan)) || defined (_AIX))
-#  define LDAV_SYMBOL "avenrun"
-# endif
-
-# ifdef HAVE_UNISTD_H
-#  include <unistd.h>
-# endif
-
-# include <stdio.h>
-
-/* LOAD_AVE_TYPE should only get defined if we're going to use the
-   nlist method.  */
-# if !defined(LOAD_AVE_TYPE) && (defined(BSD) || defined(LDAV_CVT) || defined(KERNEL_FILE) || defined(LDAV_SYMBOL)) && !defined(__riscos__)
-#  define LOAD_AVE_TYPE double
-# endif
-
-# ifdef LOAD_AVE_TYPE
-
-#  ifndef VMS
-#   ifndef __linux__
-#    ifdef HAVE_NLIST_H
-#     include <nlist.h>
-#    else
-#     include <a.out.h>
-#    endif
-
-#    ifdef SUNOS_5
-#     include <fcntl.h>
-#     include <kvm.h>
-#     include <kstat.h>
-#    endif
-
-#    if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
-#     include <sys/pstat.h>
-#    endif
-
-#    ifndef KERNEL_FILE
-#     define KERNEL_FILE "/vmunix"
-#    endif /* KERNEL_FILE */
-
-#    ifndef LDAV_SYMBOL
-#     define LDAV_SYMBOL "_avenrun"
-#    endif /* LDAV_SYMBOL */
-#   endif /* __linux__ */
-
-#  else /* VMS */
-
-#   ifndef eunice
-#    include <iodef.h>
-#    include <descrip.h>
-#   else /* eunice */
-#    include <vms/iodef.h>
-#   endif /* eunice */
-#  endif /* VMS */
-
-#  ifndef LDAV_CVT
-#   define LDAV_CVT(n) ((double) (n))
-#  endif /* !LDAV_CVT */
-
-# endif /* LOAD_AVE_TYPE */
-
-# if defined(__GNU__) && !defined (NeXT)
-/* Note that NeXT Openstep defines __GNU__ even though it should not.  */
-/* GNU system acts much like NeXT, for load average purposes,
-   but not exactly.  */
-#  define NeXT
-#  define host_self mach_host_self
-# endif
-
-# ifdef NeXT
-#  ifdef HAVE_MACH_MACH_H
-#   include <mach/mach.h>
-#  else
-#   include <mach.h>
-#  endif
-# endif /* NeXT */
-
-# ifdef sgi
-#  include <sys/sysmp.h>
-# endif /* sgi */
-
-# ifdef UMAX
-#  include <stdio.h>
-#  include <signal.h>
-#  include <sys/time.h>
-#  include <sys/wait.h>
-#  include <sys/syscall.h>
-
-#  ifdef UMAX_43
-#   include <machine/cpu.h>
-#   include <inq_stats/statistics.h>
-#   include <inq_stats/sysstats.h>
-#   include <inq_stats/cpustats.h>
-#   include <inq_stats/procstats.h>
-#  else /* Not UMAX_43.  */
-#   include <sys/sysdefs.h>
-#   include <sys/statistics.h>
-#   include <sys/sysstats.h>
-#   include <sys/cpudefs.h>
-#   include <sys/cpustats.h>
-#   include <sys/procstats.h>
-#  endif /* Not UMAX_43.  */
-# endif /* UMAX */
-
-# ifdef DGUX
-#  include <sys/dg_sys_info.h>
-# endif
-
-# if defined(HAVE_FCNTL_H) || defined(_POSIX_VERSION)
-#  include <fcntl.h>
-# else
-#  include <sys/file.h>
-# endif
-\f
-
-/* Avoid static vars inside a function since in HPUX they dump as pure.  */
-
-# ifdef NeXT
-static processor_set_t default_set;
-static int getloadavg_initialized;
-# endif /* NeXT */
-
-# ifdef UMAX
-static unsigned int cpus = 0;
-static unsigned int samples;
-# endif /* UMAX */
-
-# ifdef DGUX
-static struct dg_sys_info_load_info load_info; /* what-a-mouthful! */
-# endif /* DGUX */
-
-#if !defined(HAVE_LIBKSTAT) && defined(LOAD_AVE_TYPE)
-/* File descriptor open to /dev/kmem or VMS load ave driver.  */
-static int channel;
-/* Nonzero iff channel is valid.  */
-static int getloadavg_initialized;
-/* Offset in kmem to seek to read load average, or 0 means invalid.  */
-static long offset;
-
-#if !defined(VMS) && !defined(sgi) && !defined(__linux__)
-static struct nlist nl[2];
-#endif /* Not VMS or sgi */
-
-#ifdef SUNOS_5
-static kvm_t *kd;
-#endif /* SUNOS_5 */
-
-#endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */
-\f
-/* Put the 1 minute, 5 minute and 15 minute load averages
-   into the first NELEM elements of LOADAVG.
-   Return the number written (never more than 3, but may be less than NELEM),
-   or -1 if an error occurred.  */
-
-int
-getloadavg (double loadavg[], int nelem)
-{
-  int elem = 0;                        /* Return value.  */
-
-# ifdef NO_GET_LOAD_AVG
-#  define LDAV_DONE
-  /* Set errno to zero to indicate that there was no particular error;
-     this function just can't work at all on this system.  */
-  errno = 0;
-  elem = -1;
-# endif
-
-# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT)
-/* Use libkstat because we don't have to be root.  */
-#  define LDAV_DONE
-  kstat_ctl_t *kc;
-  kstat_t *ksp;
-  kstat_named_t *kn;
-
-  kc = kstat_open ();
-  if (kc == 0)
-    return -1;
-  ksp = kstat_lookup (kc, "unix", 0, "system_misc");
-  if (ksp == 0 )
-    return -1;
-  if (kstat_read (kc, ksp, 0) == -1)
-    return -1;
-
-
-  kn = kstat_data_lookup (ksp, "avenrun_1min");
-  if (kn == 0)
-    {
-      /* Return -1 if no load average information is available.  */
-      nelem = 0;
-      elem = -1;
-    }
-
-  if (nelem >= 1)
-    loadavg[elem++] = (double) kn->value.ul/FSCALE;
-
-  if (nelem >= 2)
-    {
-      kn = kstat_data_lookup (ksp, "avenrun_5min");
-      if (kn != 0)
-       {
-         loadavg[elem++] = (double) kn->value.ul/FSCALE;
-
-         if (nelem >= 3)
-           {
-             kn = kstat_data_lookup (ksp, "avenrun_15min");
-             if (kn != 0)
-               loadavg[elem++] = (double) kn->value.ul/FSCALE;
-           }
-       }
-    }
-
-  kstat_close (kc);
-# endif /* HAVE_LIBKSTAT */
-
-# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
-/* Use pstat_getdynamic() because we don't have to be root.  */
-#  define LDAV_DONE
-#  undef LOAD_AVE_TYPE
-
-  struct pst_dynamic dyn_info;
-  if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
-    return -1;
-  if (nelem > 0)
-    loadavg[elem++] = dyn_info.psd_avg_1_min;
-  if (nelem > 1)
-    loadavg[elem++] = dyn_info.psd_avg_5_min;
-  if (nelem > 2)
-    loadavg[elem++] = dyn_info.psd_avg_15_min;
-
-# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */
-
-# if !defined (LDAV_DONE) && defined (__linux__)
-#  define LDAV_DONE
-#  undef LOAD_AVE_TYPE
-
-#  ifndef LINUX_LDAV_FILE
-#   define LINUX_LDAV_FILE "/proc/loadavg"
-#  endif
-
-  char ldavgbuf[40];
-  double load_ave[3];
-  int fd, count;
-
-  fd = open (LINUX_LDAV_FILE, O_RDONLY);
-  if (fd == -1)
-    return -1;
-  count = read (fd, ldavgbuf, 40);
-  (void) close (fd);
-  if (count <= 0)
-    return -1;
-
-  /* The following sscanf must use the C locale.  */
-  setlocale (LC_NUMERIC, "C");
-  count = sscanf (ldavgbuf, "%lf %lf %lf",
-                 &load_ave[0], &load_ave[1], &load_ave[2]);
-  setlocale (LC_NUMERIC, "");
-  if (count < 1)
-    return -1;
-
-  for (elem = 0; elem < nelem && elem < count; elem++)
-    loadavg[elem] = load_ave[elem];
-
-  return elem;
-
-# endif /* __linux__ */
-
-# if !defined (LDAV_DONE) && defined (__NetBSD__)
-#  define LDAV_DONE
-#  undef LOAD_AVE_TYPE
-
-#  ifndef NETBSD_LDAV_FILE
-#   define NETBSD_LDAV_FILE "/kern/loadavg"
-#  endif
-
-  unsigned long int load_ave[3], scale;
-  int count;
-  FILE *fp;
-
-  fp = fopen (NETBSD_LDAV_FILE, "r");
-  if (fp == NULL)
-    return -1;
-  count = fscanf (fp, "%lu %lu %lu %lu\n",
-                 &load_ave[0], &load_ave[1], &load_ave[2],
-                 &scale);
-  (void) fclose (fp);
-  if (count != 4)
-    return -1;
-
-  for (elem = 0; elem < nelem; elem++)
-    loadavg[elem] = (double) load_ave[elem] / (double) scale;
-
-  return elem;
-
-# endif /* __NetBSD__ */
-
-# if !defined (LDAV_DONE) && defined (NeXT)
-#  define LDAV_DONE
-  /* The NeXT code was adapted from iscreen 3.2.  */
-
-  host_t host;
-  struct processor_set_basic_info info;
-  unsigned info_count;
-
-  /* We only know how to get the 1-minute average for this system,
-     so even if the caller asks for more than 1, we only return 1.  */
-
-  if (!getloadavg_initialized)
-    {
-      if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
-       getloadavg_initialized = 1;
-    }
-
-  if (getloadavg_initialized)
-    {
-      info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
-      if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
-                             (processor_set_info_t) &info, &info_count)
-         != KERN_SUCCESS)
-       getloadavg_initialized = 0;
-      else
-       {
-         if (nelem > 0)
-           loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
-       }
-    }
-
-  if (!getloadavg_initialized)
-    return -1;
-# endif /* NeXT */
-
-# if !defined (LDAV_DONE) && defined (UMAX)
-#  define LDAV_DONE
-/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not
-   have a /dev/kmem.  Information about the workings of the running kernel
-   can be gathered with inq_stats system calls.
-   We only know how to get the 1-minute average for this system.  */
-
-  struct proc_summary proc_sum_data;
-  struct stat_descr proc_info;
-  double load;
-  register unsigned int i, j;
-
-  if (cpus == 0)
-    {
-      register unsigned int c, i;
-      struct cpu_config conf;
-      struct stat_descr desc;
-
-      desc.sd_next = 0;
-      desc.sd_subsys = SUBSYS_CPU;
-      desc.sd_type = CPUTYPE_CONFIG;
-      desc.sd_addr = (char *) &conf;
-      desc.sd_size = sizeof conf;
-
-      if (inq_stats (1, &desc))
-       return -1;
-
-      c = 0;
-      for (i = 0; i < conf.config_maxclass; ++i)
-       {
-         struct class_stats stats;
-         memset (&stats, '\0', sizeof stats);
-
-         desc.sd_type = CPUTYPE_CLASS;
-         desc.sd_objid = i;
-         desc.sd_addr = (char *) &stats;
-         desc.sd_size = sizeof stats;
-
-         if (inq_stats (1, &desc))
-           return -1;
-
-         c += stats.class_numcpus;
-       }
-      cpus = c;
-      samples = cpus < 2 ? 3 : (2 * cpus / 3);
-    }
-
-  proc_info.sd_next = 0;
-  proc_info.sd_subsys = SUBSYS_PROC;
-  proc_info.sd_type = PROCTYPE_SUMMARY;
-  proc_info.sd_addr = (char *) &proc_sum_data;
-  proc_info.sd_size = sizeof (struct proc_summary);
-  proc_info.sd_sizeused = 0;
-
-  if (inq_stats (1, &proc_info) != 0)
-    return -1;
-
-  load = proc_sum_data.ps_nrunnable;
-  j = 0;
-  for (i = samples - 1; i > 0; --i)
-    {
-      load += proc_sum_data.ps_nrun[j];
-      if (j++ == PS_NRUNSIZE)
-       j = 0;
-    }
-
-  if (nelem > 0)
-    loadavg[elem++] = load / samples / cpus;
-# endif /* UMAX */
-
-# if !defined (LDAV_DONE) && defined (DGUX)
-#  define LDAV_DONE
-  /* This call can return -1 for an error, but with good args
-     it's not supposed to fail.  The first argument is for no
-     apparent reason of type 'long int *'.  */
-  dg_sys_info ((long int *) &load_info,
-              DG_SYS_INFO_LOAD_INFO_TYPE,
-              DG_SYS_INFO_LOAD_VERSION_0);
-
-  if (nelem > 0)
-    loadavg[elem++] = load_info.one_minute;
-  if (nelem > 1)
-    loadavg[elem++] = load_info.five_minute;
-  if (nelem > 2)
-    loadavg[elem++] = load_info.fifteen_minute;
-# endif /* DGUX */
-
-# if !defined (LDAV_DONE) && defined (apollo)
-#  define LDAV_DONE
-/* Apollo code from lisch@mentorg.com (Ray Lischner).
-
-   This system call is not documented.  The load average is obtained as
-   three long integers, for the load average over the past minute,
-   five minutes, and fifteen minutes.  Each value is a scaled integer,
-   with 16 bits of integer part and 16 bits of fraction part.
-
-   I'm not sure which operating system first supported this system call,
-   but I know that SR10.2 supports it.  */
-
-  extern void proc1_$get_loadav ();
-  unsigned long load_ave[3];
-
-  proc1_$get_loadav (load_ave);
-
-  if (nelem > 0)
-    loadavg[elem++] = load_ave[0] / 65536.0;
-  if (nelem > 1)
-    loadavg[elem++] = load_ave[1] / 65536.0;
-  if (nelem > 2)
-    loadavg[elem++] = load_ave[2] / 65536.0;
-# endif /* apollo */
-
-# if !defined (LDAV_DONE) && defined (OSF_MIPS)
-#  define LDAV_DONE
-
-  struct tbl_loadavg load_ave;
-  table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
-  loadavg[elem++]
-    = (load_ave.tl_lscale == 0
-       ? load_ave.tl_avenrun.d[0]
-       : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
-# endif        /* OSF_MIPS */
-
-# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
-#  define LDAV_DONE
-
-  /* A faithful emulation is going to have to be saved for a rainy day.  */
-  for ( ; elem < nelem; elem++)
-    {
-      loadavg[elem] = 0.0;
-    }
-# endif  /* __MSDOS__ || WINDOWS32 */
-
-# if !defined (LDAV_DONE) && defined (OSF_ALPHA)
-#  define LDAV_DONE
-
-  struct tbl_loadavg load_ave;
-  table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
-  for (elem = 0; elem < nelem; elem++)
-    loadavg[elem]
-      = (load_ave.tl_lscale == 0
-       ? load_ave.tl_avenrun.d[elem]
-       : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
-# endif /* OSF_ALPHA */
-
-# if !defined (LDAV_DONE) && defined (VMS)
-  /* VMS specific code -- read from the Load Ave driver.  */
-
-  LOAD_AVE_TYPE load_ave[3];
-  static int getloadavg_initialized = 0;
-#  ifdef eunice
-  struct
-  {
-    int dsc$w_length;
-    char *dsc$a_pointer;
-  } descriptor;
-#  endif
-
-  /* Ensure that there is a channel open to the load ave device.  */
-  if (!getloadavg_initialized)
-    {
-      /* Attempt to open the channel.  */
-#  ifdef eunice
-      descriptor.dsc$w_length = 18;
-      descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE";
-#  else
-      $DESCRIPTOR (descriptor, "LAV0:");
-#  endif
-      if (sys$assign (&descriptor, &channel, 0, 0) & 1)
-       getloadavg_initialized = 1;
-    }
-
-  /* Read the load average vector.  */
-  if (getloadavg_initialized
-      && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
-                    load_ave, 12, 0, 0, 0, 0) & 1))
-    {
-      sys$dassgn (channel);
-      getloadavg_initialized = 0;
-    }
-
-  if (!getloadavg_initialized)
-    return -1;
-# endif /* VMS */
-
-# if !defined (LDAV_DONE) && defined(LOAD_AVE_TYPE) && !defined(VMS)
-
-  /* UNIX-specific code -- read the average from /dev/kmem.  */
-
-#  define LDAV_PRIVILEGED              /* This code requires special installation.  */
-
-  LOAD_AVE_TYPE load_ave[3];
-
-  /* Get the address of LDAV_SYMBOL.  */
-  if (offset == 0)
-    {
-#  ifndef sgi
-#   ifndef NLIST_STRUCT
-      strcpy (nl[0].n_name, LDAV_SYMBOL);
-      strcpy (nl[1].n_name, "");
-#   else /* NLIST_STRUCT */
-#    ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
-      nl[0].n_un.n_name = LDAV_SYMBOL;
-      nl[1].n_un.n_name = 0;
-#    else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
-      nl[0].n_name = LDAV_SYMBOL;
-      nl[1].n_name = 0;
-#    endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
-#   endif /* NLIST_STRUCT */
-
-#   ifndef SUNOS_5
-      if (
-#    if !(defined (_AIX) && !defined (ps2))
-         nlist (KERNEL_FILE, nl)
-#    else  /* _AIX */
-         knlist (nl, 1, sizeof (nl[0]))
-#    endif
-         >= 0)
-         /* Omit "&& nl[0].n_type != 0 " -- it breaks on Sun386i.  */
-         {
-#    ifdef FIXUP_KERNEL_SYMBOL_ADDR
-           FIXUP_KERNEL_SYMBOL_ADDR (nl);
-#    endif
-           offset = nl[0].n_value;
-         }
-#   endif /* !SUNOS_5 */
-#  else  /* sgi */
-      int ldav_off;
-
-      ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
-      if (ldav_off != -1)
-       offset = (long) ldav_off & 0x7fffffff;
-#  endif /* sgi */
-    }
-
-  /* Make sure we have /dev/kmem open.  */
-  if (!getloadavg_initialized)
-    {
-#  ifndef SUNOS_5
-      channel = open ("/dev/kmem", 0);
-      if (channel >= 0)
-       {
-         /* Set the channel to close on exec, so it does not
-            litter any child's descriptor table.  */
-#   ifdef F_SETFD
-#    ifndef FD_CLOEXEC
-#     define FD_CLOEXEC 1
-#    endif
-         (void) fcntl (channel, F_SETFD, FD_CLOEXEC);
-#   endif
-         getloadavg_initialized = 1;
-       }
-#  else /* SUNOS_5 */
-      /* We pass 0 for the kernel, corefile, and swapfile names
-        to use the currently running kernel.  */
-      kd = kvm_open (0, 0, 0, O_RDONLY, 0);
-      if (kd != 0)
-       {
-         /* nlist the currently running kernel.  */
-         kvm_nlist (kd, nl);
-         offset = nl[0].n_value;
-         getloadavg_initialized = 1;
-       }
-#  endif /* SUNOS_5 */
-    }
-
-  /* If we can, get the load average values.  */
-  if (offset && getloadavg_initialized)
-    {
-      /* Try to read the load.  */
-#  ifndef SUNOS_5
-      if (lseek (channel, offset, 0) == -1L
-         || read (channel, (char *) load_ave, sizeof (load_ave))
-         != sizeof (load_ave))
-       {
-         close (channel);
-         getloadavg_initialized = 0;
-       }
-#  else  /* SUNOS_5 */
-      if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
-         != sizeof (load_ave))
-        {
-          kvm_close (kd);
-          getloadavg_initialized = 0;
-       }
-#  endif /* SUNOS_5 */
-    }
-
-  if (offset == 0 || !getloadavg_initialized)
-    return -1;
-# endif /* LOAD_AVE_TYPE and not VMS */
-
-# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS.  */
-  if (nelem > 0)
-    loadavg[elem++] = LDAV_CVT (load_ave[0]);
-  if (nelem > 1)
-    loadavg[elem++] = LDAV_CVT (load_ave[1]);
-  if (nelem > 2)
-    loadavg[elem++] = LDAV_CVT (load_ave[2]);
-
-#  define LDAV_DONE
-# endif /* !LDAV_DONE && LOAD_AVE_TYPE */
-
-# ifdef LDAV_DONE
-  return elem;
-# else
-  /* Set errno to zero to indicate that there was no particular error;
-     this function just can't work at all on this system.  */
-  errno = 0;
-  return -1;
-# endif
-}
-
-#endif /* ! HAVE_GETLOADAVG */
-\f
-#ifdef TEST
-#include "makeint.h"
-
-int
-main (int argc, char **argv)
-{
-  int naptime = 0;
-
-  if (argc > 1)
-    naptime = atoi (argv[1]);
-
-  while (1)
-    {
-      double avg[3];
-      int loads;
-
-      errno = 0;               /* Don't be misled if it doesn't set errno.  */
-      loads = getloadavg (avg, 3);
-      if (loads == -1)
-       {
-         perror ("Error getting load average");
-         exit (1);
-       }
-      if (loads > 0)
-       printf ("1-minute: %f  ", avg[0]);
-      if (loads > 1)
-       printf ("5-minute: %f  ", avg[1]);
-      if (loads > 2)
-       printf ("15-minute: %f  ", avg[2]);
-      if (loads > 0)
-       putchar ('\n');
-
-      if (naptime == 0)
-       break;
-      sleep (naptime);
-    }
-
-  exit (0);
-}
-#endif /* TEST */
diff --git a/getopt.c b/getopt.c
deleted file mode 100644 (file)
index e3538d4..0000000
--- a/getopt.c
+++ /dev/null
@@ -1,1026 +0,0 @@
-/* Getopt for GNU.
-NOTE: getopt is now part of the C library, so if you don't know what
-"Keep this file name-space clean" means, talk to drepper@gnu.org
-before changing it!
-
-Copyright (C) 1987-2016 Free Software Foundation, Inc.
-
-NOTE: The canonical source of this file is maintained with the GNU C Library.
-Bugs can be reported to bug-glibc@gnu.org.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
-   Ditto for AIX 3.2 and <stdlib.h>.  */
-#ifndef _NO_PROTO
-# define _NO_PROTO
-#endif
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if !defined __STDC__ || !__STDC__
-/* This is a separate conditional since some stdc systems
-   reject `defined (const)'.  */
-# ifndef const
-#  define const
-# endif
-#endif
-
-#include <stdio.h>
-
-/* Comment out all this code if we are using the GNU C Library, and are not
-   actually compiling the library itself.  This code is part of the GNU C
-   Library, but also included in many other GNU distributions.  Compiling
-   and linking in this code is a waste when using the GNU C library
-   (especially if it is a shared library).  Rather than having every GNU
-   program understand `configure --with-gnu-libc' and omit the object files,
-   it is simpler to just do this in the source for each such file.  */
-
-#define GETOPT_INTERFACE_VERSION 2
-#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
-# include <gnu-versions.h>
-# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
-#  define ELIDE_CODE
-# endif
-#endif
-
-#ifndef ELIDE_CODE
-
-
-/* This needs to come after some library #include
-   to get __GNU_LIBRARY__ defined.  */
-#ifdef __GNU_LIBRARY__
-/* Don't include stdlib.h for non-GNU C libraries because some of them
-   contain conflicting prototypes for getopt.  */
-# include <stdlib.h>
-# include <unistd.h>
-#endif /* GNU C library.  */
-
-#ifdef VMS
-# include <unixlib.h>
-# if HAVE_STRING_H - 0
-#  include <string.h>
-# endif
-#endif
-
-/* This is for other GNU distributions with internationalized messages.
-   When compiling libc, the _ macro is predefined.  */
-#include "gettext.h"
-#define _(msgid)    gettext (msgid)
-
-
-/* This version of `getopt' appears to the caller like standard Unix 'getopt'
-   but it behaves differently for the user, since it allows the user
-   to intersperse the options with the other arguments.
-
-   As `getopt' works, it permutes the elements of ARGV so that,
-   when it is done, all the options precede everything else.  Thus
-   all application programs are extended to handle flexible argument order.
-
-   Setting the environment variable POSIXLY_CORRECT disables permutation.
-   Then the behavior is completely standard.
-
-   GNU application programs can use a third alternative mode in which
-   they can distinguish the relative order of options and other arguments.  */
-
-#include "getopt.h"
-
-/* For communication from `getopt' to the caller.
-   When `getopt' finds an option that takes an argument,
-   the argument value is returned here.
-   Also, when `ordering' is RETURN_IN_ORDER,
-   each non-option ARGV-element is returned here.  */
-
-char *optarg = NULL;
-
-/* Index in ARGV of the next element to be scanned.
-   This is used for communication to and from the caller
-   and for communication between successive calls to `getopt'.
-
-   On entry to `getopt', zero means this is the first call; initialize.
-
-   When `getopt' returns -1, this is the index of the first of the
-   non-option elements that the caller should itself scan.
-
-   Otherwise, `optind' communicates from one call to the next
-   how much of ARGV has been scanned so far.  */
-
-/* 1003.2 says this must be 1 before any call.  */
-int optind = 1;
-
-/* Formerly, initialization of getopt depended on optind==0, which
-   causes problems with re-calling getopt as programs generally don't
-   know that. */
-
-int __getopt_initialized = 0;
-
-/* The next char to be scanned in the option-element
-   in which the last option character we returned was found.
-   This allows us to pick up the scan where we left off.
-
-   If this is zero, or a null string, it means resume the scan
-   by advancing to the next ARGV-element.  */
-
-static char *nextchar;
-
-/* Callers store zero here to inhibit the error message
-   for unrecognized options.  */
-
-int opterr = 1;
-
-/* Set to an option character which was unrecognized.
-   This must be initialized on some systems to avoid linking in the
-   system's own getopt implementation.  */
-
-int optopt = '?';
-
-/* Describe how to deal with options that follow non-option ARGV-elements.
-
-   If the caller did not specify anything,
-   the default is REQUIRE_ORDER if the environment variable
-   POSIXLY_CORRECT is defined, PERMUTE otherwise.
-
-   REQUIRE_ORDER means don't recognize them as options;
-   stop option processing when the first non-option is seen.
-   This is what Unix does.
-   This mode of operation is selected by either setting the environment
-   variable POSIXLY_CORRECT, or using `+' as the first character
-   of the list of option characters.
-
-   PERMUTE is the default.  We permute the contents of ARGV as we scan,
-   so that eventually all the non-options are at the end.  This allows options
-   to be given in any order, even with programs that were not written to
-   expect this.
-
-   RETURN_IN_ORDER is an option available to programs that were written
-   to expect options and other ARGV-elements in any order and that care about
-   the ordering of the two.  We describe each non-option ARGV-element
-   as if it were the argument of an option with character code 1.
-   Using `-' as the first character of the list of option characters
-   selects this mode of operation.
-
-   The special argument `--' forces an end of option-scanning regardless
-   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
-   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
-
-static enum
-{
-  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
-} ordering;
-
-/* Value of POSIXLY_CORRECT environment variable.  */
-static char *posixly_correct;
-\f
-#ifdef __GNU_LIBRARY__
-/* We want to avoid inclusion of string.h with non-GNU libraries
-   because there are many ways it can cause trouble.
-   On some systems, it contains special magic macros that don't work
-   in GCC.  */
-# include <string.h>
-# define my_index      strchr
-#else
-
-# if HAVE_STRING_H
-#  include <string.h>
-# else
-#  include <strings.h>
-# endif
-
-/* Avoid depending on library functions or files
-   whose names are inconsistent.  */
-
-#ifndef getenv
-extern char *getenv ();
-#endif
-
-static char *
-my_index (const char *str, int chr)
-{
-  while (*str)
-    {
-      if (*str == chr)
-       return (char *) str;
-      str++;
-    }
-  return 0;
-}
-
-/* If using GCC, we can safely declare strlen this way.
-   If not using GCC, it is ok not to declare it.  */
-#ifdef __GNUC__
-/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
-   That was relevant to code that was here before.  */
-# if (!defined __STDC__ || !__STDC__) && !defined strlen
-/* gcc with -traditional declares the built-in strlen to return int,
-   and has done so at least since version 2.4.5. -- rms.  */
-extern int strlen (const char *);
-# endif /* not __STDC__ */
-#endif /* __GNUC__ */
-
-#endif /* not __GNU_LIBRARY__ */
-\f
-/* Handle permutation of arguments.  */
-
-/* Describe the part of ARGV that contains non-options that have
-   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
-   `last_nonopt' is the index after the last of them.  */
-
-static int first_nonopt;
-static int last_nonopt;
-
-#ifdef _LIBC
-/* Bash 2.0 gives us an environment variable containing flags
-   indicating ARGV elements that should not be considered arguments.  */
-
-/* Defined in getopt_init.c  */
-extern char *__getopt_nonoption_flags;
-
-static int nonoption_flags_max_len;
-static int nonoption_flags_len;
-
-static int original_argc;
-static char *const *original_argv;
-
-/* Make sure the environment variable bash 2.0 puts in the environment
-   is valid for the getopt call we must make sure that the ARGV passed
-   to getopt is that one passed to the process.  */
-static void __attribute__ ((unused))
-store_args_and_env (int argc, char *const *argv)
-{
-  /* XXX This is no good solution.  We should rather copy the args so
-     that we can compare them later.  But we must not use malloc(3).  */
-  original_argc = argc;
-  original_argv = argv;
-}
-# ifdef text_set_element
-text_set_element (__libc_subinit, store_args_and_env);
-# endif /* text_set_element */
-
-# define SWAP_FLAGS(ch1, ch2) \
-  if (nonoption_flags_len > 0)                                               \
-    {                                                                        \
-      char __tmp = __getopt_nonoption_flags[ch1];                            \
-      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
-      __getopt_nonoption_flags[ch2] = __tmp;                                 \
-    }
-#else  /* !_LIBC */
-# define SWAP_FLAGS(ch1, ch2)
-#endif /* _LIBC */
-
-/* Exchange two adjacent subsequences of ARGV.
-   One subsequence is elements [first_nonopt,last_nonopt)
-   which contains all the non-options that have been skipped so far.
-   The other is elements [last_nonopt,optind), which contains all
-   the options processed since those non-options were skipped.
-
-   `first_nonopt' and `last_nonopt' are relocated so that they describe
-   the new indices of the non-options in ARGV after they are moved.  */
-
-#if defined __STDC__ && __STDC__
-static void exchange (char **);
-#endif
-
-static void
-exchange (char **argv)
-{
-  int bottom = first_nonopt;
-  int middle = last_nonopt;
-  int top = optind;
-  char *tem;
-
-  /* Exchange the shorter segment with the far end of the longer segment.
-     That puts the shorter segment into the right place.
-     It leaves the longer segment in the right place overall,
-     but it consists of two parts that need to be swapped next.  */
-
-#ifdef _LIBC
-  /* First make sure the handling of the `__getopt_nonoption_flags'
-     string can work normally.  Our top argument must be in the range
-     of the string.  */
-  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
-    {
-      /* We must extend the array.  The user plays games with us and
-        presents new arguments.  */
-      char *new_str = malloc (top + 1);
-      if (new_str == NULL)
-       nonoption_flags_len = nonoption_flags_max_len = 0;
-      else
-       {
-         memset (__mempcpy (new_str, __getopt_nonoption_flags,
-                            nonoption_flags_max_len),
-                 '\0', top + 1 - nonoption_flags_max_len);
-         nonoption_flags_max_len = top + 1;
-         __getopt_nonoption_flags = new_str;
-       }
-    }
-#endif
-
-  while (top > middle && middle > bottom)
-    {
-      if (top - middle > middle - bottom)
-       {
-         /* Bottom segment is the short one.  */
-         int len = middle - bottom;
-         register int i;
-
-         /* Swap it with the top part of the top segment.  */
-         for (i = 0; i < len; i++)
-           {
-             tem = argv[bottom + i];
-             argv[bottom + i] = argv[top - (middle - bottom) + i];
-             argv[top - (middle - bottom) + i] = tem;
-             SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
-           }
-         /* Exclude the moved bottom segment from further swapping.  */
-         top -= len;
-       }
-      else
-       {
-         /* Top segment is the short one.  */
-         int len = top - middle;
-         register int i;
-
-         /* Swap it with the bottom part of the bottom segment.  */
-         for (i = 0; i < len; i++)
-           {
-             tem = argv[bottom + i];
-             argv[bottom + i] = argv[middle + i];
-             argv[middle + i] = tem;
-             SWAP_FLAGS (bottom + i, middle + i);
-           }
-         /* Exclude the moved top segment from further swapping.  */
-         bottom += len;
-       }
-    }
-
-  /* Update records for the slots the non-options now occupy.  */
-
-  first_nonopt += (optind - last_nonopt);
-  last_nonopt = optind;
-}
-
-/* Initialize the internal data when the first call is made.  */
-
-#if defined __STDC__ && __STDC__
-static const char *_getopt_initialize (int, char *const *, const char *);
-#endif
-static const char *
-_getopt_initialize (int argc, char *const *argv, const char *optstring)
-{
-  /* Start processing options with ARGV-element 1 (since ARGV-element 0
-     is the program name); the sequence of previously skipped
-     non-option ARGV-elements is empty.  */
-
-  first_nonopt = last_nonopt = optind;
-
-  nextchar = NULL;
-
-  posixly_correct = getenv ("POSIXLY_CORRECT");
-
-  /* Determine how to handle the ordering of options and nonoptions.  */
-
-  if (optstring[0] == '-')
-    {
-      ordering = RETURN_IN_ORDER;
-      ++optstring;
-    }
-  else if (optstring[0] == '+')
-    {
-      ordering = REQUIRE_ORDER;
-      ++optstring;
-    }
-  else if (posixly_correct != NULL)
-    ordering = REQUIRE_ORDER;
-  else
-    ordering = PERMUTE;
-
-#ifdef _LIBC
-  if (posixly_correct == NULL
-      && argc == original_argc && argv == original_argv)
-    {
-      if (nonoption_flags_max_len == 0)
-       {
-         if (__getopt_nonoption_flags == NULL
-             || __getopt_nonoption_flags[0] == '\0')
-           nonoption_flags_max_len = -1;
-         else
-           {
-             const char *orig_str = __getopt_nonoption_flags;
-             int len = nonoption_flags_max_len = strlen (orig_str);
-             if (nonoption_flags_max_len < argc)
-               nonoption_flags_max_len = argc;
-             __getopt_nonoption_flags =
-               (char *) malloc (nonoption_flags_max_len);
-             if (__getopt_nonoption_flags == NULL)
-               nonoption_flags_max_len = -1;
-             else
-               memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
-                       '\0', nonoption_flags_max_len - len);
-           }
-       }
-      nonoption_flags_len = nonoption_flags_max_len;
-    }
-  else
-    nonoption_flags_len = 0;
-#endif
-
-  return optstring;
-}
-\f
-/* Scan elements of ARGV (whose length is ARGC) for option characters
-   given in OPTSTRING.
-
-   If an element of ARGV starts with '-', and is not exactly "-" or "--",
-   then it is an option element.  The characters of this element
-   (aside from the initial '-') are option characters.  If `getopt'
-   is called repeatedly, it returns successively each of the option characters
-   from each of the option elements.
-
-   If `getopt' finds another option character, it returns that character,
-   updating `optind' and `nextchar' so that the next call to `getopt' can
-   resume the scan with the following option character or ARGV-element.
-
-   If there are no more option characters, `getopt' returns -1.
-   Then `optind' is the index in ARGV of the first ARGV-element
-   that is not an option.  (The ARGV-elements have been permuted
-   so that those that are not options now come last.)
-
-   OPTSTRING is a string containing the legitimate option characters.
-   If an option character is seen that is not listed in OPTSTRING,
-   return '?' after printing an error message.  If you set `opterr' to
-   zero, the error message is suppressed but we still return '?'.
-
-   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
-   so the following text in the same ARGV-element, or the text of the following
-   ARGV-element, is returned in `optarg'.  Two colons mean an option that
-   wants an optional arg; if there is text in the current ARGV-element,
-   it is returned in `optarg', otherwise `optarg' is set to zero.
-
-   If OPTSTRING starts with `-' or `+', it requests different methods of
-   handling the non-option ARGV-elements.
-   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
-
-   Long-named options begin with `--' instead of `-'.
-   Their names may be abbreviated as long as the abbreviation is unique
-   or is an exact match for some defined option.  If they have an
-   argument, it follows the option name in the same ARGV-element, separated
-   from the option name by a `=', or else the in next ARGV-element.
-   When `getopt' finds a long-named option, it returns 0 if that option's
-   `flag' field is nonzero, the value of the option's `val' field
-   if the `flag' field is zero.
-
-   The elements of ARGV aren't really const, because we permute them.
-   But we pretend they're const in the prototype to be compatible
-   with other systems.
-
-   LONGOPTS is a vector of `struct option' terminated by an
-   element containing a name which is zero.
-
-   LONGIND returns the index in LONGOPT of the long-named option found.
-   It is only valid when a long-named option has been found by the most
-   recent call.
-
-   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
-   long-named options.  */
-
-int
-_getopt_internal (int argc, char *const *argv, const char *optstring,
-                  const struct option *longopts, int *longind, int long_only)
-{
-  optarg = NULL;
-
-  if (optind == 0 || !__getopt_initialized)
-    {
-      if (optind == 0)
-       optind = 1;     /* Don't scan ARGV[0], the program name.  */
-      optstring = _getopt_initialize (argc, argv, optstring);
-      __getopt_initialized = 1;
-    }
-
-  /* Test whether ARGV[optind] points to a non-option argument.
-     Either it does not have option syntax, or there is an environment flag
-     from the shell indicating it is not an option.  The later information
-     is only used when the used in the GNU libc.  */
-#ifdef _LIBC
-# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'              \
-                     || (optind < nonoption_flags_len                        \
-                         && __getopt_nonoption_flags[optind] == '1'))
-#else
-# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
-#endif
-
-  if (nextchar == NULL || *nextchar == '\0')
-    {
-      /* Advance to the next ARGV-element.  */
-
-      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
-        moved back by the user (who may also have changed the arguments).  */
-      if (last_nonopt > optind)
-       last_nonopt = optind;
-      if (first_nonopt > optind)
-       first_nonopt = optind;
-
-      if (ordering == PERMUTE)
-       {
-         /* If we have just processed some options following some non-options,
-            exchange them so that the options come first.  */
-
-         if (first_nonopt != last_nonopt && last_nonopt != optind)
-           exchange ((char **) argv);
-         else if (last_nonopt != optind)
-           first_nonopt = optind;
-
-         /* Skip any additional non-options
-            and extend the range of non-options previously skipped.  */
-
-         while (optind < argc && NONOPTION_P)
-           optind++;
-         last_nonopt = optind;
-       }
-
-      /* The special ARGV-element `--' means premature end of options.
-        Skip it like a null option,
-        then exchange with previous non-options as if it were an option,
-        then skip everything else like a non-option.  */
-
-      if (optind != argc && !strcmp (argv[optind], "--"))
-       {
-         optind++;
-
-         if (first_nonopt != last_nonopt && last_nonopt != optind)
-           exchange ((char **) argv);
-         else if (first_nonopt == last_nonopt)
-           first_nonopt = optind;
-         last_nonopt = argc;
-
-         optind = argc;
-       }
-
-      /* If we have done all the ARGV-elements, stop the scan
-        and back over any non-options that we skipped and permuted.  */
-
-      if (optind == argc)
-       {
-         /* Set the next-arg-index to point at the non-options
-            that we previously skipped, so the caller will digest them.  */
-         if (first_nonopt != last_nonopt)
-           optind = first_nonopt;
-         return -1;
-       }
-
-      /* If we have come to a non-option and did not permute it,
-        either stop the scan or describe it to the caller and pass it by.  */
-
-      if (NONOPTION_P)
-       {
-         if (ordering == REQUIRE_ORDER)
-           return -1;
-         optarg = argv[optind++];
-         return 1;
-       }
-
-      /* We have found another option-ARGV-element.
-        Skip the initial punctuation.  */
-
-      nextchar = (argv[optind] + 1
-                 + (longopts != NULL && argv[optind][1] == '-'));
-    }
-
-  /* Decode the current option-ARGV-element.  */
-
-  /* Check whether the ARGV-element is a long option.
-
-     If long_only and the ARGV-element has the form "-f", where f is
-     a valid short option, don't consider it an abbreviated form of
-     a long option that starts with f.  Otherwise there would be no
-     way to give the -f short option.
-
-     On the other hand, if there's a long option "fubar" and
-     the ARGV-element is "-fu", do consider that an abbreviation of
-     the long option, just like "--fu", and not "-f" with arg "u".
-
-     This distinction seems to be the most useful approach.  */
-
-  if (longopts != NULL
-      && (argv[optind][1] == '-'
-         || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
-    {
-      char *nameend;
-      const struct option *p;
-      const struct option *pfound = NULL;
-      int exact = 0;
-      int ambig = 0;
-      int indfound = -1;
-      int option_index;
-
-      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
-       /* Do nothing.  */ ;
-
-      /* Test all long options for either exact match
-        or abbreviated matches.  */
-      for (p = longopts, option_index = 0; p->name; p++, option_index++)
-       if (!strncmp (p->name, nextchar, nameend - nextchar))
-         {
-           if ((unsigned int) (nameend - nextchar)
-               == (unsigned int) strlen (p->name))
-             {
-               /* Exact match found.  */
-               pfound = p;
-               indfound = option_index;
-               exact = 1;
-               break;
-             }
-           else if (pfound == NULL)
-             {
-               /* First nonexact match found.  */
-               pfound = p;
-               indfound = option_index;
-             }
-           else
-             /* Second or later nonexact match found.  */
-             ambig = 1;
-         }
-
-      if (ambig && !exact)
-       {
-         if (opterr)
-           fprintf (stderr, _("%s: option '%s' is ambiguous\n"),
-                    argv[0], argv[optind]);
-         nextchar += strlen (nextchar);
-         optind++;
-         optopt = 0;
-         return '?';
-       }
-
-      if (pfound != NULL)
-       {
-         option_index = indfound;
-         optind++;
-         if (*nameend)
-           {
-             /* Don't test has_arg with >, because some C compilers don't
-                allow it to be used on enums.  */
-             if (pfound->has_arg)
-               optarg = nameend + 1;
-             else
-               {
-                 if (opterr)
-                  if (argv[optind - 1][1] == '-')
-                   /* --option */
-                   fprintf (stderr,
-                    _("%s: option '--%s' doesn't allow an argument\n"),
-                    argv[0], pfound->name);
-                  else
-                   /* +option or -option */
-                   fprintf (stderr,
-                    _("%s: option '%c%s' doesn't allow an argument\n"),
-                    argv[0], argv[optind - 1][0], pfound->name);
-
-                 nextchar += strlen (nextchar);
-
-                 optopt = pfound->val;
-                 return '?';
-               }
-           }
-         else if (pfound->has_arg == 1)
-           {
-             if (optind < argc)
-               optarg = argv[optind++];
-             else
-               {
-                 if (opterr)
-                   fprintf (stderr,
-                          _("%s: option '%s' requires an argument\n"),
-                          argv[0], argv[optind - 1]);
-                 nextchar += strlen (nextchar);
-                 optopt = pfound->val;
-                 return optstring[0] == ':' ? ':' : '?';
-               }
-           }
-         nextchar += strlen (nextchar);
-         if (longind != NULL)
-           *longind = option_index;
-         if (pfound->flag)
-           {
-             *(pfound->flag) = pfound->val;
-             return 0;
-           }
-         return pfound->val;
-       }
-
-      /* Can't find it as a long option.  If this is not getopt_long_only,
-        or the option starts with '--' or is not a valid short
-        option, then it's an error.
-        Otherwise interpret it as a short option.  */
-      if (!long_only || argv[optind][1] == '-'
-         || my_index (optstring, *nextchar) == NULL)
-       {
-         if (opterr)
-           {
-             if (argv[optind][1] == '-')
-               /* --option */
-               fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
-                        argv[0], nextchar);
-             else
-               /* +option or -option */
-               fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
-                        argv[0], argv[optind][0], nextchar);
-           }
-         nextchar = (char *) "";
-         optind++;
-         optopt = 0;
-         return '?';
-       }
-    }
-
-  /* Look at and handle the next short option-character.  */
-
-  {
-    char c = *nextchar++;
-    char *temp = my_index (optstring, c);
-
-    /* Increment `optind' when we start to process its last character.  */
-    if (*nextchar == '\0')
-      ++optind;
-
-    if (temp == NULL || c == ':')
-      {
-       if (opterr)
-         {
-           if (posixly_correct)
-             /* 1003.2 specifies the format of this message.  */
-             fprintf (stderr, _("%s: illegal option -- %c\n"),
-                      argv[0], c);
-           else
-             fprintf (stderr, _("%s: invalid option -- %c\n"),
-                      argv[0], c);
-         }
-       optopt = c;
-       return '?';
-      }
-    /* Convenience. Treat POSIX -W foo same as long option --foo */
-    if (temp[0] == 'W' && temp[1] == ';')
-      {
-       char *nameend;
-       const struct option *p;
-       const struct option *pfound = NULL;
-       int exact = 0;
-       int ambig = 0;
-       int indfound = 0;
-       int option_index;
-
-       /* This is an option that requires an argument.  */
-       if (*nextchar != '\0')
-         {
-           optarg = nextchar;
-           /* If we end this ARGV-element by taking the rest as an arg,
-              we must advance to the next element now.  */
-           optind++;
-         }
-       else if (optind == argc)
-         {
-           if (opterr)
-             {
-               /* 1003.2 specifies the format of this message.  */
-               fprintf (stderr, _("%s: option requires an argument -- %c\n"),
-                        argv[0], c);
-             }
-           optopt = c;
-           if (optstring[0] == ':')
-             c = ':';
-           else
-             c = '?';
-           return c;
-         }
-       else
-         /* We already incremented `optind' once;
-            increment it again when taking next ARGV-elt as argument.  */
-         optarg = argv[optind++];
-
-       /* optarg is now the argument, see if it's in the
-          table of longopts.  */
-
-       for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
-         /* Do nothing.  */ ;
-
-       /* Test all long options for either exact match
-          or abbreviated matches.  */
-       for (p = longopts, option_index = 0; p->name; p++, option_index++)
-         if (!strncmp (p->name, nextchar, nameend - nextchar))
-           {
-             if ((unsigned int) (nameend - nextchar) == strlen (p->name))
-               {
-                 /* Exact match found.  */
-                 pfound = p;
-                 indfound = option_index;
-                 exact = 1;
-                 break;
-               }
-             else if (pfound == NULL)
-               {
-                 /* First nonexact match found.  */
-                 pfound = p;
-                 indfound = option_index;
-               }
-             else
-               /* Second or later nonexact match found.  */
-               ambig = 1;
-           }
-       if (ambig && !exact)
-         {
-           if (opterr)
-             fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
-                      argv[0], argv[optind]);
-           nextchar += strlen (nextchar);
-           optind++;
-           return '?';
-         }
-       if (pfound != NULL)
-         {
-           option_index = indfound;
-           if (*nameend)
-             {
-               /* Don't test has_arg with >, because some C compilers don't
-                  allow it to be used on enums.  */
-               if (pfound->has_arg)
-                 optarg = nameend + 1;
-               else
-                 {
-                   if (opterr)
-                     fprintf (stderr, _("\
-%s: option '-W %s' doesn't allow an argument\n"),
-                              argv[0], pfound->name);
-
-                   nextchar += strlen (nextchar);
-                   return '?';
-                 }
-             }
-           else if (pfound->has_arg == 1)
-             {
-               if (optind < argc)
-                 optarg = argv[optind++];
-               else
-                 {
-                   if (opterr)
-                     fprintf (stderr,
-                              _("%s: option '%s' requires an argument\n"),
-                              argv[0], argv[optind - 1]);
-                   nextchar += strlen (nextchar);
-                   return optstring[0] == ':' ? ':' : '?';
-                 }
-             }
-           nextchar += strlen (nextchar);
-           if (longind != NULL)
-             *longind = option_index;
-           if (pfound->flag)
-             {
-               *(pfound->flag) = pfound->val;
-               return 0;
-             }
-           return pfound->val;
-         }
-         nextchar = NULL;
-         return 'W';   /* Let the application handle it.   */
-      }
-    if (temp[1] == ':')
-      {
-       if (temp[2] == ':')
-         {
-           /* This is an option that accepts an argument optionally.  */
-           if (*nextchar != '\0')
-             {
-               optarg = nextchar;
-               optind++;
-             }
-           else
-             optarg = NULL;
-           nextchar = NULL;
-         }
-       else
-         {
-           /* This is an option that requires an argument.  */
-           if (*nextchar != '\0')
-             {
-               optarg = nextchar;
-               /* If we end this ARGV-element by taking the rest as an arg,
-                  we must advance to the next element now.  */
-               optind++;
-             }
-           else if (optind == argc)
-             {
-               if (opterr)
-                 {
-                   /* 1003.2 specifies the format of this message.  */
-                   fprintf (stderr,
-                          _("%s: option requires an argument -- %c\n"),
-                          argv[0], c);
-                 }
-               optopt = c;
-               if (optstring[0] == ':')
-                 c = ':';
-               else
-                 c = '?';
-             }
-           else
-             /* We already incremented `optind' once;
-                increment it again when taking next ARGV-elt as argument.  */
-             optarg = argv[optind++];
-           nextchar = NULL;
-         }
-      }
-    return c;
-  }
-}
-
-int
-getopt (int argc, char *const *argv, const char *optstring)
-{
-  return _getopt_internal (argc, argv, optstring,
-                          (const struct option *) 0,
-                          (int *) 0,
-                          0);
-}
-
-#endif /* Not ELIDE_CODE.  */
-\f
-#ifdef TEST
-
-/* Compile with -DTEST to make an executable for use in testing
-   the above definition of `getopt'.  */
-
-int
-main (int argc, char **argv)
-{
-  int c;
-  int digit_optind = 0;
-
-  while (1)
-    {
-      int this_option_optind = optind ? optind : 1;
-
-      c = getopt (argc, argv, "abc:d:0123456789");
-      if (c == -1)
-       break;
-
-      switch (c)
-       {
-       case '0':
-       case '1':
-       case '2':
-       case '3':
-       case '4':
-       case '5':
-       case '6':
-       case '7':
-       case '8':
-       case '9':
-         if (digit_optind != 0 && digit_optind != this_option_optind)
-           printf ("digits occur in two different argv-elements.\n");
-         digit_optind = this_option_optind;
-         printf ("option %c\n", c);
-         break;
-
-       case 'a':
-         printf ("option a\n");
-         break;
-
-       case 'b':
-         printf ("option b\n");
-         break;
-
-       case 'c':
-         printf ("option c with value '%s'\n", optarg);
-         break;
-
-       case '?':
-         break;
-
-       default:
-         printf ("?? getopt returned character code 0%o ??\n", c);
-       }
-    }
-
-  if (optind < argc)
-    {
-      printf ("non-option ARGV-elements: ");
-      while (optind < argc)
-       printf ("%s ", argv[optind++]);
-      printf ("\n");
-    }
-
-  exit (0);
-}
-
-#endif /* TEST */
diff --git a/getopt.h b/getopt.h
deleted file mode 100644 (file)
index 4acd4ee..0000000
--- a/getopt.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Declarations for getopt.
-Copyright (C) 1989-2016 Free Software Foundation, Inc.
-
-NOTE: The canonical source of this file is maintained with the GNU C Library.
-Bugs can be reported to bug-glibc@gnu.org.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _GETOPT_H
-#define _GETOPT_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* For communication from `getopt' to the caller.
-   When `getopt' finds an option that takes an argument,
-   the argument value is returned here.
-   Also, when `ordering' is RETURN_IN_ORDER,
-   each non-option ARGV-element is returned here.  */
-
-extern char *optarg;
-
-/* Index in ARGV of the next element to be scanned.
-   This is used for communication to and from the caller
-   and for communication between successive calls to `getopt'.
-
-   On entry to `getopt', zero means this is the first call; initialize.
-
-   When `getopt' returns -1, this is the index of the first of the
-   non-option elements that the caller should itself scan.
-
-   Otherwise, `optind' communicates from one call to the next
-   how much of ARGV has been scanned so far.  */
-
-extern int optind;
-
-/* Callers store zero here to inhibit the error message `getopt' prints
-   for unrecognized options.  */
-
-extern int opterr;
-
-/* Set to an option character which was unrecognized.  */
-
-extern int optopt;
-
-/* Describe the long-named options requested by the application.
-   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
-   of `struct option' terminated by an element containing a name which is
-   zero.
-
-   The field `has_arg' is:
-   no_argument         (or 0) if the option does not take an argument,
-   required_argument   (or 1) if the option requires an argument,
-   optional_argument   (or 2) if the option takes an optional argument.
-
-   If the field `flag' is not NULL, it points to a variable that is set
-   to the value given in the field `val' when the option is found, but
-   left unchanged if the option is not found.
-
-   To have a long-named option do something other than set an `int' to
-   a compiled-in constant, such as set a value from `optarg', set the
-   option's `flag' field to zero and its `val' field to a nonzero
-   value (the equivalent single-letter option character, if there is
-   one).  For long options that have a zero `flag' field, `getopt'
-   returns the contents of the `val' field.  */
-
-struct option
-{
-#if defined (__STDC__) && __STDC__
-  const char *name;
-#else
-  char *name;
-#endif
-  /* has_arg can't be an enum because some compilers complain about
-     type mismatches in all the code that assumes it is an int.  */
-  int has_arg;
-  int *flag;
-  int val;
-};
-
-/* Names for the values of the `has_arg' field of `struct option'.  */
-
-#define        no_argument             0
-#define required_argument      1
-#define optional_argument      2
-
-#if defined (__STDC__) && __STDC__
-#ifdef __GNU_LIBRARY__
-/* Many other libraries have conflicting prototypes for getopt, with
-   differences in the consts, in stdlib.h.  To avoid compilation
-   errors, only prototype getopt for the GNU C library.  */
-extern int getopt (int argc, char *const *argv, const char *shortopts);
-#else /* not __GNU_LIBRARY__ */
-extern int getopt ();
-#endif /* __GNU_LIBRARY__ */
-extern int getopt_long (int argc, char *const *argv, const char *shortopts,
-                       const struct option *longopts, int *longind);
-extern int getopt_long_only (int argc, char *const *argv,
-                            const char *shortopts,
-                            const struct option *longopts, int *longind);
-
-/* Internal only.  Users should not call this directly.  */
-extern int _getopt_internal (int argc, char *const *argv,
-                            const char *shortopts,
-                            const struct option *longopts, int *longind,
-                            int long_only);
-#else /* not __STDC__ */
-extern int getopt ();
-extern int getopt_long ();
-extern int getopt_long_only ();
-
-extern int _getopt_internal ();
-#endif /* __STDC__ */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* getopt.h */
diff --git a/getopt1.c b/getopt1.c
deleted file mode 100644 (file)
index 0e38b2f..0000000
--- a/getopt1.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/* getopt_long and getopt_long_only entry points for GNU getopt.
-Copyright (C) 1987-1994, 1996-2016 Free Software Foundation, Inc.
-
-NOTE: The canonical source of this file is maintained with the GNU C Library.
-Bugs can be reported to bug-glibc@gnu.org.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-\f
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "getopt.h"
-
-#if !defined __STDC__ || !__STDC__
-/* This is a separate conditional since some stdc systems
-   reject `defined (const)'.  */
-#ifndef const
-#define const
-#endif
-#endif
-
-#include <stdio.h>
-
-/* Comment out all this code if we are using the GNU C Library, and are not
-   actually compiling the library itself.  This code is part of the GNU C
-   Library, but also included in many other GNU distributions.  Compiling
-   and linking in this code is a waste when using the GNU C library
-   (especially if it is a shared library).  Rather than having every GNU
-   program understand `configure --with-gnu-libc' and omit the object files,
-   it is simpler to just do this in the source for each such file.  */
-
-#define GETOPT_INTERFACE_VERSION 2
-#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
-#include <gnu-versions.h>
-#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
-#define ELIDE_CODE
-#endif
-#endif
-
-#ifndef ELIDE_CODE
-
-
-/* This needs to come after some library #include
-   to get __GNU_LIBRARY__ defined.  */
-#ifdef __GNU_LIBRARY__
-#include <stdlib.h>
-#endif
-
-#ifndef        NULL
-#define NULL 0
-#endif
-
-int
-getopt_long (int argc, char *const *argv, const char *options,
-             const struct option *long_options, int *opt_index)
-{
-  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
-}
-
-/* Like getopt_long, but '-' as well as '--' can indicate a long option.
-   If an option that starts with '-' (not '--') doesn't match a long option,
-   but does match a short option, it is parsed as a short option
-   instead.  */
-
-int
-getopt_long_only (int argc, char *const *argv, const char *options,
-                  const struct option *long_options, int *opt_index)
-{
-  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
-}
-
-
-#endif /* Not ELIDE_CODE.  */
-\f
-#ifdef TEST
-
-#include <stdio.h>
-
-int
-main (int argc, char **argv)
-{
-  int c;
-  int digit_optind = 0;
-
-  while (1)
-    {
-      int this_option_optind = optind ? optind : 1;
-      int option_index = 0;
-      static struct option long_options[] =
-      {
-       {"add", 1, 0, 0},
-       {"append", 0, 0, 0},
-       {"delete", 1, 0, 0},
-       {"verbose", 0, 0, 0},
-       {"create", 0, 0, 0},
-       {"file", 1, 0, 0},
-       {0, 0, 0, 0}
-      };
-
-      c = getopt_long (argc, argv, "abc:d:0123456789",
-                      long_options, &option_index);
-      if (c == -1)
-       break;
-
-      switch (c)
-       {
-       case 0:
-         printf ("option %s", long_options[option_index].name);
-         if (optarg)
-           printf (" with arg %s", optarg);
-         printf ("\n");
-         break;
-
-       case '0':
-       case '1':
-       case '2':
-       case '3':
-       case '4':
-       case '5':
-       case '6':
-       case '7':
-       case '8':
-       case '9':
-         if (digit_optind != 0 && digit_optind != this_option_optind)
-           printf ("digits occur in two different argv-elements.\n");
-         digit_optind = this_option_optind;
-         printf ("option %c\n", c);
-         break;
-
-       case 'a':
-         printf ("option a\n");
-         break;
-
-       case 'b':
-         printf ("option b\n");
-         break;
-
-       case 'c':
-         printf ("option c with value '%s'\n", optarg);
-         break;
-
-       case 'd':
-         printf ("option d with value '%s'\n", optarg);
-         break;
-
-       case '?':
-         break;
-
-       default:
-         printf ("?? getopt returned character code 0%o ??\n", c);
-       }
-    }
-
-  if (optind < argc)
-    {
-      printf ("non-option ARGV-elements: ");
-      while (optind < argc)
-       printf ("%s ", argv[optind++]);
-      printf ("\n");
-    }
-
-  exit (0);
-}
-
-#endif /* TEST */
diff --git a/gettext.h b/gettext.h
deleted file mode 100644 (file)
index c48ffa0..0000000
--- a/gettext.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Convenience header for conditional use of GNU <libintl.h>.
-Copyright (C) 1995-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _LIBGETTEXT_H
-#define _LIBGETTEXT_H 1
-
-/* NLS can be disabled through the configure --disable-nls option.  */
-#if ENABLE_NLS
-
-/* Get declarations of GNU message catalog functions.  */
-# include <libintl.h>
-
-#else
-
-/* Disabled NLS.
-   The casts to 'const char *' serve the purpose of producing warnings
-   for invalid uses of the value returned from these functions.
-   On pre-ANSI systems without 'const', the config.h file is supposed to
-   contain "#define const".  */
-# define gettext(Msgid) ((const char *) (Msgid))
-# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
-# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
-# define ngettext(Msgid1, Msgid2, N) \
-    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
-# define dngettext(Domainname, Msgid1, Msgid2, N) \
-    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
-# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
-    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
-# define textdomain(Domainname) ((const char *) (Domainname))
-# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
-# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
-
-#endif
-
-/* A pseudo function call that serves as a marker for the automated
-   extraction of messages, but does not call gettext().  The run-time
-   translation is done at a different place in the code.
-   The argument, String, should be a literal string.  Concatenated strings
-   and other string expressions won't work.
-   The macro's expansion is not parenthesized, so that it is suitable as
-   initializer for static 'char[]' or 'const char[]' variables.  */
-#define gettext_noop(String) String
-
-#endif /* _LIBGETTEXT_H */
diff --git a/glob/COPYING.LIB b/glob/COPYING.LIB
deleted file mode 100644 (file)
index bbe3fe1..0000000
+++ /dev/null
@@ -1,481 +0,0 @@
-                 GNU LIBRARY GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
-                    675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it.  You can use it for
-your libraries, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if
-you distribute copies of the library, or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library.  If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
-\f
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software.  To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-  Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs.  This
-license, the GNU Library General Public License, applies to certain
-designated libraries.  This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
-  The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it.  Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program.  However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
-  Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries.  We
-concluded that weaker conditions might promote sharing better.
-
-  However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves.  This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them.  (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.)  The hope is that this
-will lead to faster development of free libraries.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, while the latter only
-works together with the library.
-
-  Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-\f
-                 GNU LIBRARY GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License").  Each licensee is
-addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-\f
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-\f
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-\f
-  6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License.  If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    c) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    d) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the source code distributed need not include anything that is normally
-distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-\f
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-\f
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Library General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-\f
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-                           NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-                    END OF TERMS AND CONDITIONS
-\f
-     Appendix: How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
-    License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-    Library General Public License for more details.
-
-    You should have received a copy of the GNU Library General Public
-    License along with this library; if not, write to the Free
-    Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/glob/ChangeLog b/glob/ChangeLog
deleted file mode 100644 (file)
index c543c85..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-2013-10-20  Paul Smith  <psmith@gnu.org>
-
-       * glob.c (glob): Cherry-pick a471e96a5352a5f0bde6d32dd36d33524811a2b1
-       from git://sourceware.org/git/glibc.git to fix SV 18123,
-       https://sourceware.org/bugzilla/show_bug.cgi?id=10278
-
-2008-09-28  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
-
-       * glob.c (my_realloc) [__DJGPP__]: Don't define, and don't
-       redefine realloc to call it, since the DJGPP's realloc handles
-       NULL pointers correctly.
-
-2007-12-22  Juan Manuel Guerrero  <juan.guerrero@gmx.de>  (tiny change)
-
-       * glob.c [__GNU_LIBRARY__ && __DJGPP__]: Add a realloc
-       declaration that matches the one in the DJGPP libc.
-
-2006-02-24  Eli Zaretskii  <eliz@gnu.org>
-
-       * glob.c (my_malloc) [WINDOWS32]: Provide a full ISO C prototype,
-       to avoid compiler warnings.
-
-2005-06-25  Paul D. Smith  <psmith@gnu.org>
-
-       * fnmatch.h, glob.h [WINDOWS32]: Fix ifdefs in headers.
-       Fixes Savannah bug #13477.
-
-2005-03-11  Paul D. Smith  <psmith@gnu.org>
-
-       * glob.c (glob_in_dir): Change FNM_CASEFOLD to be enabled if
-       HAVE_CASE_INSENSITIVE_FS is defined.
-
-2003-01-30  Paul D. Smith  <psmith@gnu.org>
-
-       * glob.h: Patch for FreeBSD by Mike Barcroft <mike@freebsd.org>
-       Reported by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>.  On
-       FreeBSD, declare __size_t to simply size_t.
-
-2002-04-22  Paul D. Smith  <psmith@gnu.org>
-
-       * Makefile.am: Use automake 1.6.
-       Use new automake condition USE_LOCAL_GLOB to decide whether or not
-       to build the local GNU glob library or use the system one.
-
-1999-09-12  Paul D. Smith  <psmith@gnu.org>
-
-       * fnmatch.c: Last GLIBC version wouldn't compile outside of GLIBC
-       (undefined reference to internal_function).  Update to the latest
-       version
-
-1999-09-11  Paul Eggert  <eggert@twinsun.com>
-
-       * glob.h (glob): If #defining to glob64, do this before
-       declaring it, so that all declarations and uses match, and
-       do not declare glob64, to avoid a declaration clash.
-       (globfree): Likewise with globfree64.
-
-1999-09-08  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * glob.c (prefix_array) [__MSDOS__,WINDOWS32]: Keep the trailing
-       slash unless DIRNAME is just "x:/".
-
-1999-09-06  Paul D. Smith  <psmith@gnu.org>
-
-       * fnmatch.c: Update to latest version from GLIBC.
-
-1999-07-21  Paul D. Smith  <psmith@gnu.org>
-
-       * glob.c, glob.h, fnmatch.c, fnmatch.h: Update to latest version
-       from GLIBC.
-
-       * fnmatch.c (internal_fnmatch): Use K&R definition syntax, not ANSI.
-       (__strchrnul): This won't exist outside GLIBC, so create one.
-
-       * glob.c: Move getlogin{,_r} prototypes below glob.h to get __P()
-       macro.
-
-1998-08-05  Paul D. Smith  <psmith@gnu.org>
-
-       * configure.in: Remove; configuration for glob is handled by the
-       make configure.in.
-
-1998-07-29  Paul D. Smith  <psmith@gnu.org>
-
-       * glob.c, fnmatch.c: New versions from the GLIBC folks (Ulrich
-       Drepper).  Fixes a bug reported by Eli Zaretski.  Integrates
-       DOS/Windows32 support.
-
-1998-07-27  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
-
-       * glob.c (glob): Cast away const on assignment of pattern to dirname.
-       Cast the return type of __alloca() for traditional C compilers.
-
-1998-07-23  Paul D. Smith  <psmith@gnu.org>
-
-       * glob.c, fnmatch.c: New versions of these files from the GLIBC
-       folks (Ulrich Drepper).  Had to re-integrate some DOS/Windows
-       code.
-
-1998-07-10  Paul D. Smith  <psmith@gnu.org>
-
-       * glob.c (glob_in_dir): If no meta chars exist in PATTERN and
-       GLOB_NOCHECK is present, don't look for the file--whether it's
-       found or not, we'll always return it, so why bother searching?
-
-       Also, if we are searching and there are no meta chars, don't
-       bother trying fnmatch() if the strcmp() fails.
-
-1998-05-30  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * glob.c (glob) [__MSDOS__, WINDOWS32]: Compute the directory and
-       filename parts of the pattern correctly when it includes a drive
-       spec.  Disallow wildcards in the drive spec.  Prevent recursion
-       when dirname is of the form "d:/" or "d:".
-       (prefix_array) [__MSDOS__, WINDOWS32]: Don't append a slash to
-       "d:/" and "d:".
-
-1998-05-13  Paul D. Smith  <psmith@gnu.org>
-
-       * SMakefile, Makefile.ami, glob.c, glob.h, fnmatch.c: Updated from
-       the latest glibc version.
-
-1998-04-17  Paul D. Smith  <psmith@gnu.org>
-
-       * configure.in: Create a config.h file instead of setting things
-       on the compile line.  This is because when build.sh runs it merely
-       passes -DHAVE_CONFIG_H to the glob files, just as it does to the
-       make files.
-       * config.h.in: Created by autoheader.
-
-Tue Aug 12 10:52:34 1997  Paul D. Smith  <psmith@baynetworks.com>
-
-       * configure.in: Require autoconf 2.12.
-
-       * glob: Updates from latest GNU libc glob code.
-
-       * glob.c,glob.h,fnmatch.h: Change all WIN32 references to WINDOWS32.
-
-       * glob.h: OSF4 defines macros in such a way that GLOB_ALTDIRFUNC
-       is not defined.  Added a test to the #if which defines it if
-       _GNU_SOURCE is defined; that's set by both glob.c and GNU make.
-
-       * glob.c: SunOS4 w/ cc needs #include <stdio.h>, since assert.h
-       requires stderr but doesn't include stdio.h :-/.
-       (next_brace_sub): De-protoize function definition.
-       (glob): Cast __alloca(); on SunOS4 it uses the default return type
-       of int.
-       (glob): Irix defines getlogin_r() to return a char*; move the
-       extern for that into the _LIBC area since it isn't used except in
-       LIBC anyway.  Likewise, move extern getlogin() into the "else".
-
-Sat Jul 20 21:55:31 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
-
-       Win32 hacks from <Rob_Tulloh@tivoli.com>.
-       * posix/glob.c [WIN32]: Don't include <pwd.h>; don't use d_ino;
-       use void * for my_realloc; include <malloc.h> for alloca.
-       (glob) [WIN32]: Use "c:/users/default" for ~ if no HOME variable.
-       * posix/fnmatch.h [WIN32]: Use prototypes even if [!__STDC__].
-       * posix/glob.h: Likewise.
-
-Fri Jul 19 16:56:41 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
-
-       * posix/glob.h [!_AMIGA && !VMS]: Check this instead of just [!_AMIGA]
-       for `struct stat;' forward decl.
-
-Sat Jun 22 10:44:09 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
-
-       * posix/glob.c: Include <alloca.h> only [HAVE_ALLOCA_H], not [sparc].
-
-Fri Jun 21 00:27:51 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
-
-       * posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr
-       only for ?s, not for *s.  Fix from Chet Ramey.
-\f
-
-Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
-Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/glob/Makefile.am b/glob/Makefile.am
deleted file mode 100644 (file)
index 93fd60a..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*-Makefile-*-, or close enough
-# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-AUTOMAKE_OPTIONS =     foreign
-
-# Only build the library when the system doesn't already have GNU glob.
-if USE_LOCAL_GLOB
-  noinst_LIBRARIES =   libglob.a
-endif
-
-libglob_a_SOURCES =    glob.c glob.h fnmatch.c fnmatch.h
-
-
-EXTRA_DIST =           COPYING.LIB Makefile.ami SCOPTIONS SMakefile \
-                       configure.bat
diff --git a/glob/Makefile.ami b/glob/Makefile.ami
deleted file mode 100644 (file)
index 3fbf7e5..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-# Makefile for standalone libglob.a (fnmatch, glob).             -*-Makefile-*-
-# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# Ultrix 2.2 make doesn't expand the value of VPATH.
-VPATH = /glob/
-# This must repeat the value, because configure will remove `VPATH = .'.
-srcdir = /glob/
-
-CC = sc
-RM = delete
-CPPFLAGS =
-CFLAGS =
-
-# Information determined by configure.
-DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \
-       Define HAVE_DIRENT_H
-
-# How to invoke ar.
-AR = join
-ARFLAGS = as
-
-# How to invoke ranlib.
-RANLIB = ;
-
-.PHONY: all
-all: glob.lib
-
-glob.lib : glob.o fnmatch.o
-       $(AR) $(ARFLAGS) $@ glob.o fnmatch.o
-       $(RANLIB) $@
-
-# For some reason, Unix make wants the dependencies on the source files.
-# Otherwise it refuses to use an implicit rule!
-# And, get this: it doesn't work to use $(srcdir)foo.c!!
-glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c
-fnmatch.o: $(srcdir)fnmatch.h fnmatch.c
-
-OUTPUT_OPTION =
-.c.o:
-       $(CC) IDir "" \
-             $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
-
-.PHONY: clean realclean glob-clean glob-realclean distclean
-clean glob-clean:
-       -$(RM) glob.lib "#?.o" core
-distclean glob-realclean: clean
-       -$(RM) TAGS tags Makefile config.status config.h config.log
-realcean: distclean
-
-# For inside the C library.
-glob.tar glob.tar.Z:
-       $(MAKE) -C .. $@
diff --git a/glob/Makefile.in b/glob/Makefile.in
deleted file mode 100644 (file)
index 39761c5..0000000
+++ /dev/null
@@ -1,604 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# -*-Makefile-*-, or close enough
-# Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = glob
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \
-       $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \
-       $(top_srcdir)/config/intlmacosx.m4 \
-       $(top_srcdir)/config/lib-ld.m4 \
-       $(top_srcdir)/config/lib-link.m4 \
-       $(top_srcdir)/config/lib-prefix.m4 \
-       $(top_srcdir)/config/longlong.m4 $(top_srcdir)/config/nls.m4 \
-       $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \
-       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-ARFLAGS = cru
-AM_V_AR = $(am__v_AR_@AM_V@)
-am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
-am__v_AR_0 = @echo "  AR      " $@;
-am__v_AR_1 = 
-libglob_a_AR = $(AR) $(ARFLAGS)
-libglob_a_LIBADD =
-am_libglob_a_OBJECTS = glob.$(OBJEXT) fnmatch.$(OBJEXT)
-libglob_a_OBJECTS = $(am_libglob_a_OBJECTS)
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/config/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_@AM_V@)
-am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_@AM_V@)
-am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
-SOURCES = $(libglob_a_SOURCES)
-DIST_SOURCES = $(libglob_a_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \
-       COPYING.LIB ChangeLog
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_LDFLAGS = @AM_LDFLAGS@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
-GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
-GLOBINC = @GLOBINC@
-GLOBLIB = @GLOBLIB@
-GMSGFMT = @GMSGFMT@
-GMSGFMT_015 = @GMSGFMT_015@
-GREP = @GREP@
-GUILE_CFLAGS = @GUILE_CFLAGS@
-GUILE_LIBS = @GUILE_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-KMEM_GROUP = @KMEM_GROUP@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MAKE_HOST = @MAKE_HOST@
-MKDIR_P = @MKDIR_P@
-MSGFMT = @MSGFMT@
-MSGFMT_015 = @MSGFMT_015@
-MSGMERGE = @MSGMERGE@
-NEED_SETGID = @NEED_SETGID@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-REMOTE = @REMOTE@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-USE_NLS = @USE_NLS@
-VERSION = @VERSION@
-XGETTEXT = @XGETTEXT@
-XGETTEXT_015 = @XGETTEXT_015@
-XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = foreign
-
-# Only build the library when the system doesn't already have GNU glob.
-@USE_LOCAL_GLOB_TRUE@noinst_LIBRARIES = libglob.a
-libglob_a_SOURCES = glob.c glob.h fnmatch.c fnmatch.h
-EXTRA_DIST = COPYING.LIB Makefile.ami SCOPTIONS SMakefile \
-                       configure.bat
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign glob/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign glob/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLIBRARIES:
-       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-
-libglob.a: $(libglob_a_OBJECTS) $(libglob_a_DEPENDENCIES) $(EXTRA_libglob_a_DEPENDENCIES) 
-       $(AM_V_at)-rm -f libglob.a
-       $(AM_V_AR)$(libglob_a_AR) libglob.a $(libglob_a_OBJECTS) $(libglob_a_LIBADD)
-       $(AM_V_at)$(RANLIB) libglob.a
-
-mostlyclean-compile:
-       -rm -f *.$(OBJEXT)
-
-distclean-compile:
-       -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LIBRARIES)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
-
-distclean: distclean-am
-       -rm -rf ./$(DEPDIR)
-       -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-       distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR)
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
-       distclean-compile distclean-generic distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
-       uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/glob/SCOPTIONS b/glob/SCOPTIONS
deleted file mode 100644 (file)
index f89daae..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-ERRORREXX
-OPTIMIZE
-NOVERSION
-OPTIMIZERTIME
-OPTIMIZERALIAS
-DEFINE INCLUDEDIR="include:"
-DEFINE LIBDIR="lib:"
-DEFINE NO_ALLOCA
-DEFINE NO_FLOAT
-DEFINE NO_ARCHIVES
-IGNORE=161
-IGNORE=100
-STARTUP=cres
diff --git a/glob/SMakefile b/glob/SMakefile
deleted file mode 100644 (file)
index 0476a15..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-# Makefile for standalone distribution of libglob.a (fnmatch, glob).
-# Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# Ultrix 2.2 make doesn't expand the value of VPATH.
-VPATH = /glob/
-# This must repeat the value, because configure will remove `VPATH = .'.
-srcdir = /glob/
-
-CC = sc
-CPPFLAGS =
-CFLAGS =
-MAKE = smake
-RM = delete
-
-# Information determined by configure.
-DEFS = Define HAVE_HEADER_STDC Define HAVE_UNISTD_H Define HAVE_STRING_H \
-       Define HAVE_DIRENT_H
-
-# How to invoke ar.
-AR = join
-ARFLAGS = as
-
-# How to invoke ranlib.
-RANLIB = ;
-
-.PHONY: all
-all: glob.lib
-
-glob.lib : glob.o fnmatch.o
-       $(AR) $(ARFLAGS) $@ glob.o fnmatch.o
-       $(RANLIB) $@
-
-# For some reason, Unix make wants the dependencies on the source files.
-# Otherwise it refuses to use an implicit rule!
-# And, get this: it doesn't work to use $(srcdir)foo.c!!
-glob.o: $(srcdir)glob.h $(srcdir)fnmatch.h glob.c
-fnmatch.o: $(srcdir)fnmatch.h fnmatch.c
-
-.c.o:
-       $(CC) IDir "" \
-             $(DEFS) $(CPPFLAGS) $(CFLAGS) $< $(OUTPUT_OPTION)
-
-.PHONY: clean realclean glob-clean glob-realclean distclean
-clean glob-clean:
-       -$(RM) -f glob.lib *.o core
-distclean glob-realclean: clean
-       -$(RM) -f TAGS tags Makefile config.status config.h config.log
-realcean: distclean
-
-# For inside the C library.
-glob.tar glob.tar.Z:
-       $(MAKE) -C .. $@
diff --git a/glob/configure.bat b/glob/configure.bat
deleted file mode 100644 (file)
index 672d733..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-@echo off\r
-rem Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,\r
-rem 2004, 2005, 2006, 2007 Free Software Foundation, Inc.\r
-rem This file is part of GNU Make.\r
-rem\r
-rem GNU Make is free software; you can redistribute it and/or modify it under\r
-rem the terms of the GNU General Public License as published by the Free\r
-rem Software Foundation; either version 3 of the License, or (at your option)\r
-rem any later version.\r
-rem\r
-rem GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
-rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
-rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
-rem more details.\r
-rem\r
-rem You should have received a copy of the GNU General Public License along\r
-rem with this program.  If not, see <http://www.gnu.org/licenses/>.\r
-\r
-echo Configuring glob for DJGPP\r
-rem This batch file assumes a unix-type "sed" program\r
-\r
-echo # Makefile generated by "configure.bat"> Makefile\r
-\r
-if exist config.sed del config.sed\r
-\r
-echo "s/@srcdir@/./                                    ">> config.sed\r
-echo "s/@CC@/gcc/                                      ">> config.sed\r
-echo "s/@CFLAGS@/-O2 -g/                               ">> config.sed\r
-echo "s/@CPPFLAGS@/-DHAVE_CONFIG_H -I../               ">> config.sed\r
-echo "s/@AR@/ar/                                       ">> config.sed\r
-echo "s/@RANLIB@/ranlib/                               ">> config.sed\r
-echo "s/@LDFLAGS@//                                    ">> config.sed\r
-echo "s/@DEFS@//                                       ">> config.sed\r
-echo "s/@ALLOCA@//                                     ">> config.sed\r
-echo "s/@LIBS@//                                       ">> config.sed\r
-echo "s/@LIBOBJS@//                                    ">> config.sed\r
-echo "s/^Makefile *:/_Makefile:/                       ">> config.sed\r
-echo "s/^config.h *:/_config.h:/                       ">> config.sed\r
-\r
-sed -e "s/^\"//" -e "s/\"$//" -e "s/[  ]*$//" config.sed > config2.sed\r
-sed -f config2.sed Makefile.in >> Makefile\r
-del config.sed\r
-del config2.sed\r
diff --git a/glob/fnmatch.c b/glob/fnmatch.c
deleted file mode 100644 (file)
index 4da8c5f..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software
-Foundation, Inc.
-This file is part of the GNU C Library.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public License
-along with this library; see the file COPYING.LIB.  If not, write to the Free
-Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
-USA.  */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Enable GNU extensions in fnmatch.h.  */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE   1
-#endif
-
-#include <errno.h>
-#include <fnmatch.h>
-#include <ctype.h>
-
-#if HAVE_STRING_H || defined _LIBC
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-
-#if defined STDC_HEADERS || defined _LIBC
-# include <stdlib.h>
-#endif
-
-/* For platform which support the ISO C amendement 1 functionality we
-   support user defined character classes.  */
-#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
-# include <wchar.h>
-# include <wctype.h>
-#endif
-
-/* Comment out all this code if we are using the GNU C Library, and are not
-   actually compiling the library itself.  This code is part of the GNU C
-   Library, but also included in many other GNU distributions.  Compiling
-   and linking in this code is a waste when using the GNU C library
-   (especially if it is a shared library).  Rather than having every GNU
-   program understand `configure --with-gnu-libc' and omit the object files,
-   it is simpler to just do this in the source for each such file.  */
-
-#if defined _LIBC || !defined __GNU_LIBRARY__
-
-
-# if defined STDC_HEADERS || !defined isascii
-#  define ISASCII(c) 1
-# else
-#  define ISASCII(c) isascii(c)
-# endif
-
-# ifdef isblank
-#  define ISBLANK(c) (ISASCII (c) && isblank (c))
-# else
-#  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-# endif
-# ifdef isgraph
-#  define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-# else
-#  define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-# endif
-
-# define ISPRINT(c) (ISASCII (c) && isprint (c))
-# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
-# define ISALNUM(c) (ISASCII (c) && isalnum (c))
-# define ISALPHA(c) (ISASCII (c) && isalpha (c))
-# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
-# define ISLOWER(c) (ISASCII (c) && islower (c))
-# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
-# define ISSPACE(c) (ISASCII (c) && isspace (c))
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
-# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
-
-# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
-
-# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
-/* The GNU C library provides support for user-defined character classes
-   and the functions from ISO C amendement 1.  */
-#  ifdef CHARCLASS_NAME_MAX
-#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
-#  else
-/* This shouldn't happen but some implementation might still have this
-   problem.  Use a reasonable default value.  */
-#   define CHAR_CLASS_MAX_LENGTH 256
-#  endif
-
-#  ifdef _LIBC
-#   define IS_CHAR_CLASS(string) __wctype (string)
-#  else
-#   define IS_CHAR_CLASS(string) wctype (string)
-#  endif
-# else
-#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
-
-#  define IS_CHAR_CLASS(string)                                                      \
-   (STREQ (string, "alpha") || STREQ (string, "upper")                       \
-    || STREQ (string, "lower") || STREQ (string, "digit")                    \
-    || STREQ (string, "alnum") || STREQ (string, "xdigit")                   \
-    || STREQ (string, "space") || STREQ (string, "print")                    \
-    || STREQ (string, "punct") || STREQ (string, "graph")                    \
-    || STREQ (string, "cntrl") || STREQ (string, "blank"))
-# endif
-
-/* Avoid depending on library functions or files
-   whose names are inconsistent.  */
-
-# if !defined _LIBC && !defined getenv
-extern char *getenv ();
-# endif
-
-# ifndef errno
-extern int errno;
-# endif
-
-/* This function doesn't exist on most systems.  */
-
-# if !defined HAVE___STRCHRNUL && !defined _LIBC
-static char *
-__strchrnul (s, c)
-     const char *s;
-     int c;
-{
-  char *result = strchr (s, c);
-  if (result == NULL)
-    result = strchr (s, '\0');
-  return result;
-}
-# endif
-
-# ifndef internal_function
-/* Inside GNU libc we mark some function in a special way.  In other
-   environments simply ignore the marking.  */
-#  define internal_function
-# endif
-
-/* Match STRING against the filename pattern PATTERN, returning zero if
-   it matches, nonzero if not.  */
-static int internal_fnmatch __P ((const char *pattern, const char *string,
-                                 int no_leading_period, int flags))
-     internal_function;
-static int
-internal_function
-internal_fnmatch (pattern, string, no_leading_period, flags)
-     const char *pattern;
-     const char *string;
-     int no_leading_period;
-     int flags;
-{
-  register const char *p = pattern, *n = string;
-  register unsigned char c;
-
-/* Note that this evaluates C many times.  */
-# ifdef _LIBC
-#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
-# else
-#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
-# endif
-
-  while ((c = *p++) != '\0')
-    {
-      c = FOLD (c);
-
-      switch (c)
-       {
-       case '?':
-         if (*n == '\0')
-           return FNM_NOMATCH;
-         else if (*n == '/' && (flags & FNM_FILE_NAME))
-           return FNM_NOMATCH;
-         else if (*n == '.' && no_leading_period
-                  && (n == string
-                      || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
-           return FNM_NOMATCH;
-         break;
-
-       case '\\':
-         if (!(flags & FNM_NOESCAPE))
-           {
-             c = *p++;
-             if (c == '\0')
-               /* Trailing \ loses.  */
-               return FNM_NOMATCH;
-             c = FOLD (c);
-           }
-         if (FOLD ((unsigned char) *n) != c)
-           return FNM_NOMATCH;
-         break;
-
-       case '*':
-         if (*n == '.' && no_leading_period
-             && (n == string
-                 || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
-           return FNM_NOMATCH;
-
-         for (c = *p++; c == '?' || c == '*'; c = *p++)
-           {
-             if (*n == '/' && (flags & FNM_FILE_NAME))
-               /* A slash does not match a wildcard under FNM_FILE_NAME.  */
-               return FNM_NOMATCH;
-             else if (c == '?')
-               {
-                 /* A ? needs to match one character.  */
-                 if (*n == '\0')
-                   /* There isn't another character; no match.  */
-                   return FNM_NOMATCH;
-                 else
-                   /* One character of the string is consumed in matching
-                      this ? wildcard, so *??? won't match if there are
-                      less than three characters.  */
-                   ++n;
-               }
-           }
-
-         if (c == '\0')
-           /* The wildcard(s) is/are the last element of the pattern.
-              If the name is a file name and contains another slash
-              this does mean it cannot match.  */
-           return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL
-                   ? FNM_NOMATCH : 0);
-         else
-           {
-             const char *endp;
-
-             endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0');
-
-             if (c == '[')
-               {
-                 int flags2 = ((flags & FNM_FILE_NAME)
-                               ? flags : (flags & ~FNM_PERIOD));
-
-                 for (--p; n < endp; ++n)
-                   if (internal_fnmatch (p, n,
-                                         (no_leading_period
-                                          && (n == string
-                                              || (n[-1] == '/'
-                                                  && (flags
-                                                      & FNM_FILE_NAME)))),
-                                         flags2)
-                       == 0)
-                     return 0;
-               }
-             else if (c == '/' && (flags & FNM_FILE_NAME))
-               {
-                 while (*n != '\0' && *n != '/')
-                   ++n;
-                 if (*n == '/'
-                     && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD,
-                                           flags) == 0))
-                   return 0;
-               }
-             else
-               {
-                 int flags2 = ((flags & FNM_FILE_NAME)
-                               ? flags : (flags & ~FNM_PERIOD));
-
-                 if (c == '\\' && !(flags & FNM_NOESCAPE))
-                   c = *p;
-                 c = FOLD (c);
-                 for (--p; n < endp; ++n)
-                   if (FOLD ((unsigned char) *n) == c
-                       && (internal_fnmatch (p, n,
-                                             (no_leading_period
-                                              && (n == string
-                                                  || (n[-1] == '/'
-                                                      && (flags
-                                                          & FNM_FILE_NAME)))),
-                                             flags2) == 0))
-                     return 0;
-               }
-           }
-
-         /* If we come here no match is possible with the wildcard.  */
-         return FNM_NOMATCH;
-
-       case '[':
-         {
-           /* Nonzero if the sense of the character class is inverted.  */
-           static int posixly_correct;
-           register int not;
-           char cold;
-
-           if (posixly_correct == 0)
-             posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
-
-           if (*n == '\0')
-             return FNM_NOMATCH;
-
-           if (*n == '.' && no_leading_period && (n == string
-                                                  || (n[-1] == '/'
-                                                      && (flags
-                                                          & FNM_FILE_NAME))))
-             return FNM_NOMATCH;
-
-           if (*n == '/' && (flags & FNM_FILE_NAME))
-             /* `/' cannot be matched.  */
-             return FNM_NOMATCH;
-
-           not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
-           if (not)
-             ++p;
-
-           c = *p++;
-           for (;;)
-             {
-               unsigned char fn = FOLD ((unsigned char) *n);
-
-               if (!(flags & FNM_NOESCAPE) && c == '\\')
-                 {
-                   if (*p == '\0')
-                     return FNM_NOMATCH;
-                   c = FOLD ((unsigned char) *p);
-                   ++p;
-
-                   if (c == fn)
-                     goto matched;
-                 }
-               else if (c == '[' && *p == ':')
-                 {
-                   /* Leave room for the null.  */
-                   char str[CHAR_CLASS_MAX_LENGTH + 1];
-                   size_t c1 = 0;
-# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
-                   wctype_t wt;
-# endif
-                   const char *startp = p;
-
-                   for (;;)
-                     {
-                       if (c1 == CHAR_CLASS_MAX_LENGTH)
-                         /* The name is too long and therefore the pattern
-                            is ill-formed.  */
-                         return FNM_NOMATCH;
-
-                       c = *++p;
-                       if (c == ':' && p[1] == ']')
-                         {
-                           p += 2;
-                           break;
-                         }
-                       if (c < 'a' || c >= 'z')
-                         {
-                           /* This cannot possibly be a character class name.
-                              Match it as a normal range.  */
-                           p = startp;
-                           c = '[';
-                           goto normal_bracket;
-                         }
-                       str[c1++] = c;
-                     }
-                   str[c1] = '\0';
-
-# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
-                   wt = IS_CHAR_CLASS (str);
-                   if (wt == 0)
-                     /* Invalid character class name.  */
-                     return FNM_NOMATCH;
-
-                   if (__iswctype (__btowc ((unsigned char) *n), wt))
-                     goto matched;
-# else
-                   if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n))
-                       || (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n))
-                       || (STREQ (str, "blank") && ISBLANK ((unsigned char) *n))
-                       || (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n))
-                       || (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n))
-                       || (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n))
-                       || (STREQ (str, "lower") && ISLOWER ((unsigned char) *n))
-                       || (STREQ (str, "print") && ISPRINT ((unsigned char) *n))
-                       || (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n))
-                       || (STREQ (str, "space") && ISSPACE ((unsigned char) *n))
-                       || (STREQ (str, "upper") && ISUPPER ((unsigned char) *n))
-                       || (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n)))
-                     goto matched;
-# endif
-                 }
-               else if (c == '\0')
-                 /* [ (unterminated) loses.  */
-                 return FNM_NOMATCH;
-               else
-                 {
-                 normal_bracket:
-                   if (FOLD (c) == fn)
-                     goto matched;
-
-                   cold = c;
-                   c = *p++;
-
-                   if (c == '-' && *p != ']')
-                     {
-                       /* It is a range.  */
-                       unsigned char cend = *p++;
-                       if (!(flags & FNM_NOESCAPE) && cend == '\\')
-                         cend = *p++;
-                       if (cend == '\0')
-                         return FNM_NOMATCH;
-
-                       if (cold <= fn && fn <= FOLD (cend))
-                         goto matched;
-
-                       c = *p++;
-                     }
-                 }
-
-               if (c == ']')
-                 break;
-             }
-
-           if (!not)
-             return FNM_NOMATCH;
-           break;
-
-         matched:
-           /* Skip the rest of the [...] that already matched.  */
-           while (c != ']')
-             {
-               if (c == '\0')
-                 /* [... (unterminated) loses.  */
-                 return FNM_NOMATCH;
-
-               c = *p++;
-               if (!(flags & FNM_NOESCAPE) && c == '\\')
-                 {
-                   if (*p == '\0')
-                     return FNM_NOMATCH;
-                   /* XXX 1003.2d11 is unclear if this is right.  */
-                   ++p;
-                 }
-               else if (c == '[' && *p == ':')
-                 {
-                   do
-                     if (*++p == '\0')
-                       return FNM_NOMATCH;
-                   while (*p != ':' || p[1] == ']');
-                   p += 2;
-                   c = *p;
-                 }
-             }
-           if (not)
-             return FNM_NOMATCH;
-         }
-         break;
-
-       default:
-         if (c != FOLD ((unsigned char) *n))
-           return FNM_NOMATCH;
-       }
-
-      ++n;
-    }
-
-  if (*n == '\0')
-    return 0;
-
-  if ((flags & FNM_LEADING_DIR) && *n == '/')
-    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
-    return 0;
-
-  return FNM_NOMATCH;
-
-# undef FOLD
-}
-
-
-int
-fnmatch (pattern, string, flags)
-     const char *pattern;
-     const char *string;
-     int flags;
-{
-  return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags);
-}
-
-#endif /* _LIBC or not __GNU_LIBRARY__.  */
diff --git a/glob/fnmatch.h b/glob/fnmatch.h
deleted file mode 100644 (file)
index a788c8e..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software
-Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public License
-along with this library; see the file COPYING.LIB.  If not, write to the Free
-Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
-USA.  */
-
-#ifndef        _FNMATCH_H
-#define        _FNMATCH_H      1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
-# if !defined __GLIBC__
-#  undef       __P
-#  define __P(protos)  protos
-# endif
-#else /* Not C++ or ANSI C.  */
-# undef        __P
-# define __P(protos)   ()
-/* We can get away without defining `const' here only because in this file
-   it is used only inside the prototype for `fnmatch', which is elided in
-   non-ANSI C where `const' is problematical.  */
-#endif /* C++ or ANSI C.  */
-
-#ifndef const
-# if (defined __STDC__ && __STDC__) || defined __cplusplus || defined WINDOWS32
-#  define __const      const
-# else
-#  define __const
-# endif
-#endif
-
-/* We #undef these before defining them because some losing systems
-   (HP-UX A.08.07 for example) define these in <unistd.h>.  */
-#undef FNM_PATHNAME
-#undef FNM_NOESCAPE
-#undef FNM_PERIOD
-
-/* Bits set in the FLAGS argument to `fnmatch'.  */
-#define        FNM_PATHNAME    (1 << 0) /* No wildcard can ever match `/'.  */
-#define        FNM_NOESCAPE    (1 << 1) /* Backslashes don't quote special chars.  */
-#define        FNM_PERIOD      (1 << 2) /* Leading `.' is matched only explicitly.  */
-
-#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
-# define FNM_FILE_NAME  FNM_PATHNAME   /* Preferred GNU name.  */
-# define FNM_LEADING_DIR (1 << 3)      /* Ignore `/...' after a match.  */
-# define FNM_CASEFOLD   (1 << 4)       /* Compare without regard to case.  */
-#endif
-
-/* Value returned by `fnmatch' if STRING does not match PATTERN.  */
-#define        FNM_NOMATCH     1
-
-/* This value is returned if the implementation does not support
-   `fnmatch'.  Since this is not the case here it will never be
-   returned but the conformance test suites still require the symbol
-   to be defined.  */
-#ifdef _XOPEN_SOURCE
-# define FNM_NOSYS     (-1)
-#endif
-
-/* Match NAME against the filename pattern PATTERN,
-   returning zero if it matches, FNM_NOMATCH if not.  */
-extern int fnmatch __P ((__const char *__pattern, __const char *__name,
-                        int __flags));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* fnmatch.h */
diff --git a/glob/glob.c b/glob/glob.c
deleted file mode 100644 (file)
index f3911bc..0000000
+++ /dev/null
@@ -1,1432 +0,0 @@
-/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 Free
-Software Foundation, Inc.
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public License
-along with this library; see the file COPYING.LIB.  If not, write to the Free
-Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
-USA.  */
-
-/* AIX requires this to be the first thing in the file.  */
-#if defined _AIX && !defined __GNUC__
- #pragma alloca
-#endif
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Enable GNU extensions in glob.h.  */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE   1
-#endif
-
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-/* Outcomment the following line for production quality code.  */
-/* #define NDEBUG 1 */
-#include <assert.h>
-
-#include <stdio.h>             /* Needed on stupid SunOS for assert.  */
-
-
-/* Comment out all this code if we are using the GNU C Library, and are not
-   actually compiling the library itself.  This code is part of the GNU C
-   Library, but also included in many other GNU distributions.  Compiling
-   and linking in this code is a waste when using the GNU C library
-   (especially if it is a shared library).  Rather than having every GNU
-   program understand `configure --with-gnu-libc' and omit the object files,
-   it is simpler to just do this in the source for each such file.  */
-
-#define GLOB_INTERFACE_VERSION 1
-#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
-# include <gnu-versions.h>
-# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
-#  define ELIDE_CODE
-# endif
-#endif
-
-#ifndef ELIDE_CODE
-
-#if defined STDC_HEADERS || defined __GNU_LIBRARY__
-# include <stddef.h>
-#endif
-
-#if defined HAVE_UNISTD_H || defined _LIBC
-# include <unistd.h>
-# ifndef POSIX
-#  ifdef _POSIX_VERSION
-#   define POSIX
-#  endif
-# endif
-#endif
-
-#if !defined _AMIGA && !defined VMS && !defined WINDOWS32
-# include <pwd.h>
-#endif
-
-#if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
-extern int errno;
-#endif
-#ifndef __set_errno
-# define __set_errno(val) errno = (val)
-#endif
-
-#ifndef        NULL
-# define NULL  0
-#endif
-
-
-#if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
-# include <dirent.h>
-# define NAMLEN(dirent) strlen((dirent)->d_name)
-#else
-# define dirent direct
-# define NAMLEN(dirent) (dirent)->d_namlen
-# ifdef HAVE_SYS_NDIR_H
-#  include <sys/ndir.h>
-# endif
-# ifdef HAVE_SYS_DIR_H
-#  include <sys/dir.h>
-# endif
-# ifdef HAVE_NDIR_H
-#  include <ndir.h>
-# endif
-# ifdef HAVE_VMSDIR_H
-#  include "vmsdir.h"
-# endif /* HAVE_VMSDIR_H */
-#endif
-
-
-/* In GNU systems, <dirent.h> defines this macro for us.  */
-#ifdef _D_NAMLEN
-# undef NAMLEN
-# define NAMLEN(d) _D_NAMLEN(d)
-#endif
-
-/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
-   if the `d_type' member for `struct dirent' is available.  */
-#ifdef _DIRENT_HAVE_D_TYPE
-# define HAVE_D_TYPE   1
-#endif
-
-
-#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
-/* Posix does not require that the d_ino field be present, and some
-   systems do not provide it. */
-# define REAL_DIR_ENTRY(dp) 1
-#else
-# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
-#endif /* POSIX */
-
-#if defined STDC_HEADERS || defined __GNU_LIBRARY__
-# include <stdlib.h>
-# include <string.h>
-# define       ANSI_STRING
-#else  /* No standard headers.  */
-
-extern char *getenv ();
-
-# ifdef HAVE_STRING_H
-#  include <string.h>
-#  define ANSI_STRING
-# else
-#  include <strings.h>
-# endif
-# ifdef        HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-
-extern char *malloc (), *realloc ();
-extern void free ();
-
-extern void qsort ();
-extern void abort (), exit ();
-
-#endif /* Standard headers.  */
-
-#ifndef        ANSI_STRING
-
-# ifndef bzero
-extern void bzero ();
-# endif
-# ifndef bcopy
-extern void bcopy ();
-# endif
-
-# define memcpy(d, s, n)       bcopy ((s), (d), (n))
-# define strrchr       rindex
-/* memset is only used for zero here, but let's be paranoid.  */
-# define memset(s, better_be_zero, n) \
-  ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
-#endif /* Not ANSI_STRING.  */
-
-#if !defined HAVE_STRCOLL && !defined _LIBC
-# define strcoll       strcmp
-#endif
-
-#if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
-# define HAVE_MEMPCPY  1
-# undef  mempcpy
-# define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
-#endif
-
-#if !defined __GNU_LIBRARY__ && !defined __DJGPP__
-# ifdef        __GNUC__
-__inline
-# endif
-# ifndef __SASC
-#  ifdef WINDOWS32
-static void *
-my_realloc (void *p, unsigned int n)
-#  else
-static char *
-my_realloc (p, n)
-     char *p;
-     unsigned int n;
-#  endif
-{
-  /* These casts are the for sake of the broken Ultrix compiler,
-     which warns of illegal pointer combinations otherwise.  */
-  if (p == NULL)
-    return (char *) malloc (n);
-  return (char *) realloc (p, n);
-}
-# define       realloc my_realloc
-# endif /* __SASC */
-#endif /* __GNU_LIBRARY__ || __DJGPP__ */
-
-
-#if !defined __alloca && !defined __GNU_LIBRARY__
-
-# ifdef        __GNUC__
-#  undef alloca
-#  define alloca(n)    __builtin_alloca (n)
-# else /* Not GCC.  */
-#  ifdef HAVE_ALLOCA_H
-#   include <alloca.h>
-#  else        /* Not HAVE_ALLOCA_H.  */
-#   ifndef _AIX
-#    ifdef WINDOWS32
-#     include <malloc.h>
-#    else
-extern char *alloca ();
-#    endif /* WINDOWS32 */
-#   endif /* Not _AIX.  */
-#  endif /* sparc or HAVE_ALLOCA_H.  */
-# endif        /* GCC.  */
-
-# define __alloca      alloca
-
-#endif
-
-#ifndef __GNU_LIBRARY__
-# define __stat stat
-# ifdef STAT_MACROS_BROKEN
-#  undef S_ISDIR
-# endif
-# ifndef S_ISDIR
-#  define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
-# endif
-#endif
-
-#ifdef _LIBC
-# undef strdup
-# define strdup(str) __strdup (str)
-# define sysconf(id) __sysconf (id)
-# define closedir(dir) __closedir (dir)
-# define opendir(name) __opendir (name)
-# define readdir(str) __readdir (str)
-# define getpwnam_r(name, bufp, buf, len, res) \
-   __getpwnam_r (name, bufp, buf, len, res)
-# ifndef __stat
-#  define __stat(fname, buf) __xstat (_STAT_VER, fname, buf)
-# endif
-#endif
-
-#if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
-# undef        size_t
-# define size_t        unsigned int
-#endif
-
-/* Some system header files erroneously define these.
-   We want our own definitions from <fnmatch.h> to take precedence.  */
-#ifndef __GNU_LIBRARY__
-# undef        FNM_PATHNAME
-# undef        FNM_NOESCAPE
-# undef        FNM_PERIOD
-#endif
-#include <fnmatch.h>
-
-/* Some system header files erroneously define these.
-   We want our own definitions from <glob.h> to take precedence.  */
-#ifndef __GNU_LIBRARY__
-# undef        GLOB_ERR
-# undef        GLOB_MARK
-# undef        GLOB_NOSORT
-# undef        GLOB_DOOFFS
-# undef        GLOB_NOCHECK
-# undef        GLOB_APPEND
-# undef        GLOB_NOESCAPE
-# undef        GLOB_PERIOD
-#endif
-#include <glob.h>
-
-#ifdef HAVE_GETLOGIN_R
-extern int getlogin_r __P ((char *, size_t));
-#else
-extern char *getlogin __P ((void));
-#endif
-\f
-static
-#if __GNUC__ - 0 >= 2
-inline
-#endif
-const char *next_brace_sub __P ((const char *begin));
-static int glob_in_dir __P ((const char *pattern, const char *directory,
-                            int flags,
-                            int (*errfunc) (const char *, int),
-                            glob_t *pglob));
-static int prefix_array __P ((const char *prefix, char **array, size_t n));
-static int collated_compare __P ((const __ptr_t, const __ptr_t));
-
-#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
-int __glob_pattern_p __P ((const char *pattern, int quote));
-#endif
-
-/* Find the end of the sub-pattern in a brace expression.  We define
-   this as an inline function if the compiler permits.  */
-static
-#if __GNUC__ - 0 >= 2
-inline
-#endif
-const char *
-next_brace_sub (begin)
-     const char *begin;
-{
-  unsigned int depth = 0;
-  const char *cp = begin;
-
-  while (1)
-    {
-      if (depth == 0)
-       {
-         if (*cp != ',' && *cp != '}' && *cp != '\0')
-           {
-             if (*cp == '{')
-               ++depth;
-             ++cp;
-             continue;
-           }
-       }
-      else
-       {
-         while (*cp != '\0' && (*cp != '}' || depth > 0))
-           {
-             if (*cp == '}')
-               --depth;
-             ++cp;
-           }
-         if (*cp == '\0')
-           /* An incorrectly terminated brace expression.  */
-           return NULL;
-
-         continue;
-       }
-      break;
-    }
-
-  return cp;
-}
-
-/* Do glob searching for PATTERN, placing results in PGLOB.
-   The bits defined above may be set in FLAGS.
-   If a directory cannot be opened or read and ERRFUNC is not nil,
-   it is called with the pathname that caused the error, and the
-   `errno' value from the failing call; if it returns non-zero
-   `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
-   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
-   Otherwise, `glob' returns zero.  */
-int
-glob (pattern, flags, errfunc, pglob)
-     const char *pattern;
-     int flags;
-     int (*errfunc) __P ((const char *, int));
-     glob_t *pglob;
-{
-  const char *filename;
-  const char *dirname;
-  size_t dirlen;
-  int status;
-  int oldcount;
-
-  if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
-    {
-      __set_errno (EINVAL);
-      return -1;
-    }
-
-  /* POSIX requires all slashes to be matched.  This means that with
-     a trailing slash we must match only directories.  */
-  if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
-    flags |= GLOB_ONLYDIR;
-
-  if (flags & GLOB_BRACE)
-    {
-      const char *begin = strchr (pattern, '{');
-      if (begin != NULL)
-       {
-         /* Allocate working buffer large enough for our work.  Note that
-           we have at least an opening and closing brace.  */
-         int firstc;
-         char *alt_start;
-         const char *p;
-         const char *next;
-         const char *rest;
-         size_t rest_len;
-#ifdef __GNUC__
-         char onealt[strlen (pattern) - 1];
-#else
-         char *onealt = (char *) malloc (strlen (pattern) - 1);
-         if (onealt == NULL)
-           {
-             if (!(flags & GLOB_APPEND))
-               globfree (pglob);
-             return GLOB_NOSPACE;
-           }
-#endif
-
-         /* We know the prefix for all sub-patterns.  */
-#ifdef HAVE_MEMPCPY
-         alt_start = mempcpy (onealt, pattern, begin - pattern);
-#else
-         memcpy (onealt, pattern, begin - pattern);
-         alt_start = &onealt[begin - pattern];
-#endif
-
-         /* Find the first sub-pattern and at the same time find the
-            rest after the closing brace.  */
-         next = next_brace_sub (begin + 1);
-         if (next == NULL)
-           {
-             /* It is an illegal expression.  */
-#ifndef __GNUC__
-             free (onealt);
-#endif
-             return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
-           }
-
-         /* Now find the end of the whole brace expression.  */
-         rest = next;
-         while (*rest != '}')
-           {
-             rest = next_brace_sub (rest + 1);
-             if (rest == NULL)
-               {
-                 /* It is an illegal expression.  */
-#ifndef __GNUC__
-                 free (onealt);
-#endif
-                 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
-               }
-           }
-         /* Please note that we now can be sure the brace expression
-            is well-formed.  */
-         rest_len = strlen (++rest) + 1;
-
-         /* We have a brace expression.  BEGIN points to the opening {,
-            NEXT points past the terminator of the first element, and END
-            points past the final }.  We will accumulate result names from
-            recursive runs for each brace alternative in the buffer using
-            GLOB_APPEND.  */
-
-         if (!(flags & GLOB_APPEND))
-           {
-             /* This call is to set a new vector, so clear out the
-                vector so we can append to it.  */
-             pglob->gl_pathc = 0;
-             pglob->gl_pathv = NULL;
-           }
-         firstc = pglob->gl_pathc;
-
-         p = begin + 1;
-         while (1)
-           {
-             int result;
-
-             /* Construct the new glob expression.  */
-#ifdef HAVE_MEMPCPY
-             mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
-#else
-             memcpy (alt_start, p, next - p);
-             memcpy (&alt_start[next - p], rest, rest_len);
-#endif
-
-             result = glob (onealt,
-                            ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
-                             | GLOB_APPEND), errfunc, pglob);
-
-             /* If we got an error, return it.  */
-             if (result && result != GLOB_NOMATCH)
-               {
-#ifndef __GNUC__
-                 free (onealt);
-#endif
-                 if (!(flags & GLOB_APPEND))
-                   globfree (pglob);
-                 return result;
-               }
-
-             if (*next == '}')
-               /* We saw the last entry.  */
-               break;
-
-             p = next + 1;
-             next = next_brace_sub (p);
-             assert (next != NULL);
-           }
-
-#ifndef __GNUC__
-         free (onealt);
-#endif
-
-         if (pglob->gl_pathc != firstc)
-           /* We found some entries.  */
-           return 0;
-         else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
-           return GLOB_NOMATCH;
-       }
-    }
-
-  /* Find the filename.  */
-  filename = strrchr (pattern, '/');
-#if defined __MSDOS__ || defined WINDOWS32
-  /* The case of "d:pattern".  Since `:' is not allowed in
-     file names, we can safely assume that wherever it
-     happens in pattern, it signals the filename part.  This
-     is so we could some day support patterns like "[a-z]:foo".  */
-  if (filename == NULL)
-    filename = strchr (pattern, ':');
-#endif /* __MSDOS__ || WINDOWS32 */
-  if (filename == NULL)
-    {
-      /* This can mean two things: a simple name or "~name".  The later
-        case is nothing but a notation for a directory.  */
-      if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
-       {
-         dirname = pattern;
-         dirlen = strlen (pattern);
-
-         /* Set FILENAME to NULL as a special flag.  This is ugly but
-            other solutions would require much more code.  We test for
-            this special case below.  */
-         filename = NULL;
-       }
-      else
-       {
-         filename = pattern;
-#ifdef _AMIGA
-         dirname = "";
-#else
-         dirname = ".";
-#endif
-         dirlen = 0;
-       }
-    }
-  else if (filename == pattern)
-    {
-      /* "/pattern".  */
-      dirname = "/";
-      dirlen = 1;
-      ++filename;
-    }
-  else
-    {
-      char *newp;
-      dirlen = filename - pattern;
-#if defined __MSDOS__ || defined WINDOWS32
-      if (*filename == ':'
-         || (filename > pattern + 1 && filename[-1] == ':'))
-       {
-         char *drive_spec;
-
-         ++dirlen;
-         drive_spec = (char *) __alloca (dirlen + 1);
-#ifdef HAVE_MEMPCPY
-         *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
-#else
-         memcpy (drive_spec, pattern, dirlen);
-         drive_spec[dirlen] = '\0';
-#endif
-         /* For now, disallow wildcards in the drive spec, to
-            prevent infinite recursion in glob.  */
-         if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
-           return GLOB_NOMATCH;
-         /* If this is "d:pattern", we need to copy `:' to DIRNAME
-            as well.  If it's "d:/pattern", don't remove the slash
-            from "d:/", since "d:" and "d:/" are not the same.*/
-       }
-#endif
-      newp = (char *) __alloca (dirlen + 1);
-#ifdef HAVE_MEMPCPY
-      *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
-#else
-      memcpy (newp, pattern, dirlen);
-      newp[dirlen] = '\0';
-#endif
-      dirname = newp;
-      ++filename;
-
-      if (filename[0] == '\0'
-#if defined __MSDOS__ || defined WINDOWS32
-          && dirname[dirlen - 1] != ':'
-         && (dirlen < 3 || dirname[dirlen - 2] != ':'
-             || dirname[dirlen - 1] != '/')
-#endif
-         && dirlen > 1)
-       /* "pattern/".  Expand "pattern", appending slashes.  */
-       {
-         int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
-         if (val == 0)
-           pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
-                              | (flags & GLOB_MARK));
-         return val;
-       }
-    }
-
-  if (!(flags & GLOB_APPEND))
-    {
-      pglob->gl_pathc = 0;
-      pglob->gl_pathv = NULL;
-    }
-
-  oldcount = pglob->gl_pathc;
-
-#ifndef VMS
-  if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
-    {
-      if (dirname[1] == '\0' || dirname[1] == '/')
-       {
-         /* Look up home directory.  */
-#ifdef VMS
-/* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */
-          const char *home_dir = getenv ("SYS$LOGIN");
-#else
-          const char *home_dir = getenv ("HOME");
-#endif
-# ifdef _AMIGA
-         if (home_dir == NULL || home_dir[0] == '\0')
-           home_dir = "SYS:";
-# else
-#  ifdef WINDOWS32
-         if (home_dir == NULL || home_dir[0] == '\0')
-            home_dir = "c:/users/default"; /* poor default */
-#  else
-#   ifdef VMS
-/* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */
-         if (home_dir == NULL || home_dir[0] == '\0')
-           home_dir = "SYS$DISK:[]";
-#   else
-         if (home_dir == NULL || home_dir[0] == '\0')
-           {
-             int success;
-             char *name;
-#   if defined HAVE_GETLOGIN_R || defined _LIBC
-             size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
-
-             if (buflen == 0)
-               /* `sysconf' does not support _SC_LOGIN_NAME_MAX.  Try
-                  a moderate value.  */
-               buflen = 20;
-             name = (char *) __alloca (buflen);
-
-             success = getlogin_r (name, buflen) >= 0;
-#   else
-             success = (name = getlogin ()) != NULL;
-#   endif
-             if (success)
-               {
-                 struct passwd *p;
-#   if defined HAVE_GETPWNAM_R || defined _LIBC
-                 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
-                 char *pwtmpbuf;
-                 struct passwd pwbuf;
-                 int save = errno;
-
-                 if (pwbuflen == -1)
-                   /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
-                      Try a moderate value.  */
-                   pwbuflen = 1024;
-                 pwtmpbuf = (char *) __alloca (pwbuflen);
-
-                 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
-                        != 0)
-                   {
-                     if (errno != ERANGE)
-                       {
-                         p = NULL;
-                         break;
-                       }
-                     pwbuflen *= 2;
-                     pwtmpbuf = (char *) __alloca (pwbuflen);
-                     __set_errno (save);
-                   }
-#   else
-                 p = getpwnam (name);
-#   endif
-                 if (p != NULL)
-                   home_dir = p->pw_dir;
-               }
-           }
-         if (home_dir == NULL || home_dir[0] == '\0')
-           {
-             if (flags & GLOB_TILDE_CHECK)
-               return GLOB_NOMATCH;
-             else
-               home_dir = "~"; /* No luck.  */
-           }
-#   endif /* VMS */
-#  endif /* WINDOWS32 */
-# endif
-         /* Now construct the full directory.  */
-         if (dirname[1] == '\0')
-           dirname = home_dir;
-         else
-           {
-             char *newp;
-             size_t home_len = strlen (home_dir);
-             newp = (char *) __alloca (home_len + dirlen);
-# ifdef HAVE_MEMPCPY
-             mempcpy (mempcpy (newp, home_dir, home_len),
-                      &dirname[1], dirlen);
-# else
-             memcpy (newp, home_dir, home_len);
-             memcpy (&newp[home_len], &dirname[1], dirlen);
-# endif
-             dirname = newp;
-           }
-       }
-# if !defined _AMIGA && !defined WINDOWS32 && !defined VMS
-      else
-       {
-         char *end_name = strchr (dirname, '/');
-         const char *user_name;
-         const char *home_dir;
-
-         if (end_name == NULL)
-           user_name = dirname + 1;
-         else
-           {
-             char *newp;
-             newp = (char *) __alloca (end_name - dirname);
-# ifdef HAVE_MEMPCPY
-             *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
-               = '\0';
-# else
-             memcpy (newp, dirname + 1, end_name - dirname);
-             newp[end_name - dirname - 1] = '\0';
-# endif
-             user_name = newp;
-           }
-
-         /* Look up specific user's home directory.  */
-         {
-           struct passwd *p;
-#  if defined HAVE_GETPWNAM_R || defined _LIBC
-           size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
-           char *pwtmpbuf;
-           struct passwd pwbuf;
-           int save = errno;
-
-           if (buflen == -1)
-             /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.  Try a
-                moderate value.  */
-             buflen = 1024;
-           pwtmpbuf = (char *) __alloca (buflen);
-
-           while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
-             {
-               if (errno != ERANGE)
-                 {
-                   p = NULL;
-                   break;
-                 }
-               buflen *= 2;
-               pwtmpbuf = __alloca (buflen);
-               __set_errno (save);
-             }
-#  else
-           p = getpwnam (user_name);
-#  endif
-           if (p != NULL)
-             home_dir = p->pw_dir;
-           else
-             home_dir = NULL;
-         }
-         /* If we found a home directory use this.  */
-         if (home_dir != NULL)
-           {
-             char *newp;
-             size_t home_len = strlen (home_dir);
-             size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
-             newp = (char *) __alloca (home_len + rest_len + 1);
-#  ifdef HAVE_MEMPCPY
-             *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
-                                 end_name, rest_len)) = '\0';
-#  else
-             memcpy (newp, home_dir, home_len);
-             memcpy (&newp[home_len], end_name, rest_len);
-             newp[home_len + rest_len] = '\0';
-#  endif
-             dirname = newp;
-           }
-         else
-           if (flags & GLOB_TILDE_CHECK)
-             /* We have to regard it as an error if we cannot find the
-                home directory.  */
-             return GLOB_NOMATCH;
-       }
-# endif        /* Not Amiga && not WINDOWS32 && not VMS.  */
-    }
-#endif /* Not VMS.  */
-
-  /* Now test whether we looked for "~" or "~NAME".  In this case we
-     can give the answer now.  */
-  if (filename == NULL)
-    {
-      struct stat st;
-
-      /* Return the directory if we don't check for error or if it exists.  */
-      if ((flags & GLOB_NOCHECK)
-         || (((flags & GLOB_ALTDIRFUNC)
-              ? (*pglob->gl_stat) (dirname, &st)
-              : __stat (dirname, &st)) == 0
-             && S_ISDIR (st.st_mode)))
-       {
-         pglob->gl_pathv
-           = (char **) realloc (pglob->gl_pathv,
-                                (pglob->gl_pathc +
-                                 ((flags & GLOB_DOOFFS) ?
-                                  pglob->gl_offs : 0) +
-                                 1 + 1) *
-                                sizeof (char *));
-         if (pglob->gl_pathv == NULL)
-           return GLOB_NOSPACE;
-
-         if (flags & GLOB_DOOFFS)
-           while (pglob->gl_pathc < pglob->gl_offs)
-             pglob->gl_pathv[pglob->gl_pathc++] = NULL;
-
-#if defined HAVE_STRDUP || defined _LIBC
-         pglob->gl_pathv[pglob->gl_pathc] = strdup (dirname);
-#else
-         {
-           size_t len = strlen (dirname) + 1;
-           char *dircopy = malloc (len);
-           if (dircopy != NULL)
-             pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname,
-                                                        len);
-         }
-#endif
-         if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
-           {
-             free (pglob->gl_pathv);
-             return GLOB_NOSPACE;
-           }
-         pglob->gl_pathv[++pglob->gl_pathc] = NULL;
-         pglob->gl_flags = flags;
-
-         return 0;
-       }
-
-      /* Not found.  */
-      return GLOB_NOMATCH;
-    }
-
-  if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
-    {
-      /* The directory name contains metacharacters, so we
-        have to glob for the directory, and then glob for
-        the pattern in each directory found.  */
-      glob_t dirs;
-      register int i;
-
-      status = glob (dirname,
-                    ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE))
-                     | GLOB_NOSORT | GLOB_ONLYDIR),
-                    errfunc, &dirs);
-      if (status != 0)
-       return status;
-
-      /* We have successfully globbed the preceding directory name.
-        For each name we found, call glob_in_dir on it and FILENAME,
-        appending the results to PGLOB.  */
-      for (i = 0; i < dirs.gl_pathc; ++i)
-       {
-         int old_pathc;
-
-#ifdef SHELL
-         {
-           /* Make globbing interruptible in the bash shell. */
-           extern int interrupt_state;
-
-           if (interrupt_state)
-             {
-               globfree (&dirs);
-               globfree (&files);
-               return GLOB_ABORTED;
-             }
-         }
-#endif /* SHELL.  */
-
-         old_pathc = pglob->gl_pathc;
-         status = glob_in_dir (filename, dirs.gl_pathv[i],
-                               ((flags | GLOB_APPEND)
-                                & ~(GLOB_NOCHECK | GLOB_ERR)),
-                               errfunc, pglob);
-         if (status == GLOB_NOMATCH)
-           /* No matches in this directory.  Try the next.  */
-           continue;
-
-         if (status != 0)
-           {
-             globfree (&dirs);
-             globfree (pglob);
-             return status;
-           }
-
-         /* Stick the directory on the front of each name.  */
-         if (prefix_array (dirs.gl_pathv[i],
-                           &pglob->gl_pathv[old_pathc],
-                           pglob->gl_pathc - old_pathc))
-           {
-             globfree (&dirs);
-             globfree (pglob);
-             return GLOB_NOSPACE;
-           }
-       }
-
-      flags |= GLOB_MAGCHAR;
-
-      /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
-        But if we have not found any matching entry and thie GLOB_NOCHECK
-        flag was set we must return the list consisting of the disrectory
-        names followed by the filename.  */
-      if (pglob->gl_pathc == oldcount)
-       {
-         /* No matches.  */
-         if (flags & GLOB_NOCHECK)
-           {
-             size_t filename_len = strlen (filename) + 1;
-             char **new_pathv;
-             struct stat st;
-
-             /* This is an pessimistic guess about the size.  */
-             pglob->gl_pathv
-               = (char **) realloc (pglob->gl_pathv,
-                                    (pglob->gl_pathc +
-                                     ((flags & GLOB_DOOFFS) ?
-                                      pglob->gl_offs : 0) +
-                                     dirs.gl_pathc + 1) *
-                                    sizeof (char *));
-             if (pglob->gl_pathv == NULL)
-               {
-                 globfree (&dirs);
-                 return GLOB_NOSPACE;
-               }
-
-             if (flags & GLOB_DOOFFS)
-               while (pglob->gl_pathc < pglob->gl_offs)
-                 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
-
-             for (i = 0; i < dirs.gl_pathc; ++i)
-               {
-                 const char *dir = dirs.gl_pathv[i];
-                 size_t dir_len = strlen (dir);
-
-                 /* First check whether this really is a directory.  */
-                 if (((flags & GLOB_ALTDIRFUNC)
-                      ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0
-                     || !S_ISDIR (st.st_mode))
-                   /* No directory, ignore this entry.  */
-                   continue;
-
-                 pglob->gl_pathv[pglob->gl_pathc] = malloc (dir_len + 1
-                                                            + filename_len);
-                 if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
-                   {
-                     globfree (&dirs);
-                     globfree (pglob);
-                     return GLOB_NOSPACE;
-                   }
-
-#ifdef HAVE_MEMPCPY
-                 mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc],
-                                            dir, dir_len),
-                                   "/", 1),
-                          filename, filename_len);
-#else
-                 memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len);
-                 pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/';
-                 memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1],
-                         filename, filename_len);
-#endif
-                 ++pglob->gl_pathc;
-               }
-
-             pglob->gl_pathv[pglob->gl_pathc] = NULL;
-             pglob->gl_flags = flags;
-
-             /* Now we know how large the gl_pathv vector must be.  */
-             new_pathv = (char **) realloc (pglob->gl_pathv,
-                                            ((pglob->gl_pathc + 1)
-                                             * sizeof (char *)));
-             if (new_pathv != NULL)
-               pglob->gl_pathv = new_pathv;
-           }
-         else
-           return GLOB_NOMATCH;
-       }
-
-      globfree (&dirs);
-    }
-  else
-    {
-      status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
-      if (status != 0)
-       return status;
-
-      if (dirlen > 0)
-       {
-         /* Stick the directory on the front of each name.  */
-         int ignore = oldcount;
-
-         if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs)
-           ignore = pglob->gl_offs;
-
-         if (prefix_array (dirname,
-                           &pglob->gl_pathv[ignore],
-                           pglob->gl_pathc - ignore))
-           {
-             globfree (pglob);
-             return GLOB_NOSPACE;
-           }
-       }
-    }
-
-  if (flags & GLOB_MARK)
-    {
-      /* Append slashes to directory names.  */
-      int i;
-      struct stat st;
-      for (i = oldcount; i < pglob->gl_pathc; ++i)
-       if (((flags & GLOB_ALTDIRFUNC)
-            ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
-            : __stat (pglob->gl_pathv[i], &st)) == 0
-           && S_ISDIR (st.st_mode))
-         {
-           size_t len = strlen (pglob->gl_pathv[i]) + 2;
-           char *new = realloc (pglob->gl_pathv[i], len);
-           if (new == NULL)
-             {
-               globfree (pglob);
-               return GLOB_NOSPACE;
-             }
-           strcpy (&new[len - 2], "/");
-           pglob->gl_pathv[i] = new;
-         }
-    }
-
-  if (!(flags & GLOB_NOSORT))
-    {
-      /* Sort the vector.  */
-      int non_sort = oldcount;
-
-      if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount)
-       non_sort = pglob->gl_offs;
-
-      qsort ((__ptr_t) &pglob->gl_pathv[non_sort],
-            pglob->gl_pathc - non_sort,
-            sizeof (char *), collated_compare);
-    }
-
-  return 0;
-}
-
-
-/* Free storage allocated in PGLOB by a previous `glob' call.  */
-void
-globfree (pglob)
-     register glob_t *pglob;
-{
-  if (pglob->gl_pathv != NULL)
-    {
-      register int i;
-      for (i = 0; i < pglob->gl_pathc; ++i)
-       if (pglob->gl_pathv[i] != NULL)
-         free ((__ptr_t) pglob->gl_pathv[i]);
-      free ((__ptr_t) pglob->gl_pathv);
-    }
-}
-
-
-/* Do a collated comparison of A and B.  */
-static int
-collated_compare (a, b)
-     const __ptr_t a;
-     const __ptr_t b;
-{
-  const char *const s1 = *(const char *const * const) a;
-  const char *const s2 = *(const char *const * const) b;
-
-  if (s1 == s2)
-    return 0;
-  if (s1 == NULL)
-    return 1;
-  if (s2 == NULL)
-    return -1;
-  return strcoll (s1, s2);
-}
-
-
-/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
-   elements in place.  Return nonzero if out of memory, zero if successful.
-   A slash is inserted between DIRNAME and each elt of ARRAY,
-   unless DIRNAME is just "/".  Each old element of ARRAY is freed.  */
-static int
-prefix_array (dirname, array, n)
-     const char *dirname;
-     char **array;
-     size_t n;
-{
-  register size_t i;
-  size_t dirlen = strlen (dirname);
-#if defined __MSDOS__ || defined WINDOWS32
-  int sep_char = '/';
-# define DIRSEP_CHAR sep_char
-#else
-# define DIRSEP_CHAR '/'
-#endif
-
-  if (dirlen == 1 && dirname[0] == '/')
-    /* DIRNAME is just "/", so normal prepending would get us "//foo".
-       We want "/foo" instead, so don't prepend any chars from DIRNAME.  */
-    dirlen = 0;
-#if defined __MSDOS__ || defined WINDOWS32
-  else if (dirlen > 1)
-    {
-      if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
-       /* DIRNAME is "d:/".  Don't prepend the slash from DIRNAME.  */
-       --dirlen;
-      else if (dirname[dirlen - 1] == ':')
-       {
-         /* DIRNAME is "d:".  Use `:' instead of `/'.  */
-         --dirlen;
-         sep_char = ':';
-       }
-    }
-#endif
-
-  for (i = 0; i < n; ++i)
-    {
-      size_t eltlen = strlen (array[i]) + 1;
-      char *new = (char *) malloc (dirlen + 1 + eltlen);
-      if (new == NULL)
-       {
-         while (i > 0)
-           free ((__ptr_t) array[--i]);
-         return 1;
-       }
-
-#ifdef HAVE_MEMPCPY
-      {
-       char *endp = (char *) mempcpy (new, dirname, dirlen);
-       *endp++ = DIRSEP_CHAR;
-       mempcpy (endp, array[i], eltlen);
-      }
-#else
-      memcpy (new, dirname, dirlen);
-      new[dirlen] = DIRSEP_CHAR;
-      memcpy (&new[dirlen + 1], array[i], eltlen);
-#endif
-      free ((__ptr_t) array[i]);
-      array[i] = new;
-    }
-
-  return 0;
-}
-
-
-/* We must not compile this function twice.  */
-#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
-/* Return nonzero if PATTERN contains any metacharacters.
-   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
-int
-__glob_pattern_p (pattern, quote)
-     const char *pattern;
-     int quote;
-{
-  register const char *p;
-  int open = 0;
-
-  for (p = pattern; *p != '\0'; ++p)
-    switch (*p)
-      {
-      case '?':
-      case '*':
-       return 1;
-
-      case '\\':
-       if (quote && p[1] != '\0')
-         ++p;
-       break;
-
-      case '[':
-       open = 1;
-       break;
-
-      case ']':
-       if (open)
-         return 1;
-       break;
-      }
-
-  return 0;
-}
-# ifdef _LIBC
-weak_alias (__glob_pattern_p, glob_pattern_p)
-# endif
-#endif
-
-
-/* Like `glob', but PATTERN is a final pathname component,
-   and matches are searched for in DIRECTORY.
-   The GLOB_NOSORT bit in FLAGS is ignored.  No sorting is ever done.
-   The GLOB_APPEND flag is assumed to be set (always appends).  */
-static int
-glob_in_dir (pattern, directory, flags, errfunc, pglob)
-     const char *pattern;
-     const char *directory;
-     int flags;
-     int (*errfunc) __P ((const char *, int));
-     glob_t *pglob;
-{
-  __ptr_t stream = NULL;
-
-  struct globlink
-    {
-      struct globlink *next;
-      char *name;
-    };
-  struct globlink *names = NULL;
-  size_t nfound;
-  int meta;
-  int save;
-
-#ifdef VMS
-  if (*directory == 0)
-    directory = "[]";
-#endif
-  meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
-  if (meta == 0)
-    {
-      if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
-       /* We need not do any tests.  The PATTERN contains no meta
-          characters and we must not return an error therefore the
-          result will always contain exactly one name.  */
-       flags |= GLOB_NOCHECK;
-      else
-       {
-         /* Since we use the normal file functions we can also use stat()
-            to verify the file is there.  */
-         struct stat st;
-         size_t patlen = strlen (pattern);
-         size_t dirlen = strlen (directory);
-         char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
-
-# ifdef HAVE_MEMPCPY
-         mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
-                           "/", 1),
-                  pattern, patlen + 1);
-# else
-         memcpy (fullname, directory, dirlen);
-         fullname[dirlen] = '/';
-         memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
-# endif
-         if (((flags & GLOB_ALTDIRFUNC)
-              ? (*pglob->gl_stat) (fullname, &st)
-              : __stat (fullname, &st)) == 0)
-           /* We found this file to be existing.  Now tell the rest
-              of the function to copy this name into the result.  */
-           flags |= GLOB_NOCHECK;
-       }
-
-      nfound = 0;
-    }
-  else
-    {
-      if (pattern[0] == '\0')
-       {
-         /* This is a special case for matching directories like in
-            "*a/".  */
-         names = (struct globlink *) __alloca (sizeof (struct globlink));
-         names->name = (char *) malloc (1);
-         if (names->name == NULL)
-           goto memory_error;
-         names->name[0] = '\0';
-         names->next = NULL;
-         nfound = 1;
-         meta = 0;
-       }
-      else
-       {
-         stream = ((flags & GLOB_ALTDIRFUNC)
-                   ? (*pglob->gl_opendir) (directory)
-                   : (__ptr_t) opendir (directory));
-         if (stream == NULL)
-           {
-             if (errno != ENOTDIR
-                 && ((errfunc != NULL && (*errfunc) (directory, errno))
-                     || (flags & GLOB_ERR)))
-               return GLOB_ABORTED;
-             nfound = 0;
-             meta = 0;
-           }
-         else
-           {
-             int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
-                              | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
-#if defined HAVE_CASE_INSENSITIVE_FS
-                                  | FNM_CASEFOLD
-#endif
-                                  );
-             nfound = 0;
-             flags |= GLOB_MAGCHAR;
-
-             while (1)
-               {
-                 const char *name;
-                 size_t len;
-                 struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
-                                     ? (*pglob->gl_readdir) (stream)
-                                     : readdir ((DIR *) stream));
-                 if (d == NULL)
-                   break;
-                 if (! REAL_DIR_ENTRY (d))
-                   continue;
-
-#ifdef HAVE_D_TYPE
-                 /* If we shall match only directories use the information
-                    provided by the dirent call if possible.  */
-                 if ((flags & GLOB_ONLYDIR)
-                     && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR)
-                   continue;
-#endif
-
-                 name = d->d_name;
-
-                 if (fnmatch (pattern, name, fnm_flags) == 0)
-                   {
-                     struct globlink *new = (struct globlink *)
-                       __alloca (sizeof (struct globlink));
-                     len = NAMLEN (d);
-                     new->name = (char *) malloc (len + 1);
-                     if (new->name == NULL)
-                       goto memory_error;
-#ifdef HAVE_MEMPCPY
-                     *((char *) mempcpy ((__ptr_t) new->name, name, len))
-                       = '\0';
-#else
-                     memcpy ((__ptr_t) new->name, name, len);
-                     new->name[len] = '\0';
-#endif
-                     new->next = names;
-                     names = new;
-                     ++nfound;
-                   }
-               }
-           }
-       }
-    }
-
-  if (nfound == 0 && (flags & GLOB_NOCHECK))
-    {
-      size_t len = strlen (pattern);
-      nfound = 1;
-      names = (struct globlink *) __alloca (sizeof (struct globlink));
-      names->next = NULL;
-      names->name = (char *) malloc (len + 1);
-      if (names->name == NULL)
-       goto memory_error;
-#ifdef HAVE_MEMPCPY
-      *((char *) mempcpy (names->name, pattern, len)) = '\0';
-#else
-      memcpy (names->name, pattern, len);
-      names->name[len] = '\0';
-#endif
-    }
-
-  if (nfound != 0)
-    {
-      pglob->gl_pathv
-       = (char **) realloc (pglob->gl_pathv,
-                            (pglob->gl_pathc +
-                             ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
-                             nfound + 1) *
-                            sizeof (char *));
-      if (pglob->gl_pathv == NULL)
-       goto memory_error;
-
-      if (flags & GLOB_DOOFFS)
-       while (pglob->gl_pathc < pglob->gl_offs)
-         pglob->gl_pathv[pglob->gl_pathc++] = NULL;
-
-      for (; names != NULL; names = names->next)
-       pglob->gl_pathv[pglob->gl_pathc++] = names->name;
-      pglob->gl_pathv[pglob->gl_pathc] = NULL;
-
-      pglob->gl_flags = flags;
-    }
-
-  save = errno;
-  if (stream != NULL)
-    {
-      if (flags & GLOB_ALTDIRFUNC)
-       (*pglob->gl_closedir) (stream);
-      else
-       closedir ((DIR *) stream);
-    }
-  __set_errno (save);
-
-  return nfound == 0 ? GLOB_NOMATCH : 0;
-
- memory_error:
-  {
-    int save = errno;
-    if (flags & GLOB_ALTDIRFUNC)
-      (*pglob->gl_closedir) (stream);
-    else
-      closedir ((DIR *) stream);
-    __set_errno (save);
-  }
-  while (names != NULL)
-    {
-      if (names->name != NULL)
-       free ((__ptr_t) names->name);
-      names = names->next;
-    }
-  return GLOB_NOSPACE;
-}
-
-#endif /* Not ELIDE_CODE.  */
diff --git a/glob/glob.h b/glob/glob.h
deleted file mode 100644 (file)
index 0992de3..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 1998 Free Software Foundation,
-Inc.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public License
-along with this library; see the file COPYING.LIB.  If not, write to the Free
-Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
-USA.  */
-
-#ifndef        _GLOB_H
-#define        _GLOB_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#undef __ptr_t
-#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
-# if !defined __GLIBC__
-#  undef __P
-#  undef __PMT
-#  define __P(protos)  protos
-#  define __PMT(protos)        protos
-#  if !defined __GNUC__ || __GNUC__ < 2
-#   undef __const
-#   define __const const
-#  endif
-# endif
-# define __ptr_t       void *
-#else /* Not C++ or ANSI C.  */
-# undef        __P
-# undef __PMT
-# define __P(protos)   ()
-# define __PMT(protos) ()
-# undef        __const
-# define __const
-# define __ptr_t       char *
-#endif /* C++ or ANSI C.  */
-
-/* We need `size_t' for the following definitions.  */
-#ifndef __size_t
-# if defined __FreeBSD__
-#  define __size_t size_t
-# else
-#  if defined __GNUC__ && __GNUC__ >= 2
-typedef __SIZE_TYPE__ __size_t;
-#  else
-/* This is a guess.  */
-/*hb
- *     Conflicts with DECCs already defined type __size_t.
- *     Defining an own type with a name beginning with '__' is no good.
- *     Anyway if DECC is used and __SIZE_T is defined then __size_t is
- *     already defined (and I hope it's exactly the one we need here).
- */
-#   if !(defined __DECC && defined __SIZE_T)
-typedef unsigned long int __size_t;
-#   endif
-#  endif
-# endif
-#else
-/* The GNU CC stddef.h version defines __size_t as empty.  We need a real
-   definition.  */
-# undef __size_t
-# define __size_t size_t
-#endif
-
-/* Bits set in the FLAGS argument to `glob'.  */
-#define        GLOB_ERR        (1 << 0)/* Return on read errors.  */
-#define        GLOB_MARK       (1 << 1)/* Append a slash to each name.  */
-#define        GLOB_NOSORT     (1 << 2)/* Don't sort the names.  */
-#define        GLOB_DOOFFS     (1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
-#define        GLOB_NOCHECK    (1 << 4)/* If nothing matches, return the pattern.  */
-#define        GLOB_APPEND     (1 << 5)/* Append to results of a previous call.  */
-#define        GLOB_NOESCAPE   (1 << 6)/* Backslashes don't quote metacharacters.  */
-#define        GLOB_PERIOD     (1 << 7)/* Leading `.' can be matched by metachars.  */
-
-#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _BSD_SOURCE \
-     || defined _GNU_SOURCE)
-# define GLOB_MAGCHAR   (1 << 8)/* Set in gl_flags if any metachars seen.  */
-# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions.  */
-# define GLOB_BRACE     (1 << 10)/* Expand "{a,b}" to "a" "b".  */
-# define GLOB_NOMAGIC   (1 << 11)/* If no magic chars, return the pattern.  */
-# define GLOB_TILDE     (1 << 12)/* Expand ~user and ~ to home directories. */
-# define GLOB_ONLYDIR   (1 << 13)/* Match only directories.  */
-# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error
-                                     if the user name is not available.  */
-# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
-                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
-                        GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE|     \
-                        GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK)
-#else
-# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
-                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
-                        GLOB_PERIOD)
-#endif
-
-/* Error returns from `glob'.  */
-#define        GLOB_NOSPACE    1       /* Ran out of memory.  */
-#define        GLOB_ABORTED    2       /* Read error.  */
-#define        GLOB_NOMATCH    3       /* No matches found.  */
-#define GLOB_NOSYS     4       /* Not implemented.  */
-#ifdef _GNU_SOURCE
-/* Previous versions of this file defined GLOB_ABEND instead of
-   GLOB_ABORTED.  Provide a compatibility definition here.  */
-# define GLOB_ABEND GLOB_ABORTED
-#endif
-
-/* Structure describing a globbing run.  */
-#if !defined _AMIGA && !defined VMS /* Buggy compiler.   */
-struct stat;
-#endif
-typedef struct
-  {
-    __size_t gl_pathc;         /* Count of paths matched by the pattern.  */
-    char **gl_pathv;           /* List of matched pathnames.  */
-    __size_t gl_offs;          /* Slots to reserve in `gl_pathv'.  */
-    int gl_flags;              /* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
-
-    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
-       are used instead of the normal file access functions.  */
-    void (*gl_closedir) __PMT ((void *));
-    struct dirent *(*gl_readdir) __PMT ((void *));
-    __ptr_t (*gl_opendir) __PMT ((__const char *));
-    int (*gl_lstat) __PMT ((__const char *, struct stat *));
-#if defined(VMS) && defined(__DECC) && !defined(_POSIX_C_SOURCE)
-    int (*gl_stat) __PMT ((__const char *, struct stat *, ...));
-#else
-    int (*gl_stat) __PMT ((__const char *, struct stat *));
-#endif
-  } glob_t;
-
-#ifdef _LARGEFILE64_SOURCE
-struct stat64;
-typedef struct
-  {
-    __size_t gl_pathc;
-    char **gl_pathv;
-    __size_t gl_offs;
-    int gl_flags;
-
-    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
-       are used instead of the normal file access functions.  */
-    void (*gl_closedir) __PMT ((void *));
-    struct dirent64 *(*gl_readdir) __PMT ((void *));
-    __ptr_t (*gl_opendir) __PMT ((__const char *));
-    int (*gl_lstat) __PMT ((__const char *, struct stat64 *));
-    int (*gl_stat) __PMT ((__const char *, struct stat64 *));
-  } glob64_t;
-#endif
-
-#if _FILE_OFFSET_BITS == 64 && __GNUC__ < 2
-# define glob glob64
-# define globfree globfree64
-#else
-# ifdef _LARGEFILE64_SOURCE
-extern int glob64 __P ((__const char *__pattern, int __flags,
-                       int (*__errfunc) (__const char *, int),
-                       glob64_t *__pglob));
-
-extern void globfree64 __P ((glob64_t *__pglob));
-# endif
-#endif
-
-/* Do glob searching for PATTERN, placing results in PGLOB.
-   The bits defined above may be set in FLAGS.
-   If a directory cannot be opened or read and ERRFUNC is not nil,
-   it is called with the pathname that caused the error, and the
-   `errno' value from the failing call; if it returns non-zero
-   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
-   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
-   Otherwise, `glob' returns zero.  */
-#if _FILE_OFFSET_BITS != 64 || __GNUC__ < 2
-extern int glob __P ((__const char *__pattern, int __flags,
-                     int (*__errfunc) (__const char *, int),
-                     glob_t *__pglob));
-
-/* Free storage allocated in PGLOB by a previous `glob' call.  */
-extern void globfree __P ((glob_t *__pglob));
-#else
-extern int glob __P ((__const char *__pattern, int __flags,
-                     int (*__errfunc) (__const char *, int),
-                     glob_t *__pglob)) __asm__ ("glob64");
-
-extern void globfree __P ((glob_t *__pglob)) __asm__ ("globfree64");
-#endif
-
-
-#ifdef _GNU_SOURCE
-/* Return nonzero if PATTERN contains any metacharacters.
-   Metacharacters can be quoted with backslashes if QUOTE is nonzero.
-
-   This function is not part of the interface specified by POSIX.2
-   but several programs want to use it.  */
-extern int glob_pattern_p __P ((__const char *__pattern, int __quote));
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* glob.h  */
diff --git a/gmk-default.h b/gmk-default.h
deleted file mode 100644 (file)
index 9fa09a6..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-static const char *const GUILE_module_defn = " \
-(define (to-string-maybe x) \
-  (cond \
-   ((or (not x) \
-        (unspecified? x) \
-        (variable? x) \
-        (null? x) \
-        (and (string? x) (string-null? x))) \
-    #f) \
-   ((eq? x #t) \"#t\") \
-   ((or (symbol? x) (number? x)) \
-    (object->string x)) \
-   ((char? x) \
-    (string x)) \
-   ((and (string? x) (string-every char-set:printing x)) \
-    x) \
-   (else (error \"Unknown object:\" x)))) \
-(define (obj-to-str x) \
-  (let ((acc '())) \
-    (define (walk x) \
-      (cond ((pair? x) (walk (car x)) (walk (cdr x))) \
-            ((to-string-maybe x) => (lambda (s) (set! acc (cons s acc)))))) \
-    (walk x) \
-    (string-join (reverse! acc)))) \
-(define (gmk-var v) \
-  (gmk-expand (format #f \"$(~a)\" (obj-to-str v)))) \
-(export gmk-expand gmk-eval gmk-var) \
-";
diff --git a/gmk-default.scm b/gmk-default.scm
deleted file mode 100644 (file)
index e7353f9..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-;; Contents of the (gnu make) Guile module
-;; Copyright (C) 2011-2016 Free Software Foundation, Inc.
-;; This file is part of GNU Make.
-;;
-;; GNU Make is free software; you can redistribute it and/or modify it under
-;; the terms of the GNU General Public License as published by the Free
-;; Software Foundation; either version 3 of the License, or (at your option)
-;; any later version.
-;;
-;; GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-;; FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-;; details.
-;;
-;; You should have received a copy of the GNU General Public License along
-;; with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-(define (to-string-maybe x)
-  (cond
-   ;; In GNU make, "false" is the empty string
-   ((or (not x)
-        (unspecified? x)
-        (variable? x)
-        (null? x)
-        (and (string? x) (string-null? x)))
-    #f)
-   ;; We want something not false... not sure about this
-   ((eq? x #t) "#t")
-   ;; Basics
-   ((or (symbol? x) (number? x))
-    (object->string x))
-   ((char? x)
-    (string x))
-   ;; Printable string (no special characters)
-   ((and (string? x) (string-every char-set:printing x))
-    x)
-   ;; No idea: fail
-   (else (error "Unknown object:" x))))
-
-(define (obj-to-str x)
-  (let ((acc '()))
-    (define (walk x)
-      (cond ((pair? x) (walk (car x)) (walk (cdr x)))
-            ((to-string-maybe x) => (lambda (s) (set! acc (cons s acc))))))
-    (walk x)
-    (string-join (reverse! acc))))
-
-;; Return the value of the GNU make variable V
-(define (gmk-var v)
-  (gmk-expand (format #f "$(~a)" (obj-to-str v))))
-
-;; Export the public interfaces
-(export gmk-expand gmk-eval gmk-var)
diff --git a/gnumake.h b/gnumake.h
deleted file mode 100644 (file)
index b508562..0000000
--- a/gnumake.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* External interfaces usable by dynamic objects loaded into GNU Make.
-   --THIS API IS A "TECHNOLOGY PREVIEW" ONLY.  IT IS NOT A STABLE INTERFACE--
-
-Copyright (C) 2013-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _GNUMAKE_H_
-#define _GNUMAKE_H_
-
-/* Specify the location of elements read from makefiles.  */
-typedef struct
-  {
-    const char *filenm;
-    unsigned long lineno;
-  } gmk_floc;
-
-typedef char *(*gmk_func_ptr)(const char *nm, unsigned int argc, char **argv);
-
-#ifdef _WIN32
-# ifdef GMK_BUILDING_MAKE
-#  define GMK_EXPORT  __declspec(dllexport)
-# else
-#  define GMK_EXPORT  __declspec(dllimport)
-# endif
-#else
-# define GMK_EXPORT
-#endif
-
-/* Free memory returned by the gmk_expand() function.  */
-GMK_EXPORT void gmk_free (char *str);
-
-/* Allocate memory in GNU make's context.  */
-GMK_EXPORT char *gmk_alloc (unsigned int len);
-
-/* Run $(eval ...) on the provided string BUFFER.  */
-GMK_EXPORT void gmk_eval (const char *buffer, const gmk_floc *floc);
-
-/* Run GNU make expansion on the provided string STR.
-   Returns an allocated buffer that the caller must free with gmk_free().  */
-GMK_EXPORT char *gmk_expand (const char *str);
-
-/* Register a new GNU make function NAME (maximum of 255 chars long).
-   When the function is expanded in the makefile, FUNC will be invoked with
-   the appropriate arguments.
-
-   The return value of FUNC must be either NULL, in which case it expands to
-   the empty string, or a pointer to the result of the expansion in a string
-   created by gmk_alloc().  GNU make will free the memory when it's done.
-
-   MIN_ARGS is the minimum number of arguments the function requires.
-   MAX_ARGS is the maximum number of arguments (or 0 if there's no maximum).
-   MIN_ARGS and MAX_ARGS may not exceed 255.
-
-   The FLAGS value may be GMK_FUNC_DEFAULT, or one or more of the following
-   flags OR'd together:
-
-     GMK_FUNC_NOEXPAND: the arguments to the function will be not be expanded
-                        before FUNC is called.
-*/
-GMK_EXPORT void gmk_add_function (const char *name, gmk_func_ptr func,
-                                  unsigned int min_args, unsigned int max_args,
-                                  unsigned int flags);
-
-#define GMK_FUNC_DEFAULT    0x00
-#define GMK_FUNC_NOEXPAND   0x01
-
-#endif  /* _GNUMAKE_H_ */
diff --git a/guile.c b/guile.c
deleted file mode 100644 (file)
index 1b055c3..0000000
--- a/guile.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* GNU Guile interface for GNU Make.
-Copyright (C) 2011-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#ifdef HAVE_GUILE
-
-#include "gnumake.h"
-
-#include "debug.h"
-#include "filedef.h"
-#include "dep.h"
-#include "variable.h"
-
-#include <libguile.h>
-
-/* Pre-2.0 versions of Guile don't have a typedef for gsubr function types.  */
-#if SCM_MAJOR_VERSION < 2
-# define GSUBR_TYPE         SCM (*) ()
-/* Guile 1.x doesn't really support i18n.  */
-# define EVAL_STRING(_s)    scm_c_eval_string (_s)
-#else
-# define GSUBR_TYPE         scm_t_subr
-# define EVAL_STRING(_s)    scm_eval_string (scm_from_utf8_string (_s))
-#endif
-
-static SCM make_mod = SCM_EOL;
-static SCM obj_to_str = SCM_EOL;
-
-/* Convert an SCM object into a string.  */
-static char *
-cvt_scm_to_str (SCM obj)
-{
-  return scm_to_locale_string (scm_call_1 (obj_to_str, obj));
-}
-
-/* Perform the GNU make expansion function.  */
-static SCM
-guile_expand_wrapper (SCM obj)
-{
-  char *str = cvt_scm_to_str (obj);
-  SCM ret;
-  char *res;
-
-  DB (DB_BASIC, (_("guile: Expanding '%s'\n"), str));
-  res = gmk_expand (str);
-  ret = scm_from_locale_string (res);
-
-  free (str);
-  free (res);
-
-  return ret;
-}
-
-/* Perform the GNU make eval function.  */
-static SCM
-guile_eval_wrapper (SCM obj)
-{
-  char *str = cvt_scm_to_str (obj);
-
-  DB (DB_BASIC, (_("guile: Evaluating '%s'\n"), str));
-  gmk_eval (str, 0);
-
-  return SCM_BOOL_F;
-}
-
-/* Invoked by scm_c_define_module(), in the context of the GNU make module.  */
-static void
-guile_define_module (void *data UNUSED)
-{
-/* Ingest the predefined Guile module for GNU make.  */
-#include "gmk-default.h"
-
-  /* Register a subr for GNU make's eval capability.  */
-  scm_c_define_gsubr ("gmk-expand", 1, 0, 0, (GSUBR_TYPE) guile_expand_wrapper);
-
-  /* Register a subr for GNU make's eval capability.  */
-  scm_c_define_gsubr ("gmk-eval", 1, 0, 0, (GSUBR_TYPE) guile_eval_wrapper);
-
-  /* Define the rest of the module.  */
-  scm_c_eval_string (GUILE_module_defn);
-}
-
-/* Initialize the GNU make Guile module.  */
-static void *
-guile_init (void *arg UNUSED)
-{
-  /* Define the module.  */
-  make_mod = scm_c_define_module ("gnu make", guile_define_module, NULL);
-
-  /* Get a reference to the object-to-string translator, for later.  */
-  obj_to_str = scm_variable_ref (scm_c_module_lookup (make_mod, "obj-to-str"));
-
-  /* Import the GNU make module exports into the generic space.  */
-  scm_c_eval_string ("(use-modules (gnu make))");
-
-  return NULL;
-}
-
-static void *
-internal_guile_eval (void *arg)
-{
-  return cvt_scm_to_str (EVAL_STRING (arg));
-}
-
-/* This is the function registered with make  */
-static char *
-func_guile (const char *funcname UNUSED, unsigned int argc UNUSED, char **argv)
-{
-  static int init = 0;
-
-  if (! init)
-    {
-      /* Initialize the Guile interpreter.  */
-      scm_with_guile (guile_init, NULL);
-      init = 1;
-    }
-
-  if (argv[0] && argv[0][0] != '\0')
-    return scm_with_guile (internal_guile_eval, argv[0]);
-
-  return NULL;
-}
-
-/* ----- Public interface ----- */
-
-/* We could send the flocp to define_new_function(), but since guile is
-   "kind of" built-in, that didn't seem so useful.  */
-int
-guile_gmake_setup (const floc *flocp UNUSED)
-{
-  /* Create a make function "guile".  */
-  gmk_add_function ("guile", func_guile, 0, 1, GMK_FUNC_DEFAULT);
-
-  return 1;
-}
-
-#else
-
-int
-guile_gmake_setup (const floc *flocp UNUSED)
-{
-  return 1;
-}
-
-#endif
diff --git a/hash.c b/hash.c
deleted file mode 100644 (file)
index 7b4b271..0000000
--- a/hash.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* hash.c -- hash table maintenance
-Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc.
-Written by Greg McGary <gkm@gnu.org> <greg@mcgary.org>
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "hash.h"
-
-#define        CALLOC(t, n) ((t *) xcalloc (sizeof (t) * (n)))
-#define MALLOC(t, n) ((t *) xmalloc (sizeof (t) * (n)))
-#define REALLOC(o, t, n) ((t *) xrealloc ((o), sizeof (t) * (n)))
-#define CLONE(o, t, n) ((t *) memcpy (MALLOC (t, (n)), (o), sizeof (t) * (n)))
-
-static void hash_rehash __P((struct hash_table* ht));
-static unsigned long round_up_2 __P((unsigned long rough));
-
-/* Implement double hashing with open addressing.  The table size is
-   always a power of two.  The secondary ('increment') hash function
-   is forced to return an odd-value, in order to be relatively prime
-   to the table size.  This guarantees that the increment can
-   potentially hit every slot in the table during collision
-   resolution.  */
-
-void *hash_deleted_item = &hash_deleted_item;
-
-/* Force the table size to be a power of two, possibly rounding up the
-   given size.  */
-
-void
-hash_init (struct hash_table *ht, unsigned long size,
-           hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp)
-{
-  ht->ht_size = round_up_2 (size);
-  ht->ht_empty_slots = ht->ht_size;
-  ht->ht_vec = (void**) CALLOC (struct token *, ht->ht_size);
-  if (ht->ht_vec == 0)
-    {
-      fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"),
-              ht->ht_size * (unsigned long) sizeof (struct token *));
-      exit (MAKE_TROUBLE);
-    }
-
-  ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading factor */
-  ht->ht_fill = 0;
-  ht->ht_collisions = 0;
-  ht->ht_lookups = 0;
-  ht->ht_rehashes = 0;
-  ht->ht_hash_1 = hash_1;
-  ht->ht_hash_2 = hash_2;
-  ht->ht_compare = hash_cmp;
-}
-
-/* Load an array of items into 'ht'.  */
-
-void
-hash_load (struct hash_table *ht, void *item_table,
-           unsigned long cardinality, unsigned long size)
-{
-  char *items = (char *) item_table;
-  while (cardinality--)
-    {
-      hash_insert (ht, items);
-      items += size;
-    }
-}
-
-/* Returns the address of the table slot matching 'key'.  If 'key' is
-   not found, return the address of an empty slot suitable for
-   inserting 'key'.  The caller is responsible for incrementing
-   ht_fill on insertion.  */
-
-void **
-hash_find_slot (struct hash_table *ht, const void *key)
-{
-  void **slot;
-  void **deleted_slot = 0;
-  unsigned int hash_2 = 0;
-  unsigned int hash_1 = (*ht->ht_hash_1) (key);
-
-  ht->ht_lookups++;
-  for (;;)
-    {
-      hash_1 &= (ht->ht_size - 1);
-      slot = &ht->ht_vec[hash_1];
-
-      if (*slot == 0)
-       return (deleted_slot ? deleted_slot : slot);
-      if (*slot == hash_deleted_item)
-       {
-         if (deleted_slot == 0)
-           deleted_slot = slot;
-       }
-      else
-       {
-         if (key == *slot)
-           return slot;
-         if ((*ht->ht_compare) (key, *slot) == 0)
-           return slot;
-         ht->ht_collisions++;
-       }
-      if (!hash_2)
-         hash_2 = (*ht->ht_hash_2) (key) | 1;
-      hash_1 += hash_2;
-    }
-}
-
-void *
-hash_find_item (struct hash_table *ht, const void *key)
-{
-  void **slot = hash_find_slot (ht, key);
-  return ((HASH_VACANT (*slot)) ? 0 : *slot);
-}
-
-void *
-hash_insert (struct hash_table *ht, const void *item)
-{
-  void **slot = hash_find_slot (ht, item);
-  const void *old_item = *slot;
-  hash_insert_at (ht, item, slot);
-  return (void *)((HASH_VACANT (old_item)) ? 0 : old_item);
-}
-
-void *
-hash_insert_at (struct hash_table *ht, const void *item, const void *slot)
-{
-  const void *old_item = *(void **) slot;
-  if (HASH_VACANT (old_item))
-    {
-      ht->ht_fill++;
-      if (old_item == 0)
-       ht->ht_empty_slots--;
-      old_item = item;
-    }
-  *(void const **) slot = item;
-  if (ht->ht_empty_slots < ht->ht_size - ht->ht_capacity)
-    {
-      hash_rehash (ht);
-      return (void *) hash_find_slot (ht, item);
-    }
-  else
-    return (void *) slot;
-}
-
-void *
-hash_delete (struct hash_table *ht, const void *item)
-{
-  void **slot = hash_find_slot (ht, item);
-  return hash_delete_at (ht, slot);
-}
-
-void *
-hash_delete_at (struct hash_table *ht, const void *slot)
-{
-  void *item = *(void **) slot;
-  if (!HASH_VACANT (item))
-    {
-      *(void const **) slot = hash_deleted_item;
-      ht->ht_fill--;
-      return item;
-    }
-  else
-    return 0;
-}
-
-void
-hash_free_items (struct hash_table *ht)
-{
-  void **vec = ht->ht_vec;
-  void **end = &vec[ht->ht_size];
-  for (; vec < end; vec++)
-    {
-      void *item = *vec;
-      if (!HASH_VACANT (item))
-       free (item);
-      *vec = 0;
-    }
-  ht->ht_fill = 0;
-  ht->ht_empty_slots = ht->ht_size;
-}
-
-void
-hash_delete_items (struct hash_table *ht)
-{
-  void **vec = ht->ht_vec;
-  void **end = &vec[ht->ht_size];
-  for (; vec < end; vec++)
-    *vec = 0;
-  ht->ht_fill = 0;
-  ht->ht_collisions = 0;
-  ht->ht_lookups = 0;
-  ht->ht_rehashes = 0;
-  ht->ht_empty_slots = ht->ht_size;
-}
-
-void
-hash_free (struct hash_table *ht, int free_items)
-{
-  if (free_items)
-    hash_free_items (ht);
-  else
-    {
-      ht->ht_fill = 0;
-      ht->ht_empty_slots = ht->ht_size;
-    }
-  free (ht->ht_vec);
-  ht->ht_vec = 0;
-  ht->ht_capacity = 0;
-}
-
-void
-hash_map (struct hash_table *ht, hash_map_func_t map)
-{
-  void **slot;
-  void **end = &ht->ht_vec[ht->ht_size];
-
-  for (slot = ht->ht_vec; slot < end; slot++)
-    {
-      if (!HASH_VACANT (*slot))
-       (*map) (*slot);
-    }
-}
-
-void
-hash_map_arg (struct hash_table *ht, hash_map_arg_func_t map, void *arg)
-{
-  void **slot;
-  void **end = &ht->ht_vec[ht->ht_size];
-
-  for (slot = ht->ht_vec; slot < end; slot++)
-    {
-      if (!HASH_VACANT (*slot))
-       (*map) (*slot, arg);
-    }
-}
-
-/* Double the size of the hash table in the event of overflow... */
-
-static void
-hash_rehash (struct hash_table *ht)
-{
-  unsigned long old_ht_size = ht->ht_size;
-  void **old_vec = ht->ht_vec;
-  void **ovp;
-
-  if (ht->ht_fill >= ht->ht_capacity)
-    {
-      ht->ht_size *= 2;
-      ht->ht_capacity = ht->ht_size - (ht->ht_size >> 4);
-    }
-  ht->ht_rehashes++;
-  ht->ht_vec = (void **) CALLOC (struct token *, ht->ht_size);
-
-  for (ovp = old_vec; ovp < &old_vec[old_ht_size]; ovp++)
-    {
-      if (! HASH_VACANT (*ovp))
-       {
-         void **slot = hash_find_slot (ht, *ovp);
-         *slot = *ovp;
-       }
-    }
-  ht->ht_empty_slots = ht->ht_size - ht->ht_fill;
-  free (old_vec);
-}
-
-void
-hash_print_stats (struct hash_table *ht, FILE *out_FILE)
-{
-  /* GKM FIXME: honor NO_FLOAT */
-  fprintf (out_FILE, _("Load=%ld/%ld=%.0f%%, "), ht->ht_fill, ht->ht_size,
-          100.0 * (double) ht->ht_fill / (double) ht->ht_size);
-  fprintf (out_FILE, _("Rehash=%d, "), ht->ht_rehashes);
-  fprintf (out_FILE, _("Collisions=%ld/%ld=%.0f%%"), ht->ht_collisions, ht->ht_lookups,
-          (ht->ht_lookups
-           ? (100.0 * (double) ht->ht_collisions / (double) ht->ht_lookups)
-           : 0));
-}
-
-/* Dump all items into a NULL-terminated vector.  Use the
-   user-supplied vector, or malloc one.  */
-
-void **
-hash_dump (struct hash_table *ht, void **vector_0, qsort_cmp_t compare)
-{
-  void **vector;
-  void **slot;
-  void **end = &ht->ht_vec[ht->ht_size];
-
-  if (vector_0 == 0)
-    vector_0 = MALLOC (void *, ht->ht_fill + 1);
-  vector = vector_0;
-
-  for (slot = ht->ht_vec; slot < end; slot++)
-    if (!HASH_VACANT (*slot))
-      *vector++ = *slot;
-  *vector = 0;
-
-  if (compare)
-    qsort (vector_0, ht->ht_fill, sizeof (void *), compare);
-  return vector_0;
-}
-
-/* Round a given number up to the nearest power of 2. */
-
-static unsigned long
-round_up_2 (unsigned long n)
-{
-  n |= (n >> 1);
-  n |= (n >> 2);
-  n |= (n >> 4);
-  n |= (n >> 8);
-  n |= (n >> 16);
-
-#if !defined(HAVE_LIMITS_H) || ULONG_MAX > 4294967295
-  /* We only need this on systems where unsigned long is >32 bits.  */
-  n |= (n >> 32);
-#endif
-
-  return n + 1;
-}
diff --git a/hash.h b/hash.h
deleted file mode 100644 (file)
index 960cbd7..0000000
--- a/hash.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/* hash.h -- decls for hash table
-Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc.
-Written by Greg McGary <gkm@gnu.org> <greg@mcgary.org>
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _hash_h_
-#define _hash_h_
-
-#include <stdio.h>
-#include <ctype.h>
-
-#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
-# if !defined __GLIBC__ || !defined __P
-#  undef       __P
-#  define __P(protos)  protos
-# endif
-#else /* Not C++ or ANSI C.  */
-# undef        __P
-# define __P(protos)   ()
-/* We can get away without defining 'const' here only because in this file
-   it is used only inside the prototype for 'fnmatch', which is elided in
-   non-ANSI C where 'const' is problematical.  */
-#endif /* C++ or ANSI C.  */
-
-typedef unsigned long (*hash_func_t) __P((void const *key));
-typedef int (*hash_cmp_func_t) __P((void const *x, void const *y));
-typedef void (*hash_map_func_t) __P((void const *item));
-typedef void (*hash_map_arg_func_t) __P((void const *item, void *arg));
-
-struct hash_table
-{
-  void **ht_vec;
-  hash_func_t ht_hash_1;       /* primary hash function */
-  hash_func_t ht_hash_2;       /* secondary hash function */
-  hash_cmp_func_t ht_compare;  /* comparison function */
-  unsigned long ht_size;       /* total number of slots (power of 2) */
-  unsigned long ht_capacity;   /* usable slots, limited by loading-factor */
-  unsigned long ht_fill;       /* items in table */
-  unsigned long ht_empty_slots;        /* empty slots not including deleted slots */
-  unsigned long ht_collisions; /* # of failed calls to comparison function */
-  unsigned long ht_lookups;    /* # of queries */
-  unsigned int ht_rehashes;    /* # of times we've expanded table */
-};
-
-typedef int (*qsort_cmp_t) __P((void const *, void const *));
-
-void hash_init __P((struct hash_table *ht, unsigned long size,
-                   hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp));
-void hash_load __P((struct hash_table *ht, void *item_table,
-                   unsigned long cardinality, unsigned long size));
-void **hash_find_slot __P((struct hash_table *ht, void const *key));
-void *hash_find_item __P((struct hash_table *ht, void const *key));
-void *hash_insert __P((struct hash_table *ht, const void *item));
-void *hash_insert_at __P((struct hash_table *ht, const void *item, void const *slot));
-void *hash_delete __P((struct hash_table *ht, void const *item));
-void *hash_delete_at __P((struct hash_table *ht, void const *slot));
-void hash_delete_items __P((struct hash_table *ht));
-void hash_free_items __P((struct hash_table *ht));
-void hash_free __P((struct hash_table *ht, int free_items));
-void hash_map __P((struct hash_table *ht, hash_map_func_t map));
-void hash_map_arg __P((struct hash_table *ht, hash_map_arg_func_t map, void *arg));
-void hash_print_stats __P((struct hash_table *ht, FILE *out_FILE));
-void **hash_dump __P((struct hash_table *ht, void **vector_0, qsort_cmp_t compare));
-
-extern void *hash_deleted_item;
-#define HASH_VACANT(item) ((item) == 0 || (void *) (item) == hash_deleted_item)
-
-\f
-/* hash and comparison macros for case-sensitive string keys. */
-
-/* Due to the strcache, it's not uncommon for the string pointers to
-   be identical.  Take advantage of that to short-circuit string compares.  */
-
-#define STRING_HASH_1(KEY, RESULT) do { \
-  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
-  while (*++_key_) \
-    (RESULT) += (*_key_ << (_key_[1] & 0xf)); \
-} while (0)
-#define return_STRING_HASH_1(KEY) do { \
-  unsigned long _result_ = 0; \
-  STRING_HASH_1 ((KEY), _result_); \
-  return _result_; \
-} while (0)
-
-#define STRING_HASH_2(KEY, RESULT) do { \
-  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
-  while (*++_key_) \
-    (RESULT) += (*_key_ << (_key_[1] & 0x7)); \
-} while (0)
-#define return_STRING_HASH_2(KEY) do { \
-  unsigned long _result_ = 0; \
-  STRING_HASH_2 ((KEY), _result_); \
-  return _result_; \
-} while (0)
-
-#define STRING_COMPARE(X, Y, RESULT) do { \
-    RESULT = (X) == (Y) ? 0 : strcmp ((X), (Y)); \
-} while (0)
-#define return_STRING_COMPARE(X, Y) do { \
-  return (X) == (Y) ? 0 : strcmp ((X), (Y)); \
-} while (0)
-
-
-#define STRING_N_HASH_1(KEY, N, RESULT) do { \
-  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
-  int _n_ = (N); \
-  if (_n_) \
-    while (--_n_ && *++_key_) \
-      (RESULT) += (*_key_ << (_key_[1] & 0xf)); \
-  (RESULT) += *++_key_; \
-} while (0)
-#define return_STRING_N_HASH_1(KEY, N) do { \
-  unsigned long _result_ = 0; \
-  STRING_N_HASH_1 ((KEY), (N), _result_); \
-  return _result_; \
-} while (0)
-
-#define STRING_N_HASH_2(KEY, N, RESULT) do { \
-  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
-  int _n_ = (N); \
-  if (_n_) \
-    while (--_n_ && *++_key_) \
-      (RESULT) += (*_key_ << (_key_[1] & 0x7)); \
-  (RESULT) += *++_key_; \
-} while (0)
-#define return_STRING_N_HASH_2(KEY, N) do { \
-  unsigned long _result_ = 0; \
-  STRING_N_HASH_2 ((KEY), (N), _result_); \
-  return _result_; \
-} while (0)
-
-#define STRING_N_COMPARE(X, Y, N, RESULT) do { \
-  RESULT = (X) == (Y) ? 0 : strncmp ((X), (Y), (N)); \
-} while (0)
-#define return_STRING_N_COMPARE(X, Y, N) do { \
-  return (X) == (Y) ? 0 : strncmp ((X), (Y), (N)); \
-} while (0)
-
-#ifdef HAVE_CASE_INSENSITIVE_FS
-
-/* hash and comparison macros for case-insensitive string _key_s. */
-
-#define ISTRING_HASH_1(KEY, RESULT) do { \
-  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
-  while (*++_key_) \
-    (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0xf)); \
-} while (0)
-#define return_ISTRING_HASH_1(KEY) do { \
-  unsigned long _result_ = 0; \
-  ISTRING_HASH_1 ((KEY), _result_); \
-  return _result_; \
-} while (0)
-
-#define ISTRING_HASH_2(KEY, RESULT) do { \
-  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
-  while (*++_key_) \
-    (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0x7)); \
-} while (0)
-#define return_ISTRING_HASH_2(KEY) do { \
-  unsigned long _result_ = 0; \
-  ISTRING_HASH_2 ((KEY), _result_); \
-  return _result_; \
-} while (0)
-
-#define ISTRING_COMPARE(X, Y, RESULT) do { \
-  RESULT = (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \
-} while (0)
-#define return_ISTRING_COMPARE(X, Y) do { \
-  return (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \
-} while (0)
-
-#else
-
-#define ISTRING_HASH_1(KEY, RESULT) STRING_HASH_1 ((KEY), (RESULT))
-#define return_ISTRING_HASH_1(KEY) return_STRING_HASH_1 (KEY)
-
-#define ISTRING_HASH_2(KEY, RESULT) STRING_HASH_2 ((KEY), (RESULT))
-#define return_ISTRING_HASH_2(KEY) return_STRING_HASH_2 (KEY)
-
-#define ISTRING_COMPARE(X, Y, RESULT) STRING_COMPARE ((X), (Y), (RESULT))
-#define return_ISTRING_COMPARE(X, Y) return_STRING_COMPARE ((X), (Y))
-
-#endif
-
-/* hash and comparison macros for integer _key_s. */
-
-#define INTEGER_HASH_1(KEY, RESULT) do { \
-  (RESULT) += ((unsigned long)(KEY)); \
-} while (0)
-#define return_INTEGER_HASH_1(KEY) do { \
-  unsigned long _result_ = 0; \
-  INTEGER_HASH_1 ((KEY), _result_); \
-  return _result_; \
-} while (0)
-
-#define INTEGER_HASH_2(KEY, RESULT) do { \
-  (RESULT) += ~((unsigned long)(KEY)); \
-} while (0)
-#define return_INTEGER_HASH_2(KEY) do { \
-  unsigned long _result_ = 0; \
-  INTEGER_HASH_2 ((KEY), _result_); \
-  return _result_; \
-} while (0)
-
-#define INTEGER_COMPARE(X, Y, RESULT) do { \
-  (RESULT) = X - Y; \
-} while (0)
-#define return_INTEGER_COMPARE(X, Y) do { \
-  int _result_; \
-  INTEGER_COMPARE (X, Y, _result_); \
-  return _result_; \
-} while (0)
-
-/* hash and comparison macros for address keys. */
-
-#define ADDRESS_HASH_1(KEY, RESULT) INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3, (RESULT))
-#define ADDRESS_HASH_2(KEY, RESULT) INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3, (RESULT))
-#define ADDRESS_COMPARE(X, Y, RESULT) INTEGER_COMPARE ((X), (Y), (RESULT))
-#define return_ADDRESS_HASH_1(KEY) return_INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3)
-#define return_ADDRESS_HASH_2(KEY) return_INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3)
-#define return_ADDRESS_COMPARE(X, Y) return_INTEGER_COMPARE ((X), (Y))
-
-#endif /* not _hash_h_ */
diff --git a/implicit.c b/implicit.c
deleted file mode 100644 (file)
index ed49bd1..0000000
+++ /dev/null
@@ -1,999 +0,0 @@
-/* Implicit rule searching for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "rule.h"
-#include "dep.h"
-#include "debug.h"
-#include "variable.h"
-#include "job.h"      /* struct child, used inside commands.h */
-#include "commands.h" /* set_file_variables */
-
-static int pattern_search (struct file *file, int archive,
-                           unsigned int depth, unsigned int recursions);
-\f
-/* For a FILE which has no commands specified, try to figure out some
-   from the implicit pattern rules.
-   Returns 1 if a suitable implicit rule was found,
-   after modifying FILE to contain the appropriate commands and deps,
-   or returns 0 if no implicit rule was found.  */
-
-int
-try_implicit_rule (struct file *file, unsigned int depth)
-{
-  DBF (DB_IMPLICIT, _("Looking for an implicit rule for '%s'.\n"));
-
-  /* The order of these searches was previously reversed.  My logic now is
-     that since the non-archive search uses more information in the target
-     (the archive search omits the archive name), it is more specific and
-     should come first.  */
-
-  if (pattern_search (file, 0, depth, 0))
-    return 1;
-
-#ifndef NO_ARCHIVES
-  /* If this is an archive member reference, use just the
-     archive member name to search for implicit rules.  */
-  if (ar_name (file->name))
-    {
-      DBF (DB_IMPLICIT,
-           _("Looking for archive-member implicit rule for '%s'.\n"));
-      if (pattern_search (file, 1, depth, 0))
-        return 1;
-    }
-#endif
-
-  return 0;
-}
-\f
-
-/* Scans the BUFFER for the next word with whitespace as a separator.
-   Returns the pointer to the beginning of the word. LENGTH hold the
-   length of the word.  */
-
-static const char *
-get_next_word (const char *buffer, unsigned int *length)
-{
-  const char *p = buffer, *beg;
-  char c;
-
-  /* Skip any leading whitespace.  */
-  NEXT_TOKEN (p);
-
-  beg = p;
-  c = *(p++);
-
-  if (c == '\0')
-    return 0;
-
-
-  /* We already found the first value of "c", above.  */
-  while (1)
-    {
-      char closeparen;
-      int count;
-
-      switch (c)
-        {
-        case '\0':
-        case ' ':
-        case '\t':
-          goto done_word;
-
-        case '$':
-          c = *(p++);
-          if (c == '$')
-            break;
-
-          /* This is a variable reference, so read it to the matching
-             close paren.  */
-
-          if (c == '(')
-            closeparen = ')';
-          else if (c == '{')
-            closeparen = '}';
-          else
-            /* This is a single-letter variable reference.  */
-            break;
-
-          for (count = 0; *p != '\0'; ++p)
-            {
-              if (*p == c)
-                ++count;
-              else if (*p == closeparen && --count < 0)
-                {
-                  ++p;
-                  break;
-                }
-            }
-          break;
-
-        case '|':
-          goto done;
-
-        default:
-          break;
-        }
-
-      c = *(p++);
-    }
- done_word:
-  --p;
-
- done:
-  if (length)
-    *length = p - beg;
-
-  return beg;
-}
-
-/* This structure stores information about the expanded prerequisites for a
-   pattern rule.  NAME is always set to the strcache'd name of the prereq.
-   FILE and PATTERN will be set for intermediate files only.  IGNORE_MTIME is
-   copied from the prerequisite we expanded.
- */
-struct patdeps
-  {
-    const char *name;
-    const char *pattern;
-    struct file *file;
-    unsigned int ignore_mtime : 1;
-  };
-
-/* This structure stores information about pattern rules that we need
-   to try.
-*/
-struct tryrule
-  {
-    struct rule *rule;
-
-    /* Index of the target in this rule that matched the file. */
-    unsigned int matches;
-
-    /* Stem length for this match. */
-    unsigned int stemlen;
-
-    /* Definition order of this rule. Used to implement stable sort.*/
-    unsigned int order;
-
-    /* Nonzero if the LASTSLASH logic was used in matching this rule. */
-    char checked_lastslash;
-  };
-
-int
-stemlen_compare (const void *v1, const void *v2)
-{
-  const struct tryrule *r1 = v1;
-  const struct tryrule *r2 = v2;
-  int r = r1->stemlen - r2->stemlen;
-  return r != 0 ? r : (int)(r1->order - r2->order);
-}
-
-/* Search the pattern rules for a rule with an existing dependency to make
-   FILE.  If a rule is found, the appropriate commands and deps are put in FILE
-   and 1 is returned.  If not, 0 is returned.
-
-   If ARCHIVE is nonzero, FILE->name is of the form "LIB(MEMBER)".  A rule for
-   "(MEMBER)" will be searched for, and "(MEMBER)" will not be chopped up into
-   directory and filename parts.
-
-   If an intermediate file is found by pattern search, the intermediate file
-   is set up as a target by the recursive call and is also made a dependency
-   of FILE.
-
-   DEPTH is used for debugging messages.  */
-
-static int
-pattern_search (struct file *file, int archive,
-                unsigned int depth, unsigned int recursions)
-{
-  /* Filename we are searching for a rule for.  */
-  const char *filename = archive ? strchr (file->name, '(') : file->name;
-
-  /* Length of FILENAME.  */
-  unsigned int namelen = strlen (filename);
-
-  /* The last slash in FILENAME (or nil if there is none).  */
-  const char *lastslash;
-
-  /* This is a file-object used as an argument in
-     recursive calls.  It never contains any data
-     except during a recursive call.  */
-  struct file *int_file = 0;
-
-  /* List of dependencies found recursively.  */
-  unsigned int max_deps = max_pattern_deps;
-  struct patdeps *deplist = xmalloc (max_deps * sizeof (struct patdeps));
-  struct patdeps *pat = deplist;
-
-  /* Names of possible dependencies are constructed in this buffer.  */
-  char *depname = alloca (namelen + max_pattern_dep_length);
-
-  /* The start and length of the stem of FILENAME for the current rule.  */
-  const char *stem = 0;
-  unsigned int stemlen = 0;
-  unsigned int fullstemlen = 0;
-
-  /* Buffer in which we store all the rules that are possibly applicable.  */
-  struct tryrule *tryrules = xmalloc (num_pattern_rules * max_pattern_targets
-                                      * sizeof (struct tryrule));
-
-  /* Number of valid elements in TRYRULES.  */
-  unsigned int nrules;
-
-  /* The index in TRYRULES of the rule we found.  */
-  unsigned int foundrule;
-
-  /* Nonzero if should consider intermediate files as dependencies.  */
-  int intermed_ok;
-
-  /* Nonzero if we have initialized file variables for this target.  */
-  int file_vars_initialized = 0;
-
-  /* Nonzero if we have matched a pattern-rule target
-     that is not just '%'.  */
-  int specific_rule_matched = 0;
-
-  unsigned int ri;  /* uninit checks OK */
-  struct rule *rule;
-
-  char *pathdir = NULL;
-  unsigned long pathlen;
-
-  PATH_VAR (stem_str); /* @@ Need to get rid of stem, stemlen, etc. */
-
-#ifndef NO_ARCHIVES
-  if (archive || ar_name (filename))
-    lastslash = 0;
-  else
-#endif
-    {
-      /* Set LASTSLASH to point at the last slash in FILENAME
-         but not counting any slash at the end.  (foo/bar/ counts as
-         bar/ in directory foo/, not empty in directory foo/bar/.)  */
-      lastslash = strrchr (filename, '/');
-#ifdef VMS
-      if (lastslash == NULL)
-        lastslash = strrchr (filename, ']');
-      if (lastslash == NULL)
-        lastslash = strrchr (filename, '>');
-      if (lastslash == NULL)
-        lastslash = strrchr (filename, ':');
-#endif
-#ifdef HAVE_DOS_PATHS
-      /* Handle backslashes (possibly mixed with forward slashes)
-         and the case of "d:file".  */
-      {
-        char *bslash = strrchr (filename, '\\');
-        if (lastslash == 0 || bslash > lastslash)
-          lastslash = bslash;
-        if (lastslash == 0 && filename[0] && filename[1] == ':')
-          lastslash = filename + 1;
-      }
-#endif
-      if (lastslash != 0 && lastslash[1] == '\0')
-        lastslash = 0;
-    }
-
-  pathlen = lastslash - filename + 1;
-
-  /* First see which pattern rules match this target and may be considered.
-     Put them in TRYRULES.  */
-
-  nrules = 0;
-  for (rule = pattern_rules; rule != 0; rule = rule->next)
-    {
-      unsigned int ti;
-
-      /* If the pattern rule has deps but no commands, ignore it.
-         Users cancel built-in rules by redefining them without commands.  */
-      if (rule->deps != 0 && rule->cmds == 0)
-        continue;
-
-      /* If this rule is in use by a parent pattern_search,
-         don't use it here.  */
-      if (rule->in_use)
-        {
-          DBS (DB_IMPLICIT, (_("Avoiding implicit rule recursion.\n")));
-          continue;
-        }
-
-      for (ti = 0; ti < rule->num; ++ti)
-        {
-          const char *target = rule->targets[ti];
-          const char *suffix = rule->suffixes[ti];
-          char check_lastslash;
-
-          /* Rules that can match any filename and are not terminal
-             are ignored if we're recursing, so that they cannot be
-             intermediate files.  */
-          if (recursions > 0 && target[1] == '\0' && !rule->terminal)
-            continue;
-
-          if (rule->lens[ti] > namelen)
-            /* It can't possibly match.  */
-            continue;
-
-          /* From the lengths of the filename and the pattern parts,
-             find the stem: the part of the filename that matches the %.  */
-          stem = filename + (suffix - target - 1);
-          stemlen = namelen - rule->lens[ti] + 1;
-
-          /* Set CHECK_LASTSLASH if FILENAME contains a directory
-             prefix and the target pattern does not contain a slash.  */
-
-          check_lastslash = 0;
-          if (lastslash)
-            {
-#ifdef VMS
-              check_lastslash = strpbrk (target, "/]>:") == NULL;
-#else
-              check_lastslash = strchr (target, '/') == 0;
-#endif
-#ifdef HAVE_DOS_PATHS
-              /* Didn't find it yet: check for DOS-type directories.  */
-              if (check_lastslash)
-                {
-                  char *b = strchr (target, '\\');
-                  check_lastslash = !(b || (target[0] && target[1] == ':'));
-                }
-#endif
-            }
-          if (check_lastslash)
-            {
-              /* If so, don't include the directory prefix in STEM here.  */
-              if (pathlen > stemlen)
-                continue;
-              stemlen -= pathlen;
-              stem += pathlen;
-            }
-
-          /* Check that the rule pattern matches the text before the stem.  */
-          if (check_lastslash)
-            {
-              if (stem > (lastslash + 1)
-                  && !strneq (target, lastslash + 1, stem - lastslash - 1))
-                continue;
-            }
-          else if (stem > filename
-                   && !strneq (target, filename, stem - filename))
-            continue;
-
-          /* Check that the rule pattern matches the text after the stem.
-             We could test simply use streq, but this way we compare the
-             first two characters immediately.  This saves time in the very
-             common case where the first character matches because it is a
-             period.  */
-          if (*suffix != stem[stemlen]
-              || (*suffix != '\0' && !streq (&suffix[1], &stem[stemlen + 1])))
-            continue;
-
-          /* Record if we match a rule that not all filenames will match.  */
-          if (target[1] != '\0')
-            specific_rule_matched = 1;
-
-          /* A rule with no dependencies and no commands exists solely to set
-             specific_rule_matched when it matches.  Don't try to use it.  */
-          if (rule->deps == 0 && rule->cmds == 0)
-            continue;
-
-          /* Record this rule in TRYRULES and the index of the matching
-             target in MATCHES.  If several targets of the same rule match,
-             that rule will be in TRYRULES more than once.  */
-          tryrules[nrules].rule = rule;
-          tryrules[nrules].matches = ti;
-          tryrules[nrules].stemlen = stemlen + (check_lastslash ? pathlen : 0);
-          tryrules[nrules].order = nrules;
-          tryrules[nrules].checked_lastslash = check_lastslash;
-          ++nrules;
-        }
-    }
-
-  /* Bail out early if we haven't found any rules. */
-  if (nrules == 0)
-    goto done;
-
-  /* Sort the rules to place matches with the shortest stem first. This
-     way the most specific rules will be tried first. */
-  if (nrules > 1)
-    qsort (tryrules, nrules, sizeof (struct tryrule), stemlen_compare);
-
-  /* If we have found a matching rule that won't match all filenames,
-     retroactively reject any non-"terminal" rules that do always match.  */
-  if (specific_rule_matched)
-    for (ri = 0; ri < nrules; ++ri)
-      if (!tryrules[ri].rule->terminal)
-        {
-          unsigned int j;
-          for (j = 0; j < tryrules[ri].rule->num; ++j)
-            if (tryrules[ri].rule->targets[j][1] == '\0')
-              {
-                tryrules[ri].rule = 0;
-                break;
-              }
-        }
-
-  /* Try each rule once without intermediate files, then once with them.  */
-  for (intermed_ok = 0; intermed_ok < 2; ++intermed_ok)
-    {
-      pat = deplist;
-
-      /* Try each pattern rule till we find one that applies.  If it does,
-         expand its dependencies (as substituted) and chain them in DEPS.  */
-      for (ri = 0; ri < nrules; ri++)
-        {
-          struct dep *dep;
-          char check_lastslash;
-          unsigned int failed = 0;
-          int file_variables_set = 0;
-          unsigned int deps_found = 0;
-          /* NPTR points to the part of the prereq we haven't processed.  */
-          const char *nptr = 0;
-          const char *dir = NULL;
-          int order_only = 0;
-          unsigned int matches;
-
-          rule = tryrules[ri].rule;
-
-          /* RULE is nil when we discover that a rule, already placed in
-             TRYRULES, should not be applied.  */
-          if (rule == 0)
-            continue;
-
-          /* Reject any terminal rules if we're looking to make intermediate
-             files.  */
-          if (intermed_ok && rule->terminal)
-            continue;
-
-          /* From the lengths of the filename and the matching pattern parts,
-             find the stem: the part of the filename that matches the %.  */
-          matches = tryrules[ri].matches;
-          stem = filename + (rule->suffixes[matches]
-                             - rule->targets[matches]) - 1;
-          stemlen = (namelen - rule->lens[matches]) + 1;
-          check_lastslash = tryrules[ri].checked_lastslash;
-          if (check_lastslash)
-            {
-              stem += pathlen;
-              stemlen -= pathlen;
-
-              /* We need to add the directory prefix, so set it up.  */
-              if (! pathdir)
-                {
-                  pathdir = alloca (pathlen + 1);
-                  memcpy (pathdir, filename, pathlen);
-                  pathdir[pathlen] = '\0';
-                }
-              dir = pathdir;
-            }
-
-          if (stemlen > GET_PATH_MAX)
-            {
-              DBS (DB_IMPLICIT, (_("Stem too long: '%.*s'.\n"),
-                                 (int) stemlen, stem));
-              continue;
-            }
-
-          DBS (DB_IMPLICIT, (_("Trying pattern rule with stem '%.*s'.\n"),
-                             (int) stemlen, stem));
-
-          strncpy (stem_str, stem, stemlen);
-          stem_str[stemlen] = '\0';
-
-          /* If there are no prerequisites, then this rule matches.  */
-          if (rule->deps == 0)
-            break;
-
-          /* Temporary assign STEM to file->stem (needed to set file
-             variables below).   */
-          file->stem = stem_str;
-
-          /* Mark this rule as in use so a recursive pattern_search won't try
-             to use it.  */
-          rule->in_use = 1;
-
-          /* Try each prerequisite; see if it exists or can be created.  We'll
-             build a list of prereq info in DEPLIST.  Due to 2nd expansion we
-             may have to process multiple prereqs for a single dep entry.  */
-
-          pat = deplist;
-          dep = rule->deps;
-          nptr = dep_name (dep);
-          while (1)
-            {
-              struct dep *dl, *d;
-              char *p;
-
-              /* If we're out of name to parse, start the next prereq.  */
-              if (! nptr)
-                {
-                  dep = dep->next;
-                  if (dep == 0)
-                    break;
-                  nptr = dep_name (dep);
-                }
-
-              /* If we don't need a second expansion, just replace the %.  */
-              if (! dep->need_2nd_expansion)
-                {
-                  p = strchr (nptr, '%');
-                  if (p == 0)
-                    strcpy (depname, nptr);
-                  else
-                    {
-                      char *o = depname;
-                      if (check_lastslash)
-                        {
-                          memcpy (o, filename, pathlen);
-                          o += pathlen;
-                        }
-                      memcpy (o, nptr, p - nptr);
-                      o += p - nptr;
-                      memcpy (o, stem_str, stemlen);
-                      o += stemlen;
-                      strcpy (o, p + 1);
-                    }
-
-                  /* Parse the expanded string.  It might have wildcards.  */
-                  p = depname;
-                  dl = PARSE_SIMPLE_SEQ (&p, struct dep);
-                  for (d = dl; d != NULL; d = d->next)
-                    {
-                      ++deps_found;
-                      d->ignore_mtime = dep->ignore_mtime;
-                    }
-
-                  /* We've used up this dep, so next time get a new one.  */
-                  nptr = 0;
-                }
-
-              /* We have to perform second expansion on this prereq.  In an
-                 ideal world we would take the dependency line, substitute the
-                 stem, re-expand the whole line and chop it into individual
-                 prerequisites.  Unfortunately this won't work because of the
-                 "check_lastslash" twist.  Instead, we will have to go word by
-                 word, taking $()'s into account.  For each word we will
-                 substitute the stem, re-expand, chop it up, and, if
-                 check_lastslash != 0, add the directory part to each
-                 resulting prerequisite.  */
-              else
-                {
-                  int add_dir = 0;
-                  unsigned int len;
-                  struct dep **dptr;
-
-                  nptr = get_next_word (nptr, &len);
-                  if (nptr == 0)
-                    continue;
-
-                  /* See this is a transition to order-only prereqs.  */
-                  if (! order_only && len == 1 && nptr[0] == '|')
-                    {
-                      order_only = 1;
-                      nptr += len;
-                      continue;
-                    }
-
-                  /* If the dependency name has %, substitute the stem.  If we
-                     just replace % with the stem value then later, when we do
-                     the 2nd expansion, we will re-expand this stem value
-                     again.  This is not good if you have certain characters
-                     in your stem (like $).
-
-                     Instead, we will replace % with $* and allow the second
-                     expansion to take care of it for us.  This way (since $*
-                     is a simple variable) there won't be additional
-                     re-expansion of the stem.  */
-
-                  p = lindex (nptr, nptr + len, '%');
-                  if (p == 0)
-                    {
-                      memcpy (depname, nptr, len);
-                      depname[len] = '\0';
-                    }
-                  else
-                    {
-                      unsigned int i = p - nptr;
-                      memcpy (depname, nptr, i);
-                      memcpy (depname + i, "$*", 2);
-                      memcpy (depname + i + 2, p + 1, len - i - 1);
-                      depname[len + 2 - 1] = '\0';
-
-                      if (check_lastslash)
-                        add_dir = 1;
-                    }
-
-                  /* Set up for the next word.  */
-                  nptr += len;
-
-                  /* Initialize and set file variables if we haven't already
-                     done so. */
-                  if (!file_vars_initialized)
-                    {
-                      initialize_file_variables (file, 0);
-                      set_file_variables (file);
-                      file_vars_initialized = 1;
-                    }
-                  /* Update the stem value in $* for this rule.  */
-                  else if (!file_variables_set)
-                    {
-                      define_variable_for_file (
-                        "*", 1, file->stem, o_automatic, 0, file);
-                      file_variables_set = 1;
-                    }
-
-                  /* Perform the 2nd expansion.  */
-                  p = variable_expand_for_file (depname, file);
-                  dptr = &dl;
-
-                  /* Parse the results into a deps list.  */
-                  do
-                    {
-                      /* Parse the expanded string. */
-                      struct dep *dp = PARSE_FILE_SEQ (&p, struct dep,
-                                                       order_only ? MAP_NUL : MAP_PIPE,
-                                                       add_dir ? dir : NULL, PARSEFS_NONE);
-                      *dptr = dp;
-
-                      for (d = dp; d != NULL; d = d->next)
-                        {
-                          ++deps_found;
-                          if (order_only)
-                            d->ignore_mtime = 1;
-                          dptr = &d->next;
-                        }
-
-                      /* If we stopped due to an order-only token, note it.  */
-                      if (*p == '|')
-                        {
-                          order_only = 1;
-                          ++p;
-                        }
-                    }
-                  while (*p != '\0');
-                }
-
-              /* If there are more than max_pattern_deps prerequisites (due to
-                 2nd expansion), reset it and realloc the arrays.  */
-
-              if (deps_found > max_deps)
-                {
-                  unsigned int l = pat - deplist;
-                  /* This might have changed due to recursion.  */
-                  max_pattern_deps = MAX(max_pattern_deps, deps_found);
-                  max_deps = max_pattern_deps;
-                  deplist = xrealloc (deplist,
-                                      max_deps * sizeof (struct patdeps));
-                  pat = deplist + l;
-                }
-
-              /* Go through the nameseq and handle each as a prereq name.  */
-              for (d = dl; d != 0; d = d->next)
-                {
-                  struct dep *expl_d;
-                  int is_rule = d->name == dep_name (dep);
-
-                  if (file_impossible_p (d->name))
-                    {
-                      /* If this prereq has already been ruled "impossible",
-                         then the rule fails.  Don't bother trying it on the
-                         second pass either since we know that will fail.  */
-                      DBS (DB_IMPLICIT,
-                           (is_rule
-                            ? _("Rejecting impossible rule prerequisite '%s'.\n")
-                            : _("Rejecting impossible implicit prerequisite '%s'.\n"),
-                            d->name));
-                      tryrules[ri].rule = 0;
-
-                      failed = 1;
-                      break;
-                    }
-
-                  memset (pat, '\0', sizeof (struct patdeps));
-                  pat->ignore_mtime = d->ignore_mtime;
-
-                  DBS (DB_IMPLICIT,
-                       (is_rule
-                        ? _("Trying rule prerequisite '%s'.\n")
-                        : _("Trying implicit prerequisite '%s'.\n"), d->name));
-
-                  /* If this prereq is also explicitly mentioned for FILE,
-                     skip all tests below since it must be built no matter
-                     which implicit rule we choose. */
-
-                  for (expl_d = file->deps; expl_d != 0; expl_d = expl_d->next)
-                    if (streq (dep_name (expl_d), d->name))
-                      break;
-                  if (expl_d != 0)
-                    {
-                      (pat++)->name = d->name;
-                      continue;
-                    }
-
-                  /* The DEP->changed flag says that this dependency resides
-                     in a nonexistent directory.  So we normally can skip
-                     looking for the file.  However, if CHECK_LASTSLASH is
-                     set, then the dependency file we are actually looking for
-                     is in a different directory (the one gotten by prepending
-                     FILENAME's directory), so it might actually exist.  */
-
-                  /* @@ dep->changed check is disabled. */
-                  if (lookup_file (d->name) != 0
-                      /*|| ((!dep->changed || check_lastslash) && */
-                      || file_exists_p (d->name))
-                    {
-                      (pat++)->name = d->name;
-                      continue;
-                    }
-
-                  /* This code, given FILENAME = "lib/foo.o", dependency name
-                     "lib/foo.c", and VPATH=src, searches for
-                     "src/lib/foo.c".  */
-                  {
-                    const char *vname = vpath_search (d->name, 0, NULL, NULL);
-                    if (vname)
-                      {
-                        DBS (DB_IMPLICIT,
-                             (_("Found prerequisite '%s' as VPATH '%s'\n"),
-                              d->name, vname));
-                        (pat++)->name = d->name;
-                        continue;
-                      }
-                  }
-
-                  /* We could not find the file in any place we should look.
-                     Try to make this dependency as an intermediate file, but
-                     only on the second pass.  */
-
-                  if (intermed_ok)
-                    {
-                      DBS (DB_IMPLICIT,
-                           (_("Looking for a rule with intermediate file '%s'.\n"),
-                            d->name));
-
-                      if (int_file == 0)
-                        int_file = alloca (sizeof (struct file));
-                      memset (int_file, '\0', sizeof (struct file));
-                      int_file->name = d->name;
-
-                      if (pattern_search (int_file,
-                                          0,
-                                          depth + 1,
-                                          recursions + 1))
-                        {
-                          pat->pattern = int_file->name;
-                          int_file->name = d->name;
-                          pat->file = int_file;
-                          int_file = 0;
-                          (pat++)->name = d->name;
-                          continue;
-                        }
-
-                      /* If we have tried to find P as an intermediate file
-                         and failed, mark that name as impossible so we won't
-                         go through the search again later.  */
-                      if (int_file->variables)
-                        free_variable_set (int_file->variables);
-                      if (int_file->pat_variables)
-                        free_variable_set (int_file->pat_variables);
-                      file_impossible (d->name);
-                    }
-
-                  /* A dependency of this rule does not exist. Therefore, this
-                     rule fails.  */
-                  failed = 1;
-                  break;
-                }
-
-              /* Free the ns chain.  */
-              free_dep_chain (dl);
-
-              if (failed)
-                break;
-            }
-
-          /* Reset the stem in FILE. */
-
-          file->stem = 0;
-
-          /* This rule is no longer 'in use' for recursive searches.  */
-          rule->in_use = 0;
-
-          if (! failed)
-            /* This pattern rule does apply.  Stop looking for one.  */
-            break;
-
-          /* This pattern rule does not apply.  Keep looking.  */
-        }
-
-      /* If we found an applicable rule without intermediate files, don't try
-         with them.  */
-      if (ri < nrules)
-        break;
-
-      rule = 0;
-    }
-
-  /* RULE is nil if the loop went through the list but everything failed.  */
-  if (rule == 0)
-    goto done;
-
-  foundrule = ri;
-
-  /* If we are recursing, store the pattern that matched FILENAME in
-     FILE->name for use in upper levels.  */
-
-  if (recursions > 0)
-    /* Kludge-o-matic */
-    file->name = rule->targets[tryrules[foundrule].matches];
-
-  /* DEPLIST lists the prerequisites for the rule we found.  This includes the
-     intermediate files, if any.  Convert them into entries on the deps-chain
-     of FILE.  */
-
-  while (pat-- > deplist)
-    {
-      struct dep *dep;
-      const char *s;
-
-      if (pat->file != 0)
-        {
-          /* If we need to use an intermediate file, make sure it is entered
-             as a target, with the info that was found for it in the recursive
-             pattern_search call.  We know that the intermediate file did not
-             already exist as a target; therefore we can assume that the deps
-             and cmds of F below are null before we change them.  */
-
-          struct file *imf = pat->file;
-          struct file *f = lookup_file (imf->name);
-
-          /* We don't want to delete an intermediate file that happened
-             to be a prerequisite of some (other) target. Mark it as
-             secondary.  We don't want it to be precious as that disables
-             DELETE_ON_ERROR etc.  */
-          if (f != 0)
-            f->secondary = 1;
-          else
-            f = enter_file (imf->name);
-
-          f->deps = imf->deps;
-          f->cmds = imf->cmds;
-          f->stem = imf->stem;
-          f->variables = imf->variables;
-          f->pat_variables = imf->pat_variables;
-          f->pat_searched = imf->pat_searched;
-          f->also_make = imf->also_make;
-          f->is_target = 1;
-          f->intermediate = 1;
-          f->tried_implicit = 1;
-
-          imf = lookup_file (pat->pattern);
-          if (imf != 0 && imf->precious)
-            f->precious = 1;
-
-          for (dep = f->deps; dep != 0; dep = dep->next)
-            {
-              dep->file = enter_file (dep->name);
-              dep->name = 0;
-              dep->file->tried_implicit |= dep->changed;
-            }
-        }
-
-      dep = alloc_dep ();
-      dep->ignore_mtime = pat->ignore_mtime;
-      s = strcache_add (pat->name);
-      if (recursions)
-        dep->name = s;
-      else
-        {
-          dep->file = lookup_file (s);
-          if (dep->file == 0)
-            dep->file = enter_file (s);
-        }
-
-      if (pat->file == 0 && tryrules[foundrule].rule->terminal)
-        {
-          /* If the file actually existed (was not an intermediate file), and
-             the rule that found it was a terminal one, then we want to mark
-             the found file so that it will not have implicit rule search done
-             for it.  If we are not entering a 'struct file' for it now, we
-             indicate this with the 'changed' flag.  */
-          if (dep->file == 0)
-            dep->changed = 1;
-          else
-            dep->file->tried_implicit = 1;
-        }
-
-      dep->next = file->deps;
-      file->deps = dep;
-    }
-
-  if (!tryrules[foundrule].checked_lastslash)
-    {
-      /* Always allocate new storage, since STEM might be on the stack for an
-         intermediate file.  */
-      file->stem = strcache_add_len (stem, stemlen);
-      fullstemlen = stemlen;
-    }
-  else
-    {
-      int dirlen = (lastslash + 1) - filename;
-      char *sp;
-
-      /* We want to prepend the directory from
-         the original FILENAME onto the stem.  */
-      fullstemlen = dirlen + stemlen;
-      sp = alloca (fullstemlen + 1);
-      memcpy (sp, filename, dirlen);
-      memcpy (sp + dirlen, stem, stemlen);
-      sp[fullstemlen] = '\0';
-      file->stem = strcache_add (sp);
-    }
-
-  file->cmds = rule->cmds;
-  file->is_target = 1;
-
-  /* Set precious flag. */
-  {
-    struct file *f = lookup_file (rule->targets[tryrules[foundrule].matches]);
-    if (f && f->precious)
-      file->precious = 1;
-  }
-
-  /* If this rule builds other targets, too, put the others into FILE's
-     'also_make' member.  */
-
-  if (rule->num > 1)
-    for (ri = 0; ri < rule->num; ++ri)
-      if (ri != tryrules[foundrule].matches)
-        {
-          char *nm = alloca (rule->lens[ri] + fullstemlen + 1);
-          char *p = nm;
-          struct file *f;
-          struct dep *new = alloc_dep ();
-
-          /* GKM FIMXE: handle '|' here too */
-          memcpy (p, rule->targets[ri],
-                  rule->suffixes[ri] - rule->targets[ri] - 1);
-          p += rule->suffixes[ri] - rule->targets[ri] - 1;
-          memcpy (p, file->stem, fullstemlen);
-          p += fullstemlen;
-          memcpy (p, rule->suffixes[ri],
-                  rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1);
-          new->name = strcache_add (nm);
-          new->file = enter_file (new->name);
-          new->next = file->also_make;
-
-          /* Set precious flag. */
-          f = lookup_file (rule->targets[ri]);
-          if (f && f->precious)
-            new->file->precious = 1;
-
-          /* Set the is_target flag so that this file is not treated as
-             intermediate by the pattern rule search algorithm and
-             file_exists_p cannot pick it up yet.  */
-          new->file->is_target = 1;
-
-          file->also_make = new;
-        }
-
- done:
-  free (tryrules);
-  free (deplist);
-
-  return rule != 0;
-}
diff --git a/job.c b/job.c
deleted file mode 100644 (file)
index f3a9fdb..0000000
--- a/job.c
+++ /dev/null
@@ -1,3497 +0,0 @@
-/* Job execution and handling for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "job.h"
-#include "debug.h"
-#include "filedef.h"
-#include "commands.h"
-#include "variable.h"
-#include "os.h"
-
-#include <string.h>
-
-/* Default shell to use.  */
-#ifdef WINDOWS32
-#include <windows.h>
-
-const char *default_shell = "sh.exe";
-int no_default_sh_exe = 1;
-int batch_mode_shell = 1;
-HANDLE main_thread;
-
-#elif defined (_AMIGA)
-
-const char *default_shell = "";
-extern int MyExecute (char **);
-int batch_mode_shell = 0;
-
-#elif defined (__MSDOS__)
-
-/* The default shell is a pointer so we can change it if Makefile
-   says so.  It is without an explicit path so we get a chance
-   to search the $PATH for it (since MSDOS doesn't have standard
-   directories we could trust).  */
-const char *default_shell = "command.com";
-int batch_mode_shell = 0;
-
-#elif defined (__EMX__)
-
-const char *default_shell = "/bin/sh";
-int batch_mode_shell = 0;
-
-#elif defined (VMS)
-
-# include <descrip.h>
-# include <stsdef.h>
-const char *default_shell = "";
-int batch_mode_shell = 0;
-
-#define strsignal vms_strsignal
-char * vms_strsignal (int status);
-
-#ifndef C_FACILITY_NO
-# define C_FACILITY_NO 0x350000
-#endif
-#ifndef VMS_POSIX_EXIT_MASK
-# define VMS_POSIX_EXIT_MASK (C_FACILITY_NO | 0xA000)
-#endif
-
-#else
-
-const char *default_shell = "/bin/sh";
-int batch_mode_shell = 0;
-
-#endif
-
-#ifdef __MSDOS__
-# include <process.h>
-static int execute_by_shell;
-static int dos_pid = 123;
-int dos_status;
-int dos_command_running;
-#endif /* __MSDOS__ */
-
-#ifdef _AMIGA
-# include <proto/dos.h>
-static int amiga_pid = 123;
-static int amiga_status;
-static char amiga_bname[32];
-static int amiga_batch_file;
-#endif /* Amiga.  */
-
-#ifdef VMS
-# ifndef __GNUC__
-#   include <processes.h>
-# endif
-# include <starlet.h>
-# include <lib$routines.h>
-static void vmsWaitForChildren (int *);
-#endif
-
-#ifdef WINDOWS32
-# include <windows.h>
-# include <io.h>
-# include <process.h>
-# include "sub_proc.h"
-# include "w32err.h"
-# include "pathstuff.h"
-# define WAIT_NOHANG 1
-#endif /* WINDOWS32 */
-
-#ifdef __EMX__
-# include <process.h>
-#endif
-
-#if defined (HAVE_SYS_WAIT_H) || defined (HAVE_UNION_WAIT)
-# include <sys/wait.h>
-#endif
-
-#ifdef HAVE_WAITPID
-# define WAIT_NOHANG(status)    waitpid (-1, (status), WNOHANG)
-#else   /* Don't have waitpid.  */
-# ifdef HAVE_WAIT3
-#  ifndef wait3
-extern int wait3 ();
-#  endif
-#  define WAIT_NOHANG(status)   wait3 ((status), WNOHANG, (struct rusage *) 0)
-# endif /* Have wait3.  */
-#endif /* Have waitpid.  */
-
-#if !defined (wait) && !defined (POSIX)
-int wait ();
-#endif
-
-#ifndef HAVE_UNION_WAIT
-
-# define WAIT_T int
-
-# ifndef WTERMSIG
-#  define WTERMSIG(x) ((x) & 0x7f)
-# endif
-# ifndef WCOREDUMP
-#  define WCOREDUMP(x) ((x) & 0x80)
-# endif
-# ifndef WEXITSTATUS
-#  define WEXITSTATUS(x) (((x) >> 8) & 0xff)
-# endif
-# ifndef WIFSIGNALED
-#  define WIFSIGNALED(x) (WTERMSIG (x) != 0)
-# endif
-# ifndef WIFEXITED
-#  define WIFEXITED(x) (WTERMSIG (x) == 0)
-# endif
-
-#else   /* Have 'union wait'.  */
-
-# define WAIT_T union wait
-# ifndef WTERMSIG
-#  define WTERMSIG(x) ((x).w_termsig)
-# endif
-# ifndef WCOREDUMP
-#  define WCOREDUMP(x) ((x).w_coredump)
-# endif
-# ifndef WEXITSTATUS
-#  define WEXITSTATUS(x) ((x).w_retcode)
-# endif
-# ifndef WIFSIGNALED
-#  define WIFSIGNALED(x) (WTERMSIG(x) != 0)
-# endif
-# ifndef WIFEXITED
-#  define WIFEXITED(x) (WTERMSIG(x) == 0)
-# endif
-
-#endif  /* Don't have 'union wait'.  */
-
-#if !defined(HAVE_UNISTD_H) && !defined(WINDOWS32)
-int dup2 ();
-int execve ();
-void _exit ();
-# ifndef VMS
-int geteuid ();
-int getegid ();
-int setgid ();
-int getgid ();
-# endif
-#endif
-
-/* Different systems have different requirements for pid_t.
-   Plus we have to support gettext string translation... Argh.  */
-static const char *
-pid2str (pid_t pid)
-{
-  static char pidstring[100];
-#if defined(WINDOWS32) && (__GNUC__ > 3 || _MSC_VER > 1300)
-  /* %Id is only needed for 64-builds, which were not supported by
-      older versions of Windows compilers.  */
-  sprintf (pidstring, "%Id", pid);
-#else
-  sprintf (pidstring, "%lu", (unsigned long) pid);
-#endif
-  return pidstring;
-}
-
-#ifndef HAVE_GETLOADAVG
-int getloadavg (double loadavg[], int nelem);
-#endif
-
-static void free_child (struct child *);
-static void start_job_command (struct child *child);
-static int load_too_high (void);
-static int job_next_command (struct child *);
-static int start_waiting_job (struct child *);
-\f
-/* Chain of all live (or recently deceased) children.  */
-
-struct child *children = 0;
-
-/* Number of children currently running.  */
-
-unsigned int job_slots_used = 0;
-
-/* Nonzero if the 'good' standard input is in use.  */
-
-static int good_stdin_used = 0;
-
-/* Chain of children waiting to run until the load average goes down.  */
-
-static struct child *waiting_jobs = 0;
-
-/* Non-zero if we use a *real* shell (always so on Unix).  */
-
-int unixy_shell = 1;
-
-/* Number of jobs started in the current second.  */
-
-unsigned long job_counter = 0;
-
-/* Number of jobserver tokens this instance is currently using.  */
-
-unsigned int jobserver_tokens = 0;
-\f
-
-#ifdef WINDOWS32
-/*
- * The macro which references this function is defined in makeint.h.
- */
-int
-w32_kill (pid_t pid, int sig)
-{
-  return ((process_kill ((HANDLE)pid, sig) == TRUE) ? 0 : -1);
-}
-
-/* This function creates a temporary file name with an extension specified
- * by the unixy arg.
- * Return an xmalloc'ed string of a newly created temp file and its
- * file descriptor, or die.  */
-static char *
-create_batch_file (char const *base, int unixy, int *fd)
-{
-  const char *const ext = unixy ? "sh" : "bat";
-  const char *error_string = NULL;
-  char temp_path[MAXPATHLEN]; /* need to know its length */
-  unsigned path_size = GetTempPath (sizeof temp_path, temp_path);
-  int path_is_dot = 0;
-  /* The following variable is static so we won't try to reuse a name
-     that was generated a little while ago, because that file might
-     not be on disk yet, since we use FILE_ATTRIBUTE_TEMPORARY below,
-     which tells the OS it doesn't need to flush the cache to disk.
-     If the file is not yet on disk, we might think the name is
-     available, while it really isn't.  This happens in parallel
-     builds, where Make doesn't wait for one job to finish before it
-     launches the next one.  */
-  static unsigned uniq = 0;
-  static int second_loop = 0;
-  const unsigned sizemax = strlen (base) + strlen (ext) + 10;
-
-  if (path_size == 0)
-    {
-      path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
-      path_is_dot = 1;
-    }
-
-  ++uniq;
-  if (uniq >= 0x10000 && !second_loop)
-    {
-      /* If we already had 64K batch files in this
-         process, make a second loop through the numbers,
-         looking for free slots, i.e. files that were
-         deleted in the meantime.  */
-      second_loop = 1;
-      uniq = 1;
-    }
-  while (path_size > 0 &&
-         path_size + sizemax < sizeof temp_path &&
-         !(uniq >= 0x10000 && second_loop))
-    {
-      unsigned size = sprintf (temp_path + path_size,
-                               "%s%s-%x.%s",
-                               temp_path[path_size - 1] == '\\' ? "" : "\\",
-                               base, uniq, ext);
-      HANDLE h = CreateFile (temp_path,  /* file name */
-                             GENERIC_READ | GENERIC_WRITE, /* desired access */
-                             0,                            /* no share mode */
-                             NULL,                         /* default security attributes */
-                             CREATE_NEW,                   /* creation disposition */
-                             FILE_ATTRIBUTE_NORMAL |       /* flags and attributes */
-                             FILE_ATTRIBUTE_TEMPORARY,     /* we'll delete it */
-                             NULL);                        /* no template file */
-
-      if (h == INVALID_HANDLE_VALUE)
-        {
-          const DWORD er = GetLastError ();
-
-          if (er == ERROR_FILE_EXISTS || er == ERROR_ALREADY_EXISTS)
-            {
-              ++uniq;
-              if (uniq == 0x10000 && !second_loop)
-                {
-                  second_loop = 1;
-                  uniq = 1;
-                }
-            }
-
-          /* the temporary path is not guaranteed to exist */
-          else if (path_is_dot == 0)
-            {
-              path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
-              path_is_dot = 1;
-            }
-
-          else
-            {
-              error_string = map_windows32_error_to_string (er);
-              break;
-            }
-        }
-      else
-        {
-          const unsigned final_size = path_size + size + 1;
-          char *const path = xmalloc (final_size);
-          memcpy (path, temp_path, final_size);
-          *fd = _open_osfhandle ((intptr_t)h, 0);
-          if (unixy)
-            {
-              char *p;
-              int ch;
-              for (p = path; (ch = *p) != 0; ++p)
-                if (ch == '\\')
-                  *p = '/';
-            }
-          return path; /* good return */
-        }
-    }
-
-  *fd = -1;
-  if (error_string == NULL)
-    error_string = _("Cannot create a temporary file\n");
-  O (fatal, NILF, error_string);
-
-  /* not reached */
-  return NULL;
-}
-#endif /* WINDOWS32 */
-
-#ifdef __EMX__
-/* returns whether path is assumed to be a unix like shell. */
-int
-_is_unixy_shell (const char *path)
-{
-  /* list of non unix shells */
-  const char *known_os2shells[] = {
-    "cmd.exe",
-    "cmd",
-    "4os2.exe",
-    "4os2",
-    "4dos.exe",
-    "4dos",
-    "command.com",
-    "command",
-    NULL
-  };
-
-  /* find the rightmost '/' or '\\' */
-  const char *name = strrchr (path, '/');
-  const char *p = strrchr (path, '\\');
-  unsigned i;
-
-  if (name && p)    /* take the max */
-    name = (name > p) ? name : p;
-  else if (p)       /* name must be 0 */
-    name = p;
-  else if (!name)   /* name and p must be 0 */
-    name = path;
-
-  if (*name == '/' || *name == '\\') name++;
-
-  i = 0;
-  while (known_os2shells[i] != NULL)
-    {
-      if (strcasecmp (name, known_os2shells[i]) == 0)
-        return 0; /* not a unix shell */
-      i++;
-    }
-
-  /* in doubt assume a unix like shell */
-  return 1;
-}
-#endif /* __EMX__ */
-
-/* determines whether path looks to be a Bourne-like shell. */
-int
-is_bourne_compatible_shell (const char *path)
-{
-  /* List of known POSIX (or POSIX-ish) shells.  */
-  static const char *unix_shells[] = {
-    "sh",
-    "bash",
-    "ksh",
-    "rksh",
-    "zsh",
-    "ash",
-    "dash",
-    NULL
-  };
-  const char **s;
-
-  /* find the rightmost '/' or '\\' */
-  const char *name = strrchr (path, '/');
-  char *p = strrchr (path, '\\');
-
-  if (name && p)    /* take the max */
-    name = (name > p) ? name : p;
-  else if (p)       /* name must be 0 */
-    name = p;
-  else if (!name)   /* name and p must be 0 */
-    name = path;
-
-  if (*name == '/' || *name == '\\')
-    ++name;
-
-  /* this should be able to deal with extensions on Windows-like systems */
-  for (s = unix_shells; *s != NULL; ++s)
-    {
-#if defined(WINDOWS32) || defined(__MSDOS__)
-      unsigned int len = strlen (*s);
-      if ((strlen (name) >= len && STOP_SET (name[len], MAP_DOT|MAP_NUL))
-          && strncasecmp (name, *s, len) == 0)
-#else
-      if (strcmp (name, *s) == 0)
-#endif
-        return 1; /* a known unix-style shell */
-    }
-
-  /* if not on the list, assume it's not a Bourne-like shell */
-  return 0;
-}
-
-\f
-/* Write an error message describing the exit status given in
-   EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME.
-   Append "(ignored)" if IGNORED is nonzero.  */
-
-static void
-child_error (struct child *child,
-             int exit_code, int exit_sig, int coredump, int ignored)
-{
-  const char *pre = "*** ";
-  const char *post = "";
-  const char *dump = "";
-  const struct file *f = child->file;
-  const floc *flocp = &f->cmds->fileinfo;
-  const char *nm;
-  size_t l;
-
-  if (ignored && silent_flag)
-    return;
-
-  if (exit_sig && coredump)
-    dump = _(" (core dumped)");
-
-  if (ignored)
-    {
-      pre = "";
-      post = _(" (ignored)");
-    }
-
-  if (! flocp->filenm)
-    nm = _("<builtin>");
-  else
-    {
-      char *a = alloca (strlen (flocp->filenm) + 1 + 11 + 1);
-      sprintf (a, "%s:%lu", flocp->filenm, flocp->lineno + flocp->offset);
-      nm = a;
-    }
-
-  l = strlen (pre) + strlen (nm) + strlen (f->name) + strlen (post);
-
-  OUTPUT_SET (&child->output);
-
-  show_goal_error ();
-
-  if (exit_sig == 0)
-    error (NILF, l + INTSTR_LENGTH,
-           _("%s[%s: %s] Error %d%s"), pre, nm, f->name, exit_code, post);
-  else
-    {
-      const char *s = strsignal (exit_sig);
-      error (NILF, l + strlen (s) + strlen (dump),
-             "%s[%s: %s] %s%s%s", pre, nm, f->name, s, dump, post);
-    }
-
-  OUTPUT_UNSET ();
-}
-\f
-
-/* Handle a dead child.  This handler may or may not ever be installed.
-
-   If we're using the jobserver feature without pselect(), we need it.
-   First, installing it ensures the read will interrupt on SIGCHLD.  Second,
-   we close the dup'd read FD to ensure we don't enter another blocking read
-   without reaping all the dead children.  In this case we don't need the
-   dead_children count.
-
-   If we don't have either waitpid or wait3, then make is unreliable, but we
-   use the dead_children count to reap children as best we can.  */
-
-static unsigned int dead_children = 0;
-
-RETSIGTYPE
-child_handler (int sig UNUSED)
-{
-  ++dead_children;
-
-  jobserver_signal ();
-
-#ifdef __EMX__
-  /* The signal handler must called only once! */
-  signal (SIGCHLD, SIG_DFL);
-#endif
-}
-
-extern pid_t shell_function_pid;
-
-/* Reap all dead children, storing the returned status and the new command
-   state ('cs_finished') in the 'file' member of the 'struct child' for the
-   dead child, and removing the child from the chain.  In addition, if BLOCK
-   nonzero, we block in this function until we've reaped at least one
-   complete child, waiting for it to die if necessary.  If ERR is nonzero,
-   print an error message first.  */
-
-void
-reap_children (int block, int err)
-{
-#ifndef WINDOWS32
-  WAIT_T status;
-#endif
-  /* Initially, assume we have some.  */
-  int reap_more = 1;
-
-#ifdef WAIT_NOHANG
-# define REAP_MORE reap_more
-#else
-# define REAP_MORE dead_children
-#endif
-
-  /* As long as:
-
-       We have at least one child outstanding OR a shell function in progress,
-         AND
-       We're blocking for a complete child OR there are more children to reap
-
-     we'll keep reaping children.  */
-
-  while ((children != 0 || shell_function_pid != 0)
-         && (block || REAP_MORE))
-    {
-      unsigned int remote = 0;
-      pid_t pid;
-      int exit_code, exit_sig, coredump;
-      struct child *lastc, *c;
-      int child_failed;
-      int any_remote, any_local;
-      int dontcare;
-
-      if (err && block)
-        {
-          static int printed = 0;
-
-          /* We might block for a while, so let the user know why.
-             Only print this message once no matter how many jobs are left.  */
-          fflush (stdout);
-          if (!printed)
-            O (error, NILF, _("*** Waiting for unfinished jobs...."));
-          printed = 1;
-        }
-
-      /* We have one less dead child to reap.  As noted in
-         child_handler() above, this count is completely unimportant for
-         all modern, POSIX-y systems that support wait3() or waitpid().
-         The rest of this comment below applies only to early, broken
-         pre-POSIX systems.  We keep the count only because... it's there...
-
-         The test and decrement are not atomic; if it is compiled into:
-                register = dead_children - 1;
-                dead_children = register;
-         a SIGCHLD could come between the two instructions.
-         child_handler increments dead_children.
-         The second instruction here would lose that increment.  But the
-         only effect of dead_children being wrong is that we might wait
-         longer than necessary to reap a child, and lose some parallelism;
-         and we might print the "Waiting for unfinished jobs" message above
-         when not necessary.  */
-
-      if (dead_children > 0)
-        --dead_children;
-
-      any_remote = 0;
-      any_local = shell_function_pid != 0;
-      for (c = children; c != 0; c = c->next)
-        {
-          any_remote |= c->remote;
-          any_local |= ! c->remote;
-          DB (DB_JOBS, (_("Live child %p (%s) PID %s %s\n"),
-                        c, c->file->name, pid2str (c->pid),
-                        c->remote ? _(" (remote)") : ""));
-#ifdef VMS
-          break;
-#endif
-        }
-
-      /* First, check for remote children.  */
-      if (any_remote)
-        pid = remote_status (&exit_code, &exit_sig, &coredump, 0);
-      else
-        pid = 0;
-
-      if (pid > 0)
-        /* We got a remote child.  */
-        remote = 1;
-      else if (pid < 0)
-        {
-          /* A remote status command failed miserably.  Punt.  */
-        remote_status_lose:
-          pfatal_with_name ("remote_status");
-        }
-      else
-        {
-          /* No remote children.  Check for local children.  */
-#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32)
-          if (any_local)
-            {
-#ifdef VMS
-              /* Todo: This needs more untangling multi-process support */
-              /* Just do single child process support now */
-              vmsWaitForChildren (&status);
-              pid = c->pid;
-
-              /* VMS failure status can not be fully translated */
-              status = $VMS_STATUS_SUCCESS (c->cstatus) ? 0 : (1 << 8);
-
-              /* A Posix failure can be exactly translated */
-              if ((c->cstatus & VMS_POSIX_EXIT_MASK) == VMS_POSIX_EXIT_MASK)
-                status = (c->cstatus >> 3 & 255) << 8;
-#else
-#ifdef WAIT_NOHANG
-              if (!block)
-                pid = WAIT_NOHANG (&status);
-              else
-#endif
-                EINTRLOOP (pid, wait (&status));
-#endif /* !VMS */
-            }
-          else
-            pid = 0;
-
-          if (pid < 0)
-            {
-              /* The wait*() failed miserably.  Punt.  */
-              pfatal_with_name ("wait");
-            }
-          else if (pid > 0)
-            {
-              /* We got a child exit; chop the status word up.  */
-              exit_code = WEXITSTATUS (status);
-              exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0;
-              coredump = WCOREDUMP (status);
-
-              /* If we have started jobs in this second, remove one.  */
-              if (job_counter)
-                --job_counter;
-            }
-          else
-            {
-              /* No local children are dead.  */
-              reap_more = 0;
-
-              if (!block || !any_remote)
-                break;
-
-              /* Now try a blocking wait for a remote child.  */
-              pid = remote_status (&exit_code, &exit_sig, &coredump, 1);
-              if (pid < 0)
-                goto remote_status_lose;
-              else if (pid == 0)
-                /* No remote children either.  Finally give up.  */
-                break;
-
-              /* We got a remote child.  */
-              remote = 1;
-            }
-#endif /* !__MSDOS__, !Amiga, !WINDOWS32.  */
-
-#ifdef __MSDOS__
-          /* Life is very different on MSDOS.  */
-          pid = dos_pid - 1;
-          status = dos_status;
-          exit_code = WEXITSTATUS (status);
-          if (exit_code == 0xff)
-            exit_code = -1;
-          exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0;
-          coredump = 0;
-#endif /* __MSDOS__ */
-#ifdef _AMIGA
-          /* Same on Amiga */
-          pid = amiga_pid - 1;
-          status = amiga_status;
-          exit_code = amiga_status;
-          exit_sig = 0;
-          coredump = 0;
-#endif /* _AMIGA */
-#ifdef WINDOWS32
-          {
-            HANDLE hPID;
-            HANDLE hcTID, hcPID;
-            DWORD dwWaitStatus = 0;
-            exit_code = 0;
-            exit_sig = 0;
-            coredump = 0;
-
-            /* Record the thread ID of the main process, so that we
-               could suspend it in the signal handler.  */
-            if (!main_thread)
-              {
-                hcTID = GetCurrentThread ();
-                hcPID = GetCurrentProcess ();
-                if (!DuplicateHandle (hcPID, hcTID, hcPID, &main_thread, 0,
-                                      FALSE, DUPLICATE_SAME_ACCESS))
-                  {
-                    DWORD e = GetLastError ();
-                    fprintf (stderr,
-                             "Determine main thread ID (Error %ld: %s)\n",
-                             e, map_windows32_error_to_string (e));
-                  }
-                else
-                  DB (DB_VERBOSE, ("Main thread handle = %p\n", main_thread));
-              }
-
-            /* wait for anything to finish */
-            hPID = process_wait_for_any (block, &dwWaitStatus);
-            if (hPID)
-              {
-                /* was an error found on this process? */
-                int werr = process_last_err (hPID);
-
-                /* get exit data */
-                exit_code = process_exit_code (hPID);
-
-                if (werr)
-                  fprintf (stderr, "make (e=%d): %s", exit_code,
-                           map_windows32_error_to_string (exit_code));
-
-                /* signal */
-                exit_sig = process_signal (hPID);
-
-                /* cleanup process */
-                process_cleanup (hPID);
-
-                coredump = 0;
-              }
-            else if (dwWaitStatus == WAIT_FAILED)
-              {
-                /* The WaitForMultipleObjects() failed miserably.  Punt.  */
-                pfatal_with_name ("WaitForMultipleObjects");
-              }
-            else if (dwWaitStatus == WAIT_TIMEOUT)
-              {
-                /* No child processes are finished.  Give up waiting. */
-                reap_more = 0;
-                break;
-              }
-
-            pid = (pid_t) hPID;
-          }
-#endif /* WINDOWS32 */
-        }
-
-      /* Check if this is the child of the 'shell' function.  */
-      if (!remote && pid == shell_function_pid)
-        {
-          shell_completed (exit_code, exit_sig);
-          break;
-        }
-
-      /* Search for a child matching the deceased one.  */
-      lastc = 0;
-      for (c = children; c != 0; lastc = c, c = c->next)
-        if (c->pid == pid && c->remote == remote)
-          break;
-
-      if (c == 0)
-        /* An unknown child died.
-           Ignore it; it was inherited from our invoker.  */
-        continue;
-
-      /* Determine the failure status: 0 for success, 1 for updating target in
-         question mode, 2 for anything else.  */
-      if (exit_sig == 0 && exit_code == 0)
-        child_failed = MAKE_SUCCESS;
-      else if (exit_sig == 0 && exit_code == 1 && question_flag && c->recursive)
-        child_failed = MAKE_TROUBLE;
-      else
-        child_failed = MAKE_FAILURE;
-
-      DB (DB_JOBS, (child_failed
-                    ? _("Reaping losing child %p PID %s %s\n")
-                    : _("Reaping winning child %p PID %s %s\n"),
-                    c, pid2str (c->pid), c->remote ? _(" (remote)") : ""));
-
-      if (c->sh_batch_file)
-        {
-          int rm_status;
-
-          DB (DB_JOBS, (_("Cleaning up temp batch file %s\n"),
-                        c->sh_batch_file));
-
-          errno = 0;
-          rm_status = remove (c->sh_batch_file);
-          if (rm_status)
-            DB (DB_JOBS, (_("Cleaning up temp batch file %s failed (%d)\n"),
-                          c->sh_batch_file, errno));
-
-          /* all done with memory */
-          free (c->sh_batch_file);
-          c->sh_batch_file = NULL;
-        }
-
-      /* If this child had the good stdin, say it is now free.  */
-      if (c->good_stdin)
-        good_stdin_used = 0;
-
-      dontcare = c->dontcare;
-
-      if (child_failed && !c->noerror && !ignore_errors_flag)
-        {
-          /* The commands failed.  Write an error message,
-             delete non-precious targets, and abort.  */
-          static int delete_on_error = -1;
-
-          if (!dontcare && child_failed == MAKE_FAILURE)
-            child_error (c, exit_code, exit_sig, coredump, 0);
-
-          c->file->update_status = child_failed == MAKE_FAILURE ? us_failed : us_question;
-          if (delete_on_error == -1)
-            {
-              struct file *f = lookup_file (".DELETE_ON_ERROR");
-              delete_on_error = f != 0 && f->is_target;
-            }
-          if (exit_sig != 0 || delete_on_error)
-            delete_child_targets (c);
-        }
-      else
-        {
-          if (child_failed)
-            {
-              /* The commands failed, but we don't care.  */
-              child_error (c, exit_code, exit_sig, coredump, 1);
-              child_failed = 0;
-            }
-
-          /* If there are more commands to run, try to start them.  */
-          if (job_next_command (c))
-            {
-              if (handling_fatal_signal)
-                {
-                  /* Never start new commands while we are dying.
-                     Since there are more commands that wanted to be run,
-                     the target was not completely remade.  So we treat
-                     this as if a command had failed.  */
-                  c->file->update_status = us_failed;
-                }
-              else
-                {
-#ifndef NO_OUTPUT_SYNC
-                  /* If we're sync'ing per line, write the previous line's
-                     output before starting the next one.  */
-                  if (output_sync == OUTPUT_SYNC_LINE)
-                    output_dump (&c->output);
-#endif
-                  /* Check again whether to start remotely.
-                     Whether or not we want to changes over time.
-                     Also, start_remote_job may need state set up
-                     by start_remote_job_p.  */
-                  c->remote = start_remote_job_p (0);
-                  start_job_command (c);
-                  /* Fatal signals are left blocked in case we were
-                     about to put that child on the chain.  But it is
-                     already there, so it is safe for a fatal signal to
-                     arrive now; it will clean up this child's targets.  */
-                  unblock_sigs ();
-                  if (c->file->command_state == cs_running)
-                    /* We successfully started the new command.
-                       Loop to reap more children.  */
-                    continue;
-                }
-
-              if (c->file->update_status != us_success)
-                /* We failed to start the commands.  */
-                delete_child_targets (c);
-            }
-          else
-            /* There are no more commands.  We got through them all
-               without an unignored error.  Now the target has been
-               successfully updated.  */
-            c->file->update_status = us_success;
-        }
-
-      /* When we get here, all the commands for c->file are finished.  */
-
-#ifndef NO_OUTPUT_SYNC
-      /* Synchronize any remaining parallel output.  */
-      output_dump (&c->output);
-#endif
-
-      /* At this point c->file->update_status is success or failed.  But
-         c->file->command_state is still cs_running if all the commands
-         ran; notice_finish_file looks for cs_running to tell it that
-         it's interesting to check the file's modtime again now.  */
-
-      if (! handling_fatal_signal)
-        /* Notice if the target of the commands has been changed.
-           This also propagates its values for command_state and
-           update_status to its also_make files.  */
-        notice_finished_file (c->file);
-
-      DB (DB_JOBS, (_("Removing child %p PID %s%s from chain.\n"),
-                    c, pid2str (c->pid), c->remote ? _(" (remote)") : ""));
-
-      /* Block fatal signals while frobnicating the list, so that
-         children and job_slots_used are always consistent.  Otherwise
-         a fatal signal arriving after the child is off the chain and
-         before job_slots_used is decremented would believe a child was
-         live and call reap_children again.  */
-      block_sigs ();
-
-      /* There is now another slot open.  */
-      if (job_slots_used > 0)
-        --job_slots_used;
-
-      /* Remove the child from the chain and free it.  */
-      if (lastc == 0)
-        children = c->next;
-      else
-        lastc->next = c->next;
-
-      free_child (c);
-
-      unblock_sigs ();
-
-      /* If the job failed, and the -k flag was not given, die,
-         unless we are already in the process of dying.  */
-      if (!err && child_failed && !dontcare && !keep_going_flag &&
-          /* fatal_error_signal will die with the right signal.  */
-          !handling_fatal_signal)
-        die (child_failed);
-
-      /* Only block for one child.  */
-      block = 0;
-    }
-
-  return;
-}
-\f
-/* Free the storage allocated for CHILD.  */
-
-static void
-free_child (struct child *child)
-{
-  output_close (&child->output);
-
-  if (!jobserver_tokens)
-    ONS (fatal, NILF, "INTERNAL: Freeing child %p (%s) but no tokens left!\n",
-         child, child->file->name);
-
-  /* If we're using the jobserver and this child is not the only outstanding
-     job, put a token back into the pipe for it.  */
-
-  if (jobserver_enabled () && jobserver_tokens > 1)
-    {
-      jobserver_release (1);
-      DB (DB_JOBS, (_("Released token for child %p (%s).\n"),
-                    child, child->file->name));
-    }
-
-  --jobserver_tokens;
-
-  if (handling_fatal_signal) /* Don't bother free'ing if about to die.  */
-    return;
-
-  if (child->command_lines != 0)
-    {
-      register unsigned int i;
-      for (i = 0; i < child->file->cmds->ncommand_lines; ++i)
-        free (child->command_lines[i]);
-      free (child->command_lines);
-    }
-
-  if (child->environment != 0)
-    {
-      register char **ep = child->environment;
-      while (*ep != 0)
-        free (*ep++);
-      free (child->environment);
-    }
-
-  free (child);
-}
-\f
-#ifdef POSIX
-extern sigset_t fatal_signal_set;
-#endif
-
-void
-block_sigs (void)
-{
-#ifdef POSIX
-  (void) sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0);
-#else
-# ifdef HAVE_SIGSETMASK
-  (void) sigblock (fatal_signal_mask);
-# endif
-#endif
-}
-
-#ifdef POSIX
-void
-unblock_sigs (void)
-{
-  sigset_t empty;
-  sigemptyset (&empty);
-  sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0);
-}
-#endif
-
-
-/* Start a job to run the commands specified in CHILD.
-   CHILD is updated to reflect the commands and ID of the child process.
-
-   NOTE: On return fatal signals are blocked!  The caller is responsible
-   for calling 'unblock_sigs', once the new child is safely on the chain so
-   it can be cleaned up in the event of a fatal signal.  */
-
-static void
-start_job_command (struct child *child)
-{
-  int flags;
-  char *p;
-#ifdef VMS
-  char *argv;
-#else
-  char **argv;
-#endif
-
-  /* If we have a completely empty commandset, stop now.  */
-  if (!child->command_ptr)
-    goto next_command;
-
-  /* Combine the flags parsed for the line itself with
-     the flags specified globally for this target.  */
-  flags = (child->file->command_flags
-           | child->file->cmds->lines_flags[child->command_line - 1]);
-
-  p = child->command_ptr;
-  child->noerror = ((flags & COMMANDS_NOERROR) != 0);
-
-  while (*p != '\0')
-    {
-      if (*p == '@')
-        flags |= COMMANDS_SILENT;
-      else if (*p == '+')
-        flags |= COMMANDS_RECURSE;
-      else if (*p == '-')
-        child->noerror = 1;
-      /* Don't skip newlines.  */
-      else if (!ISBLANK (*p))
-        break;
-      ++p;
-    }
-
-  child->recursive = ((flags & COMMANDS_RECURSE) != 0);
-
-  /* Update the file's command flags with any new ones we found.  We only
-     keep the COMMANDS_RECURSE setting.  Even this isn't 100% correct; we are
-     now marking more commands recursive than should be in the case of
-     multiline define/endef scripts where only one line is marked "+".  In
-     order to really fix this, we'll have to keep a lines_flags for every
-     actual line, after expansion.  */
-  child->file->cmds->lines_flags[child->command_line - 1] |= flags & COMMANDS_RECURSE;
-
-  /* POSIX requires that a recipe prefix after a backslash-newline should
-     be ignored.  Remove it now so the output is correct.  */
-  {
-    char prefix = child->file->cmds->recipe_prefix;
-    char *p1, *p2;
-    p1 = p2 = p;
-    while (*p1 != '\0')
-      {
-        *(p2++) = *p1;
-        if (p1[0] == '\n' && p1[1] == prefix)
-          ++p1;
-        ++p1;
-      }
-    *p2 = *p1;
-  }
-
-  /* Figure out an argument list from this command line.  */
-  {
-    char *end = 0;
-#ifdef VMS
-    /* Skip any leading whitespace */
-    while (*p)
-      {
-        if (!ISSPACE (*p))
-          {
-            if (*p != '\\')
-              break;
-            if ((p[1] != '\n') && (p[1] != 'n') && (p[1] != 't'))
-              break;
-          }
-        p++;
-      }
-
-    argv = p;
-    /* Although construct_command_argv contains some code for VMS, it was/is
-       not called/used.  Please note, for VMS argv is a string (not an array
-       of strings) which contains the complete command line, which for
-       multi-line variables still includes the newlines.  So detect newlines
-       and set 'end' (which is used for child->command_ptr) instead of
-       (re-)writing construct_command_argv */
-    if (!one_shell)
-      {
-        char *s = p;
-        int instring = 0;
-        while (*s)
-          {
-            if (*s == '"')
-              instring = !instring;
-            else if (*s == '\\' && !instring && *(s+1) != 0)
-              s++;
-            else if (*s == '\n' && !instring)
-              {
-                end = s;
-                break;
-              }
-            ++s;
-          }
-      }
-#else
-    argv = construct_command_argv (p, &end, child->file,
-                                   child->file->cmds->lines_flags[child->command_line - 1],
-                                   &child->sh_batch_file);
-#endif
-    if (end == NULL)
-      child->command_ptr = NULL;
-    else
-      {
-        *end++ = '\0';
-        child->command_ptr = end;
-      }
-  }
-
-  /* If -q was given, say that updating 'failed' if there was any text on the
-     command line, or 'succeeded' otherwise.  The exit status of 1 tells the
-     user that -q is saying 'something to do'; the exit status for a random
-     error is 2.  */
-  if (argv != 0 && question_flag && !(flags & COMMANDS_RECURSE))
-    {
-#ifndef VMS
-      free (argv[0]);
-      free (argv);
-#endif
-#ifdef VMS
-      /* On VMS, argv[0] can be a null string here */
-      if (argv[0] != 0)
-        {
-#endif
-          child->file->update_status = us_question;
-          notice_finished_file (child->file);
-          return;
-#ifdef VMS
-        }
-#endif
-    }
-
-  if (touch_flag && !(flags & COMMANDS_RECURSE))
-    {
-      /* Go on to the next command.  It might be the recursive one.
-         We construct ARGV only to find the end of the command line.  */
-#ifndef VMS
-      if (argv)
-        {
-          free (argv[0]);
-          free (argv);
-        }
-#endif
-      argv = 0;
-    }
-
-  if (argv == 0)
-    {
-    next_command:
-#ifdef __MSDOS__
-      execute_by_shell = 0;   /* in case construct_command_argv sets it */
-#endif
-      /* This line has no commands.  Go to the next.  */
-      if (job_next_command (child))
-        start_job_command (child);
-      else
-        {
-          /* No more commands.  Make sure we're "running"; we might not be if
-             (e.g.) all commands were skipped due to -n.  */
-          set_command_state (child->file, cs_running);
-          child->file->update_status = us_success;
-          notice_finished_file (child->file);
-        }
-
-      OUTPUT_UNSET();
-      return;
-    }
-
-  /* Are we going to synchronize this command's output?  Do so if either we're
-     in SYNC_RECURSE mode or this command is not recursive.  We'll also check
-     output_sync separately below in case it changes due to error.  */
-  child->output.syncout = output_sync && (output_sync == OUTPUT_SYNC_RECURSE
-                                          || !(flags & COMMANDS_RECURSE));
-
-  OUTPUT_SET (&child->output);
-
-#ifndef NO_OUTPUT_SYNC
-  if (! child->output.syncout)
-    /* We don't want to sync this command: to avoid misordered
-       output ensure any already-synced content is written.  */
-    output_dump (&child->output);
-#endif
-
-  /* Print the command if appropriate.  */
-  if (just_print_flag || trace_flag
-      || (!(flags & COMMANDS_SILENT) && !silent_flag))
-    OS (message, 0, "%s", p);
-
-  /* Tell update_goal_chain that a command has been started on behalf of
-     this target.  It is important that this happens here and not in
-     reap_children (where we used to do it), because reap_children might be
-     reaping children from a different target.  We want this increment to
-     guaranteedly indicate that a command was started for the dependency
-     chain (i.e., update_file recursion chain) we are processing.  */
-
-  ++commands_started;
-
-  /* Optimize an empty command.  People use this for timestamp rules,
-     so avoid forking a useless shell.  Do this after we increment
-     commands_started so make still treats this special case as if it
-     performed some action (makes a difference as to what messages are
-     printed, etc.  */
-
-#if !defined(VMS) && !defined(_AMIGA)
-  if (
-#if defined __MSDOS__ || defined (__EMX__)
-      unixy_shell       /* the test is complicated and we already did it */
-#else
-      (argv[0] && is_bourne_compatible_shell (argv[0]))
-#endif
-      && (argv[1] && argv[1][0] == '-'
-        &&
-            ((argv[1][1] == 'c' && argv[1][2] == '\0')
-          ||
-             (argv[1][1] == 'e' && argv[1][2] == 'c' && argv[1][3] == '\0')))
-      && (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0')
-      && argv[3] == NULL)
-    {
-      free (argv[0]);
-      free (argv);
-      goto next_command;
-    }
-#endif  /* !VMS && !_AMIGA */
-
-  /* If -n was given, recurse to get the next line in the sequence.  */
-
-  if (just_print_flag && !(flags & COMMANDS_RECURSE))
-    {
-#ifndef VMS
-      free (argv[0]);
-      free (argv);
-#endif
-      goto next_command;
-    }
-
-  /* We're sure we're going to invoke a command: set up the output.  */
-  output_start ();
-
-  /* Flush the output streams so they won't have things written twice.  */
-
-  fflush (stdout);
-  fflush (stderr);
-
-  /* Decide whether to give this child the 'good' standard input
-     (one that points to the terminal or whatever), or the 'bad' one
-     that points to the read side of a broken pipe.  */
-
-  child->good_stdin = !good_stdin_used;
-  if (child->good_stdin)
-    good_stdin_used = 1;
-
-  child->deleted = 0;
-
-#ifndef _AMIGA
-  /* Set up the environment for the child.  */
-  if (child->environment == 0)
-    child->environment = target_environment (child->file);
-#endif
-
-#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32)
-
-#ifndef VMS
-  /* start_waiting_job has set CHILD->remote if we can start a remote job.  */
-  if (child->remote)
-    {
-      int is_remote, id, used_stdin;
-      if (start_remote_job (argv, child->environment,
-                            child->good_stdin ? 0 : get_bad_stdin (),
-                            &is_remote, &id, &used_stdin))
-        /* Don't give up; remote execution may fail for various reasons.  If
-           so, simply run the job locally.  */
-        goto run_local;
-      else
-        {
-          if (child->good_stdin && !used_stdin)
-            {
-              child->good_stdin = 0;
-              good_stdin_used = 0;
-            }
-          child->remote = is_remote;
-          child->pid = id;
-        }
-    }
-  else
-#endif /* !VMS */
-    {
-      /* Fork the child process.  */
-
-      char **parent_environ;
-
-    run_local:
-      block_sigs ();
-
-      child->remote = 0;
-
-#ifdef VMS
-      if (!child_execute_job (child, argv))
-        {
-          /* Fork failed!  */
-          perror_with_name ("fork", "");
-          goto error;
-        }
-
-#else
-
-      parent_environ = environ;
-
-      jobserver_pre_child (flags & COMMANDS_RECURSE);
-
-      child->pid = child_execute_job (&child->output, child->good_stdin, argv, child->environment);
-
-      environ = parent_environ; /* Restore value child may have clobbered.  */
-      jobserver_post_child (flags & COMMANDS_RECURSE);
-
-      if (child->pid < 0)
-        {
-          /* Fork failed!  */
-          unblock_sigs ();
-          perror_with_name ("fork", "");
-          goto error;
-        }
-#endif /* !VMS */
-    }
-
-#else   /* __MSDOS__ or Amiga or WINDOWS32 */
-#ifdef __MSDOS__
-  {
-    int proc_return;
-
-    block_sigs ();
-    dos_status = 0;
-
-    /* We call 'system' to do the job of the SHELL, since stock DOS
-       shell is too dumb.  Our 'system' knows how to handle long
-       command lines even if pipes/redirection is needed; it will only
-       call COMMAND.COM when its internal commands are used.  */
-    if (execute_by_shell)
-      {
-        char *cmdline = argv[0];
-        /* We don't have a way to pass environment to 'system',
-           so we need to save and restore ours, sigh...  */
-        char **parent_environ = environ;
-
-        environ = child->environment;
-
-        /* If we have a *real* shell, tell 'system' to call
-           it to do everything for us.  */
-        if (unixy_shell)
-          {
-            /* A *real* shell on MSDOS may not support long
-               command lines the DJGPP way, so we must use 'system'.  */
-            cmdline = argv[2];  /* get past "shell -c" */
-          }
-
-        dos_command_running = 1;
-        proc_return = system (cmdline);
-        environ = parent_environ;
-        execute_by_shell = 0;   /* for the next time */
-      }
-    else
-      {
-        dos_command_running = 1;
-        proc_return = spawnvpe (P_WAIT, argv[0], argv, child->environment);
-      }
-
-    /* Need to unblock signals before turning off
-       dos_command_running, so that child's signals
-       will be treated as such (see fatal_error_signal).  */
-    unblock_sigs ();
-    dos_command_running = 0;
-
-    /* If the child got a signal, dos_status has its
-       high 8 bits set, so be careful not to alter them.  */
-    if (proc_return == -1)
-      dos_status |= 0xff;
-    else
-      dos_status |= (proc_return & 0xff);
-    ++dead_children;
-    child->pid = dos_pid++;
-  }
-#endif /* __MSDOS__ */
-#ifdef _AMIGA
-  amiga_status = MyExecute (argv);
-
-  ++dead_children;
-  child->pid = amiga_pid++;
-  if (amiga_batch_file)
-  {
-     amiga_batch_file = 0;
-     DeleteFile (amiga_bname);        /* Ignore errors.  */
-  }
-#endif  /* Amiga */
-#ifdef WINDOWS32
-  {
-      HANDLE hPID;
-      char* arg0;
-      int outfd = FD_STDOUT;
-      int errfd = FD_STDERR;
-
-      /* make UNC paths safe for CreateProcess -- backslash format */
-      arg0 = argv[0];
-      if (arg0 && arg0[0] == '/' && arg0[1] == '/')
-        for ( ; arg0 && *arg0; arg0++)
-          if (*arg0 == '/')
-            *arg0 = '\\';
-
-      /* make sure CreateProcess() has Path it needs */
-      sync_Path_environment ();
-
-#ifndef NO_OUTPUT_SYNC
-      /* Divert child output if output_sync in use.  */
-      if (child->output.syncout)
-        {
-          if (child->output.out >= 0)
-            outfd = child->output.out;
-          if (child->output.err >= 0)
-            errfd = child->output.err;
-        }
-#else
-      outfd = errfd = -1;
-#endif
-      hPID = process_easy (argv, child->environment, outfd, errfd);
-
-      if (hPID != INVALID_HANDLE_VALUE)
-        child->pid = (pid_t) hPID;
-      else
-        {
-          int i;
-          unblock_sigs ();
-          fprintf (stderr,
-                   _("process_easy() failed to launch process (e=%ld)\n"),
-                   process_last_err (hPID));
-          for (i = 0; argv[i]; i++)
-            fprintf (stderr, "%s ", argv[i]);
-          fprintf (stderr, _("\nCounted %d args in failed launch\n"), i);
-          goto error;
-        }
-  }
-#endif /* WINDOWS32 */
-#endif  /* __MSDOS__ or Amiga or WINDOWS32 */
-
-  /* Bump the number of jobs started in this second.  */
-  ++job_counter;
-
-  /* We are the parent side.  Set the state to
-     say the commands are running and return.  */
-
-  set_command_state (child->file, cs_running);
-
-  /* Free the storage used by the child's argument list.  */
-#ifndef VMS
-  free (argv[0]);
-  free (argv);
-#endif
-
-  OUTPUT_UNSET();
-  return;
-
- error:
-  child->file->update_status = us_failed;
-  notice_finished_file (child->file);
-  OUTPUT_UNSET();
-}
-
-/* Try to start a child running.
-   Returns nonzero if the child was started (and maybe finished), or zero if
-   the load was too high and the child was put on the 'waiting_jobs' chain.  */
-
-static int
-start_waiting_job (struct child *c)
-{
-  struct file *f = c->file;
-
-  /* If we can start a job remotely, we always want to, and don't care about
-     the local load average.  We record that the job should be started
-     remotely in C->remote for start_job_command to test.  */
-
-  c->remote = start_remote_job_p (1);
-
-  /* If we are running at least one job already and the load average
-     is too high, make this one wait.  */
-  if (!c->remote
-      && ((job_slots_used > 0 && load_too_high ())
-#ifdef WINDOWS32
-          || (process_used_slots () >= MAXIMUM_WAIT_OBJECTS)
-#endif
-          ))
-    {
-      /* Put this child on the chain of children waiting for the load average
-         to go down.  */
-      set_command_state (f, cs_running);
-      c->next = waiting_jobs;
-      waiting_jobs = c;
-      return 0;
-    }
-
-  /* Start the first command; reap_children will run later command lines.  */
-  start_job_command (c);
-
-  switch (f->command_state)
-    {
-    case cs_running:
-      c->next = children;
-      DB (DB_JOBS, (_("Putting child %p (%s) PID %s%s on the chain.\n"),
-                    c, c->file->name, pid2str (c->pid),
-                    c->remote ? _(" (remote)") : ""));
-      children = c;
-      /* One more job slot is in use.  */
-      ++job_slots_used;
-      unblock_sigs ();
-      break;
-
-    case cs_not_started:
-      /* All the command lines turned out to be empty.  */
-      f->update_status = us_success;
-      /* FALLTHROUGH */
-
-    case cs_finished:
-      notice_finished_file (f);
-      free_child (c);
-      break;
-
-    default:
-      assert (f->command_state == cs_finished);
-      break;
-    }
-
-  return 1;
-}
-
-/* Create a 'struct child' for FILE and start its commands running.  */
-
-void
-new_job (struct file *file)
-{
-  struct commands *cmds = file->cmds;
-  struct child *c;
-  char **lines;
-  unsigned int i;
-
-  /* Let any previously decided-upon jobs that are waiting
-     for the load to go down start before this new one.  */
-  start_waiting_jobs ();
-
-  /* Reap any children that might have finished recently.  */
-  reap_children (0, 0);
-
-  /* Chop the commands up into lines if they aren't already.  */
-  chop_commands (cmds);
-
-  /* Start the command sequence, record it in a new
-     'struct child', and add that to the chain.  */
-
-  c = xcalloc (sizeof (struct child));
-  output_init (&c->output);
-
-  c->file = file;
-  c->sh_batch_file = NULL;
-
-  /* Cache dontcare flag because file->dontcare can be changed once we
-     return. Check dontcare inheritance mechanism for details.  */
-  c->dontcare = file->dontcare;
-
-  /* Start saving output in case the expansion uses $(info ...) etc.  */
-  OUTPUT_SET (&c->output);
-
-  /* Expand the command lines and store the results in LINES.  */
-  lines = xmalloc (cmds->ncommand_lines * sizeof (char *));
-  for (i = 0; i < cmds->ncommand_lines; ++i)
-    {
-      /* Collapse backslash-newline combinations that are inside variable
-         or function references.  These are left alone by the parser so
-         that they will appear in the echoing of commands (where they look
-         nice); and collapsed by construct_command_argv when it tokenizes.
-         But letting them survive inside function invocations loses because
-         we don't want the functions to see them as part of the text.  */
-
-      char *in, *out, *ref;
-
-      /* IN points to where in the line we are scanning.
-         OUT points to where in the line we are writing.
-         When we collapse a backslash-newline combination,
-         IN gets ahead of OUT.  */
-
-      in = out = cmds->command_lines[i];
-      while ((ref = strchr (in, '$')) != 0)
-        {
-          ++ref;                /* Move past the $.  */
-
-          if (out != in)
-            /* Copy the text between the end of the last chunk
-               we processed (where IN points) and the new chunk
-               we are about to process (where REF points).  */
-            memmove (out, in, ref - in);
-
-          /* Move both pointers past the boring stuff.  */
-          out += ref - in;
-          in = ref;
-
-          if (*ref == '(' || *ref == '{')
-            {
-              char openparen = *ref;
-              char closeparen = openparen == '(' ? ')' : '}';
-              char *outref;
-              int count;
-              char *p;
-
-              *out++ = *in++;   /* Copy OPENPAREN.  */
-              outref = out;
-              /* IN now points past the opening paren or brace.
-                 Count parens or braces until it is matched.  */
-              count = 0;
-              while (*in != '\0')
-                {
-                  if (*in == closeparen && --count < 0)
-                    break;
-                  else if (*in == '\\' && in[1] == '\n')
-                    {
-                      /* We have found a backslash-newline inside a
-                         variable or function reference.  Eat it and
-                         any following whitespace.  */
-
-                      int quoted = 0;
-                      for (p = in - 1; p > ref && *p == '\\'; --p)
-                        quoted = !quoted;
-
-                      if (quoted)
-                        /* There were two or more backslashes, so this is
-                           not really a continuation line.  We don't collapse
-                           the quoting backslashes here as is done in
-                           collapse_continuations, because the line will
-                           be collapsed again after expansion.  */
-                        *out++ = *in++;
-                      else
-                        {
-                          /* Skip the backslash, newline, and whitespace.  */
-                          in += 2;
-                          NEXT_TOKEN (in);
-
-                          /* Discard any preceding whitespace that has
-                             already been written to the output.  */
-                          while (out > outref && ISBLANK (out[-1]))
-                            --out;
-
-                          /* Replace it all with a single space.  */
-                          *out++ = ' ';
-                        }
-                    }
-                  else
-                    {
-                      if (*in == openparen)
-                        ++count;
-
-                      *out++ = *in++;
-                    }
-                }
-            }
-        }
-
-      /* There are no more references in this line to worry about.
-         Copy the remaining uninteresting text to the output.  */
-      if (out != in)
-        memmove (out, in, strlen (in) + 1);
-
-      /* Finally, expand the line.  */
-      cmds->fileinfo.offset = i;
-      lines[i] = allocated_variable_expand_for_file (cmds->command_lines[i],
-                                                     file);
-    }
-
-  cmds->fileinfo.offset = 0;
-  c->command_lines = lines;
-
-  /* Fetch the first command line to be run.  */
-  job_next_command (c);
-
-  /* Wait for a job slot to be freed up.  If we allow an infinite number
-     don't bother; also job_slots will == 0 if we're using the jobserver.  */
-
-  if (job_slots != 0)
-    while (job_slots_used == job_slots)
-      reap_children (1, 0);
-
-#ifdef MAKE_JOBSERVER
-  /* If we are controlling multiple jobs make sure we have a token before
-     starting the child. */
-
-  /* This can be inefficient.  There's a decent chance that this job won't
-     actually have to run any subprocesses: the command script may be empty
-     or otherwise optimized away.  It would be nice if we could defer
-     obtaining a token until just before we need it, in start_job_command.
-     To do that we'd need to keep track of whether we'd already obtained a
-     token (since start_job_command is called for each line of the job, not
-     just once).  Also more thought needs to go into the entire algorithm;
-     this is where the old parallel job code waits, so...  */
-
-  else if (jobserver_enabled ())
-    while (1)
-      {
-        int got_token;
-
-        DB (DB_JOBS, ("Need a job token; we %shave children\n",
-                      children ? "" : "don't "));
-
-        /* If we don't already have a job started, use our "free" token.  */
-        if (!jobserver_tokens)
-          break;
-
-        /* Prepare for jobserver token acquisition.  */
-        jobserver_pre_acquire ();
-
-        /* Reap anything that's currently waiting.  */
-        reap_children (0, 0);
-
-        /* Kick off any jobs we have waiting for an opportunity that
-           can run now (i.e., waiting for load). */
-        start_waiting_jobs ();
-
-        /* If our "free" slot is available, use it; we don't need a token.  */
-        if (!jobserver_tokens)
-          break;
-
-        /* There must be at least one child already, or we have no business
-           waiting for a token. */
-        if (!children)
-          O (fatal, NILF, "INTERNAL: no children as we go to sleep on read\n");
-
-        /* Get a token.  */
-        got_token = jobserver_acquire (waiting_jobs != NULL);
-
-        /* If we got one, we're done here.  */
-        if (got_token == 1)
-          {
-            DB (DB_JOBS, (_("Obtained token for child %p (%s).\n"),
-                          c, c->file->name));
-            break;
-          }
-      }
-#endif
-
-  ++jobserver_tokens;
-
-  /* Trace the build.
-     Use message here so that changes to working directories are logged.  */
-  if (trace_flag)
-    {
-      char *newer = allocated_variable_expand_for_file ("$?", c->file);
-      const char *nm;
-
-      if (! cmds->fileinfo.filenm)
-        nm = _("<builtin>");
-      else
-        {
-          char *n = alloca (strlen (cmds->fileinfo.filenm) + 1 + 11 + 1);
-          sprintf (n, "%s:%lu", cmds->fileinfo.filenm, cmds->fileinfo.lineno);
-          nm = n;
-        }
-
-      if (newer[0] == '\0')
-        OSS (message, 0,
-             _("%s: target '%s' does not exist"), nm, c->file->name);
-      else
-        OSSS (message, 0,
-              _("%s: update target '%s' due to: %s"), nm, c->file->name, newer);
-
-      free (newer);
-    }
-
-  /* The job is now primed.  Start it running.
-     (This will notice if there is in fact no recipe.)  */
-  start_waiting_job (c);
-
-  if (job_slots == 1 || not_parallel)
-    /* Since there is only one job slot, make things run linearly.
-       Wait for the child to die, setting the state to 'cs_finished'.  */
-    while (file->command_state == cs_running)
-      reap_children (1, 0);
-
-  OUTPUT_UNSET ();
-  return;
-}
-\f
-/* Move CHILD's pointers to the next command for it to execute.
-   Returns nonzero if there is another command.  */
-
-static int
-job_next_command (struct child *child)
-{
-  while (child->command_ptr == 0 || *child->command_ptr == '\0')
-    {
-      /* There are no more lines in the expansion of this line.  */
-      if (child->command_line == child->file->cmds->ncommand_lines)
-        {
-          /* There are no more lines to be expanded.  */
-          child->command_ptr = 0;
-          child->file->cmds->fileinfo.offset = 0;
-          return 0;
-        }
-      else
-        /* Get the next line to run.  */
-        child->command_ptr = child->command_lines[child->command_line++];
-    }
-
-  child->file->cmds->fileinfo.offset = child->command_line - 1;
-  return 1;
-}
-
-/* Determine if the load average on the system is too high to start a new job.
-   The real system load average is only recomputed once a second.  However, a
-   very parallel make can easily start tens or even hundreds of jobs in a
-   second, which brings the system to its knees for a while until that first
-   batch of jobs clears out.
-
-   To avoid this we use a weighted algorithm to try to account for jobs which
-   have been started since the last second, and guess what the load average
-   would be now if it were computed.
-
-   This algorithm was provided by Thomas Riedl <thomas.riedl@siemens.com>,
-   who writes:
-
-!      calculate something load-oid and add to the observed sys.load,
-!      so that latter can catch up:
-!      - every job started increases jobctr;
-!      - every dying job decreases a positive jobctr;
-!      - the jobctr value gets zeroed every change of seconds,
-!        after its value*weight_b is stored into the 'backlog' value last_sec
-!      - weight_a times the sum of jobctr and last_sec gets
-!        added to the observed sys.load.
-!
-!      The two weights have been tried out on 24 and 48 proc. Sun Solaris-9
-!      machines, using a several-thousand-jobs-mix of cpp, cc, cxx and smallish
-!      sub-shelled commands (rm, echo, sed...) for tests.
-!      lowering the 'direct influence' factor weight_a (e.g. to 0.1)
-!      resulted in significant excession of the load limit, raising it
-!      (e.g. to 0.5) took bad to small, fast-executing jobs and didn't
-!      reach the limit in most test cases.
-!
-!      lowering the 'history influence' weight_b (e.g. to 0.1) resulted in
-!      exceeding the limit for longer-running stuff (compile jobs in
-!      the .5 to 1.5 sec. range),raising it (e.g. to 0.5) overrepresented
-!      small jobs' effects.
-
- */
-
-#define LOAD_WEIGHT_A           0.25
-#define LOAD_WEIGHT_B           0.25
-
-static int
-load_too_high (void)
-{
-#if defined(__MSDOS__) || defined(VMS) || defined(_AMIGA) || defined(__riscos__)
-  return 1;
-#else
-  static double last_sec;
-  static time_t last_now;
-  double load, guess;
-  time_t now;
-
-#ifdef WINDOWS32
-  /* sub_proc.c cannot wait for more than MAXIMUM_WAIT_OBJECTS children */
-  if (process_used_slots () >= MAXIMUM_WAIT_OBJECTS)
-    return 1;
-#endif
-
-  if (max_load_average < 0)
-    return 0;
-
-  /* Find the real system load average.  */
-  make_access ();
-  if (getloadavg (&load, 1) != 1)
-    {
-      static int lossage = -1;
-      /* Complain only once for the same error.  */
-      if (lossage == -1 || errno != lossage)
-        {
-          if (errno == 0)
-            /* An errno value of zero means getloadavg is just unsupported.  */
-            O (error, NILF,
-               _("cannot enforce load limits on this operating system"));
-          else
-            perror_with_name (_("cannot enforce load limit: "), "getloadavg");
-        }
-      lossage = errno;
-      load = 0;
-    }
-  user_access ();
-
-  /* If we're in a new second zero the counter and correct the backlog
-     value.  Only keep the backlog for one extra second; after that it's 0.  */
-  now = time (NULL);
-  if (last_now < now)
-    {
-      if (last_now == now - 1)
-        last_sec = LOAD_WEIGHT_B * job_counter;
-      else
-        last_sec = 0.0;
-
-      job_counter = 0;
-      last_now = now;
-    }
-
-  /* Try to guess what the load would be right now.  */
-  guess = load + (LOAD_WEIGHT_A * (job_counter + last_sec));
-
-  DB (DB_JOBS, ("Estimated system load = %f (actual = %f) (max requested = %f)\n",
-                guess, load, max_load_average));
-
-  return guess >= max_load_average;
-#endif
-}
-
-/* Start jobs that are waiting for the load to be lower.  */
-
-void
-start_waiting_jobs (void)
-{
-  struct child *job;
-
-  if (waiting_jobs == 0)
-    return;
-
-  do
-    {
-      /* Check for recently deceased descendants.  */
-      reap_children (0, 0);
-
-      /* Take a job off the waiting list.  */
-      job = waiting_jobs;
-      waiting_jobs = job->next;
-
-      /* Try to start that job.  We break out of the loop as soon
-         as start_waiting_job puts one back on the waiting list.  */
-    }
-  while (start_waiting_job (job) && waiting_jobs != 0);
-
-  return;
-}
-\f
-#ifndef WINDOWS32
-
-/* EMX: Start a child process. This function returns the new pid.  */
-# if defined __EMX__
-int
-child_execute_job (struct output *out, int good_stdin, char **argv, char **envp)
-{
-  int pid;
-  int fdin = good_stdin ? FD_STDIN : get_bad_stdin ();
-  int fdout = FD_STDOUT;
-  int fderr = FD_STDERR;
-  int save_fdin = -1;
-  int save_fdout = -1;
-  int save_fderr = -1;
-
-  /* Divert child output if we want to capture output.  */
-  if (out && out->syncout)
-    {
-      if (out->out >= 0)
-        fdout = out->out;
-      if (out->err >= 0)
-        fderr = out->err;
-    }
-
-  /* For each FD which needs to be redirected first make a dup of the standard
-     FD to save and mark it close on exec so our child won't see it.  Then
-     dup2() the standard FD to the redirect FD, and also mark the redirect FD
-     as close on exec. */
-  if (fdin != FD_STDIN)
-    {
-      save_fdin = dup (FD_STDIN);
-      if (save_fdin < 0)
-        O (fatal, NILF, _("no more file handles: could not duplicate stdin\n"));
-      CLOSE_ON_EXEC (save_fdin);
-
-      dup2 (fdin, FD_STDIN);
-      CLOSE_ON_EXEC (fdin);
-    }
-
-  if (fdout != FD_STDOUT)
-    {
-      save_fdout = dup (FD_STDOUT);
-      if (save_fdout < 0)
-        O (fatal, NILF,
-           _("no more file handles: could not duplicate stdout\n"));
-      CLOSE_ON_EXEC (save_fdout);
-
-      dup2 (fdout, FD_STDOUT);
-      CLOSE_ON_EXEC (fdout);
-    }
-
-  if (fderr != FD_STDERR)
-    {
-      if (fderr != fdout)
-        {
-          save_fderr = dup (FD_STDERR);
-          if (save_fderr < 0)
-            O (fatal, NILF,
-               _("no more file handles: could not duplicate stderr\n"));
-          CLOSE_ON_EXEC (save_fderr);
-        }
-
-      dup2 (fderr, FD_STDERR);
-      CLOSE_ON_EXEC (fderr);
-    }
-
-  /* Run the command.  */
-  pid = exec_command (argv, envp);
-
-  /* Restore stdout/stdin/stderr of the parent and close temporary FDs.  */
-  if (save_fdin >= 0)
-    {
-      if (dup2 (save_fdin, FD_STDIN) != FD_STDIN)
-        O (fatal, NILF, _("Could not restore stdin\n"));
-      else
-        close (save_fdin);
-    }
-
-  if (save_fdout >= 0)
-    {
-      if (dup2 (save_fdout, FD_STDOUT) != FD_STDOUT)
-        O (fatal, NILF, _("Could not restore stdout\n"));
-      else
-        close (save_fdout);
-    }
-
-  if (save_fderr >= 0)
-    {
-      if (dup2 (save_fderr, FD_STDERR) != FD_STDERR)
-        O (fatal, NILF, _("Could not restore stderr\n"));
-      else
-        close (save_fderr);
-    }
-
-  return pid;
-}
-
-#elif !defined (_AMIGA) && !defined (__MSDOS__) && !defined (VMS)
-
-/* POSIX:
-   Create a child process executing the command in ARGV.
-   ENVP is the environment of the new program.  Returns the PID or -1.  */
-int
-child_execute_job (struct output *out, int good_stdin, char **argv, char **envp)
-{
-  int r;
-  int pid;
-  int fdin = good_stdin ? FD_STDIN : get_bad_stdin ();
-  int fdout = FD_STDOUT;
-  int fderr = FD_STDERR;
-
-  /* Divert child output if we want to capture it.  */
-  if (out && out->syncout)
-    {
-      if (out->out >= 0)
-        fdout = out->out;
-      if (out->err >= 0)
-        fderr = out->err;
-    }
-
-  pid = vfork();
-  if (pid != 0)
-    return pid;
-
-  /* We are the child.  */
-  unblock_sigs ();
-
-#ifdef SET_STACK_SIZE
-  /* Reset limits, if necessary.  */
-  if (stack_limit.rlim_cur)
-    setrlimit (RLIMIT_STACK, &stack_limit);
-#endif
-
-  /* For any redirected FD, dup2() it to the standard FD.
-     They are all marked close-on-exec already.  */
-  if (fdin != FD_STDIN)
-    EINTRLOOP (r, dup2 (fdin, FD_STDIN));
-  if (fdout != FD_STDOUT)
-    EINTRLOOP (r, dup2 (fdout, FD_STDOUT));
-  if (fderr != FD_STDERR)
-    EINTRLOOP (r, dup2 (fderr, FD_STDERR));
-
-  /* Run the command.  */
-  exec_command (argv, envp);
-}
-#endif /* !AMIGA && !__MSDOS__ && !VMS */
-#endif /* !WINDOWS32 */
-\f
-#ifndef _AMIGA
-/* Replace the current process with one running the command in ARGV,
-   with environment ENVP.  This function does not return.  */
-
-/* EMX: This function returns the pid of the child process.  */
-# ifdef __EMX__
-int
-# else
-void
-# endif
-exec_command (char **argv, char **envp)
-{
-#ifdef VMS
-  /* to work around a problem with signals and execve: ignore them */
-#ifdef SIGCHLD
-  signal (SIGCHLD,SIG_IGN);
-#endif
-  /* Run the program.  */
-  execve (argv[0], argv, envp);
-  perror_with_name ("execve: ", argv[0]);
-  _exit (EXIT_FAILURE);
-#else
-#ifdef WINDOWS32
-  HANDLE hPID;
-  HANDLE hWaitPID;
-  int exit_code = EXIT_FAILURE;
-
-  /* make sure CreateProcess() has Path it needs */
-  sync_Path_environment ();
-
-  /* launch command */
-  hPID = process_easy (argv, envp, -1, -1);
-
-  /* make sure launch ok */
-  if (hPID == INVALID_HANDLE_VALUE)
-    {
-      int i;
-      fprintf (stderr, _("process_easy() failed to launch process (e=%ld)\n"),
-               process_last_err (hPID));
-      for (i = 0; argv[i]; i++)
-          fprintf (stderr, "%s ", argv[i]);
-      fprintf (stderr, _("\nCounted %d args in failed launch\n"), i);
-      exit (EXIT_FAILURE);
-    }
-
-  /* wait and reap last child */
-  hWaitPID = process_wait_for_any (1, 0);
-  while (hWaitPID)
-    {
-      /* was an error found on this process? */
-      int err = process_last_err (hWaitPID);
-
-      /* get exit data */
-      exit_code = process_exit_code (hWaitPID);
-
-      if (err)
-          fprintf (stderr, "make (e=%d, rc=%d): %s",
-                   err, exit_code, map_windows32_error_to_string (err));
-
-      /* cleanup process */
-      process_cleanup (hWaitPID);
-
-      /* expect to find only last pid, warn about other pids reaped */
-      if (hWaitPID == hPID)
-          break;
-      else
-        {
-          char *pidstr = xstrdup (pid2str ((pid_t)hWaitPID));
-
-          fprintf (stderr,
-                   _("make reaped child pid %s, still waiting for pid %s\n"),
-                   pidstr, pid2str ((pid_t)hPID));
-          free (pidstr);
-        }
-    }
-
-  /* return child's exit code as our exit code */
-  exit (exit_code);
-
-#else  /* !WINDOWS32 */
-
-# ifdef __EMX__
-  int pid;
-# endif
-
-  /* Be the user, permanently.  */
-  child_access ();
-
-# ifdef __EMX__
-  /* Run the program.  */
-  pid = spawnvpe (P_NOWAIT, argv[0], argv, envp);
-  if (pid >= 0)
-    return pid;
-
-  /* the file might have a strange shell extension */
-  if (errno == ENOENT)
-    errno = ENOEXEC;
-
-# else
-  /* Run the program.  */
-  environ = envp;
-  execvp (argv[0], argv);
-
-# endif /* !__EMX__ */
-
-  switch (errno)
-    {
-    case ENOENT:
-      /* We are in the child: don't use the output buffer.
-         It's not right to run fprintf() here!  */
-      if (makelevel == 0)
-        fprintf (stderr, _("%s: %s: Command not found\n"), program, argv[0]);
-      else
-        fprintf (stderr, _("%s[%u]: %s: Command not found\n"),
-                 program, makelevel, argv[0]);
-      break;
-    case ENOEXEC:
-      {
-        /* The file is not executable.  Try it as a shell script.  */
-        const char *shell;
-        char **new_argv;
-        int argc;
-        int i=1;
-
-# ifdef __EMX__
-        /* Do not use $SHELL from the environment */
-        struct variable *p = lookup_variable ("SHELL", 5);
-        if (p)
-          shell = p->value;
-        else
-          shell = 0;
-# else
-        shell = getenv ("SHELL");
-# endif
-        if (shell == 0)
-          shell = default_shell;
-
-        argc = 1;
-        while (argv[argc] != 0)
-          ++argc;
-
-# ifdef __EMX__
-        if (!unixy_shell)
-          ++argc;
-# endif
-
-        new_argv = alloca ((1 + argc + 1) * sizeof (char *));
-        new_argv[0] = (char *)shell;
-
-# ifdef __EMX__
-        if (!unixy_shell)
-          {
-            new_argv[1] = "/c";
-            ++i;
-            --argc;
-          }
-# endif
-
-        new_argv[i] = argv[0];
-        while (argc > 0)
-          {
-            new_argv[i + argc] = argv[argc];
-            --argc;
-          }
-
-# ifdef __EMX__
-        pid = spawnvpe (P_NOWAIT, shell, new_argv, envp);
-        if (pid >= 0)
-          break;
-# else
-        execvp (shell, new_argv);
-# endif
-        if (errno == ENOENT)
-          OS (error, NILF, _("%s: Shell program not found"), shell);
-        else
-          perror_with_name ("execvp: ", shell);
-        break;
-      }
-
-# ifdef __EMX__
-    case EINVAL:
-      /* this nasty error was driving me nuts :-( */
-      O (error, NILF, _("spawnvpe: environment space might be exhausted"));
-      /* FALLTHROUGH */
-# endif
-
-    default:
-      perror_with_name ("execvp: ", argv[0]);
-      break;
-    }
-
-# ifdef __EMX__
-  return pid;
-# else
-  _exit (127);
-# endif
-#endif /* !WINDOWS32 */
-#endif /* !VMS */
-}
-#else /* On Amiga */
-void
-exec_command (char **argv)
-{
-  MyExecute (argv);
-}
-
-void clean_tmp (void)
-{
-  DeleteFile (amiga_bname);
-}
-
-#endif /* On Amiga */
-\f
-#ifndef VMS
-/* Figure out the argument list necessary to run LINE as a command.  Try to
-   avoid using a shell.  This routine handles only ' quoting, and " quoting
-   when no backslash, $ or ' characters are seen in the quotes.  Starting
-   quotes may be escaped with a backslash.  If any of the characters in
-   sh_chars is seen, or any of the builtin commands listed in sh_cmds
-   is the first word of a line, the shell is used.
-
-   If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
-   If *RESTP is NULL, newlines will be ignored.
-
-   SHELL is the shell to use, or nil to use the default shell.
-   IFS is the value of $IFS, or nil (meaning the default).
-
-   FLAGS is the value of lines_flags for this command line.  It is
-   used in the WINDOWS32 port to check whether + or $(MAKE) were found
-   in this command line, in which case the effect of just_print_flag
-   is overridden.  */
-
-static char **
-construct_command_argv_internal (char *line, char **restp, const char *shell,
-                                 const char *shellflags, const char *ifs,
-                                 int flags, char **batch_filename UNUSED)
-{
-#ifdef __MSDOS__
-  /* MSDOS supports both the stock DOS shell and ports of Unixy shells.
-     We call 'system' for anything that requires ''slow'' processing,
-     because DOS shells are too dumb.  When $SHELL points to a real
-     (unix-style) shell, 'system' just calls it to do everything.  When
-     $SHELL points to a DOS shell, 'system' does most of the work
-     internally, calling the shell only for its internal commands.
-     However, it looks on the $PATH first, so you can e.g. have an
-     external command named 'mkdir'.
-
-     Since we call 'system', certain characters and commands below are
-     actually not specific to COMMAND.COM, but to the DJGPP implementation
-     of 'system'.  In particular:
-
-       The shell wildcard characters are in DOS_CHARS because they will
-       not be expanded if we call the child via 'spawnXX'.
-
-       The ';' is in DOS_CHARS, because our 'system' knows how to run
-       multiple commands on a single line.
-
-       DOS_CHARS also include characters special to 4DOS/NDOS, so we
-       won't have to tell one from another and have one more set of
-       commands and special characters.  */
-  static const char *sh_chars_dos = "*?[];|<>%^&()";
-  static const char *sh_cmds_dos[] =
-    { "break", "call", "cd", "chcp", "chdir", "cls", "copy", "ctty", "date",
-      "del", "dir", "echo", "erase", "exit", "for", "goto", "if", "md",
-      "mkdir", "path", "pause", "prompt", "rd", "rmdir", "rem", "ren",
-      "rename", "set", "shift", "time", "type", "ver", "verify", "vol", ":",
-      0 };
-
-  static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^";
-  static const char *sh_cmds_sh[] =
-    { "cd", "echo", "eval", "exec", "exit", "login", "logout", "set", "umask",
-      "wait", "while", "for", "case", "if", ":", ".", "break", "continue",
-      "export", "read", "readonly", "shift", "times", "trap", "switch",
-      "unset", "ulimit", 0 };
-
-  const char *sh_chars;
-  const char **sh_cmds;
-
-#elif defined (__EMX__)
-  static const char *sh_chars_dos = "*?[];|<>%^&()";
-  static const char *sh_cmds_dos[] =
-    { "break", "call", "cd", "chcp", "chdir", "cls", "copy", "ctty", "date",
-      "del", "dir", "echo", "erase", "exit", "for", "goto", "if", "md",
-      "mkdir", "path", "pause", "prompt", "rd", "rmdir", "rem", "ren",
-      "rename", "set", "shift", "time", "type", "ver", "verify", "vol", ":",
-      0 };
-
-  static const char *sh_chars_os2 = "*?[];|<>%^()\"'&";
-  static const char *sh_cmds_os2[] =
-    { "call", "cd", "chcp", "chdir", "cls", "copy", "date", "del", "detach",
-      "dir", "echo", "endlocal", "erase", "exit", "for", "goto", "if", "keys",
-      "md", "mkdir", "move", "path", "pause", "prompt", "rd", "rem", "ren",
-      "rename", "rmdir", "set", "setlocal", "shift", "start", "time", "type",
-      "ver", "verify", "vol", ":", 0 };
-
-  static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^~'";
-  static const char *sh_cmds_sh[] =
-    { "echo", "cd", "eval", "exec", "exit", "login", "logout", "set", "umask",
-      "wait", "while", "for", "case", "if", ":", ".", "break", "continue",
-      "export", "read", "readonly", "shift", "times", "trap", "switch",
-      "unset", 0 };
-
-  const char *sh_chars;
-  const char **sh_cmds;
-
-#elif defined (_AMIGA)
-  static const char *sh_chars = "#;\"|<>()?*$`";
-  static const char *sh_cmds[] =
-    { "cd", "eval", "if", "delete", "echo", "copy", "rename", "set", "setenv",
-      "date", "makedir", "skip", "else", "endif", "path", "prompt", "unset",
-      "unsetenv", "version", 0 };
-
-#elif defined (WINDOWS32)
-  /* We used to have a double quote (") in sh_chars_dos[] below, but
-     that caused any command line with quoted file names be run
-     through a temporary batch file, which introduces command-line
-     limit of 4K charcaters imposed by cmd.exe.  Since CreateProcess
-     can handle quoted file names just fine, removing the quote lifts
-     the limit from a very frequent use case, because using quoted
-     file names is commonplace on MS-Windows.  */
-  static const char *sh_chars_dos = "|&<>";
-  static const char *sh_cmds_dos[] =
-    { "assoc", "break", "call", "cd", "chcp", "chdir", "cls", "color", "copy",
-      "ctty", "date", "del", "dir", "echo", "echo.", "endlocal", "erase",
-      "exit", "for", "ftype", "goto", "if", "if", "md", "mkdir", "move",
-      "path", "pause", "prompt", "rd", "rem", "ren", "rename", "rmdir",
-      "set", "setlocal", "shift", "time", "title", "type", "ver", "verify",
-      "vol", ":", 0 };
-
-  static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^";
-  static const char *sh_cmds_sh[] =
-    { "cd", "eval", "exec", "exit", "login", "logout", "set", "umask", "wait",
-      "while", "for", "case", "if", ":", ".", "break", "continue", "export",
-      "read", "readonly", "shift", "times", "trap", "switch", "test",
-#ifdef BATCH_MODE_ONLY_SHELL
-      "echo",
-#endif
-      0 };
-
-  const char *sh_chars;
-  const char **sh_cmds;
-#elif defined(__riscos__)
-  static const char *sh_chars = "";
-  static const char *sh_cmds[] = { 0 };
-#else  /* must be UNIX-ish */
-  static const char *sh_chars = "#;\"*?[]&|<>(){}$`^~!";
-  static const char *sh_cmds[] =
-    { ".", ":", "break", "case", "cd", "continue", "eval", "exec", "exit",
-      "export", "for", "if", "login", "logout", "read", "readonly", "set",
-      "shift", "switch", "test", "times", "trap", "ulimit", "umask", "unset",
-      "wait", "while", 0 };
-
-# ifdef HAVE_DOS_PATHS
-  /* This is required if the MSYS/Cygwin ports (which do not define
-     WINDOWS32) are compiled with HAVE_DOS_PATHS defined, which uses
-     sh_chars_sh directly (see below).  The value must be identical
-     to that of sh_chars immediately above.  */
-  static const char *sh_chars_sh =  "#;\"*?[]&|<>(){}$`^~!";
-# endif  /* HAVE_DOS_PATHS */
-#endif
-  int i;
-  char *p;
-#ifndef NDEBUG
-  char *end;
-#endif
-  char *ap;
-  const char *cap;
-  const char *cp;
-  int instring, word_has_equals, seen_nonequals, last_argument_was_empty;
-  char **new_argv = 0;
-  char *argstr = 0;
-#ifdef WINDOWS32
-  int slow_flag = 0;
-
-  if (!unixy_shell)
-    {
-      sh_cmds = sh_cmds_dos;
-      sh_chars = sh_chars_dos;
-    }
-  else
-    {
-      sh_cmds = sh_cmds_sh;
-      sh_chars = sh_chars_sh;
-    }
-#endif /* WINDOWS32 */
-
-  if (restp != NULL)
-    *restp = NULL;
-
-  /* Make sure not to bother processing an empty line but stop at newline.  */
-  while (ISBLANK (*line))
-    ++line;
-  if (*line == '\0')
-    return 0;
-
-  if (shellflags == 0)
-    shellflags = posix_pedantic ? "-ec" : "-c";
-
-  /* See if it is safe to parse commands internally.  */
-  if (shell == 0)
-    shell = default_shell;
-#ifdef WINDOWS32
-  else if (strcmp (shell, default_shell))
-  {
-    char *s1 = _fullpath (NULL, shell, 0);
-    char *s2 = _fullpath (NULL, default_shell, 0);
-
-    slow_flag = strcmp ((s1 ? s1 : ""), (s2 ? s2 : ""));
-
-    free (s1);
-    free (s2);
-  }
-  if (slow_flag)
-    goto slow;
-#else  /* not WINDOWS32 */
-#if defined (__MSDOS__) || defined (__EMX__)
-  else if (strcasecmp (shell, default_shell))
-    {
-      extern int _is_unixy_shell (const char *_path);
-
-      DB (DB_BASIC, (_("$SHELL changed (was '%s', now '%s')\n"),
-                     default_shell, shell));
-      unixy_shell = _is_unixy_shell (shell);
-      /* we must allocate a copy of shell: construct_command_argv() will free
-       * shell after this function returns.  */
-      default_shell = xstrdup (shell);
-    }
-  if (unixy_shell)
-    {
-      sh_chars = sh_chars_sh;
-      sh_cmds  = sh_cmds_sh;
-    }
-  else
-    {
-      sh_chars = sh_chars_dos;
-      sh_cmds  = sh_cmds_dos;
-# ifdef __EMX__
-      if (_osmode == OS2_MODE)
-        {
-          sh_chars = sh_chars_os2;
-          sh_cmds = sh_cmds_os2;
-        }
-# endif
-    }
-#else  /* !__MSDOS__ */
-  else if (strcmp (shell, default_shell))
-    goto slow;
-#endif /* !__MSDOS__ && !__EMX__ */
-#endif /* not WINDOWS32 */
-
-  if (ifs)
-    for (cap = ifs; *cap != '\0'; ++cap)
-      if (*cap != ' ' && *cap != '\t' && *cap != '\n')
-        goto slow;
-
-  if (shellflags)
-    if (shellflags[0] != '-'
-        || ((shellflags[1] != 'c' || shellflags[2] != '\0')
-            && (shellflags[1] != 'e' || shellflags[2] != 'c' || shellflags[3] != '\0')))
-      goto slow;
-
-  i = strlen (line) + 1;
-
-  /* More than 1 arg per character is impossible.  */
-  new_argv = xmalloc (i * sizeof (char *));
-
-  /* All the args can fit in a buffer as big as LINE is.   */
-  ap = new_argv[0] = argstr = xmalloc (i);
-#ifndef NDEBUG
-  end = ap + i;
-#endif
-
-  /* I is how many complete arguments have been found.  */
-  i = 0;
-  instring = word_has_equals = seen_nonequals = last_argument_was_empty = 0;
-  for (p = line; *p != '\0'; ++p)
-    {
-      assert (ap <= end);
-
-      if (instring)
-        {
-          /* Inside a string, just copy any char except a closing quote
-             or a backslash-newline combination.  */
-          if (*p == instring)
-            {
-              instring = 0;
-              if (ap == new_argv[0] || *(ap-1) == '\0')
-                last_argument_was_empty = 1;
-            }
-          else if (*p == '\\' && p[1] == '\n')
-            {
-              /* Backslash-newline is handled differently depending on what
-                 kind of string we're in: inside single-quoted strings you
-                 keep them; in double-quoted strings they disappear.  For
-                 DOS/Windows/OS2, if we don't have a POSIX shell, we keep the
-                 pre-POSIX behavior of removing the backslash-newline.  */
-              if (instring == '"'
-#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32)
-                  || !unixy_shell
-#endif
-                  )
-                ++p;
-              else
-                {
-                  *(ap++) = *(p++);
-                  *(ap++) = *p;
-                }
-            }
-          else if (*p == '\n' && restp != NULL)
-            {
-              /* End of the command line.  */
-              *restp = p;
-              goto end_of_line;
-            }
-          /* Backslash, $, and ` are special inside double quotes.
-             If we see any of those, punt.
-             But on MSDOS, if we use COMMAND.COM, double and single
-             quotes have the same effect.  */
-          else if (instring == '"' && strchr ("\\$`", *p) != 0 && unixy_shell)
-            goto slow;
-#ifdef WINDOWS32
-          /* Quoted wildcard characters must be passed quoted to the
-             command, so give up the fast route.  */
-          else if (instring == '"' && strchr ("*?", *p) != 0 && !unixy_shell)
-            goto slow;
-          else if (instring == '"' && strncmp (p, "\\\"", 2) == 0)
-            *ap++ = *++p;
-#endif
-          else
-            *ap++ = *p;
-        }
-      else if (strchr (sh_chars, *p) != 0)
-        /* Not inside a string, but it's a special char.  */
-        goto slow;
-      else if (one_shell && *p == '\n')
-        /* In .ONESHELL mode \n is a separator like ; or && */
-        goto slow;
-#ifdef  __MSDOS__
-      else if (*p == '.' && p[1] == '.' && p[2] == '.' && p[3] != '.')
-        /* '...' is a wildcard in DJGPP.  */
-        goto slow;
-#endif
-      else
-        /* Not a special char.  */
-        switch (*p)
-          {
-          case '=':
-            /* Equals is a special character in leading words before the
-               first word with no equals sign in it.  This is not the case
-               with sh -k, but we never get here when using nonstandard
-               shell flags.  */
-            if (! seen_nonequals && unixy_shell)
-              goto slow;
-            word_has_equals = 1;
-            *ap++ = '=';
-            break;
-
-          case '\\':
-            /* Backslash-newline has special case handling, ref POSIX.
-               We're in the fastpath, so emulate what the shell would do.  */
-            if (p[1] == '\n')
-              {
-                /* Throw out the backslash and newline.  */
-                ++p;
-
-                /* At the beginning of the argument, skip any whitespace other
-                   than newline before the start of the next word.  */
-                if (ap == new_argv[i])
-                  while (ISBLANK (p[1]))
-                    ++p;
-              }
-#ifdef WINDOWS32
-            /* Backslash before whitespace is not special if our shell
-               is not Unixy.  */
-            else if (ISSPACE (p[1]) && !unixy_shell)
-              {
-                *ap++ = *p;
-                break;
-              }
-#endif
-            else if (p[1] != '\0')
-              {
-#ifdef HAVE_DOS_PATHS
-                /* Only remove backslashes before characters special to Unixy
-                   shells.  All other backslashes are copied verbatim, since
-                   they are probably DOS-style directory separators.  This
-                   still leaves a small window for problems, but at least it
-                   should work for the vast majority of naive users.  */
-
-#ifdef __MSDOS__
-                /* A dot is only special as part of the "..."
-                   wildcard.  */
-                if (strneq (p + 1, ".\\.\\.", 5))
-                  {
-                    *ap++ = '.';
-                    *ap++ = '.';
-                    p += 4;
-                  }
-                else
-#endif
-                  if (p[1] != '\\' && p[1] != '\''
-                      && !ISSPACE (p[1])
-                      && strchr (sh_chars_sh, p[1]) == 0)
-                    /* back up one notch, to copy the backslash */
-                    --p;
-#endif  /* HAVE_DOS_PATHS */
-
-                /* Copy and skip the following char.  */
-                *ap++ = *++p;
-              }
-            break;
-
-          case '\'':
-          case '"':
-            instring = *p;
-            break;
-
-          case '\n':
-            if (restp != NULL)
-              {
-                /* End of the command line.  */
-                *restp = p;
-                goto end_of_line;
-              }
-            else
-              /* Newlines are not special.  */
-              *ap++ = '\n';
-            break;
-
-          case ' ':
-          case '\t':
-            /* We have the end of an argument.
-               Terminate the text of the argument.  */
-            *ap++ = '\0';
-            new_argv[++i] = ap;
-            last_argument_was_empty = 0;
-
-            /* Update SEEN_NONEQUALS, which tells us if every word
-               heretofore has contained an '='.  */
-            seen_nonequals |= ! word_has_equals;
-            if (word_has_equals && ! seen_nonequals)
-              /* An '=' in a word before the first
-                 word without one is magical.  */
-              goto slow;
-            word_has_equals = 0; /* Prepare for the next word.  */
-
-            /* If this argument is the command name,
-               see if it is a built-in shell command.
-               If so, have the shell handle it.  */
-            if (i == 1)
-              {
-                register int j;
-                for (j = 0; sh_cmds[j] != 0; ++j)
-                  {
-                    if (streq (sh_cmds[j], new_argv[0]))
-                      goto slow;
-#if defined(__EMX__) || defined(WINDOWS32)
-                    /* Non-Unix shells are case insensitive.  */
-                    if (!unixy_shell
-                        && strcasecmp (sh_cmds[j], new_argv[0]) == 0)
-                      goto slow;
-#endif
-                  }
-              }
-
-            /* Skip whitespace chars, but not newlines.  */
-            while (ISBLANK (p[1]))
-              ++p;
-            break;
-
-          default:
-            *ap++ = *p;
-            break;
-          }
-    }
- end_of_line:
-
-  if (instring)
-    /* Let the shell deal with an unterminated quote.  */
-    goto slow;
-
-  /* Terminate the last argument and the argument list.  */
-
-  *ap = '\0';
-  if (new_argv[i][0] != '\0' || last_argument_was_empty)
-    ++i;
-  new_argv[i] = 0;
-
-  if (i == 1)
-    {
-      register int j;
-      for (j = 0; sh_cmds[j] != 0; ++j)
-        if (streq (sh_cmds[j], new_argv[0]))
-          goto slow;
-    }
-
-  if (new_argv[0] == 0)
-    {
-      /* Line was empty.  */
-      free (argstr);
-      free (new_argv);
-      return 0;
-    }
-
-  return new_argv;
-
- slow:;
-  /* We must use the shell.  */
-
-  if (new_argv != 0)
-    {
-      /* Free the old argument list we were working on.  */
-      free (argstr);
-      free (new_argv);
-    }
-
-#ifdef __MSDOS__
-  execute_by_shell = 1; /* actually, call 'system' if shell isn't unixy */
-#endif
-
-#ifdef _AMIGA
-  {
-    char *ptr;
-    char *buffer;
-    char *dptr;
-
-    buffer = xmalloc (strlen (line)+1);
-
-    ptr = line;
-    for (dptr=buffer; *ptr; )
-    {
-      if (*ptr == '\\' && ptr[1] == '\n')
-        ptr += 2;
-      else if (*ptr == '@') /* Kludge: multiline commands */
-      {
-        ptr += 2;
-        *dptr++ = '\n';
-      }
-      else
-        *dptr++ = *ptr++;
-    }
-    *dptr = 0;
-
-    new_argv = xmalloc (2 * sizeof (char *));
-    new_argv[0] = buffer;
-    new_argv[1] = 0;
-  }
-#else   /* Not Amiga  */
-#ifdef WINDOWS32
-  /*
-   * Not eating this whitespace caused things like
-   *
-   *    sh -c "\n"
-   *
-   * which gave the shell fits. I think we have to eat
-   * whitespace here, but this code should be considered
-   * suspicious if things start failing....
-   */
-
-  /* Make sure not to bother processing an empty line.  */
-  NEXT_TOKEN (line);
-  if (*line == '\0')
-    return 0;
-#endif /* WINDOWS32 */
-
-  {
-    /* SHELL may be a multi-word command.  Construct a command line
-       "$(SHELL) $(.SHELLFLAGS) LINE", with all special chars in LINE escaped.
-       Then recurse, expanding this command line to get the final
-       argument list.  */
-
-    char *new_line;
-    unsigned int shell_len = strlen (shell);
-    unsigned int line_len = strlen (line);
-    unsigned int sflags_len = shellflags ? strlen (shellflags) : 0;
-#ifdef WINDOWS32
-    char *command_ptr = NULL; /* used for batch_mode_shell mode */
-#endif
-
-# ifdef __EMX__ /* is this necessary? */
-    if (!unixy_shell && shellflags)
-      shellflags[0] = '/'; /* "/c" */
-# endif
-
-    /* In .ONESHELL mode we are allowed to throw the entire current
-        recipe string at a single shell and trust that the user
-        has configured the shell and shell flags, and formatted
-        the string, appropriately. */
-    if (one_shell)
-      {
-        /* If the shell is Bourne compatible, we must remove and ignore
-           interior special chars [@+-] because they're meaningless to
-           the shell itself. If, however, we're in .ONESHELL mode and
-           have changed SHELL to something non-standard, we should
-           leave those alone because they could be part of the
-           script. In this case we must also leave in place
-           any leading [@+-] for the same reason.  */
-
-        /* Remove and ignore interior prefix chars [@+-] because they're
-             meaningless given a single shell. */
-#if defined __MSDOS__ || defined (__EMX__)
-        if (unixy_shell)     /* the test is complicated and we already did it */
-#else
-        if (is_bourne_compatible_shell (shell)
-#ifdef WINDOWS32
-            /* If we didn't find any sh.exe, don't behave is if we did!  */
-            && !no_default_sh_exe
-#endif
-            )
-#endif
-          {
-            const char *f = line;
-            char *t = line;
-
-            /* Copy the recipe, removing and ignoring interior prefix chars
-               [@+-]: they're meaningless in .ONESHELL mode.  */
-            while (f[0] != '\0')
-              {
-                int esc = 0;
-
-                /* This is the start of a new recipe line.  Skip whitespace
-                   and prefix characters but not newlines.  */
-                while (ISBLANK (*f) || *f == '-' || *f == '@' || *f == '+')
-                  ++f;
-
-                /* Copy until we get to the next logical recipe line.  */
-                while (*f != '\0')
-                  {
-                    *(t++) = *(f++);
-                    if (f[-1] == '\\')
-                      esc = !esc;
-                    else
-                      {
-                        /* On unescaped newline, we're done with this line.  */
-                        if (f[-1] == '\n' && ! esc)
-                          break;
-
-                        /* Something else: reset the escape sequence.  */
-                        esc = 0;
-                      }
-                  }
-              }
-            *t = '\0';
-          }
-#ifdef WINDOWS32
-        else    /* non-Posix shell (cmd.exe etc.) */
-          {
-            const char *f = line;
-            char *t = line;
-            char *tstart = t;
-            int temp_fd;
-            FILE* batch = NULL;
-            int id = GetCurrentProcessId ();
-            PATH_VAR(fbuf);
-
-            /* Generate a file name for the temporary batch file.  */
-            sprintf (fbuf, "make%d", id);
-            *batch_filename = create_batch_file (fbuf, 0, &temp_fd);
-            DB (DB_JOBS, (_("Creating temporary batch file %s\n"),
-                          *batch_filename));
-
-            /* Create a FILE object for the batch file, and write to it the
-               commands to be executed.  Put the batch file in TEXT mode.  */
-            _setmode (temp_fd, _O_TEXT);
-            batch = _fdopen (temp_fd, "wt");
-            fputs ("@echo off\n", batch);
-            DB (DB_JOBS, (_("Batch file contents:\n\t@echo off\n")));
-
-            /* Copy the recipe, removing and ignoring interior prefix chars
-               [@+-]: they're meaningless in .ONESHELL mode.  */
-            while (*f != '\0')
-              {
-                /* This is the start of a new recipe line.  Skip whitespace
-                   and prefix characters but not newlines.  */
-                while (ISBLANK (*f) || *f == '-' || *f == '@' || *f == '+')
-                  ++f;
-
-                /* Copy until we get to the next logical recipe line.  */
-                while (*f != '\0')
-                  {
-                    /* Remove the escaped newlines in the command, and the
-                       blanks that follow them.  Windows shells cannot handle
-                       escaped newlines.  */
-                    if (*f == '\\' && f[1] == '\n')
-                      {
-                        f += 2;
-                        while (ISBLANK (*f))
-                          ++f;
-                      }
-                    *(t++) = *(f++);
-                    /* On an unescaped newline, we're done with this
-                       line.  */
-                    if (f[-1] == '\n')
-                      break;
-                  }
-                /* Write another line into the batch file.  */
-                if (t > tstart)
-                  {
-                    char c = *t;
-                    *t = '\0';
-                    fputs (tstart, batch);
-                    DB (DB_JOBS, ("\t%s", tstart));
-                    tstart = t;
-                    *t = c;
-                  }
-              }
-            DB (DB_JOBS, ("\n"));
-            fclose (batch);
-
-            /* Create an argv list for the shell command line that
-               will run the batch file.  */
-            new_argv = xmalloc (2 * sizeof (char *));
-            new_argv[0] = xstrdup (*batch_filename);
-            new_argv[1] = NULL;
-            return new_argv;
-          }
-#endif /* WINDOWS32 */
-        /* Create an argv list for the shell command line.  */
-        {
-          int n = 0;
-
-          new_argv = xmalloc ((4 + sflags_len/2) * sizeof (char *));
-          new_argv[n++] = xstrdup (shell);
-
-          /* Chop up the shellflags (if any) and assign them.  */
-          if (! shellflags)
-            new_argv[n++] = xstrdup ("");
-          else
-            {
-              const char *s = shellflags;
-              char *t;
-              unsigned int len;
-              while ((t = find_next_token (&s, &len)) != 0)
-                new_argv[n++] = xstrndup (t, len);
-            }
-
-          /* Set the command to invoke.  */
-          new_argv[n++] = line;
-          new_argv[n++] = NULL;
-        }
-        return new_argv;
-      }
-
-    new_line = xmalloc ((shell_len*2) + 1 + sflags_len + 1
-                        + (line_len*2) + 1);
-    ap = new_line;
-    /* Copy SHELL, escaping any characters special to the shell.  If
-       we don't escape them, construct_command_argv_internal will
-       recursively call itself ad nauseam, or until stack overflow,
-       whichever happens first.  */
-    for (cp = shell; *cp != '\0'; ++cp)
-      {
-        if (strchr (sh_chars, *cp) != 0)
-          *(ap++) = '\\';
-        *(ap++) = *cp;
-      }
-    *(ap++) = ' ';
-    if (shellflags)
-      memcpy (ap, shellflags, sflags_len);
-    ap += sflags_len;
-    *(ap++) = ' ';
-#ifdef WINDOWS32
-    command_ptr = ap;
-#endif
-    for (p = line; *p != '\0'; ++p)
-      {
-        if (restp != NULL && *p == '\n')
-          {
-            *restp = p;
-            break;
-          }
-        else if (*p == '\\' && p[1] == '\n')
-          {
-            /* POSIX says we keep the backslash-newline.  If we don't have a
-               POSIX shell on DOS/Windows/OS2, mimic the pre-POSIX behavior
-               and remove the backslash/newline.  */
-#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32)
-# define PRESERVE_BSNL  unixy_shell
-#else
-# define PRESERVE_BSNL  1
-#endif
-            if (PRESERVE_BSNL)
-              {
-                *(ap++) = '\\';
-                /* Only non-batch execution needs another backslash,
-                   because it will be passed through a recursive
-                   invocation of this function.  */
-                if (!batch_mode_shell)
-                  *(ap++) = '\\';
-                *(ap++) = '\n';
-              }
-            ++p;
-            continue;
-          }
-
-        /* DOS shells don't know about backslash-escaping.  */
-        if (unixy_shell && !batch_mode_shell &&
-            (*p == '\\' || *p == '\'' || *p == '"'
-             || ISSPACE (*p)
-             || strchr (sh_chars, *p) != 0))
-          *ap++ = '\\';
-#ifdef __MSDOS__
-        else if (unixy_shell && strneq (p, "...", 3))
-          {
-            /* The case of '...' wildcard again.  */
-            strcpy (ap, "\\.\\.\\");
-            ap += 5;
-            p  += 2;
-          }
-#endif
-        *ap++ = *p;
-      }
-    if (ap == new_line + shell_len + sflags_len + 2)
-      {
-        /* Line was empty.  */
-        free (new_line);
-        return 0;
-      }
-    *ap = '\0';
-
-#ifdef WINDOWS32
-    /* Some shells do not work well when invoked as 'sh -c xxx' to run a
-       command line (e.g. Cygnus GNUWIN32 sh.exe on WIN32 systems).  In these
-       cases, run commands via a script file.  */
-    if (just_print_flag && !(flags & COMMANDS_RECURSE))
-      {
-        /* Need to allocate new_argv, although it's unused, because
-           start_job_command will want to free it and its 0'th element.  */
-        new_argv = xmalloc (2 * sizeof (char *));
-        new_argv[0] = xstrdup ("");
-        new_argv[1] = NULL;
-      }
-    else if ((no_default_sh_exe || batch_mode_shell) && batch_filename)
-      {
-        int temp_fd;
-        FILE* batch = NULL;
-        int id = GetCurrentProcessId ();
-        PATH_VAR (fbuf);
-
-        /* create a file name */
-        sprintf (fbuf, "make%d", id);
-        *batch_filename = create_batch_file (fbuf, unixy_shell, &temp_fd);
-
-        DB (DB_JOBS, (_("Creating temporary batch file %s\n"),
-                      *batch_filename));
-
-        /* Create a FILE object for the batch file, and write to it the
-           commands to be executed.  Put the batch file in TEXT mode.  */
-        _setmode (temp_fd, _O_TEXT);
-        batch = _fdopen (temp_fd, "wt");
-        if (!unixy_shell)
-          fputs ("@echo off\n", batch);
-        fputs (command_ptr, batch);
-        fputc ('\n', batch);
-        fclose (batch);
-        DB (DB_JOBS, (_("Batch file contents:%s\n\t%s\n"),
-                      !unixy_shell ? "\n\t@echo off" : "", command_ptr));
-
-        /* create argv */
-        new_argv = xmalloc (3 * sizeof (char *));
-        if (unixy_shell)
-          {
-            new_argv[0] = xstrdup (shell);
-            new_argv[1] = *batch_filename; /* only argv[0] gets freed later */
-          }
-        else
-          {
-            new_argv[0] = xstrdup (*batch_filename);
-            new_argv[1] = NULL;
-          }
-        new_argv[2] = NULL;
-      }
-    else
-#endif /* WINDOWS32 */
-
-    if (unixy_shell)
-      new_argv = construct_command_argv_internal (new_line, 0, 0, 0, 0,
-                                                  flags, 0);
-
-#ifdef __EMX__
-    else if (!unixy_shell)
-      {
-        /* new_line is local, must not be freed therefore
-           We use line here instead of new_line because we run the shell
-           manually.  */
-        size_t line_len = strlen (line);
-        char *p = new_line;
-        char *q = new_line;
-        memcpy (new_line, line, line_len + 1);
-        /* Replace all backslash-newline combination and also following tabs.
-           Important: stop at the first '\n' because that's what the loop above
-           did. The next line starting at restp[0] will be executed during the
-           next call of this function. */
-        while (*q != '\0' && *q != '\n')
-          {
-            if (q[0] == '\\' && q[1] == '\n')
-              q += 2; /* remove '\\' and '\n' */
-            else
-              *p++ = *q++;
-          }
-        *p = '\0';
-
-# ifndef NO_CMD_DEFAULT
-        if (strnicmp (new_line, "echo", 4) == 0
-            && (new_line[4] == ' ' || new_line[4] == '\t'))
-          {
-            /* the builtin echo command: handle it separately */
-            size_t echo_len = line_len - 5;
-            char *echo_line = new_line + 5;
-
-            /* special case: echo 'x="y"'
-               cmd works this way: a string is printed as is, i.e., no quotes
-               are removed. But autoconf uses a command like echo 'x="y"' to
-               determine whether make works. autoconf expects the output x="y"
-               so we will do exactly that.
-               Note: if we do not allow cmd to be the default shell
-               we do not need this kind of voodoo */
-            if (echo_line[0] == '\''
-                && echo_line[echo_len - 1] == '\''
-                && strncmp (echo_line + 1, "ac_maketemp=",
-                            strlen ("ac_maketemp=")) == 0)
-              {
-                /* remove the enclosing quotes */
-                memmove (echo_line, echo_line + 1, echo_len - 2);
-                echo_line[echo_len - 2] = '\0';
-              }
-          }
-# endif
-
-        {
-          /* Let the shell decide what to do. Put the command line into the
-             2nd command line argument and hope for the best ;-)  */
-          size_t sh_len = strlen (shell);
-
-          /* exactly 3 arguments + NULL */
-          new_argv = xmalloc (4 * sizeof (char *));
-          /* Exactly strlen(shell) + strlen("/c") + strlen(line) + 3 times
-             the trailing '\0' */
-          new_argv[0] = xmalloc (sh_len + line_len + 5);
-          memcpy (new_argv[0], shell, sh_len + 1);
-          new_argv[1] = new_argv[0] + sh_len + 1;
-          memcpy (new_argv[1], "/c", 3);
-          new_argv[2] = new_argv[1] + 3;
-          memcpy (new_argv[2], new_line, line_len + 1);
-          new_argv[3] = NULL;
-        }
-      }
-#elif defined(__MSDOS__)
-    else
-      {
-        /* With MSDOS shells, we must construct the command line here
-           instead of recursively calling ourselves, because we
-           cannot backslash-escape the special characters (see above).  */
-        new_argv = xmalloc (sizeof (char *));
-        line_len = strlen (new_line) - shell_len - sflags_len - 2;
-        new_argv[0] = xmalloc (line_len + 1);
-        strncpy (new_argv[0],
-                 new_line + shell_len + sflags_len + 2, line_len);
-        new_argv[0][line_len] = '\0';
-      }
-#else
-    else
-      fatal (NILF, CSTRLEN (__FILE__) + INTSTR_LENGTH,
-             _("%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"),
-            __FILE__, __LINE__);
-#endif
-
-    free (new_line);
-  }
-#endif  /* ! AMIGA */
-
-  return new_argv;
-}
-#endif /* !VMS */
-
-/* Figure out the argument list necessary to run LINE as a command.  Try to
-   avoid using a shell.  This routine handles only ' quoting, and " quoting
-   when no backslash, $ or ' characters are seen in the quotes.  Starting
-   quotes may be escaped with a backslash.  If any of the characters in
-   sh_chars is seen, or any of the builtin commands listed in sh_cmds
-   is the first word of a line, the shell is used.
-
-   If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
-   If *RESTP is NULL, newlines will be ignored.
-
-   FILE is the target whose commands these are.  It is used for
-   variable expansion for $(SHELL) and $(IFS).  */
-
-char **
-construct_command_argv (char *line, char **restp, struct file *file,
-                        int cmd_flags, char **batch_filename)
-{
-  char *shell, *ifs, *shellflags;
-  char **argv;
-
-#ifdef VMS
-  char *cptr;
-  int argc;
-
-  argc = 0;
-  cptr = line;
-  for (;;)
-    {
-      while ((*cptr != 0) && (ISSPACE (*cptr)))
-        cptr++;
-      if (*cptr == 0)
-        break;
-      while ((*cptr != 0) && (!ISSPACE (*cptr)))
-        cptr++;
-      argc++;
-    }
-
-  argv = xmalloc (argc * sizeof (char *));
-  if (argv == 0)
-    abort ();
-
-  cptr = line;
-  argc = 0;
-  for (;;)
-    {
-      while ((*cptr != 0) && (ISSPACE (*cptr)))
-        cptr++;
-      if (*cptr == 0)
-        break;
-      DB (DB_JOBS, ("argv[%d] = [%s]\n", argc, cptr));
-      argv[argc++] = cptr;
-      while ((*cptr != 0) && (!ISSPACE (*cptr)))
-        cptr++;
-      if (*cptr != 0)
-        *cptr++ = 0;
-    }
-#else
-  {
-    /* Turn off --warn-undefined-variables while we expand SHELL and IFS.  */
-    int save = warn_undefined_variables_flag;
-    warn_undefined_variables_flag = 0;
-
-    shell = allocated_variable_expand_for_file ("$(SHELL)", file);
-#ifdef WINDOWS32
-    /*
-     * Convert to forward slashes so that construct_command_argv_internal()
-     * is not confused.
-     */
-    if (shell)
-      {
-        char *p = w32ify (shell, 0);
-        strcpy (shell, p);
-      }
-#endif
-#ifdef __EMX__
-    {
-      static const char *unixroot = NULL;
-      static const char *last_shell = "";
-      static int init = 0;
-      if (init == 0)
-        {
-          unixroot = getenv ("UNIXROOT");
-          /* unixroot must be NULL or not empty */
-          if (unixroot && unixroot[0] == '\0') unixroot = NULL;
-          init = 1;
-        }
-
-      /* if we have an unixroot drive and if shell is not default_shell
-         (which means it's either cmd.exe or the test has already been
-         performed) and if shell is an absolute path without drive letter,
-         try whether it exists e.g.: if "/bin/sh" does not exist use
-         "$UNIXROOT/bin/sh" instead.  */
-      if (unixroot && shell && strcmp (shell, last_shell) != 0
-          && (shell[0] == '/' || shell[0] == '\\'))
-        {
-          /* trying a new shell, check whether it exists */
-          size_t size = strlen (shell);
-          char *buf = xmalloc (size + 7);
-          memcpy (buf, shell, size);
-          memcpy (buf + size, ".exe", 5); /* including the trailing '\0' */
-          if (access (shell, F_OK) != 0 && access (buf, F_OK) != 0)
-            {
-              /* try the same for the unixroot drive */
-              memmove (buf + 2, buf, size + 5);
-              buf[0] = unixroot[0];
-              buf[1] = unixroot[1];
-              if (access (buf, F_OK) == 0)
-                /* we have found a shell! */
-                /* free(shell); */
-                shell = buf;
-              else
-                free (buf);
-            }
-          else
-            free (buf);
-        }
-    }
-#endif /* __EMX__ */
-
-    shellflags = allocated_variable_expand_for_file ("$(.SHELLFLAGS)", file);
-    ifs = allocated_variable_expand_for_file ("$(IFS)", file);
-
-    warn_undefined_variables_flag = save;
-  }
-
-  argv = construct_command_argv_internal (line, restp, shell, shellflags, ifs,
-                                          cmd_flags, batch_filename);
-
-  free (shell);
-  free (shellflags);
-  free (ifs);
-#endif /* !VMS */
-  return argv;
-}
-\f
-#if !defined(HAVE_DUP2) && !defined(_AMIGA)
-int
-dup2 (int old, int new)
-{
-  int fd;
-
-  (void) close (new);
-  EINTRLOOP (fd, dup (old));
-  if (fd != new)
-    {
-      (void) close (fd);
-      errno = EMFILE;
-      return -1;
-    }
-
-  return fd;
-}
-#endif /* !HAVE_DUP2 && !_AMIGA */
-
-/* On VMS systems, include special VMS functions.  */
-
-#ifdef VMS
-#include "vmsjobs.c"
-#endif
diff --git a/job.h b/job.h
deleted file mode 100644 (file)
index 37cceb6..0000000
--- a/job.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* Definitions for managing subprocesses in GNU Make.
-Copyright (C) 1992-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "output.h"
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#else
-# include <sys/file.h>
-#endif
-
-/* How to set close-on-exec for a file descriptor.  */
-
-#if !defined(F_SETFD) || !defined(F_GETFD)
-# ifdef WINDOWS32
-#  define CLOSE_ON_EXEC(_d)  process_noinherit(_d)
-# else
-#  define CLOSE_ON_EXEC(_d)
-# endif
-#else
-# ifndef FD_CLOEXEC
-#  define FD_CLOEXEC 1
-# endif
-# define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC)
-#endif
-
-#ifdef NO_OUTPUT_SYNC
-# define RECORD_SYNC_MUTEX(m) \
-    O (error, NILF,                                                    \
-       _("-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."));
-#else
-# ifdef WINDOWS32
-/* For emulations in w32/compat/posixfcn.c.  */
-#  define F_GETFD 1
-#  define F_SETLKW 2
-/* Implementation note: None of the values of l_type below can be zero
-   -- they are compared with a static instance of the struct, so zero
-   means unknown/invalid, see w32/compat/posixfcn.c. */
-#  define F_WRLCK 1
-#  define F_UNLCK 2
-
-struct flock
-  {
-    short l_type;
-    short l_whence;
-    off_t l_start;
-    off_t l_len;
-    pid_t l_pid;
-  };
-
-/* This type is actually a HANDLE, but we want to avoid including
-   windows.h as much as possible.  */
-typedef intptr_t sync_handle_t;
-
-/* Public functions emulated/provided in posixfcn.c.  */
-int fcntl (intptr_t fd, int cmd, ...);
-intptr_t create_mutex (void);
-int same_stream (FILE *f1, FILE *f2);
-
-#  define RECORD_SYNC_MUTEX(m) record_sync_mutex(m)
-void record_sync_mutex (const char *str);
-void prepare_mutex_handle_string (intptr_t hdl);
-# else  /* !WINDOWS32 */
-
-typedef int sync_handle_t;      /* file descriptor */
-
-#  define RECORD_SYNC_MUTEX(m) (void)(m)
-
-# endif
-#endif  /* !NO_OUTPUT_SYNC */
-
-/* Structure describing a running or dead child process.  */
-
-struct child
-  {
-    struct child *next;         /* Link in the chain.  */
-
-    struct file *file;          /* File being remade.  */
-
-    char **environment;         /* Environment for commands.  */
-    char *sh_batch_file;        /* Script file for shell commands */
-    char **command_lines;       /* Array of variable-expanded cmd lines.  */
-    char *command_ptr;          /* Ptr into command_lines[command_line].  */
-
-#ifdef VMS
-    char *comname;              /* Temporary command file name */
-    int efn;                    /* Completion event flag number */
-    int cstatus;                /* Completion status */
-    int vms_launch_status;      /* non-zero if lib$spawn, etc failed */
-#endif
-
-    unsigned int  command_line; /* Index into command_lines.  */
-    struct output output;       /* Output for this child.  */
-    pid_t         pid;          /* Child process's ID number.  */
-    unsigned int  remote:1;     /* Nonzero if executing remotely.  */
-    unsigned int  noerror:1;    /* Nonzero if commands contained a '-'.  */
-    unsigned int  good_stdin:1; /* Nonzero if this child has a good stdin.  */
-    unsigned int  deleted:1;    /* Nonzero if targets have been deleted.  */
-    unsigned int  recursive:1;  /* Nonzero for recursive command ('+' etc.)  */
-    unsigned int  dontcare:1;   /* Saved dontcare flag.  */
-  };
-
-extern struct child *children;
-
-/* A signal handler for SIGCHLD, if needed.  */
-RETSIGTYPE child_handler (int sig);
-int is_bourne_compatible_shell(const char *path);
-void new_job (struct file *file);
-void reap_children (int block, int err);
-void start_waiting_jobs (void);
-
-char **construct_command_argv (char *line, char **restp, struct file *file,
-                               int cmd_flags, char** batch_file);
-
-#ifdef VMS
-int child_execute_job (struct child *child, char *argv);
-#else
-# define FD_STDIN       (fileno (stdin))
-# define FD_STDOUT      (fileno (stdout))
-# define FD_STDERR      (fileno (stderr))
-int child_execute_job (struct output *out, int good_stdin, char **argv, char **envp);
-#endif
-
-#ifdef _AMIGA
-void exec_command (char **argv) __attribute__ ((noreturn));
-#elif defined(__EMX__)
-int exec_command (char **argv, char **envp);
-#else
-void exec_command (char **argv, char **envp) __attribute__ ((noreturn));
-#endif
-
-extern unsigned int job_slots_used;
-
-void block_sigs (void);
-#ifdef POSIX
-void unblock_sigs (void);
-#else
-#ifdef  HAVE_SIGSETMASK
-extern int fatal_signal_mask;
-#define unblock_sigs()  sigsetmask (0)
-#else
-#define unblock_sigs()
-#endif
-#endif
-
-extern unsigned int jobserver_tokens;
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644 (file)
index 0000000..6e4c1f0
--- /dev/null
@@ -0,0 +1,1169 @@
+## DO NOT EDIT! GENERATED AUTOMATICALLY!
+## Process this file with automake to produce Makefile.in.
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by:
+# gnulib-tool --import --local-dir=gl \
+#  --lib=libgnu \
+#  --source-base=lib \
+#  --m4-base=m4 \
+#  --doc-base=doc \
+#  --tests-base=tests \
+#  --aux-dir=build-aux \
+#  --no-conditional-dependencies \
+#  --no-libtool \
+#  --macro-prefix=gl \
+#  alloca \
+#  fdl \
+#  findprog-in \
+#  getloadavg \
+#  host-cpu-c-abi \
+#  make-glob \
+#  strerror
+
+AUTOMAKE_OPTIONS = 1.11 gnits
+
+SUBDIRS =
+noinst_HEADERS =
+noinst_LIBRARIES =
+noinst_LTLIBRARIES =
+EXTRA_DIST =
+BUILT_SOURCES =
+SUFFIXES =
+MOSTLYCLEANFILES = core *.stackdump
+MOSTLYCLEANDIRS =
+CLEANFILES =
+DISTCLEANFILES =
+MAINTAINERCLEANFILES =
+# No GNU Make output.
+
+AM_CPPFLAGS =
+AM_CFLAGS =
+
+noinst_LIBRARIES += libgnu.a
+
+libgnu_a_SOURCES =
+libgnu_a_LIBADD = $(gl_LIBOBJS)
+libgnu_a_DEPENDENCIES = $(gl_LIBOBJS)
+EXTRA_libgnu_a_SOURCES =
+
+## begin gnulib module absolute-header
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER)
+
+## end   gnulib module absolute-header
+
+## begin gnulib module access
+
+
+EXTRA_DIST += access.c
+
+EXTRA_libgnu_a_SOURCES += access.c
+
+## end   gnulib module access
+
+## begin gnulib module alloca
+
+
+libgnu_a_LIBADD += @ALLOCA@
+libgnu_a_DEPENDENCIES += @ALLOCA@
+EXTRA_DIST += alloca.c
+
+EXTRA_libgnu_a_SOURCES += alloca.c
+
+## end   gnulib module alloca
+
+## begin gnulib module alloca-opt
+
+BUILT_SOURCES += $(ALLOCA_H)
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_ALLOCA_H
+alloca.h: alloca.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' < $(srcdir)/alloca.in.h; \
+       } > $@-t && \
+       mv -f $@-t $@
+else
+alloca.h: $(top_builddir)/config.status
+       rm -f $@
+endif
+MOSTLYCLEANFILES += alloca.h alloca.h-t
+
+EXTRA_DIST += alloca.in.h
+
+## end   gnulib module alloca-opt
+
+## begin gnulib module close
+
+
+EXTRA_DIST += close.c
+
+EXTRA_libgnu_a_SOURCES += close.c
+
+## end   gnulib module close
+
+## begin gnulib module concat-filename
+
+libgnu_a_SOURCES += concat-filename.c
+
+EXTRA_DIST += concat-filename.h
+
+## end   gnulib module concat-filename
+
+## begin gnulib module dirname-lgpl
+
+libgnu_a_SOURCES += dirname-lgpl.c basename-lgpl.c stripslash.c
+
+EXTRA_DIST += dirname.h
+
+## end   gnulib module dirname-lgpl
+
+## begin gnulib module dosname
+
+
+EXTRA_DIST += dosname.h
+
+## end   gnulib module dosname
+
+## begin gnulib module dup2
+
+
+EXTRA_DIST += dup2.c
+
+EXTRA_libgnu_a_SOURCES += dup2.c
+
+## end   gnulib module dup2
+
+## begin gnulib module errno
+
+BUILT_SOURCES += $(ERRNO_H)
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+if GL_GENERATE_ERRNO_H
+errno.h: errno.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+             -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+             -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+             -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+             -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+             -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+             -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+             < $(srcdir)/errno.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+else
+errno.h: $(top_builddir)/config.status
+       rm -f $@
+endif
+MOSTLYCLEANFILES += errno.h errno.h-t
+
+EXTRA_DIST += errno.in.h
+
+## end   gnulib module errno
+
+## begin gnulib module error
+
+
+EXTRA_DIST += error.c error.h
+
+EXTRA_libgnu_a_SOURCES += error.c
+
+## end   gnulib module error
+
+## begin gnulib module exitfail
+
+libgnu_a_SOURCES += exitfail.c
+
+EXTRA_DIST += exitfail.h
+
+## end   gnulib module exitfail
+
+## begin gnulib module fcntl
+
+
+EXTRA_DIST += fcntl.c
+
+EXTRA_libgnu_a_SOURCES += fcntl.c
+
+## end   gnulib module fcntl
+
+## begin gnulib module fcntl-h
+
+BUILT_SOURCES += fcntl.h
+
+# We need the following in order to create <fcntl.h> when the system
+# doesn't have one that works with the given compiler.
+fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
+             -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \
+             -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
+             -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
+             -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
+             -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
+             -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
+             -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
+             -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \
+             -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
+             -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
+             -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+             < $(srcdir)/fcntl.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+MOSTLYCLEANFILES += fcntl.h fcntl.h-t
+
+EXTRA_DIST += fcntl.in.h
+
+## end   gnulib module fcntl-h
+
+## begin gnulib module fd-hook
+
+libgnu_a_SOURCES += fd-hook.c
+
+EXTRA_DIST += fd-hook.h
+
+## end   gnulib module fd-hook
+
+## begin gnulib module filename
+
+
+EXTRA_DIST += filename.h
+
+## end   gnulib module filename
+
+## begin gnulib module findprog-in
+
+libgnu_a_SOURCES += findprog.h findprog-in.c
+
+## end   gnulib module findprog-in
+
+## begin gnulib module getdtablesize
+
+
+EXTRA_DIST += getdtablesize.c
+
+EXTRA_libgnu_a_SOURCES += getdtablesize.c
+
+## end   gnulib module getdtablesize
+
+## begin gnulib module getloadavg
+
+
+EXTRA_DIST += getloadavg.c
+
+EXTRA_libgnu_a_SOURCES += getloadavg.c
+
+## end   gnulib module getloadavg
+
+## begin gnulib module getprogname
+
+libgnu_a_SOURCES += getprogname.h getprogname.c
+
+## end   gnulib module getprogname
+
+## begin gnulib module gettext-h
+
+libgnu_a_SOURCES += gettext.h
+
+## end   gnulib module gettext-h
+
+## begin gnulib module intprops
+
+
+EXTRA_DIST += intprops.h
+
+## end   gnulib module intprops
+
+## begin gnulib module limits-h
+
+BUILT_SOURCES += $(LIMITS_H)
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+if GL_GENERATE_LIMITS_H
+limits.h: limits.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+             < $(srcdir)/limits.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+else
+limits.h: $(top_builddir)/config.status
+       rm -f $@
+endif
+MOSTLYCLEANFILES += limits.h limits.h-t
+
+EXTRA_DIST += limits.in.h
+
+## end   gnulib module limits-h
+
+## begin gnulib module make-glob
+
+if !USE_SYSTEM_GLOB
+libgnu_a_SOURCES += fnmatch.c
+
+BUILT_SOURCES += fnmatch.h
+
+fnmatch.h: fnmatch.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         cat $(srcdir)/fnmatch.in.h; \
+       } > $@-t && \
+       mv -f $@-t $@
+
+MOSTLYCLEANFILES += fnmatch.h fnmatch.h-t
+
+libgnu_a_SOURCES += glob.c
+
+BUILT_SOURCES += glob.h
+
+glob.h: glob.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         cat $(srcdir)/glob.in.h; \
+       } > $@-t && \
+       mv -f $@-t $@
+
+MOSTLYCLEANFILES += glob.h glob.h-t
+endif
+
+EXTRA_DIST += fnmatch.in.h glob.in.h
+
+
+## end   gnulib module make-glob
+
+## begin gnulib module malloc-posix
+
+
+EXTRA_DIST += malloc.c
+
+EXTRA_libgnu_a_SOURCES += malloc.c
+
+## end   gnulib module malloc-posix
+
+## begin gnulib module msvc-inval
+
+
+EXTRA_DIST += msvc-inval.c msvc-inval.h
+
+EXTRA_libgnu_a_SOURCES += msvc-inval.c
+
+## end   gnulib module msvc-inval
+
+## begin gnulib module msvc-nothrow
+
+
+EXTRA_DIST += msvc-nothrow.c msvc-nothrow.h
+
+EXTRA_libgnu_a_SOURCES += msvc-nothrow.c
+
+## end   gnulib module msvc-nothrow
+
+## begin gnulib module snippet/_Noreturn
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+_NORETURN_H=$(srcdir)/_Noreturn.h
+
+EXTRA_DIST += _Noreturn.h
+
+## end   gnulib module snippet/_Noreturn
+
+## begin gnulib module snippet/arg-nonnull
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+ARG_NONNULL_H=$(srcdir)/arg-nonnull.h
+
+EXTRA_DIST += arg-nonnull.h
+
+## end   gnulib module snippet/arg-nonnull
+
+## begin gnulib module snippet/c++defs
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+CXXDEFS_H=$(srcdir)/c++defs.h
+
+EXTRA_DIST += c++defs.h
+
+## end   gnulib module snippet/c++defs
+
+## begin gnulib module snippet/warn-on-use
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+
+WARN_ON_USE_H=$(srcdir)/warn-on-use.h
+
+EXTRA_DIST += warn-on-use.h
+
+## end   gnulib module snippet/warn-on-use
+
+## begin gnulib module stdbool
+
+BUILT_SOURCES += $(STDBOOL_H)
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+if GL_GENERATE_STDBOOL_H
+stdbool.h: stdbool.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+else
+stdbool.h: $(top_builddir)/config.status
+       rm -f $@
+endif
+MOSTLYCLEANFILES += stdbool.h stdbool.h-t
+
+EXTRA_DIST += stdbool.in.h
+
+## end   gnulib module stdbool
+
+## begin gnulib module stddef
+
+BUILT_SOURCES += $(STDDEF_H)
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDDEF_H
+stddef.h: stddef.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+             -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+             -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+             -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+             < $(srcdir)/stddef.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+else
+stddef.h: $(top_builddir)/config.status
+       rm -f $@
+endif
+MOSTLYCLEANFILES += stddef.h stddef.h-t
+
+EXTRA_DIST += stddef.in.h
+
+## end   gnulib module stddef
+
+## begin gnulib module stdint
+
+BUILT_SOURCES += $(STDINT_H)
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+if GL_GENERATE_STDINT_H
+stdint.h: stdint.in.h $(top_builddir)/config.status
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+             -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+             -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+             -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+             -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+             -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+             -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+             -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+             -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+             -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+             -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+             -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+             -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+             -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+             -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+             -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+             -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+             -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+             -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+             -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+             -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+             -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+             < $(srcdir)/stdint.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+else
+stdint.h: $(top_builddir)/config.status
+       rm -f $@
+endif
+MOSTLYCLEANFILES += stdint.h stdint.h-t
+
+EXTRA_DIST += stdint.in.h
+
+## end   gnulib module stdint
+
+## begin gnulib module stdio
+
+BUILT_SOURCES += stdio.h
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+             -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \
+             -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \
+             -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \
+             -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \
+             -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \
+             -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \
+             -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \
+             -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \
+             -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \
+             -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \
+             -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \
+             -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \
+             -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \
+             -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \
+             -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \
+             -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \
+             -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \
+             -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \
+             -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \
+             -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \
+             -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \
+             -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \
+             -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \
+             -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \
+             -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \
+             -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \
+             -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \
+             -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \
+             -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \
+             -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \
+             -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \
+             -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \
+             -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \
+             -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \
+             -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \
+             -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \
+             -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \
+             -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \
+             -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \
+             -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \
+             -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \
+             -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \
+             -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \
+             -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \
+             -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \
+             -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
+             -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
+             < $(srcdir)/stdio.in.h | \
+         sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+             -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
+             -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
+             -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+             -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+             -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+             -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+             -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+             -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+             -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
+             -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
+             -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \
+             -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \
+             -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+             -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+             -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+             -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+             -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+             -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \
+             -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+             -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+             -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+             -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+             -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+             -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+             -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+             -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+             -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+             -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+             -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+             -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+             -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+             -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+             -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+             -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+             -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+             -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+             -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+             -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+             -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \
+             -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+             -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \
+             -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+             -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+             -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+             -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+             -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+             -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+             -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+       } > $@-t && \
+       mv $@-t $@
+MOSTLYCLEANFILES += stdio.h stdio.h-t
+
+EXTRA_DIST += stdio.in.h
+
+## end   gnulib module stdio
+
+## begin gnulib module stdlib
+
+BUILT_SOURCES += stdlib.h
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+  $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+             -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
+             -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
+             -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
+             -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
+             -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
+             -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
+             -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
+             -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
+             -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
+             -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
+             -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
+             -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
+             -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
+             -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
+             -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
+             -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
+             -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
+             -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
+             -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
+             -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
+             -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
+             -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
+             -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \
+             -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
+             -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
+             -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
+             -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
+             -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
+             -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \
+             -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
+             -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
+             -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
+             -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
+             -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
+             -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+             < $(srcdir)/stdlib.in.h | \
+         sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+             -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+             -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+             -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+             -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+             -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+             -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
+             -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \
+             -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \
+             -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+             -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+             -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+             -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+             -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+             -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+             -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+             -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+             -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+             -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+             -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+             -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+             -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \
+             -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+             -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+             -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+             -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+             -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
+             -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
+             -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+             -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
+             -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+             -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+             -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+             -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+             -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+             -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+             -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
+             -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+             -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
+             -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
+             -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+             -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+             -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+             -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+             -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+             -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+             -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
+             -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+             -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+             -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+             -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+             -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
+             -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+             -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+             -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+             -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+       } > $@-t && \
+       mv $@-t $@
+MOSTLYCLEANFILES += stdlib.h stdlib.h-t
+
+EXTRA_DIST += stdlib.in.h
+
+## end   gnulib module stdlib
+
+## begin gnulib module stpcpy
+
+
+EXTRA_DIST += stpcpy.c
+
+EXTRA_libgnu_a_SOURCES += stpcpy.c
+
+## end   gnulib module stpcpy
+
+## begin gnulib module strerror
+
+
+EXTRA_DIST += strerror.c
+
+EXTRA_libgnu_a_SOURCES += strerror.c
+
+## end   gnulib module strerror
+
+## begin gnulib module strerror-override
+
+
+EXTRA_DIST += strerror-override.c strerror-override.h
+
+EXTRA_libgnu_a_SOURCES += strerror-override.c
+
+## end   gnulib module strerror-override
+
+## begin gnulib module string
+
+BUILT_SOURCES += string.h
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+             -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \
+             -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
+             -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
+             -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
+             -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
+             -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
+             -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
+             -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
+             -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
+             -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
+             -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
+             -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
+             -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
+             -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
+             -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
+             -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
+             -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
+             -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
+             -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
+             -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
+             -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
+             -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
+             -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
+             -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
+             -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
+             -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
+             -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
+             -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
+             -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
+             -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
+             -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
+             -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
+             -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
+             -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
+             -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
+             -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
+             -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
+             -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+             < $(srcdir)/string.in.h | \
+         sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
+             -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+             -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+             -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+             -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \
+             -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+             -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+             -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+             -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+             -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+             -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+             -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+             -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+             -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+             -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+             -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+             -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+             -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+             -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+             -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+             -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+             -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+             -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+             -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+             -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+             -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+             -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+             -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+             -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+             -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+             -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+             -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+             -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+             -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+             -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+             -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+             -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+             < $(srcdir)/string.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+MOSTLYCLEANFILES += string.h string.h-t
+
+EXTRA_DIST += string.in.h
+
+## end   gnulib module string
+
+## begin gnulib module sys_types
+
+BUILT_SOURCES += sys/types.h
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+sys/types.h: sys_types.in.h $(top_builddir)/config.status
+       $(AM_V_at)$(MKDIR_P) sys
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+             -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+             -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \
+             < $(srcdir)/sys_types.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+MOSTLYCLEANFILES += sys/types.h sys/types.h-t
+
+EXTRA_DIST += sys_types.in.h
+
+## end   gnulib module sys_types
+
+## begin gnulib module unistd
+
+BUILT_SOURCES += unistd.h
+libgnu_a_SOURCES += unistd.c
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+             -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+             -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \
+             -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
+             -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
+             -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+             -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \
+             -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
+             -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
+             -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
+             -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
+             -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
+             -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
+             -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
+             -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
+             -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
+             -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
+             -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
+             -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
+             -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
+             -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
+             -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
+             -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
+             -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
+             -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
+             -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
+             -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \
+             -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
+             -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
+             -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
+             -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
+             -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
+             -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
+             -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
+             -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
+             -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
+             -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
+             -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
+             -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
+             -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
+             -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
+             -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
+             -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
+             -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
+             -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
+             -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
+             -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
+             -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
+             -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
+             -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
+             -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
+             -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
+             -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
+             -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
+             -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+             < $(srcdir)/unistd.in.h | \
+         sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+             -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
+             -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
+             -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+             -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+             -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+             -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+             -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+             -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+             -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+             -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+             -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+             -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+             -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+             -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+             -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \
+             -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+             -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+             -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+             -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+             -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+             -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+             -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+             -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+             -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+             -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+             -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+             -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+             -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+             -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+             -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+             -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+             -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+             -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+             -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+             -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+             -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+             -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+             -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+             -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+             -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+             -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \
+             -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+             -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+             -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+         | \
+         sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \
+             -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+             -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+             -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+             -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+             -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
+             -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+             -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+             -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+             -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+             -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+             -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+             -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+             -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+             -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \
+             -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+             -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+             -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+             -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+             -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+             -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+             -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+             -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+             -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+             -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+             -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+             -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+             -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+             -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+             -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \
+             -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+             -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+             -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+             -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+             -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+             -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+             -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+       } > $@-t && \
+       mv $@-t $@
+MOSTLYCLEANFILES += unistd.h unistd.h-t
+
+EXTRA_DIST += unistd.in.h
+
+## end   gnulib module unistd
+
+## begin gnulib module verify
+
+
+EXTRA_DIST += verify.h
+
+## end   gnulib module verify
+
+## begin gnulib module xalloc
+
+libgnu_a_SOURCES += xmalloc.c
+
+EXTRA_DIST += xalloc.h
+
+## end   gnulib module xalloc
+
+## begin gnulib module xalloc-die
+
+libgnu_a_SOURCES += xalloc-die.c
+
+## end   gnulib module xalloc-die
+
+## begin gnulib module xalloc-oversized
+
+
+EXTRA_DIST += xalloc-oversized.h
+
+## end   gnulib module xalloc-oversized
+
+## begin gnulib module xconcat-filename
+
+libgnu_a_SOURCES += xconcat-filename.c
+
+EXTRA_DIST += concat-filename.h
+
+## end   gnulib module xconcat-filename
+
+
+mostlyclean-local: mostlyclean-generic
+       @for dir in '' $(MOSTLYCLEANDIRS); do \
+         if test -n "$$dir" && test -d $$dir; then \
+           echo "rmdir $$dir"; rmdir $$dir; \
+         fi; \
+       done; \
+       :
diff --git a/lib/Makefile.in b/lib/Makefile.in
new file mode 100644 (file)
index 0000000..0e33730
--- /dev/null
@@ -0,0 +1,2118 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+# Reproduce by:
+# gnulib-tool --import --local-dir=gl \
+#  --lib=libgnu \
+#  --source-base=lib \
+#  --m4-base=m4 \
+#  --doc-base=doc \
+#  --tests-base=tests \
+#  --aux-dir=build-aux \
+#  --no-conditional-dependencies \
+#  --no-libtool \
+#  --macro-prefix=gl \
+#  alloca \
+#  fdl \
+#  findprog-in \
+#  getloadavg \
+#  host-cpu-c-abi \
+#  make-glob \
+#  strerror
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@USE_SYSTEM_GLOB_FALSE@am__append_1 = fnmatch.c glob.c
+@USE_SYSTEM_GLOB_FALSE@am__append_2 = fnmatch.h glob.h
+@USE_SYSTEM_GLOB_FALSE@am__append_3 = fnmatch.h fnmatch.h-t glob.h \
+@USE_SYSTEM_GLOB_FALSE@        glob.h-t
+subdir = lib
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \
+       $(top_srcdir)/m4/absolute-header.m4 $(top_srcdir)/m4/access.m4 \
+       $(top_srcdir)/m4/acinclude.m4 $(top_srcdir)/m4/alloca.m4 \
+       $(top_srcdir)/m4/asm-underscore.m4 $(top_srcdir)/m4/close.m4 \
+       $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dospaths.m4 \
+       $(top_srcdir)/m4/double-slash-root.m4 $(top_srcdir)/m4/dup2.m4 \
+       $(top_srcdir)/m4/eaccess.m4 $(top_srcdir)/m4/errno_h.m4 \
+       $(top_srcdir)/m4/error.m4 $(top_srcdir)/m4/extensions.m4 \
+       $(top_srcdir)/m4/extern-inline.m4 $(top_srcdir)/m4/fcntl-o.m4 \
+       $(top_srcdir)/m4/fcntl.m4 $(top_srcdir)/m4/fcntl_h.m4 \
+       $(top_srcdir)/m4/findprog-in.m4 \
+       $(top_srcdir)/m4/getdtablesize.m4 \
+       $(top_srcdir)/m4/getloadavg.m4 $(top_srcdir)/m4/getprogname.m4 \
+       $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gnulib-common.m4 \
+       $(top_srcdir)/m4/gnulib-comp.m4 \
+       $(top_srcdir)/m4/host-cpu-c-abi.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/include_next.m4 \
+       $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \
+       $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+       $(top_srcdir)/m4/limits-h.m4 $(top_srcdir)/m4/longlong.m4 \
+       $(top_srcdir)/m4/malloc.m4 $(top_srcdir)/m4/msvc-inval.m4 \
+       $(top_srcdir)/m4/msvc-nothrow.m4 $(top_srcdir)/m4/multiarch.m4 \
+       $(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/off_t.m4 \
+       $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/ssize_t.m4 $(top_srcdir)/m4/stdbool.m4 \
+       $(top_srcdir)/m4/stddef_h.m4 $(top_srcdir)/m4/stdint.m4 \
+       $(top_srcdir)/m4/stdio_h.m4 $(top_srcdir)/m4/stdlib_h.m4 \
+       $(top_srcdir)/m4/stpcpy.m4 $(top_srcdir)/m4/strerror.m4 \
+       $(top_srcdir)/m4/string_h.m4 $(top_srcdir)/m4/sys_socket_h.m4 \
+       $(top_srcdir)/m4/sys_types_h.m4 $(top_srcdir)/m4/unistd_h.m4 \
+       $(top_srcdir)/m4/warn-on-use.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xalloc.m4 \
+       $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+       $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libgnu_a_AR = $(AR) $(ARFLAGS)
+am__DEPENDENCIES_1 =
+am__libgnu_a_SOURCES_DIST = concat-filename.c dirname-lgpl.c \
+       basename-lgpl.c stripslash.c exitfail.c fd-hook.c findprog.h \
+       findprog-in.c getprogname.h getprogname.c gettext.h fnmatch.c \
+       glob.c unistd.c xmalloc.c xalloc-die.c xconcat-filename.c
+@USE_SYSTEM_GLOB_FALSE@am__objects_1 = fnmatch.$(OBJEXT) \
+@USE_SYSTEM_GLOB_FALSE@        glob.$(OBJEXT)
+am_libgnu_a_OBJECTS = concat-filename.$(OBJEXT) dirname-lgpl.$(OBJEXT) \
+       basename-lgpl.$(OBJEXT) stripslash.$(OBJEXT) \
+       exitfail.$(OBJEXT) fd-hook.$(OBJEXT) findprog-in.$(OBJEXT) \
+       getprogname.$(OBJEXT) $(am__objects_1) unistd.$(OBJEXT) \
+       xmalloc.$(OBJEXT) xalloc-die.$(OBJEXT) \
+       xconcat-filename.$(OBJEXT)
+libgnu_a_OBJECTS = $(am_libgnu_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/access.Po ./$(DEPDIR)/alloca.Po \
+       ./$(DEPDIR)/basename-lgpl.Po ./$(DEPDIR)/close.Po \
+       ./$(DEPDIR)/concat-filename.Po ./$(DEPDIR)/dirname-lgpl.Po \
+       ./$(DEPDIR)/dup2.Po ./$(DEPDIR)/error.Po \
+       ./$(DEPDIR)/exitfail.Po ./$(DEPDIR)/fcntl.Po \
+       ./$(DEPDIR)/fd-hook.Po ./$(DEPDIR)/findprog-in.Po \
+       ./$(DEPDIR)/fnmatch.Po ./$(DEPDIR)/getdtablesize.Po \
+       ./$(DEPDIR)/getloadavg.Po ./$(DEPDIR)/getprogname.Po \
+       ./$(DEPDIR)/glob.Po ./$(DEPDIR)/malloc.Po \
+       ./$(DEPDIR)/msvc-inval.Po ./$(DEPDIR)/msvc-nothrow.Po \
+       ./$(DEPDIR)/stpcpy.Po ./$(DEPDIR)/strerror-override.Po \
+       ./$(DEPDIR)/strerror.Po ./$(DEPDIR)/stripslash.Po \
+       ./$(DEPDIR)/unistd.Po ./$(DEPDIR)/xalloc-die.Po \
+       ./$(DEPDIR)/xconcat-filename.Po ./$(DEPDIR)/xmalloc.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libgnu_a_SOURCES) $(EXTRA_libgnu_a_SOURCES)
+DIST_SOURCES = $(am__libgnu_a_SOURCES_DIST) $(EXTRA_libgnu_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+       ctags-recursive dvi-recursive html-recursive info-recursive \
+       install-data-recursive install-dvi-recursive \
+       install-exec-recursive install-html-recursive \
+       install-info-recursive install-pdf-recursive \
+       install-ps-recursive install-recursive installcheck-recursive \
+       installdirs-recursive pdf-recursive ps-recursive \
+       tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive        \
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+       distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+       $(top_srcdir)/build-aux/depcomp alloca.c
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+ALLOCA_H = @ALLOCA_H@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_LDFLAGS = @AM_LDFLAGS@
+APPLE_UNIVERSAL_BUILD = @APPLE_UNIVERSAL_BUILD@
+AR = @AR@
+ARFLAGS = @ARFLAGS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BITSIZEOF_PTRDIFF_T = @BITSIZEOF_PTRDIFF_T@
+BITSIZEOF_SIG_ATOMIC_T = @BITSIZEOF_SIG_ATOMIC_T@
+BITSIZEOF_SIZE_T = @BITSIZEOF_SIZE_T@
+BITSIZEOF_WCHAR_T = @BITSIZEOF_WCHAR_T@
+BITSIZEOF_WINT_T = @BITSIZEOF_WINT_T@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EMULTIHOP_HIDDEN = @EMULTIHOP_HIDDEN@
+EMULTIHOP_VALUE = @EMULTIHOP_VALUE@
+ENOLINK_HIDDEN = @ENOLINK_HIDDEN@
+ENOLINK_VALUE = @ENOLINK_VALUE@
+EOVERFLOW_HIDDEN = @EOVERFLOW_HIDDEN@
+EOVERFLOW_VALUE = @EOVERFLOW_VALUE@
+ERRNO_H = @ERRNO_H@
+EXEEXT = @EXEEXT@
+GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNULIB_ACCESS = @GNULIB_ACCESS@
+GNULIB_ATOLL = @GNULIB_ATOLL@
+GNULIB_CALLOC_POSIX = @GNULIB_CALLOC_POSIX@
+GNULIB_CANONICALIZE_FILE_NAME = @GNULIB_CANONICALIZE_FILE_NAME@
+GNULIB_CHDIR = @GNULIB_CHDIR@
+GNULIB_CHOWN = @GNULIB_CHOWN@
+GNULIB_CLOSE = @GNULIB_CLOSE@
+GNULIB_COPY_FILE_RANGE = @GNULIB_COPY_FILE_RANGE@
+GNULIB_CREAT = @GNULIB_CREAT@
+GNULIB_DPRINTF = @GNULIB_DPRINTF@
+GNULIB_DUP = @GNULIB_DUP@
+GNULIB_DUP2 = @GNULIB_DUP2@
+GNULIB_DUP3 = @GNULIB_DUP3@
+GNULIB_ENVIRON = @GNULIB_ENVIRON@
+GNULIB_EUIDACCESS = @GNULIB_EUIDACCESS@
+GNULIB_EXPLICIT_BZERO = @GNULIB_EXPLICIT_BZERO@
+GNULIB_FACCESSAT = @GNULIB_FACCESSAT@
+GNULIB_FCHDIR = @GNULIB_FCHDIR@
+GNULIB_FCHOWNAT = @GNULIB_FCHOWNAT@
+GNULIB_FCLOSE = @GNULIB_FCLOSE@
+GNULIB_FCNTL = @GNULIB_FCNTL@
+GNULIB_FDATASYNC = @GNULIB_FDATASYNC@
+GNULIB_FDOPEN = @GNULIB_FDOPEN@
+GNULIB_FFLUSH = @GNULIB_FFLUSH@
+GNULIB_FFSL = @GNULIB_FFSL@
+GNULIB_FFSLL = @GNULIB_FFSLL@
+GNULIB_FGETC = @GNULIB_FGETC@
+GNULIB_FGETS = @GNULIB_FGETS@
+GNULIB_FOPEN = @GNULIB_FOPEN@
+GNULIB_FPRINTF = @GNULIB_FPRINTF@
+GNULIB_FPRINTF_POSIX = @GNULIB_FPRINTF_POSIX@
+GNULIB_FPURGE = @GNULIB_FPURGE@
+GNULIB_FPUTC = @GNULIB_FPUTC@
+GNULIB_FPUTS = @GNULIB_FPUTS@
+GNULIB_FREAD = @GNULIB_FREAD@
+GNULIB_FREOPEN = @GNULIB_FREOPEN@
+GNULIB_FSCANF = @GNULIB_FSCANF@
+GNULIB_FSEEK = @GNULIB_FSEEK@
+GNULIB_FSEEKO = @GNULIB_FSEEKO@
+GNULIB_FSYNC = @GNULIB_FSYNC@
+GNULIB_FTELL = @GNULIB_FTELL@
+GNULIB_FTELLO = @GNULIB_FTELLO@
+GNULIB_FTRUNCATE = @GNULIB_FTRUNCATE@
+GNULIB_FWRITE = @GNULIB_FWRITE@
+GNULIB_GETC = @GNULIB_GETC@
+GNULIB_GETCHAR = @GNULIB_GETCHAR@
+GNULIB_GETCWD = @GNULIB_GETCWD@
+GNULIB_GETDELIM = @GNULIB_GETDELIM@
+GNULIB_GETDOMAINNAME = @GNULIB_GETDOMAINNAME@
+GNULIB_GETDTABLESIZE = @GNULIB_GETDTABLESIZE@
+GNULIB_GETGROUPS = @GNULIB_GETGROUPS@
+GNULIB_GETHOSTNAME = @GNULIB_GETHOSTNAME@
+GNULIB_GETLINE = @GNULIB_GETLINE@
+GNULIB_GETLOADAVG = @GNULIB_GETLOADAVG@
+GNULIB_GETLOGIN = @GNULIB_GETLOGIN@
+GNULIB_GETLOGIN_R = @GNULIB_GETLOGIN_R@
+GNULIB_GETPAGESIZE = @GNULIB_GETPAGESIZE@
+GNULIB_GETPASS = @GNULIB_GETPASS@
+GNULIB_GETSUBOPT = @GNULIB_GETSUBOPT@
+GNULIB_GETUSERSHELL = @GNULIB_GETUSERSHELL@
+GNULIB_GRANTPT = @GNULIB_GRANTPT@
+GNULIB_GROUP_MEMBER = @GNULIB_GROUP_MEMBER@
+GNULIB_ISATTY = @GNULIB_ISATTY@
+GNULIB_LCHOWN = @GNULIB_LCHOWN@
+GNULIB_LINK = @GNULIB_LINK@
+GNULIB_LINKAT = @GNULIB_LINKAT@
+GNULIB_LSEEK = @GNULIB_LSEEK@
+GNULIB_MALLOC_POSIX = @GNULIB_MALLOC_POSIX@
+GNULIB_MBSCASECMP = @GNULIB_MBSCASECMP@
+GNULIB_MBSCASESTR = @GNULIB_MBSCASESTR@
+GNULIB_MBSCHR = @GNULIB_MBSCHR@
+GNULIB_MBSCSPN = @GNULIB_MBSCSPN@
+GNULIB_MBSLEN = @GNULIB_MBSLEN@
+GNULIB_MBSNCASECMP = @GNULIB_MBSNCASECMP@
+GNULIB_MBSNLEN = @GNULIB_MBSNLEN@
+GNULIB_MBSPBRK = @GNULIB_MBSPBRK@
+GNULIB_MBSPCASECMP = @GNULIB_MBSPCASECMP@
+GNULIB_MBSRCHR = @GNULIB_MBSRCHR@
+GNULIB_MBSSEP = @GNULIB_MBSSEP@
+GNULIB_MBSSPN = @GNULIB_MBSSPN@
+GNULIB_MBSSTR = @GNULIB_MBSSTR@
+GNULIB_MBSTOK_R = @GNULIB_MBSTOK_R@
+GNULIB_MBTOWC = @GNULIB_MBTOWC@
+GNULIB_MEMCHR = @GNULIB_MEMCHR@
+GNULIB_MEMMEM = @GNULIB_MEMMEM@
+GNULIB_MEMPCPY = @GNULIB_MEMPCPY@
+GNULIB_MEMRCHR = @GNULIB_MEMRCHR@
+GNULIB_MKDTEMP = @GNULIB_MKDTEMP@
+GNULIB_MKOSTEMP = @GNULIB_MKOSTEMP@
+GNULIB_MKOSTEMPS = @GNULIB_MKOSTEMPS@
+GNULIB_MKSTEMP = @GNULIB_MKSTEMP@
+GNULIB_MKSTEMPS = @GNULIB_MKSTEMPS@
+GNULIB_NONBLOCKING = @GNULIB_NONBLOCKING@
+GNULIB_OBSTACK_PRINTF = @GNULIB_OBSTACK_PRINTF@
+GNULIB_OBSTACK_PRINTF_POSIX = @GNULIB_OBSTACK_PRINTF_POSIX@
+GNULIB_OPEN = @GNULIB_OPEN@
+GNULIB_OPENAT = @GNULIB_OPENAT@
+GNULIB_OVERRIDES_WINT_T = @GNULIB_OVERRIDES_WINT_T@
+GNULIB_PCLOSE = @GNULIB_PCLOSE@
+GNULIB_PERROR = @GNULIB_PERROR@
+GNULIB_PIPE = @GNULIB_PIPE@
+GNULIB_PIPE2 = @GNULIB_PIPE2@
+GNULIB_POPEN = @GNULIB_POPEN@
+GNULIB_POSIX_OPENPT = @GNULIB_POSIX_OPENPT@
+GNULIB_PREAD = @GNULIB_PREAD@
+GNULIB_PRINTF = @GNULIB_PRINTF@
+GNULIB_PRINTF_POSIX = @GNULIB_PRINTF_POSIX@
+GNULIB_PTSNAME = @GNULIB_PTSNAME@
+GNULIB_PTSNAME_R = @GNULIB_PTSNAME_R@
+GNULIB_PUTC = @GNULIB_PUTC@
+GNULIB_PUTCHAR = @GNULIB_PUTCHAR@
+GNULIB_PUTENV = @GNULIB_PUTENV@
+GNULIB_PUTS = @GNULIB_PUTS@
+GNULIB_PWRITE = @GNULIB_PWRITE@
+GNULIB_QSORT_R = @GNULIB_QSORT_R@
+GNULIB_RANDOM = @GNULIB_RANDOM@
+GNULIB_RANDOM_R = @GNULIB_RANDOM_R@
+GNULIB_RAWMEMCHR = @GNULIB_RAWMEMCHR@
+GNULIB_READ = @GNULIB_READ@
+GNULIB_READLINK = @GNULIB_READLINK@
+GNULIB_READLINKAT = @GNULIB_READLINKAT@
+GNULIB_REALLOCARRAY = @GNULIB_REALLOCARRAY@
+GNULIB_REALLOC_POSIX = @GNULIB_REALLOC_POSIX@
+GNULIB_REALPATH = @GNULIB_REALPATH@
+GNULIB_REMOVE = @GNULIB_REMOVE@
+GNULIB_RENAME = @GNULIB_RENAME@
+GNULIB_RENAMEAT = @GNULIB_RENAMEAT@
+GNULIB_RMDIR = @GNULIB_RMDIR@
+GNULIB_RPMATCH = @GNULIB_RPMATCH@
+GNULIB_SCANF = @GNULIB_SCANF@
+GNULIB_SECURE_GETENV = @GNULIB_SECURE_GETENV@
+GNULIB_SETENV = @GNULIB_SETENV@
+GNULIB_SETHOSTNAME = @GNULIB_SETHOSTNAME@
+GNULIB_SLEEP = @GNULIB_SLEEP@
+GNULIB_SNPRINTF = @GNULIB_SNPRINTF@
+GNULIB_SPRINTF_POSIX = @GNULIB_SPRINTF_POSIX@
+GNULIB_STDIO_H_NONBLOCKING = @GNULIB_STDIO_H_NONBLOCKING@
+GNULIB_STDIO_H_SIGPIPE = @GNULIB_STDIO_H_SIGPIPE@
+GNULIB_STPCPY = @GNULIB_STPCPY@
+GNULIB_STPNCPY = @GNULIB_STPNCPY@
+GNULIB_STRCASESTR = @GNULIB_STRCASESTR@
+GNULIB_STRCHRNUL = @GNULIB_STRCHRNUL@
+GNULIB_STRDUP = @GNULIB_STRDUP@
+GNULIB_STRERROR = @GNULIB_STRERROR@
+GNULIB_STRERROR_R = @GNULIB_STRERROR_R@
+GNULIB_STRNCAT = @GNULIB_STRNCAT@
+GNULIB_STRNDUP = @GNULIB_STRNDUP@
+GNULIB_STRNLEN = @GNULIB_STRNLEN@
+GNULIB_STRPBRK = @GNULIB_STRPBRK@
+GNULIB_STRSEP = @GNULIB_STRSEP@
+GNULIB_STRSIGNAL = @GNULIB_STRSIGNAL@
+GNULIB_STRSTR = @GNULIB_STRSTR@
+GNULIB_STRTOD = @GNULIB_STRTOD@
+GNULIB_STRTOK_R = @GNULIB_STRTOK_R@
+GNULIB_STRTOLD = @GNULIB_STRTOLD@
+GNULIB_STRTOLL = @GNULIB_STRTOLL@
+GNULIB_STRTOULL = @GNULIB_STRTOULL@
+GNULIB_STRVERSCMP = @GNULIB_STRVERSCMP@
+GNULIB_SYMLINK = @GNULIB_SYMLINK@
+GNULIB_SYMLINKAT = @GNULIB_SYMLINKAT@
+GNULIB_SYSTEM_POSIX = @GNULIB_SYSTEM_POSIX@
+GNULIB_TMPFILE = @GNULIB_TMPFILE@
+GNULIB_TRUNCATE = @GNULIB_TRUNCATE@
+GNULIB_TTYNAME_R = @GNULIB_TTYNAME_R@
+GNULIB_UNISTD_H_NONBLOCKING = @GNULIB_UNISTD_H_NONBLOCKING@
+GNULIB_UNISTD_H_SIGPIPE = @GNULIB_UNISTD_H_SIGPIPE@
+GNULIB_UNLINK = @GNULIB_UNLINK@
+GNULIB_UNLINKAT = @GNULIB_UNLINKAT@
+GNULIB_UNLOCKPT = @GNULIB_UNLOCKPT@
+GNULIB_UNSETENV = @GNULIB_UNSETENV@
+GNULIB_USLEEP = @GNULIB_USLEEP@
+GNULIB_VASPRINTF = @GNULIB_VASPRINTF@
+GNULIB_VDPRINTF = @GNULIB_VDPRINTF@
+GNULIB_VFPRINTF = @GNULIB_VFPRINTF@
+GNULIB_VFPRINTF_POSIX = @GNULIB_VFPRINTF_POSIX@
+GNULIB_VFSCANF = @GNULIB_VFSCANF@
+GNULIB_VPRINTF = @GNULIB_VPRINTF@
+GNULIB_VPRINTF_POSIX = @GNULIB_VPRINTF_POSIX@
+GNULIB_VSCANF = @GNULIB_VSCANF@
+GNULIB_VSNPRINTF = @GNULIB_VSNPRINTF@
+GNULIB_VSPRINTF_POSIX = @GNULIB_VSPRINTF_POSIX@
+GNULIB_WCTOMB = @GNULIB_WCTOMB@
+GNULIB_WRITE = @GNULIB_WRITE@
+GNULIB__EXIT = @GNULIB__EXIT@
+GREP = @GREP@
+GUILE_CFLAGS = @GUILE_CFLAGS@
+GUILE_LIBS = @GUILE_LIBS@
+HAVE_ALLOCA_H = @HAVE_ALLOCA_H@
+HAVE_ATOLL = @HAVE_ATOLL@
+HAVE_C99_STDINT_H = @HAVE_C99_STDINT_H@
+HAVE_CANONICALIZE_FILE_NAME = @HAVE_CANONICALIZE_FILE_NAME@
+HAVE_CHOWN = @HAVE_CHOWN@
+HAVE_COPY_FILE_RANGE = @HAVE_COPY_FILE_RANGE@
+HAVE_DECL_ENVIRON = @HAVE_DECL_ENVIRON@
+HAVE_DECL_FCHDIR = @HAVE_DECL_FCHDIR@
+HAVE_DECL_FDATASYNC = @HAVE_DECL_FDATASYNC@
+HAVE_DECL_FPURGE = @HAVE_DECL_FPURGE@
+HAVE_DECL_FSEEKO = @HAVE_DECL_FSEEKO@
+HAVE_DECL_FTELLO = @HAVE_DECL_FTELLO@
+HAVE_DECL_GETDELIM = @HAVE_DECL_GETDELIM@
+HAVE_DECL_GETDOMAINNAME = @HAVE_DECL_GETDOMAINNAME@
+HAVE_DECL_GETLINE = @HAVE_DECL_GETLINE@
+HAVE_DECL_GETLOADAVG = @HAVE_DECL_GETLOADAVG@
+HAVE_DECL_GETLOGIN = @HAVE_DECL_GETLOGIN@
+HAVE_DECL_GETLOGIN_R = @HAVE_DECL_GETLOGIN_R@
+HAVE_DECL_GETPAGESIZE = @HAVE_DECL_GETPAGESIZE@
+HAVE_DECL_GETUSERSHELL = @HAVE_DECL_GETUSERSHELL@
+HAVE_DECL_INITSTATE = @HAVE_DECL_INITSTATE@
+HAVE_DECL_MEMMEM = @HAVE_DECL_MEMMEM@
+HAVE_DECL_MEMRCHR = @HAVE_DECL_MEMRCHR@
+HAVE_DECL_OBSTACK_PRINTF = @HAVE_DECL_OBSTACK_PRINTF@
+HAVE_DECL_SETENV = @HAVE_DECL_SETENV@
+HAVE_DECL_SETHOSTNAME = @HAVE_DECL_SETHOSTNAME@
+HAVE_DECL_SETSTATE = @HAVE_DECL_SETSTATE@
+HAVE_DECL_SNPRINTF = @HAVE_DECL_SNPRINTF@
+HAVE_DECL_STRDUP = @HAVE_DECL_STRDUP@
+HAVE_DECL_STRERROR_R = @HAVE_DECL_STRERROR_R@
+HAVE_DECL_STRNDUP = @HAVE_DECL_STRNDUP@
+HAVE_DECL_STRNLEN = @HAVE_DECL_STRNLEN@
+HAVE_DECL_STRSIGNAL = @HAVE_DECL_STRSIGNAL@
+HAVE_DECL_STRTOK_R = @HAVE_DECL_STRTOK_R@
+HAVE_DECL_TRUNCATE = @HAVE_DECL_TRUNCATE@
+HAVE_DECL_TTYNAME_R = @HAVE_DECL_TTYNAME_R@
+HAVE_DECL_UNSETENV = @HAVE_DECL_UNSETENV@
+HAVE_DECL_VSNPRINTF = @HAVE_DECL_VSNPRINTF@
+HAVE_DPRINTF = @HAVE_DPRINTF@
+HAVE_DUP2 = @HAVE_DUP2@
+HAVE_DUP3 = @HAVE_DUP3@
+HAVE_EUIDACCESS = @HAVE_EUIDACCESS@
+HAVE_EXPLICIT_BZERO = @HAVE_EXPLICIT_BZERO@
+HAVE_FACCESSAT = @HAVE_FACCESSAT@
+HAVE_FCHDIR = @HAVE_FCHDIR@
+HAVE_FCHOWNAT = @HAVE_FCHOWNAT@
+HAVE_FCNTL = @HAVE_FCNTL@
+HAVE_FDATASYNC = @HAVE_FDATASYNC@
+HAVE_FFSL = @HAVE_FFSL@
+HAVE_FFSLL = @HAVE_FFSLL@
+HAVE_FSEEKO = @HAVE_FSEEKO@
+HAVE_FSYNC = @HAVE_FSYNC@
+HAVE_FTELLO = @HAVE_FTELLO@
+HAVE_FTRUNCATE = @HAVE_FTRUNCATE@
+HAVE_GETDTABLESIZE = @HAVE_GETDTABLESIZE@
+HAVE_GETGROUPS = @HAVE_GETGROUPS@
+HAVE_GETHOSTNAME = @HAVE_GETHOSTNAME@
+HAVE_GETLOGIN = @HAVE_GETLOGIN@
+HAVE_GETPAGESIZE = @HAVE_GETPAGESIZE@
+HAVE_GETPASS = @HAVE_GETPASS@
+HAVE_GETSUBOPT = @HAVE_GETSUBOPT@
+HAVE_GRANTPT = @HAVE_GRANTPT@
+HAVE_GROUP_MEMBER = @HAVE_GROUP_MEMBER@
+HAVE_INITSTATE = @HAVE_INITSTATE@
+HAVE_INTTYPES_H = @HAVE_INTTYPES_H@
+HAVE_LCHOWN = @HAVE_LCHOWN@
+HAVE_LINK = @HAVE_LINK@
+HAVE_LINKAT = @HAVE_LINKAT@
+HAVE_MAX_ALIGN_T = @HAVE_MAX_ALIGN_T@
+HAVE_MBSLEN = @HAVE_MBSLEN@
+HAVE_MBTOWC = @HAVE_MBTOWC@
+HAVE_MEMCHR = @HAVE_MEMCHR@
+HAVE_MEMPCPY = @HAVE_MEMPCPY@
+HAVE_MKDTEMP = @HAVE_MKDTEMP@
+HAVE_MKOSTEMP = @HAVE_MKOSTEMP@
+HAVE_MKOSTEMPS = @HAVE_MKOSTEMPS@
+HAVE_MKSTEMP = @HAVE_MKSTEMP@
+HAVE_MKSTEMPS = @HAVE_MKSTEMPS@
+HAVE_MSVC_INVALID_PARAMETER_HANDLER = @HAVE_MSVC_INVALID_PARAMETER_HANDLER@
+HAVE_OPENAT = @HAVE_OPENAT@
+HAVE_OS_H = @HAVE_OS_H@
+HAVE_PCLOSE = @HAVE_PCLOSE@
+HAVE_PIPE = @HAVE_PIPE@
+HAVE_PIPE2 = @HAVE_PIPE2@
+HAVE_POPEN = @HAVE_POPEN@
+HAVE_POSIX_OPENPT = @HAVE_POSIX_OPENPT@
+HAVE_PREAD = @HAVE_PREAD@
+HAVE_PTSNAME = @HAVE_PTSNAME@
+HAVE_PTSNAME_R = @HAVE_PTSNAME_R@
+HAVE_PWRITE = @HAVE_PWRITE@
+HAVE_QSORT_R = @HAVE_QSORT_R@
+HAVE_RANDOM = @HAVE_RANDOM@
+HAVE_RANDOM_H = @HAVE_RANDOM_H@
+HAVE_RANDOM_R = @HAVE_RANDOM_R@
+HAVE_RAWMEMCHR = @HAVE_RAWMEMCHR@
+HAVE_READLINK = @HAVE_READLINK@
+HAVE_READLINKAT = @HAVE_READLINKAT@
+HAVE_REALLOCARRAY = @HAVE_REALLOCARRAY@
+HAVE_REALPATH = @HAVE_REALPATH@
+HAVE_RENAMEAT = @HAVE_RENAMEAT@
+HAVE_RPMATCH = @HAVE_RPMATCH@
+HAVE_SECURE_GETENV = @HAVE_SECURE_GETENV@
+HAVE_SETENV = @HAVE_SETENV@
+HAVE_SETHOSTNAME = @HAVE_SETHOSTNAME@
+HAVE_SETSTATE = @HAVE_SETSTATE@
+HAVE_SIGNED_SIG_ATOMIC_T = @HAVE_SIGNED_SIG_ATOMIC_T@
+HAVE_SIGNED_WCHAR_T = @HAVE_SIGNED_WCHAR_T@
+HAVE_SIGNED_WINT_T = @HAVE_SIGNED_WINT_T@
+HAVE_SLEEP = @HAVE_SLEEP@
+HAVE_STDINT_H = @HAVE_STDINT_H@
+HAVE_STPCPY = @HAVE_STPCPY@
+HAVE_STPNCPY = @HAVE_STPNCPY@
+HAVE_STRCASESTR = @HAVE_STRCASESTR@
+HAVE_STRCHRNUL = @HAVE_STRCHRNUL@
+HAVE_STRPBRK = @HAVE_STRPBRK@
+HAVE_STRSEP = @HAVE_STRSEP@
+HAVE_STRTOD = @HAVE_STRTOD@
+HAVE_STRTOLD = @HAVE_STRTOLD@
+HAVE_STRTOLL = @HAVE_STRTOLL@
+HAVE_STRTOULL = @HAVE_STRTOULL@
+HAVE_STRUCT_RANDOM_DATA = @HAVE_STRUCT_RANDOM_DATA@
+HAVE_STRVERSCMP = @HAVE_STRVERSCMP@
+HAVE_SYMLINK = @HAVE_SYMLINK@
+HAVE_SYMLINKAT = @HAVE_SYMLINKAT@
+HAVE_SYS_BITYPES_H = @HAVE_SYS_BITYPES_H@
+HAVE_SYS_INTTYPES_H = @HAVE_SYS_INTTYPES_H@
+HAVE_SYS_LOADAVG_H = @HAVE_SYS_LOADAVG_H@
+HAVE_SYS_PARAM_H = @HAVE_SYS_PARAM_H@
+HAVE_SYS_TYPES_H = @HAVE_SYS_TYPES_H@
+HAVE_UNISTD_H = @HAVE_UNISTD_H@
+HAVE_UNLINKAT = @HAVE_UNLINKAT@
+HAVE_UNLOCKPT = @HAVE_UNLOCKPT@
+HAVE_USLEEP = @HAVE_USLEEP@
+HAVE_VASPRINTF = @HAVE_VASPRINTF@
+HAVE_VDPRINTF = @HAVE_VDPRINTF@
+HAVE_WCHAR_H = @HAVE_WCHAR_H@
+HAVE_WCHAR_T = @HAVE_WCHAR_T@
+HAVE_WINSOCK2_H = @HAVE_WINSOCK2_H@
+HAVE__BOOL = @HAVE__BOOL@
+HAVE__EXIT = @HAVE__EXIT@
+HOST_CPU = @HOST_CPU@
+HOST_CPU_C_ABI = @HOST_CPU_C_ABI@
+INCLUDE_NEXT = @INCLUDE_NEXT@
+INCLUDE_NEXT_AS_FIRST_DIRECTIVE = @INCLUDE_NEXT_AS_FIRST_DIRECTIVE@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBGNU_LIBDEPS = @LIBGNU_LIBDEPS@
+LIBGNU_LTLIBDEPS = @LIBGNU_LTLIBDEPS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIMITS_H = @LIMITS_H@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MAKE_HOST = @MAKE_HOST@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
+NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
+NEXT_AS_FIRST_DIRECTIVE_LIMITS_H = @NEXT_AS_FIRST_DIRECTIVE_LIMITS_H@
+NEXT_AS_FIRST_DIRECTIVE_STDDEF_H = @NEXT_AS_FIRST_DIRECTIVE_STDDEF_H@
+NEXT_AS_FIRST_DIRECTIVE_STDINT_H = @NEXT_AS_FIRST_DIRECTIVE_STDINT_H@
+NEXT_AS_FIRST_DIRECTIVE_STDIO_H = @NEXT_AS_FIRST_DIRECTIVE_STDIO_H@
+NEXT_AS_FIRST_DIRECTIVE_STDLIB_H = @NEXT_AS_FIRST_DIRECTIVE_STDLIB_H@
+NEXT_AS_FIRST_DIRECTIVE_STRING_H = @NEXT_AS_FIRST_DIRECTIVE_STRING_H@
+NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H = @NEXT_AS_FIRST_DIRECTIVE_SYS_TYPES_H@
+NEXT_AS_FIRST_DIRECTIVE_UNISTD_H = @NEXT_AS_FIRST_DIRECTIVE_UNISTD_H@
+NEXT_ERRNO_H = @NEXT_ERRNO_H@
+NEXT_FCNTL_H = @NEXT_FCNTL_H@
+NEXT_LIMITS_H = @NEXT_LIMITS_H@
+NEXT_STDDEF_H = @NEXT_STDDEF_H@
+NEXT_STDINT_H = @NEXT_STDINT_H@
+NEXT_STDIO_H = @NEXT_STDIO_H@
+NEXT_STDLIB_H = @NEXT_STDLIB_H@
+NEXT_STRING_H = @NEXT_STRING_H@
+NEXT_SYS_TYPES_H = @NEXT_SYS_TYPES_H@
+NEXT_UNISTD_H = @NEXT_UNISTD_H@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+POSUB = @POSUB@
+PRAGMA_COLUMNS = @PRAGMA_COLUMNS@
+PRAGMA_SYSTEM_HEADER = @PRAGMA_SYSTEM_HEADER@
+PTRDIFF_T_SUFFIX = @PTRDIFF_T_SUFFIX@
+RANLIB = @RANLIB@
+REMOTE = @REMOTE@
+REPLACE_ACCESS = @REPLACE_ACCESS@
+REPLACE_CALLOC = @REPLACE_CALLOC@
+REPLACE_CANONICALIZE_FILE_NAME = @REPLACE_CANONICALIZE_FILE_NAME@
+REPLACE_CHOWN = @REPLACE_CHOWN@
+REPLACE_CLOSE = @REPLACE_CLOSE@
+REPLACE_CREAT = @REPLACE_CREAT@
+REPLACE_DPRINTF = @REPLACE_DPRINTF@
+REPLACE_DUP = @REPLACE_DUP@
+REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
+REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
+REPLACE_FCLOSE = @REPLACE_FCLOSE@
+REPLACE_FCNTL = @REPLACE_FCNTL@
+REPLACE_FDOPEN = @REPLACE_FDOPEN@
+REPLACE_FFLUSH = @REPLACE_FFLUSH@
+REPLACE_FOPEN = @REPLACE_FOPEN@
+REPLACE_FPRINTF = @REPLACE_FPRINTF@
+REPLACE_FPURGE = @REPLACE_FPURGE@
+REPLACE_FREOPEN = @REPLACE_FREOPEN@
+REPLACE_FSEEK = @REPLACE_FSEEK@
+REPLACE_FSEEKO = @REPLACE_FSEEKO@
+REPLACE_FTELL = @REPLACE_FTELL@
+REPLACE_FTELLO = @REPLACE_FTELLO@
+REPLACE_FTRUNCATE = @REPLACE_FTRUNCATE@
+REPLACE_GETCWD = @REPLACE_GETCWD@
+REPLACE_GETDELIM = @REPLACE_GETDELIM@
+REPLACE_GETDOMAINNAME = @REPLACE_GETDOMAINNAME@
+REPLACE_GETDTABLESIZE = @REPLACE_GETDTABLESIZE@
+REPLACE_GETGROUPS = @REPLACE_GETGROUPS@
+REPLACE_GETLINE = @REPLACE_GETLINE@
+REPLACE_GETLOGIN_R = @REPLACE_GETLOGIN_R@
+REPLACE_GETPAGESIZE = @REPLACE_GETPAGESIZE@
+REPLACE_GETPASS = @REPLACE_GETPASS@
+REPLACE_INITSTATE = @REPLACE_INITSTATE@
+REPLACE_ISATTY = @REPLACE_ISATTY@
+REPLACE_LCHOWN = @REPLACE_LCHOWN@
+REPLACE_LINK = @REPLACE_LINK@
+REPLACE_LINKAT = @REPLACE_LINKAT@
+REPLACE_LSEEK = @REPLACE_LSEEK@
+REPLACE_MALLOC = @REPLACE_MALLOC@
+REPLACE_MBTOWC = @REPLACE_MBTOWC@
+REPLACE_MEMCHR = @REPLACE_MEMCHR@
+REPLACE_MEMMEM = @REPLACE_MEMMEM@
+REPLACE_MKSTEMP = @REPLACE_MKSTEMP@
+REPLACE_NULL = @REPLACE_NULL@
+REPLACE_OBSTACK_PRINTF = @REPLACE_OBSTACK_PRINTF@
+REPLACE_OPEN = @REPLACE_OPEN@
+REPLACE_OPENAT = @REPLACE_OPENAT@
+REPLACE_PERROR = @REPLACE_PERROR@
+REPLACE_POPEN = @REPLACE_POPEN@
+REPLACE_PREAD = @REPLACE_PREAD@
+REPLACE_PRINTF = @REPLACE_PRINTF@
+REPLACE_PTSNAME = @REPLACE_PTSNAME@
+REPLACE_PTSNAME_R = @REPLACE_PTSNAME_R@
+REPLACE_PUTENV = @REPLACE_PUTENV@
+REPLACE_PWRITE = @REPLACE_PWRITE@
+REPLACE_QSORT_R = @REPLACE_QSORT_R@
+REPLACE_RANDOM = @REPLACE_RANDOM@
+REPLACE_RANDOM_R = @REPLACE_RANDOM_R@
+REPLACE_READ = @REPLACE_READ@
+REPLACE_READLINK = @REPLACE_READLINK@
+REPLACE_READLINKAT = @REPLACE_READLINKAT@
+REPLACE_REALLOC = @REPLACE_REALLOC@
+REPLACE_REALPATH = @REPLACE_REALPATH@
+REPLACE_REMOVE = @REPLACE_REMOVE@
+REPLACE_RENAME = @REPLACE_RENAME@
+REPLACE_RENAMEAT = @REPLACE_RENAMEAT@
+REPLACE_RMDIR = @REPLACE_RMDIR@
+REPLACE_SETENV = @REPLACE_SETENV@
+REPLACE_SETSTATE = @REPLACE_SETSTATE@
+REPLACE_SLEEP = @REPLACE_SLEEP@
+REPLACE_SNPRINTF = @REPLACE_SNPRINTF@
+REPLACE_SPRINTF = @REPLACE_SPRINTF@
+REPLACE_STDIO_READ_FUNCS = @REPLACE_STDIO_READ_FUNCS@
+REPLACE_STDIO_WRITE_FUNCS = @REPLACE_STDIO_WRITE_FUNCS@
+REPLACE_STPNCPY = @REPLACE_STPNCPY@
+REPLACE_STRCASESTR = @REPLACE_STRCASESTR@
+REPLACE_STRCHRNUL = @REPLACE_STRCHRNUL@
+REPLACE_STRDUP = @REPLACE_STRDUP@
+REPLACE_STRERROR = @REPLACE_STRERROR@
+REPLACE_STRERROR_R = @REPLACE_STRERROR_R@
+REPLACE_STRNCAT = @REPLACE_STRNCAT@
+REPLACE_STRNDUP = @REPLACE_STRNDUP@
+REPLACE_STRNLEN = @REPLACE_STRNLEN@
+REPLACE_STRSIGNAL = @REPLACE_STRSIGNAL@
+REPLACE_STRSTR = @REPLACE_STRSTR@
+REPLACE_STRTOD = @REPLACE_STRTOD@
+REPLACE_STRTOK_R = @REPLACE_STRTOK_R@
+REPLACE_STRTOLD = @REPLACE_STRTOLD@
+REPLACE_SYMLINK = @REPLACE_SYMLINK@
+REPLACE_SYMLINKAT = @REPLACE_SYMLINKAT@
+REPLACE_TMPFILE = @REPLACE_TMPFILE@
+REPLACE_TRUNCATE = @REPLACE_TRUNCATE@
+REPLACE_TTYNAME_R = @REPLACE_TTYNAME_R@
+REPLACE_UNLINK = @REPLACE_UNLINK@
+REPLACE_UNLINKAT = @REPLACE_UNLINKAT@
+REPLACE_UNSETENV = @REPLACE_UNSETENV@
+REPLACE_USLEEP = @REPLACE_USLEEP@
+REPLACE_VASPRINTF = @REPLACE_VASPRINTF@
+REPLACE_VDPRINTF = @REPLACE_VDPRINTF@
+REPLACE_VFPRINTF = @REPLACE_VFPRINTF@
+REPLACE_VPRINTF = @REPLACE_VPRINTF@
+REPLACE_VSNPRINTF = @REPLACE_VSNPRINTF@
+REPLACE_VSPRINTF = @REPLACE_VSPRINTF@
+REPLACE_WCTOMB = @REPLACE_WCTOMB@
+REPLACE_WRITE = @REPLACE_WRITE@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIG_ATOMIC_T_SUFFIX = @SIG_ATOMIC_T_SUFFIX@
+SIZE_T_SUFFIX = @SIZE_T_SUFFIX@
+STDBOOL_H = @STDBOOL_H@
+STDDEF_H = @STDDEF_H@
+STDINT_H = @STDINT_H@
+STRIP = @STRIP@
+UNDEFINE_STRTOK_R = @UNDEFINE_STRTOK_R@
+UNISTD_H_HAVE_WINSOCK2_H = @UNISTD_H_HAVE_WINSOCK2_H@
+UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS = @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+USE_NLS = @USE_NLS@
+USE_SYSTEM_GLOB = @USE_SYSTEM_GLOB@
+VERSION = @VERSION@
+WCHAR_T_SUFFIX = @WCHAR_T_SUFFIX@
+WINDOWS_64_BIT_OFF_T = @WINDOWS_64_BIT_OFF_T@
+WINDOWS_STAT_INODES = @WINDOWS_STAT_INODES@
+WINT_T_SUFFIX = @WINT_T_SUFFIX@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gl_LIBOBJS = @gl_LIBOBJS@
+gl_LTLIBOBJS = @gl_LTLIBOBJS@
+gltests_LIBOBJS = @gltests_LIBOBJS@
+gltests_LTLIBOBJS = @gltests_LTLIBOBJS@
+gltests_WITNESS = @gltests_WITNESS@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = 1.11 gnits
+SUBDIRS = 
+noinst_HEADERS = 
+noinst_LIBRARIES = libgnu.a
+noinst_LTLIBRARIES = 
+EXTRA_DIST = access.c alloca.c alloca.in.h close.c concat-filename.h \
+       dirname.h dosname.h dup2.c errno.in.h error.c error.h \
+       exitfail.h fcntl.c fcntl.in.h fd-hook.h filename.h \
+       getdtablesize.c getloadavg.c intprops.h limits.in.h \
+       fnmatch.in.h glob.in.h malloc.c msvc-inval.c msvc-inval.h \
+       msvc-nothrow.c msvc-nothrow.h _Noreturn.h arg-nonnull.h \
+       c++defs.h warn-on-use.h stdbool.in.h stddef.in.h stdint.in.h \
+       stdio.in.h stdlib.in.h stpcpy.c strerror.c strerror-override.c \
+       strerror-override.h string.in.h sys_types.in.h unistd.in.h \
+       verify.h xalloc.h xalloc-oversized.h concat-filename.h
+BUILT_SOURCES = $(ALLOCA_H) $(ERRNO_H) fcntl.h $(LIMITS_H) \
+       $(am__append_2) $(STDBOOL_H) $(STDDEF_H) $(STDINT_H) stdio.h \
+       stdlib.h string.h sys/types.h unistd.h
+SUFFIXES = 
+MOSTLYCLEANFILES = core *.stackdump alloca.h alloca.h-t errno.h \
+       errno.h-t fcntl.h fcntl.h-t limits.h limits.h-t \
+       $(am__append_3) stdbool.h stdbool.h-t stddef.h stddef.h-t \
+       stdint.h stdint.h-t stdio.h stdio.h-t stdlib.h stdlib.h-t \
+       string.h string.h-t sys/types.h sys/types.h-t unistd.h \
+       unistd.h-t
+MOSTLYCLEANDIRS = 
+CLEANFILES = 
+DISTCLEANFILES = 
+MAINTAINERCLEANFILES = 
+# No GNU Make output.
+AM_CPPFLAGS = 
+AM_CFLAGS = 
+libgnu_a_SOURCES = concat-filename.c dirname-lgpl.c basename-lgpl.c \
+       stripslash.c exitfail.c fd-hook.c findprog.h findprog-in.c \
+       getprogname.h getprogname.c gettext.h $(am__append_1) unistd.c \
+       xmalloc.c xalloc-die.c xconcat-filename.c
+libgnu_a_LIBADD = $(gl_LIBOBJS) @ALLOCA@
+libgnu_a_DEPENDENCIES = $(gl_LIBOBJS) @ALLOCA@
+EXTRA_libgnu_a_SOURCES = access.c alloca.c close.c dup2.c error.c \
+       fcntl.c getdtablesize.c getloadavg.c malloc.c msvc-inval.c \
+       msvc-nothrow.c stpcpy.c strerror.c strerror-override.c
+
+# Use this preprocessor expression to decide whether #include_next works.
+# Do not rely on a 'configure'-time test for this, since the expression
+# might appear in an installed header, which is used by some other compiler.
+HAVE_INCLUDE_NEXT = (__GNUC__ || 60000000 <= __DECC_VER)
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+_NORETURN_H = $(srcdir)/_Noreturn.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+ARG_NONNULL_H = $(srcdir)/arg-nonnull.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+CXXDEFS_H = $(srcdir)/c++defs.h
+
+# Because this Makefile snippet defines a variable used by other
+# gnulib Makefile snippets, it must be present in all makefiles that
+# need it. This is ensured by the applicability 'all' defined above.
+WARN_ON_USE_H = $(srcdir)/warn-on-use.h
+all: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+               && { if test -f $@; then exit 0; else break; fi; }; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnits lib/Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --gnits lib/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+clean-noinstLTLIBRARIES:
+       -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+       @list='$(noinst_LTLIBRARIES)'; \
+       locs=`for p in $$list; do echo $$p; done | \
+             sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+             sort -u`; \
+       test -z "$$locs" || { \
+         echo rm -f $${locs}; \
+         rm -f $${locs}; \
+       }
+
+libgnu.a: $(libgnu_a_OBJECTS) $(libgnu_a_DEPENDENCIES) $(EXTRA_libgnu_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libgnu.a
+       $(AM_V_AR)$(libgnu_a_AR) libgnu.a $(libgnu_a_OBJECTS) $(libgnu_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libgnu.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/access.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alloca.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/concat-filename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname-lgpl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exitfail.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fcntl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fd-hook.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findprog-in.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getdtablesize.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getloadavg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getprogname.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glob.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-inval.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msvc-nothrow.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stpcpy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror-override.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strerror.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xalloc-die.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xconcat-filename.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+       @$(MKDIR_P) $(@D)
+       @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+       @fail=; \
+       if $(am__make_keepgoing); then \
+         failcom='fail=yes'; \
+       else \
+         failcom='exit 1'; \
+       fi; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           $(am__make_dryrun) \
+             || test -d "$(distdir)/$$subdir" \
+             || $(MKDIR_P) "$(distdir)/$$subdir" \
+             || exit 1; \
+           dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+           $(am__relativize); \
+           new_distdir=$$reldir; \
+           dir1=$$subdir; dir2="$(top_distdir)"; \
+           $(am__relativize); \
+           new_top_distdir=$$reldir; \
+           echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+           echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+           ($(am__cd) $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$new_top_distdir" \
+               distdir="$$new_distdir" \
+               am__remove_distdir=: \
+               am__skip_length_check=: \
+               am__skip_mode_fix=: \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-recursive
+all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+       -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+       -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstLTLIBRARIES \
+       mostlyclean-am
+
+distclean: distclean-recursive
+               -rm -f ./$(DEPDIR)/access.Po
+       -rm -f ./$(DEPDIR)/alloca.Po
+       -rm -f ./$(DEPDIR)/basename-lgpl.Po
+       -rm -f ./$(DEPDIR)/close.Po
+       -rm -f ./$(DEPDIR)/concat-filename.Po
+       -rm -f ./$(DEPDIR)/dirname-lgpl.Po
+       -rm -f ./$(DEPDIR)/dup2.Po
+       -rm -f ./$(DEPDIR)/error.Po
+       -rm -f ./$(DEPDIR)/exitfail.Po
+       -rm -f ./$(DEPDIR)/fcntl.Po
+       -rm -f ./$(DEPDIR)/fd-hook.Po
+       -rm -f ./$(DEPDIR)/findprog-in.Po
+       -rm -f ./$(DEPDIR)/fnmatch.Po
+       -rm -f ./$(DEPDIR)/getdtablesize.Po
+       -rm -f ./$(DEPDIR)/getloadavg.Po
+       -rm -f ./$(DEPDIR)/getprogname.Po
+       -rm -f ./$(DEPDIR)/glob.Po
+       -rm -f ./$(DEPDIR)/malloc.Po
+       -rm -f ./$(DEPDIR)/msvc-inval.Po
+       -rm -f ./$(DEPDIR)/msvc-nothrow.Po
+       -rm -f ./$(DEPDIR)/stpcpy.Po
+       -rm -f ./$(DEPDIR)/strerror-override.Po
+       -rm -f ./$(DEPDIR)/strerror.Po
+       -rm -f ./$(DEPDIR)/stripslash.Po
+       -rm -f ./$(DEPDIR)/unistd.Po
+       -rm -f ./$(DEPDIR)/xalloc-die.Po
+       -rm -f ./$(DEPDIR)/xconcat-filename.Po
+       -rm -f ./$(DEPDIR)/xmalloc.Po
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+               -rm -f ./$(DEPDIR)/access.Po
+       -rm -f ./$(DEPDIR)/alloca.Po
+       -rm -f ./$(DEPDIR)/basename-lgpl.Po
+       -rm -f ./$(DEPDIR)/close.Po
+       -rm -f ./$(DEPDIR)/concat-filename.Po
+       -rm -f ./$(DEPDIR)/dirname-lgpl.Po
+       -rm -f ./$(DEPDIR)/dup2.Po
+       -rm -f ./$(DEPDIR)/error.Po
+       -rm -f ./$(DEPDIR)/exitfail.Po
+       -rm -f ./$(DEPDIR)/fcntl.Po
+       -rm -f ./$(DEPDIR)/fd-hook.Po
+       -rm -f ./$(DEPDIR)/findprog-in.Po
+       -rm -f ./$(DEPDIR)/fnmatch.Po
+       -rm -f ./$(DEPDIR)/getdtablesize.Po
+       -rm -f ./$(DEPDIR)/getloadavg.Po
+       -rm -f ./$(DEPDIR)/getprogname.Po
+       -rm -f ./$(DEPDIR)/glob.Po
+       -rm -f ./$(DEPDIR)/malloc.Po
+       -rm -f ./$(DEPDIR)/msvc-inval.Po
+       -rm -f ./$(DEPDIR)/msvc-nothrow.Po
+       -rm -f ./$(DEPDIR)/stpcpy.Po
+       -rm -f ./$(DEPDIR)/strerror-override.Po
+       -rm -f ./$(DEPDIR)/strerror.Po
+       -rm -f ./$(DEPDIR)/stripslash.Po
+       -rm -f ./$(DEPDIR)/unistd.Po
+       -rm -f ./$(DEPDIR)/xalloc-die.Po
+       -rm -f ./$(DEPDIR)/xconcat-filename.Po
+       -rm -f ./$(DEPDIR)/xmalloc.Po
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+       mostlyclean-local
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) all check install install-am \
+       install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+       am--depfiles check check-am clean clean-generic \
+       clean-noinstLIBRARIES clean-noinstLTLIBRARIES cscopelist-am \
+       ctags ctags-am distclean distclean-compile distclean-generic \
+       distclean-tags distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-compile mostlyclean-generic \
+       mostlyclean-local pdf pdf-am ps ps-am tags tags-am uninstall \
+       uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# We need the following in order to create <alloca.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_ALLOCA_H_TRUE@alloca.h: alloca.in.h $(top_builddir)/config.status
+@GL_GENERATE_ALLOCA_H_TRUE@    $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_ALLOCA_H_TRUE@    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_ALLOCA_H_TRUE@      sed -e 's|@''HAVE_ALLOCA_H''@|$(HAVE_ALLOCA_H)|g' < $(srcdir)/alloca.in.h; \
+@GL_GENERATE_ALLOCA_H_TRUE@    } > $@-t && \
+@GL_GENERATE_ALLOCA_H_TRUE@    mv -f $@-t $@
+@GL_GENERATE_ALLOCA_H_FALSE@alloca.h: $(top_builddir)/config.status
+@GL_GENERATE_ALLOCA_H_FALSE@   rm -f $@
+
+# We need the following in order to create <errno.h> when the system
+# doesn't have one that is POSIX compliant.
+@GL_GENERATE_ERRNO_H_TRUE@errno.h: errno.in.h $(top_builddir)/config.status
+@GL_GENERATE_ERRNO_H_TRUE@     $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_ERRNO_H_TRUE@     { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_ERRNO_H_TRUE@       sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''NEXT_ERRNO_H''@|$(NEXT_ERRNO_H)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''EMULTIHOP_HIDDEN''@|$(EMULTIHOP_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''EMULTIHOP_VALUE''@|$(EMULTIHOP_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''ENOLINK_HIDDEN''@|$(ENOLINK_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''ENOLINK_VALUE''@|$(ENOLINK_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           -e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
+@GL_GENERATE_ERRNO_H_TRUE@           < $(srcdir)/errno.in.h; \
+@GL_GENERATE_ERRNO_H_TRUE@     } > $@-t && \
+@GL_GENERATE_ERRNO_H_TRUE@     mv $@-t $@
+@GL_GENERATE_ERRNO_H_FALSE@errno.h: $(top_builddir)/config.status
+@GL_GENERATE_ERRNO_H_FALSE@    rm -f $@
+
+# We need the following in order to create <fcntl.h> when the system
+# doesn't have one that works with the given compiler.
+fcntl.h: fcntl.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_FCNTL_H''@|$(NEXT_FCNTL_H)|g' \
+             -e 's/@''GNULIB_CREAT''@/$(GNULIB_CREAT)/g' \
+             -e 's/@''GNULIB_FCNTL''@/$(GNULIB_FCNTL)/g' \
+             -e 's/@''GNULIB_NONBLOCKING''@/$(GNULIB_NONBLOCKING)/g' \
+             -e 's/@''GNULIB_OPEN''@/$(GNULIB_OPEN)/g' \
+             -e 's/@''GNULIB_OPENAT''@/$(GNULIB_OPENAT)/g' \
+             -e 's|@''HAVE_FCNTL''@|$(HAVE_FCNTL)|g' \
+             -e 's|@''HAVE_OPENAT''@|$(HAVE_OPENAT)|g' \
+             -e 's|@''REPLACE_CREAT''@|$(REPLACE_CREAT)|g' \
+             -e 's|@''REPLACE_FCNTL''@|$(REPLACE_FCNTL)|g' \
+             -e 's|@''REPLACE_OPEN''@|$(REPLACE_OPEN)|g' \
+             -e 's|@''REPLACE_OPENAT''@|$(REPLACE_OPENAT)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)' \
+             < $(srcdir)/fcntl.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+
+# We need the following in order to create <limits.h> when the system
+# doesn't have one that is compatible with GNU.
+@GL_GENERATE_LIMITS_H_TRUE@limits.h: limits.in.h $(top_builddir)/config.status
+@GL_GENERATE_LIMITS_H_TRUE@    $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_LIMITS_H_TRUE@    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_LIMITS_H_TRUE@      sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_LIMITS_H_TRUE@          -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_LIMITS_H_TRUE@          -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_LIMITS_H_TRUE@          -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_LIMITS_H_TRUE@          -e 's|@''NEXT_LIMITS_H''@|$(NEXT_LIMITS_H)|g' \
+@GL_GENERATE_LIMITS_H_TRUE@          < $(srcdir)/limits.in.h; \
+@GL_GENERATE_LIMITS_H_TRUE@    } > $@-t && \
+@GL_GENERATE_LIMITS_H_TRUE@    mv $@-t $@
+@GL_GENERATE_LIMITS_H_FALSE@limits.h: $(top_builddir)/config.status
+@GL_GENERATE_LIMITS_H_FALSE@   rm -f $@
+
+@USE_SYSTEM_GLOB_FALSE@fnmatch.h: fnmatch.in.h $(top_builddir)/config.status
+@USE_SYSTEM_GLOB_FALSE@        $(AM_V_GEN)rm -f $@-t $@ && \
+@USE_SYSTEM_GLOB_FALSE@        { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@USE_SYSTEM_GLOB_FALSE@          cat $(srcdir)/fnmatch.in.h; \
+@USE_SYSTEM_GLOB_FALSE@        } > $@-t && \
+@USE_SYSTEM_GLOB_FALSE@        mv -f $@-t $@
+
+@USE_SYSTEM_GLOB_FALSE@glob.h: glob.in.h $(top_builddir)/config.status
+@USE_SYSTEM_GLOB_FALSE@        $(AM_V_GEN)rm -f $@-t $@ && \
+@USE_SYSTEM_GLOB_FALSE@        { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@USE_SYSTEM_GLOB_FALSE@          cat $(srcdir)/glob.in.h; \
+@USE_SYSTEM_GLOB_FALSE@        } > $@-t && \
+@USE_SYSTEM_GLOB_FALSE@        mv -f $@-t $@
+
+# We need the following in order to create <stdbool.h> when the system
+# doesn't have one that works.
+@GL_GENERATE_STDBOOL_H_TRUE@stdbool.h: stdbool.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDBOOL_H_TRUE@   $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDBOOL_H_TRUE@   { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_STDBOOL_H_TRUE@     sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
+@GL_GENERATE_STDBOOL_H_TRUE@   } > $@-t && \
+@GL_GENERATE_STDBOOL_H_TRUE@   mv $@-t $@
+@GL_GENERATE_STDBOOL_H_FALSE@stdbool.h: $(top_builddir)/config.status
+@GL_GENERATE_STDBOOL_H_FALSE@  rm -f $@
+
+# We need the following in order to create <stddef.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_STDDEF_H_TRUE@stddef.h: stddef.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDDEF_H_TRUE@    $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDDEF_H_TRUE@    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+@GL_GENERATE_STDDEF_H_TRUE@      sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''HAVE_MAX_ALIGN_T''@|$(HAVE_MAX_ALIGN_T)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          -e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
+@GL_GENERATE_STDDEF_H_TRUE@          < $(srcdir)/stddef.in.h; \
+@GL_GENERATE_STDDEF_H_TRUE@    } > $@-t && \
+@GL_GENERATE_STDDEF_H_TRUE@    mv $@-t $@
+@GL_GENERATE_STDDEF_H_FALSE@stddef.h: $(top_builddir)/config.status
+@GL_GENERATE_STDDEF_H_FALSE@   rm -f $@
+
+# We need the following in order to create <stdint.h> when the system
+# doesn't have one that works with the given compiler.
+@GL_GENERATE_STDINT_H_TRUE@stdint.h: stdint.in.h $(top_builddir)/config.status
+@GL_GENERATE_STDINT_H_TRUE@    $(AM_V_GEN)rm -f $@-t $@ && \
+@GL_GENERATE_STDINT_H_TRUE@    { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+@GL_GENERATE_STDINT_H_TRUE@      sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's|@''NEXT_STDINT_H''@|$(NEXT_STDINT_H)|g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_C99_STDINT_H''@/$(HAVE_C99_STDINT_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_SYS_TYPES_H''@/$(HAVE_SYS_TYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_INTTYPES_H''@/$(HAVE_INTTYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_SYS_INTTYPES_H''@/$(HAVE_SYS_INTTYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_SYS_BITYPES_H''@/$(HAVE_SYS_BITYPES_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_WCHAR_H''@/$(HAVE_WCHAR_H)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''APPLE_UNIVERSAL_BUILD''@/$(APPLE_UNIVERSAL_BUILD)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''BITSIZEOF_PTRDIFF_T''@/$(BITSIZEOF_PTRDIFF_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''PTRDIFF_T_SUFFIX''@/$(PTRDIFF_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''BITSIZEOF_SIG_ATOMIC_T''@/$(BITSIZEOF_SIG_ATOMIC_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_SIGNED_SIG_ATOMIC_T''@/$(HAVE_SIGNED_SIG_ATOMIC_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''SIG_ATOMIC_T_SUFFIX''@/$(SIG_ATOMIC_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''BITSIZEOF_SIZE_T''@/$(BITSIZEOF_SIZE_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''SIZE_T_SUFFIX''@/$(SIZE_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''BITSIZEOF_WCHAR_T''@/$(BITSIZEOF_WCHAR_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_SIGNED_WCHAR_T''@/$(HAVE_SIGNED_WCHAR_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''WCHAR_T_SUFFIX''@/$(WCHAR_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''BITSIZEOF_WINT_T''@/$(BITSIZEOF_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          -e 's/@''GNULIB_OVERRIDES_WINT_T''@/$(GNULIB_OVERRIDES_WINT_T)/g' \
+@GL_GENERATE_STDINT_H_TRUE@          < $(srcdir)/stdint.in.h; \
+@GL_GENERATE_STDINT_H_TRUE@    } > $@-t && \
+@GL_GENERATE_STDINT_H_TRUE@    mv $@-t $@
+@GL_GENERATE_STDINT_H_FALSE@stdint.h: $(top_builddir)/config.status
+@GL_GENERATE_STDINT_H_FALSE@   rm -f $@
+
+# We need the following in order to create <stdio.h> when the system
+# doesn't have one that works with the given compiler.
+stdio.h: stdio.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
+             -e 's/@''GNULIB_DPRINTF''@/$(GNULIB_DPRINTF)/g' \
+             -e 's/@''GNULIB_FCLOSE''@/$(GNULIB_FCLOSE)/g' \
+             -e 's/@''GNULIB_FDOPEN''@/$(GNULIB_FDOPEN)/g' \
+             -e 's/@''GNULIB_FFLUSH''@/$(GNULIB_FFLUSH)/g' \
+             -e 's/@''GNULIB_FGETC''@/$(GNULIB_FGETC)/g' \
+             -e 's/@''GNULIB_FGETS''@/$(GNULIB_FGETS)/g' \
+             -e 's/@''GNULIB_FOPEN''@/$(GNULIB_FOPEN)/g' \
+             -e 's/@''GNULIB_FPRINTF''@/$(GNULIB_FPRINTF)/g' \
+             -e 's/@''GNULIB_FPRINTF_POSIX''@/$(GNULIB_FPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_FPURGE''@/$(GNULIB_FPURGE)/g' \
+             -e 's/@''GNULIB_FPUTC''@/$(GNULIB_FPUTC)/g' \
+             -e 's/@''GNULIB_FPUTS''@/$(GNULIB_FPUTS)/g' \
+             -e 's/@''GNULIB_FREAD''@/$(GNULIB_FREAD)/g' \
+             -e 's/@''GNULIB_FREOPEN''@/$(GNULIB_FREOPEN)/g' \
+             -e 's/@''GNULIB_FSCANF''@/$(GNULIB_FSCANF)/g' \
+             -e 's/@''GNULIB_FSEEK''@/$(GNULIB_FSEEK)/g' \
+             -e 's/@''GNULIB_FSEEKO''@/$(GNULIB_FSEEKO)/g' \
+             -e 's/@''GNULIB_FTELL''@/$(GNULIB_FTELL)/g' \
+             -e 's/@''GNULIB_FTELLO''@/$(GNULIB_FTELLO)/g' \
+             -e 's/@''GNULIB_FWRITE''@/$(GNULIB_FWRITE)/g' \
+             -e 's/@''GNULIB_GETC''@/$(GNULIB_GETC)/g' \
+             -e 's/@''GNULIB_GETCHAR''@/$(GNULIB_GETCHAR)/g' \
+             -e 's/@''GNULIB_GETDELIM''@/$(GNULIB_GETDELIM)/g' \
+             -e 's/@''GNULIB_GETLINE''@/$(GNULIB_GETLINE)/g' \
+             -e 's/@''GNULIB_OBSTACK_PRINTF''@/$(GNULIB_OBSTACK_PRINTF)/g' \
+             -e 's/@''GNULIB_OBSTACK_PRINTF_POSIX''@/$(GNULIB_OBSTACK_PRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_PCLOSE''@/$(GNULIB_PCLOSE)/g' \
+             -e 's/@''GNULIB_PERROR''@/$(GNULIB_PERROR)/g' \
+             -e 's/@''GNULIB_POPEN''@/$(GNULIB_POPEN)/g' \
+             -e 's/@''GNULIB_PRINTF''@/$(GNULIB_PRINTF)/g' \
+             -e 's/@''GNULIB_PRINTF_POSIX''@/$(GNULIB_PRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_PUTC''@/$(GNULIB_PUTC)/g' \
+             -e 's/@''GNULIB_PUTCHAR''@/$(GNULIB_PUTCHAR)/g' \
+             -e 's/@''GNULIB_PUTS''@/$(GNULIB_PUTS)/g' \
+             -e 's/@''GNULIB_REMOVE''@/$(GNULIB_REMOVE)/g' \
+             -e 's/@''GNULIB_RENAME''@/$(GNULIB_RENAME)/g' \
+             -e 's/@''GNULIB_RENAMEAT''@/$(GNULIB_RENAMEAT)/g' \
+             -e 's/@''GNULIB_SCANF''@/$(GNULIB_SCANF)/g' \
+             -e 's/@''GNULIB_SNPRINTF''@/$(GNULIB_SNPRINTF)/g' \
+             -e 's/@''GNULIB_SPRINTF_POSIX''@/$(GNULIB_SPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_STDIO_H_NONBLOCKING''@/$(GNULIB_STDIO_H_NONBLOCKING)/g' \
+             -e 's/@''GNULIB_STDIO_H_SIGPIPE''@/$(GNULIB_STDIO_H_SIGPIPE)/g' \
+             -e 's/@''GNULIB_TMPFILE''@/$(GNULIB_TMPFILE)/g' \
+             -e 's/@''GNULIB_VASPRINTF''@/$(GNULIB_VASPRINTF)/g' \
+             -e 's/@''GNULIB_VDPRINTF''@/$(GNULIB_VDPRINTF)/g' \
+             -e 's/@''GNULIB_VFPRINTF''@/$(GNULIB_VFPRINTF)/g' \
+             -e 's/@''GNULIB_VFPRINTF_POSIX''@/$(GNULIB_VFPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_VFSCANF''@/$(GNULIB_VFSCANF)/g' \
+             -e 's/@''GNULIB_VSCANF''@/$(GNULIB_VSCANF)/g' \
+             -e 's/@''GNULIB_VPRINTF''@/$(GNULIB_VPRINTF)/g' \
+             -e 's/@''GNULIB_VPRINTF_POSIX''@/$(GNULIB_VPRINTF_POSIX)/g' \
+             -e 's/@''GNULIB_VSNPRINTF''@/$(GNULIB_VSNPRINTF)/g' \
+             -e 's/@''GNULIB_VSPRINTF_POSIX''@/$(GNULIB_VSPRINTF_POSIX)/g' \
+             < $(srcdir)/stdio.in.h | \
+         sed -e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
+             -e 's|@''HAVE_DECL_FSEEKO''@|$(HAVE_DECL_FSEEKO)|g' \
+             -e 's|@''HAVE_DECL_FTELLO''@|$(HAVE_DECL_FTELLO)|g' \
+             -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
+             -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
+             -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \
+             -e 's|@''HAVE_DECL_SNPRINTF''@|$(HAVE_DECL_SNPRINTF)|g' \
+             -e 's|@''HAVE_DECL_VSNPRINTF''@|$(HAVE_DECL_VSNPRINTF)|g' \
+             -e 's|@''HAVE_DPRINTF''@|$(HAVE_DPRINTF)|g' \
+             -e 's|@''HAVE_FSEEKO''@|$(HAVE_FSEEKO)|g' \
+             -e 's|@''HAVE_FTELLO''@|$(HAVE_FTELLO)|g' \
+             -e 's|@''HAVE_PCLOSE''@|$(HAVE_PCLOSE)|g' \
+             -e 's|@''HAVE_POPEN''@|$(HAVE_POPEN)|g' \
+             -e 's|@''HAVE_RENAMEAT''@|$(HAVE_RENAMEAT)|g' \
+             -e 's|@''HAVE_VASPRINTF''@|$(HAVE_VASPRINTF)|g' \
+             -e 's|@''HAVE_VDPRINTF''@|$(HAVE_VDPRINTF)|g' \
+             -e 's|@''REPLACE_DPRINTF''@|$(REPLACE_DPRINTF)|g' \
+             -e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
+             -e 's|@''REPLACE_FDOPEN''@|$(REPLACE_FDOPEN)|g' \
+             -e 's|@''REPLACE_FFLUSH''@|$(REPLACE_FFLUSH)|g' \
+             -e 's|@''REPLACE_FOPEN''@|$(REPLACE_FOPEN)|g' \
+             -e 's|@''REPLACE_FPRINTF''@|$(REPLACE_FPRINTF)|g' \
+             -e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
+             -e 's|@''REPLACE_FREOPEN''@|$(REPLACE_FREOPEN)|g' \
+             -e 's|@''REPLACE_FSEEK''@|$(REPLACE_FSEEK)|g' \
+             -e 's|@''REPLACE_FSEEKO''@|$(REPLACE_FSEEKO)|g' \
+             -e 's|@''REPLACE_FTELL''@|$(REPLACE_FTELL)|g' \
+             -e 's|@''REPLACE_FTELLO''@|$(REPLACE_FTELLO)|g' \
+             -e 's|@''REPLACE_GETDELIM''@|$(REPLACE_GETDELIM)|g' \
+             -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
+             -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \
+             -e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
+             -e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
+             -e 's|@''REPLACE_PRINTF''@|$(REPLACE_PRINTF)|g' \
+             -e 's|@''REPLACE_REMOVE''@|$(REPLACE_REMOVE)|g' \
+             -e 's|@''REPLACE_RENAME''@|$(REPLACE_RENAME)|g' \
+             -e 's|@''REPLACE_RENAMEAT''@|$(REPLACE_RENAMEAT)|g' \
+             -e 's|@''REPLACE_SNPRINTF''@|$(REPLACE_SNPRINTF)|g' \
+             -e 's|@''REPLACE_SPRINTF''@|$(REPLACE_SPRINTF)|g' \
+             -e 's|@''REPLACE_STDIO_READ_FUNCS''@|$(REPLACE_STDIO_READ_FUNCS)|g' \
+             -e 's|@''REPLACE_STDIO_WRITE_FUNCS''@|$(REPLACE_STDIO_WRITE_FUNCS)|g' \
+             -e 's|@''REPLACE_TMPFILE''@|$(REPLACE_TMPFILE)|g' \
+             -e 's|@''REPLACE_VASPRINTF''@|$(REPLACE_VASPRINTF)|g' \
+             -e 's|@''REPLACE_VDPRINTF''@|$(REPLACE_VDPRINTF)|g' \
+             -e 's|@''REPLACE_VFPRINTF''@|$(REPLACE_VFPRINTF)|g' \
+             -e 's|@''REPLACE_VPRINTF''@|$(REPLACE_VPRINTF)|g' \
+             -e 's|@''REPLACE_VSNPRINTF''@|$(REPLACE_VSNPRINTF)|g' \
+             -e 's|@''REPLACE_VSPRINTF''@|$(REPLACE_VSPRINTF)|g' \
+             -e 's|@''ASM_SYMBOL_PREFIX''@|$(ASM_SYMBOL_PREFIX)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+       } > $@-t && \
+       mv $@-t $@
+
+# We need the following in order to create <stdlib.h> when the system
+# doesn't have one that works with the given compiler.
+stdlib.h: stdlib.in.h $(top_builddir)/config.status $(CXXDEFS_H) \
+  $(_NORETURN_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \
+             -e 's/@''GNULIB__EXIT''@/$(GNULIB__EXIT)/g' \
+             -e 's/@''GNULIB_ATOLL''@/$(GNULIB_ATOLL)/g' \
+             -e 's/@''GNULIB_CALLOC_POSIX''@/$(GNULIB_CALLOC_POSIX)/g' \
+             -e 's/@''GNULIB_CANONICALIZE_FILE_NAME''@/$(GNULIB_CANONICALIZE_FILE_NAME)/g' \
+             -e 's/@''GNULIB_GETLOADAVG''@/$(GNULIB_GETLOADAVG)/g' \
+             -e 's/@''GNULIB_GETSUBOPT''@/$(GNULIB_GETSUBOPT)/g' \
+             -e 's/@''GNULIB_GRANTPT''@/$(GNULIB_GRANTPT)/g' \
+             -e 's/@''GNULIB_MALLOC_POSIX''@/$(GNULIB_MALLOC_POSIX)/g' \
+             -e 's/@''GNULIB_MBTOWC''@/$(GNULIB_MBTOWC)/g' \
+             -e 's/@''GNULIB_MKDTEMP''@/$(GNULIB_MKDTEMP)/g' \
+             -e 's/@''GNULIB_MKOSTEMP''@/$(GNULIB_MKOSTEMP)/g' \
+             -e 's/@''GNULIB_MKOSTEMPS''@/$(GNULIB_MKOSTEMPS)/g' \
+             -e 's/@''GNULIB_MKSTEMP''@/$(GNULIB_MKSTEMP)/g' \
+             -e 's/@''GNULIB_MKSTEMPS''@/$(GNULIB_MKSTEMPS)/g' \
+             -e 's/@''GNULIB_POSIX_OPENPT''@/$(GNULIB_POSIX_OPENPT)/g' \
+             -e 's/@''GNULIB_PTSNAME''@/$(GNULIB_PTSNAME)/g' \
+             -e 's/@''GNULIB_PTSNAME_R''@/$(GNULIB_PTSNAME_R)/g' \
+             -e 's/@''GNULIB_PUTENV''@/$(GNULIB_PUTENV)/g' \
+             -e 's/@''GNULIB_QSORT_R''@/$(GNULIB_QSORT_R)/g' \
+             -e 's/@''GNULIB_RANDOM''@/$(GNULIB_RANDOM)/g' \
+             -e 's/@''GNULIB_RANDOM_R''@/$(GNULIB_RANDOM_R)/g' \
+             -e 's/@''GNULIB_REALLOC_POSIX''@/$(GNULIB_REALLOC_POSIX)/g' \
+             -e 's/@''GNULIB_REALLOCARRAY''@/$(GNULIB_REALLOCARRAY)/g' \
+             -e 's/@''GNULIB_REALPATH''@/$(GNULIB_REALPATH)/g' \
+             -e 's/@''GNULIB_RPMATCH''@/$(GNULIB_RPMATCH)/g' \
+             -e 's/@''GNULIB_SECURE_GETENV''@/$(GNULIB_SECURE_GETENV)/g' \
+             -e 's/@''GNULIB_SETENV''@/$(GNULIB_SETENV)/g' \
+             -e 's/@''GNULIB_STRTOD''@/$(GNULIB_STRTOD)/g' \
+             -e 's/@''GNULIB_STRTOLD''@/$(GNULIB_STRTOLD)/g' \
+             -e 's/@''GNULIB_STRTOLL''@/$(GNULIB_STRTOLL)/g' \
+             -e 's/@''GNULIB_STRTOULL''@/$(GNULIB_STRTOULL)/g' \
+             -e 's/@''GNULIB_SYSTEM_POSIX''@/$(GNULIB_SYSTEM_POSIX)/g' \
+             -e 's/@''GNULIB_UNLOCKPT''@/$(GNULIB_UNLOCKPT)/g' \
+             -e 's/@''GNULIB_UNSETENV''@/$(GNULIB_UNSETENV)/g' \
+             -e 's/@''GNULIB_WCTOMB''@/$(GNULIB_WCTOMB)/g' \
+             < $(srcdir)/stdlib.in.h | \
+         sed -e 's|@''HAVE__EXIT''@|$(HAVE__EXIT)|g' \
+             -e 's|@''HAVE_ATOLL''@|$(HAVE_ATOLL)|g' \
+             -e 's|@''HAVE_CANONICALIZE_FILE_NAME''@|$(HAVE_CANONICALIZE_FILE_NAME)|g' \
+             -e 's|@''HAVE_DECL_GETLOADAVG''@|$(HAVE_DECL_GETLOADAVG)|g' \
+             -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
+             -e 's|@''HAVE_GRANTPT''@|$(HAVE_GRANTPT)|g' \
+             -e 's|@''HAVE_INITSTATE''@|$(HAVE_INITSTATE)|g' \
+             -e 's|@''HAVE_DECL_INITSTATE''@|$(HAVE_DECL_INITSTATE)|g' \
+             -e 's|@''HAVE_MBTOWC''@|$(HAVE_MBTOWC)|g' \
+             -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
+             -e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
+             -e 's|@''HAVE_MKOSTEMPS''@|$(HAVE_MKOSTEMPS)|g' \
+             -e 's|@''HAVE_MKSTEMP''@|$(HAVE_MKSTEMP)|g' \
+             -e 's|@''HAVE_MKSTEMPS''@|$(HAVE_MKSTEMPS)|g' \
+             -e 's|@''HAVE_POSIX_OPENPT''@|$(HAVE_POSIX_OPENPT)|g' \
+             -e 's|@''HAVE_PTSNAME''@|$(HAVE_PTSNAME)|g' \
+             -e 's|@''HAVE_PTSNAME_R''@|$(HAVE_PTSNAME_R)|g' \
+             -e 's|@''HAVE_QSORT_R''@|$(HAVE_QSORT_R)|g' \
+             -e 's|@''HAVE_RANDOM''@|$(HAVE_RANDOM)|g' \
+             -e 's|@''HAVE_RANDOM_H''@|$(HAVE_RANDOM_H)|g' \
+             -e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
+             -e 's|@''HAVE_REALLOCARRAY''@|$(HAVE_REALLOCARRAY)|g' \
+             -e 's|@''HAVE_REALPATH''@|$(HAVE_REALPATH)|g' \
+             -e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
+             -e 's|@''HAVE_SECURE_GETENV''@|$(HAVE_SECURE_GETENV)|g' \
+             -e 's|@''HAVE_DECL_SETENV''@|$(HAVE_DECL_SETENV)|g' \
+             -e 's|@''HAVE_SETSTATE''@|$(HAVE_SETSTATE)|g' \
+             -e 's|@''HAVE_DECL_SETSTATE''@|$(HAVE_DECL_SETSTATE)|g' \
+             -e 's|@''HAVE_STRTOD''@|$(HAVE_STRTOD)|g' \
+             -e 's|@''HAVE_STRTOLD''@|$(HAVE_STRTOLD)|g' \
+             -e 's|@''HAVE_STRTOLL''@|$(HAVE_STRTOLL)|g' \
+             -e 's|@''HAVE_STRTOULL''@|$(HAVE_STRTOULL)|g' \
+             -e 's|@''HAVE_STRUCT_RANDOM_DATA''@|$(HAVE_STRUCT_RANDOM_DATA)|g' \
+             -e 's|@''HAVE_SYS_LOADAVG_H''@|$(HAVE_SYS_LOADAVG_H)|g' \
+             -e 's|@''HAVE_UNLOCKPT''@|$(HAVE_UNLOCKPT)|g' \
+             -e 's|@''HAVE_DECL_UNSETENV''@|$(HAVE_DECL_UNSETENV)|g' \
+             -e 's|@''REPLACE_CALLOC''@|$(REPLACE_CALLOC)|g' \
+             -e 's|@''REPLACE_CANONICALIZE_FILE_NAME''@|$(REPLACE_CANONICALIZE_FILE_NAME)|g' \
+             -e 's|@''REPLACE_INITSTATE''@|$(REPLACE_INITSTATE)|g' \
+             -e 's|@''REPLACE_MALLOC''@|$(REPLACE_MALLOC)|g' \
+             -e 's|@''REPLACE_MBTOWC''@|$(REPLACE_MBTOWC)|g' \
+             -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \
+             -e 's|@''REPLACE_PTSNAME''@|$(REPLACE_PTSNAME)|g' \
+             -e 's|@''REPLACE_PTSNAME_R''@|$(REPLACE_PTSNAME_R)|g' \
+             -e 's|@''REPLACE_PUTENV''@|$(REPLACE_PUTENV)|g' \
+             -e 's|@''REPLACE_QSORT_R''@|$(REPLACE_QSORT_R)|g' \
+             -e 's|@''REPLACE_RANDOM''@|$(REPLACE_RANDOM)|g' \
+             -e 's|@''REPLACE_RANDOM_R''@|$(REPLACE_RANDOM_R)|g' \
+             -e 's|@''REPLACE_REALLOC''@|$(REPLACE_REALLOC)|g' \
+             -e 's|@''REPLACE_REALPATH''@|$(REPLACE_REALPATH)|g' \
+             -e 's|@''REPLACE_SETENV''@|$(REPLACE_SETENV)|g' \
+             -e 's|@''REPLACE_SETSTATE''@|$(REPLACE_SETSTATE)|g' \
+             -e 's|@''REPLACE_STRTOD''@|$(REPLACE_STRTOD)|g' \
+             -e 's|@''REPLACE_STRTOLD''@|$(REPLACE_STRTOLD)|g' \
+             -e 's|@''REPLACE_UNSETENV''@|$(REPLACE_UNSETENV)|g' \
+             -e 's|@''REPLACE_WCTOMB''@|$(REPLACE_WCTOMB)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _Noreturn/r $(_NORETURN_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+       } > $@-t && \
+       mv $@-t $@
+
+# We need the following in order to create <string.h> when the system
+# doesn't have one that works with the given compiler.
+string.h: string.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_STRING_H''@|$(NEXT_STRING_H)|g' \
+             -e 's/@''GNULIB_EXPLICIT_BZERO''@/$(GNULIB_EXPLICIT_BZERO)/g' \
+             -e 's/@''GNULIB_FFSL''@/$(GNULIB_FFSL)/g' \
+             -e 's/@''GNULIB_FFSLL''@/$(GNULIB_FFSLL)/g' \
+             -e 's/@''GNULIB_MBSLEN''@/$(GNULIB_MBSLEN)/g' \
+             -e 's/@''GNULIB_MBSNLEN''@/$(GNULIB_MBSNLEN)/g' \
+             -e 's/@''GNULIB_MBSCHR''@/$(GNULIB_MBSCHR)/g' \
+             -e 's/@''GNULIB_MBSRCHR''@/$(GNULIB_MBSRCHR)/g' \
+             -e 's/@''GNULIB_MBSSTR''@/$(GNULIB_MBSSTR)/g' \
+             -e 's/@''GNULIB_MBSCASECMP''@/$(GNULIB_MBSCASECMP)/g' \
+             -e 's/@''GNULIB_MBSNCASECMP''@/$(GNULIB_MBSNCASECMP)/g' \
+             -e 's/@''GNULIB_MBSPCASECMP''@/$(GNULIB_MBSPCASECMP)/g' \
+             -e 's/@''GNULIB_MBSCASESTR''@/$(GNULIB_MBSCASESTR)/g' \
+             -e 's/@''GNULIB_MBSCSPN''@/$(GNULIB_MBSCSPN)/g' \
+             -e 's/@''GNULIB_MBSPBRK''@/$(GNULIB_MBSPBRK)/g' \
+             -e 's/@''GNULIB_MBSSPN''@/$(GNULIB_MBSSPN)/g' \
+             -e 's/@''GNULIB_MBSSEP''@/$(GNULIB_MBSSEP)/g' \
+             -e 's/@''GNULIB_MBSTOK_R''@/$(GNULIB_MBSTOK_R)/g' \
+             -e 's/@''GNULIB_MEMCHR''@/$(GNULIB_MEMCHR)/g' \
+             -e 's/@''GNULIB_MEMMEM''@/$(GNULIB_MEMMEM)/g' \
+             -e 's/@''GNULIB_MEMPCPY''@/$(GNULIB_MEMPCPY)/g' \
+             -e 's/@''GNULIB_MEMRCHR''@/$(GNULIB_MEMRCHR)/g' \
+             -e 's/@''GNULIB_RAWMEMCHR''@/$(GNULIB_RAWMEMCHR)/g' \
+             -e 's/@''GNULIB_STPCPY''@/$(GNULIB_STPCPY)/g' \
+             -e 's/@''GNULIB_STPNCPY''@/$(GNULIB_STPNCPY)/g' \
+             -e 's/@''GNULIB_STRCHRNUL''@/$(GNULIB_STRCHRNUL)/g' \
+             -e 's/@''GNULIB_STRDUP''@/$(GNULIB_STRDUP)/g' \
+             -e 's/@''GNULIB_STRNCAT''@/$(GNULIB_STRNCAT)/g' \
+             -e 's/@''GNULIB_STRNDUP''@/$(GNULIB_STRNDUP)/g' \
+             -e 's/@''GNULIB_STRNLEN''@/$(GNULIB_STRNLEN)/g' \
+             -e 's/@''GNULIB_STRPBRK''@/$(GNULIB_STRPBRK)/g' \
+             -e 's/@''GNULIB_STRSEP''@/$(GNULIB_STRSEP)/g' \
+             -e 's/@''GNULIB_STRSTR''@/$(GNULIB_STRSTR)/g' \
+             -e 's/@''GNULIB_STRCASESTR''@/$(GNULIB_STRCASESTR)/g' \
+             -e 's/@''GNULIB_STRTOK_R''@/$(GNULIB_STRTOK_R)/g' \
+             -e 's/@''GNULIB_STRERROR''@/$(GNULIB_STRERROR)/g' \
+             -e 's/@''GNULIB_STRERROR_R''@/$(GNULIB_STRERROR_R)/g' \
+             -e 's/@''GNULIB_STRSIGNAL''@/$(GNULIB_STRSIGNAL)/g' \
+             -e 's/@''GNULIB_STRVERSCMP''@/$(GNULIB_STRVERSCMP)/g' \
+             < $(srcdir)/string.in.h | \
+         sed -e 's|@''HAVE_EXPLICIT_BZERO''@|$(HAVE_EXPLICIT_BZERO)|g' \
+             -e 's|@''HAVE_FFSL''@|$(HAVE_FFSL)|g' \
+             -e 's|@''HAVE_FFSLL''@|$(HAVE_FFSLL)|g' \
+             -e 's|@''HAVE_MBSLEN''@|$(HAVE_MBSLEN)|g' \
+             -e 's|@''HAVE_MEMCHR''@|$(HAVE_MEMCHR)|g' \
+             -e 's|@''HAVE_DECL_MEMMEM''@|$(HAVE_DECL_MEMMEM)|g' \
+             -e 's|@''HAVE_MEMPCPY''@|$(HAVE_MEMPCPY)|g' \
+             -e 's|@''HAVE_DECL_MEMRCHR''@|$(HAVE_DECL_MEMRCHR)|g' \
+             -e 's|@''HAVE_RAWMEMCHR''@|$(HAVE_RAWMEMCHR)|g' \
+             -e 's|@''HAVE_STPCPY''@|$(HAVE_STPCPY)|g' \
+             -e 's|@''HAVE_STPNCPY''@|$(HAVE_STPNCPY)|g' \
+             -e 's|@''HAVE_STRCHRNUL''@|$(HAVE_STRCHRNUL)|g' \
+             -e 's|@''HAVE_DECL_STRDUP''@|$(HAVE_DECL_STRDUP)|g' \
+             -e 's|@''HAVE_DECL_STRNDUP''@|$(HAVE_DECL_STRNDUP)|g' \
+             -e 's|@''HAVE_DECL_STRNLEN''@|$(HAVE_DECL_STRNLEN)|g' \
+             -e 's|@''HAVE_STRPBRK''@|$(HAVE_STRPBRK)|g' \
+             -e 's|@''HAVE_STRSEP''@|$(HAVE_STRSEP)|g' \
+             -e 's|@''HAVE_STRCASESTR''@|$(HAVE_STRCASESTR)|g' \
+             -e 's|@''HAVE_DECL_STRTOK_R''@|$(HAVE_DECL_STRTOK_R)|g' \
+             -e 's|@''HAVE_DECL_STRERROR_R''@|$(HAVE_DECL_STRERROR_R)|g' \
+             -e 's|@''HAVE_DECL_STRSIGNAL''@|$(HAVE_DECL_STRSIGNAL)|g' \
+             -e 's|@''HAVE_STRVERSCMP''@|$(HAVE_STRVERSCMP)|g' \
+             -e 's|@''REPLACE_MEMCHR''@|$(REPLACE_MEMCHR)|g' \
+             -e 's|@''REPLACE_MEMMEM''@|$(REPLACE_MEMMEM)|g' \
+             -e 's|@''REPLACE_STPNCPY''@|$(REPLACE_STPNCPY)|g' \
+             -e 's|@''REPLACE_STRCHRNUL''@|$(REPLACE_STRCHRNUL)|g' \
+             -e 's|@''REPLACE_STRDUP''@|$(REPLACE_STRDUP)|g' \
+             -e 's|@''REPLACE_STRNCAT''@|$(REPLACE_STRNCAT)|g' \
+             -e 's|@''REPLACE_STRNDUP''@|$(REPLACE_STRNDUP)|g' \
+             -e 's|@''REPLACE_STRNLEN''@|$(REPLACE_STRNLEN)|g' \
+             -e 's|@''REPLACE_STRSTR''@|$(REPLACE_STRSTR)|g' \
+             -e 's|@''REPLACE_STRCASESTR''@|$(REPLACE_STRCASESTR)|g' \
+             -e 's|@''REPLACE_STRTOK_R''@|$(REPLACE_STRTOK_R)|g' \
+             -e 's|@''REPLACE_STRERROR''@|$(REPLACE_STRERROR)|g' \
+             -e 's|@''REPLACE_STRERROR_R''@|$(REPLACE_STRERROR_R)|g' \
+             -e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
+             -e 's|@''UNDEFINE_STRTOK_R''@|$(UNDEFINE_STRTOK_R)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+             < $(srcdir)/string.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+
+# We need the following in order to create <sys/types.h> when the system
+# doesn't have one that works with the given compiler.
+sys/types.h: sys_types.in.h $(top_builddir)/config.status
+       $(AM_V_at)$(MKDIR_P) sys
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_SYS_TYPES_H''@|$(NEXT_SYS_TYPES_H)|g' \
+             -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+             -e 's|@''WINDOWS_STAT_INODES''@|$(WINDOWS_STAT_INODES)|g' \
+             < $(srcdir)/sys_types.in.h; \
+       } > $@-t && \
+       mv $@-t $@
+
+# We need the following in order to create an empty placeholder for
+# <unistd.h> when the system doesn't have one.
+unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H) $(WARN_ON_USE_H)
+       $(AM_V_GEN)rm -f $@-t $@ && \
+       { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
+         sed -e 's|@''GUARD_PREFIX''@|GL|g' \
+             -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
+             -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
+             -e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
+             -e 's|@''PRAGMA_COLUMNS''@|@PRAGMA_COLUMNS@|g' \
+             -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
+             -e 's|@''WINDOWS_64_BIT_OFF_T''@|$(WINDOWS_64_BIT_OFF_T)|g' \
+             -e 's/@''GNULIB_ACCESS''@/$(GNULIB_ACCESS)/g' \
+             -e 's/@''GNULIB_CHDIR''@/$(GNULIB_CHDIR)/g' \
+             -e 's/@''GNULIB_CHOWN''@/$(GNULIB_CHOWN)/g' \
+             -e 's/@''GNULIB_CLOSE''@/$(GNULIB_CLOSE)/g' \
+             -e 's/@''GNULIB_COPY_FILE_RANGE''@/$(GNULIB_COPY_FILE_RANGE)/g' \
+             -e 's/@''GNULIB_DUP''@/$(GNULIB_DUP)/g' \
+             -e 's/@''GNULIB_DUP2''@/$(GNULIB_DUP2)/g' \
+             -e 's/@''GNULIB_DUP3''@/$(GNULIB_DUP3)/g' \
+             -e 's/@''GNULIB_ENVIRON''@/$(GNULIB_ENVIRON)/g' \
+             -e 's/@''GNULIB_EUIDACCESS''@/$(GNULIB_EUIDACCESS)/g' \
+             -e 's/@''GNULIB_FACCESSAT''@/$(GNULIB_FACCESSAT)/g' \
+             -e 's/@''GNULIB_FCHDIR''@/$(GNULIB_FCHDIR)/g' \
+             -e 's/@''GNULIB_FCHOWNAT''@/$(GNULIB_FCHOWNAT)/g' \
+             -e 's/@''GNULIB_FDATASYNC''@/$(GNULIB_FDATASYNC)/g' \
+             -e 's/@''GNULIB_FSYNC''@/$(GNULIB_FSYNC)/g' \
+             -e 's/@''GNULIB_FTRUNCATE''@/$(GNULIB_FTRUNCATE)/g' \
+             -e 's/@''GNULIB_GETCWD''@/$(GNULIB_GETCWD)/g' \
+             -e 's/@''GNULIB_GETDOMAINNAME''@/$(GNULIB_GETDOMAINNAME)/g' \
+             -e 's/@''GNULIB_GETDTABLESIZE''@/$(GNULIB_GETDTABLESIZE)/g' \
+             -e 's/@''GNULIB_GETGROUPS''@/$(GNULIB_GETGROUPS)/g' \
+             -e 's/@''GNULIB_GETHOSTNAME''@/$(GNULIB_GETHOSTNAME)/g' \
+             -e 's/@''GNULIB_GETLOGIN''@/$(GNULIB_GETLOGIN)/g' \
+             -e 's/@''GNULIB_GETLOGIN_R''@/$(GNULIB_GETLOGIN_R)/g' \
+             -e 's/@''GNULIB_GETPAGESIZE''@/$(GNULIB_GETPAGESIZE)/g' \
+             -e 's/@''GNULIB_GETPASS''@/$(GNULIB_GETPASS)/g' \
+             -e 's/@''GNULIB_GETUSERSHELL''@/$(GNULIB_GETUSERSHELL)/g' \
+             -e 's/@''GNULIB_GROUP_MEMBER''@/$(GNULIB_GROUP_MEMBER)/g' \
+             -e 's/@''GNULIB_ISATTY''@/$(GNULIB_ISATTY)/g' \
+             -e 's/@''GNULIB_LCHOWN''@/$(GNULIB_LCHOWN)/g' \
+             -e 's/@''GNULIB_LINK''@/$(GNULIB_LINK)/g' \
+             -e 's/@''GNULIB_LINKAT''@/$(GNULIB_LINKAT)/g' \
+             -e 's/@''GNULIB_LSEEK''@/$(GNULIB_LSEEK)/g' \
+             -e 's/@''GNULIB_PIPE''@/$(GNULIB_PIPE)/g' \
+             -e 's/@''GNULIB_PIPE2''@/$(GNULIB_PIPE2)/g' \
+             -e 's/@''GNULIB_PREAD''@/$(GNULIB_PREAD)/g' \
+             -e 's/@''GNULIB_PWRITE''@/$(GNULIB_PWRITE)/g' \
+             -e 's/@''GNULIB_READ''@/$(GNULIB_READ)/g' \
+             -e 's/@''GNULIB_READLINK''@/$(GNULIB_READLINK)/g' \
+             -e 's/@''GNULIB_READLINKAT''@/$(GNULIB_READLINKAT)/g' \
+             -e 's/@''GNULIB_RMDIR''@/$(GNULIB_RMDIR)/g' \
+             -e 's/@''GNULIB_SETHOSTNAME''@/$(GNULIB_SETHOSTNAME)/g' \
+             -e 's/@''GNULIB_SLEEP''@/$(GNULIB_SLEEP)/g' \
+             -e 's/@''GNULIB_SYMLINK''@/$(GNULIB_SYMLINK)/g' \
+             -e 's/@''GNULIB_SYMLINKAT''@/$(GNULIB_SYMLINKAT)/g' \
+             -e 's/@''GNULIB_TRUNCATE''@/$(GNULIB_TRUNCATE)/g' \
+             -e 's/@''GNULIB_TTYNAME_R''@/$(GNULIB_TTYNAME_R)/g' \
+             -e 's/@''GNULIB_UNISTD_H_GETOPT''@/0$(GNULIB_GL_UNISTD_H_GETOPT)/g' \
+             -e 's/@''GNULIB_UNISTD_H_NONBLOCKING''@/$(GNULIB_UNISTD_H_NONBLOCKING)/g' \
+             -e 's/@''GNULIB_UNISTD_H_SIGPIPE''@/$(GNULIB_UNISTD_H_SIGPIPE)/g' \
+             -e 's/@''GNULIB_UNLINK''@/$(GNULIB_UNLINK)/g' \
+             -e 's/@''GNULIB_UNLINKAT''@/$(GNULIB_UNLINKAT)/g' \
+             -e 's/@''GNULIB_USLEEP''@/$(GNULIB_USLEEP)/g' \
+             -e 's/@''GNULIB_WRITE''@/$(GNULIB_WRITE)/g' \
+             < $(srcdir)/unistd.in.h | \
+         sed -e 's|@''HAVE_CHOWN''@|$(HAVE_CHOWN)|g' \
+             -e 's|@''HAVE_COPY_FILE_RANGE''@|$(HAVE_COPY_FILE_RANGE)|g' \
+             -e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
+             -e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
+             -e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
+             -e 's|@''HAVE_FACCESSAT''@|$(HAVE_FACCESSAT)|g' \
+             -e 's|@''HAVE_FCHDIR''@|$(HAVE_FCHDIR)|g' \
+             -e 's|@''HAVE_FCHOWNAT''@|$(HAVE_FCHOWNAT)|g' \
+             -e 's|@''HAVE_FDATASYNC''@|$(HAVE_FDATASYNC)|g' \
+             -e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
+             -e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
+             -e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
+             -e 's|@''HAVE_GETGROUPS''@|$(HAVE_GETGROUPS)|g' \
+             -e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
+             -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
+             -e 's|@''HAVE_GETPASS''@|$(HAVE_GETPASS)|g' \
+             -e 's|@''HAVE_GROUP_MEMBER''@|$(HAVE_GROUP_MEMBER)|g' \
+             -e 's|@''HAVE_LCHOWN''@|$(HAVE_LCHOWN)|g' \
+             -e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
+             -e 's|@''HAVE_LINKAT''@|$(HAVE_LINKAT)|g' \
+             -e 's|@''HAVE_PIPE''@|$(HAVE_PIPE)|g' \
+             -e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
+             -e 's|@''HAVE_PREAD''@|$(HAVE_PREAD)|g' \
+             -e 's|@''HAVE_PWRITE''@|$(HAVE_PWRITE)|g' \
+             -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
+             -e 's|@''HAVE_READLINKAT''@|$(HAVE_READLINKAT)|g' \
+             -e 's|@''HAVE_SETHOSTNAME''@|$(HAVE_SETHOSTNAME)|g' \
+             -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+             -e 's|@''HAVE_SYMLINK''@|$(HAVE_SYMLINK)|g' \
+             -e 's|@''HAVE_SYMLINKAT''@|$(HAVE_SYMLINKAT)|g' \
+             -e 's|@''HAVE_UNLINKAT''@|$(HAVE_UNLINKAT)|g' \
+             -e 's|@''HAVE_USLEEP''@|$(HAVE_USLEEP)|g' \
+             -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
+             -e 's|@''HAVE_DECL_FCHDIR''@|$(HAVE_DECL_FCHDIR)|g' \
+             -e 's|@''HAVE_DECL_FDATASYNC''@|$(HAVE_DECL_FDATASYNC)|g' \
+             -e 's|@''HAVE_DECL_GETDOMAINNAME''@|$(HAVE_DECL_GETDOMAINNAME)|g' \
+             -e 's|@''HAVE_DECL_GETLOGIN''@|$(HAVE_DECL_GETLOGIN)|g' \
+             -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
+             -e 's|@''HAVE_DECL_GETPAGESIZE''@|$(HAVE_DECL_GETPAGESIZE)|g' \
+             -e 's|@''HAVE_DECL_GETUSERSHELL''@|$(HAVE_DECL_GETUSERSHELL)|g' \
+             -e 's|@''HAVE_DECL_SETHOSTNAME''@|$(HAVE_DECL_SETHOSTNAME)|g' \
+             -e 's|@''HAVE_DECL_TRUNCATE''@|$(HAVE_DECL_TRUNCATE)|g' \
+             -e 's|@''HAVE_DECL_TTYNAME_R''@|$(HAVE_DECL_TTYNAME_R)|g' \
+             -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
+             -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
+         | \
+         sed -e 's|@''REPLACE_ACCESS''@|$(REPLACE_ACCESS)|g' \
+             -e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
+             -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
+             -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
+             -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+             -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
+             -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
+             -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
+             -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
+             -e 's|@''REPLACE_GETDOMAINNAME''@|$(REPLACE_GETDOMAINNAME)|g' \
+             -e 's|@''REPLACE_GETDTABLESIZE''@|$(REPLACE_GETDTABLESIZE)|g' \
+             -e 's|@''REPLACE_GETLOGIN_R''@|$(REPLACE_GETLOGIN_R)|g' \
+             -e 's|@''REPLACE_GETGROUPS''@|$(REPLACE_GETGROUPS)|g' \
+             -e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
+             -e 's|@''REPLACE_GETPASS''@|$(REPLACE_GETPASS)|g' \
+             -e 's|@''REPLACE_ISATTY''@|$(REPLACE_ISATTY)|g' \
+             -e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
+             -e 's|@''REPLACE_LINK''@|$(REPLACE_LINK)|g' \
+             -e 's|@''REPLACE_LINKAT''@|$(REPLACE_LINKAT)|g' \
+             -e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
+             -e 's|@''REPLACE_PREAD''@|$(REPLACE_PREAD)|g' \
+             -e 's|@''REPLACE_PWRITE''@|$(REPLACE_PWRITE)|g' \
+             -e 's|@''REPLACE_READ''@|$(REPLACE_READ)|g' \
+             -e 's|@''REPLACE_READLINK''@|$(REPLACE_READLINK)|g' \
+             -e 's|@''REPLACE_READLINKAT''@|$(REPLACE_READLINKAT)|g' \
+             -e 's|@''REPLACE_RMDIR''@|$(REPLACE_RMDIR)|g' \
+             -e 's|@''REPLACE_SLEEP''@|$(REPLACE_SLEEP)|g' \
+             -e 's|@''REPLACE_SYMLINK''@|$(REPLACE_SYMLINK)|g' \
+             -e 's|@''REPLACE_SYMLINKAT''@|$(REPLACE_SYMLINKAT)|g' \
+             -e 's|@''REPLACE_TRUNCATE''@|$(REPLACE_TRUNCATE)|g' \
+             -e 's|@''REPLACE_TTYNAME_R''@|$(REPLACE_TTYNAME_R)|g' \
+             -e 's|@''REPLACE_UNLINK''@|$(REPLACE_UNLINK)|g' \
+             -e 's|@''REPLACE_UNLINKAT''@|$(REPLACE_UNLINKAT)|g' \
+             -e 's|@''REPLACE_USLEEP''@|$(REPLACE_USLEEP)|g' \
+             -e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
+             -e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
+             -e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
+             -e '/definitions of _GL_FUNCDECL_RPL/r $(CXXDEFS_H)' \
+             -e '/definition of _GL_ARG_NONNULL/r $(ARG_NONNULL_H)' \
+             -e '/definition of _GL_WARN_ON_USE/r $(WARN_ON_USE_H)'; \
+       } > $@-t && \
+       mv $@-t $@
+
+mostlyclean-local: mostlyclean-generic
+       @for dir in '' $(MOSTLYCLEANDIRS); do \
+         if test -n "$$dir" && test -d $$dir; then \
+           echo "rmdir $$dir"; rmdir $$dir; \
+         fi; \
+       done; \
+       :
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/_Noreturn.h b/lib/_Noreturn.h
new file mode 100644 (file)
index 0000000..0d4b9c2
--- /dev/null
@@ -0,0 +1,40 @@
+/* A C macro for declaring that a function does not return.
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _Noreturn
+# if (defined __cplusplus \
+      && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+          || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+      && 0)
+    /* [[noreturn]] is not practically usable, because with it the syntax
+         extern _Noreturn void func (...);
+       would not be valid; such a declaration would only be valid with 'extern'
+       and '_Noreturn' swapped, or without the 'extern' keyword.  However, some
+       AIX system header files and several gnulib header files use precisely
+       this syntax with 'extern'.  */
+#  define _Noreturn [[noreturn]]
+# elif ((!defined __cplusplus || defined __clang__)                     \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
+            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+   /* _Noreturn works as-is.  */
+# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
diff --git a/lib/access.c b/lib/access.c
new file mode 100644 (file)
index 0000000..ba515cc
--- /dev/null
@@ -0,0 +1,31 @@
+/* Test the access rights of a file.
+   Copyright (C) 2019-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#include <fcntl.h>
+#include <io.h>
+
+int
+access (const char *file, int mode)
+{
+  if ((mode & X_OK) != 0)
+    mode = (mode & ~X_OK) | R_OK;
+  return _access (file, mode);
+}
diff --git a/lib/alloca.c b/lib/alloca.c
new file mode 100644 (file)
index 0000000..d0476d5
--- /dev/null
@@ -0,0 +1,478 @@
+/* alloca.c -- allocate automatically reclaimed memory
+   (Mostly) portable public-domain implementation -- D A Gwyn
+
+   This implementation of the PWB library alloca function,
+   which is used to allocate space off the run-time stack so
+   that it is automatically reclaimed upon procedure exit,
+   was inspired by discussions with J. Q. Johnson of Cornell.
+   J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+   There are some preprocessor constants that can
+   be defined when compiling for your specific system, for
+   improved efficiency; however, the defaults should be okay.
+
+   The general concept of this implementation is to keep
+   track of all alloca-allocated blocks, and reclaim any
+   that are found to be deeper in the stack than the current
+   invocation.  This heuristic does not reclaim storage as
+   soon as it becomes invalid, but it will do so eventually.
+
+   As a special case, alloca(0) reclaims storage without
+   allocating any.  It is a good idea to use alloca(0) in
+   your main control loop, etc. to force garbage collection.  */
+
+#include <config.h>
+
+#include <alloca.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef emacs
+# include "lisp.h"
+# include "blockinput.h"
+# ifdef EMACS_FREE
+#  undef free
+#  define free EMACS_FREE
+# endif
+#else
+# define memory_full() abort ()
+#endif
+
+/* If compiling with GCC 2, this file's not needed.  */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* If someone has defined alloca as a macro,
+   there must be some other way alloca is supposed to work.  */
+# ifndef alloca
+
+#  ifdef emacs
+#   ifdef static
+/* actually, only want this if static is defined as ""
+   -- this is for usg, in which emacs must undefine static
+   in order to make unexec workable
+   */
+#    ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+/* Using #error here is not wise since this file should work for
+   old and obscure compilers.  */
+#    endif /* STACK_DIRECTION undefined */
+#   endif /* static */
+#  endif /* emacs */
+
+/* If your stack is a linked list of frames, you have to
+   provide an "address metric" ADDRESS_FUNCTION macro.  */
+
+#  if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+#   define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+#  else
+#   define ADDRESS_FUNCTION(arg) &(arg)
+#  endif
+
+/* Define STACK_DIRECTION if you know the direction of stack
+   growth for your system; otherwise it will be automatically
+   deduced at run-time.
+
+   STACK_DIRECTION > 0 => grows toward higher addresses
+   STACK_DIRECTION < 0 => grows toward lower addresses
+   STACK_DIRECTION = 0 => direction of growth unknown  */
+
+#  ifndef STACK_DIRECTION
+#   define STACK_DIRECTION      0       /* Direction unknown.  */
+#  endif
+
+#  if STACK_DIRECTION != 0
+
+#   define STACK_DIR    STACK_DIRECTION /* Known at compile-time.  */
+
+#  else /* STACK_DIRECTION == 0; need run-time code.  */
+
+static int stack_dir;           /* 1 or -1 once known.  */
+#   define STACK_DIR    stack_dir
+
+static int
+find_stack_direction (int *addr, int depth)
+{
+  int dir, dummy = 0;
+  if (! addr)
+    addr = &dummy;
+  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+  return dir + dummy;
+}
+
+#  endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+   (a) chain together all alloca'ed blocks;
+   (b) keep track of stack depth.
+
+   It is very important that sizeof(header) agree with malloc
+   alignment chunk size.  The following default should work okay.  */
+
+#  ifndef       ALIGN_SIZE
+#   define ALIGN_SIZE   sizeof(double)
+#  endif
+
+typedef union hdr
+{
+  char align[ALIGN_SIZE];       /* To force sizeof(header).  */
+  struct
+    {
+      union hdr *next;          /* For chaining headers.  */
+      char *deep;               /* For stack depth measure.  */
+    } h;
+} header;
+
+static header *last_alloca_header = NULL;       /* -> last alloca header.  */
+
+/* Return a pointer to at least SIZE bytes of storage,
+   which will be automatically reclaimed upon exit from
+   the procedure that called alloca.  Originally, this space
+   was supposed to be taken from the current stack frame of the
+   caller, but that method cannot be made to work for some
+   implementations of C, for example under Gould's UTX/32.  */
+
+void *
+alloca (size_t size)
+{
+  auto char probe;              /* Probes stack depth: */
+  register char *depth = ADDRESS_FUNCTION (probe);
+
+#  if STACK_DIRECTION == 0
+  if (STACK_DIR == 0)           /* Unknown growth direction.  */
+    STACK_DIR = find_stack_direction (NULL, (size & 1) + 20);
+#  endif
+
+  /* Reclaim garbage, defined as all alloca'd storage that
+     was allocated from deeper in the stack than currently.  */
+
+  {
+    register header *hp;        /* Traverses linked list.  */
+
+#  ifdef emacs
+    BLOCK_INPUT;
+#  endif
+
+    for (hp = last_alloca_header; hp != NULL;)
+      if ((STACK_DIR > 0 && hp->h.deep > depth)
+          || (STACK_DIR < 0 && hp->h.deep < depth))
+        {
+          register header *np = hp->h.next;
+
+          free (hp);            /* Collect garbage.  */
+
+          hp = np;              /* -> next header.  */
+        }
+      else
+        break;                  /* Rest are not deeper.  */
+
+    last_alloca_header = hp;    /* -> last valid storage.  */
+
+#  ifdef emacs
+    UNBLOCK_INPUT;
+#  endif
+  }
+
+  if (size == 0)
+    return NULL;                /* No allocation required.  */
+
+  /* Allocate combined header + user data storage.  */
+
+  {
+    /* Address of header.  */
+    register header *new;
+
+    size_t combined_size = sizeof (header) + size;
+    if (combined_size < sizeof (header))
+      memory_full ();
+
+    new = malloc (combined_size);
+
+    if (! new)
+      memory_full ();
+
+    new->h.next = last_alloca_header;
+    new->h.deep = depth;
+
+    last_alloca_header = new;
+
+    /* User storage begins just after header.  */
+
+    return (void *) (new + 1);
+  }
+}
+
+#  if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+#   ifdef DEBUG_I00AFUNC
+#    include <stdio.h>
+#   endif
+
+#   ifndef CRAY_STACK
+#    define CRAY_STACK
+#    ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+  {
+    long shgrow:32;             /* Number of times stack has grown.  */
+    long shaseg:32;             /* Size of increments to stack.  */
+    long shhwm:32;              /* High water mark of stack.  */
+    long shsize:32;             /* Current size of stack (all segments).  */
+  };
+
+/* The stack segment linkage control information occurs at
+   the high-address end of a stack segment.  (The stack
+   grows from low addresses to high addresses.)  The initial
+   part of the stack segment linkage control information is
+   0200 (octal) words.  This provides for register storage
+   for the routine which overflows the stack.  */
+
+struct stack_segment_linkage
+  {
+    long ss[0200];              /* 0200 overflow words.  */
+    long sssize:32;             /* Number of words in this segment.  */
+    long ssbase:32;             /* Offset to stack base.  */
+    long:32;
+    long sspseg:32;             /* Offset to linkage control of previous
+                                   segment of stack.  */
+    long:32;
+    long sstcpt:32;             /* Pointer to task common address block.  */
+    long sscsnm;                /* Private control structure number for
+                                   microtasking.  */
+    long ssusr1;                /* Reserved for user.  */
+    long ssusr2;                /* Reserved for user.  */
+    long sstpid;                /* Process ID for pid based multi-tasking.  */
+    long ssgvup;                /* Pointer to multitasking thread giveup.  */
+    long sscray[7];             /* Reserved for Cray Research.  */
+    long ssa0;
+    long ssa1;
+    long ssa2;
+    long ssa3;
+    long ssa4;
+    long ssa5;
+    long ssa6;
+    long ssa7;
+    long sss0;
+    long sss1;
+    long sss2;
+    long sss3;
+    long sss4;
+    long sss5;
+    long sss6;
+    long sss7;
+  };
+
+#    else /* CRAY2 */
+/* The following structure defines the vector of words
+   returned by the STKSTAT library routine.  */
+struct stk_stat
+  {
+    long now;                   /* Current total stack size.  */
+    long maxc;                  /* Amount of contiguous space which would
+                                   be required to satisfy the maximum
+                                   stack demand to date.  */
+    long high_water;            /* Stack high-water mark.  */
+    long overflows;             /* Number of stack overflow ($STKOFEN) calls.  */
+    long hits;                  /* Number of internal buffer hits.  */
+    long extends;               /* Number of block extensions.  */
+    long stko_mallocs;          /* Block allocations by $STKOFEN.  */
+    long underflows;            /* Number of stack underflow calls ($STKRETN).  */
+    long stko_free;             /* Number of deallocations by $STKRETN.  */
+    long stkm_free;             /* Number of deallocations by $STKMRET.  */
+    long segments;              /* Current number of stack segments.  */
+    long maxs;                  /* Maximum number of stack segments so far.  */
+    long pad_size;              /* Stack pad size.  */
+    long current_address;       /* Current stack segment address.  */
+    long current_size;          /* Current stack segment size.  This
+                                   number is actually corrupted by STKSTAT to
+                                   include the fifteen word trailer area.  */
+    long initial_address;       /* Address of initial segment.  */
+    long initial_size;          /* Size of initial segment.  */
+  };
+
+/* The following structure describes the data structure which trails
+   any stack segment.  I think that the description in 'asdef' is
+   out of date.  I only describe the parts that I am sure about.  */
+
+struct stk_trailer
+  {
+    long this_address;          /* Address of this block.  */
+    long this_size;             /* Size of this block (does not include
+                                   this trailer).  */
+    long unknown2;
+    long unknown3;
+    long link;                  /* Address of trailer block of previous
+                                   segment.  */
+    long unknown5;
+    long unknown6;
+    long unknown7;
+    long unknown8;
+    long unknown9;
+    long unknown10;
+    long unknown11;
+    long unknown12;
+    long unknown13;
+    long unknown14;
+  };
+
+#    endif /* CRAY2 */
+#   endif /* not CRAY_STACK */
+
+#   ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+   I doubt that "lint" will like this much.  */
+
+static long
+i00afunc (long *address)
+{
+  struct stk_stat status;
+  struct stk_trailer *trailer;
+  long *block, size;
+  long result = 0;
+
+  /* We want to iterate through all of the segments.  The first
+     step is to get the stack status structure.  We could do this
+     more quickly and more directly, perhaps, by referencing the
+     $LM00 common block, but I know that this works.  */
+
+  STKSTAT (&status);
+
+  /* Set up the iteration.  */
+
+  trailer = (struct stk_trailer *) (status.current_address
+                                    + status.current_size
+                                    - 15);
+
+  /* There must be at least one stack segment.  Therefore it is
+     a fatal error if "trailer" is null.  */
+
+  if (trailer == NULL)
+    abort ();
+
+  /* Discard segments that do not contain our argument address.  */
+
+  while (trailer != NULL)
+    {
+      block = (long *) trailer->this_address;
+      size = trailer->this_size;
+      if (block == NULL || size == 0)
+        abort ();
+      trailer = (struct stk_trailer *) trailer->link;
+      if ((block <= address) && (address < (block + size)))
+        break;
+    }
+
+  /* Set the result to the offset in this segment and add the sizes
+     of all predecessor segments.  */
+
+  result = address - block;
+
+  if (trailer == NULL)
+    {
+      return result;
+    }
+
+  do
+    {
+      if (trailer->this_size <= 0)
+        abort ();
+      result += trailer->this_size;
+      trailer = (struct stk_trailer *) trailer->link;
+    }
+  while (trailer != NULL);
+
+  /* We are done.  Note that if you present a bogus address (one
+     not in any segment), you will get a different number back, formed
+     from subtracting the address of the first block.  This is probably
+     not what you want.  */
+
+  return (result);
+}
+
+#   else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+   Determine the number of the cell within the stack,
+   given the address of the cell.  The purpose of this
+   routine is to linearize, in some sense, stack addresses
+   for alloca.  */
+
+static long
+i00afunc (long address)
+{
+  long stkl = 0;
+
+  long size, pseg, this_segment, stack;
+  long result = 0;
+
+  struct stack_segment_linkage *ssptr;
+
+  /* Register B67 contains the address of the end of the
+     current stack segment.  If you (as a subprogram) store
+     your registers on the stack and find that you are past
+     the contents of B67, you have overflowed the segment.
+
+     B67 also points to the stack segment linkage control
+     area, which is what we are really interested in.  */
+
+  stkl = CRAY_STACKSEG_END ();
+  ssptr = (struct stack_segment_linkage *) stkl;
+
+  /* If one subtracts 'size' from the end of the segment,
+     one has the address of the first word of the segment.
+
+     If this is not the first segment, 'pseg' will be
+     nonzero.  */
+
+  pseg = ssptr->sspseg;
+  size = ssptr->sssize;
+
+  this_segment = stkl - size;
+
+  /* It is possible that calling this routine itself caused
+     a stack overflow.  Discard stack segments which do not
+     contain the target address.  */
+
+  while (!(this_segment <= address && address <= stkl))
+    {
+#    ifdef DEBUG_I00AFUNC
+      fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+#    endif
+      if (pseg == 0)
+        break;
+      stkl = stkl - pseg;
+      ssptr = (struct stack_segment_linkage *) stkl;
+      size = ssptr->sssize;
+      pseg = ssptr->sspseg;
+      this_segment = stkl - size;
+    }
+
+  result = address - this_segment;
+
+  /* If you subtract pseg from the current end of the stack,
+     you get the address of the previous stack segment's end.
+     This seems a little convoluted to me, but I'll bet you save
+     a cycle somewhere.  */
+
+  while (pseg != 0)
+    {
+#    ifdef DEBUG_I00AFUNC
+      fprintf (stderr, "%011o %011o\n", pseg, size);
+#    endif
+      stkl = stkl - pseg;
+      ssptr = (struct stack_segment_linkage *) stkl;
+      size = ssptr->sssize;
+      pseg = ssptr->sspseg;
+      result += size;
+    }
+  return (result);
+}
+
+#   endif /* not CRAY2 */
+#  endif /* CRAY */
+
+# endif /* no alloca */
+#endif /* not GCC 2 */
diff --git a/lib/alloca.in.h b/lib/alloca.in.h
new file mode 100644 (file)
index 0000000..c7187e6
--- /dev/null
@@ -0,0 +1,71 @@
+/* Memory allocation on the stack.
+
+   Copyright (C) 1995, 1999, 2001-2004, 2006-2020 Free Software Foundation,
+   Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public
+   License along with this program; if not, see
+   <https://www.gnu.org/licenses/>.
+  */
+
+/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
+   means there is a real alloca function.  */
+#ifndef _GL_ALLOCA_H
+#define _GL_ALLOCA_H
+
+/* alloca (N) returns a pointer to N bytes of memory
+   allocated on the stack, which will last until the function returns.
+   Use of alloca should be avoided:
+     - inside arguments of function calls - undefined behaviour,
+     - in inline functions - the allocation may actually last until the
+       calling function returns,
+     - for huge N (say, N >= 65536) - you never know how large (or small)
+       the stack is, and when the stack cannot fulfill the memory allocation
+       request, the program just crashes.
+ */
+
+#ifndef alloca
+# ifdef __GNUC__
+   /* Some version of mingw have an <alloca.h> that causes trouble when
+      included after 'alloca' gets defined as a macro.  As a workaround, include
+      this <alloca.h> first and define 'alloca' as a macro afterwards.  */
+#  if (defined _WIN32 && ! defined __CYGWIN__) && @HAVE_ALLOCA_H@
+#   include_next <alloca.h>
+#  endif
+#  define alloca __builtin_alloca
+# elif defined _AIX
+#  define alloca __alloca
+# elif defined _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# elif defined __DECC && defined __VMS
+#  define alloca __ALLOCA
+# elif defined __TANDEM && defined _TNS_E_TARGET
+#  ifdef  __cplusplus
+extern "C"
+#  endif
+void *_alloca (unsigned short);
+#  pragma intrinsic (_alloca)
+#  define alloca _alloca
+# elif defined __MVS__
+#  include <stdlib.h>
+# else
+#  include <stddef.h>
+#  ifdef  __cplusplus
+extern "C"
+#  endif
+void *alloca (size_t);
+# endif
+#endif
+
+#endif /* _GL_ALLOCA_H */
diff --git a/lib/arg-nonnull.h b/lib/arg-nonnull.h
new file mode 100644 (file)
index 0000000..ac26ca8
--- /dev/null
@@ -0,0 +1,26 @@
+/* A C macro for declaring that specific arguments must not be NULL.
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
+   that the values passed as arguments n, ..., m must be non-NULL pointers.
+   n = 1 stands for the first argument, n = 2 for the second argument etc.  */
+#ifndef _GL_ARG_NONNULL
+# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
+#  define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
+# else
+#  define _GL_ARG_NONNULL(params)
+# endif
+#endif
diff --git a/lib/basename-lgpl.c b/lib/basename-lgpl.c
new file mode 100644 (file)
index 0000000..565469e
--- /dev/null
@@ -0,0 +1,75 @@
+/* basename.c -- return the last element in a file name
+
+   Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2020 Free Software
+   Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <string.h>
+
+/* Return the address of the last file name component of NAME.  If
+   NAME has no relative file name components because it is a file
+   system root, return the empty string.  */
+
+char *
+last_component (char const *name)
+{
+  char const *base = name + FILE_SYSTEM_PREFIX_LEN (name);
+  char const *p;
+  bool saw_slash = false;
+
+  while (ISSLASH (*base))
+    base++;
+
+  for (p = base; *p; p++)
+    {
+      if (ISSLASH (*p))
+        saw_slash = true;
+      else if (saw_slash)
+        {
+          base = p;
+          saw_slash = false;
+        }
+    }
+
+  return (char *) base;
+}
+
+/* Return the length of the basename NAME.  Typically NAME is the
+   value returned by base_name or last_component.  Act like strlen
+   (NAME), except omit all trailing slashes.  */
+
+size_t
+base_len (char const *name)
+{
+  size_t len;
+  size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (name);
+
+  for (len = strlen (name);  1 < len && ISSLASH (name[len - 1]);  len--)
+    continue;
+
+  if (DOUBLE_SLASH_IS_DISTINCT_ROOT && len == 1
+      && ISSLASH (name[0]) && ISSLASH (name[1]) && ! name[2])
+    return 2;
+
+  if (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE && prefix_len
+      && len == prefix_len && ISSLASH (name[prefix_len]))
+    return prefix_len + 1;
+
+  return len;
+}
diff --git a/lib/c++defs.h b/lib/c++defs.h
new file mode 100644 (file)
index 0000000..7a05763
--- /dev/null
@@ -0,0 +1,316 @@
+/* C++ compatible function declaration macros.
+   Copyright (C) 2010-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_CXXDEFS_H
+#define _GL_CXXDEFS_H
+
+/* Begin/end the GNULIB_NAMESPACE namespace.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_BEGIN_NAMESPACE namespace GNULIB_NAMESPACE {
+# define _GL_END_NAMESPACE }
+#else
+# define _GL_BEGIN_NAMESPACE
+# define _GL_END_NAMESPACE
+#endif
+
+/* The three most frequent use cases of these macros are:
+
+   * For providing a substitute for a function that is missing on some
+     platforms, but is declared and works fine on the platforms on which
+     it exists:
+
+       #if @GNULIB_FOO@
+       # if !@HAVE_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       # endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on all platforms,
+     but is broken/insufficient and needs to be replaced on some platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+
+   * For providing a replacement for a function that exists on some platforms
+     but is broken/insufficient and needs to be replaced on some of them and
+     is additionally either missing or undeclared on some other platforms:
+
+       #if @GNULIB_FOO@
+       # if @REPLACE_FOO@
+       #  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+       #   undef foo
+       #   define foo rpl_foo
+       #  endif
+       _GL_FUNCDECL_RPL (foo, ...);
+       _GL_CXXALIAS_RPL (foo, ...);
+       # else
+       #  if !@HAVE_FOO@   or   if !@HAVE_DECL_FOO@
+       _GL_FUNCDECL_SYS (foo, ...);
+       #  endif
+       _GL_CXXALIAS_SYS (foo, ...);
+       # endif
+       _GL_CXXALIASWARN (foo);
+       #elif defined GNULIB_POSIXCHECK
+       ...
+       #endif
+*/
+
+/* _GL_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#if defined __cplusplus
+# define _GL_EXTERN_C extern "C"
+#else
+# define _GL_EXTERN_C extern
+#endif
+
+/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
+   declares a replacement function, named rpl_func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
+  _GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
+#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype rpl_func parameters_and_attributes
+
+/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
+   declares the system function, named func, with the given prototype,
+   consisting of return type, parameters, and attributes.
+   Example:
+     _GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
+                                  _GL_ARG_NONNULL ((1)));
+ */
+#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
+  _GL_EXTERN_C rettype func parameters_and_attributes
+
+/* _GL_CXXALIAS_RPL (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
+   Example:
+     _GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+
+   Wrapping rpl_func in an object with an inline conversion operator
+   avoids a reference to rpl_func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
+  _GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::rpl_func;                                  \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
+   is like  _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
+   except that the C function rpl_func may have a slightly different
+   declaration.  A cast is used to silence the "invalid conversion" error
+   that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                                     \
+    {                                                              \
+      static const struct _gl_ ## func ## _wrapper                 \
+      {                                                            \
+        typedef rettype (*type) parameters;                        \
+                                                                   \
+        inline operator type () const                              \
+        {                                                          \
+          return reinterpret_cast<type>(::rpl_func);               \
+        }                                                          \
+      } func = {};                                                 \
+    }                                                              \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS (func, rettype, parameters);
+   declares a C++ alias called GNULIB_NAMESPACE::func
+   that redirects to the system provided function func, if GNULIB_NAMESPACE
+   is defined.
+   Example:
+     _GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+
+   Wrapping func in an object with an inline conversion operator
+   avoids a reference to func unless GNULIB_NAMESPACE::func is
+   actually used in the program.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS(func,rettype,parameters)            \
+    namespace GNULIB_NAMESPACE                                \
+    {                                                         \
+      static const struct _gl_ ## func ## _wrapper            \
+      {                                                       \
+        typedef rettype (*type) parameters;                   \
+                                                              \
+        inline operator type () const                         \
+        {                                                     \
+          return ::func;                                      \
+        }                                                     \
+      } func = {};                                            \
+    }                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function func may have a slightly different declaration.
+   A cast is used to silence the "invalid conversion" error that would
+   otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    namespace GNULIB_NAMESPACE                          \
+    {                                                   \
+      static const struct _gl_ ## func ## _wrapper      \
+      {                                                 \
+        typedef rettype (*type) parameters;             \
+                                                        \
+        inline operator type () const                   \
+        {                                               \
+          return reinterpret_cast<type>(::func);        \
+        }                                               \
+      } func = {};                                      \
+    }                                                   \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
+   is like  _GL_CXXALIAS_SYS (func, rettype, parameters);
+   except that the C function is picked among a set of overloaded functions,
+   namely the one with rettype2 and parameters2.  Two consecutive casts
+   are used to silence the "cannot find a match" and "invalid conversion"
+   errors that would otherwise occur.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+  /* The outer cast must be a reinterpret_cast.
+     The inner cast: When the function is defined as a set of overloaded
+     functions, it works as a static_cast<>, choosing the designated variant.
+     When the function is defined as a single variant, it works as a
+     reinterpret_cast<>. The parenthesized cast syntax works both ways.  */
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    namespace GNULIB_NAMESPACE                                                \
+    {                                                                         \
+      static const struct _gl_ ## func ## _wrapper                            \
+      {                                                                       \
+        typedef rettype (*type) parameters;                                   \
+                                                                              \
+        inline operator type () const                                         \
+        {                                                                     \
+          return reinterpret_cast<type>((rettype2 (*) parameters2)(::func));  \
+        }                                                                     \
+      } func = {};                                                            \
+    }                                                                         \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#else
+# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN (func);
+   causes a warning to be emitted when ::func is used but not when
+   GNULIB_NAMESPACE::func is used.  func must be defined without overloaded
+   variants.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN(func) \
+   _GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN_1(func,namespace) \
+   _GL_CXXALIASWARN_2 (func, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !__OPTIMIZE__
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+    _GL_WARN_ON_USE (func, \
+                     "The symbol ::" #func " refers to the system function. " \
+                     "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN_2(func,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN(func) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
+   causes a warning to be emitted when the given overloaded variant of ::func
+   is used but not when GNULIB_NAMESPACE::func is used.  */
+#if defined __cplusplus && defined GNULIB_NAMESPACE
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+   _GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
+                        GNULIB_NAMESPACE)
+# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
+   _GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
+/* To work around GCC bug <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
+   we enable the warning only when not optimizing.  */
+# if !__OPTIMIZE__
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+    _GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
+                         "The symbol ::" #func " refers to the system function. " \
+                         "Use " #namespace "::" #func " instead.")
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     extern __typeof__ (func) func
+# else
+#  define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
+     _GL_EXTERN_C int _gl_cxxalias_dummy
+# endif
+#else
+# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
+    _GL_EXTERN_C int _gl_cxxalias_dummy
+#endif
+
+#endif /* _GL_CXXDEFS_H */
diff --git a/lib/close.c b/lib/close.c
new file mode 100644 (file)
index 0000000..0c8780d
--- /dev/null
@@ -0,0 +1,71 @@
+/* close replacement.
+   Copyright (C) 2008-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#include <errno.h>
+
+#include "fd-hook.h"
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef close
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+close_nothrow (int fd)
+{
+  int result;
+
+  TRY_MSVC_INVAL
+    {
+      result = close (fd);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = -1;
+      errno = EBADF;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+#else
+# define close_nothrow close
+#endif
+
+/* Override close() to call into other gnulib modules.  */
+
+int
+rpl_close (int fd)
+{
+#if WINDOWS_SOCKETS
+  int retval = execute_all_close_hooks (close_nothrow, fd);
+#else
+  int retval = close_nothrow (fd);
+#endif
+
+#if REPLACE_FCHDIR
+  if (retval >= 0)
+    _gl_unregister_fd (fd);
+#endif
+
+  return retval;
+}
diff --git a/lib/concat-filename.c b/lib/concat-filename.c
new file mode 100644 (file)
index 0000000..367e41d
--- /dev/null
@@ -0,0 +1,73 @@
+/* Construct a full filename from a directory and a relative filename.
+   Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3 of the License, or any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "concat-filename.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "filename.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+   suffix.  The directory may end with the directory separator.  The second
+   argument may not start with the directory separator (it is relative).
+   Return a freshly allocated filename.  Return NULL and set errno
+   upon memory allocation failure.  */
+char *
+concatenated_filename (const char *directory, const char *filename,
+                       const char *suffix)
+{
+  char *result;
+  char *p;
+
+  if (strcmp (directory, ".") == 0)
+    {
+      /* No need to prepend the directory.  */
+      result = (char *) malloc (strlen (filename)
+                                + (suffix != NULL ? strlen (suffix) : 0)
+                                + 1);
+      if (result == NULL)
+        return NULL; /* errno is set here */
+      p = result;
+    }
+  else
+    {
+      size_t directory_len = strlen (directory);
+      int need_slash =
+        (directory_len > FILE_SYSTEM_PREFIX_LEN (directory)
+         && !ISSLASH (directory[directory_len - 1]));
+      result = (char *) malloc (directory_len + need_slash
+                                + strlen (filename)
+                                + (suffix != NULL ? strlen (suffix) : 0)
+                                + 1);
+      if (result == NULL)
+        return NULL; /* errno is set here */
+      memcpy (result, directory, directory_len);
+      p = result + directory_len;
+      if (need_slash)
+        *p++ = '/';
+    }
+  p = stpcpy (p, filename);
+  if (suffix != NULL)
+    stpcpy (p, suffix);
+  return result;
+}
diff --git a/lib/concat-filename.h b/lib/concat-filename.h
new file mode 100644 (file)
index 0000000..64b461e
--- /dev/null
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+   Copyright (C) 2001-2004, 2007-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _CONCAT_FILENAME_H
+#define _CONCAT_FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Concatenate a directory filename, a relative filename and an optional
+   suffix.  Return a freshly allocated filename.  Return NULL and set errno
+   upon memory allocation failure.  */
+extern char *concatenated_filename (const char *directory,
+                                    const char *filename, const char *suffix);
+
+/* Concatenate a directory filename, a relative filename and an optional
+   suffix.  Return a freshly allocated filename.  */
+extern char *xconcatenated_filename (const char *directory,
+                                     const char *filename, const char *suffix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CONCAT_FILENAME_H */
diff --git a/lib/dirname-lgpl.c b/lib/dirname-lgpl.c
new file mode 100644 (file)
index 0000000..27d4374
--- /dev/null
@@ -0,0 +1,86 @@
+/* dirname.c -- return all but the last element in a file name
+
+   Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2020 Free Software
+   Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "dirname.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Return the length of the prefix of FILE that will be used by
+   dir_name.  If FILE is in the working directory, this returns zero
+   even though 'dir_name (FILE)' will return ".".  Works properly even
+   if there are trailing slashes (by effectively ignoring them).  */
+
+size_t
+dir_len (char const *file)
+{
+  size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
+  size_t length;
+
+  /* Advance prefix_length beyond important leading slashes.  */
+  prefix_length += (prefix_length != 0
+                    ? (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+                       && ISSLASH (file[prefix_length]))
+                    : (ISSLASH (file[0])
+                       ? ((DOUBLE_SLASH_IS_DISTINCT_ROOT
+                           && ISSLASH (file[1]) && ! ISSLASH (file[2])
+                           ? 2 : 1))
+                       : 0));
+
+  /* Strip the basename and any redundant slashes before it.  */
+  for (length = last_component (file) - file;
+       prefix_length < length; length--)
+    if (! ISSLASH (file[length - 1]))
+      break;
+  return length;
+}
+
+
+/* In general, we can't use the builtin 'dirname' function if available,
+   since it has different meanings in different environments.
+   In some environments the builtin 'dirname' modifies its argument.
+
+   Return the leading directories part of FILE, allocated with malloc.
+   Works properly even if there are trailing slashes (by effectively
+   ignoring them).  Return NULL on failure.
+
+   If lstat (FILE) would succeed, then { chdir (dir_name (FILE));
+   lstat (base_name (FILE)); } will access the same file.  Likewise,
+   if the sequence { chdir (dir_name (FILE));
+   rename (base_name (FILE), "foo"); } succeeds, you have renamed FILE
+   to "foo" in the same directory FILE was in.  */
+
+char *
+mdir_name (char const *file)
+{
+  size_t length = dir_len (file);
+  bool append_dot = (length == 0
+                     || (FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+                         && length == FILE_SYSTEM_PREFIX_LEN (file)
+                         && file[2] != '\0' && ! ISSLASH (file[2])));
+  char *dir = malloc (length + append_dot + 1);
+  if (!dir)
+    return NULL;
+  memcpy (dir, file, length);
+  if (append_dot)
+    dir[length++] = '.';
+  dir[length] = '\0';
+  return dir;
+}
diff --git a/lib/dirname.h b/lib/dirname.h
new file mode 100644 (file)
index 0000000..8c12d93
--- /dev/null
@@ -0,0 +1,54 @@
+/*  Take file names apart into directory and base names.
+
+    Copyright (C) 1998, 2001, 2003-2006, 2009-2020 Free Software Foundation,
+    Inc.
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef DIRNAME_H_
+# define DIRNAME_H_ 1
+
+# include <stdbool.h>
+# include <stddef.h>
+# include "dosname.h"
+
+# ifndef DIRECTORY_SEPARATOR
+#  define DIRECTORY_SEPARATOR '/'
+# endif
+
+# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
+#  define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
+# endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+# if GNULIB_DIRNAME
+char *base_name (char const *file) _GL_ATTRIBUTE_MALLOC;
+char *dir_name (char const *file);
+# endif
+
+char *mdir_name (char const *file);
+size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
+size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
+char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
+
+bool strip_trailing_slashes (char *file);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* not DIRNAME_H_ */
diff --git a/lib/dosname.h b/lib/dosname.h
new file mode 100644 (file)
index 0000000..5782960
--- /dev/null
@@ -0,0 +1,52 @@
+/* File names on MS-DOS/Windows systems.
+
+   Copyright (C) 2000-2001, 2004-2006, 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+   From Paul Eggert and Jim Meyering.  */
+
+#ifndef _DOSNAME_H
+#define _DOSNAME_H
+
+#if (defined _WIN32 || defined __CYGWIN__ \
+     || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__)
+   /* This internal macro assumes ASCII, but all hosts that support drive
+      letters use ASCII.  */
+# define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a'  \
+                              <= 'z' - 'a')
+# define FILE_SYSTEM_PREFIX_LEN(Filename) \
+          (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
+# ifndef __CYGWIN__
+#  define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
+# endif
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#else
+# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
+# define ISSLASH(C) ((C) == '/')
+#endif
+
+#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
+#endif
+
+#if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
+#  define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
+# else
+#  define IS_ABSOLUTE_FILE_NAME(F)                              \
+     (ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0)
+#endif
+#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
+
+#endif /* DOSNAME_H_ */
diff --git a/lib/dup2.c b/lib/dup2.c
new file mode 100644 (file)
index 0000000..88ef259
--- /dev/null
@@ -0,0 +1,235 @@
+/* Duplicate an open file descriptor to a specified file descriptor.
+
+   Copyright (C) 1999, 2004-2007, 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Paul Eggert */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+
+#if HAVE_DUP2
+
+# undef dup2
+
+# if defined _WIN32 && ! defined __CYGWIN__
+
+/* Get declarations of the native Windows API functions.  */
+#  define WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+
+#  if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+#   include "msvc-inval.h"
+#  endif
+
+/* Get _get_osfhandle.  */
+#  if GNULIB_MSVC_NOTHROW
+#   include "msvc-nothrow.h"
+#  else
+#   include <io.h>
+#  endif
+
+#  if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+dup2_nothrow (int fd, int desired_fd)
+{
+  int result;
+
+  TRY_MSVC_INVAL
+    {
+      result = dup2 (fd, desired_fd);
+    }
+  CATCH_MSVC_INVAL
+    {
+      errno = EBADF;
+      result = -1;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+#  else
+#   define dup2_nothrow dup2
+#  endif
+
+static int
+ms_windows_dup2 (int fd, int desired_fd)
+{
+  int result;
+
+  /* If fd is closed, mingw hangs on dup2 (fd, fd).  If fd is open,
+     dup2 (fd, fd) returns 0, but all further attempts to use fd in
+     future dup2 calls will hang.  */
+  if (fd == desired_fd)
+    {
+      if ((HANDLE) _get_osfhandle (fd) == INVALID_HANDLE_VALUE)
+        {
+          errno = EBADF;
+          return -1;
+        }
+      return fd;
+    }
+
+  /* Wine 1.0.1 return 0 when desired_fd is negative but not -1:
+     https://bugs.winehq.org/show_bug.cgi?id=21289 */
+  if (desired_fd < 0)
+    {
+      errno = EBADF;
+      return -1;
+    }
+
+  result = dup2_nothrow (fd, desired_fd);
+
+  if (result == 0)
+    result = desired_fd;
+
+  return result;
+}
+
+#  define dup2 ms_windows_dup2
+
+# elif defined __KLIBC__
+
+#  include <InnoTekLIBC/backend.h>
+
+static int
+klibc_dup2dirfd (int fd, int desired_fd)
+{
+  int tempfd;
+  int dupfd;
+
+  tempfd = open ("NUL", O_RDONLY);
+  if (tempfd == -1)
+    return -1;
+
+  if (tempfd == desired_fd)
+    {
+      close (tempfd);
+
+      char path[_MAX_PATH];
+      if (__libc_Back_ioFHToPath (fd, path, sizeof (path)))
+        return -1;
+
+      return open(path, O_RDONLY);
+    }
+
+  dupfd = klibc_dup2dirfd (fd, desired_fd);
+
+  close (tempfd);
+
+  return dupfd;
+}
+
+static int
+klibc_dup2 (int fd, int desired_fd)
+{
+  int dupfd;
+  struct stat sbuf;
+
+  dupfd = dup2 (fd, desired_fd);
+  if (dupfd == -1 && errno == ENOTSUP \
+      && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
+    {
+      close (desired_fd);
+
+      return klibc_dup2dirfd (fd, desired_fd);
+    }
+
+  return dupfd;
+}
+
+#  define dup2 klibc_dup2
+# endif
+
+int
+rpl_dup2 (int fd, int desired_fd)
+{
+  int result;
+
+# ifdef F_GETFL
+  /* On Linux kernels 2.6.26-2.6.29, dup2 (fd, fd) returns -EBADF.
+     On Cygwin 1.5.x, dup2 (1, 1) returns 0.
+     On Cygwin 1.7.17, dup2 (1, -1) dumps core.
+     On Cygwin 1.7.25, dup2 (1, 256) can dump core.
+     On Haiku, dup2 (fd, fd) mistakenly clears FD_CLOEXEC.  */
+#  if HAVE_SETDTABLESIZE
+  setdtablesize (desired_fd + 1);
+#  endif
+  if (desired_fd < 0)
+    fd = desired_fd;
+  if (fd == desired_fd)
+    return fcntl (fd, F_GETFL) == -1 ? -1 : fd;
+# endif
+
+  result = dup2 (fd, desired_fd);
+
+  /* Correct an errno value on FreeBSD 6.1 and Cygwin 1.5.x.  */
+  if (result == -1 && errno == EMFILE)
+    errno = EBADF;
+# if REPLACE_FCHDIR
+  if (fd != desired_fd && result != -1)
+    result = _gl_register_dup (fd, result);
+# endif
+  return result;
+}
+
+#else /* !HAVE_DUP2 */
+
+/* On older platforms, dup2 did not exist.  */
+
+# ifndef F_DUPFD
+static int
+dupfd (int fd, int desired_fd)
+{
+  int duplicated_fd = dup (fd);
+  if (duplicated_fd < 0 || duplicated_fd == desired_fd)
+    return duplicated_fd;
+  else
+    {
+      int r = dupfd (fd, desired_fd);
+      int e = errno;
+      close (duplicated_fd);
+      errno = e;
+      return r;
+    }
+}
+# endif
+
+int
+dup2 (int fd, int desired_fd)
+{
+  int result = fcntl (fd, F_GETFL) < 0 ? -1 : fd;
+  if (result == -1 || fd == desired_fd)
+    return result;
+  close (desired_fd);
+# ifdef F_DUPFD
+  result = fcntl (fd, F_DUPFD, desired_fd);
+#  if REPLACE_FCHDIR
+  if (0 <= result)
+    result = _gl_register_dup (fd, result);
+#  endif
+# else
+  result = dupfd (fd, desired_fd);
+# endif
+  if (result == -1 && (errno == EMFILE || errno == EINVAL))
+    errno = EBADF;
+  return result;
+}
+#endif /* !HAVE_DUP2 */
diff --git a/lib/errno.in.h b/lib/errno.in.h
new file mode 100644 (file)
index 0000000..c27e0c7
--- /dev/null
@@ -0,0 +1,279 @@
+/* A POSIX-like <errno.h>.
+
+   Copyright (C) 2008-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
+
+#ifndef _@GUARD_PREFIX@_ERRNO_H
+#define _@GUARD_PREFIX@_ERRNO_H
+
+
+/* On native Windows platforms, many macros are not defined.  */
+# if defined _WIN32 && ! defined __CYGWIN__
+
+/* These are the same values as defined by MSVC 10, for interoperability.  */
+
+#  ifndef ENOMSG
+#   define ENOMSG    122
+#   define GNULIB_defined_ENOMSG 1
+#  endif
+
+#  ifndef EIDRM
+#   define EIDRM     111
+#   define GNULIB_defined_EIDRM 1
+#  endif
+
+#  ifndef ENOLINK
+#   define ENOLINK   121
+#   define GNULIB_defined_ENOLINK 1
+#  endif
+
+#  ifndef EPROTO
+#   define EPROTO    134
+#   define GNULIB_defined_EPROTO 1
+#  endif
+
+#  ifndef EBADMSG
+#   define EBADMSG   104
+#   define GNULIB_defined_EBADMSG 1
+#  endif
+
+#  ifndef EOVERFLOW
+#   define EOVERFLOW 132
+#   define GNULIB_defined_EOVERFLOW 1
+#  endif
+
+#  ifndef ENOTSUP
+#   define ENOTSUP   129
+#   define GNULIB_defined_ENOTSUP 1
+#  endif
+
+#  ifndef ENETRESET
+#   define ENETRESET 117
+#   define GNULIB_defined_ENETRESET 1
+#  endif
+
+#  ifndef ECONNABORTED
+#   define ECONNABORTED 106
+#   define GNULIB_defined_ECONNABORTED 1
+#  endif
+
+#  ifndef ECANCELED
+#   define ECANCELED 105
+#   define GNULIB_defined_ECANCELED 1
+#  endif
+
+#  ifndef EOWNERDEAD
+#   define EOWNERDEAD 133
+#   define GNULIB_defined_EOWNERDEAD 1
+#  endif
+
+#  ifndef ENOTRECOVERABLE
+#   define ENOTRECOVERABLE 127
+#   define GNULIB_defined_ENOTRECOVERABLE 1
+#  endif
+
+#  ifndef EINPROGRESS
+#   define EINPROGRESS     112
+#   define EALREADY        103
+#   define ENOTSOCK        128
+#   define EDESTADDRREQ    109
+#   define EMSGSIZE        115
+#   define EPROTOTYPE      136
+#   define ENOPROTOOPT     123
+#   define EPROTONOSUPPORT 135
+#   define EOPNOTSUPP      130
+#   define EAFNOSUPPORT    102
+#   define EADDRINUSE      100
+#   define EADDRNOTAVAIL   101
+#   define ENETDOWN        116
+#   define ENETUNREACH     118
+#   define ECONNRESET      108
+#   define ENOBUFS         119
+#   define EISCONN         113
+#   define ENOTCONN        126
+#   define ETIMEDOUT       138
+#   define ECONNREFUSED    107
+#   define ELOOP           114
+#   define EHOSTUNREACH    110
+#   define EWOULDBLOCK     140
+#   define GNULIB_defined_ESOCK 1
+#  endif
+
+#  ifndef ETXTBSY
+#   define ETXTBSY         139
+#   define ENODATA         120  /* not required by POSIX */
+#   define ENOSR           124  /* not required by POSIX */
+#   define ENOSTR          125  /* not required by POSIX */
+#   define ETIME           137  /* not required by POSIX */
+#   define EOTHER          131  /* not required by POSIX */
+#   define GNULIB_defined_ESTREAMS 1
+#  endif
+
+/* These are intentionally the same values as the WSA* error numbers, defined
+   in <winsock2.h>.  */
+#  define ESOCKTNOSUPPORT 10044  /* not required by POSIX */
+#  define EPFNOSUPPORT    10046  /* not required by POSIX */
+#  define ESHUTDOWN       10058  /* not required by POSIX */
+#  define ETOOMANYREFS    10059  /* not required by POSIX */
+#  define EHOSTDOWN       10064  /* not required by POSIX */
+#  define EPROCLIM        10067  /* not required by POSIX */
+#  define EUSERS          10068  /* not required by POSIX */
+#  define EDQUOT          10069
+#  define ESTALE          10070
+#  define EREMOTE         10071  /* not required by POSIX */
+#  define GNULIB_defined_EWINSOCK 1
+
+# endif
+
+
+/* On OSF/1 5.1, when _XOPEN_SOURCE_EXTENDED is not defined, the macros
+   EMULTIHOP, ENOLINK, EOVERFLOW are not defined.  */
+# if @EMULTIHOP_HIDDEN@
+#  define EMULTIHOP @EMULTIHOP_VALUE@
+#  define GNULIB_defined_EMULTIHOP 1
+# endif
+# if @ENOLINK_HIDDEN@
+#  define ENOLINK   @ENOLINK_VALUE@
+#  define GNULIB_defined_ENOLINK 1
+# endif
+# if @EOVERFLOW_HIDDEN@
+#  define EOVERFLOW @EOVERFLOW_VALUE@
+#  define GNULIB_defined_EOVERFLOW 1
+# endif
+
+
+/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
+   EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
+   Likewise, on NonStop Kernel, EDQUOT is not defined.
+   Define them here.  Values >= 2000 seem safe to use: Solaris ESTALE = 151,
+   HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
+
+   Note: When one of these systems defines some of these macros some day,
+   binaries will have to be recompiled so that they recognizes the new
+   errno values from the system.  */
+
+# ifndef ENOMSG
+#  define ENOMSG    2000
+#  define GNULIB_defined_ENOMSG 1
+# endif
+
+# ifndef EIDRM
+#  define EIDRM     2001
+#  define GNULIB_defined_EIDRM 1
+# endif
+
+# ifndef ENOLINK
+#  define ENOLINK   2002
+#  define GNULIB_defined_ENOLINK 1
+# endif
+
+# ifndef EPROTO
+#  define EPROTO    2003
+#  define GNULIB_defined_EPROTO 1
+# endif
+
+# ifndef EMULTIHOP
+#  define EMULTIHOP 2004
+#  define GNULIB_defined_EMULTIHOP 1
+# endif
+
+# ifndef EBADMSG
+#  define EBADMSG   2005
+#  define GNULIB_defined_EBADMSG 1
+# endif
+
+# ifndef EOVERFLOW
+#  define EOVERFLOW 2006
+#  define GNULIB_defined_EOVERFLOW 1
+# endif
+
+# ifndef ENOTSUP
+#  define ENOTSUP   2007
+#  define GNULIB_defined_ENOTSUP 1
+# endif
+
+# ifndef ENETRESET
+#  define ENETRESET 2011
+#  define GNULIB_defined_ENETRESET 1
+# endif
+
+# ifndef ECONNABORTED
+#  define ECONNABORTED 2012
+#  define GNULIB_defined_ECONNABORTED 1
+# endif
+
+# ifndef ESTALE
+#  define ESTALE    2009
+#  define GNULIB_defined_ESTALE 1
+# endif
+
+# ifndef EDQUOT
+#  define EDQUOT 2010
+#  define GNULIB_defined_EDQUOT 1
+# endif
+
+# ifndef ECANCELED
+#  define ECANCELED 2008
+#  define GNULIB_defined_ECANCELED 1
+# endif
+
+/* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not
+   defined.  */
+
+# ifndef EOWNERDEAD
+#  if defined __sun
+    /* Use the same values as defined for Solaris >= 8, for
+       interoperability.  */
+#   define EOWNERDEAD      58
+#   define ENOTRECOVERABLE 59
+#  elif defined _WIN32 && ! defined __CYGWIN__
+    /* We have a conflict here: pthreads-win32 defines these values
+       differently than MSVC 10.  It's hairy to decide which one to use.  */
+#   if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
+     /* Use the same values as defined by pthreads-win32, for
+        interoperability.  */
+#    define EOWNERDEAD      43
+#    define ENOTRECOVERABLE 44
+#   else
+     /* Use the same values as defined by MSVC 10, for
+        interoperability.  */
+#    define EOWNERDEAD      133
+#    define ENOTRECOVERABLE 127
+#   endif
+#  else
+#   define EOWNERDEAD      2013
+#   define ENOTRECOVERABLE 2014
+#  endif
+#  define GNULIB_defined_EOWNERDEAD 1
+#  define GNULIB_defined_ENOTRECOVERABLE 1
+# endif
+
+# ifndef EILSEQ
+#  define EILSEQ 2015
+#  define GNULIB_defined_EILSEQ 1
+# endif
+
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
+#endif /* _@GUARD_PREFIX@_ERRNO_H */
diff --git a/lib/error.c b/lib/error.c
new file mode 100644 (file)
index 0000000..3657b51
--- /dev/null
@@ -0,0 +1,411 @@
+/* Error handler for noninteractive utilities
+   Copyright (C) 1990-1998, 2000-2007, 2009-2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
+
+#if !_LIBC
+# include <config.h>
+#endif
+
+#include "error.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !_LIBC && ENABLE_NLS
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <wchar.h>
+# define mbsrtowcs __mbsrtowcs
+# define USE_UNLOCKED_IO 0
+# define _GL_ATTRIBUTE_FORMAT_PRINTF(a, b)
+# define _GL_ARG_NONNULL(a)
+#else
+# include "getprogname.h"
+#endif
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+#ifndef _
+# define _(String) String
+#endif
+
+/* If NULL, error will flush stdout, then print on stderr the program
+   name, a colon and a space.  Otherwise, error will call this
+   function without parameters instead.  */
+void (*error_print_progname) (void);
+
+/* This variable is incremented each time 'error' is called.  */
+unsigned int error_message_count;
+
+#ifdef _LIBC
+/* In the GNU C library, there is a predefined variable for this.  */
+
+# define program_name program_invocation_name
+# include <errno.h>
+# include <limits.h>
+# include <libio/libioP.h>
+
+/* In GNU libc we want do not want to use the common name 'error' directly.
+   Instead make it a weak alias.  */
+extern void __error (int status, int errnum, const char *message, ...)
+     __attribute__ ((__format__ (__printf__, 3, 4)));
+extern void __error_at_line (int status, int errnum, const char *file_name,
+                             unsigned int line_number, const char *message,
+                             ...)
+     __attribute__ ((__format__ (__printf__, 5, 6)));
+# define error __error
+# define error_at_line __error_at_line
+
+# include <libio/iolibio.h>
+# define fflush(s) _IO_fflush (s)
+# undef putc
+# define putc(c, fp) _IO_putc (c, fp)
+
+# include <bits/libc-lock.h>
+
+#else /* not _LIBC */
+
+# include <fcntl.h>
+# include <unistd.h>
+
+# if defined _WIN32 && ! defined __CYGWIN__
+/* Get declarations of the native Windows API functions.  */
+#  define WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+/* Get _get_osfhandle.  */
+#  if GNULIB_MSVC_NOTHROW
+#   include "msvc-nothrow.h"
+#  else
+#   include <io.h>
+#  endif
+# endif
+
+/* The gnulib override of fcntl is not needed in this file.  */
+# undef fcntl
+
+# if !(GNULIB_STRERROR_R_POSIX || HAVE_DECL_STRERROR_R)
+#  ifndef HAVE_DECL_STRERROR_R
+"this configure-time declaration test was not run"
+#  endif
+#  if STRERROR_R_CHAR_P
+char *strerror_r (int errnum, char *buf, size_t buflen);
+#  else
+int strerror_r (int errnum, char *buf, size_t buflen);
+#  endif
+# endif
+
+# define program_name getprogname ()
+
+# if GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r
+#  define __strerror_r strerror_r
+# endif /* GNULIB_STRERROR_R_POSIX || HAVE_STRERROR_R || defined strerror_r */
+#endif  /* not _LIBC */
+
+#if !_LIBC
+/* Return non-zero if FD is open.  */
+static int
+is_open (int fd)
+{
+# if defined _WIN32 && ! defined __CYGWIN__
+  /* On native Windows: The initial state of unassigned standard file
+     descriptors is that they are open but point to an INVALID_HANDLE_VALUE.
+     There is no fcntl, and the gnulib replacement fcntl does not support
+     F_GETFL.  */
+  return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
+# else
+#  ifndef F_GETFL
+#   error Please port fcntl to your platform
+#  endif
+  return 0 <= fcntl (fd, F_GETFL);
+# endif
+}
+#endif
+
+static void
+flush_stdout (void)
+{
+#if !_LIBC
+  int stdout_fd;
+
+# if GNULIB_FREOPEN_SAFER
+  /* Use of gnulib's freopen-safer module normally ensures that
+       fileno (stdout) == 1
+     whenever stdout is open.  */
+  stdout_fd = STDOUT_FILENO;
+# else
+  /* POSIX states that fileno (stdout) after fclose is unspecified.  But in
+     practice it is not a problem, because stdout is statically allocated and
+     the fd of a FILE stream is stored as a field in its allocated memory.  */
+  stdout_fd = fileno (stdout);
+# endif
+  /* POSIX states that fflush (stdout) after fclose is unspecified; it
+     is safe in glibc, but not on all other platforms.  fflush (NULL)
+     is always defined, but too draconian.  */
+  if (0 <= stdout_fd && is_open (stdout_fd))
+#endif
+    fflush (stdout);
+}
+
+static void
+print_errno_message (int errnum)
+{
+  char const *s;
+
+#if _LIBC || GNULIB_STRERROR_R_POSIX || defined HAVE_STRERROR_R
+  char errbuf[1024];
+# if _LIBC || (!GNULIB_STRERROR_R_POSIX && STRERROR_R_CHAR_P)
+  s = __strerror_r (errnum, errbuf, sizeof errbuf);
+# else
+  if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
+    s = errbuf;
+  else
+    s = 0;
+# endif
+#else
+  s = strerror (errnum);
+#endif
+
+#if !_LIBC
+  if (! s)
+    s = _("Unknown system error");
+#endif
+
+#if _LIBC
+  __fxprintf (NULL, ": %s", s);
+#else
+  fprintf (stderr, ": %s", s);
+#endif
+}
+
+static void _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0) _GL_ARG_NONNULL ((3))
+error_tail (int status, int errnum, const char *message, va_list args)
+{
+#if _LIBC
+  if (_IO_fwide (stderr, 0) > 0)
+    {
+      size_t len = strlen (message) + 1;
+      wchar_t *wmessage = NULL;
+      mbstate_t st;
+      size_t res;
+      const char *tmp;
+      bool use_malloc = false;
+
+      while (1)
+        {
+          if (__libc_use_alloca (len * sizeof (wchar_t)))
+            wmessage = (wchar_t *) alloca (len * sizeof (wchar_t));
+          else
+            {
+              if (!use_malloc)
+                wmessage = NULL;
+
+              wchar_t *p = (wchar_t *) realloc (wmessage,
+                                                len * sizeof (wchar_t));
+              if (p == NULL)
+                {
+                  free (wmessage);
+                  fputws_unlocked (L"out of memory\n", stderr);
+                  return;
+                }
+              wmessage = p;
+              use_malloc = true;
+            }
+
+          memset (&st, '\0', sizeof (st));
+          tmp = message;
+
+          res = mbsrtowcs (wmessage, &tmp, len, &st);
+          if (res != len)
+            break;
+
+          if (__builtin_expect (len >= SIZE_MAX / sizeof (wchar_t) / 2, 0))
+            {
+              /* This really should not happen if everything is fine.  */
+              res = (size_t) -1;
+              break;
+            }
+
+          len *= 2;
+        }
+
+      if (res == (size_t) -1)
+        {
+          /* The string cannot be converted.  */
+          if (use_malloc)
+            {
+              free (wmessage);
+              use_malloc = false;
+            }
+          wmessage = (wchar_t *) L"???";
+        }
+
+      __vfwprintf (stderr, wmessage, args);
+
+      if (use_malloc)
+        free (wmessage);
+    }
+  else
+#endif
+    vfprintf (stderr, message, args);
+
+  ++error_message_count;
+  if (errnum)
+    print_errno_message (errnum);
+#if _LIBC
+  __fxprintf (NULL, "\n");
+#else
+  putc ('\n', stderr);
+#endif
+  fflush (stderr);
+  if (status)
+    exit (status);
+}
+
+
+/* Print the program name and error message MESSAGE, which is a printf-style
+   format string with optional args.
+   If ERRNUM is nonzero, print its corresponding system error message.
+   Exit with status STATUS if it is nonzero.  */
+void
+error (int status, int errnum, const char *message, ...)
+{
+  va_list args;
+
+#if defined _LIBC && defined __libc_ptf_call
+  /* We do not want this call to be cut short by a thread
+     cancellation.  Therefore disable cancellation for now.  */
+  int state = PTHREAD_CANCEL_ENABLE;
+  __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+                   0);
+#endif
+
+  flush_stdout ();
+#ifdef _LIBC
+  _IO_flockfile (stderr);
+#endif
+  if (error_print_progname)
+    (*error_print_progname) ();
+  else
+    {
+#if _LIBC
+      __fxprintf (NULL, "%s: ", program_name);
+#else
+      fprintf (stderr, "%s: ", program_name);
+#endif
+    }
+
+  va_start (args, message);
+  error_tail (status, errnum, message, args);
+  va_end (args);
+
+#ifdef _LIBC
+  _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+  __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+\f
+/* Sometimes we want to have at most one error per line.  This
+   variable controls whether this mode is selected or not.  */
+int error_one_per_line;
+
+void
+error_at_line (int status, int errnum, const char *file_name,
+               unsigned int line_number, const char *message, ...)
+{
+  va_list args;
+
+  if (error_one_per_line)
+    {
+      static const char *old_file_name;
+      static unsigned int old_line_number;
+
+      if (old_line_number == line_number
+          && (file_name == old_file_name
+              || (old_file_name != NULL
+                  && file_name != NULL
+                  && strcmp (old_file_name, file_name) == 0)))
+
+        /* Simply return and print nothing.  */
+        return;
+
+      old_file_name = file_name;
+      old_line_number = line_number;
+    }
+
+#if defined _LIBC && defined __libc_ptf_call
+  /* We do not want this call to be cut short by a thread
+     cancellation.  Therefore disable cancellation for now.  */
+  int state = PTHREAD_CANCEL_ENABLE;
+  __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state),
+                   0);
+#endif
+
+  flush_stdout ();
+#ifdef _LIBC
+  _IO_flockfile (stderr);
+#endif
+  if (error_print_progname)
+    (*error_print_progname) ();
+  else
+    {
+#if _LIBC
+      __fxprintf (NULL, "%s:", program_name);
+#else
+      fprintf (stderr, "%s:", program_name);
+#endif
+    }
+
+#if _LIBC
+  __fxprintf (NULL, file_name != NULL ? "%s:%u: " : " ",
+              file_name, line_number);
+#else
+  fprintf (stderr, file_name != NULL ? "%s:%u: " : " ",
+           file_name, line_number);
+#endif
+
+  va_start (args, message);
+  error_tail (status, errnum, message, args);
+  va_end (args);
+
+#ifdef _LIBC
+  _IO_funlockfile (stderr);
+# ifdef __libc_ptf_call
+  __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0);
+# endif
+#endif
+}
+
+#ifdef _LIBC
+/* Make the weak alias.  */
+# undef error
+# undef error_at_line
+weak_alias (__error, error)
+weak_alias (__error_at_line, error_at_line)
+#endif
diff --git a/lib/error.h b/lib/error.h
new file mode 100644 (file)
index 0000000..bad47a1
--- /dev/null
@@ -0,0 +1,75 @@
+/* Declaration for error-reporting function
+   Copyright (C) 1995-1997, 2003, 2006, 2008-2020 Free Software Foundation,
+   Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _ERROR_H
+#define _ERROR_H 1
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The __-protected variants of the attributes 'format' and 'printf' are
+   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+   gnulib and libintl do '#define printf __printf__' when they override
+   the 'printf' function.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+/* On mingw, the flavor of printf depends on whether the extensions module
+ * is in use; the check for <stdio.h> determines the witness macro.  */
+#ifndef _GL_ATTRIBUTE_SPEC_PRINTF
+# if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+#  define _GL_ATTRIBUTE_SPEC_PRINTF __gnu_printf__
+# else
+#  define _GL_ATTRIBUTE_SPEC_PRINTF __printf__
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Print a message with 'fprintf (stderr, FORMAT, ...)';
+   if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
+   If STATUS is nonzero, terminate the program with 'exit (STATUS)'.  */
+
+extern void error (int __status, int __errnum, const char *__format, ...)
+     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF, 3, 4));
+
+extern void error_at_line (int __status, int __errnum, const char *__fname,
+                           unsigned int __lineno, const char *__format, ...)
+     _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF, 5, 6));
+
+/* If NULL, error will flush stdout, then print on stderr the program
+   name, a colon and a space.  Otherwise, error will call this
+   function without parameters instead.  */
+extern void (*error_print_progname) (void);
+
+/* This variable is incremented each time 'error' is called.  */
+extern unsigned int error_message_count;
+
+/* Sometimes we want to have at most one error per line.  This
+   variable controls whether this mode is selected or not.  */
+extern int error_one_per_line;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* error.h */
diff --git a/lib/exitfail.c b/lib/exitfail.c
new file mode 100644 (file)
index 0000000..189fa16
--- /dev/null
@@ -0,0 +1,24 @@
+/* Failure exit status
+
+   Copyright (C) 2002-2003, 2005-2007, 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "exitfail.h"
+
+#include <stdlib.h>
+
+int volatile exit_failure = EXIT_FAILURE;
diff --git a/lib/exitfail.h b/lib/exitfail.h
new file mode 100644 (file)
index 0000000..a69a03b
--- /dev/null
@@ -0,0 +1,18 @@
+/* Failure exit status
+
+   Copyright (C) 2002, 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+extern int volatile exit_failure;
diff --git a/lib/fcntl.c b/lib/fcntl.c
new file mode 100644 (file)
index 0000000..6b9927e
--- /dev/null
@@ -0,0 +1,627 @@
+/* Provide file descriptor control.
+
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Eric Blake <ebb9@byu.net>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <fcntl.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#ifdef __KLIBC__
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if defined _WIN32 && ! defined __CYGWIN__
+/* Get declarations of the native Windows API functions.  */
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+
+/* Get _get_osfhandle.  */
+# if GNULIB_MSVC_NOTHROW
+#  include "msvc-nothrow.h"
+# else
+#  include <io.h>
+# endif
+
+/* Upper bound on getdtablesize().  See lib/getdtablesize.c.  */
+# define OPEN_MAX_MAX 0x10000
+
+/* Duplicate OLDFD into the first available slot of at least NEWFD,
+   which must be positive, with FLAGS determining whether the duplicate
+   will be inheritable.  */
+static int
+dupfd (int oldfd, int newfd, int flags)
+{
+  /* Mingw has no way to create an arbitrary fd.  Iterate until all
+     file descriptors less than newfd are filled up.  */
+  HANDLE curr_process = GetCurrentProcess ();
+  HANDLE old_handle = (HANDLE) _get_osfhandle (oldfd);
+  unsigned char fds_to_close[OPEN_MAX_MAX / CHAR_BIT];
+  unsigned int fds_to_close_bound = 0;
+  int result;
+  BOOL inherit = flags & O_CLOEXEC ? FALSE : TRUE;
+  int mode;
+
+  if (newfd < 0 || getdtablesize () <= newfd)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+  if (old_handle == INVALID_HANDLE_VALUE
+      || (mode = setmode (oldfd, O_BINARY)) == -1)
+    {
+      /* oldfd is not open, or is an unassigned standard file
+         descriptor.  */
+      errno = EBADF;
+      return -1;
+    }
+  setmode (oldfd, mode);
+  flags |= mode;
+
+  for (;;)
+    {
+      HANDLE new_handle;
+      int duplicated_fd;
+      unsigned int index;
+
+      if (!DuplicateHandle (curr_process,           /* SourceProcessHandle */
+                            old_handle,             /* SourceHandle */
+                            curr_process,           /* TargetProcessHandle */
+                            (PHANDLE) &new_handle,  /* TargetHandle */
+                            (DWORD) 0,              /* DesiredAccess */
+                            inherit,                /* InheritHandle */
+                            DUPLICATE_SAME_ACCESS)) /* Options */
+        {
+          switch (GetLastError ())
+            {
+              case ERROR_TOO_MANY_OPEN_FILES:
+                errno = EMFILE;
+                break;
+              case ERROR_INVALID_HANDLE:
+              case ERROR_INVALID_TARGET_HANDLE:
+              case ERROR_DIRECT_ACCESS_HANDLE:
+                errno = EBADF;
+                break;
+              case ERROR_INVALID_PARAMETER:
+              case ERROR_INVALID_FUNCTION:
+              case ERROR_INVALID_ACCESS:
+                errno = EINVAL;
+                break;
+              default:
+                errno = EACCES;
+                break;
+            }
+          result = -1;
+          break;
+        }
+      duplicated_fd = _open_osfhandle ((intptr_t) new_handle, flags);
+      if (duplicated_fd < 0)
+        {
+          CloseHandle (new_handle);
+          result = -1;
+          break;
+        }
+      if (newfd <= duplicated_fd)
+        {
+          result = duplicated_fd;
+          break;
+        }
+
+      /* Set the bit duplicated_fd in fds_to_close[].  */
+      index = (unsigned int) duplicated_fd / CHAR_BIT;
+      if (fds_to_close_bound <= index)
+        {
+          if (sizeof fds_to_close <= index)
+            /* Need to increase OPEN_MAX_MAX.  */
+            abort ();
+          memset (fds_to_close + fds_to_close_bound, '\0',
+                  index + 1 - fds_to_close_bound);
+          fds_to_close_bound = index + 1;
+        }
+      fds_to_close[index] |= 1 << ((unsigned int) duplicated_fd % CHAR_BIT);
+    }
+
+  /* Close the previous fds that turned out to be too small.  */
+  {
+    int saved_errno = errno;
+    unsigned int duplicated_fd;
+
+    for (duplicated_fd = 0;
+         duplicated_fd < fds_to_close_bound * CHAR_BIT;
+         duplicated_fd++)
+      if ((fds_to_close[duplicated_fd / CHAR_BIT]
+           >> (duplicated_fd % CHAR_BIT))
+          & 1)
+        close (duplicated_fd);
+
+    errno = saved_errno;
+  }
+
+# if REPLACE_FCHDIR
+  if (0 <= result)
+    result = _gl_register_dup (oldfd, result);
+# endif
+  return result;
+}
+#endif /* W32 */
+
+/* Forward declarations, because we '#undef fcntl' in the middle of this
+   compilation unit.  */
+/* Our implementation of fcntl (fd, F_DUPFD, target).  */
+static int rpl_fcntl_DUPFD (int fd, int target);
+/* Our implementation of fcntl (fd, F_DUPFD_CLOEXEC, target).  */
+static int rpl_fcntl_DUPFD_CLOEXEC (int fd, int target);
+#ifdef __KLIBC__
+/* Adds support for fcntl on directories.  */
+static int klibc_fcntl (int fd, int action, /* arg */...);
+#endif
+
+
+/* Perform the specified ACTION on the file descriptor FD, possibly
+   using the argument ARG further described below.  This replacement
+   handles the following actions, and forwards all others on to the
+   native fcntl.  An unrecognized ACTION returns -1 with errno set to
+   EINVAL.
+
+   F_DUPFD - duplicate FD, with int ARG being the minimum target fd.
+   If successful, return the duplicate, which will be inheritable;
+   otherwise return -1 and set errno.
+
+   F_DUPFD_CLOEXEC - duplicate FD, with int ARG being the minimum
+   target fd.  If successful, return the duplicate, which will not be
+   inheritable; otherwise return -1 and set errno.
+
+   F_GETFD - ARG need not be present.  If successful, return a
+   non-negative value containing the descriptor flags of FD (only
+   FD_CLOEXEC is portable, but other flags may be present); otherwise
+   return -1 and set errno.  */
+
+int
+fcntl (int fd, int action, /* arg */...)
+#undef fcntl
+#ifdef __KLIBC__
+# define fcntl klibc_fcntl
+#endif
+{
+  va_list arg;
+  int result = -1;
+  va_start (arg, action);
+  switch (action)
+    {
+    case F_DUPFD:
+      {
+        int target = va_arg (arg, int);
+        result = rpl_fcntl_DUPFD (fd, target);
+        break;
+      }
+
+    case F_DUPFD_CLOEXEC:
+      {
+        int target = va_arg (arg, int);
+        result = rpl_fcntl_DUPFD_CLOEXEC (fd, target);
+        break;
+      }
+
+#if !HAVE_FCNTL
+    case F_GETFD:
+      {
+# if defined _WIN32 && ! defined __CYGWIN__
+        HANDLE handle = (HANDLE) _get_osfhandle (fd);
+        DWORD flags;
+        if (handle == INVALID_HANDLE_VALUE
+            || GetHandleInformation (handle, &flags) == 0)
+          errno = EBADF;
+        else
+          result = (flags & HANDLE_FLAG_INHERIT) ? 0 : FD_CLOEXEC;
+# else /* !W32 */
+        /* Use dup2 to reject invalid file descriptors.  No way to
+           access this information, so punt.  */
+        if (0 <= dup2 (fd, fd))
+          result = 0;
+# endif /* !W32 */
+        break;
+      } /* F_GETFD */
+#endif /* !HAVE_FCNTL */
+
+      /* Implementing F_SETFD on mingw is not trivial - there is no
+         API for changing the O_NOINHERIT bit on an fd, and merely
+         changing the HANDLE_FLAG_INHERIT bit on the underlying handle
+         can lead to odd state.  It may be possible by duplicating the
+         handle, using _open_osfhandle with the right flags, then
+         using dup2 to move the duplicate onto the original, but that
+         is not supported for now.  */
+
+    default:
+      {
+#if HAVE_FCNTL
+        switch (action)
+          {
+          #ifdef F_BARRIERFSYNC                  /* macOS */
+          case F_BARRIERFSYNC:
+          #endif
+          #ifdef F_CHKCLEAN                      /* macOS */
+          case F_CHKCLEAN:
+          #endif
+          #ifdef F_CLOSEM                        /* NetBSD, HP-UX */
+          case F_CLOSEM:
+          #endif
+          #ifdef F_FLUSH_DATA                    /* macOS */
+          case F_FLUSH_DATA:
+          #endif
+          #ifdef F_FREEZE_FS                     /* macOS */
+          case F_FREEZE_FS:
+          #endif
+          #ifdef F_FULLFSYNC                     /* macOS */
+          case F_FULLFSYNC:
+          #endif
+          #ifdef F_GETCONFINED                   /* macOS */
+          case F_GETCONFINED:
+          #endif
+          #ifdef F_GETDEFAULTPROTLEVEL           /* macOS */
+          case F_GETDEFAULTPROTLEVEL:
+          #endif
+          #ifdef F_GETFD                         /* POSIX */
+          case F_GETFD:
+          #endif
+          #ifdef F_GETFL                         /* POSIX */
+          case F_GETFL:
+          #endif
+          #ifdef F_GETLEASE                      /* Linux */
+          case F_GETLEASE:
+          #endif
+          #ifdef F_GETNOSIGPIPE                  /* macOS */
+          case F_GETNOSIGPIPE:
+          #endif
+          #ifdef F_GETOWN                        /* POSIX */
+          case F_GETOWN:
+          #endif
+          #ifdef F_GETPIPE_SZ                    /* Linux */
+          case F_GETPIPE_SZ:
+          #endif
+          #ifdef F_GETPROTECTIONCLASS            /* macOS */
+          case F_GETPROTECTIONCLASS:
+          #endif
+          #ifdef F_GETPROTECTIONLEVEL            /* macOS */
+          case F_GETPROTECTIONLEVEL:
+          #endif
+          #ifdef F_GET_SEALS                     /* Linux */
+          case F_GET_SEALS:
+          #endif
+          #ifdef F_GETSIG                        /* Linux */
+          case F_GETSIG:
+          #endif
+          #ifdef F_MAXFD                         /* NetBSD */
+          case F_MAXFD:
+          #endif
+          #ifdef F_RECYCLE                       /* macOS */
+          case F_RECYCLE:
+          #endif
+          #ifdef F_SETFIFOENH                    /* HP-UX */
+          case F_SETFIFOENH:
+          #endif
+          #ifdef F_THAW_FS                       /* macOS */
+          case F_THAW_FS:
+          #endif
+            /* These actions take no argument.  */
+            result = fcntl (fd, action);
+            break;
+
+          #ifdef F_ADD_SEALS                     /* Linux */
+          case F_ADD_SEALS:
+          #endif
+          #ifdef F_BADFD                         /* Solaris */
+          case F_BADFD:
+          #endif
+          #ifdef F_CHECK_OPENEVT                 /* macOS */
+          case F_CHECK_OPENEVT:
+          #endif
+          #ifdef F_DUP2FD                        /* FreeBSD, AIX, Solaris */
+          case F_DUP2FD:
+          #endif
+          #ifdef F_DUP2FD_CLOEXEC                /* FreeBSD, Solaris */
+          case F_DUP2FD_CLOEXEC:
+          #endif
+          #ifdef F_DUP2FD_CLOFORK                /* Solaris */
+          case F_DUP2FD_CLOFORK:
+          #endif
+          #ifdef F_DUPFD                         /* POSIX */
+          case F_DUPFD:
+          #endif
+          #ifdef F_DUPFD_CLOEXEC                 /* POSIX */
+          case F_DUPFD_CLOEXEC:
+          #endif
+          #ifdef F_DUPFD_CLOFORK                 /* Solaris */
+          case F_DUPFD_CLOFORK:
+          #endif
+          #ifdef F_GETXFL                        /* Solaris */
+          case F_GETXFL:
+          #endif
+          #ifdef F_GLOBAL_NOCACHE                /* macOS */
+          case F_GLOBAL_NOCACHE:
+          #endif
+          #ifdef F_MAKECOMPRESSED                /* macOS */
+          case F_MAKECOMPRESSED:
+          #endif
+          #ifdef F_MOVEDATAEXTENTS               /* macOS */
+          case F_MOVEDATAEXTENTS:
+          #endif
+          #ifdef F_NOCACHE                       /* macOS */
+          case F_NOCACHE:
+          #endif
+          #ifdef F_NODIRECT                      /* macOS */
+          case F_NODIRECT:
+          #endif
+          #ifdef F_NOTIFY                        /* Linux */
+          case F_NOTIFY:
+          #endif
+          #ifdef F_OPLKACK                       /* IRIX */
+          case F_OPLKACK:
+          #endif
+          #ifdef F_OPLKREG                       /* IRIX */
+          case F_OPLKREG:
+          #endif
+          #ifdef F_RDAHEAD                       /* macOS */
+          case F_RDAHEAD:
+          #endif
+          #ifdef F_SETBACKINGSTORE               /* macOS */
+          case F_SETBACKINGSTORE:
+          #endif
+          #ifdef F_SETCONFINED                   /* macOS */
+          case F_SETCONFINED:
+          #endif
+          #ifdef F_SETFD                         /* POSIX */
+          case F_SETFD:
+          #endif
+          #ifdef F_SETFL                         /* POSIX */
+          case F_SETFL:
+          #endif
+          #ifdef F_SETLEASE                      /* Linux */
+          case F_SETLEASE:
+          #endif
+          #ifdef F_SETNOSIGPIPE                  /* macOS */
+          case F_SETNOSIGPIPE:
+          #endif
+          #ifdef F_SETOWN                        /* POSIX */
+          case F_SETOWN:
+          #endif
+          #ifdef F_SETPIPE_SZ                    /* Linux */
+          case F_SETPIPE_SZ:
+          #endif
+          #ifdef F_SETPROTECTIONCLASS            /* macOS */
+          case F_SETPROTECTIONCLASS:
+          #endif
+          #ifdef F_SETSIG                        /* Linux */
+          case F_SETSIG:
+          #endif
+          #ifdef F_SINGLE_WRITER                 /* macOS */
+          case F_SINGLE_WRITER:
+          #endif
+            /* These actions take an 'int' argument.  */
+            {
+              int x = va_arg (arg, int);
+              result = fcntl (fd, action, x);
+            }
+            break;
+
+          default:
+            /* Other actions take a pointer argument.  */
+            {
+              void *p = va_arg (arg, void *);
+              result = fcntl (fd, action, p);
+            }
+            break;
+          }
+#else
+        errno = EINVAL;
+#endif
+        break;
+      }
+    }
+  va_end (arg);
+  return result;
+}
+
+static int
+rpl_fcntl_DUPFD (int fd, int target)
+{
+  int result;
+#if !HAVE_FCNTL
+  result = dupfd (fd, target, 0);
+#elif FCNTL_DUPFD_BUGGY || REPLACE_FCHDIR
+  /* Detect invalid target; needed for cygwin 1.5.x.  */
+  if (target < 0 || getdtablesize () <= target)
+    {
+      result = -1;
+      errno = EINVAL;
+    }
+  else
+    {
+      /* Haiku alpha 2 loses fd flags on original.  */
+      int flags = fcntl (fd, F_GETFD);
+      if (flags < 0)
+        result = -1;
+      else
+        {
+          result = fcntl (fd, F_DUPFD, target);
+          if (0 <= result && fcntl (fd, F_SETFD, flags) == -1)
+            {
+              int saved_errno = errno;
+              close (result);
+              result = -1;
+              errno = saved_errno;
+            }
+# if REPLACE_FCHDIR
+          if (0 <= result)
+            result = _gl_register_dup (fd, result);
+# endif
+        }
+    }
+#else
+  result = fcntl (fd, F_DUPFD, target);
+#endif
+  return result;
+}
+
+static int
+rpl_fcntl_DUPFD_CLOEXEC (int fd, int target)
+{
+  int result;
+#if !HAVE_FCNTL
+  result = dupfd (fd, target, O_CLOEXEC);
+#else /* HAVE_FCNTL */
+# if defined __HAIKU__
+  /* On Haiku, the system fcntl (fd, F_DUPFD_CLOEXEC, target) sets
+     the FD_CLOEXEC flag on fd, not on target.  Therefore avoid the
+     system fcntl in this case.  */
+#  define have_dupfd_cloexec -1
+# else
+  /* Try the system call first, if the headers claim it exists
+     (that is, if GNULIB_defined_F_DUPFD_CLOEXEC is 0), since we
+     may be running with a glibc that has the macro but with an
+     older kernel that does not support it.  Cache the
+     information on whether the system call really works, but
+     avoid caching failure if the corresponding F_DUPFD fails
+     for any reason.  0 = unknown, 1 = yes, -1 = no.  */
+  static int have_dupfd_cloexec = GNULIB_defined_F_DUPFD_CLOEXEC ? -1 : 0;
+  if (0 <= have_dupfd_cloexec)
+    {
+      result = fcntl (fd, F_DUPFD_CLOEXEC, target);
+      if (0 <= result || errno != EINVAL)
+        {
+          have_dupfd_cloexec = 1;
+#  if REPLACE_FCHDIR
+          if (0 <= result)
+            result = _gl_register_dup (fd, result);
+#  endif
+        }
+      else
+        {
+          result = rpl_fcntl_DUPFD (fd, target);
+          if (result >= 0)
+            have_dupfd_cloexec = -1;
+        }
+    }
+  else
+# endif
+    result = rpl_fcntl_DUPFD (fd, target);
+  if (0 <= result && have_dupfd_cloexec == -1)
+    {
+      int flags = fcntl (result, F_GETFD);
+      if (flags < 0 || fcntl (result, F_SETFD, flags | FD_CLOEXEC) == -1)
+        {
+          int saved_errno = errno;
+          close (result);
+          errno = saved_errno;
+          result = -1;
+        }
+    }
+#endif /* HAVE_FCNTL */
+  return result;
+}
+
+#undef fcntl
+
+#ifdef __KLIBC__
+
+static int
+klibc_fcntl (int fd, int action, /* arg */...)
+{
+  va_list arg_ptr;
+  int arg;
+  struct stat sbuf;
+  int result;
+
+  va_start (arg_ptr, action);
+  arg = va_arg (arg_ptr, int);
+  result = fcntl (fd, action, arg);
+  /* EPERM for F_DUPFD, ENOTSUP for others */
+  if (result == -1 && (errno == EPERM || errno == ENOTSUP)
+      && !fstat (fd, &sbuf) && S_ISDIR (sbuf.st_mode))
+    {
+      ULONG ulMode;
+
+      switch (action)
+        {
+        case F_DUPFD:
+          /* Find available fd */
+          while (fcntl (arg, F_GETFL) != -1 || errno != EBADF)
+            arg++;
+
+          result = dup2 (fd, arg);
+          break;
+
+        /* Using underlying APIs is right ? */
+        case F_GETFD:
+          if (DosQueryFHState (fd, &ulMode))
+            break;
+
+          result = (ulMode & OPEN_FLAGS_NOINHERIT) ? FD_CLOEXEC : 0;
+          break;
+
+        case F_SETFD:
+          if (arg & ~FD_CLOEXEC)
+            break;
+
+          if (DosQueryFHState (fd, &ulMode))
+            break;
+
+          if (arg & FD_CLOEXEC)
+            ulMode |= OPEN_FLAGS_NOINHERIT;
+          else
+            ulMode &= ~OPEN_FLAGS_NOINHERIT;
+
+          /* Filter supported flags.  */
+          ulMode &= (OPEN_FLAGS_WRITE_THROUGH | OPEN_FLAGS_FAIL_ON_ERROR
+                     | OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_NOINHERIT);
+
+          if (DosSetFHState (fd, ulMode))
+            break;
+
+          result = 0;
+          break;
+
+        case F_GETFL:
+          result = 0;
+          break;
+
+        case F_SETFL:
+          if (arg != 0)
+            break;
+
+          result = 0;
+          break;
+
+        default:
+          errno = EINVAL;
+          break;
+        }
+    }
+
+  va_end (arg_ptr);
+
+  return result;
+}
+
+#endif
diff --git a/lib/fcntl.in.h b/lib/fcntl.in.h
new file mode 100644 (file)
index 0000000..b2e1e51
--- /dev/null
@@ -0,0 +1,392 @@
+/* Like <fcntl.h>, but with non-working flags defined to 0.
+
+   Copyright (C) 2006-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Paul Eggert */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_fcntl_h
+/* Special invocation convention.  */
+
+/* Needed before <sys/stat.h>.
+   May also define off_t to a 64-bit type on native Windows.  */
+#include <sys/types.h>
+/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
+   <fcntl.h>.  On glibc systems, we would like to avoid namespace pollution.
+   But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
+   extern "C" { ... } block, which leads to errors in C++ mode with the
+   overridden <sys/stat.h> from gnulib.  These errors are known to be gone
+   with g++ version >= 4.3.  */
+#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
+# include <sys/stat.h>
+#endif
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+/* Native Windows platforms declare open(), creat() in <io.h>.  */
+#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
+    && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_FCNTL_H
+
+/* Needed before <sys/stat.h>.
+   May also define off_t to a 64-bit type on native Windows.  */
+#include <sys/types.h>
+/* On some systems other than glibc, <sys/stat.h> is a prerequisite of
+   <fcntl.h>.  On glibc systems, we would like to avoid namespace pollution.
+   But on glibc systems, <fcntl.h> includes <sys/stat.h> inside an
+   extern "C" { ... } block, which leads to errors in C++ mode with the
+   overridden <sys/stat.h> from gnulib.  These errors are known to be gone
+   with g++ version >= 4.3.  */
+#if !(defined __GLIBC__ || defined __UCLIBC__) || (defined __cplusplus && defined GNULIB_NAMESPACE && (defined __ICC || !(__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))))
+# include <sys/stat.h>
+#endif
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_FCNTL_H@
+
+/* Native Windows platforms declare open(), creat() in <io.h>.  */
+#if (@GNULIB_CREAT@ || @GNULIB_OPEN@ || defined GNULIB_POSIXCHECK) \
+    && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+#ifndef _@GUARD_PREFIX@_FCNTL_H
+#define _@GUARD_PREFIX@_FCNTL_H
+
+#ifndef __GLIBC__ /* Avoid namespace pollution on glibc systems.  */
+# include <unistd.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Declare overridden functions.  */
+
+#if @GNULIB_CREAT@
+# if @REPLACE_CREAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef creat
+#   define creat rpl_creat
+#  endif
+_GL_FUNCDECL_RPL (creat, int, (const char *filename, mode_t mode)
+                             _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (creat, int, (const char *filename, mode_t mode));
+# else
+_GL_CXXALIAS_SYS (creat, int, (const char *filename, mode_t mode));
+# endif
+_GL_CXXALIASWARN (creat);
+#elif defined GNULIB_POSIXCHECK
+# undef creat
+/* Assume creat is always declared.  */
+_GL_WARN_ON_USE (creat, "creat is not always POSIX compliant - "
+                 "use gnulib module creat for portability");
+#endif
+
+#if @GNULIB_FCNTL@
+# if @REPLACE_FCNTL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fcntl
+#   define fcntl rpl_fcntl
+#  endif
+_GL_FUNCDECL_RPL (fcntl, int, (int fd, int action, ...));
+_GL_CXXALIAS_RPL (fcntl, int, (int fd, int action, ...));
+# else
+#  if !@HAVE_FCNTL@
+_GL_FUNCDECL_SYS (fcntl, int, (int fd, int action, ...));
+#  endif
+_GL_CXXALIAS_SYS (fcntl, int, (int fd, int action, ...));
+# endif
+_GL_CXXALIASWARN (fcntl);
+#elif defined GNULIB_POSIXCHECK
+# undef fcntl
+# if HAVE_RAW_DECL_FCNTL
+_GL_WARN_ON_USE (fcntl, "fcntl is not always POSIX compliant - "
+                 "use gnulib module fcntl for portability");
+# endif
+#endif
+
+#if @GNULIB_OPEN@
+# if @REPLACE_OPEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef open
+#   define open rpl_open
+#  endif
+_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
+                             _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
+# else
+_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
+# endif
+/* On HP-UX 11, in C++ mode, open() is defined as an inline function with a
+   default argument.  _GL_CXXALIASWARN does not work in this case.  */
+# if !defined __hpux
+_GL_CXXALIASWARN (open);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef open
+/* Assume open is always declared.  */
+_GL_WARN_ON_USE (open, "open is not always POSIX compliant - "
+                 "use gnulib module open for portability");
+#endif
+
+#if @GNULIB_OPENAT@
+# if @REPLACE_OPENAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef openat
+#   define openat rpl_openat
+#  endif
+_GL_FUNCDECL_RPL (openat, int,
+                  (int fd, char const *file, int flags, /* mode_t mode */ ...)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (openat, int,
+                  (int fd, char const *file, int flags, /* mode_t mode */ ...));
+# else
+#  if !@HAVE_OPENAT@
+_GL_FUNCDECL_SYS (openat, int,
+                  (int fd, char const *file, int flags, /* mode_t mode */ ...)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (openat, int,
+                  (int fd, char const *file, int flags, /* mode_t mode */ ...));
+# endif
+_GL_CXXALIASWARN (openat);
+#elif defined GNULIB_POSIXCHECK
+# undef openat
+# if HAVE_RAW_DECL_OPENAT
+_GL_WARN_ON_USE (openat, "openat is not portable - "
+                 "use gnulib module openat for portability");
+# endif
+#endif
+
+
+/* Fix up the FD_* macros, only known to be missing on mingw.  */
+
+#ifndef FD_CLOEXEC
+# define FD_CLOEXEC 1
+#endif
+
+/* Fix up the supported F_* macros.  Intentionally leave other F_*
+   macros undefined.  Only known to be missing on mingw.  */
+
+#ifndef F_DUPFD_CLOEXEC
+# define F_DUPFD_CLOEXEC 0x40000000
+/* Witness variable: 1 if gnulib defined F_DUPFD_CLOEXEC, 0 otherwise.  */
+# define GNULIB_defined_F_DUPFD_CLOEXEC 1
+#else
+# define GNULIB_defined_F_DUPFD_CLOEXEC 0
+#endif
+
+#ifndef F_DUPFD
+# define F_DUPFD 1
+#endif
+
+#ifndef F_GETFD
+# define F_GETFD 2
+#endif
+
+/* Fix up the O_* macros.  */
+
+/* AIX 7.1 with XL C 12.1 defines O_CLOEXEC, O_NOFOLLOW, and O_TTY_INIT
+   to values outside 'int' range, so omit these misdefinitions.
+   But avoid namespace pollution on non-AIX systems.  */
+#ifdef _AIX
+# include <limits.h>
+# if defined O_CLOEXEC && ! (INT_MIN <= O_CLOEXEC && O_CLOEXEC <= INT_MAX)
+#  undef O_CLOEXEC
+# endif
+# if defined O_NOFOLLOW && ! (INT_MIN <= O_NOFOLLOW && O_NOFOLLOW <= INT_MAX)
+#  undef O_NOFOLLOW
+# endif
+# if defined O_TTY_INIT && ! (INT_MIN <= O_TTY_INIT && O_TTY_INIT <= INT_MAX)
+#  undef O_TTY_INIT
+# endif
+#endif
+
+#if !defined O_DIRECT && defined O_DIRECTIO
+/* Tru64 spells it 'O_DIRECTIO'.  */
+# define O_DIRECT O_DIRECTIO
+#endif
+
+#if !defined O_CLOEXEC && defined O_NOINHERIT
+/* Mingw spells it 'O_NOINHERIT'.  */
+# define O_CLOEXEC O_NOINHERIT
+#endif
+
+#ifndef O_CLOEXEC
+# define O_CLOEXEC 0x40000000 /* Try to not collide with system O_* flags.  */
+# define GNULIB_defined_O_CLOEXEC 1
+#else
+# define GNULIB_defined_O_CLOEXEC 0
+#endif
+
+#ifndef O_DIRECT
+# define O_DIRECT 0
+#endif
+
+#ifndef O_DIRECTORY
+# define O_DIRECTORY 0
+#endif
+
+#ifndef O_DSYNC
+# define O_DSYNC 0
+#endif
+
+#ifndef O_EXEC
+# define O_EXEC O_RDONLY /* This is often close enough in older systems.  */
+#endif
+
+#ifndef O_IGNORE_CTTY
+# define O_IGNORE_CTTY 0
+#endif
+
+#ifndef O_NDELAY
+# define O_NDELAY 0
+#endif
+
+#ifndef O_NOATIME
+# define O_NOATIME 0
+#endif
+
+#ifndef O_NONBLOCK
+# define O_NONBLOCK O_NDELAY
+#endif
+
+/* If the gnulib module 'nonblocking' is in use, guarantee a working non-zero
+   value of O_NONBLOCK.  Otherwise, O_NONBLOCK is defined (above) to O_NDELAY
+   or to 0 as fallback.  */
+#if @GNULIB_NONBLOCKING@
+# if O_NONBLOCK
+#  define GNULIB_defined_O_NONBLOCK 0
+# else
+#  define GNULIB_defined_O_NONBLOCK 1
+#  undef O_NONBLOCK
+#  define O_NONBLOCK 0x40000000
+# endif
+#endif
+
+#ifndef O_NOCTTY
+# define O_NOCTTY 0
+#endif
+
+#ifndef O_NOFOLLOW
+# define O_NOFOLLOW 0
+#endif
+
+#ifndef O_NOLINK
+# define O_NOLINK 0
+#endif
+
+#ifndef O_NOLINKS
+# define O_NOLINKS 0
+#endif
+
+#ifndef O_NOTRANS
+# define O_NOTRANS 0
+#endif
+
+#ifndef O_RSYNC
+# define O_RSYNC 0
+#endif
+
+#ifndef O_SEARCH
+# define O_SEARCH O_RDONLY /* This is often close enough in older systems.  */
+#endif
+
+#ifndef O_SYNC
+# define O_SYNC 0
+#endif
+
+#ifndef O_TTY_INIT
+# define O_TTY_INIT 0
+#endif
+
+#if ~O_ACCMODE & (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
+# undef O_ACCMODE
+# define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+   O_BINARY is usually declared in fcntl.h  */
+#if !defined O_BINARY && defined _O_BINARY
+  /* For MSC-compatible compilers.  */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+
+#if defined __BEOS__ || defined __HAIKU__
+  /* BeOS 5 and Haiku have O_BINARY and O_TEXT, but they have no effect.  */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+
+#ifndef O_BINARY
+# define O_BINARY 0
+# define O_TEXT 0
+#endif
+
+/* Fix up the AT_* macros.  */
+
+/* Work around a bug in Solaris 9 and 10: AT_FDCWD is positive.  Its
+   value exceeds INT_MAX, so its use as an int doesn't conform to the
+   C standard, and GCC and Sun C complain in some cases.  If the bug
+   is present, undef AT_FDCWD here, so it can be redefined below.  */
+#if 0 < AT_FDCWD && AT_FDCWD == 0xffd19553
+# undef AT_FDCWD
+#endif
+
+/* Use the same bit pattern as Solaris 9, but with the proper
+   signedness.  The bit pattern is important, in case this actually is
+   Solaris with the above workaround.  */
+#ifndef AT_FDCWD
+# define AT_FDCWD (-3041965)
+#endif
+
+/* Use the same values as Solaris 9.  This shouldn't matter, but
+   there's no real reason to differ.  */
+#ifndef AT_SYMLINK_NOFOLLOW
+# define AT_SYMLINK_NOFOLLOW 4096
+#endif
+
+#ifndef AT_REMOVEDIR
+# define AT_REMOVEDIR 1
+#endif
+
+/* Solaris 9 lacks these two, so just pick unique values.  */
+#ifndef AT_SYMLINK_FOLLOW
+# define AT_SYMLINK_FOLLOW 2
+#endif
+
+#ifndef AT_EACCESS
+# define AT_EACCESS 4
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_FCNTL_H */
+#endif /* _@GUARD_PREFIX@_FCNTL_H */
+#endif
diff --git a/lib/fd-hook.c b/lib/fd-hook.c
new file mode 100644 (file)
index 0000000..8840f63
--- /dev/null
@@ -0,0 +1,116 @@
+/* Hook for making file descriptor functions close(), ioctl() extensible.
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2009.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "fd-hook.h"
+
+#include <stdlib.h>
+
+/* Currently, this entire code is only needed for the handling of sockets
+   on native Windows platforms.  */
+#if WINDOWS_SOCKETS
+
+/* The first and last link in the doubly linked list.
+   Initially the list is empty.  */
+static struct fd_hook anchor = { &anchor, &anchor, NULL, NULL };
+
+int
+execute_close_hooks (const struct fd_hook *remaining_list, gl_close_fn primary,
+                     int fd)
+{
+  if (remaining_list == &anchor)
+    /* End of list reached.  */
+    return primary (fd);
+  else
+    return remaining_list->private_close_fn (remaining_list->private_next,
+                                             primary, fd);
+}
+
+int
+execute_all_close_hooks (gl_close_fn primary, int fd)
+{
+  return execute_close_hooks (anchor.private_next, primary, fd);
+}
+
+int
+execute_ioctl_hooks (const struct fd_hook *remaining_list, gl_ioctl_fn primary,
+                     int fd, int request, void *arg)
+{
+  if (remaining_list == &anchor)
+    /* End of list reached.  */
+    return primary (fd, request, arg);
+  else
+    return remaining_list->private_ioctl_fn (remaining_list->private_next,
+                                             primary, fd, request, arg);
+}
+
+int
+execute_all_ioctl_hooks (gl_ioctl_fn primary,
+                         int fd, int request, void *arg)
+{
+  return execute_ioctl_hooks (anchor.private_next, primary, fd, request, arg);
+}
+
+void
+register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook, struct fd_hook *link)
+{
+  if (close_hook == NULL)
+    close_hook = execute_close_hooks;
+  if (ioctl_hook == NULL)
+    ioctl_hook = execute_ioctl_hooks;
+
+  if (link->private_next == NULL && link->private_prev == NULL)
+    {
+      /* Add the link to the doubly linked list.  */
+      link->private_next = anchor.private_next;
+      link->private_prev = &anchor;
+      link->private_close_fn = close_hook;
+      link->private_ioctl_fn = ioctl_hook;
+      anchor.private_next->private_prev = link;
+      anchor.private_next = link;
+    }
+  else
+    {
+      /* The link is already in use.  */
+      if (link->private_close_fn != close_hook
+          || link->private_ioctl_fn != ioctl_hook)
+        abort ();
+    }
+}
+
+void
+unregister_fd_hook (struct fd_hook *link)
+{
+  struct fd_hook *next = link->private_next;
+  struct fd_hook *prev = link->private_prev;
+
+  if (next != NULL && prev != NULL)
+    {
+      /* The link is in use.  Remove it from the doubly linked list.  */
+      prev->private_next = next;
+      next->private_prev = prev;
+      /* Clear the link, to mark it unused.  */
+      link->private_next = NULL;
+      link->private_prev = NULL;
+      link->private_close_fn = NULL;
+      link->private_ioctl_fn = NULL;
+    }
+}
+
+#endif
diff --git a/lib/fd-hook.h b/lib/fd-hook.h
new file mode 100644 (file)
index 0000000..ed1a15a
--- /dev/null
@@ -0,0 +1,119 @@
+/* Hook for making file descriptor functions close(), ioctl() extensible.
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+
+#ifndef FD_HOOK_H
+#define FD_HOOK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Currently, this entire code is only needed for the handling of sockets
+   on native Windows platforms.  */
+#if WINDOWS_SOCKETS
+
+
+/* Type of function that closes FD.  */
+typedef int (*gl_close_fn) (int fd);
+
+/* Type of function that applies a control request to FD.  */
+typedef int (*gl_ioctl_fn) (int fd, int request, void *arg);
+
+/* An element of the list of file descriptor hooks.
+   In CLOS (Common Lisp Object System) speak, it consists of an "around"
+   method for the close() function and an "around" method for the ioctl()
+   function.
+   The fields of this structure are considered private.  */
+struct fd_hook
+{
+  /* Doubly linked list.  */
+  struct fd_hook *private_next;
+  struct fd_hook *private_prev;
+  /* Function that treats the types of FD that it knows about and calls
+     execute_close_hooks (REMAINING_LIST, PRIMARY, FD) as a fallback.  */
+  int (*private_close_fn) (const struct fd_hook *remaining_list,
+                           gl_close_fn primary,
+                           int fd);
+  /* Function that treats the types of FD that it knows about and calls
+     execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG) as a
+     fallback.  */
+  int (*private_ioctl_fn) (const struct fd_hook *remaining_list,
+                           gl_ioctl_fn primary,
+                           int fd, int request, void *arg);
+};
+
+/* This type of function closes FD, applying special knowledge for the FD
+   types it knows about, and calls
+   execute_close_hooks (REMAINING_LIST, PRIMARY, FD)
+   for the other FD types.
+   In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
+   and PRIMARY is the "primary" method for close().  */
+typedef int (*close_hook_fn) (const struct fd_hook *remaining_list,
+                              gl_close_fn primary,
+                              int fd);
+
+/* Execute the close hooks in REMAINING_LIST, with PRIMARY as "primary" method.
+   Return 0 or -1, like close() would do.  */
+extern int execute_close_hooks (const struct fd_hook *remaining_list,
+                                gl_close_fn primary,
+                                int fd);
+
+/* Execute all close hooks, with PRIMARY as "primary" method.
+   Return 0 or -1, like close() would do.  */
+extern int execute_all_close_hooks (gl_close_fn primary, int fd);
+
+/* This type of function applies a control request to FD, applying special
+   knowledge for the FD types it knows about, and calls
+   execute_ioctl_hooks (REMAINING_LIST, PRIMARY, FD, REQUEST, ARG)
+   for the other FD types.
+   In CLOS speak, REMAINING_LIST is the remaining list of "around" methods,
+   and PRIMARY is the "primary" method for ioctl().  */
+typedef int (*ioctl_hook_fn) (const struct fd_hook *remaining_list,
+                              gl_ioctl_fn primary,
+                              int fd, int request, void *arg);
+
+/* Execute the ioctl hooks in REMAINING_LIST, with PRIMARY as "primary" method.
+   Return 0 or -1, like ioctl() would do.  */
+extern int execute_ioctl_hooks (const struct fd_hook *remaining_list,
+                                gl_ioctl_fn primary,
+                                int fd, int request, void *arg);
+
+/* Execute all ioctl hooks, with PRIMARY as "primary" method.
+   Return 0 or -1, like ioctl() would do.  */
+extern int execute_all_ioctl_hooks (gl_ioctl_fn primary,
+                                    int fd, int request, void *arg);
+
+/* Add a function pair to the list of file descriptor hooks.
+   CLOSE_HOOK and IOCTL_HOOK may be NULL, indicating no change.
+   The LINK variable points to a piece of memory which is guaranteed to be
+   accessible until the corresponding call to unregister_fd_hook.  */
+extern void register_fd_hook (close_hook_fn close_hook, ioctl_hook_fn ioctl_hook,
+                              struct fd_hook *link);
+
+/* Removes a hook from the list of file descriptor hooks.  */
+extern void unregister_fd_hook (struct fd_hook *link);
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FD_HOOK_H */
diff --git a/lib/filename.h b/lib/filename.h
new file mode 100644 (file)
index 0000000..d4c7020
--- /dev/null
@@ -0,0 +1,54 @@
+/* Basic filename support macros.
+   Copyright (C) 2001-2004, 2007-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FILENAME_H
+#define _FILENAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
+  /* Native Windows, Cygwin, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILE_SYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILE_SYSTEM_PREFIX_LEN(P) 0
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FILENAME_H */
diff --git a/lib/findprog-in.c b/lib/findprog-in.c
new file mode 100644 (file)
index 0000000..c254f2f
--- /dev/null
@@ -0,0 +1,251 @@
+/* Locating a program in a given path.
+   Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001, 2019.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+
+#include <config.h>
+
+/* Specification.  */
+#include "findprog.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "filename.h"
+#include "concat-filename.h"
+#include "xalloc.h"
+
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Native Windows, OS/2, DOS */
+# define NATIVE_SLASH '\\'
+#else
+  /* Unix */
+# define NATIVE_SLASH '/'
+#endif
+
+/* Separator in PATH like lists of pathnames.  */
+#if (defined _WIN32 && !defined __CYGWIN__) || defined __EMX__ || defined __DJGPP__
+  /* Native Windows, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+  /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* The list of suffixes that the execlp/execvp function tries when searching
+   for the program.  */
+static const char * const suffixes[] =
+  {
+    #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+    "", ".com", ".exe", ".bat", ".cmd"
+    /* Note: Files without any suffix are not considered executable.  */
+    /* Note: The cmd.exe program does a different lookup: It searches according
+       to the PATHEXT environment variable.
+       See <https://stackoverflow.com/questions/7839150/>.
+       Also, it executes files ending .bat and .cmd directly without letting the
+       kernel interpret the program file.  */
+    #elif defined __CYGWIN__
+    "", ".exe", ".com"
+    #elif defined __EMX__
+    "", ".exe"
+    #elif defined __DJGPP__
+    "", ".com", ".exe", ".bat"
+    #else /* Unix */
+    ""
+    #endif
+  };
+
+const char *
+find_in_given_path (const char *progname, const char *path,
+                    bool optimize_for_exec)
+{
+  {
+    bool has_slash = false;
+    {
+      const char *p;
+
+      for (p = progname; *p != '\0'; p++)
+        if (ISSLASH (*p))
+          {
+            has_slash = true;
+            break;
+          }
+    }
+    if (has_slash)
+      {
+        /* If progname contains a slash, it is either absolute or relative to
+           the current directory.  PATH is not used.  */
+        if (optimize_for_exec)
+          /* The execl/execv/execlp/execvp functions will try the various
+             suffixes anyway and fail if no executable is found.  */
+          return progname;
+        else
+          {
+            /* Try the various suffixes and see whether one of the files
+               with such a suffix is actually executable.  */
+            int failure_errno;
+            size_t i;
+            #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+            const char *progbasename;
+
+            {
+              const char *p;
+
+              progbasename = progname;
+              for (p = progname; *p != '\0'; p++)
+                if (ISSLASH (*p))
+                  progbasename = p + 1;
+            }
+            #endif
+
+            /* Try all platform-dependent suffixes.  */
+            failure_errno = ENOENT;
+            for (i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); i++)
+              {
+                const char *suffix = suffixes[i];
+
+                #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+                /* File names without a '.' are not considered executable, and
+                   for file names with a '.' no additional suffix is tried.  */
+                if ((*suffix != '\0') != (strchr (progbasename, '.') != NULL))
+                #endif
+                  {
+                    /* Concatenate progname and suffix.  */
+                    char *progpathname =
+                      xconcatenated_filename ("", progname, suffix);
+
+                    /* On systems which have the eaccess() system call, let's
+                       use it.  On other systems, let's hope that this program
+                       is not installed setuid or setgid, so that it is ok to
+                       call access() despite its design flaw.  */
+                    if (eaccess (progpathname, X_OK) == 0)
+                      {
+                        /* Found!  */
+                        if (strcmp (progpathname, progname) == 0)
+                          {
+                            free (progpathname);
+                            return progname;
+                          }
+                        else
+                          return progpathname;
+                      }
+
+                    if (errno != ENOENT)
+                      failure_errno = errno;
+
+                    free (progpathname);
+                  }
+              }
+
+            errno = failure_errno;
+            return NULL;
+          }
+      }
+  }
+
+  if (path == NULL)
+    /* If PATH is not set, the default search path is implementation dependent.
+       In practice, it is treated like an empty PATH.  */
+    path = "";
+
+  {
+    int failure_errno;
+    /* Make a copy, to prepare for destructive modifications.  */
+    char *path_copy = xstrdup (path);
+    char *path_rest;
+    char *cp;
+
+    failure_errno = ENOENT;
+    for (path_rest = path_copy; ; path_rest = cp + 1)
+      {
+        const char *dir;
+        bool last;
+        size_t i;
+
+        /* Extract next directory in PATH.  */
+        dir = path_rest;
+        for (cp = path_rest; *cp != '\0' && *cp != PATH_SEPARATOR; cp++)
+          ;
+        last = (*cp == '\0');
+        *cp = '\0';
+
+        /* Empty PATH components designate the current directory.  */
+        if (dir == cp)
+          dir = ".";
+
+        /* Try all platform-dependent suffixes.  */
+        for (i = 0; i < sizeof (suffixes) / sizeof (suffixes[0]); i++)
+          {
+            const char *suffix = suffixes[i];
+
+            #if defined _WIN32 && !defined __CYGWIN__ /* Native Windows */
+            /* File names without a '.' are not considered executable, and
+               for file names with a '.' no additional suffix is tried.  */
+            if ((*suffix != '\0') != (strchr (progname, '.') != NULL))
+            #endif
+              {
+                /* Concatenate dir, progname, and suffix.  */
+                char *progpathname =
+                  xconcatenated_filename (dir, progname, suffix);
+
+                /* On systems which have the eaccess() system call, let's
+                   use it.  On other systems, let's hope that this program
+                   is not installed setuid or setgid, so that it is ok to
+                   call access() despite its design flaw.  */
+                if (eaccess (progpathname, X_OK) == 0)
+                  {
+                    /* Found!  */
+                    if (strcmp (progpathname, progname) == 0)
+                      {
+                        free (progpathname);
+
+                        /* Add the "./" prefix for real, that
+                           xconcatenated_filename() optimized away.  This
+                           avoids a second PATH search when the caller uses
+                           execl/execv/execlp/execvp.  */
+                        progpathname =
+                          XNMALLOC (2 + strlen (progname) + 1, char);
+                        progpathname[0] = '.';
+                        progpathname[1] = NATIVE_SLASH;
+                        memcpy (progpathname + 2, progname,
+                                strlen (progname) + 1);
+                      }
+
+                    free (path_copy);
+                    return progpathname;
+                  }
+
+                if (errno != ENOENT)
+                  failure_errno = errno;
+
+                free (progpathname);
+              }
+          }
+
+        if (last)
+          break;
+      }
+
+    /* Not found in PATH.  */
+    free (path_copy);
+
+    errno = failure_errno;
+    return NULL;
+  }
+}
diff --git a/lib/findprog.h b/lib/findprog.h
new file mode 100644 (file)
index 0000000..aef6289
--- /dev/null
@@ -0,0 +1,71 @@
+/* Locating a program in PATH.
+   Copyright (C) 2001-2003, 2009-2020 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _FINDPROG_H
+#define _FINDPROG_H
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Looks up a program in the PATH.
+   Attempts to determine the pathname that would be called by execlp/execvp
+   of PROGNAME.  If successful, it returns a pathname containing a slash
+   (either absolute or relative to the current directory).  Otherwise, it
+   returns PROGNAME unmodified.
+   Because of the latter case, callers should use execlp/execvp, not
+   execl/execv on the returned pathname.
+   The returned string is freshly malloc()ed if it is != PROGNAME.  */
+extern const char *find_in_path (const char *progname);
+
+/* Looks up a program in the given PATH-like string.
+
+   The PATH argument consists of a list of directories, separated by ':' or
+   (on native Windows) by ';'.  An empty PATH element designates the current
+   directory.  A null PATH is equivalent to an empty PATH, that is, to the
+   singleton list that contains only the current directory.
+
+   Determines the pathname that would be called by execlp/execvp of PROGNAME.
+   - If successful, it returns a pathname containing a slash (either absolute
+     or relative to the current directory).  The returned string can be used
+     with either execl/execv or execlp/execvp.  It is freshly malloc()ed if it
+     is != PROGNAME.
+   - Otherwise, it sets errno and returns NULL.
+     Specific errno values include:
+       - ENOENT: means that the program's file was not found.
+       - EACCES: means that the program's file cannot be accessed (due to some
+         issue with one of the ancestor directories) or lacks the execute
+         permissions.
+   If OPTIMIZE_FOR_EXEC is true, the function saves some work, under the
+   assumption that the resulting pathname will not be accessed directly,
+   only through execl/execv or execlp/execvp.
+
+   Here, a "slash" means:
+     - On POSIX systems excluding Cygwin: a '/',
+     - On Windows, OS/2, DOS platforms: a '/' or '\'. */
+extern const char *find_in_given_path (const char *progname, const char *path,
+                                       bool optimize_for_exec);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FINDPROG_H */
diff --git a/lib/fnmatch.c b/lib/fnmatch.c
new file mode 100644 (file)
index 0000000..4da8c5f
--- /dev/null
@@ -0,0 +1,489 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software
+Foundation, Inc.
+This file is part of the GNU C Library.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB.  If not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#include <errno.h>
+#include <fnmatch.h>
+#include <ctype.h>
+
+#if HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+/* For platform which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+# include <wchar.h>
+# include <wctype.h>
+#endif
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__
+
+
+# if defined STDC_HEADERS || !defined isascii
+#  define ISASCII(c) 1
+# else
+#  define ISASCII(c) isascii(c)
+# endif
+
+# ifdef isblank
+#  define ISBLANK(c) (ISASCII (c) && isblank (c))
+# else
+#  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+# endif
+# ifdef isgraph
+#  define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+# else
+#  define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+# endif
+
+# define ISPRINT(c) (ISASCII (c) && isprint (c))
+# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+# define ISALNUM(c) (ISASCII (c) && isalnum (c))
+# define ISALPHA(c) (ISASCII (c) && isalpha (c))
+# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+# define ISLOWER(c) (ISASCII (c) && islower (c))
+# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+# define ISSPACE(c) (ISASCII (c) && isspace (c))
+# define ISUPPER(c) (ISASCII (c) && isupper (c))
+# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendement 1.  */
+#  ifdef CHARCLASS_NAME_MAX
+#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+#  else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#   define CHAR_CLASS_MAX_LENGTH 256
+#  endif
+
+#  ifdef _LIBC
+#   define IS_CHAR_CLASS(string) __wctype (string)
+#  else
+#   define IS_CHAR_CLASS(string) wctype (string)
+#  endif
+# else
+#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#  define IS_CHAR_CLASS(string)                                                      \
+   (STREQ (string, "alpha") || STREQ (string, "upper")                       \
+    || STREQ (string, "lower") || STREQ (string, "digit")                    \
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")                   \
+    || STREQ (string, "space") || STREQ (string, "print")                    \
+    || STREQ (string, "punct") || STREQ (string, "graph")                    \
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+# if !defined _LIBC && !defined getenv
+extern char *getenv ();
+# endif
+
+# ifndef errno
+extern int errno;
+# endif
+
+/* This function doesn't exist on most systems.  */
+
+# if !defined HAVE___STRCHRNUL && !defined _LIBC
+static char *
+__strchrnul (s, c)
+     const char *s;
+     int c;
+{
+  char *result = strchr (s, c);
+  if (result == NULL)
+    result = strchr (s, '\0');
+  return result;
+}
+# endif
+
+# ifndef internal_function
+/* Inside GNU libc we mark some function in a special way.  In other
+   environments simply ignore the marking.  */
+#  define internal_function
+# endif
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+   it matches, nonzero if not.  */
+static int internal_fnmatch __P ((const char *pattern, const char *string,
+                                 int no_leading_period, int flags))
+     internal_function;
+static int
+internal_function
+internal_fnmatch (pattern, string, no_leading_period, flags)
+     const char *pattern;
+     const char *string;
+     int no_leading_period;
+     int flags;
+{
+  register const char *p = pattern, *n = string;
+  register unsigned char c;
+
+/* Note that this evaluates C many times.  */
+# ifdef _LIBC
+#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# else
+#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# endif
+
+  while ((c = *p++) != '\0')
+    {
+      c = FOLD (c);
+
+      switch (c)
+       {
+       case '?':
+         if (*n == '\0')
+           return FNM_NOMATCH;
+         else if (*n == '/' && (flags & FNM_FILE_NAME))
+           return FNM_NOMATCH;
+         else if (*n == '.' && no_leading_period
+                  && (n == string
+                      || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
+           return FNM_NOMATCH;
+         break;
+
+       case '\\':
+         if (!(flags & FNM_NOESCAPE))
+           {
+             c = *p++;
+             if (c == '\0')
+               /* Trailing \ loses.  */
+               return FNM_NOMATCH;
+             c = FOLD (c);
+           }
+         if (FOLD ((unsigned char) *n) != c)
+           return FNM_NOMATCH;
+         break;
+
+       case '*':
+         if (*n == '.' && no_leading_period
+             && (n == string
+                 || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
+           return FNM_NOMATCH;
+
+         for (c = *p++; c == '?' || c == '*'; c = *p++)
+           {
+             if (*n == '/' && (flags & FNM_FILE_NAME))
+               /* A slash does not match a wildcard under FNM_FILE_NAME.  */
+               return FNM_NOMATCH;
+             else if (c == '?')
+               {
+                 /* A ? needs to match one character.  */
+                 if (*n == '\0')
+                   /* There isn't another character; no match.  */
+                   return FNM_NOMATCH;
+                 else
+                   /* One character of the string is consumed in matching
+                      this ? wildcard, so *??? won't match if there are
+                      less than three characters.  */
+                   ++n;
+               }
+           }
+
+         if (c == '\0')
+           /* The wildcard(s) is/are the last element of the pattern.
+              If the name is a file name and contains another slash
+              this does mean it cannot match.  */
+           return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL
+                   ? FNM_NOMATCH : 0);
+         else
+           {
+             const char *endp;
+
+             endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0');
+
+             if (c == '[')
+               {
+                 int flags2 = ((flags & FNM_FILE_NAME)
+                               ? flags : (flags & ~FNM_PERIOD));
+
+                 for (--p; n < endp; ++n)
+                   if (internal_fnmatch (p, n,
+                                         (no_leading_period
+                                          && (n == string
+                                              || (n[-1] == '/'
+                                                  && (flags
+                                                      & FNM_FILE_NAME)))),
+                                         flags2)
+                       == 0)
+                     return 0;
+               }
+             else if (c == '/' && (flags & FNM_FILE_NAME))
+               {
+                 while (*n != '\0' && *n != '/')
+                   ++n;
+                 if (*n == '/'
+                     && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD,
+                                           flags) == 0))
+                   return 0;
+               }
+             else
+               {
+                 int flags2 = ((flags & FNM_FILE_NAME)
+                               ? flags : (flags & ~FNM_PERIOD));
+
+                 if (c == '\\' && !(flags & FNM_NOESCAPE))
+                   c = *p;
+                 c = FOLD (c);
+                 for (--p; n < endp; ++n)
+                   if (FOLD ((unsigned char) *n) == c
+                       && (internal_fnmatch (p, n,
+                                             (no_leading_period
+                                              && (n == string
+                                                  || (n[-1] == '/'
+                                                      && (flags
+                                                          & FNM_FILE_NAME)))),
+                                             flags2) == 0))
+                     return 0;
+               }
+           }
+
+         /* If we come here no match is possible with the wildcard.  */
+         return FNM_NOMATCH;
+
+       case '[':
+         {
+           /* Nonzero if the sense of the character class is inverted.  */
+           static int posixly_correct;
+           register int not;
+           char cold;
+
+           if (posixly_correct == 0)
+             posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+           if (*n == '\0')
+             return FNM_NOMATCH;
+
+           if (*n == '.' && no_leading_period && (n == string
+                                                  || (n[-1] == '/'
+                                                      && (flags
+                                                          & FNM_FILE_NAME))))
+             return FNM_NOMATCH;
+
+           if (*n == '/' && (flags & FNM_FILE_NAME))
+             /* `/' cannot be matched.  */
+             return FNM_NOMATCH;
+
+           not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
+           if (not)
+             ++p;
+
+           c = *p++;
+           for (;;)
+             {
+               unsigned char fn = FOLD ((unsigned char) *n);
+
+               if (!(flags & FNM_NOESCAPE) && c == '\\')
+                 {
+                   if (*p == '\0')
+                     return FNM_NOMATCH;
+                   c = FOLD ((unsigned char) *p);
+                   ++p;
+
+                   if (c == fn)
+                     goto matched;
+                 }
+               else if (c == '[' && *p == ':')
+                 {
+                   /* Leave room for the null.  */
+                   char str[CHAR_CLASS_MAX_LENGTH + 1];
+                   size_t c1 = 0;
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+                   wctype_t wt;
+# endif
+                   const char *startp = p;
+
+                   for (;;)
+                     {
+                       if (c1 == CHAR_CLASS_MAX_LENGTH)
+                         /* The name is too long and therefore the pattern
+                            is ill-formed.  */
+                         return FNM_NOMATCH;
+
+                       c = *++p;
+                       if (c == ':' && p[1] == ']')
+                         {
+                           p += 2;
+                           break;
+                         }
+                       if (c < 'a' || c >= 'z')
+                         {
+                           /* This cannot possibly be a character class name.
+                              Match it as a normal range.  */
+                           p = startp;
+                           c = '[';
+                           goto normal_bracket;
+                         }
+                       str[c1++] = c;
+                     }
+                   str[c1] = '\0';
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+                   wt = IS_CHAR_CLASS (str);
+                   if (wt == 0)
+                     /* Invalid character class name.  */
+                     return FNM_NOMATCH;
+
+                   if (__iswctype (__btowc ((unsigned char) *n), wt))
+                     goto matched;
+# else
+                   if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n))
+                       || (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n))
+                       || (STREQ (str, "blank") && ISBLANK ((unsigned char) *n))
+                       || (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n))
+                       || (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n))
+                       || (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n))
+                       || (STREQ (str, "lower") && ISLOWER ((unsigned char) *n))
+                       || (STREQ (str, "print") && ISPRINT ((unsigned char) *n))
+                       || (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n))
+                       || (STREQ (str, "space") && ISSPACE ((unsigned char) *n))
+                       || (STREQ (str, "upper") && ISUPPER ((unsigned char) *n))
+                       || (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n)))
+                     goto matched;
+# endif
+                 }
+               else if (c == '\0')
+                 /* [ (unterminated) loses.  */
+                 return FNM_NOMATCH;
+               else
+                 {
+                 normal_bracket:
+                   if (FOLD (c) == fn)
+                     goto matched;
+
+                   cold = c;
+                   c = *p++;
+
+                   if (c == '-' && *p != ']')
+                     {
+                       /* It is a range.  */
+                       unsigned char cend = *p++;
+                       if (!(flags & FNM_NOESCAPE) && cend == '\\')
+                         cend = *p++;
+                       if (cend == '\0')
+                         return FNM_NOMATCH;
+
+                       if (cold <= fn && fn <= FOLD (cend))
+                         goto matched;
+
+                       c = *p++;
+                     }
+                 }
+
+               if (c == ']')
+                 break;
+             }
+
+           if (!not)
+             return FNM_NOMATCH;
+           break;
+
+         matched:
+           /* Skip the rest of the [...] that already matched.  */
+           while (c != ']')
+             {
+               if (c == '\0')
+                 /* [... (unterminated) loses.  */
+                 return FNM_NOMATCH;
+
+               c = *p++;
+               if (!(flags & FNM_NOESCAPE) && c == '\\')
+                 {
+                   if (*p == '\0')
+                     return FNM_NOMATCH;
+                   /* XXX 1003.2d11 is unclear if this is right.  */
+                   ++p;
+                 }
+               else if (c == '[' && *p == ':')
+                 {
+                   do
+                     if (*++p == '\0')
+                       return FNM_NOMATCH;
+                   while (*p != ':' || p[1] == ']');
+                   p += 2;
+                   c = *p;
+                 }
+             }
+           if (not)
+             return FNM_NOMATCH;
+         }
+         break;
+
+       default:
+         if (c != FOLD ((unsigned char) *n))
+           return FNM_NOMATCH;
+       }
+
+      ++n;
+    }
+
+  if (*n == '\0')
+    return 0;
+
+  if ((flags & FNM_LEADING_DIR) && *n == '/')
+    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
+    return 0;
+
+  return FNM_NOMATCH;
+
+# undef FOLD
+}
+
+
+int
+fnmatch (pattern, string, flags)
+     const char *pattern;
+     const char *string;
+     int flags;
+{
+  return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
diff --git a/lib/fnmatch.in.h b/lib/fnmatch.in.h
new file mode 100644 (file)
index 0000000..a788c8e
--- /dev/null
@@ -0,0 +1,85 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software
+Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB.  If not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.  */
+
+#ifndef        _FNMATCH_H
+#define        _FNMATCH_H      1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
+# if !defined __GLIBC__
+#  undef       __P
+#  define __P(protos)  protos
+# endif
+#else /* Not C++ or ANSI C.  */
+# undef        __P
+# define __P(protos)   ()
+/* We can get away without defining `const' here only because in this file
+   it is used only inside the prototype for `fnmatch', which is elided in
+   non-ANSI C where `const' is problematical.  */
+#endif /* C++ or ANSI C.  */
+
+#ifndef const
+# if (defined __STDC__ && __STDC__) || defined __cplusplus || defined WINDOWS32
+#  define __const      const
+# else
+#  define __const
+# endif
+#endif
+
+/* We #undef these before defining them because some losing systems
+   (HP-UX A.08.07 for example) define these in <unistd.h>.  */
+#undef FNM_PATHNAME
+#undef FNM_NOESCAPE
+#undef FNM_PERIOD
+
+/* Bits set in the FLAGS argument to `fnmatch'.  */
+#define        FNM_PATHNAME    (1 << 0) /* No wildcard can ever match `/'.  */
+#define        FNM_NOESCAPE    (1 << 1) /* Backslashes don't quote special chars.  */
+#define        FNM_PERIOD      (1 << 2) /* Leading `.' is matched only explicitly.  */
+
+#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
+# define FNM_FILE_NAME  FNM_PATHNAME   /* Preferred GNU name.  */
+# define FNM_LEADING_DIR (1 << 3)      /* Ignore `/...' after a match.  */
+# define FNM_CASEFOLD   (1 << 4)       /* Compare without regard to case.  */
+#endif
+
+/* Value returned by `fnmatch' if STRING does not match PATTERN.  */
+#define        FNM_NOMATCH     1
+
+/* This value is returned if the implementation does not support
+   `fnmatch'.  Since this is not the case here it will never be
+   returned but the conformance test suites still require the symbol
+   to be defined.  */
+#ifdef _XOPEN_SOURCE
+# define FNM_NOSYS     (-1)
+#endif
+
+/* Match NAME against the filename pattern PATTERN,
+   returning zero if it matches, FNM_NOMATCH if not.  */
+extern int fnmatch __P ((__const char *__pattern, __const char *__name,
+                        int __flags));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* fnmatch.h */
diff --git a/lib/getdtablesize.c b/lib/getdtablesize.c
new file mode 100644 (file)
index 0000000..0fe7092
--- /dev/null
@@ -0,0 +1,124 @@
+/* getdtablesize() function: Return maximum possible file descriptor value + 1.
+   Copyright (C) 2008-2020 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2008.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <unistd.h>
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+# include <stdio.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+#  include "msvc-inval.h"
+# endif
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+static int
+_setmaxstdio_nothrow (int newmax)
+{
+  int result;
+
+  TRY_MSVC_INVAL
+    {
+      result = _setmaxstdio (newmax);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = -1;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+# else
+#  define _setmaxstdio_nothrow _setmaxstdio
+# endif
+
+/* Cache for the previous getdtablesize () result.  Safe to cache because
+   Windows also lacks setrlimit.  */
+static int dtablesize;
+
+int
+getdtablesize (void)
+{
+  if (dtablesize == 0)
+    {
+      /* We are looking for the number N such that the valid file descriptors
+         are 0..N-1.  It can be obtained through a loop as follows:
+           {
+             int fd;
+             for (fd = 3; fd < 65536; fd++)
+               if (dup2 (0, fd) == -1)
+                 break;
+             return fd;
+           }
+         On Windows XP, the result is 2048.
+         The drawback of this loop is that it allocates memory for a libc
+         internal array that is never freed.
+
+         The number N can also be obtained as the upper bound for
+         _getmaxstdio ().  _getmaxstdio () returns the maximum number of open
+         FILE objects.  The sanity check in _setmaxstdio reveals the maximum
+         number of file descriptors.  This too allocates memory, but it is
+         freed when we call _setmaxstdio with the original value.  */
+      int orig_max_stdio = _getmaxstdio ();
+      unsigned int bound;
+      for (bound = 0x10000; _setmaxstdio_nothrow (bound) < 0; bound = bound / 2)
+        ;
+      _setmaxstdio_nothrow (orig_max_stdio);
+      dtablesize = bound;
+    }
+  return dtablesize;
+}
+
+#else
+
+# include <limits.h>
+# include <sys/resource.h>
+
+# ifndef RLIM_SAVED_CUR
+#  define RLIM_SAVED_CUR RLIM_INFINITY
+# endif
+# ifndef RLIM_SAVED_MAX
+#  define RLIM_SAVED_MAX RLIM_INFINITY
+# endif
+
+# ifdef __CYGWIN__
+  /* Cygwin 1.7.25 auto-increases the RLIMIT_NOFILE soft limit until it
+     hits the compile-time constant hard limit of 3200.  We might as
+     well just report the hard limit.  */
+#  define rlim_cur rlim_max
+# endif
+
+int
+getdtablesize (void)
+{
+  struct rlimit lim;
+
+  if (getrlimit (RLIMIT_NOFILE, &lim) == 0
+      && 0 <= lim.rlim_cur && lim.rlim_cur <= INT_MAX
+      && lim.rlim_cur != RLIM_INFINITY
+      && lim.rlim_cur != RLIM_SAVED_CUR
+      && lim.rlim_cur != RLIM_SAVED_MAX)
+    return lim.rlim_cur;
+
+  return INT_MAX;
+}
+
+#endif
diff --git a/lib/getloadavg.c b/lib/getloadavg.c
new file mode 100644 (file)
index 0000000..ebb6f5d
--- /dev/null
@@ -0,0 +1,953 @@
+/* Get the system load averages.
+
+   Copyright (C) 1985-1989, 1991-1995, 1997, 1999-2000, 2003-2020 Free Software
+   Foundation, Inc.
+
+   NOTE: The canonical source of this file is maintained with gnulib.
+   Bugs can be reported to bug-gnulib@gnu.org.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Compile-time symbols that this file uses:
+
+   HAVE_PSTAT_GETDYNAMIC        Define this if your system has the
+                                pstat_getdynamic function.  I think it
+                                is unique to HPUX9.  The best way to get the
+                                definition is through the AC_FUNC_GETLOADAVG
+                                macro that comes with autoconf 2.13 or newer.
+                                If that isn't an option, then just put
+                                AC_CHECK_FUNCS(pstat_getdynamic) in your
+                                configure.ac file.
+   HAVE_LIBPERFSTAT Define this if your system has the
+                                perfstat_cpu_total function in libperfstat (AIX).
+   FIXUP_KERNEL_SYMBOL_ADDR()   Adjust address in returned struct nlist.
+   KERNEL_FILE                  Name of the kernel file to nlist.
+   LDAV_CVT()                   Scale the load average from the kernel.
+                                Returns a double.
+   LDAV_SYMBOL                  Name of kernel symbol giving load average.
+   LOAD_AVE_TYPE                Type of the load average array in the kernel.
+                                Must be defined unless one of
+                                apollo, DGUX, NeXT, or UMAX is defined;
+                                or we have libkstat;
+                                otherwise, no load average is available.
+   HAVE_NLIST_H                 nlist.h is available.  NLIST_STRUCT defaults
+                                to this.
+   NLIST_STRUCT                 Include nlist.h, not a.out.h.
+   N_NAME_POINTER               The nlist n_name element is a pointer,
+                                not an array.
+   HAVE_STRUCT_NLIST_N_UN_N_NAME 'n_un.n_name' is member of 'struct nlist'.
+   LINUX_LDAV_FILE              [__linux__, __ANDROID__, __CYGWIN__]: File
+                                containing load averages.
+
+   Specific system predefines this file uses, aside from setting
+   default values if not emacs:
+
+   apollo
+   BSD                          Real BSD, not just BSD-like.
+   DGUX
+   eunice                       UNIX emulator under VMS.
+   hpux
+   __MSDOS__                    No-op for MSDOS.
+   NeXT
+   sgi
+   UMAX
+   UMAX4_3
+   VMS
+   _WIN32                       Native Windows (possibly also defined on Cygwin)
+   __linux__, __ANDROID__       Linux: assumes /proc file system mounted.
+                                Support from Michael K. Johnson.
+   __CYGWIN__                   Cygwin emulates linux /proc/loadavg.
+   __NetBSD__                   NetBSD: assumes /kern file system mounted.
+
+   In addition, to avoid nesting many #ifdefs, we internally set
+   LDAV_DONE to indicate that the load average has been computed.
+
+   We also #define LDAV_PRIVILEGED if a program will require
+   special installation to be able to call getloadavg.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <stdlib.h>
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+# include <sys/types.h>
+
+# if HAVE_SYS_PARAM_H
+#  include <sys/param.h>
+# endif
+
+# include "intprops.h"
+
+# if defined _WIN32 && ! defined __CYGWIN__ && ! defined WINDOWS32
+#  define WINDOWS32
+# endif
+
+# ifdef NeXT
+/* NeXT in the 2.{0,1,2} releases defines BSD in <sys/param.h>, which
+   conflicts with the definition understood in this file, that this
+   really is BSD. */
+#  undef BSD
+
+/* NeXT defines FSCALE in <sys/param.h>.  However, we take FSCALE being
+   defined to mean that the nlist method should be used, which is not true.  */
+#  undef FSCALE
+# endif
+
+/* Same issues as for NeXT apply to the HURD-based GNU system.  */
+# ifdef __GNU__
+#  undef BSD
+#  undef FSCALE
+# endif /* __GNU__ */
+
+/* Set values that are different from the defaults, which are
+   set a little farther down with #ifndef.  */
+
+
+/* Some shorthands.  */
+
+# if defined (HPUX) && !defined (hpux)
+#  define hpux
+# endif
+
+# if defined (__hpux) && !defined (hpux)
+#  define hpux
+# endif
+
+# if defined (__sun) && !defined (sun)
+#  define sun
+# endif
+
+# if defined (hp300) && !defined (hpux)
+#  define MORE_BSD
+# endif
+
+# if defined (__SVR4) && !defined (SVR4)
+#  define SVR4
+# endif
+
+# if (defined (sun) && defined (SVR4)) || defined (SOLARIS2)
+#  define SUNOS_5
+# endif
+
+# if defined (__osf__) && (defined (__alpha) || defined (__alpha__))
+#  define OSF_ALPHA
+#  include <sys/mbuf.h>
+#  include <sys/socket.h>
+#  include <net/route.h>
+#  include <sys/table.h>
+/* Tru64 4.0D's table.h redefines sys */
+#  undef sys
+# endif
+
+# if defined (__osf__) && (defined (mips) || defined (__mips__))
+#  define OSF_MIPS
+#  include <sys/table.h>
+# endif
+
+
+/* VAX C can't handle multi-line #ifs, or lines longer than 256 chars.  */
+# ifndef LOAD_AVE_TYPE
+
+#  ifdef MORE_BSD
+#   define LOAD_AVE_TYPE long
+#  endif
+
+#  ifdef sun
+#   define LOAD_AVE_TYPE long
+#  endif
+
+#  ifdef sgi
+#   define LOAD_AVE_TYPE long
+#  endif
+
+#  ifdef SVR4
+#   define LOAD_AVE_TYPE long
+#  endif
+
+#  ifdef OSF_ALPHA
+#   define LOAD_AVE_TYPE long
+#  endif
+
+#  if defined _AIX && ! defined HAVE_LIBPERFSTAT
+#   define LOAD_AVE_TYPE long
+#  endif
+
+# endif /* No LOAD_AVE_TYPE.  */
+
+# ifdef OSF_ALPHA
+/* <sys/param.h> defines an incorrect value for FSCALE on Alpha OSF/1,
+   according to ghazi@noc.rutgers.edu.  */
+#  undef FSCALE
+#  define FSCALE 1024.0
+# endif
+
+
+# ifndef FSCALE
+
+/* SunOS and some others define FSCALE in sys/param.h.  */
+
+#  ifdef MORE_BSD
+#   define FSCALE 2048.0
+#  endif
+
+#  if defined (MIPS) || defined (SVR4)
+#   define FSCALE 256
+#  endif
+
+#  if defined (sgi)
+/* Sometimes both MIPS and sgi are defined, so FSCALE was just defined
+   above under #ifdef MIPS.  But we want the sgi value.  */
+#   undef FSCALE
+#   define FSCALE 1000.0
+#  endif
+
+#  if defined _AIX && !defined HAVE_LIBPERFSTAT
+#   define FSCALE 65536.0
+#  endif
+
+# endif /* Not FSCALE.  */
+
+# if !defined (LDAV_CVT) && defined (FSCALE)
+#  define LDAV_CVT(n) (((double) (n)) / FSCALE)
+# endif
+
+# ifndef NLIST_STRUCT
+#  if HAVE_NLIST_H
+#   define NLIST_STRUCT
+#  endif
+# endif
+
+# if defined (sgi) || (defined (mips) && !defined (BSD))
+#  define FIXUP_KERNEL_SYMBOL_ADDR(nl) ((nl)[0].n_value &= ~(1 << 31))
+# endif
+
+
+# if !defined (KERNEL_FILE) && defined (hpux)
+#  define KERNEL_FILE "/hp-ux"
+# endif
+
+# if !defined (KERNEL_FILE) && (defined (MIPS) || defined (SVR4) || defined (ISC) || defined (sgi))
+#  define KERNEL_FILE "/unix"
+# endif
+
+
+# if !defined (LDAV_SYMBOL) && (defined (hpux) || defined (SVR4) || defined (ISC) || defined (sgi) || (defined (_AIX) && !defined(HAVE_LIBPERFSTAT)))
+#  define LDAV_SYMBOL "avenrun"
+# endif
+
+# ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+# endif
+
+/* LOAD_AVE_TYPE should only get defined if we're going to use the
+   nlist method.  */
+# if !defined (LOAD_AVE_TYPE) && (defined (BSD) || defined (LDAV_CVT) || defined (KERNEL_FILE) || defined (LDAV_SYMBOL))
+#  define LOAD_AVE_TYPE double
+# endif
+
+# ifdef LOAD_AVE_TYPE
+
+#  ifndef __VMS
+#   if !(defined __linux__ || defined __ANDROID__)
+#    ifndef NLIST_STRUCT
+#     include <a.out.h>
+#    else /* NLIST_STRUCT */
+#     include <nlist.h>
+#    endif /* NLIST_STRUCT */
+
+#    ifdef SUNOS_5
+#     include <kvm.h>
+#     include <kstat.h>
+#    endif
+
+#    if defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
+#     include <sys/pstat.h>
+#    endif
+
+#    ifndef KERNEL_FILE
+#     define KERNEL_FILE "/vmunix"
+#    endif /* KERNEL_FILE */
+
+#    ifndef LDAV_SYMBOL
+#     define LDAV_SYMBOL "_avenrun"
+#    endif /* LDAV_SYMBOL */
+#   endif /* __linux__ || __ANDROID__ */
+
+#  else /* __VMS */
+
+#   ifndef eunice
+#    include <iodef.h>
+#    include <descrip.h>
+#   else /* eunice */
+#    include <vms/iodef.h>
+#   endif /* eunice */
+#  endif /* __VMS */
+
+#  ifndef LDAV_CVT
+#   define LDAV_CVT(n) ((double) (n))
+#  endif /* !LDAV_CVT */
+
+# endif /* LOAD_AVE_TYPE */
+
+# if defined HAVE_LIBPERFSTAT
+#  include <sys/protosw.h>
+#  include <libperfstat.h>
+#  include <sys/proc.h>
+#  ifndef SBITS
+#   define SBITS 16
+#  endif
+# endif
+
+# if defined (__GNU__) && !defined (NeXT)
+/* Note that NeXT Openstep defines __GNU__ even though it should not.  */
+/* GNU system acts much like NeXT, for load average purposes,
+   but not exactly.  */
+#  define NeXT
+#  define host_self mach_host_self
+# endif
+
+# ifdef NeXT
+#  ifdef HAVE_MACH_MACH_H
+#   include <mach/mach.h>
+#  else
+#   include <mach.h>
+#  endif
+# endif /* NeXT */
+
+# ifdef sgi
+#  include <sys/sysmp.h>
+# endif /* sgi */
+
+# ifdef UMAX
+#  include <signal.h>
+#  include <sys/time.h>
+#  include <sys/wait.h>
+#  include <sys/syscall.h>
+
+#  ifdef UMAX_43
+#   include <machine/cpu.h>
+#   include <inq_stats/statistics.h>
+#   include <inq_stats/sysstats.h>
+#   include <inq_stats/cpustats.h>
+#   include <inq_stats/procstats.h>
+#  else /* Not UMAX_43.  */
+#   include <sys/sysdefs.h>
+#   include <sys/statistics.h>
+#   include <sys/sysstats.h>
+#   include <sys/cpudefs.h>
+#   include <sys/cpustats.h>
+#   include <sys/procstats.h>
+#  endif /* Not UMAX_43.  */
+# endif /* UMAX */
+
+# ifdef DGUX
+#  include <sys/dg_sys_info.h>
+# endif
+
+# if (defined __linux__ || defined __ANDROID__ \
+      || defined __CYGWIN__ || defined SUNOS_5 \
+      || (defined LOAD_AVE_TYPE && ! defined __VMS))
+#  include <fcntl.h>
+# endif
+\f
+/* Avoid static vars inside a function since in HPUX they dump as pure.  */
+
+# ifdef NeXT
+static processor_set_t default_set;
+static bool getloadavg_initialized;
+# endif /* NeXT */
+
+# ifdef UMAX
+static unsigned int cpus = 0;
+static unsigned int samples;
+# endif /* UMAX */
+
+# ifdef DGUX
+static struct dg_sys_info_load_info load_info;  /* what-a-mouthful! */
+# endif /* DGUX */
+
+# if !defined (HAVE_LIBKSTAT) && defined (LOAD_AVE_TYPE)
+/* File descriptor open to /dev/kmem or VMS load ave driver.  */
+static int channel;
+/* True if channel is valid.  */
+static bool getloadavg_initialized;
+/* Offset in kmem to seek to read load average, or 0 means invalid.  */
+static long offset;
+
+#  if ! defined __VMS && ! defined sgi && ! (defined __linux__ || defined __ANDROID__)
+static struct nlist name_list[2];
+#  endif
+
+#  ifdef SUNOS_5
+static kvm_t *kd;
+#  endif /* SUNOS_5 */
+
+# endif /* LOAD_AVE_TYPE && !HAVE_LIBKSTAT */
+\f
+/* Put the 1 minute, 5 minute and 15 minute load averages
+   into the first NELEM elements of LOADAVG.
+   Return the number written (never more than 3, but may be less than NELEM),
+   or -1 (setting errno) if an error occurred.  */
+
+int
+getloadavg (double loadavg[], int nelem)
+{
+  int elem = 0;                 /* Return value.  */
+
+# ifdef NO_GET_LOAD_AVG
+#  define LDAV_DONE
+  errno = ENOSYS;
+  elem = -1;
+# endif
+
+# if !defined (LDAV_DONE) && defined (HAVE_LIBKSTAT)       /* Solaris <= 2.6 */
+/* Use libkstat because we don't have to be root.  */
+#  define LDAV_DONE
+  kstat_ctl_t *kc;
+  kstat_t *ksp;
+  kstat_named_t *kn;
+  int saved_errno;
+
+  kc = kstat_open ();
+  if (kc == NULL)
+    return -1;
+  ksp = kstat_lookup (kc, "unix", 0, "system_misc");
+  if (ksp == NULL)
+    return -1;
+  if (kstat_read (kc, ksp, 0) == -1)
+    return -1;
+
+
+  kn = kstat_data_lookup (ksp, "avenrun_1min");
+  if (kn == NULL)
+    {
+      /* Return -1 if no load average information is available.  */
+      nelem = 0;
+      elem = -1;
+    }
+
+  if (nelem >= 1)
+    loadavg[elem++] = (double) kn->value.ul / FSCALE;
+
+  if (nelem >= 2)
+    {
+      kn = kstat_data_lookup (ksp, "avenrun_5min");
+      if (kn != NULL)
+        {
+          loadavg[elem++] = (double) kn->value.ul / FSCALE;
+
+          if (nelem >= 3)
+            {
+              kn = kstat_data_lookup (ksp, "avenrun_15min");
+              if (kn != NULL)
+                loadavg[elem++] = (double) kn->value.ul / FSCALE;
+            }
+        }
+    }
+
+  saved_errno = errno;
+  kstat_close (kc);
+  errno = saved_errno;
+# endif /* HAVE_LIBKSTAT */
+
+# if !defined (LDAV_DONE) && defined (hpux) && defined (HAVE_PSTAT_GETDYNAMIC)
+                                                           /* HP-UX */
+/* Use pstat_getdynamic() because we don't have to be root.  */
+#  define LDAV_DONE
+#  undef LOAD_AVE_TYPE
+
+  struct pst_dynamic dyn_info;
+  if (pstat_getdynamic (&dyn_info, sizeof (dyn_info), 0, 0) < 0)
+    return -1;
+  if (nelem > 0)
+    loadavg[elem++] = dyn_info.psd_avg_1_min;
+  if (nelem > 1)
+    loadavg[elem++] = dyn_info.psd_avg_5_min;
+  if (nelem > 2)
+    loadavg[elem++] = dyn_info.psd_avg_15_min;
+
+# endif /* hpux && HAVE_PSTAT_GETDYNAMIC */
+
+# if ! defined LDAV_DONE && defined HAVE_LIBPERFSTAT       /* AIX */
+#  define LDAV_DONE
+#  undef LOAD_AVE_TYPE
+/* Use perfstat_cpu_total because we don't have to be root. */
+  {
+    perfstat_cpu_total_t cpu_stats;
+    int result = perfstat_cpu_total (NULL, &cpu_stats, sizeof cpu_stats, 1);
+    if (result == -1)
+      return result;
+    loadavg[0] = cpu_stats.loadavg[0] / (double)(1 << SBITS);
+    loadavg[1] = cpu_stats.loadavg[1] / (double)(1 << SBITS);
+    loadavg[2] = cpu_stats.loadavg[2] / (double)(1 << SBITS);
+    elem = 3;
+  }
+# endif
+
+# if !defined (LDAV_DONE) && (defined __linux__ || defined __ANDROID__ || defined __CYGWIN__)
+                                      /* Linux without glibc, Android, Cygwin */
+#  define LDAV_DONE
+#  undef LOAD_AVE_TYPE
+
+#  ifndef LINUX_LDAV_FILE
+#   define LINUX_LDAV_FILE "/proc/loadavg"
+#  endif
+
+  char ldavgbuf[3 * (INT_STRLEN_BOUND (int) + sizeof ".00 ")];
+  char const *ptr = ldavgbuf;
+  int fd, count, saved_errno;
+
+  fd = open (LINUX_LDAV_FILE, O_RDONLY);
+  if (fd == -1)
+    return -1;
+  count = read (fd, ldavgbuf, sizeof ldavgbuf - 1);
+  saved_errno = errno;
+  (void) close (fd);
+  errno = saved_errno;
+  if (count <= 0)
+    return -1;
+  ldavgbuf[count] = '\0';
+
+  for (elem = 0; elem < nelem; elem++)
+    {
+      double numerator = 0;
+      double denominator = 1;
+
+      while (*ptr == ' ')
+        ptr++;
+
+      /* Finish if this number is missing, and report an error if all
+         were missing.  */
+      if (! ('0' <= *ptr && *ptr <= '9'))
+        {
+          if (elem == 0)
+            {
+              errno = ENOTSUP;
+              return -1;
+            }
+          break;
+        }
+
+      while ('0' <= *ptr && *ptr <= '9')
+        numerator = 10 * numerator + (*ptr++ - '0');
+
+      if (*ptr == '.')
+        for (ptr++; '0' <= *ptr && *ptr <= '9'; ptr++)
+          numerator = 10 * numerator + (*ptr - '0'), denominator *= 10;
+
+      loadavg[elem++] = numerator / denominator;
+    }
+
+  return elem;
+
+# endif /* __linux__ || __ANDROID__ || __CYGWIN__ */
+
+# if !defined (LDAV_DONE) && defined (__NetBSD__)          /* NetBSD < 0.9 */
+#  define LDAV_DONE
+#  undef LOAD_AVE_TYPE
+
+#  ifndef NETBSD_LDAV_FILE
+#   define NETBSD_LDAV_FILE "/kern/loadavg"
+#  endif
+
+  unsigned long int load_ave[3], scale;
+  int count;
+  FILE *fp;
+
+  fp = fopen (NETBSD_LDAV_FILE, "r");
+  if (fp == NULL)
+    return -1;
+  count = fscanf (fp, "%lu %lu %lu %lu\n",
+                  &load_ave[0], &load_ave[1], &load_ave[2],
+                  &scale);
+  (void) fclose (fp);
+  if (count != 4)
+    {
+      errno = ENOTSUP;
+      return -1;
+    }
+
+  for (elem = 0; elem < nelem; elem++)
+    loadavg[elem] = (double) load_ave[elem] / (double) scale;
+
+  return elem;
+
+# endif /* __NetBSD__ */
+
+# if !defined (LDAV_DONE) && defined (NeXT)                /* NeXTStep */
+#  define LDAV_DONE
+  /* The NeXT code was adapted from iscreen 3.2.  */
+
+  host_t host;
+  struct processor_set_basic_info info;
+  unsigned int info_count;
+
+  /* We only know how to get the 1-minute average for this system,
+     so even if the caller asks for more than 1, we only return 1.  */
+
+  if (!getloadavg_initialized)
+    {
+      if (processor_set_default (host_self (), &default_set) == KERN_SUCCESS)
+        getloadavg_initialized = true;
+    }
+
+  if (getloadavg_initialized)
+    {
+      info_count = PROCESSOR_SET_BASIC_INFO_COUNT;
+      if (processor_set_info (default_set, PROCESSOR_SET_BASIC_INFO, &host,
+                              (processor_set_info_t) &info, &info_count)
+          != KERN_SUCCESS)
+        getloadavg_initialized = false;
+      else
+        {
+          if (nelem > 0)
+            loadavg[elem++] = (double) info.load_average / LOAD_SCALE;
+        }
+    }
+
+  if (!getloadavg_initialized)
+    {
+      errno = ENOTSUP;
+      return -1;
+    }
+# endif /* NeXT */
+
+# if !defined (LDAV_DONE) && defined (UMAX)
+#  define LDAV_DONE
+/* UMAX 4.2, which runs on the Encore Multimax multiprocessor, does not
+   have a /dev/kmem.  Information about the workings of the running kernel
+   can be gathered with inq_stats system calls.
+   We only know how to get the 1-minute average for this system.  */
+
+  struct proc_summary proc_sum_data;
+  struct stat_descr proc_info;
+  double load;
+  register unsigned int i, j;
+
+  if (cpus == 0)
+    {
+      register unsigned int c, i;
+      struct cpu_config conf;
+      struct stat_descr desc;
+
+      desc.sd_next = 0;
+      desc.sd_subsys = SUBSYS_CPU;
+      desc.sd_type = CPUTYPE_CONFIG;
+      desc.sd_addr = (char *) &conf;
+      desc.sd_size = sizeof conf;
+
+      if (inq_stats (1, &desc))
+        return -1;
+
+      c = 0;
+      for (i = 0; i < conf.config_maxclass; ++i)
+        {
+          struct class_stats stats;
+          memset (&stats, 0, sizeof stats);
+
+          desc.sd_type = CPUTYPE_CLASS;
+          desc.sd_objid = i;
+          desc.sd_addr = (char *) &stats;
+          desc.sd_size = sizeof stats;
+
+          if (inq_stats (1, &desc))
+            return -1;
+
+          c += stats.class_numcpus;
+        }
+      cpus = c;
+      samples = cpus < 2 ? 3 : (2 * cpus / 3);
+    }
+
+  proc_info.sd_next = 0;
+  proc_info.sd_subsys = SUBSYS_PROC;
+  proc_info.sd_type = PROCTYPE_SUMMARY;
+  proc_info.sd_addr = (char *) &proc_sum_data;
+  proc_info.sd_size = sizeof (struct proc_summary);
+  proc_info.sd_sizeused = 0;
+
+  if (inq_stats (1, &proc_info) != 0)
+    return -1;
+
+  load = proc_sum_data.ps_nrunnable;
+  j = 0;
+  for (i = samples - 1; i > 0; --i)
+    {
+      load += proc_sum_data.ps_nrun[j];
+      if (j++ == PS_NRUNSIZE)
+        j = 0;
+    }
+
+  if (nelem > 0)
+    loadavg[elem++] = load / samples / cpus;
+# endif /* UMAX */
+
+# if !defined (LDAV_DONE) && defined (DGUX)
+#  define LDAV_DONE
+  /* This call can return -1 for an error, but with good args
+     it's not supposed to fail.  The first argument is for no
+     apparent reason of type 'long int *'.  */
+  dg_sys_info ((long int *) &load_info,
+               DG_SYS_INFO_LOAD_INFO_TYPE,
+               DG_SYS_INFO_LOAD_VERSION_0);
+
+  if (nelem > 0)
+    loadavg[elem++] = load_info.one_minute;
+  if (nelem > 1)
+    loadavg[elem++] = load_info.five_minute;
+  if (nelem > 2)
+    loadavg[elem++] = load_info.fifteen_minute;
+# endif /* DGUX */
+
+# if !defined (LDAV_DONE) && defined (apollo)
+#  define LDAV_DONE
+/* Apollo code from lisch@mentorg.com (Ray Lischner).
+
+   This system call is not documented.  The load average is obtained as
+   three long integers, for the load average over the past minute,
+   five minutes, and fifteen minutes.  Each value is a scaled integer,
+   with 16 bits of integer part and 16 bits of fraction part.
+
+   I'm not sure which operating system first supported this system call,
+   but I know that SR10.2 supports it.  */
+
+  extern void proc1_$get_loadav ();
+  unsigned long load_ave[3];
+
+  proc1_$get_loadav (load_ave);
+
+  if (nelem > 0)
+    loadavg[elem++] = load_ave[0] / 65536.0;
+  if (nelem > 1)
+    loadavg[elem++] = load_ave[1] / 65536.0;
+  if (nelem > 2)
+    loadavg[elem++] = load_ave[2] / 65536.0;
+# endif /* apollo */
+
+# if !defined (LDAV_DONE) && defined (OSF_MIPS)
+#  define LDAV_DONE
+
+  struct tbl_loadavg load_ave;
+  table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
+  loadavg[elem++]
+    = (load_ave.tl_lscale == 0
+       ? load_ave.tl_avenrun.d[0]
+       : (load_ave.tl_avenrun.l[0] / (double) load_ave.tl_lscale));
+# endif /* OSF_MIPS */
+
+# if !defined (LDAV_DONE) && (defined (__MSDOS__) || defined (WINDOWS32))
+                                                           /* DJGPP */
+#  define LDAV_DONE
+
+  /* A faithful emulation is going to have to be saved for a rainy day.  */
+  for ( ; elem < nelem; elem++)
+    {
+      loadavg[elem] = 0.0;
+    }
+# endif  /* __MSDOS__ || WINDOWS32 */
+
+# if !defined (LDAV_DONE) && defined (OSF_ALPHA)           /* OSF/1 */
+#  define LDAV_DONE
+
+  struct tbl_loadavg load_ave;
+  table (TBL_LOADAVG, 0, &load_ave, 1, sizeof (load_ave));
+  for (elem = 0; elem < nelem; elem++)
+    loadavg[elem]
+      = (load_ave.tl_lscale == 0
+         ? load_ave.tl_avenrun.d[elem]
+         : (load_ave.tl_avenrun.l[elem] / (double) load_ave.tl_lscale));
+# endif /* OSF_ALPHA */
+
+# if ! defined LDAV_DONE && defined __VMS                  /* VMS */
+  /* VMS specific code -- read from the Load Ave driver.  */
+
+  LOAD_AVE_TYPE load_ave[3];
+  static bool getloadavg_initialized;
+#  ifdef eunice
+  struct
+  {
+    int dsc$w_length;
+    char *dsc$a_pointer;
+  } descriptor;
+#  endif
+
+  /* Ensure that there is a channel open to the load ave device.  */
+  if (!getloadavg_initialized)
+    {
+      /* Attempt to open the channel.  */
+#  ifdef eunice
+      descriptor.dsc$w_length = 18;
+      descriptor.dsc$a_pointer = "$$VMS_LOAD_AVERAGE";
+#  else
+      $DESCRIPTOR (descriptor, "LAV0:");
+#  endif
+      if (sys$assign (&descriptor, &channel, 0, 0) & 1)
+        getloadavg_initialized = true;
+    }
+
+  /* Read the load average vector.  */
+  if (getloadavg_initialized
+      && !(sys$qiow (0, channel, IO$_READVBLK, 0, 0, 0,
+                     load_ave, 12, 0, 0, 0, 0) & 1))
+    {
+      sys$dassgn (channel);
+      getloadavg_initialized = false;
+    }
+
+  if (!getloadavg_initialized)
+    {
+      errno = ENOTSUP;
+      return -1;
+    }
+# endif /* ! defined LDAV_DONE && defined __VMS */
+
+# if ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS
+                                                  /* IRIX, other old systems */
+
+  /* UNIX-specific code -- read the average from /dev/kmem.  */
+
+#  define LDAV_PRIVILEGED               /* This code requires special installation.  */
+
+  LOAD_AVE_TYPE load_ave[3];
+
+  /* Get the address of LDAV_SYMBOL.  */
+  if (offset == 0)
+    {
+#  ifndef sgi
+#   if ! defined NLIST_STRUCT || ! defined N_NAME_POINTER
+      strcpy (name_list[0].n_name, LDAV_SYMBOL);
+      strcpy (name_list[1].n_name, "");
+#   else /* NLIST_STRUCT */
+#    ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
+      name_list[0].n_un.n_name = LDAV_SYMBOL;
+      name_list[1].n_un.n_name = 0;
+#    else /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
+      name_list[0].n_name = LDAV_SYMBOL;
+      name_list[1].n_name = 0;
+#    endif /* not HAVE_STRUCT_NLIST_N_UN_N_NAME */
+#   endif /* NLIST_STRUCT */
+
+#   ifndef SUNOS_5
+      if (
+#    if !defined (_AIX)
+          nlist (KERNEL_FILE, name_list)
+#    else  /* _AIX */
+          knlist (name_list, 1, sizeof (name_list[0]))
+#    endif
+          >= 0)
+          /* Omit "&& name_list[0].n_type != 0 " -- it breaks on Sun386i.  */
+          {
+#    ifdef FIXUP_KERNEL_SYMBOL_ADDR
+            FIXUP_KERNEL_SYMBOL_ADDR (name_list);
+#    endif
+            offset = name_list[0].n_value;
+          }
+#   endif /* !SUNOS_5 */
+#  else  /* sgi */
+      ptrdiff_t ldav_off = sysmp (MP_KERNADDR, MPKA_AVENRUN);
+      if (ldav_off != -1)
+        offset = (long int) ldav_off & 0x7fffffff;
+#  endif /* sgi */
+    }
+
+  /* Make sure we have /dev/kmem open.  */
+  if (!getloadavg_initialized)
+    {
+#  ifndef SUNOS_5
+      /* Set the channel to close on exec, so it does not
+         litter any child's descriptor table.  */
+#   ifndef O_CLOEXEC
+#    define O_CLOEXEC 0
+#   endif
+      int fd = open ("/dev/kmem", O_RDONLY | O_CLOEXEC);
+      if (0 <= fd)
+        {
+#   if F_DUPFD_CLOEXEC
+          if (fd <= STDERR_FILENO)
+            {
+              int fd1 = fcntl (fd, F_DUPFD_CLOEXEC, STDERR_FILENO + 1);
+              close (fd);
+              fd = fd1;
+            }
+#   endif
+          if (0 <= fd)
+            {
+              channel = fd;
+              getloadavg_initialized = true;
+            }
+        }
+#  else /* SUNOS_5 */
+      /* We pass 0 for the kernel, corefile, and swapfile names
+         to use the currently running kernel.  */
+      kd = kvm_open (0, 0, 0, O_RDONLY, 0);
+      if (kd != NULL)
+        {
+          /* nlist the currently running kernel.  */
+          kvm_nlist (kd, name_list);
+          offset = name_list[0].n_value;
+          getloadavg_initialized = true;
+        }
+#  endif /* SUNOS_5 */
+    }
+
+  /* If we can, get the load average values.  */
+  if (offset && getloadavg_initialized)
+    {
+      /* Try to read the load.  */
+#  ifndef SUNOS_5
+      if (lseek (channel, offset, 0) == -1L
+          || read (channel, (char *) load_ave, sizeof (load_ave))
+          != sizeof (load_ave))
+        {
+          close (channel);
+          getloadavg_initialized = false;
+        }
+#  else  /* SUNOS_5 */
+      if (kvm_read (kd, offset, (char *) load_ave, sizeof (load_ave))
+          != sizeof (load_ave))
+        {
+          kvm_close (kd);
+          getloadavg_initialized = false;
+        }
+#  endif /* SUNOS_5 */
+    }
+
+  if (offset == 0 || !getloadavg_initialized)
+    {
+      errno = ENOTSUP;
+      return -1;
+    }
+# endif /* ! defined LDAV_DONE && defined LOAD_AVE_TYPE && ! defined __VMS */
+
+# if !defined (LDAV_DONE) && defined (LOAD_AVE_TYPE) /* Including VMS.  */
+  if (nelem > 0)
+    loadavg[elem++] = LDAV_CVT (load_ave[0]);
+  if (nelem > 1)
+    loadavg[elem++] = LDAV_CVT (load_ave[1]);
+  if (nelem > 2)
+    loadavg[elem++] = LDAV_CVT (load_ave[2]);
+
+#  define LDAV_DONE
+# endif /* !LDAV_DONE && LOAD_AVE_TYPE */
+
+# if !defined LDAV_DONE
+  errno = ENOSYS;
+  elem = -1;
+# endif
+  return elem;
+}
diff --git a/lib/getprogname.c b/lib/getprogname.c
new file mode 100644 (file)
index 0000000..9f69f5a
--- /dev/null
@@ -0,0 +1,260 @@
+/* Program name management.
+   Copyright (C) 2016-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "getprogname.h"
+
+#include <errno.h> /* get program_invocation_name declaration */
+#include <stdlib.h> /* get __argv declaration */
+
+#ifdef _AIX
+# include <unistd.h>
+# include <procinfo.h>
+# include <string.h>
+#endif
+
+#ifdef __MVS__
+# ifndef _OPEN_SYS
+#  define _OPEN_SYS
+# endif
+# include <string.h>
+# include <sys/ps.h>
+#endif
+
+#ifdef __hpux
+# include <unistd.h>
+# include <sys/param.h>
+# include <sys/pstat.h>
+# include <string.h>
+#endif
+
+#ifdef __sgi
+# include <string.h>
+# include <unistd.h>
+# include <stdio.h>
+# include <fcntl.h>
+# include <sys/procfs.h>
+#endif
+
+#include "dirname.h"
+
+#ifndef HAVE_GETPROGNAME             /* not Mac OS X, FreeBSD, NetBSD, OpenBSD >= 5.4, Cygwin */
+char const *
+getprogname (void)
+{
+# if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME                /* glibc, BeOS */
+  /* https://www.gnu.org/software/libc/manual/html_node/Error-Messages.html */
+  return program_invocation_short_name;
+# elif HAVE_DECL_PROGRAM_INVOCATION_NAME                    /* glibc, BeOS */
+  /* https://www.gnu.org/software/libc/manual/html_node/Error-Messages.html */
+  return last_component (program_invocation_name);
+# elif HAVE_GETEXECNAME                                     /* Solaris */
+  /* https://docs.oracle.com/cd/E19253-01/816-5168/6mbb3hrb1/index.html */
+  const char *p = getexecname ();
+  if (!p)
+    p = "?";
+  return last_component (p);
+# elif HAVE_DECL___ARGV                                     /* mingw, MSVC */
+  /* https://docs.microsoft.com/en-us/cpp/c-runtime-library/argc-argv-wargv */
+  const char *p = __argv && __argv[0] ? __argv[0] : "?";
+  return last_component (p);
+# elif HAVE_VAR___PROGNAME                                  /* OpenBSD, Android, QNX */
+  /* https://man.openbsd.org/style.9 */
+  /* http://www.qnx.de/developers/docs/6.5.0/index.jsp?topic=%2Fcom.qnx.doc.neutrino_lib_ref%2Fp%2F__progname.html */
+  /* Be careful to declare this only when we absolutely need it
+     (OpenBSD 5.1), rather than when it's available.  Otherwise,
+     its mere declaration makes program_invocation_short_name
+     malfunction (have zero length) with Fedora 25's glibc.  */
+  extern char *__progname;
+  const char *p = __progname;
+#  if defined __ANDROID__
+  return last_component (p);
+#  else
+  return p && p[0] ? p : "?";
+#  endif
+# elif _AIX                                                 /* AIX */
+  /* Idea by Bastien ROUCARIÈS,
+     https://lists.gnu.org/r/bug-gnulib/2010-12/msg00095.html
+     Reference: https://www.ibm.com/support/knowledgecenter/en/ssw_aix_61/com.ibm.aix.basetrf1/getprocs.htm
+  */
+  static char *p;
+  static int first = 1;
+  if (first)
+    {
+      first = 0;
+      pid_t pid = getpid ();
+      struct procentry64 procs;
+      p = (0 < getprocs64 (&procs, sizeof procs, NULL, 0, &pid, 1)
+           ? strdup (procs.pi_comm)
+           : NULL);
+      if (!p)
+        p = "?";
+    }
+  return p;
+# elif defined __hpux
+  static char *p;
+  static int first = 1;
+  if (first)
+    {
+      first = 0;
+      pid_t pid = getpid ();
+      struct pst_status status;
+      if (pstat_getproc (&status, sizeof status, 0, pid) > 0)
+        {
+          char *ucomm = status.pst_ucomm;
+          char *cmd = status.pst_cmd;
+          if (strlen (ucomm) < PST_UCOMMLEN - 1)
+            p = ucomm;
+          else
+            {
+              /* ucomm is truncated to length PST_UCOMMLEN - 1.
+                 Look at cmd instead.  */
+              char *space = strchr (cmd, ' ');
+              if (space != NULL)
+                *space = '\0';
+              p = strrchr (cmd, '/');
+              if (p != NULL)
+                p++;
+              else
+                p = cmd;
+              if (strlen (p) > PST_UCOMMLEN - 1
+                  && memcmp (p, ucomm, PST_UCOMMLEN - 1) == 0)
+                /* p is less truncated than ucomm.  */
+                ;
+              else
+                p = ucomm;
+            }
+          p = strdup (p);
+        }
+      else
+        {
+#  if !defined __LP64__
+          /* Support for 32-bit programs running in 64-bit HP-UX.
+             The documented way to do this is to use the same source code
+             as above, but in a compilation unit where '#define _PSTAT64 1'
+             is in effect.  I prefer a single compilation unit; the struct
+             size and the offsets are not going to change.  */
+          char status64[1216];
+          if (__pstat_getproc64 (status64, sizeof status64, 0, pid) > 0)
+            {
+              char *ucomm = status64 + 288;
+              char *cmd = status64 + 168;
+              if (strlen (ucomm) < PST_UCOMMLEN - 1)
+                p = ucomm;
+              else
+                {
+                  /* ucomm is truncated to length PST_UCOMMLEN - 1.
+                     Look at cmd instead.  */
+                  char *space = strchr (cmd, ' ');
+                  if (space != NULL)
+                    *space = '\0';
+                  p = strrchr (cmd, '/');
+                  if (p != NULL)
+                    p++;
+                  else
+                    p = cmd;
+                  if (strlen (p) > PST_UCOMMLEN - 1
+                      && memcmp (p, ucomm, PST_UCOMMLEN - 1) == 0)
+                    /* p is less truncated than ucomm.  */
+                    ;
+                  else
+                    p = ucomm;
+                }
+              p = strdup (p);
+            }
+          else
+#  endif
+            p = NULL;
+        }
+      if (!p)
+        p = "?";
+    }
+  return p;
+# elif __MVS__                                              /* z/OS */
+  /* https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.bpxbd00/rtwgetp.htm */
+  static char *p = "?";
+  static int first = 1;
+  if (first)
+    {
+      pid_t pid = getpid ();
+      int token;
+      W_PSPROC buf;
+      first = 0;
+      memset (&buf, 0, sizeof(buf));
+      buf.ps_cmdptr    = (char *) malloc (buf.ps_cmdlen    = PS_CMDBLEN_LONG);
+      buf.ps_conttyptr = (char *) malloc (buf.ps_conttylen = PS_CONTTYBLEN);
+      buf.ps_pathptr   = (char *) malloc (buf.ps_pathlen   = PS_PATHBLEN);
+      if (buf.ps_cmdptr && buf.ps_conttyptr && buf.ps_pathptr)
+        {
+          for (token = 0; token >= 0;
+               token = w_getpsent (token, &buf, sizeof(buf)))
+            {
+              if (token > 0 && buf.ps_pid == pid)
+                {
+                  char *s = strdup (last_component (buf.ps_pathptr));
+                  if (s)
+                    p = s;
+                  break;
+                }
+            }
+        }
+      free (buf.ps_cmdptr);
+      free (buf.ps_conttyptr);
+      free (buf.ps_pathptr);
+    }
+  return p;
+# elif defined __sgi                                        /* IRIX */
+  char filename[50];
+  int fd;
+
+  sprintf (filename, "/proc/pinfo/%d", (int) getpid ());
+  fd = open (filename, O_RDONLY);
+  if (0 <= fd)
+    {
+      prpsinfo_t buf;
+      int ioctl_ok = 0 <= ioctl (fd, PIOCPSINFO, &buf);
+      close (fd);
+      if (ioctl_ok)
+        {
+          char *name = buf.pr_fname;
+          size_t namesize = sizeof buf.pr_fname;
+          /* It may not be NUL-terminated.  */
+          char *namenul = memchr (name, '\0', namesize);
+          size_t namelen = namenul ? namenul - name : namesize;
+          char *namecopy = malloc (namelen + 1);
+          if (namecopy)
+            {
+              namecopy[namelen] = '\0';
+              return memcpy (namecopy, name, namelen);
+            }
+        }
+    }
+  return NULL;
+# else
+#  error "getprogname module not ported to this OS"
+# endif
+}
+
+#endif
+
+/*
+ * Hey Emacs!
+ * Local Variables:
+ * coding: utf-8
+ * End:
+ */
diff --git a/lib/getprogname.h b/lib/getprogname.h
new file mode 100644 (file)
index 0000000..676912b
--- /dev/null
@@ -0,0 +1,40 @@
+/* Program name management.
+   Copyright (C) 2016-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_GETPROGNAME_H
+#define _GL_GETPROGNAME_H
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Return the base name of the executing program.
+   On native Windows this will usually end in ".exe" or ".EXE". */
+#ifndef HAVE_GETPROGNAME
+extern char const *getprogname (void)
+# ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
+  _GL_ATTRIBUTE_PURE
+# endif
+  ;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/gettext.h b/lib/gettext.h
new file mode 100644 (file)
index 0000000..0bd1e13
--- /dev/null
@@ -0,0 +1,301 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+   Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2020 Free Software
+   Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option
+   or through "#define ENABLE NLS 0" before including this file.  */
+#if defined ENABLE_NLS && ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions.  */
+# include <libintl.h>
+
+/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
+   the gettext() and ngettext() macros.  This is an alternative to calling
+   textdomain(), and is useful for libraries.  */
+# ifdef DEFAULT_TEXT_DOMAIN
+#  undef gettext
+#  define gettext(Msgid) \
+     dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
+#  undef ngettext
+#  define ngettext(Msgid1, Msgid2, N) \
+     dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
+# endif
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+   chokes if dcgettext is defined as a macro.  So include it now, to make
+   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
+   as well because people using "gettext.h" will not include <libintl.h>,
+   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+   is OK.  */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
+   <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
+   it now, to make later inclusions of <libintl.h> a NOP.  */
+#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
+# include <cstdlib>
+# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
+#  include <libintl.h>
+# endif
+#endif
+
+/* Disabled NLS.
+   The casts to 'const char *' serve the purpose of producing warnings
+   for invalid uses of the value returned from these functions.
+   On pre-ANSI systems without 'const', the config.h file is supposed to
+   contain "#define const".  */
+# undef gettext
+# define gettext(Msgid) ((const char *) (Msgid))
+# undef dgettext
+# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
+# undef dcgettext
+# define dcgettext(Domainname, Msgid, Category) \
+    ((void) (Category), dgettext (Domainname, Msgid))
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+    ((N) == 1 \
+     ? ((void) (Msgid2), (const char *) (Msgid1)) \
+     : ((void) (Msgid1), (const char *) (Msgid2)))
+# undef dngettext
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+    ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
+# undef dcngettext
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+    ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
+# undef textdomain
+# define textdomain(Domainname) ((const char *) (Domainname))
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) \
+    ((void) (Domainname), (const char *) (Dirname))
+# undef bind_textdomain_codeset
+# define bind_textdomain_codeset(Domainname, Codeset) \
+    ((void) (Domainname), (const char *) (Codeset))
+
+#endif
+
+/* Prefer gnulib's setlocale override over libintl's setlocale override.  */
+#ifdef GNULIB_defined_setlocale
+# undef setlocale
+# define setlocale rpl_setlocale
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+   extraction of messages, but does not call gettext().  The run-time
+   translation is done at a different place in the code.
+   The argument, String, should be a literal string.  Concatenated strings
+   and other string expressions won't work.
+   The macro's expansion is not parenthesized, so that it is suitable as
+   initializer for static 'char[]' or 'const char[]' variables.  */
+#define gettext_noop(String) String
+
+/* The separator between msgctxt and msgid in a .mo file.  */
+#define GETTEXT_CONTEXT_GLUE "\004"
+
+/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
+   MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
+   short and rarely need to change.
+   The letter 'p' stands for 'particular' or 'special'.  */
+#ifdef DEFAULT_TEXT_DOMAIN
+# define pgettext(Msgctxt, Msgid) \
+   pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#else
+# define pgettext(Msgctxt, Msgid) \
+   pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#endif
+#define dpgettext(Domainname, Msgctxt, Msgid) \
+  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
+  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
+#ifdef DEFAULT_TEXT_DOMAIN
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+   npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#else
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+   npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#endif
+#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
+  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+pgettext_aux (const char *domain,
+              const char *msg_ctxt_id, const char *msgid,
+              int category)
+{
+  const char *translation = dcgettext (domain, msg_ctxt_id, category);
+  if (translation == msg_ctxt_id)
+    return msgid;
+  else
+    return translation;
+}
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+npgettext_aux (const char *domain,
+               const char *msg_ctxt_id, const char *msgid,
+               const char *msgid_plural, unsigned long int n,
+               int category)
+{
+  const char *translation =
+    dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+  if (translation == msg_ctxt_id || translation == msgid_plural)
+    return (n == 1 ? msgid : msgid_plural);
+  else
+    return translation;
+}
+
+/* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
+   can be arbitrary expressions.  But for string literals these macros are
+   less efficient than those above.  */
+
+#include <string.h>
+
+/* GNULIB_NO_VLA can be defined to disable use of VLAs even if supported.
+   This relates to the -Wvla and -Wvla-larger-than warnings, enabled in
+   the default GCC many warnings set.  This allows programs to disable use
+   of VLAs, which may be unintended, or may be awkward to support portably,
+   or may have security implications due to non-deterministic stack usage.  */
+
+#if (!defined GNULIB_NO_VLA \
+     && (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
+     /*  || (__STDC_VERSION__ == 199901L && !defined __HP_cc)
+         || (__STDC_VERSION__ >= 201112L && !defined __STDC_NO_VLA__) */ ))
+# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
+#else
+# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
+#endif
+
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+#include <stdlib.h>
+#endif
+
+#define pgettext_expr(Msgctxt, Msgid) \
+  dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
+#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
+  dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcpgettext_expr (const char *domain,
+                 const char *msgctxt, const char *msgid,
+                 int category)
+{
+  size_t msgctxt_len = strlen (msgctxt) + 1;
+  size_t msgid_len = strlen (msgid) + 1;
+  const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+  char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+  char buf[1024];
+  char *msg_ctxt_id =
+    (msgctxt_len + msgid_len <= sizeof (buf)
+     ? buf
+     : (char *) malloc (msgctxt_len + msgid_len));
+  if (msg_ctxt_id != NULL)
+#endif
+    {
+      int found_translation;
+      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+      msg_ctxt_id[msgctxt_len - 1] = '\004';
+      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+      translation = dcgettext (domain, msg_ctxt_id, category);
+      found_translation = (translation != msg_ctxt_id);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+      if (msg_ctxt_id != buf)
+        free (msg_ctxt_id);
+#endif
+      if (found_translation)
+        return translation;
+    }
+  return msgid;
+}
+
+#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
+  dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+  dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcnpgettext_expr (const char *domain,
+                  const char *msgctxt, const char *msgid,
+                  const char *msgid_plural, unsigned long int n,
+                  int category)
+{
+  size_t msgctxt_len = strlen (msgctxt) + 1;
+  size_t msgid_len = strlen (msgid) + 1;
+  const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+  char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+  char buf[1024];
+  char *msg_ctxt_id =
+    (msgctxt_len + msgid_len <= sizeof (buf)
+     ? buf
+     : (char *) malloc (msgctxt_len + msgid_len));
+  if (msg_ctxt_id != NULL)
+#endif
+    {
+      int found_translation;
+      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+      msg_ctxt_id[msgctxt_len - 1] = '\004';
+      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+      translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+      found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+      if (msg_ctxt_id != buf)
+        free (msg_ctxt_id);
+#endif
+      if (found_translation)
+        return translation;
+    }
+  return (n == 1 ? msgid : msgid_plural);
+}
+
+#endif /* _LIBGETTEXT_H */
diff --git a/lib/glob.c b/lib/glob.c
new file mode 100644 (file)
index 0000000..adad16f
--- /dev/null
@@ -0,0 +1,1437 @@
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999 Free
+Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB.  If not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.  */
+
+/* AIX requires this to be the first thing in the file.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in glob.h.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* Outcomment the following line for production quality code.  */
+/* #define NDEBUG 1 */
+#include <assert.h>
+
+#include <stdio.h>             /* Needed on stupid SunOS for assert.  */
+
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GLOB_INTERFACE_VERSION 1
+#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+# include <gnu-versions.h>
+# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
+#endif
+
+#ifndef ELIDE_CODE
+
+#if defined STDC_HEADERS || defined __GNU_LIBRARY__
+# include <stddef.h>
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+# ifndef POSIX
+#  ifdef _POSIX_VERSION
+#   define POSIX
+#  endif
+# endif
+#endif
+
+#if !defined _AMIGA && !defined VMS && !defined WINDOWS32
+# include <pwd.h>
+#endif
+
+#if !defined __GNU_LIBRARY__ && !defined STDC_HEADERS
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#ifndef        NULL
+# define NULL  0
+#endif
+
+
+#if defined HAVE_DIRENT_H || defined __GNU_LIBRARY__
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+# ifdef HAVE_VMSDIR_H
+#  include "vmsdir.h"
+# endif /* HAVE_VMSDIR_H */
+#endif
+
+
+/* In GNU systems, <dirent.h> defines this macro for us.  */
+#ifdef _D_NAMLEN
+# undef NAMLEN
+# define NAMLEN(d) _D_NAMLEN(d)
+#endif
+
+/* When used in the GNU libc the symbol _DIRENT_HAVE_D_TYPE is available
+   if the `d_type' member for `struct dirent' is available.  */
+#if defined(_DIRENT_HAVE_D_TYPE) || defined(HAVE_STRUCT_DIRENT_D_TYPE)
+# define HAVE_D_TYPE   1
+#endif
+
+
+#if (defined POSIX || defined WINDOWS32) && !defined __GNU_LIBRARY__
+/* Posix does not require that the d_ino field be present, and some
+   systems do not provide it. */
+# define REAL_DIR_ENTRY(dp) 1
+#else
+# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+#endif /* POSIX */
+
+#if defined STDC_HEADERS || defined __GNU_LIBRARY__
+# include <stdlib.h>
+# include <string.h>
+# define       ANSI_STRING
+#else  /* No standard headers.  */
+
+extern char *getenv ();
+
+# ifdef HAVE_STRING_H
+#  include <string.h>
+#  define ANSI_STRING
+# else
+#  include <strings.h>
+# endif
+# ifdef        HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+
+extern char *malloc (), *realloc ();
+extern void free ();
+
+extern void qsort ();
+extern void abort (), exit ();
+
+#endif /* Standard headers.  */
+
+#ifndef        ANSI_STRING
+
+# ifndef bzero
+extern void bzero ();
+# endif
+# ifndef bcopy
+extern void bcopy ();
+# endif
+
+# define memcpy(d, s, n)       bcopy ((s), (d), (n))
+# define strrchr       rindex
+/* memset is only used for zero here, but let's be paranoid.  */
+# define memset(s, better_be_zero, n) \
+  ((void) ((better_be_zero) == 0 ? (bzero((s), (n)), 0) : (abort(), 0)))
+#endif /* Not ANSI_STRING.  */
+
+#if !defined HAVE_STRCOLL && !defined _LIBC
+# define strcoll       strcmp
+#endif
+
+#if !defined HAVE_MEMPCPY && __GLIBC__ - 0 == 2 && __GLIBC_MINOR__ >= 1
+# define HAVE_MEMPCPY  1
+# undef  mempcpy
+# define mempcpy(Dest, Src, Len) __mempcpy (Dest, Src, Len)
+#endif
+
+#if !defined __GNU_LIBRARY__ && !defined __DJGPP__
+# ifdef        __GNUC__
+__inline
+# endif
+# ifndef __SASC
+#  ifdef WINDOWS32
+static void *
+my_realloc (void *p, unsigned int n)
+#  else
+static char *
+my_realloc (p, n)
+     char *p;
+     unsigned int n;
+#  endif
+{
+  /* These casts are the for sake of the broken Ultrix compiler,
+     which warns of illegal pointer combinations otherwise.  */
+  if (p == NULL)
+    return (char *) malloc (n);
+  return (char *) realloc (p, n);
+}
+# define       realloc my_realloc
+# endif /* __SASC */
+#endif /* __GNU_LIBRARY__ || __DJGPP__ */
+
+
+#if !defined __alloca && !defined __GNU_LIBRARY__
+
+# ifdef        __GNUC__
+#  undef alloca
+#  define alloca(n)    __builtin_alloca (n)
+# else /* Not GCC.  */
+#  ifdef HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else        /* Not HAVE_ALLOCA_H.  */
+#   ifndef _AIX
+#    ifdef WINDOWS32
+#     include <malloc.h>
+#    else
+extern char *alloca ();
+#    endif /* WINDOWS32 */
+#   endif /* Not _AIX.  */
+#  endif /* sparc or HAVE_ALLOCA_H.  */
+# endif        /* GCC.  */
+#endif
+
+#ifndef __GNU_LIBRARY__
+# define __stat stat
+# ifdef STAT_MACROS_BROKEN
+#  undef S_ISDIR
+# endif
+# ifndef S_ISDIR
+#  define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+# endif
+#endif
+
+#ifdef _LIBC
+# undef strdup
+# define strdup(str) __strdup (str)
+# define sysconf(id) __sysconf (id)
+# define closedir(dir) __closedir (dir)
+# define opendir(name) __opendir (name)
+# define readdir(str) __readdir (str)
+# define getpwnam_r(name, bufp, buf, len, res) \
+   __getpwnam_r (name, bufp, buf, len, res)
+# ifndef __stat
+#  define __stat(fname, buf) __xstat (_STAT_VER, fname, buf)
+# endif
+#endif
+
+#if !(defined STDC_HEADERS || defined __GNU_LIBRARY__)
+# undef        size_t
+# define size_t        unsigned int
+#endif
+
+/* Some system header files erroneously define these.
+   We want our own definitions from <fnmatch.h> to take precedence.  */
+#ifndef __GNU_LIBRARY__
+# undef        FNM_PATHNAME
+# undef        FNM_NOESCAPE
+# undef        FNM_PERIOD
+#endif
+#include <fnmatch.h>
+
+/* Some system header files erroneously define these.
+   We want our own definitions from <glob.h> to take precedence.  */
+#ifndef __GNU_LIBRARY__
+# undef        GLOB_ERR
+# undef        GLOB_MARK
+# undef        GLOB_NOSORT
+# undef        GLOB_DOOFFS
+# undef        GLOB_NOCHECK
+# undef        GLOB_APPEND
+# undef        GLOB_NOESCAPE
+# undef        GLOB_PERIOD
+#endif
+#include <glob.h>
+
+#if !defined __alloca
+# define __alloca alloca
+#endif
+
+#if !defined __stat
+# define __stat stat
+#endif
+
+#ifdef HAVE_GETLOGIN_R
+extern int getlogin_r __P ((char *, size_t));
+#else
+extern char *getlogin __P ((void));
+#endif
+\f
+static
+#if __GNUC__ - 0 >= 2
+inline
+#endif
+const char *next_brace_sub __P ((const char *begin));
+static int glob_in_dir __P ((const char *pattern, const char *directory,
+                            int flags,
+                            int (*errfunc) (const char *, int),
+                            glob_t *pglob));
+static int prefix_array __P ((const char *prefix, char **array, size_t n));
+static int collated_compare __P ((const __ptr_t, const __ptr_t));
+
+#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
+int __glob_pattern_p __P ((const char *pattern, int quote));
+#endif
+
+/* Find the end of the sub-pattern in a brace expression.  We define
+   this as an inline function if the compiler permits.  */
+static
+#if __GNUC__ - 0 >= 2
+inline
+#endif
+const char *
+next_brace_sub (begin)
+     const char *begin;
+{
+  unsigned int depth = 0;
+  const char *cp = begin;
+
+  while (1)
+    {
+      if (depth == 0)
+       {
+         if (*cp != ',' && *cp != '}' && *cp != '\0')
+           {
+             if (*cp == '{')
+               ++depth;
+             ++cp;
+             continue;
+           }
+       }
+      else
+       {
+         while (*cp != '\0' && (*cp != '}' || depth > 0))
+           {
+             if (*cp == '}')
+               --depth;
+             ++cp;
+           }
+         if (*cp == '\0')
+           /* An incorrectly terminated brace expression.  */
+           return NULL;
+
+         continue;
+       }
+      break;
+    }
+
+  return cp;
+}
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+   The bits defined above may be set in FLAGS.
+   If a directory cannot be opened or read and ERRFUNC is not nil,
+   it is called with the pathname that caused the error, and the
+   `errno' value from the failing call; if it returns non-zero
+   `glob' returns GLOB_ABORTED; if it returns zero, the error is ignored.
+   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+   Otherwise, `glob' returns zero.  */
+int
+glob (pattern, flags, errfunc, pglob)
+     const char *pattern;
+     int flags;
+     int (*errfunc) __P ((const char *, int));
+     glob_t *pglob;
+{
+  const char *filename;
+  const char *dirname;
+  size_t dirlen;
+  int status;
+  size_t oldcount;
+
+  if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0)
+    {
+      __set_errno (EINVAL);
+      return -1;
+    }
+
+  /* POSIX requires all slashes to be matched.  This means that with
+     a trailing slash we must match only directories.  */
+  if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
+    flags |= GLOB_ONLYDIR;
+
+  if (flags & GLOB_BRACE)
+    {
+      const char *begin = strchr (pattern, '{');
+      if (begin != NULL)
+       {
+         /* Allocate working buffer large enough for our work.  Note that
+           we have at least an opening and closing brace.  */
+         size_t firstc;
+         char *alt_start;
+         const char *p;
+         const char *next;
+         const char *rest;
+         size_t rest_len;
+#ifdef __GNUC__
+         char onealt[strlen (pattern) - 1];
+#else
+         char *onealt = (char *) malloc (strlen (pattern) - 1);
+         if (onealt == NULL)
+           {
+             if (!(flags & GLOB_APPEND))
+               globfree (pglob);
+             return GLOB_NOSPACE;
+           }
+#endif
+
+         /* We know the prefix for all sub-patterns.  */
+#ifdef HAVE_MEMPCPY
+         alt_start = mempcpy (onealt, pattern, begin - pattern);
+#else
+         memcpy (onealt, pattern, begin - pattern);
+         alt_start = &onealt[begin - pattern];
+#endif
+
+         /* Find the first sub-pattern and at the same time find the
+            rest after the closing brace.  */
+         next = next_brace_sub (begin + 1);
+         if (next == NULL)
+           {
+             /* It is an illegal expression.  */
+#ifndef __GNUC__
+             free (onealt);
+#endif
+             return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
+           }
+
+         /* Now find the end of the whole brace expression.  */
+         rest = next;
+         while (*rest != '}')
+           {
+             rest = next_brace_sub (rest + 1);
+             if (rest == NULL)
+               {
+                 /* It is an illegal expression.  */
+#ifndef __GNUC__
+                 free (onealt);
+#endif
+                 return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
+               }
+           }
+         /* Please note that we now can be sure the brace expression
+            is well-formed.  */
+         rest_len = strlen (++rest) + 1;
+
+         /* We have a brace expression.  BEGIN points to the opening {,
+            NEXT points past the terminator of the first element, and END
+            points past the final }.  We will accumulate result names from
+            recursive runs for each brace alternative in the buffer using
+            GLOB_APPEND.  */
+
+         if (!(flags & GLOB_APPEND))
+           {
+             /* This call is to set a new vector, so clear out the
+                vector so we can append to it.  */
+             pglob->gl_pathc = 0;
+             pglob->gl_pathv = NULL;
+           }
+         firstc = pglob->gl_pathc;
+
+         p = begin + 1;
+         while (1)
+           {
+             int result;
+
+             /* Construct the new glob expression.  */
+#ifdef HAVE_MEMPCPY
+             mempcpy (mempcpy (alt_start, p, next - p), rest, rest_len);
+#else
+             memcpy (alt_start, p, next - p);
+             memcpy (&alt_start[next - p], rest, rest_len);
+#endif
+
+             result = glob (onealt,
+                            ((flags & ~(GLOB_NOCHECK|GLOB_NOMAGIC))
+                             | GLOB_APPEND), errfunc, pglob);
+
+             /* If we got an error, return it.  */
+             if (result && result != GLOB_NOMATCH)
+               {
+#ifndef __GNUC__
+                 free (onealt);
+#endif
+                 if (!(flags & GLOB_APPEND))
+                   globfree (pglob);
+                 return result;
+               }
+
+             if (*next == '}')
+               /* We saw the last entry.  */
+               break;
+
+             p = next + 1;
+             next = next_brace_sub (p);
+             assert (next != NULL);
+           }
+
+#ifndef __GNUC__
+         free (onealt);
+#endif
+
+         if (pglob->gl_pathc != firstc)
+           /* We found some entries.  */
+           return 0;
+         else if (!(flags & (GLOB_NOCHECK|GLOB_NOMAGIC)))
+           return GLOB_NOMATCH;
+       }
+    }
+
+  /* Find the filename.  */
+  filename = strrchr (pattern, '/');
+#if defined __MSDOS__ || defined WINDOWS32
+  /* The case of "d:pattern".  Since `:' is not allowed in
+     file names, we can safely assume that wherever it
+     happens in pattern, it signals the filename part.  This
+     is so we could some day support patterns like "[a-z]:foo".  */
+  if (filename == NULL)
+    filename = strchr (pattern, ':');
+#endif /* __MSDOS__ || WINDOWS32 */
+  if (filename == NULL)
+    {
+      /* This can mean two things: a simple name or "~name".  The later
+        case is nothing but a notation for a directory.  */
+      if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern[0] == '~')
+       {
+         dirname = pattern;
+         dirlen = strlen (pattern);
+
+         /* Set FILENAME to NULL as a special flag.  This is ugly but
+            other solutions would require much more code.  We test for
+            this special case below.  */
+         filename = NULL;
+       }
+      else
+       {
+         filename = pattern;
+#ifdef _AMIGA
+         dirname = "";
+#else
+         dirname = ".";
+#endif
+         dirlen = 0;
+       }
+    }
+  else if (filename == pattern)
+    {
+      /* "/pattern".  */
+      dirname = "/";
+      dirlen = 1;
+      ++filename;
+    }
+  else
+    {
+      char *newp;
+      dirlen = filename - pattern;
+#if defined __MSDOS__ || defined WINDOWS32
+      if (*filename == ':'
+         || (filename > pattern + 1 && filename[-1] == ':'))
+       {
+         char *drive_spec;
+
+         ++dirlen;
+         drive_spec = (char *) __alloca (dirlen + 1);
+#ifdef HAVE_MEMPCPY
+         *((char *) mempcpy (drive_spec, pattern, dirlen)) = '\0';
+#else
+         memcpy (drive_spec, pattern, dirlen);
+         drive_spec[dirlen] = '\0';
+#endif
+         /* For now, disallow wildcards in the drive spec, to
+            prevent infinite recursion in glob.  */
+         if (__glob_pattern_p (drive_spec, !(flags & GLOB_NOESCAPE)))
+           return GLOB_NOMATCH;
+         /* If this is "d:pattern", we need to copy `:' to DIRNAME
+            as well.  If it's "d:/pattern", don't remove the slash
+            from "d:/", since "d:" and "d:/" are not the same.*/
+       }
+#endif
+      newp = (char *) __alloca (dirlen + 1);
+#ifdef HAVE_MEMPCPY
+      *((char *) mempcpy (newp, pattern, dirlen)) = '\0';
+#else
+      memcpy (newp, pattern, dirlen);
+      newp[dirlen] = '\0';
+#endif
+      dirname = newp;
+      ++filename;
+
+      if (filename[0] == '\0'
+#if defined __MSDOS__ || defined WINDOWS32
+          && dirname[dirlen - 1] != ':'
+         && (dirlen < 3 || dirname[dirlen - 2] != ':'
+             || dirname[dirlen - 1] != '/')
+#endif
+         && dirlen > 1)
+       /* "pattern/".  Expand "pattern", appending slashes.  */
+       {
+         int val = glob (dirname, flags | GLOB_MARK, errfunc, pglob);
+         if (val == 0)
+           pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK)
+                              | (flags & GLOB_MARK));
+         return val;
+       }
+    }
+
+  if (!(flags & GLOB_APPEND))
+    {
+      pglob->gl_pathc = 0;
+      pglob->gl_pathv = NULL;
+    }
+
+  oldcount = pglob->gl_pathc;
+
+#ifndef VMS
+  if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && dirname[0] == '~')
+    {
+      if (dirname[1] == '\0' || dirname[1] == '/')
+       {
+         /* Look up home directory.  */
+#ifdef VMS
+/* This isn't obvious, RTLs of DECC and VAXC know about "HOME" */
+          const char *home_dir = getenv ("SYS$LOGIN");
+#else
+          const char *home_dir = getenv ("HOME");
+#endif
+# ifdef _AMIGA
+         if (home_dir == NULL || home_dir[0] == '\0')
+           home_dir = "SYS:";
+# else
+#  ifdef WINDOWS32
+         if (home_dir == NULL || home_dir[0] == '\0')
+            home_dir = "c:/users/default"; /* poor default */
+#  else
+#   ifdef VMS
+/* Again, this isn't obvious, if "HOME" isn't known "SYS$LOGIN" should be set */
+         if (home_dir == NULL || home_dir[0] == '\0')
+           home_dir = "SYS$DISK:[]";
+#   else
+         if (home_dir == NULL || home_dir[0] == '\0')
+           {
+             int success;
+             char *name;
+#   if defined HAVE_GETLOGIN_R || defined _LIBC
+             size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1;
+
+             if (buflen == 0)
+               /* `sysconf' does not support _SC_LOGIN_NAME_MAX.  Try
+                  a moderate value.  */
+               buflen = 20;
+             name = (char *) __alloca (buflen);
+
+             success = getlogin_r (name, buflen) >= 0;
+#   else
+             success = (name = getlogin ()) != NULL;
+#   endif
+             if (success)
+               {
+                 struct passwd *p;
+#   if defined HAVE_GETPWNAM_R || defined _LIBC
+                 size_t pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX);
+                 char *pwtmpbuf;
+                 struct passwd pwbuf;
+                 int save = errno;
+
+                 if (pwbuflen == -1)
+                   /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.
+                      Try a moderate value.  */
+                   pwbuflen = 1024;
+                 pwtmpbuf = (char *) __alloca (pwbuflen);
+
+                 while (getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p)
+                        != 0)
+                   {
+                     if (errno != ERANGE)
+                       {
+                         p = NULL;
+                         break;
+                       }
+                     pwbuflen *= 2;
+                     pwtmpbuf = (char *) __alloca (pwbuflen);
+                     __set_errno (save);
+                   }
+#   else
+                 p = getpwnam (name);
+#   endif
+                 if (p != NULL)
+                   home_dir = p->pw_dir;
+               }
+           }
+         if (home_dir == NULL || home_dir[0] == '\0')
+           {
+             if (flags & GLOB_TILDE_CHECK)
+               return GLOB_NOMATCH;
+             else
+               home_dir = "~"; /* No luck.  */
+           }
+#   endif /* VMS */
+#  endif /* WINDOWS32 */
+# endif
+         /* Now construct the full directory.  */
+         if (dirname[1] == '\0')
+           dirname = home_dir;
+         else
+           {
+             char *newp;
+             size_t home_len = strlen (home_dir);
+             newp = (char *) __alloca (home_len + dirlen);
+# ifdef HAVE_MEMPCPY
+             mempcpy (mempcpy (newp, home_dir, home_len),
+                      &dirname[1], dirlen);
+# else
+             memcpy (newp, home_dir, home_len);
+             memcpy (&newp[home_len], &dirname[1], dirlen);
+# endif
+             dirname = newp;
+           }
+       }
+# if !defined _AMIGA && !defined WINDOWS32 && !defined VMS
+      else
+       {
+         char *end_name = strchr (dirname, '/');
+         const char *user_name;
+         const char *home_dir;
+
+         if (end_name == NULL)
+           user_name = dirname + 1;
+         else
+           {
+             char *newp;
+             newp = (char *) __alloca (end_name - dirname);
+# ifdef HAVE_MEMPCPY
+             *((char *) mempcpy (newp, dirname + 1, end_name - dirname))
+               = '\0';
+# else
+             memcpy (newp, dirname + 1, end_name - dirname);
+             newp[end_name - dirname - 1] = '\0';
+# endif
+             user_name = newp;
+           }
+
+         /* Look up specific user's home directory.  */
+         {
+           struct passwd *p;
+#  if defined HAVE_GETPWNAM_R || defined _LIBC
+           size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX);
+           char *pwtmpbuf;
+           struct passwd pwbuf;
+           int save = errno;
+
+           if (buflen == -1)
+             /* `sysconf' does not support _SC_GETPW_R_SIZE_MAX.  Try a
+                moderate value.  */
+             buflen = 1024;
+           pwtmpbuf = (char *) __alloca (buflen);
+
+           while (getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) != 0)
+             {
+               if (errno != ERANGE)
+                 {
+                   p = NULL;
+                   break;
+                 }
+               buflen *= 2;
+               pwtmpbuf = __alloca (buflen);
+               __set_errno (save);
+             }
+#  else
+           p = getpwnam (user_name);
+#  endif
+           if (p != NULL)
+             home_dir = p->pw_dir;
+           else
+             home_dir = NULL;
+         }
+         /* If we found a home directory use this.  */
+         if (home_dir != NULL)
+           {
+             char *newp;
+             size_t home_len = strlen (home_dir);
+             size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
+             newp = (char *) __alloca (home_len + rest_len + 1);
+#  ifdef HAVE_MEMPCPY
+             *((char *) mempcpy (mempcpy (newp, home_dir, home_len),
+                                 end_name, rest_len)) = '\0';
+#  else
+             memcpy (newp, home_dir, home_len);
+             memcpy (&newp[home_len], end_name, rest_len);
+             newp[home_len + rest_len] = '\0';
+#  endif
+             dirname = newp;
+           }
+         else
+           if (flags & GLOB_TILDE_CHECK)
+             /* We have to regard it as an error if we cannot find the
+                home directory.  */
+             return GLOB_NOMATCH;
+       }
+# endif        /* Not Amiga && not WINDOWS32 && not VMS.  */
+    }
+#endif /* Not VMS.  */
+
+  /* Now test whether we looked for "~" or "~NAME".  In this case we
+     can give the answer now.  */
+  if (filename == NULL)
+    {
+      struct stat st;
+
+      /* Return the directory if we don't check for error or if it exists.  */
+      if ((flags & GLOB_NOCHECK)
+         || (((flags & GLOB_ALTDIRFUNC)
+              ? (*pglob->gl_stat) (dirname, &st)
+              : __stat (dirname, &st)) == 0
+             && S_ISDIR (st.st_mode)))
+       {
+         pglob->gl_pathv
+           = (char **) realloc (pglob->gl_pathv,
+                                (pglob->gl_pathc +
+                                 ((flags & GLOB_DOOFFS) ?
+                                  pglob->gl_offs : 0) +
+                                 1 + 1) *
+                                sizeof (char *));
+         if (pglob->gl_pathv == NULL)
+           return GLOB_NOSPACE;
+
+         if (flags & GLOB_DOOFFS)
+           while (pglob->gl_pathc < pglob->gl_offs)
+             pglob->gl_pathv[pglob->gl_pathc++] = NULL;
+
+#if defined HAVE_STRDUP || defined _LIBC
+         pglob->gl_pathv[pglob->gl_pathc] = strdup (dirname);
+#else
+         {
+           size_t len = strlen (dirname) + 1;
+           char *dircopy = malloc (len);
+           if (dircopy != NULL)
+             pglob->gl_pathv[pglob->gl_pathc] = memcpy (dircopy, dirname,
+                                                        len);
+         }
+#endif
+         if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
+           {
+             free (pglob->gl_pathv);
+             return GLOB_NOSPACE;
+           }
+         pglob->gl_pathv[++pglob->gl_pathc] = NULL;
+         pglob->gl_flags = flags;
+
+         return 0;
+       }
+
+      /* Not found.  */
+      return GLOB_NOMATCH;
+    }
+
+  if (__glob_pattern_p (dirname, !(flags & GLOB_NOESCAPE)))
+    {
+      /* The directory name contains metacharacters, so we
+        have to glob for the directory, and then glob for
+        the pattern in each directory found.  */
+      glob_t dirs;
+      register size_t i;
+
+      status = glob (dirname,
+                    ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE))
+                     | GLOB_NOSORT | GLOB_ONLYDIR),
+                    errfunc, &dirs);
+      if (status != 0)
+       return status;
+
+      /* We have successfully globbed the preceding directory name.
+        For each name we found, call glob_in_dir on it and FILENAME,
+        appending the results to PGLOB.  */
+      for (i = 0; i < dirs.gl_pathc; ++i)
+       {
+         int old_pathc;
+
+#ifdef SHELL
+         {
+           /* Make globbing interruptible in the bash shell. */
+           extern int interrupt_state;
+
+           if (interrupt_state)
+             {
+               globfree (&dirs);
+               globfree (&files);
+               return GLOB_ABORTED;
+             }
+         }
+#endif /* SHELL.  */
+
+         old_pathc = pglob->gl_pathc;
+         status = glob_in_dir (filename, dirs.gl_pathv[i],
+                               ((flags | GLOB_APPEND)
+                                & ~(GLOB_NOCHECK | GLOB_ERR)),
+                               errfunc, pglob);
+         if (status == GLOB_NOMATCH)
+           /* No matches in this directory.  Try the next.  */
+           continue;
+
+         if (status != 0)
+           {
+             globfree (&dirs);
+             globfree (pglob);
+             return status;
+           }
+
+         /* Stick the directory on the front of each name.  */
+         if (prefix_array (dirs.gl_pathv[i],
+                           &pglob->gl_pathv[old_pathc],
+                           pglob->gl_pathc - old_pathc))
+           {
+             globfree (&dirs);
+             globfree (pglob);
+             return GLOB_NOSPACE;
+           }
+       }
+
+      flags |= GLOB_MAGCHAR;
+
+      /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls.
+        But if we have not found any matching entry and thie GLOB_NOCHECK
+        flag was set we must return the list consisting of the disrectory
+        names followed by the filename.  */
+      if (pglob->gl_pathc == oldcount)
+       {
+         /* No matches.  */
+         if (flags & GLOB_NOCHECK)
+           {
+             size_t filename_len = strlen (filename) + 1;
+             char **new_pathv;
+             struct stat st;
+
+             /* This is an pessimistic guess about the size.  */
+             pglob->gl_pathv
+               = (char **) realloc (pglob->gl_pathv,
+                                    (pglob->gl_pathc +
+                                     ((flags & GLOB_DOOFFS) ?
+                                      pglob->gl_offs : 0) +
+                                     dirs.gl_pathc + 1) *
+                                    sizeof (char *));
+             if (pglob->gl_pathv == NULL)
+               {
+                 globfree (&dirs);
+                 return GLOB_NOSPACE;
+               }
+
+             if (flags & GLOB_DOOFFS)
+               while (pglob->gl_pathc < pglob->gl_offs)
+                 pglob->gl_pathv[pglob->gl_pathc++] = NULL;
+
+             for (i = 0; i < dirs.gl_pathc; ++i)
+               {
+                 const char *dir = dirs.gl_pathv[i];
+                 size_t dir_len = strlen (dir);
+
+                 /* First check whether this really is a directory.  */
+                 if (((flags & GLOB_ALTDIRFUNC)
+                      ? (*pglob->gl_stat) (dir, &st) : __stat (dir, &st)) != 0
+                     || !S_ISDIR (st.st_mode))
+                   /* No directory, ignore this entry.  */
+                   continue;
+
+                 pglob->gl_pathv[pglob->gl_pathc] = malloc (dir_len + 1
+                                                            + filename_len);
+                 if (pglob->gl_pathv[pglob->gl_pathc] == NULL)
+                   {
+                     globfree (&dirs);
+                     globfree (pglob);
+                     return GLOB_NOSPACE;
+                   }
+
+#ifdef HAVE_MEMPCPY
+                 mempcpy (mempcpy (mempcpy (pglob->gl_pathv[pglob->gl_pathc],
+                                            dir, dir_len),
+                                   "/", 1),
+                          filename, filename_len);
+#else
+                 memcpy (pglob->gl_pathv[pglob->gl_pathc], dir, dir_len);
+                 pglob->gl_pathv[pglob->gl_pathc][dir_len] = '/';
+                 memcpy (&pglob->gl_pathv[pglob->gl_pathc][dir_len + 1],
+                         filename, filename_len);
+#endif
+                 ++pglob->gl_pathc;
+               }
+
+             pglob->gl_pathv[pglob->gl_pathc] = NULL;
+             pglob->gl_flags = flags;
+
+             /* Now we know how large the gl_pathv vector must be.  */
+             new_pathv = (char **) realloc (pglob->gl_pathv,
+                                            ((pglob->gl_pathc + 1)
+                                             * sizeof (char *)));
+             if (new_pathv != NULL)
+               pglob->gl_pathv = new_pathv;
+           }
+         else
+           return GLOB_NOMATCH;
+       }
+
+      globfree (&dirs);
+    }
+  else
+    {
+      status = glob_in_dir (filename, dirname, flags, errfunc, pglob);
+      if (status != 0)
+       return status;
+
+      if (dirlen > 0)
+       {
+         /* Stick the directory on the front of each name.  */
+         size_t ignore = oldcount;
+
+         if ((flags & GLOB_DOOFFS) && ignore < pglob->gl_offs)
+           ignore = pglob->gl_offs;
+
+         if (prefix_array (dirname,
+                           &pglob->gl_pathv[ignore],
+                           pglob->gl_pathc - ignore))
+           {
+             globfree (pglob);
+             return GLOB_NOSPACE;
+           }
+       }
+    }
+
+  if (flags & GLOB_MARK)
+    {
+      /* Append slashes to directory names.  */
+      size_t i;
+      struct stat st;
+      for (i = oldcount; i < pglob->gl_pathc; ++i)
+       if (((flags & GLOB_ALTDIRFUNC)
+            ? (*pglob->gl_stat) (pglob->gl_pathv[i], &st)
+            : __stat (pglob->gl_pathv[i], &st)) == 0
+           && S_ISDIR (st.st_mode))
+         {
+           size_t len = strlen (pglob->gl_pathv[i]) + 2;
+           char *new = realloc (pglob->gl_pathv[i], len);
+           if (new == NULL)
+             {
+               globfree (pglob);
+               return GLOB_NOSPACE;
+             }
+           strcpy (&new[len - 2], "/");
+           pglob->gl_pathv[i] = new;
+         }
+    }
+
+  if (!(flags & GLOB_NOSORT))
+    {
+      /* Sort the vector.  */
+      int non_sort = oldcount;
+
+      if ((flags & GLOB_DOOFFS) && pglob->gl_offs > oldcount)
+       non_sort = pglob->gl_offs;
+
+      qsort ((__ptr_t) &pglob->gl_pathv[non_sort],
+            pglob->gl_pathc - non_sort,
+            sizeof (char *), collated_compare);
+    }
+
+  return 0;
+}
+
+
+/* Free storage allocated in PGLOB by a previous `glob' call.  */
+void
+globfree (pglob)
+     register glob_t *pglob;
+{
+  if (pglob->gl_pathv != NULL)
+    {
+      register size_t i;
+      for (i = 0; i < pglob->gl_pathc; ++i)
+       if (pglob->gl_pathv[i] != NULL)
+         free ((__ptr_t) pglob->gl_pathv[i]);
+      free ((__ptr_t) pglob->gl_pathv);
+    }
+}
+
+
+/* Do a collated comparison of A and B.  */
+static int
+collated_compare (a, b)
+     const __ptr_t a;
+     const __ptr_t b;
+{
+  const char *const s1 = *(const char *const * const) a;
+  const char *const s2 = *(const char *const * const) b;
+
+  if (s1 == s2)
+    return 0;
+  if (s1 == NULL)
+    return 1;
+  if (s2 == NULL)
+    return -1;
+  return strcoll (s1, s2);
+}
+
+
+/* Prepend DIRNAME to each of N members of ARRAY, replacing ARRAY's
+   elements in place.  Return nonzero if out of memory, zero if successful.
+   A slash is inserted between DIRNAME and each elt of ARRAY,
+   unless DIRNAME is just "/".  Each old element of ARRAY is freed.  */
+static int
+prefix_array (dirname, array, n)
+     const char *dirname;
+     char **array;
+     size_t n;
+{
+  register size_t i;
+  size_t dirlen = strlen (dirname);
+#if defined __MSDOS__ || defined WINDOWS32
+  int sep_char = '/';
+# define DIRSEP_CHAR sep_char
+#else
+# define DIRSEP_CHAR '/'
+#endif
+
+  if (dirlen == 1 && dirname[0] == '/')
+    /* DIRNAME is just "/", so normal prepending would get us "//foo".
+       We want "/foo" instead, so don't prepend any chars from DIRNAME.  */
+    dirlen = 0;
+#if defined __MSDOS__ || defined WINDOWS32
+  else if (dirlen > 1)
+    {
+      if (dirname[dirlen - 1] == '/' && dirname[dirlen - 2] == ':')
+       /* DIRNAME is "d:/".  Don't prepend the slash from DIRNAME.  */
+       --dirlen;
+      else if (dirname[dirlen - 1] == ':')
+       {
+         /* DIRNAME is "d:".  Use `:' instead of `/'.  */
+         --dirlen;
+         sep_char = ':';
+       }
+    }
+#endif
+
+  for (i = 0; i < n; ++i)
+    {
+      size_t eltlen = strlen (array[i]) + 1;
+      char *new = (char *) malloc (dirlen + 1 + eltlen);
+      if (new == NULL)
+       {
+         while (i > 0)
+           free ((__ptr_t) array[--i]);
+         return 1;
+       }
+
+#ifdef HAVE_MEMPCPY
+      {
+       char *endp = (char *) mempcpy (new, dirname, dirlen);
+       *endp++ = DIRSEP_CHAR;
+       mempcpy (endp, array[i], eltlen);
+      }
+#else
+      memcpy (new, dirname, dirlen);
+      new[dirlen] = DIRSEP_CHAR;
+      memcpy (&new[dirlen + 1], array[i], eltlen);
+#endif
+      free ((__ptr_t) array[i]);
+      array[i] = new;
+    }
+
+  return 0;
+}
+
+
+/* We must not compile this function twice.  */
+#if !defined _LIBC || !defined NO_GLOB_PATTERN_P
+/* Return nonzero if PATTERN contains any metacharacters.
+   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
+int
+__glob_pattern_p (pattern, quote)
+     const char *pattern;
+     int quote;
+{
+  register const char *p;
+  int open = 0;
+
+  for (p = pattern; *p != '\0'; ++p)
+    switch (*p)
+      {
+      case '?':
+      case '*':
+       return 1;
+
+      case '\\':
+       if (quote && p[1] != '\0')
+         ++p;
+       break;
+
+      case '[':
+       open = 1;
+       break;
+
+      case ']':
+       if (open)
+         return 1;
+       break;
+      }
+
+  return 0;
+}
+# ifdef _LIBC
+weak_alias (__glob_pattern_p, glob_pattern_p)
+# endif
+#endif
+
+
+/* Like `glob', but PATTERN is a final pathname component,
+   and matches are searched for in DIRECTORY.
+   The GLOB_NOSORT bit in FLAGS is ignored.  No sorting is ever done.
+   The GLOB_APPEND flag is assumed to be set (always appends).  */
+static int
+glob_in_dir (pattern, directory, flags, errfunc, pglob)
+     const char *pattern;
+     const char *directory;
+     int flags;
+     int (*errfunc) __P ((const char *, int));
+     glob_t *pglob;
+{
+  __ptr_t stream = NULL;
+
+  struct globlink
+    {
+      struct globlink *next;
+      char *name;
+    };
+  struct globlink *names = NULL;
+  size_t nfound;
+  int meta;
+  int save;
+
+#ifdef VMS
+  if (*directory == 0)
+    directory = "[]";
+#endif
+  meta = __glob_pattern_p (pattern, !(flags & GLOB_NOESCAPE));
+  if (meta == 0)
+    {
+      if (flags & (GLOB_NOCHECK|GLOB_NOMAGIC))
+       /* We need not do any tests.  The PATTERN contains no meta
+          characters and we must not return an error therefore the
+          result will always contain exactly one name.  */
+       flags |= GLOB_NOCHECK;
+      else
+       {
+         /* Since we use the normal file functions we can also use stat()
+            to verify the file is there.  */
+         struct stat st;
+         size_t patlen = strlen (pattern);
+         size_t dirlen = strlen (directory);
+         char *fullname = (char *) __alloca (dirlen + 1 + patlen + 1);
+
+# ifdef HAVE_MEMPCPY
+         mempcpy (mempcpy (mempcpy (fullname, directory, dirlen),
+                           "/", 1),
+                  pattern, patlen + 1);
+# else
+         memcpy (fullname, directory, dirlen);
+         fullname[dirlen] = '/';
+         memcpy (&fullname[dirlen + 1], pattern, patlen + 1);
+# endif
+         if (((flags & GLOB_ALTDIRFUNC)
+              ? (*pglob->gl_stat) (fullname, &st)
+              : __stat (fullname, &st)) == 0)
+           /* We found this file to be existing.  Now tell the rest
+              of the function to copy this name into the result.  */
+           flags |= GLOB_NOCHECK;
+       }
+
+      nfound = 0;
+    }
+  else
+    {
+      if (pattern[0] == '\0')
+       {
+         /* This is a special case for matching directories like in
+            "*a/".  */
+         names = (struct globlink *) __alloca (sizeof (struct globlink));
+         names->name = (char *) malloc (1);
+         if (names->name == NULL)
+           goto memory_error;
+         names->name[0] = '\0';
+         names->next = NULL;
+         nfound = 1;
+         meta = 0;
+       }
+      else
+       {
+         stream = ((flags & GLOB_ALTDIRFUNC)
+                   ? (*pglob->gl_opendir) (directory)
+                   : (__ptr_t) opendir (directory));
+         if (stream == NULL)
+           {
+             if (errno != ENOTDIR
+                 && ((errfunc != NULL && (*errfunc) (directory, errno))
+                     || (flags & GLOB_ERR)))
+               return GLOB_ABORTED;
+             nfound = 0;
+             meta = 0;
+           }
+         else
+           {
+             int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0)
+                              | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)
+#if defined HAVE_CASE_INSENSITIVE_FS
+                                  | FNM_CASEFOLD
+#endif
+                                  );
+             nfound = 0;
+             flags |= GLOB_MAGCHAR;
+
+             while (1)
+               {
+                 const char *name;
+                 size_t len;
+                 struct dirent *d = ((flags & GLOB_ALTDIRFUNC)
+                                     ? (*pglob->gl_readdir) (stream)
+                                     : readdir ((DIR *) stream));
+                 if (d == NULL)
+                   break;
+                 if (! REAL_DIR_ENTRY (d))
+                   continue;
+
+#ifdef HAVE_D_TYPE
+                 /* If we shall match only directories use the information
+                    provided by the dirent call if possible.  */
+                 if ((flags & GLOB_ONLYDIR)
+                     && d->d_type != DT_UNKNOWN && d->d_type != DT_DIR && d->d_type != DT_LNK)
+                   continue;
+#endif
+
+                 name = d->d_name;
+
+                 if (fnmatch (pattern, name, fnm_flags) == 0)
+                   {
+                     struct globlink *new = (struct globlink *)
+                       __alloca (sizeof (struct globlink));
+                     len = NAMLEN (d);
+                     new->name = (char *) malloc (len + 1);
+                     if (new->name == NULL)
+                       goto memory_error;
+#ifdef HAVE_MEMPCPY
+                     *((char *) mempcpy ((__ptr_t) new->name, name, len))
+                       = '\0';
+#else
+                     memcpy ((__ptr_t) new->name, name, len);
+                     new->name[len] = '\0';
+#endif
+                     new->next = names;
+                     names = new;
+                     ++nfound;
+                   }
+               }
+           }
+       }
+    }
+
+  if (nfound == 0 && (flags & GLOB_NOCHECK))
+    {
+      size_t len = strlen (pattern);
+      nfound = 1;
+      names = (struct globlink *) __alloca (sizeof (struct globlink));
+      names->next = NULL;
+      names->name = (char *) malloc (len + 1);
+      if (names->name == NULL)
+       goto memory_error;
+#ifdef HAVE_MEMPCPY
+      *((char *) mempcpy (names->name, pattern, len)) = '\0';
+#else
+      memcpy (names->name, pattern, len);
+      names->name[len] = '\0';
+#endif
+    }
+
+  if (nfound != 0)
+    {
+      pglob->gl_pathv
+       = (char **) realloc (pglob->gl_pathv,
+                            (pglob->gl_pathc +
+                             ((flags & GLOB_DOOFFS) ? pglob->gl_offs : 0) +
+                             nfound + 1) *
+                            sizeof (char *));
+      if (pglob->gl_pathv == NULL)
+       goto memory_error;
+
+      if (flags & GLOB_DOOFFS)
+       while (pglob->gl_pathc < pglob->gl_offs)
+         pglob->gl_pathv[pglob->gl_pathc++] = NULL;
+
+      for (; names != NULL; names = names->next)
+       pglob->gl_pathv[pglob->gl_pathc++] = names->name;
+      pglob->gl_pathv[pglob->gl_pathc] = NULL;
+
+      pglob->gl_flags = flags;
+    }
+
+  save = errno;
+  if (stream != NULL)
+    {
+      if (flags & GLOB_ALTDIRFUNC)
+       (*pglob->gl_closedir) (stream);
+      else
+       closedir ((DIR *) stream);
+    }
+  __set_errno (save);
+
+  return nfound == 0 ? GLOB_NOMATCH : 0;
+
+ memory_error:
+  {
+    save = errno;
+    if (flags & GLOB_ALTDIRFUNC)
+      (*pglob->gl_closedir) (stream);
+    else
+      closedir ((DIR *) stream);
+    __set_errno (save);
+  }
+  while (names != NULL)
+    {
+      if (names->name != NULL)
+       free ((__ptr_t) names->name);
+      names = names->next;
+    }
+  return GLOB_NOSPACE;
+}
+
+#endif /* Not ELIDE_CODE.  */
diff --git a/lib/glob.in.h b/lib/glob.in.h
new file mode 100644 (file)
index 0000000..0992de3
--- /dev/null
@@ -0,0 +1,210 @@
+/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 1998 Free Software Foundation,
+Inc.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB.  If not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.  */
+
+#ifndef        _GLOB_H
+#define        _GLOB_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#undef __ptr_t
+#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
+# if !defined __GLIBC__
+#  undef __P
+#  undef __PMT
+#  define __P(protos)  protos
+#  define __PMT(protos)        protos
+#  if !defined __GNUC__ || __GNUC__ < 2
+#   undef __const
+#   define __const const
+#  endif
+# endif
+# define __ptr_t       void *
+#else /* Not C++ or ANSI C.  */
+# undef        __P
+# undef __PMT
+# define __P(protos)   ()
+# define __PMT(protos) ()
+# undef        __const
+# define __const
+# define __ptr_t       char *
+#endif /* C++ or ANSI C.  */
+
+/* We need `size_t' for the following definitions.  */
+#ifndef __size_t
+# if defined __FreeBSD__
+#  define __size_t size_t
+# else
+#  if defined __GNUC__ && __GNUC__ >= 2
+typedef __SIZE_TYPE__ __size_t;
+#  else
+/* This is a guess.  */
+/*hb
+ *     Conflicts with DECCs already defined type __size_t.
+ *     Defining an own type with a name beginning with '__' is no good.
+ *     Anyway if DECC is used and __SIZE_T is defined then __size_t is
+ *     already defined (and I hope it's exactly the one we need here).
+ */
+#   if !(defined __DECC && defined __SIZE_T)
+typedef unsigned long int __size_t;
+#   endif
+#  endif
+# endif
+#else
+/* The GNU CC stddef.h version defines __size_t as empty.  We need a real
+   definition.  */
+# undef __size_t
+# define __size_t size_t
+#endif
+
+/* Bits set in the FLAGS argument to `glob'.  */
+#define        GLOB_ERR        (1 << 0)/* Return on read errors.  */
+#define        GLOB_MARK       (1 << 1)/* Append a slash to each name.  */
+#define        GLOB_NOSORT     (1 << 2)/* Don't sort the names.  */
+#define        GLOB_DOOFFS     (1 << 3)/* Insert PGLOB->gl_offs NULLs.  */
+#define        GLOB_NOCHECK    (1 << 4)/* If nothing matches, return the pattern.  */
+#define        GLOB_APPEND     (1 << 5)/* Append to results of a previous call.  */
+#define        GLOB_NOESCAPE   (1 << 6)/* Backslashes don't quote metacharacters.  */
+#define        GLOB_PERIOD     (1 << 7)/* Leading `.' can be matched by metachars.  */
+
+#if (!defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _BSD_SOURCE \
+     || defined _GNU_SOURCE)
+# define GLOB_MAGCHAR   (1 << 8)/* Set in gl_flags if any metachars seen.  */
+# define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions.  */
+# define GLOB_BRACE     (1 << 10)/* Expand "{a,b}" to "a" "b".  */
+# define GLOB_NOMAGIC   (1 << 11)/* If no magic chars, return the pattern.  */
+# define GLOB_TILDE     (1 << 12)/* Expand ~user and ~ to home directories. */
+# define GLOB_ONLYDIR   (1 << 13)/* Match only directories.  */
+# define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error
+                                     if the user name is not available.  */
+# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
+                        GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE|     \
+                        GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK)
+#else
+# define __GLOB_FLAGS  (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \
+                        GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND|     \
+                        GLOB_PERIOD)
+#endif
+
+/* Error returns from `glob'.  */
+#define        GLOB_NOSPACE    1       /* Ran out of memory.  */
+#define        GLOB_ABORTED    2       /* Read error.  */
+#define        GLOB_NOMATCH    3       /* No matches found.  */
+#define GLOB_NOSYS     4       /* Not implemented.  */
+#ifdef _GNU_SOURCE
+/* Previous versions of this file defined GLOB_ABEND instead of
+   GLOB_ABORTED.  Provide a compatibility definition here.  */
+# define GLOB_ABEND GLOB_ABORTED
+#endif
+
+/* Structure describing a globbing run.  */
+#if !defined _AMIGA && !defined VMS /* Buggy compiler.   */
+struct stat;
+#endif
+typedef struct
+  {
+    __size_t gl_pathc;         /* Count of paths matched by the pattern.  */
+    char **gl_pathv;           /* List of matched pathnames.  */
+    __size_t gl_offs;          /* Slots to reserve in `gl_pathv'.  */
+    int gl_flags;              /* Set to FLAGS, maybe | GLOB_MAGCHAR.  */
+
+    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
+       are used instead of the normal file access functions.  */
+    void (*gl_closedir) __PMT ((void *));
+    struct dirent *(*gl_readdir) __PMT ((void *));
+    __ptr_t (*gl_opendir) __PMT ((__const char *));
+    int (*gl_lstat) __PMT ((__const char *, struct stat *));
+#if defined(VMS) && defined(__DECC) && !defined(_POSIX_C_SOURCE)
+    int (*gl_stat) __PMT ((__const char *, struct stat *, ...));
+#else
+    int (*gl_stat) __PMT ((__const char *, struct stat *));
+#endif
+  } glob_t;
+
+#ifdef _LARGEFILE64_SOURCE
+struct stat64;
+typedef struct
+  {
+    __size_t gl_pathc;
+    char **gl_pathv;
+    __size_t gl_offs;
+    int gl_flags;
+
+    /* If the GLOB_ALTDIRFUNC flag is set, the following functions
+       are used instead of the normal file access functions.  */
+    void (*gl_closedir) __PMT ((void *));
+    struct dirent64 *(*gl_readdir) __PMT ((void *));
+    __ptr_t (*gl_opendir) __PMT ((__const char *));
+    int (*gl_lstat) __PMT ((__const char *, struct stat64 *));
+    int (*gl_stat) __PMT ((__const char *, struct stat64 *));
+  } glob64_t;
+#endif
+
+#if _FILE_OFFSET_BITS == 64 && __GNUC__ < 2
+# define glob glob64
+# define globfree globfree64
+#else
+# ifdef _LARGEFILE64_SOURCE
+extern int glob64 __P ((__const char *__pattern, int __flags,
+                       int (*__errfunc) (__const char *, int),
+                       glob64_t *__pglob));
+
+extern void globfree64 __P ((glob64_t *__pglob));
+# endif
+#endif
+
+/* Do glob searching for PATTERN, placing results in PGLOB.
+   The bits defined above may be set in FLAGS.
+   If a directory cannot be opened or read and ERRFUNC is not nil,
+   it is called with the pathname that caused the error, and the
+   `errno' value from the failing call; if it returns non-zero
+   `glob' returns GLOB_ABEND; if it returns zero, the error is ignored.
+   If memory cannot be allocated for PGLOB, GLOB_NOSPACE is returned.
+   Otherwise, `glob' returns zero.  */
+#if _FILE_OFFSET_BITS != 64 || __GNUC__ < 2
+extern int glob __P ((__const char *__pattern, int __flags,
+                     int (*__errfunc) (__const char *, int),
+                     glob_t *__pglob));
+
+/* Free storage allocated in PGLOB by a previous `glob' call.  */
+extern void globfree __P ((glob_t *__pglob));
+#else
+extern int glob __P ((__const char *__pattern, int __flags,
+                     int (*__errfunc) (__const char *, int),
+                     glob_t *__pglob)) __asm__ ("glob64");
+
+extern void globfree __P ((glob_t *__pglob)) __asm__ ("globfree64");
+#endif
+
+
+#ifdef _GNU_SOURCE
+/* Return nonzero if PATTERN contains any metacharacters.
+   Metacharacters can be quoted with backslashes if QUOTE is nonzero.
+
+   This function is not part of the interface specified by POSIX.2
+   but several programs want to use it.  */
+extern int glob_pattern_p __P ((__const char *__pattern, int __quote));
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* glob.h  */
diff --git a/lib/intprops.h b/lib/intprops.h
new file mode 100644 (file)
index 0000000..dfbcaae
--- /dev/null
@@ -0,0 +1,584 @@
+/* intprops.h -- properties of integer types
+
+   Copyright (C) 2001-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert.  */
+
+#ifndef _GL_INTPROPS_H
+#define _GL_INTPROPS_H
+
+#include <limits.h>
+
+/* Return a value with the common real type of E and V and the value of V.
+   Do not evaluate E.  */
+#define _GL_INT_CONVERT(e, v) ((1 ? 0 : (e)) + (v))
+
+/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
+   <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00406.html>.  */
+#define _GL_INT_NEGATE_CONVERT(e, v) ((1 ? 0 : (e)) - (v))
+
+/* The extra casts in the following macros work around compiler bugs,
+   e.g., in Cray C 5.0.3.0.  */
+
+/* True if the arithmetic type T is an integer type.  bool counts as
+   an integer.  */
+#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if the real type T is signed.  */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* Return 1 if the real expression E, after promotion, has a
+   signed or floating type.  Do not evaluate E.  */
+#define EXPR_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
+
+
+/* Minimum and maximum values for integer types and expressions.  */
+
+/* The width in bits of the integer type or expression T.
+   Do not evaluate T.
+   Padding bits are not supported; this is checked at compile-time below.  */
+#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
+
+/* The maximum and minimum values for the integer type T.  */
+#define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
+#define TYPE_MAXIMUM(t)                                                 \
+  ((t) (! TYPE_SIGNED (t)                                               \
+        ? (t) -1                                                        \
+        : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
+
+/* The maximum and minimum values for the type of the expression E,
+   after integer promotion.  E is not evaluated.  */
+#define _GL_INT_MINIMUM(e)                                              \
+  (EXPR_SIGNED (e)                                                      \
+   ? ~ _GL_SIGNED_INT_MAXIMUM (e)                                       \
+   : _GL_INT_CONVERT (e, 0))
+#define _GL_INT_MAXIMUM(e)                                              \
+  (EXPR_SIGNED (e)                                                      \
+   ? _GL_SIGNED_INT_MAXIMUM (e)                                         \
+   : _GL_INT_NEGATE_CONVERT (e, 1))
+#define _GL_SIGNED_INT_MAXIMUM(e)                                       \
+  (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH ((e) + 0) - 2)) - 1) * 2 + 1)
+
+/* Work around OpenVMS incompatibility with C99.  */
+#if !defined LLONG_MAX && defined __INT64_MAX
+# define LLONG_MAX __INT64_MAX
+# define LLONG_MIN __INT64_MIN
+#endif
+
+/* This include file assumes that signed types are two's complement without
+   padding bits; the above macros have undefined behavior otherwise.
+   If this is a problem for you, please let us know how to fix it for your host.
+   This assumption is tested by the intprops-tests module.  */
+
+/* Does the __typeof__ keyword work?  This could be done by
+   'configure', but for now it's easier to do it by hand.  */
+#if (2 <= __GNUC__ \
+     || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \
+     || (0x5110 <= __SUNPRO_C && !__STDC__))
+# define _GL_HAVE___TYPEOF__ 1
+#else
+# define _GL_HAVE___TYPEOF__ 0
+#endif
+
+/* Return 1 if the integer type or expression T might be signed.  Return 0
+   if it is definitely unsigned.  This macro does not evaluate its argument,
+   and expands to an integer constant expression.  */
+#if _GL_HAVE___TYPEOF__
+# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
+#else
+# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
+#endif
+
+/* Bound on length of the string representing an unsigned integer
+   value representable in B bits.  log10 (2.0) < 146/485.  The
+   smallest value of B where this bound is not tight is 2621.  */
+#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
+
+/* Bound on length of the string representing an integer type or expression T.
+   Subtract 1 for the sign bit if T is signed, and then add 1 more for
+   a minus sign if needed.
+
+   Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 1 when its argument is
+   unsigned, this macro may overestimate the true bound by one byte when
+   applied to unsigned types of size 2, 4, 16, ... bytes.  */
+#define INT_STRLEN_BOUND(t)                                     \
+  (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - _GL_SIGNED_TYPE_OR_EXPR (t)) \
+   + _GL_SIGNED_TYPE_OR_EXPR (t))
+
+/* Bound on buffer size needed to represent an integer type or expression T,
+   including the terminating null.  */
+#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
+
+
+/* Range overflow checks.
+
+   The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
+   operators might not yield numerically correct answers due to
+   arithmetic overflow.  They do not rely on undefined or
+   implementation-defined behavior.  Their implementations are simple
+   and straightforward, but they are a bit harder to use than the
+   INT_<op>_OVERFLOW macros described below.
+
+   Example usage:
+
+     long int i = ...;
+     long int j = ...;
+     if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
+       printf ("multiply would overflow");
+     else
+       printf ("product is %ld", i * j);
+
+   Restrictions on *_RANGE_OVERFLOW macros:
+
+   These macros do not check for all possible numerical problems or
+   undefined or unspecified behavior: they do not check for division
+   by zero, for bad shift counts, or for shifting negative numbers.
+
+   These macros may evaluate their arguments zero or multiple times,
+   so the arguments should not have side effects.  The arithmetic
+   arguments (including the MIN and MAX arguments) must be of the same
+   integer type after the usual arithmetic conversions, and the type
+   must have minimum value MIN and maximum MAX.  Unsigned types should
+   use a zero MIN of the proper type.
+
+   These macros are tuned for constant MIN and MAX.  For commutative
+   operations such as A + B, they are also tuned for constant B.  */
+
+/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  */
+#define INT_ADD_RANGE_OVERFLOW(a, b, min, max)          \
+  ((b) < 0                                              \
+   ? (a) < (min) - (b)                                  \
+   : (max) - (b) < (a))
+
+/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  */
+#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max)     \
+  ((b) < 0                                              \
+   ? (max) + (b) < (a)                                  \
+   : (a) < (min) + (b))
+
+/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  */
+#define INT_NEGATE_RANGE_OVERFLOW(a, min, max)          \
+  ((min) < 0                                            \
+   ? (a) < - (max)                                      \
+   : 0 < (a))
+
+/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Avoid && and || as they tickle
+   bugs in Sun C 5.11 2010/08/13 and other compilers; see
+   <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00401.html>.  */
+#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max)     \
+  ((b) < 0                                              \
+   ? ((a) < 0                                           \
+      ? (a) < (max) / (b)                               \
+      : (b) == -1                                       \
+      ? 0                                               \
+      : (min) / (b) < (a))                              \
+   : (b) == 0                                           \
+   ? 0                                                  \
+   : ((a) < 0                                           \
+      ? (a) < (min) / (b)                               \
+      : (max) / (b) < (a)))
+
+/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Do not check for division by zero.  */
+#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max)       \
+  ((min) < 0 && (b) == -1 && (a) < - (max))
+
+/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Do not check for division by zero.
+   Mathematically, % should never overflow, but on x86-like hosts
+   INT_MIN % -1 traps, and the C standard permits this, so treat this
+   as an overflow too.  */
+#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max)    \
+  INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
+
+/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Here, MIN and MAX are for A only, and B need
+   not be of the same type as the other arguments.  The C standard says that
+   behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
+   A is negative then A << B has undefined behavior and A >> B has
+   implementation-defined behavior, but do not check these other
+   restrictions.  */
+#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max)   \
+  ((a) < 0                                              \
+   ? (a) < (min) >> (b)                                 \
+   : (max) >> (b) < (a))
+
+/* True if __builtin_add_overflow (A, B, P) and __builtin_sub_overflow
+   (A, B, P) work when P is non-null.  */
+#if 5 <= __GNUC__ && !defined __ICC
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW __has_builtin (__builtin_add_overflow)
+#else
+# define _GL_HAS_BUILTIN_ADD_OVERFLOW 0
+#endif
+
+/* True if __builtin_mul_overflow (A, B, P) works when P is non-null.  */
+#ifdef __clang__
+/* Work around Clang bug <https://bugs.llvm.org/show_bug.cgi?id=16404>.  */
+# define _GL_HAS_BUILTIN_MUL_OVERFLOW 0
+#else
+# define _GL_HAS_BUILTIN_MUL_OVERFLOW _GL_HAS_BUILTIN_ADD_OVERFLOW
+#endif
+
+/* True if __builtin_add_overflow_p (A, B, C) works, and similarly for
+   __builtin_mul_overflow_p and __builtin_mul_overflow_p.  */
+#define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
+
+/* The _GL*_OVERFLOW macros have the same restrictions as the
+   *_RANGE_OVERFLOW macros, except that they do not assume that operands
+   (e.g., A and B) have the same type as MIN and MAX.  Instead, they assume
+   that the result (e.g., A + B) has that type.  */
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define _GL_ADD_OVERFLOW(a, b, min, max)                               \
+   __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                          \
+   __builtin_sub_overflow_p (a, b, (__typeof__ ((a) - (b))) 0)
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                          \
+   __builtin_mul_overflow_p (a, b, (__typeof__ ((a) * (b))) 0)
+#else
+# define _GL_ADD_OVERFLOW(a, b, min, max)                                \
+   ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max)                  \
+    : (a) < 0 ? (b) <= (a) + (b)                                         \
+    : (b) < 0 ? (a) <= (a) + (b)                                         \
+    : (a) + (b) < (b))
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                           \
+   ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max)             \
+    : (a) < 0 ? 1                                                        \
+    : (b) < 0 ? (a) - (b) <= (a)                                         \
+    : (a) < (b))
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                           \
+   (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a))))       \
+    || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
+#endif
+#define _GL_DIVIDE_OVERFLOW(a, b, min, max)                             \
+  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
+   : (a) < 0 ? (b) <= (a) + (b) - 1                                     \
+   : (b) < 0 && (a) + (b) <= (a))
+#define _GL_REMAINDER_OVERFLOW(a, b, min, max)                          \
+  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
+   : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b)                     \
+   : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
+
+/* Return a nonzero value if A is a mathematical multiple of B, where
+   A is unsigned, B is negative, and MAX is the maximum value of A's
+   type.  A's type must be the same as (A % B)'s type.  Normally (A %
+   -B == 0) suffices, but things get tricky if -B would overflow.  */
+#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max)                            \
+  (((b) < -_GL_SIGNED_INT_MAXIMUM (b)                                   \
+    ? (_GL_SIGNED_INT_MAXIMUM (b) == (max)                              \
+       ? (a)                                                            \
+       : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1))   \
+    : (a) % - (b))                                                      \
+   == 0)
+
+/* Check for integer overflow, and report low order bits of answer.
+
+   The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
+   might not yield numerically correct answers due to arithmetic overflow.
+   The INT_<op>_WRAPV macros compute the low-order bits of the sum,
+   difference, and product of two C integers, and return 1 if these
+   low-order bits are not numerically correct.
+   These macros work correctly on all known practical hosts, and do not rely
+   on undefined behavior due to signed arithmetic overflow.
+
+   Example usage, assuming A and B are long int:
+
+     if (INT_MULTIPLY_OVERFLOW (a, b))
+       printf ("result would overflow\n");
+     else
+       printf ("result is %ld (no overflow)\n", a * b);
+
+   Example usage with WRAPV flavor:
+
+     long int result;
+     bool overflow = INT_MULTIPLY_WRAPV (a, b, &result);
+     printf ("result is %ld (%s)\n", result,
+             overflow ? "after overflow" : "no overflow");
+
+   Restrictions on these macros:
+
+   These macros do not check for all possible numerical problems or
+   undefined or unspecified behavior: they do not check for division
+   by zero, for bad shift counts, or for shifting negative numbers.
+
+   These macros may evaluate their arguments zero or multiple times, so the
+   arguments should not have side effects.
+
+   The WRAPV macros are not constant expressions.  They support only
+   +, binary -, and *.  Because the WRAPV macros convert the result,
+   they report overflow in different circumstances than the OVERFLOW
+   macros do.
+
+   These macros are tuned for their last input argument being a constant.
+
+   Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
+   A % B, and A << B would overflow, respectively.  */
+
+#define INT_ADD_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
+#define INT_SUBTRACT_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define INT_NEGATE_OVERFLOW(a) INT_SUBTRACT_OVERFLOW (0, a)
+#else
+# define INT_NEGATE_OVERFLOW(a) \
+   INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+#endif
+#define INT_MULTIPLY_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
+#define INT_DIVIDE_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
+#define INT_REMAINDER_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
+#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
+  INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
+                                 _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+
+/* Return 1 if the expression A <op> B would overflow,
+   where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
+   assuming MIN and MAX are the minimum and maximum for the result type.
+   Arguments should be free of side effects.  */
+#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow)        \
+  op_result_overflow (a, b,                                     \
+                      _GL_INT_MINIMUM (_GL_INT_CONVERT (a, b)), \
+                      _GL_INT_MAXIMUM (_GL_INT_CONVERT (a, b)))
+
+/* Store the low-order bits of A + B, A - B, A * B, respectively, into *R.
+   Return 1 if the result overflows.  See above for restrictions.  */
+#if _GL_HAS_BUILTIN_ADD_OVERFLOW
+# define INT_ADD_WRAPV(a, b, r) __builtin_add_overflow (a, b, r)
+# define INT_SUBTRACT_WRAPV(a, b, r) __builtin_sub_overflow (a, b, r)
+#else
+# define INT_ADD_WRAPV(a, b, r) \
+   _GL_INT_OP_WRAPV (a, b, r, +, _GL_INT_ADD_RANGE_OVERFLOW)
+# define INT_SUBTRACT_WRAPV(a, b, r) \
+   _GL_INT_OP_WRAPV (a, b, r, -, _GL_INT_SUBTRACT_RANGE_OVERFLOW)
+#endif
+#if _GL_HAS_BUILTIN_MUL_OVERFLOW
+# if (9 < __GNUC__ + (3 <= __GNUC_MINOR__) \
+      || (__GNUC__ == 8 && 4 <= __GNUC_MINOR__))
+#  define INT_MULTIPLY_WRAPV(a, b, r) __builtin_mul_overflow (a, b, r)
+# else
+   /* Work around GCC bug 91450.  */
+#  define INT_MULTIPLY_WRAPV(a, b, r) \
+    ((!_GL_SIGNED_TYPE_OR_EXPR (*(r)) && EXPR_SIGNED (a) && EXPR_SIGNED (b) \
+      && _GL_INT_MULTIPLY_RANGE_OVERFLOW (a, b, 0, (__typeof__ (*(r))) -1)) \
+     ? ((void) __builtin_mul_overflow (a, b, r), 1) \
+     : __builtin_mul_overflow (a, b, r))
+# endif
+#else
+# define INT_MULTIPLY_WRAPV(a, b, r) \
+   _GL_INT_OP_WRAPV (a, b, r, *, _GL_INT_MULTIPLY_RANGE_OVERFLOW)
+#endif
+
+/* Nonzero if this compiler has GCC bug 68193 or Clang bug 25390.  See:
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68193
+   https://llvm.org/bugs/show_bug.cgi?id=25390
+   For now, assume all versions of GCC-like compilers generate bogus
+   warnings for _Generic.  This matters only for compilers that
+   lack relevant builtins.  */
+#if __GNUC__
+# define _GL__GENERIC_BOGUS 1
+#else
+# define _GL__GENERIC_BOGUS 0
+#endif
+
+/* Store the low-order bits of A <op> B into *R, where OP specifies
+   the operation and OVERFLOW the overflow predicate.  Return 1 if the
+   result overflows.  See above for restrictions.  */
+#if 201112 <= __STDC_VERSION__ && !_GL__GENERIC_BOGUS
+# define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \
+   (_Generic \
+    (*(r), \
+     signed char: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        signed char, SCHAR_MIN, SCHAR_MAX), \
+     unsigned char: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        unsigned char, 0, UCHAR_MAX), \
+     short int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        short int, SHRT_MIN, SHRT_MAX), \
+     unsigned short int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        unsigned short int, 0, USHRT_MAX), \
+     int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        int, INT_MIN, INT_MAX), \
+     unsigned int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        unsigned int, 0, UINT_MAX), \
+     long int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                        long int, LONG_MIN, LONG_MAX), \
+     unsigned long int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                        unsigned long int, 0, ULONG_MAX), \
+     long long int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+                        long long int, LLONG_MIN, LLONG_MAX), \
+     unsigned long long int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+                        unsigned long long int, 0, ULLONG_MAX)))
+#else
+/* Store the low-order bits of A <op> B into *R, where OP specifies
+   the operation and OVERFLOW the overflow predicate.  If *R is
+   signed, its type is ST with bounds SMIN..SMAX; otherwise its type
+   is UT with bounds U..UMAX.  ST and UT are narrower than int.
+   Return 1 if the result overflows.  See above for restrictions.  */
+# if _GL_HAVE___TYPEOF__
+#  define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \
+    (TYPE_SIGNED (__typeof__ (*(r))) \
+     ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, st, smin, smax) \
+     : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, ut, 0, umax))
+# else
+#  define _GL_INT_OP_WRAPV_SMALLISH(a,b,r,op,overflow,st,smin,smax,ut,umax) \
+    (overflow (a, b, smin, smax) \
+     ? (overflow (a, b, 0, umax) \
+        ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 1) \
+        : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) < 0) \
+     : (overflow (a, b, 0, umax) \
+        ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st)) >= 0 \
+        : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a,b,op,unsigned,st), 0)))
+# endif
+
+# define _GL_INT_OP_WRAPV(a, b, r, op, overflow) \
+   (sizeof *(r) == sizeof (signed char) \
+    ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \
+                                 signed char, SCHAR_MIN, SCHAR_MAX, \
+                                 unsigned char, UCHAR_MAX) \
+    : sizeof *(r) == sizeof (short int) \
+    ? _GL_INT_OP_WRAPV_SMALLISH (a, b, r, op, overflow, \
+                                 short int, SHRT_MIN, SHRT_MAX, \
+                                 unsigned short int, USHRT_MAX) \
+    : sizeof *(r) == sizeof (int) \
+    ? (EXPR_SIGNED (*(r)) \
+       ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                          int, INT_MIN, INT_MAX) \
+       : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                          unsigned int, 0, UINT_MAX)) \
+    : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
+# ifdef LLONG_MAX
+#  define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
+    (sizeof *(r) == sizeof (long int) \
+     ? (EXPR_SIGNED (*(r)) \
+        ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                           long int, LONG_MIN, LONG_MAX) \
+        : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                           unsigned long int, 0, ULONG_MAX)) \
+     : (EXPR_SIGNED (*(r)) \
+        ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+                           long long int, LLONG_MIN, LLONG_MAX) \
+        : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+                           unsigned long long int, 0, ULLONG_MAX)))
+# else
+#  define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
+    (EXPR_SIGNED (*(r)) \
+     ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                        long int, LONG_MIN, LONG_MAX) \
+     : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                        unsigned long int, 0, ULONG_MAX))
+# endif
+#endif
+
+/* Store the low-order bits of A <op> B into *R, where the operation
+   is given by OP.  Use the unsigned type UT for calculation to avoid
+   overflow problems.  *R's type is T, with extrema TMIN and TMAX.
+   T must be a signed integer type.  Return 1 if the result overflows.  */
+#define _GL_INT_OP_CALC(a, b, r, op, overflow, ut, t, tmin, tmax) \
+  (overflow (a, b, tmin, tmax) \
+   ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 1) \
+   : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 0))
+
+/* Return the low-order bits of A <op> B, where the operation is given
+   by OP.  Use the unsigned type UT for calculation to avoid undefined
+   behavior on signed integer overflow, and convert the result to type T.
+   UT is at least as wide as T and is no narrower than unsigned int,
+   T is two's complement, and there is no padding or trap representations.
+   Assume that converting UT to T yields the low-order bits, as is
+   done in all known two's-complement C compilers.  E.g., see:
+   https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
+
+   According to the C standard, converting UT to T yields an
+   implementation-defined result or signal for values outside T's
+   range.  However, code that works around this theoretical problem
+   runs afoul of a compiler bug in Oracle Studio 12.3 x86.  See:
+   https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html
+   As the compiler bug is real, don't try to work around the
+   theoretical problem.  */
+
+#define _GL_INT_OP_WRAPV_VIA_UNSIGNED(a, b, op, ut, t) \
+  ((t) ((ut) (a) op (ut) (b)))
+
+/* Return true if the numeric values A + B, A - B, A * B fall outside
+   the range TMIN..TMAX.  Arguments should be integer expressions
+   without side effects.  TMIN should be signed and nonpositive.
+   TMAX should be positive, and should be signed unless TMIN is zero.  */
+#define _GL_INT_ADD_RANGE_OVERFLOW(a, b, tmin, tmax) \
+  ((b) < 0 \
+   ? (((tmin) \
+       ? ((EXPR_SIGNED (_GL_INT_CONVERT (a, (tmin) - (b))) || (b) < (tmin)) \
+          && (a) < (tmin) - (b)) \
+       : (a) <= -1 - (b)) \
+      || ((EXPR_SIGNED (a) ? 0 <= (a) : (tmax) < (a)) && (tmax) < (a) + (b))) \
+   : (a) < 0 \
+   ? (((tmin) \
+       ? ((EXPR_SIGNED (_GL_INT_CONVERT (b, (tmin) - (a))) || (a) < (tmin)) \
+          && (b) < (tmin) - (a)) \
+       : (b) <= -1 - (a)) \
+      || ((EXPR_SIGNED (_GL_INT_CONVERT (a, b)) || (tmax) < (b)) \
+          && (tmax) < (a) + (b))) \
+   : (tmax) < (b) || (tmax) - (b) < (a))
+#define _GL_INT_SUBTRACT_RANGE_OVERFLOW(a, b, tmin, tmax) \
+  (((a) < 0) == ((b) < 0) \
+   ? ((a) < (b) \
+      ? !(tmin) || -1 - (tmin) < (b) - (a) - 1 \
+      : (tmax) < (a) - (b)) \
+   : (a) < 0 \
+   ? ((!EXPR_SIGNED (_GL_INT_CONVERT ((a) - (tmin), b)) && (a) - (tmin) < 0) \
+      || (a) - (tmin) < (b)) \
+   : ((! (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
+          && EXPR_SIGNED (_GL_INT_CONVERT ((tmax) + (b), a))) \
+       && (tmax) <= -1 - (b)) \
+      || (tmax) + (b) < (a)))
+#define _GL_INT_MULTIPLY_RANGE_OVERFLOW(a, b, tmin, tmax) \
+  ((b) < 0 \
+   ? ((a) < 0 \
+      ? (EXPR_SIGNED (_GL_INT_CONVERT (tmax, b)) \
+         ? (a) < (tmax) / (b) \
+         : ((INT_NEGATE_OVERFLOW (b) \
+             ? _GL_INT_CONVERT (b, tmax) >> (TYPE_WIDTH (b) - 1) \
+             : (tmax) / -(b)) \
+            <= -1 - (a))) \
+      : INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (b, tmin)) && (b) == -1 \
+      ? (EXPR_SIGNED (a) \
+         ? 0 < (a) + (tmin) \
+         : 0 < (a) && -1 - (tmin) < (a) - 1) \
+      : (tmin) / (b) < (a)) \
+   : (b) == 0 \
+   ? 0 \
+   : ((a) < 0 \
+      ? (INT_NEGATE_OVERFLOW (_GL_INT_CONVERT (a, tmin)) && (a) == -1 \
+         ? (EXPR_SIGNED (b) ? 0 < (b) + (tmin) : -1 - (tmin) < (b) - 1) \
+         : (tmin) / (a) < (b)) \
+      : (tmax) / (b) < (a)))
+
+#endif /* _GL_INTPROPS_H */
diff --git a/lib/limits.in.h b/lib/limits.in.h
new file mode 100644 (file)
index 0000000..90c273f
--- /dev/null
@@ -0,0 +1,104 @@
+/* A GNU-like <limits.h>.
+
+   Copyright 2016-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License
+   as published by the Free Software Foundation; either version 3, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_LIMITS_H@
+
+#ifndef _@GUARD_PREFIX@_LIMITS_H
+#define _@GUARD_PREFIX@_LIMITS_H
+
+#ifndef LLONG_MIN
+# if defined LONG_LONG_MIN /* HP-UX 11.31 */
+#  define LLONG_MIN LONG_LONG_MIN
+# elif defined LONGLONG_MIN /* IRIX 6.5 */
+#  define LLONG_MIN LONGLONG_MIN
+# elif defined __GNUC__
+#  define LLONG_MIN (- __LONG_LONG_MAX__ - 1LL)
+# endif
+#endif
+#ifndef LLONG_MAX
+# if defined LONG_LONG_MAX /* HP-UX 11.31 */
+#  define LLONG_MAX LONG_LONG_MAX
+# elif defined LONGLONG_MAX /* IRIX 6.5 */
+#  define LLONG_MAX LONGLONG_MAX
+# elif defined __GNUC__
+#  define LLONG_MAX __LONG_LONG_MAX__
+# endif
+#endif
+#ifndef ULLONG_MAX
+# if defined ULONG_LONG_MAX /* HP-UX 11.31 */
+#  define ULLONG_MAX ULONG_LONG_MAX
+# elif defined ULONGLONG_MAX /* IRIX 6.5 */
+#  define ULLONG_MAX ULONGLONG_MAX
+# elif defined __GNUC__
+#  define ULLONG_MAX (__LONG_LONG_MAX__ * 2ULL + 1ULL)
+# endif
+#endif
+
+/* The number of usable bits in an unsigned or signed integer type
+   with minimum value MIN and maximum value MAX, as an int expression
+   suitable in #if.  Cover all known practical hosts.  This
+   implementation exploits the fact that MAX is 1 less than a power of
+   2, and merely counts the number of 1 bits in MAX; "COBn" means
+   "count the number of 1 bits in the low-order n bits").  */
+#define _GL_INTEGER_WIDTH(min, max) (((min) < 0) + _GL_COB128 (max))
+#define _GL_COB128(n) (_GL_COB64 ((n) >> 31 >> 31 >> 2) + _GL_COB64 (n))
+#define _GL_COB64(n) (_GL_COB32 ((n) >> 31 >> 1) + _GL_COB32 (n))
+#define _GL_COB32(n) (_GL_COB16 ((n) >> 16) + _GL_COB16 (n))
+#define _GL_COB16(n) (_GL_COB8 ((n) >> 8) + _GL_COB8 (n))
+#define _GL_COB8(n) (_GL_COB4 ((n) >> 4) + _GL_COB4 (n))
+#define _GL_COB4(n) (!!((n) & 8) + !!((n) & 4) + !!((n) & 2) + !!((n) & 1))
+
+#ifndef WORD_BIT
+/* Assume 'int' is 32 bits wide.  */
+# define WORD_BIT 32
+#endif
+#ifndef LONG_BIT
+/* Assume 'long' is 32 or 64 bits wide.  */
+# if LONG_MAX == INT_MAX
+#  define LONG_BIT 32
+# else
+#  define LONG_BIT 64
+# endif
+#endif
+
+/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+
+#if (! defined ULLONG_WIDTH                                             \
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# define CHAR_WIDTH _GL_INTEGER_WIDTH (CHAR_MIN, CHAR_MAX)
+# define SCHAR_WIDTH _GL_INTEGER_WIDTH (SCHAR_MIN, SCHAR_MAX)
+# define UCHAR_WIDTH _GL_INTEGER_WIDTH (0, UCHAR_MAX)
+# define SHRT_WIDTH _GL_INTEGER_WIDTH (SHRT_MIN, SHRT_MAX)
+# define USHRT_WIDTH _GL_INTEGER_WIDTH (0, USHRT_MAX)
+# define INT_WIDTH _GL_INTEGER_WIDTH (INT_MIN, INT_MAX)
+# define UINT_WIDTH _GL_INTEGER_WIDTH (0, UINT_MAX)
+# define LONG_WIDTH _GL_INTEGER_WIDTH (LONG_MIN, LONG_MAX)
+# define ULONG_WIDTH _GL_INTEGER_WIDTH (0, ULONG_MAX)
+# define LLONG_WIDTH _GL_INTEGER_WIDTH (LLONG_MIN, LLONG_MAX)
+# define ULLONG_WIDTH _GL_INTEGER_WIDTH (0, ULLONG_MAX)
+#endif /* !ULLONG_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
+#endif /* _@GUARD_PREFIX@_LIMITS_H */
diff --git a/lib/malloc.c b/lib/malloc.c
new file mode 100644 (file)
index 0000000..7232f1e
--- /dev/null
@@ -0,0 +1,56 @@
+/* malloc() function that is glibc compatible.
+
+   Copyright (C) 1997-1998, 2006-2007, 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+/* written by Jim Meyering and Bruno Haible */
+
+#define _GL_USE_STDLIB_ALLOC 1
+#include <config.h>
+/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h.  */
+#ifdef malloc
+# define NEED_MALLOC_GNU 1
+# undef malloc
+/* Whereas the gnulib module 'malloc-gnu' defines HAVE_MALLOC_GNU.  */
+#elif GNULIB_MALLOC_GNU && !HAVE_MALLOC_GNU
+# define NEED_MALLOC_GNU 1
+#endif
+
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* Allocate an N-byte block of memory from the heap.
+   If N is zero, allocate a 1-byte block.  */
+
+void *
+rpl_malloc (size_t n)
+{
+  void *result;
+
+#if NEED_MALLOC_GNU
+  if (n == 0)
+    n = 1;
+#endif
+
+  result = malloc (n);
+
+#if !HAVE_MALLOC_POSIX
+  if (result == NULL)
+    errno = ENOMEM;
+#endif
+
+  return result;
+}
diff --git a/lib/msvc-inval.c b/lib/msvc-inval.c
new file mode 100644 (file)
index 0000000..8636688
--- /dev/null
@@ -0,0 +1,129 @@
+/* Invalid parameter handler for MSVC runtime libraries.
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "msvc-inval.h"
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
+    && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
+
+/* Get _invalid_parameter_handler type and _set_invalid_parameter_handler
+   declaration.  */
+# include <stdlib.h>
+
+# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
+
+static void __cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+                                   const wchar_t *function,
+                                   const wchar_t *file,
+                                   unsigned int line,
+                                   uintptr_t dummy)
+{
+}
+
+# else
+
+/* Get declarations of the native Windows API functions.  */
+#  define WIN32_LEAN_AND_MEAN
+#  include <windows.h>
+
+#  if defined _MSC_VER
+
+static void __cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+                                   const wchar_t *function,
+                                   const wchar_t *file,
+                                   unsigned int line,
+                                   uintptr_t dummy)
+{
+  RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
+}
+
+#  else
+
+/* An index to thread-local storage.  */
+static DWORD tls_index;
+static int tls_initialized /* = 0 */;
+
+/* Used as a fallback only.  */
+static struct gl_msvc_inval_per_thread not_per_thread;
+
+struct gl_msvc_inval_per_thread *
+gl_msvc_inval_current (void)
+{
+  if (!tls_initialized)
+    {
+      tls_index = TlsAlloc ();
+      tls_initialized = 1;
+    }
+  if (tls_index == TLS_OUT_OF_INDEXES)
+    /* TlsAlloc had failed.  */
+    return &not_per_thread;
+  else
+    {
+      struct gl_msvc_inval_per_thread *pointer =
+        (struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index);
+      if (pointer == NULL)
+        {
+          /* First call.  Allocate a new 'struct gl_msvc_inval_per_thread'.  */
+          pointer =
+            (struct gl_msvc_inval_per_thread *)
+            malloc (sizeof (struct gl_msvc_inval_per_thread));
+          if (pointer == NULL)
+            /* Could not allocate memory.  Use the global storage.  */
+            pointer = &not_per_thread;
+          TlsSetValue (tls_index, pointer);
+        }
+      return pointer;
+    }
+}
+
+static void __cdecl
+gl_msvc_invalid_parameter_handler (const wchar_t *expression,
+                                   const wchar_t *function,
+                                   const wchar_t *file,
+                                   unsigned int line,
+                                   uintptr_t dummy)
+{
+  struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current ();
+  if (current->restart_valid)
+    longjmp (current->restart, 1);
+  else
+    /* An invalid parameter notification from outside the gnulib code.
+       Give the caller a chance to intervene.  */
+    RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
+}
+
+#  endif
+
+# endif
+
+static int gl_msvc_inval_initialized /* = 0 */;
+
+void
+gl_msvc_inval_ensure_handler (void)
+{
+  if (gl_msvc_inval_initialized == 0)
+    {
+      _set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
+      gl_msvc_inval_initialized = 1;
+    }
+}
+
+#endif
diff --git a/lib/msvc-inval.h b/lib/msvc-inval.h
new file mode 100644 (file)
index 0000000..93ee785
--- /dev/null
@@ -0,0 +1,222 @@
+/* Invalid parameter handler for MSVC runtime libraries.
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _MSVC_INVAL_H
+#define _MSVC_INVAL_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+   functions like fprintf(), dup2(), or close() crash when the caller passes
+   an invalid argument.  But POSIX wants error codes (such as EINVAL or EBADF)
+   instead.
+   This file defines macros that turn such an invalid parameter notification
+   into a non-local exit.  An error code can then be produced at the target
+   of this exit.  You can thus write code like
+
+     TRY_MSVC_INVAL
+       {
+         <Code that can trigger an invalid parameter notification
+          but does not do 'return', 'break', 'continue', nor 'goto'.>
+       }
+     CATCH_MSVC_INVAL
+       {
+         <Code that handles an invalid parameter notification
+          but does not do 'return', 'break', 'continue', nor 'goto'.>
+       }
+     DONE_MSVC_INVAL;
+
+   This entire block expands to a single statement.
+
+   The handling of invalid parameters can be done in three ways:
+
+     * The default way, which is reasonable for programs (not libraries):
+       AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING])
+
+     * The way for libraries that make "hairy" calls (like close(-1), or
+       fclose(fp) where fileno(fp) is closed, or simply getdtablesize()):
+       AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING])
+
+     * The way for libraries that make no "hairy" calls:
+       AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING])
+ */
+
+#define DEFAULT_HANDLING       0
+#define HAIRY_LIBRARY_HANDLING 1
+#define SANE_LIBRARY_HANDLING  2
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
+    && !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
+/* A native Windows platform with the "invalid parameter handler" concept,
+   and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING.  */
+
+# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
+/* Default handling.  */
+
+#  ifdef __cplusplus
+extern "C" {
+#  endif
+
+/* Ensure that the invalid parameter handler in installed that just returns.
+   Because we assume no other part of the program installs a different
+   invalid parameter handler, this solution is multithread-safe.  */
+extern void gl_msvc_inval_ensure_handler (void);
+
+#  ifdef __cplusplus
+}
+#  endif
+
+#  define TRY_MSVC_INVAL \
+     do                                                                        \
+       {                                                                       \
+         gl_msvc_inval_ensure_handler ();                                      \
+         if (1)
+#  define CATCH_MSVC_INVAL \
+         else
+#  define DONE_MSVC_INVAL \
+       }                                                                       \
+     while (0)
+
+# else
+/* Handling for hairy libraries.  */
+
+#  include <excpt.h>
+
+/* Gnulib can define its own status codes, as described in the page
+   "Raising Software Exceptions" on microsoft.com
+   <https://docs.microsoft.com/en-us/cpp/cpp/raising-software-exceptions>.
+   Our status codes are composed of
+     - 0xE0000000, mandatory for all user-defined status codes,
+     - 0x474E550, a API identifier ("GNU"),
+     - 0, 1, 2, ..., used to distinguish different status codes from the
+       same API.  */
+#  define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0)
+
+#  if defined _MSC_VER
+/* A compiler that supports __try/__except, as described in the page
+   "try-except statement" on microsoft.com
+   <https://docs.microsoft.com/en-us/cpp/cpp/try-except-statement>.
+   With __try/__except, we can use the multithread-safe exception handling.  */
+
+#   ifdef __cplusplus
+extern "C" {
+#   endif
+
+/* Ensure that the invalid parameter handler in installed that raises a
+   software exception with code STATUS_GNULIB_INVALID_PARAMETER.
+   Because we assume no other part of the program installs a different
+   invalid parameter handler, this solution is multithread-safe.  */
+extern void gl_msvc_inval_ensure_handler (void);
+
+#   ifdef __cplusplus
+}
+#   endif
+
+#   define TRY_MSVC_INVAL \
+      do                                                                       \
+        {                                                                      \
+          gl_msvc_inval_ensure_handler ();                                     \
+          __try
+#   define CATCH_MSVC_INVAL \
+          __except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER     \
+                    ? EXCEPTION_EXECUTE_HANDLER                                \
+                    : EXCEPTION_CONTINUE_SEARCH)
+#   define DONE_MSVC_INVAL \
+        }                                                                      \
+      while (0)
+
+#  else
+/* Any compiler.
+   We can only use setjmp/longjmp.  */
+
+#   include <setjmp.h>
+
+#   ifdef __cplusplus
+extern "C" {
+#   endif
+
+struct gl_msvc_inval_per_thread
+{
+  /* The restart that will resume execution at the code between
+     CATCH_MSVC_INVAL and DONE_MSVC_INVAL.  It is enabled only between
+     TRY_MSVC_INVAL and CATCH_MSVC_INVAL.  */
+  jmp_buf restart;
+
+  /* Tells whether the contents of restart is valid.  */
+  int restart_valid;
+};
+
+/* Ensure that the invalid parameter handler in installed that passes
+   control to the gl_msvc_inval_restart if it is valid, or raises a
+   software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise.
+   Because we assume no other part of the program installs a different
+   invalid parameter handler, this solution is multithread-safe.  */
+extern void gl_msvc_inval_ensure_handler (void);
+
+/* Return a pointer to the per-thread data for the current thread.  */
+extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void);
+
+#   ifdef __cplusplus
+}
+#   endif
+
+#   define TRY_MSVC_INVAL \
+      do                                                                       \
+        {                                                                      \
+          struct gl_msvc_inval_per_thread *msvc_inval_current;                 \
+          gl_msvc_inval_ensure_handler ();                                     \
+          msvc_inval_current = gl_msvc_inval_current ();                       \
+          /* First, initialize gl_msvc_inval_restart.  */                      \
+          if (setjmp (msvc_inval_current->restart) == 0)                       \
+            {                                                                  \
+              /* Then, mark it as valid.  */                                   \
+              msvc_inval_current->restart_valid = 1;
+#   define CATCH_MSVC_INVAL \
+              /* Execution completed.                                          \
+                 Mark gl_msvc_inval_restart as invalid.  */                    \
+              msvc_inval_current->restart_valid = 0;                           \
+            }                                                                  \
+          else                                                                 \
+            {                                                                  \
+              /* Execution triggered an invalid parameter notification.        \
+                 Mark gl_msvc_inval_restart as invalid.  */                    \
+              msvc_inval_current->restart_valid = 0;
+#   define DONE_MSVC_INVAL \
+            }                                                                  \
+        }                                                                      \
+      while (0)
+
+#  endif
+
+# endif
+
+#else
+/* A platform that does not need to the invalid parameter handler,
+   or when SANE_LIBRARY_HANDLING is desired.  */
+
+/* The braces here avoid GCC warnings like
+   "warning: suggest explicit braces to avoid ambiguous 'else'".  */
+# define TRY_MSVC_INVAL \
+    do                                                                         \
+      {                                                                        \
+        if (1)
+# define CATCH_MSVC_INVAL \
+        else
+# define DONE_MSVC_INVAL \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#endif /* _MSVC_INVAL_H */
diff --git a/lib/msvc-nothrow.c b/lib/msvc-nothrow.c
new file mode 100644 (file)
index 0000000..bf93b88
--- /dev/null
@@ -0,0 +1,51 @@
+/* Wrappers that don't throw invalid parameter notifications
+   with MSVC runtime libraries.
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "msvc-nothrow.h"
+
+/* Get declarations of the native Windows API functions.  */
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+# include "msvc-inval.h"
+#endif
+
+#undef _get_osfhandle
+
+#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+intptr_t
+_gl_nothrow_get_osfhandle (int fd)
+{
+  intptr_t result;
+
+  TRY_MSVC_INVAL
+    {
+      result = _get_osfhandle (fd);
+    }
+  CATCH_MSVC_INVAL
+    {
+      result = (intptr_t) INVALID_HANDLE_VALUE;
+    }
+  DONE_MSVC_INVAL;
+
+  return result;
+}
+#endif
diff --git a/lib/msvc-nothrow.h b/lib/msvc-nothrow.h
new file mode 100644 (file)
index 0000000..fca5415
--- /dev/null
@@ -0,0 +1,43 @@
+/* Wrappers that don't throw invalid parameter notifications
+   with MSVC runtime libraries.
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _MSVC_NOTHROW_H
+#define _MSVC_NOTHROW_H
+
+/* With MSVC runtime libraries with the "invalid parameter handler" concept,
+   functions like fprintf(), dup2(), or close() crash when the caller passes
+   an invalid argument.  But POSIX wants error codes (such as EINVAL or EBADF)
+   instead.
+   This file defines wrappers that turn such an invalid parameter notification
+   into an error code.  */
+
+#if defined _WIN32 && ! defined __CYGWIN__
+
+/* Get original declaration of _get_osfhandle.  */
+# include <io.h>
+
+# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
+
+/* Override _get_osfhandle.  */
+extern intptr_t _gl_nothrow_get_osfhandle (int fd);
+#  define _get_osfhandle _gl_nothrow_get_osfhandle
+
+# endif
+
+#endif
+
+#endif /* _MSVC_NOTHROW_H */
diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h
new file mode 100644 (file)
index 0000000..baacf98
--- /dev/null
@@ -0,0 +1,132 @@
+/* Copyright (C) 2001-2003, 2006-2020 Free Software Foundation, Inc.
+   Written by Bruno Haible <haible@clisp.cons.org>, 2001.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_STDBOOL_H
+#define _GL_STDBOOL_H
+
+/* ISO C 99 <stdbool.h> for platforms that lack it.  */
+
+/* Usage suggestions:
+
+   Programs that use <stdbool.h> should be aware of some limitations
+   and standards compliance issues.
+
+   Standards compliance:
+
+       - <stdbool.h> must be #included before 'bool', 'false', 'true'
+         can be used.
+
+       - You cannot assume that sizeof (bool) == 1.
+
+       - Programs should not undefine the macros bool, true, and false,
+         as C99 lists that as an "obsolescent feature".
+
+   Limitations of this substitute, when used in a C89 environment:
+
+       - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+       - You cannot assume that _Bool is a typedef; it might be a macro.
+
+       - Bit-fields of type 'bool' are not supported.  Portable code
+         should use 'unsigned int foo : 1;' rather than 'bool foo : 1;'.
+
+       - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+         performed in such a way that every nonzero value gets converted
+         to 'true', and zero gets converted to 'false'.  This doesn't work
+         with this substitute.  With this substitute, only the values 0 and 1
+         give the expected result when converted to _Bool' or 'bool'.
+
+       - C99 allows the use of (_Bool)0.0 in constant expressions, but
+         this substitute cannot always provide this property.
+
+   Also, it is suggested that programs use 'bool' rather than '_Bool';
+   this isn't required, but 'bool' is more common.  */
+
+
+/* 7.16. Boolean type and values */
+
+/* BeOS <sys/socket.h> already #defines false 0, true 1.  We use the same
+   definitions below, but temporarily we have to #undef them.  */
+#if defined __BEOS__ && !defined __HAIKU__
+# include <OS.h> /* defines bool but not _Bool */
+# undef false
+# undef true
+#endif
+
+#ifdef __cplusplus
+# define _Bool bool
+# define bool bool
+#else
+# if defined __BEOS__ && !defined __HAIKU__
+  /* A compiler known to have 'bool'.  */
+  /* If the compiler already has both 'bool' and '_Bool', we can assume they
+     are the same types.  */
+#  if !@HAVE__BOOL@
+typedef bool _Bool;
+#  endif
+# else
+#  if !defined __GNUC__
+   /* If @HAVE__BOOL@:
+        Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
+        the built-in _Bool type is used.  See
+          https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+          https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+          https://lists.gnu.org/r/bug-coreutils/2005-10/msg00086.html
+        Similar bugs are likely with other compilers as well; this file
+        wouldn't be used if <stdbool.h> was working.
+        So we override the _Bool type.
+      If !@HAVE__BOOL@:
+        Need to define _Bool ourselves. As 'signed char' or as an enum type?
+        Use of a typedef, with SunPRO C, leads to a stupid
+          "warning: _Bool is a keyword in ISO C99".
+        Use of an enum type, with IRIX cc, leads to a stupid
+          "warning(1185): enumerated type mixed with another type".
+        Even the existence of an enum type, without a typedef,
+          "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
+        The only benefit of the enum, debuggability, is not important
+        with these compilers.  So use 'signed char' and no enum.  */
+#   define _Bool signed char
+#  else
+   /* With this compiler, trust the _Bool type if the compiler has it.  */
+#   if !@HAVE__BOOL@
+   /* For the sake of symbolic names in gdb, define true and false as
+      enum constants, not only as macros.
+      It is tempting to write
+         typedef enum { false = 0, true = 1 } _Bool;
+      so that gdb prints values of type 'bool' symbolically.  But then
+      values of type '_Bool' might promote to 'int' or 'unsigned int'
+      (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
+      (see ISO C 99 6.3.1.1.(2)).  So add a negative value to the
+      enum; this ensures that '_Bool' promotes to 'int'.  */
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+#   endif
+#  endif
+# endif
+# define bool _Bool
+#endif
+
+/* The other macros must be usable in preprocessor directives.  */
+#ifdef __cplusplus
+# define false false
+# define true true
+#else
+# define false 0
+# define true 1
+#endif
+
+#define __bool_true_false_are_defined 1
+
+#endif /* _GL_STDBOOL_H */
diff --git a/lib/stddef.in.h b/lib/stddef.in.h
new file mode 100644 (file)
index 0000000..2e50a1f
--- /dev/null
@@ -0,0 +1,121 @@
+/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
+
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Eric Blake.  */
+
+/*
+ * POSIX 2008 <stddef.h> for platforms that have issues.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stddef.h.html>
+ */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_wchar_t || defined __need_size_t  \
+  || defined __need_ptrdiff_t || defined __need_NULL \
+  || defined __need_wint_t
+/* Special invocation convention inside gcc header files.  In
+   particular, gcc provides a version of <stddef.h> that blindly
+   redefines NULL even when __need_wint_t was defined, even though
+   wint_t is not normally provided by <stddef.h>.  Hence, we must
+   remember if special invocation has ever been used to obtain wint_t,
+   in which case we need to clean up NULL yet again.  */
+
+# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
+#  ifdef __need_wint_t
+#   define _GL_STDDEF_WINT_T
+#  endif
+#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+# endif
+
+#else
+/* Normal invocation convention.  */
+
+# ifndef _@GUARD_PREFIX@_STDDEF_H
+
+/* The include_next requires a split double-inclusion guard.  */
+
+#  @INCLUDE_NEXT@ @NEXT_STDDEF_H@
+
+/* On NetBSD 5.0, the definition of NULL lacks proper parentheses.  */
+#  if (@REPLACE_NULL@ \
+       && (!defined _@GUARD_PREFIX@_STDDEF_H || defined _GL_STDDEF_WINT_T))
+#   undef NULL
+#   ifdef __cplusplus
+   /* ISO C++ says that the macro NULL must expand to an integer constant
+      expression, hence '((void *) 0)' is not allowed in C++.  */
+#    if __GNUG__ >= 3
+    /* GNU C++ has a __null macro that behaves like an integer ('int' or
+       'long') but has the same size as a pointer.  Use that, to avoid
+       warnings.  */
+#     define NULL __null
+#    else
+#     define NULL 0L
+#    endif
+#   else
+#    define NULL ((void *) 0)
+#   endif
+#  endif
+
+#  ifndef _@GUARD_PREFIX@_STDDEF_H
+#   define _@GUARD_PREFIX@_STDDEF_H
+
+/* Some platforms lack wchar_t.  */
+#if !@HAVE_WCHAR_T@
+# define wchar_t int
+#endif
+
+/* Some platforms lack max_align_t.  The check for _GCC_MAX_ALIGN_T is
+   a hack in case the configure-time test was done with g++ even though
+   we are currently compiling with gcc.
+   On MSVC, max_align_t is defined only in C++ mode, after <cstddef> was
+   included.  Its definition is good since it has an alignment of 8 (on x86
+   and x86_64).  */
+#if defined _MSC_VER && defined __cplusplus
+# include <cstddef>
+#else
+# if ! (@HAVE_MAX_ALIGN_T@ || defined _GCC_MAX_ALIGN_T)
+#  if !GNULIB_defined_max_align_t
+/* On the x86, the maximum storage alignment of double, long, etc. is 4,
+   but GCC's C11 ABI for x86 says that max_align_t has an alignment of 8,
+   and the C11 standard allows this.  Work around this problem by
+   using __alignof__ (which returns 8 for double) rather than _Alignof
+   (which returns 4), and align each union member accordingly.  */
+#   ifdef __GNUC__
+#    define _GL_STDDEF_ALIGNAS(type) \
+       __attribute__ ((__aligned__ (__alignof__ (type))))
+#   else
+#    define _GL_STDDEF_ALIGNAS(type) /* */
+#   endif
+typedef union
+{
+  char *__p _GL_STDDEF_ALIGNAS (char *);
+  double __d _GL_STDDEF_ALIGNAS (double);
+  long double __ld _GL_STDDEF_ALIGNAS (long double);
+  long int __i _GL_STDDEF_ALIGNAS (long int);
+} rpl_max_align_t;
+#   define max_align_t rpl_max_align_t
+#   define GNULIB_defined_max_align_t 1
+#  endif
+# endif
+#endif
+
+#  endif /* _@GUARD_PREFIX@_STDDEF_H */
+# endif /* _@GUARD_PREFIX@_STDDEF_H */
+#endif /* __need_XXX */
diff --git a/lib/stdint.in.h b/lib/stdint.in.h
new file mode 100644 (file)
index 0000000..994c0c7
--- /dev/null
@@ -0,0 +1,746 @@
+/* Copyright (C) 2001-2002, 2004-2020 Free Software Foundation, Inc.
+   Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
+   This file is part of gnulib.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+/*
+ * ISO C 99 <stdint.h> for platforms that lack it.
+ * <https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html>
+ */
+
+#ifndef _@GUARD_PREFIX@_STDINT_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+/* When including a system file that in turn includes <inttypes.h>,
+   use the system <inttypes.h>, not our substitute.  This avoids
+   problems with (for example) VMS, whose <sys/bitypes.h> includes
+   <inttypes.h>.  */
+#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* On Android (Bionic libc), <sys/types.h> includes this file before
+   having defined 'time_t'.  Therefore in this case avoid including
+   other system header files; just include the system's <stdint.h>.
+   Ideally we should test __BIONIC__ here, but it is only defined after
+   <sys/cdefs.h> has been included; hence test __ANDROID__ instead.  */
+#if defined __ANDROID__ && defined _GL_INCLUDING_SYS_TYPES_H
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#else
+
+/* Get those types that are already defined in other system include
+   files, so that we can "#define int8_t signed char" below without
+   worrying about a later system include file containing a "typedef
+   signed char int8_t;" that will get messed up by our macro.  Our
+   macros should all be consistent with the system versions, except
+   for the "fast" types and macros, which we recommend against using
+   in public interfaces due to compiler differences.  */
+
+#if @HAVE_STDINT_H@
+# if defined __sgi && ! defined __c99
+   /* Bypass IRIX's <stdint.h> if in C89 mode, since it merely annoys users
+      with "This header file is to be used only for c99 mode compilations"
+      diagnostics.  */
+#  define __STDINT_H__
+# endif
+
+  /* Some pre-C++11 <stdint.h> implementations need this.  */
+# ifdef __cplusplus
+#  ifndef __STDC_CONSTANT_MACROS
+#   define __STDC_CONSTANT_MACROS 1
+#  endif
+#  ifndef __STDC_LIMIT_MACROS
+#   define __STDC_LIMIT_MACROS 1
+#  endif
+# endif
+
+  /* Other systems may have an incomplete or buggy <stdint.h>.
+     Include it before <inttypes.h>, since any "#include <stdint.h>"
+     in <inttypes.h> would reinclude us, skipping our contents because
+     _@GUARD_PREFIX@_STDINT_H is defined.
+     The include_next requires a split double-inclusion guard.  */
+# @INCLUDE_NEXT@ @NEXT_STDINT_H@
+#endif
+
+#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
+#define _@GUARD_PREFIX@_STDINT_H
+
+/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
+   LONG_MIN, LONG_MAX, ULONG_MAX, _GL_INTEGER_WIDTH.  */
+#include <limits.h>
+
+/* Override WINT_MIN and WINT_MAX if gnulib's <wchar.h> or <wctype.h> overrides
+   wint_t.  */
+#if @GNULIB_OVERRIDES_WINT_T@
+# undef WINT_MIN
+# undef WINT_MAX
+# define WINT_MIN 0x0U
+# define WINT_MAX 0xffffffffU
+#endif
+
+#if ! @HAVE_C99_STDINT_H@
+
+/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
+   IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
+   AIX 5.2 <sys/types.h> isn't needed and causes troubles.
+   Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
+   relies on the system <stdint.h> definitions, so include
+   <sys/types.h> after @NEXT_STDINT_H@.  */
+# if @HAVE_SYS_TYPES_H@ && ! defined _AIX
+#  include <sys/types.h>
+# endif
+
+# if @HAVE_INTTYPES_H@
+  /* In OpenBSD 3.8, <inttypes.h> includes <machine/types.h>, which defines
+     int{8,16,32,64}_t, uint{8,16,32,64}_t and __BIT_TYPES_DEFINED__.
+     <inttypes.h> also defines intptr_t and uintptr_t.  */
+#  include <inttypes.h>
+# elif @HAVE_SYS_INTTYPES_H@
+  /* Solaris 7 <sys/inttypes.h> has the types except the *_fast*_t types, and
+     the macros except for *_FAST*_*, INTPTR_MIN, PTRDIFF_MIN, PTRDIFF_MAX.  */
+#  include <sys/inttypes.h>
+# endif
+
+# if @HAVE_SYS_BITYPES_H@ && ! defined __BIT_TYPES_DEFINED__
+  /* Linux libc4 >= 4.6.7 and libc5 have a <sys/bitypes.h> that defines
+     int{8,16,32,64}_t and __BIT_TYPES_DEFINED__.  In libc5 >= 5.2.2 it is
+     included by <sys/types.h>.  */
+#  include <sys/bitypes.h>
+# endif
+
+# undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
+
+/* Minimum and maximum values for an integer type under the usual assumption.
+   Return an unspecified value if BITS == 0, adding a check to pacify
+   picky compilers.  */
+
+/* These are separate macros, because if you try to merge these macros into
+   a single one, HP-UX cc rejects the resulting expression in constant
+   expressions.  */
+# define _STDINT_UNSIGNED_MIN(bits, zero) \
+    (zero)
+# define _STDINT_SIGNED_MIN(bits, zero) \
+    (~ _STDINT_MAX (1, bits, zero))
+
+# define _STDINT_MAX(signed, bits, zero) \
+    (((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
+
+#if !GNULIB_defined_stdint_types
+
+/* 7.18.1.1. Exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits.  */
+
+# undef int8_t
+# undef uint8_t
+typedef signed char gl_int8_t;
+typedef unsigned char gl_uint8_t;
+# define int8_t gl_int8_t
+# define uint8_t gl_uint8_t
+
+# undef int16_t
+# undef uint16_t
+typedef short int gl_int16_t;
+typedef unsigned short int gl_uint16_t;
+# define int16_t gl_int16_t
+# define uint16_t gl_uint16_t
+
+# undef int32_t
+# undef uint32_t
+typedef int gl_int32_t;
+typedef unsigned int gl_uint32_t;
+# define int32_t gl_int32_t
+# define uint32_t gl_uint32_t
+
+/* If the system defines INT64_MAX, assume int64_t works.  That way,
+   if the underlying platform defines int64_t to be a 64-bit long long
+   int, the code below won't mistakenly define it to be a 64-bit long
+   int, which would mess up C++ name mangling.  We must use #ifdef
+   rather than #if, to avoid an error with HP-UX 10.20 cc.  */
+
+# ifdef INT64_MAX
+#  define GL_INT64_T
+# else
+/* Do not undefine int64_t if gnulib is not being used with 64-bit
+   types, since otherwise it breaks platforms like Tandem/NSK.  */
+#  if LONG_MAX >> 31 >> 31 == 1
+#   undef int64_t
+typedef long int gl_int64_t;
+#   define int64_t gl_int64_t
+#   define GL_INT64_T
+#  elif defined _MSC_VER
+#   undef int64_t
+typedef __int64 gl_int64_t;
+#   define int64_t gl_int64_t
+#   define GL_INT64_T
+#  else
+#   undef int64_t
+typedef long long int gl_int64_t;
+#   define int64_t gl_int64_t
+#   define GL_INT64_T
+#  endif
+# endif
+
+# ifdef UINT64_MAX
+#  define GL_UINT64_T
+# else
+#  if ULONG_MAX >> 31 >> 31 >> 1 == 1
+#   undef uint64_t
+typedef unsigned long int gl_uint64_t;
+#   define uint64_t gl_uint64_t
+#   define GL_UINT64_T
+#  elif defined _MSC_VER
+#   undef uint64_t
+typedef unsigned __int64 gl_uint64_t;
+#   define uint64_t gl_uint64_t
+#   define GL_UINT64_T
+#  else
+#   undef uint64_t
+typedef unsigned long long int gl_uint64_t;
+#   define uint64_t gl_uint64_t
+#   define GL_UINT64_T
+#  endif
+# endif
+
+/* Avoid collision with Solaris 2.5.1 <pthread.h> etc.  */
+# define _UINT8_T
+# define _UINT32_T
+# define _UINT64_T
+
+
+/* 7.18.1.2. Minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+   are the same as the corresponding N_t types.  */
+
+# undef int_least8_t
+# undef uint_least8_t
+# undef int_least16_t
+# undef uint_least16_t
+# undef int_least32_t
+# undef uint_least32_t
+# undef int_least64_t
+# undef uint_least64_t
+# define int_least8_t int8_t
+# define uint_least8_t uint8_t
+# define int_least16_t int16_t
+# define uint_least16_t uint16_t
+# define int_least32_t int32_t
+# define uint_least32_t uint32_t
+# ifdef GL_INT64_T
+#  define int_least64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+#  define uint_least64_t uint64_t
+# endif
+
+/* 7.18.1.3. Fastest minimum-width integer types */
+
+/* Note: Other <stdint.h> substitutes may define these types differently.
+   It is not recommended to use these types in public header files. */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+   are taken from the same list of types.  The following code normally
+   uses types consistent with glibc, as that lessens the chance of
+   incompatibility with older GNU hosts.  */
+
+# undef int_fast8_t
+# undef uint_fast8_t
+# undef int_fast16_t
+# undef uint_fast16_t
+# undef int_fast32_t
+# undef uint_fast32_t
+# undef int_fast64_t
+# undef uint_fast64_t
+typedef signed char gl_int_fast8_t;
+typedef unsigned char gl_uint_fast8_t;
+
+# ifdef __sun
+/* Define types compatible with SunOS 5.10, so that code compiled under
+   earlier SunOS versions works with code compiled under SunOS 5.10.  */
+typedef int gl_int_fast32_t;
+typedef unsigned int gl_uint_fast32_t;
+# else
+typedef long int gl_int_fast32_t;
+typedef unsigned long int gl_uint_fast32_t;
+# endif
+typedef gl_int_fast32_t gl_int_fast16_t;
+typedef gl_uint_fast32_t gl_uint_fast16_t;
+
+# define int_fast8_t gl_int_fast8_t
+# define uint_fast8_t gl_uint_fast8_t
+# define int_fast16_t gl_int_fast16_t
+# define uint_fast16_t gl_uint_fast16_t
+# define int_fast32_t gl_int_fast32_t
+# define uint_fast32_t gl_uint_fast32_t
+# ifdef GL_INT64_T
+#  define int_fast64_t int64_t
+# endif
+# ifdef GL_UINT64_T
+#  define uint_fast64_t uint64_t
+# endif
+
+/* 7.18.1.4. Integer types capable of holding object pointers */
+
+/* kLIBC's <stdint.h> defines _INTPTR_T_DECLARED and needs its own
+   definitions of intptr_t and uintptr_t (which use int and unsigned)
+   to avoid clashes with declarations of system functions like sbrk.
+   Similarly, mingw 5.22 <crtdefs.h> defines _INTPTR_T_DEFINED and
+   _UINTPTR_T_DEFINED and needs its own definitions of intptr_t and
+   uintptr_t to avoid conflicting declarations of system functions like
+   _findclose in <io.h>.  */
+# if !((defined __KLIBC__ && defined _INTPTR_T_DECLARED) \
+       || (defined __MINGW32__ && defined _INTPTR_T_DEFINED && defined _UINTPTR_T_DEFINED))
+#  undef intptr_t
+#  undef uintptr_t
+#  ifdef _WIN64
+typedef long long int gl_intptr_t;
+typedef unsigned long long int gl_uintptr_t;
+#  else
+typedef long int gl_intptr_t;
+typedef unsigned long int gl_uintptr_t;
+#  endif
+#  define intptr_t gl_intptr_t
+#  define uintptr_t gl_uintptr_t
+# endif
+
+/* 7.18.1.5. Greatest-width integer types */
+
+/* Note: These types are compiler dependent. It may be unwise to use them in
+   public header files. */
+
+/* If the system defines INTMAX_MAX, assume that intmax_t works, and
+   similarly for UINTMAX_MAX and uintmax_t.  This avoids problems with
+   assuming one type where another is used by the system.  */
+
+# ifndef INTMAX_MAX
+#  undef INTMAX_C
+#  undef intmax_t
+#  if LONG_MAX >> 30 == 1
+typedef long long int gl_intmax_t;
+#   define intmax_t gl_intmax_t
+#  elif defined GL_INT64_T
+#   define intmax_t int64_t
+#  else
+typedef long int gl_intmax_t;
+#   define intmax_t gl_intmax_t
+#  endif
+# endif
+
+# ifndef UINTMAX_MAX
+#  undef UINTMAX_C
+#  undef uintmax_t
+#  if ULONG_MAX >> 31 == 1
+typedef unsigned long long int gl_uintmax_t;
+#   define uintmax_t gl_uintmax_t
+#  elif defined GL_UINT64_T
+#   define uintmax_t uint64_t
+#  else
+typedef unsigned long int gl_uintmax_t;
+#   define uintmax_t gl_uintmax_t
+#  endif
+# endif
+
+/* Verify that intmax_t and uintmax_t have the same size.  Too much code
+   breaks if this is not the case.  If this check fails, the reason is likely
+   to be found in the autoconf macros.  */
+typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
+                                ? 1 : -1];
+
+# define GNULIB_defined_stdint_types 1
+# endif /* !GNULIB_defined_stdint_types */
+
+/* 7.18.2. Limits of specified-width integer types */
+
+/* 7.18.2.1. Limits of exact-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits.  */
+
+# undef INT8_MIN
+# undef INT8_MAX
+# undef UINT8_MAX
+# define INT8_MIN  (~ INT8_MAX)
+# define INT8_MAX  127
+# define UINT8_MAX  255
+
+# undef INT16_MIN
+# undef INT16_MAX
+# undef UINT16_MAX
+# define INT16_MIN  (~ INT16_MAX)
+# define INT16_MAX  32767
+# define UINT16_MAX  65535
+
+# undef INT32_MIN
+# undef INT32_MAX
+# undef UINT32_MAX
+# define INT32_MIN  (~ INT32_MAX)
+# define INT32_MAX  2147483647
+# define UINT32_MAX  4294967295U
+
+# if defined GL_INT64_T && ! defined INT64_MAX
+/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
+   evaluates the latter incorrectly in preprocessor expressions.  */
+#  define INT64_MIN  (- INTMAX_C (1) << 63)
+#  define INT64_MAX  INTMAX_C (9223372036854775807)
+# endif
+
+# if defined GL_UINT64_T && ! defined UINT64_MAX
+#  define UINT64_MAX  UINTMAX_C (18446744073709551615)
+# endif
+
+/* 7.18.2.2. Limits of minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types
+   are the same as the corresponding N_t types.  */
+
+# undef INT_LEAST8_MIN
+# undef INT_LEAST8_MAX
+# undef UINT_LEAST8_MAX
+# define INT_LEAST8_MIN  INT8_MIN
+# define INT_LEAST8_MAX  INT8_MAX
+# define UINT_LEAST8_MAX  UINT8_MAX
+
+# undef INT_LEAST16_MIN
+# undef INT_LEAST16_MAX
+# undef UINT_LEAST16_MAX
+# define INT_LEAST16_MIN  INT16_MIN
+# define INT_LEAST16_MAX  INT16_MAX
+# define UINT_LEAST16_MAX  UINT16_MAX
+
+# undef INT_LEAST32_MIN
+# undef INT_LEAST32_MAX
+# undef UINT_LEAST32_MAX
+# define INT_LEAST32_MIN  INT32_MIN
+# define INT_LEAST32_MAX  INT32_MAX
+# define UINT_LEAST32_MAX  UINT32_MAX
+
+# undef INT_LEAST64_MIN
+# undef INT_LEAST64_MAX
+# ifdef GL_INT64_T
+#  define INT_LEAST64_MIN  INT64_MIN
+#  define INT_LEAST64_MAX  INT64_MAX
+# endif
+
+# undef UINT_LEAST64_MAX
+# ifdef GL_UINT64_T
+#  define UINT_LEAST64_MAX  UINT64_MAX
+# endif
+
+/* 7.18.2.3. Limits of fastest minimum-width integer types */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
+   are taken from the same list of types.  */
+
+# undef INT_FAST8_MIN
+# undef INT_FAST8_MAX
+# undef UINT_FAST8_MAX
+# define INT_FAST8_MIN  SCHAR_MIN
+# define INT_FAST8_MAX  SCHAR_MAX
+# define UINT_FAST8_MAX  UCHAR_MAX
+
+# undef INT_FAST16_MIN
+# undef INT_FAST16_MAX
+# undef UINT_FAST16_MAX
+# define INT_FAST16_MIN  INT_FAST32_MIN
+# define INT_FAST16_MAX  INT_FAST32_MAX
+# define UINT_FAST16_MAX  UINT_FAST32_MAX
+
+# undef INT_FAST32_MIN
+# undef INT_FAST32_MAX
+# undef UINT_FAST32_MAX
+# ifdef __sun
+#  define INT_FAST32_MIN  INT_MIN
+#  define INT_FAST32_MAX  INT_MAX
+#  define UINT_FAST32_MAX  UINT_MAX
+# else
+#  define INT_FAST32_MIN  LONG_MIN
+#  define INT_FAST32_MAX  LONG_MAX
+#  define UINT_FAST32_MAX  ULONG_MAX
+# endif
+
+# undef INT_FAST64_MIN
+# undef INT_FAST64_MAX
+# ifdef GL_INT64_T
+#  define INT_FAST64_MIN  INT64_MIN
+#  define INT_FAST64_MAX  INT64_MAX
+# endif
+
+# undef UINT_FAST64_MAX
+# ifdef GL_UINT64_T
+#  define UINT_FAST64_MAX  UINT64_MAX
+# endif
+
+/* 7.18.2.4. Limits of integer types capable of holding object pointers */
+
+# undef INTPTR_MIN
+# undef INTPTR_MAX
+# undef UINTPTR_MAX
+# ifdef _WIN64
+#  define INTPTR_MIN  LLONG_MIN
+#  define INTPTR_MAX  LLONG_MAX
+#  define UINTPTR_MAX  ULLONG_MAX
+# else
+#  define INTPTR_MIN  LONG_MIN
+#  define INTPTR_MAX  LONG_MAX
+#  define UINTPTR_MAX  ULONG_MAX
+# endif
+
+/* 7.18.2.5. Limits of greatest-width integer types */
+
+# ifndef INTMAX_MAX
+#  undef INTMAX_MIN
+#  ifdef INT64_MAX
+#   define INTMAX_MIN  INT64_MIN
+#   define INTMAX_MAX  INT64_MAX
+#  else
+#   define INTMAX_MIN  INT32_MIN
+#   define INTMAX_MAX  INT32_MAX
+#  endif
+# endif
+
+# ifndef UINTMAX_MAX
+#  ifdef UINT64_MAX
+#   define UINTMAX_MAX  UINT64_MAX
+#  else
+#   define UINTMAX_MAX  UINT32_MAX
+#  endif
+# endif
+
+/* 7.18.3. Limits of other integer types */
+
+/* ptrdiff_t limits */
+# undef PTRDIFF_MIN
+# undef PTRDIFF_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+#  ifdef _LP64
+#   define PTRDIFF_MIN  _STDINT_SIGNED_MIN (64, 0l)
+#   define PTRDIFF_MAX  _STDINT_MAX (1, 64, 0l)
+#  else
+#   define PTRDIFF_MIN  _STDINT_SIGNED_MIN (32, 0)
+#   define PTRDIFF_MAX  _STDINT_MAX (1, 32, 0)
+#  endif
+# else
+#  define PTRDIFF_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+#  define PTRDIFF_MAX  \
+    _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0@PTRDIFF_T_SUFFIX@)
+# endif
+
+/* sig_atomic_t limits */
+# undef SIG_ATOMIC_MIN
+# undef SIG_ATOMIC_MAX
+# if @HAVE_SIGNED_SIG_ATOMIC_T@
+#  define SIG_ATOMIC_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# else
+#  define SIG_ATOMIC_MIN  \
+    _STDINT_UNSIGNED_MIN (@BITSIZEOF_SIG_ATOMIC_T@, 0@SIG_ATOMIC_T_SUFFIX@)
+# endif
+# define SIG_ATOMIC_MAX  \
+   _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \
+                0@SIG_ATOMIC_T_SUFFIX@)
+
+
+/* size_t limit */
+# undef SIZE_MAX
+# if @APPLE_UNIVERSAL_BUILD@
+#  ifdef _LP64
+#   define SIZE_MAX  _STDINT_MAX (0, 64, 0ul)
+#  else
+#   define SIZE_MAX  _STDINT_MAX (0, 32, 0ul)
+#  endif
+# else
+#  define SIZE_MAX  _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0@SIZE_T_SUFFIX@)
+# endif
+
+/* wchar_t limits */
+/* Get WCHAR_MIN, WCHAR_MAX.
+   This include is not on the top, above, because on OSF/1 4.0 we have a
+   sequence of nested includes
+   <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
+   <stdint.h> and assumes its types are already defined.  */
+# if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+#  include <stddef.h>
+#  include <stdio.h>
+#  include <time.h>
+#  define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+#  include <wchar.h>
+#  undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
+# endif
+# undef WCHAR_MIN
+# undef WCHAR_MAX
+# if @HAVE_SIGNED_WCHAR_T@
+#  define WCHAR_MIN  \
+    _STDINT_SIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# else
+#  define WCHAR_MIN  \
+    _STDINT_UNSIGNED_MIN (@BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+# endif
+# define WCHAR_MAX  \
+   _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0@WCHAR_T_SUFFIX@)
+
+/* wint_t limits */
+/* If gnulib's <wchar.h> or <wctype.h> overrides wint_t, @WINT_T_SUFFIX@ is not
+   accurate, therefore use the definitions from above.  */
+# if !@GNULIB_OVERRIDES_WINT_T@
+#  undef WINT_MIN
+#  undef WINT_MAX
+#  if @HAVE_SIGNED_WINT_T@
+#   define WINT_MIN  \
+     _STDINT_SIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+#  else
+#   define WINT_MIN  \
+     _STDINT_UNSIGNED_MIN (@BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+#  endif
+#  define WINT_MAX  \
+    _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
+# endif
+
+/* 7.18.4. Macros for integer constants */
+
+/* 7.18.4.1. Macros for minimum-width integer constants */
+/* According to ISO C 99 Technical Corrigendum 1 */
+
+/* Here we assume a standard architecture where the hardware integer
+   types have 8, 16, 32, optionally 64 bits, and int is 32 bits.  */
+
+# undef INT8_C
+# undef UINT8_C
+# define INT8_C(x) x
+# define UINT8_C(x) x
+
+# undef INT16_C
+# undef UINT16_C
+# define INT16_C(x) x
+# define UINT16_C(x) x
+
+# undef INT32_C
+# undef UINT32_C
+# define INT32_C(x) x
+# define UINT32_C(x) x ## U
+
+# undef INT64_C
+# undef UINT64_C
+# if LONG_MAX >> 31 >> 31 == 1
+#  define INT64_C(x) x##L
+# elif defined _MSC_VER
+#  define INT64_C(x) x##i64
+# else
+#  define INT64_C(x) x##LL
+# endif
+# if ULONG_MAX >> 31 >> 31 >> 1 == 1
+#  define UINT64_C(x) x##UL
+# elif defined _MSC_VER
+#  define UINT64_C(x) x##ui64
+# else
+#  define UINT64_C(x) x##ULL
+# endif
+
+/* 7.18.4.2. Macros for greatest-width integer constants */
+
+# ifndef INTMAX_C
+#  if LONG_MAX >> 30 == 1
+#   define INTMAX_C(x)   x##LL
+#  elif defined GL_INT64_T
+#   define INTMAX_C(x)   INT64_C(x)
+#  else
+#   define INTMAX_C(x)   x##L
+#  endif
+# endif
+
+# ifndef UINTMAX_C
+#  if ULONG_MAX >> 31 == 1
+#   define UINTMAX_C(x)  x##ULL
+#  elif defined GL_UINT64_T
+#   define UINTMAX_C(x)  UINT64_C(x)
+#  else
+#   define UINTMAX_C(x)  x##UL
+#  endif
+# endif
+
+#endif /* !@HAVE_C99_STDINT_H@ */
+
+/* Macros specified by ISO/IEC TS 18661-1:2014.  */
+
+#if (!defined UINTMAX_WIDTH \
+     && (defined _GNU_SOURCE || defined __STDC_WANT_IEC_60559_BFP_EXT__))
+# ifdef INT8_MAX
+#  define INT8_WIDTH _GL_INTEGER_WIDTH (INT8_MIN, INT8_MAX)
+# endif
+# ifdef UINT8_MAX
+#  define UINT8_WIDTH _GL_INTEGER_WIDTH (0, UINT8_MAX)
+# endif
+# ifdef INT16_MAX
+#  define INT16_WIDTH _GL_INTEGER_WIDTH (INT16_MIN, INT16_MAX)
+# endif
+# ifdef UINT16_MAX
+#  define UINT16_WIDTH _GL_INTEGER_WIDTH (0, UINT16_MAX)
+# endif
+# ifdef INT32_MAX
+#  define INT32_WIDTH _GL_INTEGER_WIDTH (INT32_MIN, INT32_MAX)
+# endif
+# ifdef UINT32_MAX
+#  define UINT32_WIDTH _GL_INTEGER_WIDTH (0, UINT32_MAX)
+# endif
+# ifdef INT64_MAX
+#  define INT64_WIDTH _GL_INTEGER_WIDTH (INT64_MIN, INT64_MAX)
+# endif
+# ifdef UINT64_MAX
+#  define UINT64_WIDTH _GL_INTEGER_WIDTH (0, UINT64_MAX)
+# endif
+# define INT_LEAST8_WIDTH _GL_INTEGER_WIDTH (INT_LEAST8_MIN, INT_LEAST8_MAX)
+# define UINT_LEAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST8_MAX)
+# define INT_LEAST16_WIDTH _GL_INTEGER_WIDTH (INT_LEAST16_MIN, INT_LEAST16_MAX)
+# define UINT_LEAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST16_MAX)
+# define INT_LEAST32_WIDTH _GL_INTEGER_WIDTH (INT_LEAST32_MIN, INT_LEAST32_MAX)
+# define UINT_LEAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST32_MAX)
+# define INT_LEAST64_WIDTH _GL_INTEGER_WIDTH (INT_LEAST64_MIN, INT_LEAST64_MAX)
+# define UINT_LEAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_LEAST64_MAX)
+# define INT_FAST8_WIDTH _GL_INTEGER_WIDTH (INT_FAST8_MIN, INT_FAST8_MAX)
+# define UINT_FAST8_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST8_MAX)
+# define INT_FAST16_WIDTH _GL_INTEGER_WIDTH (INT_FAST16_MIN, INT_FAST16_MAX)
+# define UINT_FAST16_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST16_MAX)
+# define INT_FAST32_WIDTH _GL_INTEGER_WIDTH (INT_FAST32_MIN, INT_FAST32_MAX)
+# define UINT_FAST32_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST32_MAX)
+# define INT_FAST64_WIDTH _GL_INTEGER_WIDTH (INT_FAST64_MIN, INT_FAST64_MAX)
+# define UINT_FAST64_WIDTH _GL_INTEGER_WIDTH (0, UINT_FAST64_MAX)
+# define INTPTR_WIDTH _GL_INTEGER_WIDTH (INTPTR_MIN, INTPTR_MAX)
+# define UINTPTR_WIDTH _GL_INTEGER_WIDTH (0, UINTPTR_MAX)
+# define INTMAX_WIDTH _GL_INTEGER_WIDTH (INTMAX_MIN, INTMAX_MAX)
+# define UINTMAX_WIDTH _GL_INTEGER_WIDTH (0, UINTMAX_MAX)
+# define PTRDIFF_WIDTH _GL_INTEGER_WIDTH (PTRDIFF_MIN, PTRDIFF_MAX)
+# define SIZE_WIDTH _GL_INTEGER_WIDTH (0, SIZE_MAX)
+# define WCHAR_WIDTH _GL_INTEGER_WIDTH (WCHAR_MIN, WCHAR_MAX)
+# ifdef WINT_MAX
+#  define WINT_WIDTH _GL_INTEGER_WIDTH (WINT_MIN, WINT_MAX)
+# endif
+# ifdef SIG_ATOMIC_MAX
+#  define SIG_ATOMIC_WIDTH _GL_INTEGER_WIDTH (SIG_ATOMIC_MIN, SIG_ATOMIC_MAX)
+# endif
+#endif /* !WINT_WIDTH && (_GNU_SOURCE || __STDC_WANT_IEC_60559_BFP_EXT__) */
+
+#endif /* _@GUARD_PREFIX@_STDINT_H */
+#endif /* !(defined __ANDROID__ && ...) */
+#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
diff --git a/lib/stdio.in.h b/lib/stdio.in.h
new file mode 100644 (file)
index 0000000..ebcbfaf
--- /dev/null
@@ -0,0 +1,1444 @@
+/* A GNU-like <stdio.h>.
+
+   Copyright (C) 2004, 2007-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H
+/* Special invocation convention:
+   - Inside glibc header files.
+   - On OSF/1 5.1 we have a sequence of nested includes
+     <stdio.h> -> <getopt.h> -> <ctype.h> -> <sys/localedef.h> ->
+     <sys/lc_core.h> -> <nl_types.h> -> <mesg.h> -> <stdio.h>.
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+
+#define _GL_ALREADY_INCLUDING_STDIO_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_STDIO_H@
+
+#undef _GL_ALREADY_INCLUDING_STDIO_H
+
+#ifndef _@GUARD_PREFIX@_STDIO_H
+#define _@GUARD_PREFIX@_STDIO_H
+
+/* Get va_list.  Needed on many systems, including glibc 2.8.  */
+#include <stdarg.h>
+
+#include <stddef.h>
+
+/* Get off_t and ssize_t.  Needed on many systems, including glibc 2.8
+   and eglibc 2.11.2.
+   May also define off_t to a 64-bit type on native Windows.  */
+#include <sys/types.h>
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The __-protected variants of the attributes 'format' and 'printf' are
+   accepted by gcc versions 2.6.4 (effectively 2.7) and later.
+   We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
+   gnulib and libintl do '#define printf __printf__' when they override
+   the 'printf' function.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
+#else
+# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system printf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#if GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT_PRINTF (formatstring_parameter, first_argument)
+#else
+# define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF
+   indicates to GCC that the function takes a format string and arguments,
+   where the format string directives are the ones standardized by ISO C99
+   and POSIX.  */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
+#else
+# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
+   _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+#endif
+
+/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
+   except that it indicates to GCC that the supported format string directives
+   are the ones of the system scanf(), rather than the ones standardized by
+   ISO C99 and POSIX.  */
+#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
+  _GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
+
+/* Solaris 10 and NetBSD 7.0 declare renameat in <unistd.h>, not in <stdio.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && (defined __sun || defined __NetBSD__) \
+    && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* Android 4.3 declares renameat in <sys/stat.h>, not in <stdio.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
+    && ! defined __GLIBC__
+# include <sys/stat.h>
+#endif
+
+/* MSVC declares 'perror' in <stdlib.h>, not in <stdio.h>.  We must include
+   it before we  #define perror rpl_perror.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_PERROR@ || defined GNULIB_POSIXCHECK) \
+    && (defined _WIN32 && ! defined __CYGWIN__) \
+    && ! defined __GLIBC__
+# include <stdlib.h>
+#endif
+
+/* MSVC declares 'remove' in <io.h>, not in <stdio.h>.  We must include
+   it before we  #define remove rpl_remove.  */
+/* MSVC declares 'rename' in <io.h>, not in <stdio.h>.  We must include
+   it before we  #define rename rpl_rename.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_REMOVE@ || @GNULIB_RENAME@ || defined GNULIB_POSIXCHECK) \
+    && (defined _WIN32 && ! defined __CYGWIN__) \
+    && ! defined __GLIBC__
+# include <io.h>
+#endif
+
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+/* Macros for stringification.  */
+#define _GL_STDIO_STRINGIZE(token) #token
+#define _GL_STDIO_MACROEXPAND_AND_STRINGIZE(token) _GL_STDIO_STRINGIZE(token)
+
+/* When also using extern inline, suppress the use of static inline in
+   standard headers of problematic Apple configurations, as Libc at
+   least through Libc-825.26 (2013-04-09) mishandles it; see, e.g.,
+   <https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html>.
+   Perhaps Apple will fix this some day.  */
+#if (defined _GL_EXTERN_INLINE_IN_USE && defined __APPLE__ \
+     && defined __GNUC__ && defined __STDC__)
+# undef putc_unlocked
+#endif
+
+#if @GNULIB_DPRINTF@
+# if @REPLACE_DPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dprintf rpl_dprintf
+#  endif
+_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                                _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
+# else
+#  if !@HAVE_DPRINTF@
+_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                                _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (dprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef dprintf
+# if HAVE_RAW_DECL_DPRINTF
+_GL_WARN_ON_USE (dprintf, "dprintf is unportable - "
+                 "use gnulib module dprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_FCLOSE@
+/* Close STREAM and its underlying file descriptor.  */
+# if @REPLACE_FCLOSE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define fclose rpl_fclose
+#  endif
+_GL_FUNCDECL_RPL (fclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fclose, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fclose, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fclose);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fclose
+/* Assume fclose is always declared.  */
+_GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
+                 "use gnulib module fclose for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FDOPEN@
+# if @REPLACE_FDOPEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fdopen
+#   define fdopen rpl_fdopen
+#  endif
+_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
+                                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
+# endif
+_GL_CXXALIASWARN (fdopen);
+#elif defined GNULIB_POSIXCHECK
+# undef fdopen
+/* Assume fdopen is always declared.  */
+_GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
+                 "use gnulib module fdopen for portability");
+#endif
+
+#if @GNULIB_FFLUSH@
+/* Flush all pending data on STREAM according to POSIX rules.  Both
+   output and seekable input streams are supported.
+   Note! LOSS OF DATA can occur if fflush is applied on an input stream
+   that is _not_seekable_ or on an update stream that is _not_seekable_
+   and in which the most recent operation was input.  Seekability can
+   be tested with lseek(fileno(fp),0,SEEK_CUR).  */
+# if @REPLACE_FFLUSH@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define fflush rpl_fflush
+#  endif
+_GL_FUNCDECL_RPL (fflush, int, (FILE *gl_stream));
+_GL_CXXALIAS_RPL (fflush, int, (FILE *gl_stream));
+# else
+_GL_CXXALIAS_SYS (fflush, int, (FILE *gl_stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fflush);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fflush
+/* Assume fflush is always declared.  */
+_GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
+                 "use gnulib module fflush for portable POSIX compliance");
+#endif
+
+#if @GNULIB_FGETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fgetc
+#   define fgetc rpl_fgetc
+#  endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fgetc);
+# endif
+#endif
+
+#if @GNULIB_FGETS@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fgets
+#   define fgets rpl_fgets
+#  endif
+_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
+                                 _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fgets);
+# endif
+#endif
+
+#if @GNULIB_FOPEN@
+# if @REPLACE_FOPEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fopen
+#   define fopen rpl_fopen
+#  endif
+_GL_FUNCDECL_RPL (fopen, FILE *, (const char *filename, const char *mode)
+                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fopen, FILE *, (const char *filename, const char *mode));
+# else
+_GL_CXXALIAS_SYS (fopen, FILE *, (const char *filename, const char *mode));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fopen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef fopen
+/* Assume fopen is always declared.  */
+_GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
+                 "use gnulib module fopen for portability");
+#endif
+
+#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
+# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
+     || (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define fprintf rpl_fprintf
+#  endif
+#  define GNULIB_overrides_fprintf 1
+#  if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                                _GL_ARG_NONNULL ((1, 2)));
+#  else
+_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
+                                _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
+# else
+_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fprintf);
+# endif
+#endif
+#if !@GNULIB_FPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_fprintf
+#  undef fprintf
+# endif
+/* Assume fprintf is always declared.  */
+_GL_WARN_ON_USE (fprintf, "fprintf is not always POSIX compliant - "
+                 "use gnulib module fprintf-posix for portable "
+                 "POSIX compliance");
+#endif
+
+#if @GNULIB_FPURGE@
+/* Discard all pending buffered I/O data on STREAM.
+   STREAM must not be wide-character oriented.
+   When discarding pending output, the file position is set back to where it
+   was before the write calls.  When discarding pending input, the file
+   position is advanced to match the end of the previously read input.
+   Return 0 if successful.  Upon error, return -1 and set errno.  */
+# if @REPLACE_FPURGE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define fpurge rpl_fpurge
+#  endif
+_GL_FUNCDECL_RPL (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fpurge, int, (FILE *gl_stream));
+# else
+#  if !@HAVE_DECL_FPURGE@
+_GL_FUNCDECL_SYS (fpurge, int, (FILE *gl_stream) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (fpurge, int, (FILE *gl_stream));
+# endif
+_GL_CXXALIASWARN (fpurge);
+#elif defined GNULIB_POSIXCHECK
+# undef fpurge
+# if HAVE_RAW_DECL_FPURGE
+_GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
+                 "use gnulib module fpurge for portability");
+# endif
+#endif
+
+#if @GNULIB_FPUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fputc
+#   define fputc rpl_fputc
+#  endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fputc, int, (int c, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fputc);
+# endif
+#endif
+
+#if @GNULIB_FPUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fputs
+#   define fputs rpl_fputs
+#  endif
+_GL_FUNCDECL_RPL (fputs, int, (const char *string, FILE *stream)
+                              _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fputs, int, (const char *string, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fputs);
+# endif
+#endif
+
+#if @GNULIB_FREAD@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fread
+#   define fread rpl_fread
+#  endif
+_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
+                                 _GL_ARG_NONNULL ((4)));
+_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fread);
+# endif
+#endif
+
+#if @GNULIB_FREOPEN@
+# if @REPLACE_FREOPEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef freopen
+#   define freopen rpl_freopen
+#  endif
+_GL_FUNCDECL_RPL (freopen, FILE *,
+                  (const char *filename, const char *mode, FILE *stream)
+                  _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (freopen, FILE *,
+                  (const char *filename, const char *mode, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (freopen, FILE *,
+                  (const char *filename, const char *mode, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (freopen);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef freopen
+/* Assume freopen is always declared.  */
+_GL_WARN_ON_USE (freopen,
+                 "freopen on native Windows platforms is not POSIX compliant - "
+                 "use gnulib module freopen for portability");
+#endif
+
+#if @GNULIB_FSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fscanf
+#   define fscanf rpl_fscanf
+#  endif
+_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
+                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
+                               _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
+# else
+_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fscanf);
+# endif
+#endif
+
+
+/* Set up the following warnings, based on which modules are in use.
+   GNU Coding Standards discourage the use of fseek, since it imposes
+   an arbitrary limitation on some 32-bit hosts.  Remember that the
+   fseek module depends on the fseeko module, so we only have three
+   cases to consider:
+
+   1. The developer is not using either module.  Issue a warning under
+   GNULIB_POSIXCHECK for both functions, to remind them that both
+   functions have bugs on some systems.  _GL_NO_LARGE_FILES has no
+   impact on this warning.
+
+   2. The developer is using both modules.  They may be unaware of the
+   arbitrary limitations of fseek, so issue a warning under
+   GNULIB_POSIXCHECK.  On the other hand, they may be using both
+   modules intentionally, so the developer can define
+   _GL_NO_LARGE_FILES in the compilation units where the use of fseek
+   is safe, to silence the warning.
+
+   3. The developer is using the fseeko module, but not fseek.  Gnulib
+   guarantees that fseek will still work around platform bugs in that
+   case, but we presume that the developer is aware of the pitfalls of
+   fseek and was trying to avoid it, so issue a warning even when
+   GNULIB_POSIXCHECK is undefined.  Again, _GL_NO_LARGE_FILES can be
+   defined to silence the warning in particular compilation units.
+   In C++ compilations with GNULIB_NAMESPACE, in order to avoid that
+   fseek gets defined as a macro, it is recommended that the developer
+   uses the fseek module, even if he is not calling the fseek function.
+
+   Most gnulib clients that perform stream operations should fall into
+   category 3.  */
+
+#if @GNULIB_FSEEK@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+#  define _GL_FSEEK_WARN /* Category 2, above.  */
+#  undef fseek
+# endif
+# if @REPLACE_FSEEK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fseek
+#   define fseek rpl_fseek
+#  endif
+_GL_FUNCDECL_RPL (fseek, int, (FILE *fp, long offset, int whence)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseek, int, (FILE *fp, long offset, int whence));
+# else
+_GL_CXXALIAS_SYS (fseek, int, (FILE *fp, long offset, int whence));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fseek);
+# endif
+#endif
+
+#if @GNULIB_FSEEKO@
+# if !@GNULIB_FSEEK@ && !defined _GL_NO_LARGE_FILES
+#  define _GL_FSEEK_WARN /* Category 3, above.  */
+#  undef fseek
+# endif
+# if @REPLACE_FSEEKO@
+/* Provide an fseeko function that is aware of a preceding fflush(), and which
+   detects pipes.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fseeko
+#   define fseeko rpl_fseeko
+#  endif
+_GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
+# else
+#  if ! @HAVE_DECL_FSEEKO@
+_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
+                               _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (fseeko);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FSEEK_WARN /* Category 1, above.  */
+# undef fseek
+# undef fseeko
+# if HAVE_RAW_DECL_FSEEKO
+_GL_WARN_ON_USE (fseeko, "fseeko is unportable - "
+                 "use gnulib module fseeko for portability");
+# endif
+#endif
+
+#ifdef _GL_FSEEK_WARN
+# undef _GL_FSEEK_WARN
+/* Here, either fseek is undefined (but C89 guarantees that it is
+   declared), or it is defined as rpl_fseek (declared above).  */
+_GL_WARN_ON_USE (fseek, "fseek cannot handle files larger than 4 GB "
+                 "on 32-bit platforms - "
+                 "use fseeko function for handling of large files");
+#endif
+
+
+/* ftell, ftello.  See the comments on fseek/fseeko.  */
+
+#if @GNULIB_FTELL@
+# if defined GNULIB_POSIXCHECK && !defined _GL_NO_LARGE_FILES
+#  define _GL_FTELL_WARN /* Category 2, above.  */
+#  undef ftell
+# endif
+# if @REPLACE_FTELL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ftell
+#   define ftell rpl_ftell
+#  endif
+_GL_FUNCDECL_RPL (ftell, long, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftell, long, (FILE *fp));
+# else
+_GL_CXXALIAS_SYS (ftell, long, (FILE *fp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (ftell);
+# endif
+#endif
+
+#if @GNULIB_FTELLO@
+# if !@GNULIB_FTELL@ && !defined _GL_NO_LARGE_FILES
+#  define _GL_FTELL_WARN /* Category 3, above.  */
+#  undef ftell
+# endif
+# if @REPLACE_FTELLO@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ftello
+#   define ftello rpl_ftello
+#  endif
+_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
+# else
+#  if ! @HAVE_DECL_FTELLO@
+_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
+# endif
+_GL_CXXALIASWARN (ftello);
+#elif defined GNULIB_POSIXCHECK
+# define _GL_FTELL_WARN /* Category 1, above.  */
+# undef ftell
+# undef ftello
+# if HAVE_RAW_DECL_FTELLO
+_GL_WARN_ON_USE (ftello, "ftello is unportable - "
+                 "use gnulib module ftello for portability");
+# endif
+#endif
+
+#ifdef _GL_FTELL_WARN
+# undef _GL_FTELL_WARN
+/* Here, either ftell is undefined (but C89 guarantees that it is
+   declared), or it is defined as rpl_ftell (declared above).  */
+_GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
+                 "on 32-bit platforms - "
+                 "use ftello function for handling of large files");
+#endif
+
+
+#if @GNULIB_FWRITE@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fwrite
+#   define fwrite rpl_fwrite
+#  endif
+_GL_FUNCDECL_RPL (fwrite, size_t,
+                  (const void *ptr, size_t s, size_t n, FILE *stream)
+                  _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (fwrite, size_t,
+                  (const void *ptr, size_t s, size_t n, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (fwrite, size_t,
+                  (const void *ptr, size_t s, size_t n, FILE *stream));
+
+/* Work around bug 11959 when fortifying glibc 2.4 through 2.15
+   <https://sourceware.org/bugzilla/show_bug.cgi?id=11959>,
+   which sometimes causes an unwanted diagnostic for fwrite calls.
+   This affects only function declaration attributes under certain
+   versions of gcc and clang, and is not needed for C++.  */
+#  if (0 < __USE_FORTIFY_LEVEL                                          \
+       && __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \
+       && 3 < __GNUC__ + (4 <= __GNUC_MINOR__)                          \
+       && !defined __cplusplus)
+#   undef fwrite
+#   undef fwrite_unlocked
+extern size_t __REDIRECT (rpl_fwrite,
+                          (const void *__restrict, size_t, size_t,
+                           FILE *__restrict),
+                          fwrite);
+extern size_t __REDIRECT (rpl_fwrite_unlocked,
+                          (const void *__restrict, size_t, size_t,
+                           FILE *__restrict),
+                          fwrite_unlocked);
+#   define fwrite rpl_fwrite
+#   define fwrite_unlocked rpl_fwrite_unlocked
+#  endif
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (fwrite);
+# endif
+#endif
+
+#if @GNULIB_GETC@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getc
+#   define getc rpl_fgetc
+#  endif
+_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream));
+# else
+_GL_CXXALIAS_SYS (getc, int, (FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getc);
+# endif
+#endif
+
+#if @GNULIB_GETCHAR@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getchar
+#   define getchar rpl_getchar
+#  endif
+_GL_FUNCDECL_RPL (getchar, int, (void));
+_GL_CXXALIAS_RPL (getchar, int, (void));
+# else
+_GL_CXXALIAS_SYS (getchar, int, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (getchar);
+# endif
+#endif
+
+#if @GNULIB_GETDELIM@
+/* Read input, up to (and including) the next occurrence of DELIMITER, from
+   STREAM, store it in *LINEPTR (and NUL-terminate it).
+   *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+   bytes of space.  It is realloc'd as necessary.
+   Return the number of bytes read and stored at *LINEPTR (not including the
+   NUL terminator), or -1 on error or EOF.  */
+# if @REPLACE_GETDELIM@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getdelim
+#   define getdelim rpl_getdelim
+#  endif
+_GL_FUNCDECL_RPL (getdelim, ssize_t,
+                  (char **lineptr, size_t *linesize, int delimiter,
+                   FILE *stream)
+                  _GL_ARG_NONNULL ((1, 2, 4)));
+_GL_CXXALIAS_RPL (getdelim, ssize_t,
+                  (char **lineptr, size_t *linesize, int delimiter,
+                   FILE *stream));
+# else
+#  if !@HAVE_DECL_GETDELIM@
+_GL_FUNCDECL_SYS (getdelim, ssize_t,
+                  (char **lineptr, size_t *linesize, int delimiter,
+                   FILE *stream)
+                  _GL_ARG_NONNULL ((1, 2, 4)));
+#  endif
+_GL_CXXALIAS_SYS (getdelim, ssize_t,
+                  (char **lineptr, size_t *linesize, int delimiter,
+                   FILE *stream));
+# endif
+_GL_CXXALIASWARN (getdelim);
+#elif defined GNULIB_POSIXCHECK
+# undef getdelim
+# if HAVE_RAW_DECL_GETDELIM
+_GL_WARN_ON_USE (getdelim, "getdelim is unportable - "
+                 "use gnulib module getdelim for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLINE@
+/* Read a line, up to (and including) the next newline, from STREAM, store it
+   in *LINEPTR (and NUL-terminate it).
+   *LINEPTR is a pointer returned from malloc (or NULL), pointing to *LINESIZE
+   bytes of space.  It is realloc'd as necessary.
+   Return the number of bytes read and stored at *LINEPTR (not including the
+   NUL terminator), or -1 on error or EOF.  */
+# if @REPLACE_GETLINE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getline
+#   define getline rpl_getline
+#  endif
+_GL_FUNCDECL_RPL (getline, ssize_t,
+                  (char **lineptr, size_t *linesize, FILE *stream)
+                  _GL_ARG_NONNULL ((1, 2, 3)));
+_GL_CXXALIAS_RPL (getline, ssize_t,
+                  (char **lineptr, size_t *linesize, FILE *stream));
+# else
+#  if !@HAVE_DECL_GETLINE@
+_GL_FUNCDECL_SYS (getline, ssize_t,
+                  (char **lineptr, size_t *linesize, FILE *stream)
+                  _GL_ARG_NONNULL ((1, 2, 3)));
+#  endif
+_GL_CXXALIAS_SYS (getline, ssize_t,
+                  (char **lineptr, size_t *linesize, FILE *stream));
+# endif
+# if @HAVE_DECL_GETLINE@
+_GL_CXXALIASWARN (getline);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getline
+# if HAVE_RAW_DECL_GETLINE
+_GL_WARN_ON_USE (getline, "getline is unportable - "
+                 "use gnulib module getline for portability");
+# endif
+#endif
+
+/* It is very rare that the developer ever has full control of stdin,
+   so any use of gets warrants an unconditional warning; besides, C11
+   removed it.  */
+#undef gets
+#if HAVE_RAW_DECL_GETS && !defined __cplusplus
+_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
+#endif
+
+#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
+struct obstack;
+/* Grow an obstack with formatted output.  Return the number of
+   bytes added to OBS.  No trailing nul byte is added, and the
+   object should be closed with obstack_finish before use.  Upon
+   memory allocation error, call obstack_alloc_failed_handler.  Upon
+   other error, return -1.  */
+# if @REPLACE_OBSTACK_PRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define obstack_printf rpl_obstack_printf
+#  endif
+_GL_FUNCDECL_RPL (obstack_printf, int,
+                  (struct obstack *obs, const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_printf, int,
+                  (struct obstack *obs, const char *format, ...));
+# else
+#  if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_printf, int,
+                  (struct obstack *obs, const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (obstack_printf, int,
+                  (struct obstack *obs, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (obstack_printf);
+# if @REPLACE_OBSTACK_PRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define obstack_vprintf rpl_obstack_vprintf
+#  endif
+_GL_FUNCDECL_RPL (obstack_vprintf, int,
+                  (struct obstack *obs, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (obstack_vprintf, int,
+                  (struct obstack *obs, const char *format, va_list args));
+# else
+#  if !@HAVE_DECL_OBSTACK_PRINTF@
+_GL_FUNCDECL_SYS (obstack_vprintf, int,
+                  (struct obstack *obs, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (obstack_vprintf, int,
+                  (struct obstack *obs, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (obstack_vprintf);
+#endif
+
+#if @GNULIB_PCLOSE@
+# if !@HAVE_PCLOSE@
+_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pclose, int, (FILE *stream));
+_GL_CXXALIASWARN (pclose);
+#elif defined GNULIB_POSIXCHECK
+# undef pclose
+# if HAVE_RAW_DECL_PCLOSE
+_GL_WARN_ON_USE (pclose, "pclose is unportable - "
+                 "use gnulib module pclose for more portability");
+# endif
+#endif
+
+#if @GNULIB_PERROR@
+/* Print a message to standard error, describing the value of ERRNO,
+   (if STRING is not NULL and not empty) prefixed with STRING and ": ",
+   and terminated with a newline.  */
+# if @REPLACE_PERROR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define perror rpl_perror
+#  endif
+_GL_FUNCDECL_RPL (perror, void, (const char *string));
+_GL_CXXALIAS_RPL (perror, void, (const char *string));
+# else
+_GL_CXXALIAS_SYS (perror, void, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (perror);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef perror
+/* Assume perror is always declared.  */
+_GL_WARN_ON_USE (perror, "perror is not always POSIX compliant - "
+                 "use gnulib module perror for portability");
+#endif
+
+#if @GNULIB_POPEN@
+# if @REPLACE_POPEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef popen
+#   define popen rpl_popen
+#  endif
+_GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
+                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
+# else
+#  if !@HAVE_POPEN@
+_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
+                                 _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
+# endif
+_GL_CXXALIASWARN (popen);
+#elif defined GNULIB_POSIXCHECK
+# undef popen
+# if HAVE_RAW_DECL_POPEN
+_GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
+                 "use gnulib module popen or pipe for more portability");
+# endif
+#endif
+
+#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
+# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
+     || (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+#  if defined __GNUC__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+/* Don't break __attribute__((format(printf,M,N))).  */
+#    define printf __printf__
+#   endif
+#   if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+                    (const char *format, ...)
+                    __asm__ (@ASM_SYMBOL_PREFIX@
+                             _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+                    _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                    _GL_ARG_NONNULL ((1)));
+#   else
+_GL_FUNCDECL_RPL_1 (__printf__, int,
+                    (const char *format, ...)
+                    __asm__ (@ASM_SYMBOL_PREFIX@
+                             _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
+                    _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
+                    _GL_ARG_NONNULL ((1)));
+#   endif
+_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
+#  else
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    define printf rpl_printf
+#   endif
+_GL_FUNCDECL_RPL (printf, int,
+                  (const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
+#  endif
+#  define GNULIB_overrides_printf 1
+# else
+_GL_CXXALIAS_SYS (printf, int, (const char *format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (printf);
+# endif
+#endif
+#if !@GNULIB_PRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_printf
+#  undef printf
+# endif
+/* Assume printf is always declared.  */
+_GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
+                 "use gnulib module printf-posix for portable "
+                 "POSIX compliance");
+#endif
+
+#if @GNULIB_PUTC@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putc
+#   define putc rpl_fputc
+#  endif
+_GL_FUNCDECL_RPL (fputc, int, (int c, FILE *stream) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL_1 (putc, rpl_fputc, int, (int c, FILE *stream));
+# else
+_GL_CXXALIAS_SYS (putc, int, (int c, FILE *stream));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putc);
+# endif
+#endif
+
+#if @GNULIB_PUTCHAR@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putchar
+#   define putchar rpl_putchar
+#  endif
+_GL_FUNCDECL_RPL (putchar, int, (int c));
+_GL_CXXALIAS_RPL (putchar, int, (int c));
+# else
+_GL_CXXALIAS_SYS (putchar, int, (int c));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (putchar);
+# endif
+#endif
+
+#if @GNULIB_PUTS@
+# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef puts
+#   define puts rpl_puts
+#  endif
+_GL_FUNCDECL_RPL (puts, int, (const char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (puts, int, (const char *string));
+# else
+_GL_CXXALIAS_SYS (puts, int, (const char *string));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (puts);
+# endif
+#endif
+
+#if @GNULIB_REMOVE@
+# if @REPLACE_REMOVE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef remove
+#   define remove rpl_remove
+#  endif
+_GL_FUNCDECL_RPL (remove, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (remove, int, (const char *name));
+# else
+_GL_CXXALIAS_SYS (remove, int, (const char *name));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (remove);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef remove
+/* Assume remove is always declared.  */
+_GL_WARN_ON_USE (remove, "remove cannot handle directories on some platforms - "
+                 "use gnulib module remove for more portability");
+#endif
+
+#if @GNULIB_RENAME@
+# if @REPLACE_RENAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef rename
+#   define rename rpl_rename
+#  endif
+_GL_FUNCDECL_RPL (rename, int,
+                  (const char *old_filename, const char *new_filename)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (rename, int,
+                  (const char *old_filename, const char *new_filename));
+# else
+_GL_CXXALIAS_SYS (rename, int,
+                  (const char *old_filename, const char *new_filename));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (rename);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rename
+/* Assume rename is always declared.  */
+_GL_WARN_ON_USE (rename, "rename is buggy on some platforms - "
+                 "use gnulib module rename for more portability");
+#endif
+
+#if @GNULIB_RENAMEAT@
+# if @REPLACE_RENAMEAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef renameat
+#   define renameat rpl_renameat
+#  endif
+_GL_FUNCDECL_RPL (renameat, int,
+                  (int fd1, char const *file1, int fd2, char const *file2)
+                  _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (renameat, int,
+                  (int fd1, char const *file1, int fd2, char const *file2));
+# else
+#  if !@HAVE_RENAMEAT@
+_GL_FUNCDECL_SYS (renameat, int,
+                  (int fd1, char const *file1, int fd2, char const *file2)
+                  _GL_ARG_NONNULL ((2, 4)));
+#  endif
+_GL_CXXALIAS_SYS (renameat, int,
+                  (int fd1, char const *file1, int fd2, char const *file2));
+# endif
+_GL_CXXALIASWARN (renameat);
+#elif defined GNULIB_POSIXCHECK
+# undef renameat
+# if HAVE_RAW_DECL_RENAMEAT
+_GL_WARN_ON_USE (renameat, "renameat is not portable - "
+                 "use gnulib module renameat for portability");
+# endif
+#endif
+
+#if @GNULIB_SCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if defined __GNUC__
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef scanf
+/* Don't break __attribute__((format(scanf,M,N))).  */
+#    define scanf __scanf__
+#   endif
+_GL_FUNCDECL_RPL_1 (__scanf__, int,
+                    (const char *format, ...)
+                    __asm__ (@ASM_SYMBOL_PREFIX@
+                             _GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
+                    _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+                    _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
+#  else
+#   if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#    undef scanf
+#    define scanf rpl_scanf
+#   endif
+_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
+                              _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
+#  endif
+# else
+_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (scanf);
+# endif
+#endif
+
+#if @GNULIB_SNPRINTF@
+# if @REPLACE_SNPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define snprintf rpl_snprintf
+#  endif
+_GL_FUNCDECL_RPL (snprintf, int,
+                  (char *str, size_t size, const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (snprintf, int,
+                  (char *str, size_t size, const char *format, ...));
+# else
+#  if !@HAVE_DECL_SNPRINTF@
+_GL_FUNCDECL_SYS (snprintf, int,
+                  (char *str, size_t size, const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
+                  _GL_ARG_NONNULL ((3)));
+#  endif
+_GL_CXXALIAS_SYS (snprintf, int,
+                  (char *str, size_t size, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (snprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef snprintf
+# if HAVE_RAW_DECL_SNPRINTF
+_GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
+                 "use gnulib module snprintf for portability");
+# endif
+#endif
+
+/* Some people would argue that all sprintf uses should be warned about
+   (for example, OpenBSD issues a link warning for it),
+   since it can cause security holes due to buffer overruns.
+   However, we believe that sprintf can be used safely, and is more
+   efficient than snprintf in those safe cases; and as proof of our
+   belief, we use sprintf in several gnulib modules.  So this header
+   intentionally avoids adding a warning to sprintf except when
+   GNULIB_POSIXCHECK is defined.  */
+
+#if @GNULIB_SPRINTF_POSIX@
+# if @REPLACE_SPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define sprintf rpl_sprintf
+#  endif
+_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                                _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
+# else
+_GL_CXXALIAS_SYS (sprintf, int, (char *str, const char *format, ...));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (sprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef sprintf
+/* Assume sprintf is always declared.  */
+_GL_WARN_ON_USE (sprintf, "sprintf is not always POSIX compliant - "
+                 "use gnulib module sprintf-posix for portable "
+                 "POSIX compliance");
+#endif
+
+#if @GNULIB_TMPFILE@
+# if @REPLACE_TMPFILE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define tmpfile rpl_tmpfile
+#  endif
+_GL_FUNCDECL_RPL (tmpfile, FILE *, (void));
+_GL_CXXALIAS_RPL (tmpfile, FILE *, (void));
+# else
+_GL_CXXALIAS_SYS (tmpfile, FILE *, (void));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (tmpfile);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef tmpfile
+# if HAVE_RAW_DECL_TMPFILE
+_GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
+                 "use gnulib module tmpfile for portability");
+# endif
+#endif
+
+#if @GNULIB_VASPRINTF@
+/* Write formatted output to a string dynamically allocated with malloc().
+   If the memory allocation succeeds, store the address of the string in
+   *RESULT and return the number of resulting bytes, excluding the trailing
+   NUL.  Upon memory allocation error, or some other error, return -1.  */
+# if @REPLACE_VASPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define asprintf rpl_asprintf
+#  endif
+_GL_FUNCDECL_RPL (asprintf, int,
+                  (char **result, const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (asprintf, int,
+                  (char **result, const char *format, ...));
+# else
+#  if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (asprintf, int,
+                  (char **result, const char *format, ...)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (asprintf, int,
+                  (char **result, const char *format, ...));
+# endif
+_GL_CXXALIASWARN (asprintf);
+# if @REPLACE_VASPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define vasprintf rpl_vasprintf
+#  endif
+_GL_FUNCDECL_RPL (vasprintf, int,
+                  (char **result, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vasprintf, int,
+                  (char **result, const char *format, va_list args));
+# else
+#  if !@HAVE_VASPRINTF@
+_GL_FUNCDECL_SYS (vasprintf, int,
+                  (char **result, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (vasprintf, int,
+                  (char **result, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vasprintf);
+#endif
+
+#if @GNULIB_VDPRINTF@
+# if @REPLACE_VDPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define vdprintf rpl_vdprintf
+#  endif
+_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
+                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
+# else
+#  if !@HAVE_VDPRINTF@
+_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
+                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                                 _GL_ARG_NONNULL ((2)));
+#  endif
+/* Need to cast, because on Solaris, the third parameter will likely be
+                                                    __va_list args.  */
+_GL_CXXALIAS_SYS_CAST (vdprintf, int,
+                       (int fd, const char *format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vdprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vdprintf
+# if HAVE_RAW_DECL_VDPRINTF
+_GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
+                 "use gnulib module vdprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
+# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
+     || (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define vfprintf rpl_vfprintf
+#  endif
+#  define GNULIB_overrides_vfprintf 1
+#  if @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
+                                 _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                                 _GL_ARG_NONNULL ((1, 2)));
+#  else
+_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
+                                 _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
+                                 _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+                                                      __va_list args
+   and GCC's fixincludes did not change this to __gnuc_va_list.  */
+_GL_CXXALIAS_SYS_CAST (vfprintf, int,
+                       (FILE *fp, const char *format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vfprintf);
+# endif
+#endif
+#if !@GNULIB_VFPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vfprintf
+#  undef vfprintf
+# endif
+/* Assume vfprintf is always declared.  */
+_GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
+                 "use gnulib module vfprintf-posix for portable "
+                      "POSIX compliance");
+#endif
+
+#if @GNULIB_VFSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef vfscanf
+#   define vfscanf rpl_vfscanf
+#  endif
+_GL_FUNCDECL_RPL (vfscanf, int,
+                  (FILE *stream, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vfscanf, int,
+                  (FILE *stream, const char *format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vfscanf, int,
+                  (FILE *stream, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vfscanf);
+#endif
+
+#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
+# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
+     || (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define vprintf rpl_vprintf
+#  endif
+#  define GNULIB_overrides_vprintf 1
+#  if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
+_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
+                                _GL_ARG_NONNULL ((1)));
+#  else
+_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
+                                _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
+                                _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
+# else
+/* Need to cast, because on Solaris, the second parameter is
+                                                          __va_list args
+   and GCC's fixincludes did not change this to __gnuc_va_list.  */
+_GL_CXXALIAS_SYS_CAST (vprintf, int, (const char *format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vprintf);
+# endif
+#endif
+#if !@GNULIB_VPRINTF_POSIX@ && defined GNULIB_POSIXCHECK
+# if !GNULIB_overrides_vprintf
+#  undef vprintf
+# endif
+/* Assume vprintf is always declared.  */
+_GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
+                 "use gnulib module vprintf-posix for portable "
+                 "POSIX compliance");
+#endif
+
+#if @GNULIB_VSCANF@
+# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef vscanf
+#   define vscanf rpl_vscanf
+#  endif
+_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
+                               _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
+# else
+_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vscanf);
+#endif
+
+#if @GNULIB_VSNPRINTF@
+# if @REPLACE_VSNPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define vsnprintf rpl_vsnprintf
+#  endif
+_GL_FUNCDECL_RPL (vsnprintf, int,
+                  (char *str, size_t size, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  _GL_ARG_NONNULL ((3)));
+_GL_CXXALIAS_RPL (vsnprintf, int,
+                  (char *str, size_t size, const char *format, va_list args));
+# else
+#  if !@HAVE_DECL_VSNPRINTF@
+_GL_FUNCDECL_SYS (vsnprintf, int,
+                  (char *str, size_t size, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
+                  _GL_ARG_NONNULL ((3)));
+#  endif
+_GL_CXXALIAS_SYS (vsnprintf, int,
+                  (char *str, size_t size, const char *format, va_list args));
+# endif
+_GL_CXXALIASWARN (vsnprintf);
+#elif defined GNULIB_POSIXCHECK
+# undef vsnprintf
+# if HAVE_RAW_DECL_VSNPRINTF
+_GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
+                 "use gnulib module vsnprintf for portability");
+# endif
+#endif
+
+#if @GNULIB_VSPRINTF_POSIX@
+# if @REPLACE_VSPRINTF@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define vsprintf rpl_vsprintf
+#  endif
+_GL_FUNCDECL_RPL (vsprintf, int,
+                  (char *str, const char *format, va_list args)
+                  _GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (vsprintf, int,
+                  (char *str, const char *format, va_list args));
+# else
+/* Need to cast, because on Solaris, the third parameter is
+                                                       __va_list args
+   and GCC's fixincludes did not change this to __gnuc_va_list.  */
+_GL_CXXALIAS_SYS_CAST (vsprintf, int,
+                       (char *str, const char *format, va_list args));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (vsprintf);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef vsprintf
+/* Assume vsprintf is always declared.  */
+_GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
+                 "use gnulib module vsprintf-posix for portable "
+                      "POSIX compliance");
+#endif
+
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif /* _@GUARD_PREFIX@_STDIO_H */
+#endif
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
new file mode 100644 (file)
index 0000000..e088959
--- /dev/null
@@ -0,0 +1,1112 @@
+/* A GNU-like <stdlib.h>.
+
+   Copyright (C) 1995, 2001-2004, 2006-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined __need_system_stdlib_h || defined __need_malloc_and_calloc
+/* Special invocation conventions inside some gnulib header files,
+   and inside some glibc header files, respectively.  */
+
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
+
+#ifndef _@GUARD_PREFIX@_STDLIB_H
+#define _@GUARD_PREFIX@_STDLIB_H
+
+/* NetBSD 5.0 mis-defines NULL.  */
+#include <stddef.h>
+
+/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>.  */
+#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
+# include <sys/wait.h>
+#endif
+
+/* Solaris declares getloadavg() in <sys/loadavg.h>.  */
+#if (@GNULIB_GETLOADAVG@ || defined GNULIB_POSIXCHECK) && @HAVE_SYS_LOADAVG_H@
+/* OpenIndiana has a bug: <sys/time.h> must be included before
+   <sys/loadavg.h>.  */
+# include <sys/time.h>
+# include <sys/loadavg.h>
+#endif
+
+/* Native Windows platforms declare mktemp() in <io.h>.  */
+#if 0 && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+#if @GNULIB_RANDOM_R@
+
+/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
+   from <stdlib.h> if _REENTRANT is defined.  Include it whenever we need
+   'struct random_data'.  */
+# if @HAVE_RANDOM_H@
+#  include <random.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
+#  include <stdint.h>
+# endif
+
+# if !@HAVE_STRUCT_RANDOM_DATA@
+/* Define 'struct random_data'.
+   But allow multiple gnulib generated <stdlib.h> replacements to coexist.  */
+#  if !GNULIB_defined_struct_random_data
+struct random_data
+{
+  int32_t *fptr;                /* Front pointer.  */
+  int32_t *rptr;                /* Rear pointer.  */
+  int32_t *state;               /* Array of state values.  */
+  int rand_type;                /* Type of random number generator.  */
+  int rand_deg;                 /* Degree of random number generator.  */
+  int rand_sep;                 /* Distance between front and rear.  */
+  int32_t *end_ptr;             /* Pointer behind state table.  */
+};
+#   define GNULIB_defined_struct_random_data 1
+#  endif
+# endif
+#endif
+
+#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_MKOSTEMP@ || @GNULIB_MKOSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !(defined _WIN32 && ! defined __CYGWIN__)
+/* On Mac OS X 10.3, only <unistd.h> declares mkstemp.  */
+/* On Mac OS X 10.5, only <unistd.h> declares mkstemps.  */
+/* On Mac OS X 10.13, only <unistd.h> declares mkostemp and mkostemps.  */
+/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt.  */
+/* But avoid namespace pollution on glibc systems and native Windows.  */
+# include <unistd.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The definition of _Noreturn is copied here.  */
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Some systems do not define EXIT_*, despite otherwise supporting C89.  */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+/* Tandem/NSK and other platforms that define EXIT_FAILURE as -1 interfere
+   with proper operation of xargs.  */
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#elif EXIT_FAILURE != 1
+# undef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+
+#if @GNULIB__EXIT@
+/* Terminate the current process with the given return code, without running
+   the 'atexit' handlers.  */
+# if !@HAVE__EXIT@
+_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
+# endif
+_GL_CXXALIAS_SYS (_Exit, void, (int status));
+_GL_CXXALIASWARN (_Exit);
+#elif defined GNULIB_POSIXCHECK
+# undef _Exit
+# if HAVE_RAW_DECL__EXIT
+_GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
+                 "use gnulib module _Exit for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ATOLL@
+/* Parse a signed decimal integer.
+   Returns the value of the integer.  Errors are not detected.  */
+# if !@HAVE_ATOLL@
+_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
+                                    _GL_ATTRIBUTE_PURE
+                                    _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
+_GL_CXXALIASWARN (atoll);
+#elif defined GNULIB_POSIXCHECK
+# undef atoll
+# if HAVE_RAW_DECL_ATOLL
+_GL_WARN_ON_USE (atoll, "atoll is unportable - "
+                 "use gnulib module atoll for portability");
+# endif
+#endif
+
+#if @GNULIB_CALLOC_POSIX@
+# if @REPLACE_CALLOC@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef calloc
+#   define calloc rpl_calloc
+#  endif
+_GL_FUNCDECL_RPL (calloc, void *, (size_t nmemb, size_t size));
+_GL_CXXALIAS_RPL (calloc, void *, (size_t nmemb, size_t size));
+# else
+_GL_CXXALIAS_SYS (calloc, void *, (size_t nmemb, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (calloc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef calloc
+/* Assume calloc is always declared.  */
+_GL_WARN_ON_USE (calloc, "calloc is not POSIX compliant everywhere - "
+                 "use gnulib module calloc-posix for portability");
+#endif
+
+#if @GNULIB_CANONICALIZE_FILE_NAME@
+# if @REPLACE_CANONICALIZE_FILE_NAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define canonicalize_file_name rpl_canonicalize_file_name
+#  endif
+_GL_FUNCDECL_RPL (canonicalize_file_name, char *, (const char *name)
+                                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (canonicalize_file_name, char *, (const char *name));
+# else
+#  if !@HAVE_CANONICALIZE_FILE_NAME@
+_GL_FUNCDECL_SYS (canonicalize_file_name, char *, (const char *name)
+                                                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (canonicalize_file_name, char *, (const char *name));
+# endif
+_GL_CXXALIASWARN (canonicalize_file_name);
+#elif defined GNULIB_POSIXCHECK
+# undef canonicalize_file_name
+# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
+_GL_WARN_ON_USE (canonicalize_file_name,
+                 "canonicalize_file_name is unportable - "
+                 "use gnulib module canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_GETLOADAVG@
+/* Store max(NELEM,3) load average numbers in LOADAVG[].
+   The three numbers are the load average of the last 1 minute, the last 5
+   minutes, and the last 15 minutes, respectively.
+   LOADAVG is an array of NELEM numbers.  */
+# if !@HAVE_DECL_GETLOADAVG@
+_GL_FUNCDECL_SYS (getloadavg, int, (double loadavg[], int nelem)
+                                   _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (getloadavg, int, (double loadavg[], int nelem));
+_GL_CXXALIASWARN (getloadavg);
+#elif defined GNULIB_POSIXCHECK
+# undef getloadavg
+# if HAVE_RAW_DECL_GETLOADAVG
+_GL_WARN_ON_USE (getloadavg, "getloadavg is not portable - "
+                 "use gnulib module getloadavg for portability");
+# endif
+#endif
+
+#if @GNULIB_GETSUBOPT@
+/* Assuming *OPTIONP is a comma separated list of elements of the form
+   "token" or "token=value", getsubopt parses the first of these elements.
+   If the first element refers to a "token" that is member of the given
+   NULL-terminated array of tokens:
+     - It replaces the comma with a NUL byte, updates *OPTIONP to point past
+       the first option and the comma, sets *VALUEP to the value of the
+       element (or NULL if it doesn't contain an "=" sign),
+     - It returns the index of the "token" in the given array of tokens.
+   Otherwise it returns -1, and *OPTIONP and *VALUEP are undefined.
+   For more details see the POSIX specification.
+   https://pubs.opengroup.org/onlinepubs/9699919799/functions/getsubopt.html */
+# if !@HAVE_GETSUBOPT@
+_GL_FUNCDECL_SYS (getsubopt, int,
+                  (char **optionp, char *const *tokens, char **valuep)
+                  _GL_ARG_NONNULL ((1, 2, 3)));
+# endif
+_GL_CXXALIAS_SYS (getsubopt, int,
+                  (char **optionp, char *const *tokens, char **valuep));
+_GL_CXXALIASWARN (getsubopt);
+#elif defined GNULIB_POSIXCHECK
+# undef getsubopt
+# if HAVE_RAW_DECL_GETSUBOPT
+_GL_WARN_ON_USE (getsubopt, "getsubopt is unportable - "
+                 "use gnulib module getsubopt for portability");
+# endif
+#endif
+
+#if @GNULIB_GRANTPT@
+/* Change the ownership and access permission of the slave side of the
+   pseudo-terminal whose master side is specified by FD.  */
+# if !@HAVE_GRANTPT@
+_GL_FUNCDECL_SYS (grantpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (grantpt, int, (int fd));
+_GL_CXXALIASWARN (grantpt);
+#elif defined GNULIB_POSIXCHECK
+# undef grantpt
+# if HAVE_RAW_DECL_GRANTPT
+_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
+                 "use gnulib module grantpt for portability");
+# endif
+#endif
+
+/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
+   rely on GNU or POSIX semantics for malloc and realloc (for example,
+   by never specifying a zero size), so it does not need malloc or
+   realloc to be redefined.  */
+#if @GNULIB_MALLOC_POSIX@
+# if @REPLACE_MALLOC@
+#  if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+        || _GL_USE_STDLIB_ALLOC)
+#   undef malloc
+#   define malloc rpl_malloc
+#  endif
+_GL_FUNCDECL_RPL (malloc, void *, (size_t size));
+_GL_CXXALIAS_RPL (malloc, void *, (size_t size));
+# else
+_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (malloc);
+# endif
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef malloc
+/* Assume malloc is always declared.  */
+_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
+                 "use gnulib module malloc-posix for portability");
+#endif
+
+/* Convert a multibyte character to a wide character.  */
+#if @GNULIB_MBTOWC@
+# if @REPLACE_MBTOWC@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef mbtowc
+#   define mbtowc rpl_mbtowc
+#  endif
+_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+# else
+#  if !@HAVE_MBTOWC@
+_GL_FUNCDECL_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+#  endif
+_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (mbtowc);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef mbtowc
+# if HAVE_RAW_DECL_MBTOWC
+_GL_WARN_ON_USE (mbtowc, "mbtowc is not portable - "
+                 "use gnulib module mbtowc for portability");
+# endif
+#endif
+
+#if @GNULIB_MKDTEMP@
+/* Create a unique temporary directory from TEMPLATE.
+   The last six characters of TEMPLATE must be "XXXXXX";
+   they are replaced with a string that makes the directory name unique.
+   Returns TEMPLATE, or a null pointer if it cannot get a unique name.
+   The directory is created mode 700.  */
+# if !@HAVE_MKDTEMP@
+_GL_FUNCDECL_SYS (mkdtemp, char *, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkdtemp, char *, (char * /*template*/));
+_GL_CXXALIASWARN (mkdtemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkdtemp
+# if HAVE_RAW_DECL_MKDTEMP
+_GL_WARN_ON_USE (mkdtemp, "mkdtemp is unportable - "
+                 "use gnulib module mkdtemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   The file is then created, with the specified flags, ensuring it didn't exist
+   before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if !@HAVE_MKOSTEMP@
+_GL_FUNCDECL_SYS (mkostemp, int, (char * /*template*/, int /*flags*/)
+                                 _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemp, int, (char * /*template*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemp
+# if HAVE_RAW_DECL_MKOSTEMP
+_GL_WARN_ON_USE (mkostemp, "mkostemp is unportable - "
+                 "use gnulib module mkostemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKOSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE before a suffix of length
+   SUFFIXLEN must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   The file is then created, with the specified flags, ensuring it didn't exist
+   before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if !@HAVE_MKOSTEMPS@
+_GL_FUNCDECL_SYS (mkostemps, int,
+                  (char * /*template*/, int /*suffixlen*/, int /*flags*/)
+                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkostemps, int,
+                  (char * /*template*/, int /*suffixlen*/, int /*flags*/));
+_GL_CXXALIASWARN (mkostemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkostemps
+# if HAVE_RAW_DECL_MKOSTEMPS
+_GL_WARN_ON_USE (mkostemps, "mkostemps is unportable - "
+                 "use gnulib module mkostemps for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMP@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The file is then created, ensuring it didn't exist before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if @REPLACE_MKSTEMP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mkstemp rpl_mkstemp
+#  endif
+_GL_FUNCDECL_RPL (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mkstemp, int, (char * /*template*/));
+# else
+#  if ! @HAVE_MKSTEMP@
+_GL_FUNCDECL_SYS (mkstemp, int, (char * /*template*/) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (mkstemp, int, (char * /*template*/));
+# endif
+_GL_CXXALIASWARN (mkstemp);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemp
+# if HAVE_RAW_DECL_MKSTEMP
+_GL_WARN_ON_USE (mkstemp, "mkstemp is unportable - "
+                 "use gnulib module mkstemp for portability");
+# endif
+#endif
+
+#if @GNULIB_MKSTEMPS@
+/* Create a unique temporary file from TEMPLATE.
+   The last six characters of TEMPLATE prior to a suffix of length
+   SUFFIXLEN must be "XXXXXX";
+   they are replaced with a string that makes the file name unique.
+   The file is then created, ensuring it didn't exist before.
+   The file is created read-write (mask at least 0600 & ~umask), but it may be
+   world-readable and world-writable (mask 0666 & ~umask), depending on the
+   implementation.
+   Returns the open file descriptor if successful, otherwise -1 and errno
+   set.  */
+# if !@HAVE_MKSTEMPS@
+_GL_FUNCDECL_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/)
+                                 _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (mkstemps, int, (char * /*template*/, int /*suffixlen*/));
+_GL_CXXALIASWARN (mkstemps);
+#elif defined GNULIB_POSIXCHECK
+# undef mkstemps
+# if HAVE_RAW_DECL_MKSTEMPS
+_GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
+                 "use gnulib module mkstemps for portability");
+# endif
+#endif
+
+#if @GNULIB_POSIX_OPENPT@
+/* Return an FD open to the master side of a pseudo-terminal.  Flags should
+   include O_RDWR, and may also include O_NOCTTY.  */
+# if !@HAVE_POSIX_OPENPT@
+_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
+# endif
+_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
+_GL_CXXALIASWARN (posix_openpt);
+#elif defined GNULIB_POSIXCHECK
+# undef posix_openpt
+# if HAVE_RAW_DECL_POSIX_OPENPT
+_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
+                 "use gnulib module posix_openpt for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME@
+/* Return the pathname of the pseudo-terminal slave associated with
+   the master FD is open on, or NULL on errors.  */
+# if @REPLACE_PTSNAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ptsname
+#   define ptsname rpl_ptsname
+#  endif
+_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
+_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
+# else
+#  if !@HAVE_PTSNAME@
+_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
+#  endif
+_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
+# endif
+_GL_CXXALIASWARN (ptsname);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname
+# if HAVE_RAW_DECL_PTSNAME
+_GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
+                 "use gnulib module ptsname for portability");
+# endif
+#endif
+
+#if @GNULIB_PTSNAME_R@
+/* Set the pathname of the pseudo-terminal slave associated with
+   the master FD is open on and return 0, or set errno and return
+   non-zero on errors.  */
+# if @REPLACE_PTSNAME_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ptsname_r
+#   define ptsname_r rpl_ptsname_r
+#  endif
+_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
+# else
+#  if !@HAVE_PTSNAME_R@
+_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+#  endif
+_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
+# endif
+_GL_CXXALIASWARN (ptsname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ptsname_r
+# if HAVE_RAW_DECL_PTSNAME_R
+_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
+                 "use gnulib module ptsname_r for portability");
+# endif
+#endif
+
+#if @GNULIB_PUTENV@
+# if @REPLACE_PUTENV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef putenv
+#   define putenv rpl_putenv
+#  endif
+_GL_FUNCDECL_RPL (putenv, int, (char *string) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (putenv, int, (char *string));
+# else
+_GL_CXXALIAS_SYS (putenv, int, (char *string));
+# endif
+_GL_CXXALIASWARN (putenv);
+#endif
+
+#if @GNULIB_QSORT_R@
+/* Sort an array of NMEMB elements, starting at address BASE, each element
+   occupying SIZE bytes, in ascending order according to the comparison
+   function COMPARE.  */
+# if @REPLACE_QSORT_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef qsort_r
+#   define qsort_r rpl_qsort_r
+#  endif
+_GL_FUNCDECL_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg) _GL_ARG_NONNULL ((1, 4)));
+_GL_CXXALIAS_RPL (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg));
+# else
+#  if !@HAVE_QSORT_R@
+_GL_FUNCDECL_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg) _GL_ARG_NONNULL ((1, 4)));
+#  endif
+_GL_CXXALIAS_SYS (qsort_r, void, (void *base, size_t nmemb, size_t size,
+                                  int (*compare) (void const *, void const *,
+                                                  void *),
+                                  void *arg));
+# endif
+_GL_CXXALIASWARN (qsort_r);
+#elif defined GNULIB_POSIXCHECK
+# undef qsort_r
+# if HAVE_RAW_DECL_QSORT_R
+_GL_WARN_ON_USE (qsort_r, "qsort_r is not portable - "
+                 "use gnulib module qsort_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if !@HAVE_RANDOM_R@
+#  ifndef RAND_MAX
+#   define RAND_MAX 2147483647
+#  endif
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_RANDOM@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef random
+#   define random rpl_random
+#  endif
+_GL_FUNCDECL_RPL (random, long, (void));
+_GL_CXXALIAS_RPL (random, long, (void));
+# else
+#  if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (random, long, (void));
+#  endif
+/* Need to cast, because on Haiku, the return type is
+                               int.  */
+_GL_CXXALIAS_SYS_CAST (random, long, (void));
+# endif
+_GL_CXXALIASWARN (random);
+#elif defined GNULIB_POSIXCHECK
+# undef random
+# if HAVE_RAW_DECL_RANDOM
+_GL_WARN_ON_USE (random, "random is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_RANDOM@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef srandom
+#   define srandom rpl_srandom
+#  endif
+_GL_FUNCDECL_RPL (srandom, void, (unsigned int seed));
+_GL_CXXALIAS_RPL (srandom, void, (unsigned int seed));
+# else
+#  if !@HAVE_RANDOM@
+_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
+#  endif
+/* Need to cast, because on FreeBSD, the first parameter is
+                                       unsigned long seed.  */
+_GL_CXXALIAS_SYS_CAST (srandom, void, (unsigned int seed));
+# endif
+_GL_CXXALIASWARN (srandom);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom
+# if HAVE_RAW_DECL_SRANDOM
+_GL_WARN_ON_USE (srandom, "srandom is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_INITSTATE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef initstate
+#   define initstate rpl_initstate
+#  endif
+_GL_FUNCDECL_RPL (initstate, char *,
+                  (unsigned int seed, char *buf, size_t buf_size)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (initstate, char *,
+                  (unsigned int seed, char *buf, size_t buf_size));
+# else
+#  if !@HAVE_INITSTATE@ || !@HAVE_DECL_INITSTATE@
+_GL_FUNCDECL_SYS (initstate, char *,
+                  (unsigned int seed, char *buf, size_t buf_size)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+/* Need to cast, because on FreeBSD, the first parameter is
+                        unsigned long seed.  */
+_GL_CXXALIAS_SYS_CAST (initstate, char *,
+                       (unsigned int seed, char *buf, size_t buf_size));
+# endif
+_GL_CXXALIASWARN (initstate);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate
+# if HAVE_RAW_DECL_INITSTATE
+_GL_WARN_ON_USE (initstate, "initstate is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM@
+# if @REPLACE_SETSTATE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setstate
+#   define setstate rpl_setstate
+#  endif
+_GL_FUNCDECL_RPL (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setstate, char *, (char *arg_state));
+# else
+#  if !@HAVE_SETSTATE@ || !@HAVE_DECL_SETSTATE@
+_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
+#  endif
+/* Need to cast, because on Mac OS X 10.13, HP-UX, Solaris the first parameter
+   is                                     const char *arg_state.  */
+_GL_CXXALIAS_SYS_CAST (setstate, char *, (char *arg_state));
+# endif
+_GL_CXXALIASWARN (setstate);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate
+# if HAVE_RAW_DECL_SETSTATE
+_GL_WARN_ON_USE (setstate, "setstate is unportable - "
+                 "use gnulib module random for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef random_r
+#   define random_r rpl_random_r
+#  endif
+_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
+                                 _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
+                                 _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
+# endif
+_GL_CXXALIASWARN (random_r);
+#elif defined GNULIB_POSIXCHECK
+# undef random_r
+# if HAVE_RAW_DECL_RANDOM_R
+_GL_WARN_ON_USE (random_r, "random_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef srandom_r
+#   define srandom_r rpl_srandom_r
+#  endif
+_GL_FUNCDECL_RPL (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (srandom_r, int,
+                  (unsigned int seed, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (srandom_r);
+#elif defined GNULIB_POSIXCHECK
+# undef srandom_r
+# if HAVE_RAW_DECL_SRANDOM_R
+_GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef initstate_r
+#   define initstate_r rpl_initstate_r
+#  endif
+_GL_FUNCDECL_RPL (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (initstate_r, int,
+                  (unsigned int seed, char *buf, size_t buf_size,
+                   struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((2, 4)));
+#  endif
+/* Need to cast, because on Haiku, the third parameter is
+                                                     unsigned long buf_size.  */
+_GL_CXXALIAS_SYS_CAST (initstate_r, int,
+                       (unsigned int seed, char *buf, size_t buf_size,
+                        struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (initstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef initstate_r
+# if HAVE_RAW_DECL_INITSTATE_R
+_GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+#if @GNULIB_RANDOM_R@
+# if @REPLACE_RANDOM_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setstate_r
+#   define setstate_r rpl_setstate_r
+#  endif
+_GL_FUNCDECL_RPL (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state));
+# else
+#  if !@HAVE_RANDOM_R@
+_GL_FUNCDECL_SYS (setstate_r, int,
+                  (char *arg_state, struct random_data *rand_state)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+/* Need to cast, because on Haiku, the first parameter is
+                        void *arg_state.  */
+_GL_CXXALIAS_SYS_CAST (setstate_r, int,
+                       (char *arg_state, struct random_data *rand_state));
+# endif
+_GL_CXXALIASWARN (setstate_r);
+#elif defined GNULIB_POSIXCHECK
+# undef setstate_r
+# if HAVE_RAW_DECL_SETSTATE_R
+_GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
+                 "use gnulib module random_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_REALLOC_POSIX@
+# if @REPLACE_REALLOC@
+#  if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
+        || _GL_USE_STDLIB_ALLOC)
+#   undef realloc
+#   define realloc rpl_realloc
+#  endif
+_GL_FUNCDECL_RPL (realloc, void *, (void *ptr, size_t size));
+_GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
+# else
+_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (realloc);
+# endif
+#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
+# undef realloc
+/* Assume realloc is always declared.  */
+_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
+                 "use gnulib module realloc-posix for portability");
+#endif
+
+
+#if @GNULIB_REALLOCARRAY@
+# if ! @HAVE_REALLOCARRAY@
+_GL_FUNCDECL_SYS (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+# endif
+_GL_CXXALIAS_SYS (reallocarray, void *,
+                  (void *ptr, size_t nmemb, size_t size));
+_GL_CXXALIASWARN (reallocarray);
+#elif defined GNULIB_POSIXCHECK
+# undef reallocarray
+# if HAVE_RAW_DECL_REALLOCARRAY
+_GL_WARN_ON_USE (reallocarray, "reallocarray is not portable - "
+                 "use gnulib module reallocarray for portability");
+# endif
+#endif
+
+#if @GNULIB_REALPATH@
+# if @REPLACE_REALPATH@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define realpath rpl_realpath
+#  endif
+_GL_FUNCDECL_RPL (realpath, char *, (const char *name, char *resolved)
+                                    _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (realpath, char *, (const char *name, char *resolved));
+# else
+#  if !@HAVE_REALPATH@
+_GL_FUNCDECL_SYS (realpath, char *, (const char *name, char *resolved)
+                                    _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (realpath, char *, (const char *name, char *resolved));
+# endif
+_GL_CXXALIASWARN (realpath);
+#elif defined GNULIB_POSIXCHECK
+# undef realpath
+# if HAVE_RAW_DECL_REALPATH
+_GL_WARN_ON_USE (realpath, "realpath is unportable - use gnulib module "
+                 "canonicalize or canonicalize-lgpl for portability");
+# endif
+#endif
+
+#if @GNULIB_RPMATCH@
+/* Test a user response to a question.
+   Return 1 if it is affirmative, 0 if it is negative, or -1 if not clear.  */
+# if !@HAVE_RPMATCH@
+_GL_FUNCDECL_SYS (rpmatch, int, (const char *response) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (rpmatch, int, (const char *response));
+_GL_CXXALIASWARN (rpmatch);
+#elif defined GNULIB_POSIXCHECK
+# undef rpmatch
+# if HAVE_RAW_DECL_RPMATCH
+_GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
+                 "use gnulib module rpmatch for portability");
+# endif
+#endif
+
+#if @GNULIB_SECURE_GETENV@
+/* Look up NAME in the environment, returning 0 in insecure situations.  */
+# if !@HAVE_SECURE_GETENV@
+_GL_FUNCDECL_SYS (secure_getenv, char *,
+                  (char const *name) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name));
+_GL_CXXALIASWARN (secure_getenv);
+#elif defined GNULIB_POSIXCHECK
+# undef secure_getenv
+# if HAVE_RAW_DECL_SECURE_GETENV
+_GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - "
+                 "use gnulib module secure_getenv for portability");
+# endif
+#endif
+
+#if @GNULIB_SETENV@
+/* Set NAME to VALUE in the environment.
+   If REPLACE is nonzero, overwrite an existing value.  */
+# if @REPLACE_SETENV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef setenv
+#   define setenv rpl_setenv
+#  endif
+_GL_FUNCDECL_RPL (setenv, int,
+                  (const char *name, const char *value, int replace)
+                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (setenv, int,
+                  (const char *name, const char *value, int replace));
+# else
+#  if !@HAVE_DECL_SETENV@
+_GL_FUNCDECL_SYS (setenv, int,
+                  (const char *name, const char *value, int replace)
+                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (setenv, int,
+                  (const char *name, const char *value, int replace));
+# endif
+# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
+_GL_CXXALIASWARN (setenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef setenv
+# if HAVE_RAW_DECL_SETENV
+_GL_WARN_ON_USE (setenv, "setenv is unportable - "
+                 "use gnulib module setenv for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOD@
+ /* Parse a double from STRING, updating ENDP if appropriate.  */
+# if @REPLACE_STRTOD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtod rpl_strtod
+#  endif
+#  define GNULIB_defined_strtod_function 1
+_GL_FUNCDECL_RPL (strtod, double, (const char *str, char **endp)
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtod, double, (const char *str, char **endp));
+# else
+#  if !@HAVE_STRTOD@
+_GL_FUNCDECL_SYS (strtod, double, (const char *str, char **endp)
+                                  _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtod, double, (const char *str, char **endp));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strtod);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtod
+# if HAVE_RAW_DECL_STRTOD
+_GL_WARN_ON_USE (strtod, "strtod is unportable - "
+                 "use gnulib module strtod for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLD@
+ /* Parse a 'long double' from STRING, updating ENDP if appropriate.  */
+# if @REPLACE_STRTOLD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strtold rpl_strtold
+#  endif
+#  define GNULIB_defined_strtold_function 1
+_GL_FUNCDECL_RPL (strtold, long double, (const char *str, char **endp)
+                                        _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strtold, long double, (const char *str, char **endp));
+# else
+#  if !@HAVE_STRTOLD@
+_GL_FUNCDECL_SYS (strtold, long double, (const char *str, char **endp)
+                                        _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strtold, long double, (const char *str, char **endp));
+# endif
+_GL_CXXALIASWARN (strtold);
+#elif defined GNULIB_POSIXCHECK
+# undef strtold
+# if HAVE_RAW_DECL_STRTOLD
+_GL_WARN_ON_USE (strtold, "strtold is unportable - "
+                 "use gnulib module strtold for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOLL@
+/* Parse a signed integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
+   Upon overflow, the return value is LLONG_MAX or LLONG_MIN, and errno is set
+   to ERANGE.  */
+# if !@HAVE_STRTOLL@
+_GL_FUNCDECL_SYS (strtoll, long long,
+                  (const char *string, char **endptr, int base)
+                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoll, long long,
+                  (const char *string, char **endptr, int base));
+_GL_CXXALIASWARN (strtoll);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoll
+# if HAVE_RAW_DECL_STRTOLL
+_GL_WARN_ON_USE (strtoll, "strtoll is unportable - "
+                 "use gnulib module strtoll for portability");
+# endif
+#endif
+
+#if @GNULIB_STRTOULL@
+/* Parse an unsigned integer whose textual representation starts at STRING.
+   The integer is expected to be in base BASE (2 <= BASE <= 36); if BASE == 0,
+   it may be decimal or octal (with prefix "0") or hexadecimal (with prefix
+   "0x").
+   If ENDPTR is not NULL, the address of the first byte after the integer is
+   stored in *ENDPTR.
+   Upon overflow, the return value is ULLONG_MAX, and errno is set to
+   ERANGE.  */
+# if !@HAVE_STRTOULL@
+_GL_FUNCDECL_SYS (strtoull, unsigned long long,
+                  (const char *string, char **endptr, int base)
+                  _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (strtoull, unsigned long long,
+                  (const char *string, char **endptr, int base));
+_GL_CXXALIASWARN (strtoull);
+#elif defined GNULIB_POSIXCHECK
+# undef strtoull
+# if HAVE_RAW_DECL_STRTOULL
+_GL_WARN_ON_USE (strtoull, "strtoull is unportable - "
+                 "use gnulib module strtoull for portability");
+# endif
+#endif
+
+#if @GNULIB_UNLOCKPT@
+/* Unlock the slave side of the pseudo-terminal whose master side is specified
+   by FD, so that it can be opened.  */
+# if !@HAVE_UNLOCKPT@
+_GL_FUNCDECL_SYS (unlockpt, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (unlockpt, int, (int fd));
+_GL_CXXALIASWARN (unlockpt);
+#elif defined GNULIB_POSIXCHECK
+# undef unlockpt
+# if HAVE_RAW_DECL_UNLOCKPT
+_GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
+                 "use gnulib module unlockpt for portability");
+# endif
+#endif
+
+#if @GNULIB_UNSETENV@
+/* Remove the variable NAME from the environment.  */
+# if @REPLACE_UNSETENV@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unsetenv
+#   define unsetenv rpl_unsetenv
+#  endif
+_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
+# else
+#  if !@HAVE_DECL_UNSETENV@
+_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
+# endif
+# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
+_GL_CXXALIASWARN (unsetenv);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef unsetenv
+# if HAVE_RAW_DECL_UNSETENV
+_GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
+                 "use gnulib module unsetenv for portability");
+# endif
+#endif
+
+/* Convert a wide character to a multibyte character.  */
+#if @GNULIB_WCTOMB@
+# if @REPLACE_WCTOMB@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef wctomb
+#   define wctomb rpl_wctomb
+#  endif
+_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
+_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
+# else
+_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (wctomb);
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif /* _@GUARD_PREFIX@_STDLIB_H */
+#endif
diff --git a/lib/stpcpy.c b/lib/stpcpy.c
new file mode 100644 (file)
index 0000000..58265f0
--- /dev/null
@@ -0,0 +1,49 @@
+/* stpcpy.c -- copy a string and return pointer to end of new string
+   Copyright (C) 1992, 1995, 1997-1998, 2006, 2009-2020 Free Software
+   Foundation, Inc.
+
+   NOTE: The canonical source of this file is maintained with the GNU C Library.
+   Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3 of the License, or any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <string.h>
+
+#undef __stpcpy
+#ifdef _LIBC
+# undef stpcpy
+#endif
+
+#ifndef weak_alias
+# define __stpcpy stpcpy
+#endif
+
+/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST.  */
+char *
+__stpcpy (char *dest, const char *src)
+{
+  register char *d = dest;
+  register const char *s = src;
+
+  do
+    *d++ = *s;
+  while (*s++ != '\0');
+
+  return d - 1;
+}
+#ifdef weak_alias
+weak_alias (__stpcpy, stpcpy)
+#endif
diff --git a/lib/strerror-override.c b/lib/strerror-override.c
new file mode 100644 (file)
index 0000000..61b7689
--- /dev/null
@@ -0,0 +1,302 @@
+/* strerror-override.c --- POSIX compatible system error routine
+
+   Copyright (C) 2010-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2010.  */
+
+#include <config.h>
+
+#include "strerror-override.h"
+
+#include <errno.h>
+
+#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+# if HAVE_WINSOCK2_H
+#  include <winsock2.h>
+# endif
+#endif
+
+/* If ERRNUM maps to an errno value defined by gnulib, return a string
+   describing the error.  Otherwise return NULL.  */
+const char *
+strerror_override (int errnum)
+{
+  /* These error messages are taken from glibc/sysdeps/gnu/errlist.c.  */
+  switch (errnum)
+    {
+#if REPLACE_STRERROR_0
+    case 0:
+      return "Success";
+#endif
+
+#if GNULIB_defined_ESOCK /* native Windows platforms with older <errno.h> */
+    case EINPROGRESS:
+      return "Operation now in progress";
+    case EALREADY:
+      return "Operation already in progress";
+    case ENOTSOCK:
+      return "Socket operation on non-socket";
+    case EDESTADDRREQ:
+      return "Destination address required";
+    case EMSGSIZE:
+      return "Message too long";
+    case EPROTOTYPE:
+      return "Protocol wrong type for socket";
+    case ENOPROTOOPT:
+      return "Protocol not available";
+    case EPROTONOSUPPORT:
+      return "Protocol not supported";
+    case EOPNOTSUPP:
+      return "Operation not supported";
+    case EAFNOSUPPORT:
+      return "Address family not supported by protocol";
+    case EADDRINUSE:
+      return "Address already in use";
+    case EADDRNOTAVAIL:
+      return "Cannot assign requested address";
+    case ENETDOWN:
+      return "Network is down";
+    case ENETUNREACH:
+      return "Network is unreachable";
+    case ECONNRESET:
+      return "Connection reset by peer";
+    case ENOBUFS:
+      return "No buffer space available";
+    case EISCONN:
+      return "Transport endpoint is already connected";
+    case ENOTCONN:
+      return "Transport endpoint is not connected";
+    case ETIMEDOUT:
+      return "Connection timed out";
+    case ECONNREFUSED:
+      return "Connection refused";
+    case ELOOP:
+      return "Too many levels of symbolic links";
+    case EHOSTUNREACH:
+      return "No route to host";
+    case EWOULDBLOCK:
+      return "Operation would block";
+#endif
+#if GNULIB_defined_ESTREAMS /* native Windows platforms with older <errno.h> */
+    case ETXTBSY:
+      return "Text file busy";
+    case ENODATA:
+      return "No data available";
+    case ENOSR:
+      return "Out of streams resources";
+    case ENOSTR:
+      return "Device not a stream";
+    case ETIME:
+      return "Timer expired";
+    case EOTHER:
+      return "Other error";
+#endif
+#if GNULIB_defined_EWINSOCK /* native Windows platforms */
+    case ESOCKTNOSUPPORT:
+      return "Socket type not supported";
+    case EPFNOSUPPORT:
+      return "Protocol family not supported";
+    case ESHUTDOWN:
+      return "Cannot send after transport endpoint shutdown";
+    case ETOOMANYREFS:
+      return "Too many references: cannot splice";
+    case EHOSTDOWN:
+      return "Host is down";
+    case EPROCLIM:
+      return "Too many processes";
+    case EUSERS:
+      return "Too many users";
+    case EDQUOT:
+      return "Disk quota exceeded";
+    case ESTALE:
+      return "Stale NFS file handle";
+    case EREMOTE:
+      return "Object is remote";
+# if HAVE_WINSOCK2_H
+      /* WSA_INVALID_HANDLE maps to EBADF */
+      /* WSA_NOT_ENOUGH_MEMORY maps to ENOMEM */
+      /* WSA_INVALID_PARAMETER maps to EINVAL */
+    case WSA_OPERATION_ABORTED:
+      return "Overlapped operation aborted";
+    case WSA_IO_INCOMPLETE:
+      return "Overlapped I/O event object not in signaled state";
+    case WSA_IO_PENDING:
+      return "Overlapped operations will complete later";
+      /* WSAEINTR maps to EINTR */
+      /* WSAEBADF maps to EBADF */
+      /* WSAEACCES maps to EACCES */
+      /* WSAEFAULT maps to EFAULT */
+      /* WSAEINVAL maps to EINVAL */
+      /* WSAEMFILE maps to EMFILE */
+      /* WSAEWOULDBLOCK maps to EWOULDBLOCK */
+      /* WSAEINPROGRESS maps to EINPROGRESS */
+      /* WSAEALREADY maps to EALREADY */
+      /* WSAENOTSOCK maps to ENOTSOCK */
+      /* WSAEDESTADDRREQ maps to EDESTADDRREQ */
+      /* WSAEMSGSIZE maps to EMSGSIZE */
+      /* WSAEPROTOTYPE maps to EPROTOTYPE */
+      /* WSAENOPROTOOPT maps to ENOPROTOOPT */
+      /* WSAEPROTONOSUPPORT maps to EPROTONOSUPPORT */
+      /* WSAESOCKTNOSUPPORT is ESOCKTNOSUPPORT */
+      /* WSAEOPNOTSUPP maps to EOPNOTSUPP */
+      /* WSAEPFNOSUPPORT is EPFNOSUPPORT */
+      /* WSAEAFNOSUPPORT maps to EAFNOSUPPORT */
+      /* WSAEADDRINUSE maps to EADDRINUSE */
+      /* WSAEADDRNOTAVAIL maps to EADDRNOTAVAIL */
+      /* WSAENETDOWN maps to ENETDOWN */
+      /* WSAENETUNREACH maps to ENETUNREACH */
+      /* WSAENETRESET maps to ENETRESET */
+      /* WSAECONNABORTED maps to ECONNABORTED */
+      /* WSAECONNRESET maps to ECONNRESET */
+      /* WSAENOBUFS maps to ENOBUFS */
+      /* WSAEISCONN maps to EISCONN */
+      /* WSAENOTCONN maps to ENOTCONN */
+      /* WSAESHUTDOWN is ESHUTDOWN */
+      /* WSAETOOMANYREFS is ETOOMANYREFS */
+      /* WSAETIMEDOUT maps to ETIMEDOUT */
+      /* WSAECONNREFUSED maps to ECONNREFUSED */
+      /* WSAELOOP maps to ELOOP */
+      /* WSAENAMETOOLONG maps to ENAMETOOLONG */
+      /* WSAEHOSTDOWN is EHOSTDOWN */
+      /* WSAEHOSTUNREACH maps to EHOSTUNREACH */
+      /* WSAENOTEMPTY maps to ENOTEMPTY */
+      /* WSAEPROCLIM is EPROCLIM */
+      /* WSAEUSERS is EUSERS */
+      /* WSAEDQUOT is EDQUOT */
+      /* WSAESTALE is ESTALE */
+      /* WSAEREMOTE is EREMOTE */
+    case WSASYSNOTREADY:
+      return "Network subsystem is unavailable";
+    case WSAVERNOTSUPPORTED:
+      return "Winsock.dll version out of range";
+    case WSANOTINITIALISED:
+      return "Successful WSAStartup not yet performed";
+    case WSAEDISCON:
+      return "Graceful shutdown in progress";
+    case WSAENOMORE: case WSA_E_NO_MORE:
+      return "No more results";
+    case WSAECANCELLED: case WSA_E_CANCELLED:
+      return "Call was canceled";
+    case WSAEINVALIDPROCTABLE:
+      return "Procedure call table is invalid";
+    case WSAEINVALIDPROVIDER:
+      return "Service provider is invalid";
+    case WSAEPROVIDERFAILEDINIT:
+      return "Service provider failed to initialize";
+    case WSASYSCALLFAILURE:
+      return "System call failure";
+    case WSASERVICE_NOT_FOUND:
+      return "Service not found";
+    case WSATYPE_NOT_FOUND:
+      return "Class type not found";
+    case WSAEREFUSED:
+      return "Database query was refused";
+    case WSAHOST_NOT_FOUND:
+      return "Host not found";
+    case WSATRY_AGAIN:
+      return "Nonauthoritative host not found";
+    case WSANO_RECOVERY:
+      return "Nonrecoverable error";
+    case WSANO_DATA:
+      return "Valid name, no data record of requested type";
+      /* WSA_QOS_* omitted */
+# endif
+#endif
+
+#if GNULIB_defined_ENOMSG
+    case ENOMSG:
+      return "No message of desired type";
+#endif
+
+#if GNULIB_defined_EIDRM
+    case EIDRM:
+      return "Identifier removed";
+#endif
+
+#if GNULIB_defined_ENOLINK
+    case ENOLINK:
+      return "Link has been severed";
+#endif
+
+#if GNULIB_defined_EPROTO
+    case EPROTO:
+      return "Protocol error";
+#endif
+
+#if GNULIB_defined_EMULTIHOP
+    case EMULTIHOP:
+      return "Multihop attempted";
+#endif
+
+#if GNULIB_defined_EBADMSG
+    case EBADMSG:
+      return "Bad message";
+#endif
+
+#if GNULIB_defined_EOVERFLOW
+    case EOVERFLOW:
+      return "Value too large for defined data type";
+#endif
+
+#if GNULIB_defined_ENOTSUP
+    case ENOTSUP:
+      return "Not supported";
+#endif
+
+#if GNULIB_defined_ENETRESET
+    case ENETRESET:
+      return "Network dropped connection on reset";
+#endif
+
+#if GNULIB_defined_ECONNABORTED
+    case ECONNABORTED:
+      return "Software caused connection abort";
+#endif
+
+#if GNULIB_defined_ESTALE
+    case ESTALE:
+      return "Stale NFS file handle";
+#endif
+
+#if GNULIB_defined_EDQUOT
+    case EDQUOT:
+      return "Disk quota exceeded";
+#endif
+
+#if GNULIB_defined_ECANCELED
+    case ECANCELED:
+      return "Operation canceled";
+#endif
+
+#if GNULIB_defined_EOWNERDEAD
+    case EOWNERDEAD:
+      return "Owner died";
+#endif
+
+#if GNULIB_defined_ENOTRECOVERABLE
+    case ENOTRECOVERABLE:
+      return "State not recoverable";
+#endif
+
+#if GNULIB_defined_EILSEQ
+    case EILSEQ:
+      return "Invalid or incomplete multibyte or wide character";
+#endif
+
+    default:
+      return NULL;
+    }
+}
diff --git a/lib/strerror-override.h b/lib/strerror-override.h
new file mode 100644 (file)
index 0000000..062f51c
--- /dev/null
@@ -0,0 +1,56 @@
+/* strerror-override.h --- POSIX compatible system error routine
+
+   Copyright (C) 2010-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _GL_STRERROR_OVERRIDE_H
+# define _GL_STRERROR_OVERRIDE_H
+
+# include <errno.h>
+# include <stddef.h>
+
+/* Reasonable buffer size that should never trigger ERANGE; if this
+   proves too small, we intentionally abort(), to remind us to fix
+   this value.  */
+# define STACKBUF_LEN 256
+
+/* If ERRNUM maps to an errno value defined by gnulib, return a string
+   describing the error.  Otherwise return NULL.  */
+# if REPLACE_STRERROR_0 \
+     || GNULIB_defined_ESOCK \
+     || GNULIB_defined_ESTREAMS \
+     || GNULIB_defined_EWINSOCK \
+     || GNULIB_defined_ENOMSG \
+     || GNULIB_defined_EIDRM \
+     || GNULIB_defined_ENOLINK \
+     || GNULIB_defined_EPROTO \
+     || GNULIB_defined_EMULTIHOP \
+     || GNULIB_defined_EBADMSG \
+     || GNULIB_defined_EOVERFLOW \
+     || GNULIB_defined_ENOTSUP \
+     || GNULIB_defined_ENETRESET \
+     || GNULIB_defined_ECONNABORTED \
+     || GNULIB_defined_ESTALE \
+     || GNULIB_defined_EDQUOT \
+     || GNULIB_defined_ECANCELED \
+     || GNULIB_defined_EOWNERDEAD \
+     || GNULIB_defined_ENOTRECOVERABLE \
+     || GNULIB_defined_EILSEQ
+extern const char *strerror_override (int errnum) _GL_ATTRIBUTE_CONST;
+# else
+#  define strerror_override(ignored) NULL
+# endif
+
+#endif /* _GL_STRERROR_OVERRIDE_H */
diff --git a/lib/strerror.c b/lib/strerror.c
new file mode 100644 (file)
index 0000000..1a53a8b
--- /dev/null
@@ -0,0 +1,71 @@
+/* strerror.c --- POSIX compatible system error routine
+
+   Copyright (C) 2007-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include <string.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "intprops.h"
+#include "strerror-override.h"
+#include "verify.h"
+
+/* Use the system functions, not the gnulib overrides in this file.  */
+#undef sprintf
+
+char *
+strerror (int n)
+#undef strerror
+{
+  static char buf[STACKBUF_LEN];
+  size_t len;
+
+  /* Cast away const, due to the historical signature of strerror;
+     callers should not be modifying the string.  */
+  const char *msg = strerror_override (n);
+  if (msg)
+    return (char *) msg;
+
+  msg = strerror (n);
+
+  /* Our strerror_r implementation might use the system's strerror
+     buffer, so all other clients of strerror have to see the error
+     copied into a buffer that we manage.  This is not thread-safe,
+     even if the system strerror is, but portable programs shouldn't
+     be using strerror if they care about thread-safety.  */
+  if (!msg || !*msg)
+    {
+      static char const fmt[] = "Unknown error %d";
+      verify (sizeof buf >= sizeof (fmt) + INT_STRLEN_BOUND (n));
+      sprintf (buf, fmt, n);
+      errno = EINVAL;
+      return buf;
+    }
+
+  /* Fix STACKBUF_LEN if this ever aborts.  */
+  len = strlen (msg);
+  if (sizeof buf <= len)
+    abort ();
+
+  memcpy (buf, msg, len + 1);
+  return buf;
+}
diff --git a/lib/string.in.h b/lib/string.in.h
new file mode 100644 (file)
index 0000000..2c04e5f
--- /dev/null
@@ -0,0 +1,1067 @@
+/* A GNU-like <string.h>.
+
+   Copyright (C) 1995-1996, 2001-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _GL_ALREADY_INCLUDING_STRING_H
+/* Special invocation convention:
+   - On OS X/NetBSD we have a sequence of nested includes
+       <string.h> -> <strings.h> -> "string.h"
+     In this situation system _chk variants due to -D_FORTIFY_SOURCE
+     might be used after any replacements defined here.  */
+
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+
+#define _GL_ALREADY_INCLUDING_STRING_H
+
+/* The include_next requires a split double-inclusion guard.  */
+#@INCLUDE_NEXT@ @NEXT_STRING_H@
+
+#undef _GL_ALREADY_INCLUDING_STRING_H
+
+#ifndef _@GUARD_PREFIX@_STRING_H
+#define _@GUARD_PREFIX@_STRING_H
+
+/* NetBSD 5.0 mis-defines NULL.  */
+#include <stddef.h>
+
+/* MirBSD defines mbslen as a macro.  */
+#if @GNULIB_MBSLEN@ && defined __MirBSD__
+# include <wchar.h>
+#endif
+
+/* The __attribute__ feature is available in gcc versions 2.5 and later.
+   The attribute __pure__ was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* NetBSD 5.0 declares strsignal in <unistd.h>, not in <string.h>.  */
+/* But in any case avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_STRSIGNAL@ || defined GNULIB_POSIXCHECK) && defined __NetBSD__ \
+    && ! defined __GLIBC__
+# include <unistd.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Clear a block of memory.  The compiler will not delete a call to
+   this function, even if the block is dead after the call.  */
+#if @GNULIB_EXPLICIT_BZERO@
+# if ! @HAVE_EXPLICIT_BZERO@
+_GL_FUNCDECL_SYS (explicit_bzero, void,
+                  (void *__dest, size_t __n) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (explicit_bzero, void, (void *__dest, size_t __n));
+_GL_CXXALIASWARN (explicit_bzero);
+#elif defined GNULIB_POSIXCHECK
+# undef explicit_bzero
+# if HAVE_RAW_DECL_EXPLICIT_BZERO
+_GL_WARN_ON_USE (explicit_bzero, "explicit_bzero is unportable - "
+                 "use gnulib module explicit_bzero for portability");
+# endif
+#endif
+
+/* Find the index of the least-significant set bit.  */
+#if @GNULIB_FFSL@
+# if !@HAVE_FFSL@
+_GL_FUNCDECL_SYS (ffsl, int, (long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsl, int, (long int i));
+_GL_CXXALIASWARN (ffsl);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsl
+# if HAVE_RAW_DECL_FFSL
+_GL_WARN_ON_USE (ffsl, "ffsl is not portable - use the ffsl module");
+# endif
+#endif
+
+
+/* Find the index of the least-significant set bit.  */
+#if @GNULIB_FFSLL@
+# if !@HAVE_FFSLL@
+_GL_FUNCDECL_SYS (ffsll, int, (long long int i));
+# endif
+_GL_CXXALIAS_SYS (ffsll, int, (long long int i));
+_GL_CXXALIASWARN (ffsll);
+#elif defined GNULIB_POSIXCHECK
+# undef ffsll
+# if HAVE_RAW_DECL_FFSLL
+_GL_WARN_ON_USE (ffsll, "ffsll is not portable - use the ffsll module");
+# endif
+#endif
+
+
+/* Return the first instance of C within N bytes of S, or NULL.  */
+#if @GNULIB_MEMCHR@
+# if @REPLACE_MEMCHR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define memchr rpl_memchr
+#  endif
+_GL_FUNCDECL_RPL (memchr, void *, (void const *__s, int __c, size_t __n)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (memchr, void *, (void const *__s, int __c, size_t __n));
+# else
+#  if ! @HAVE_MEMCHR@
+_GL_FUNCDECL_SYS (memchr, void *, (void const *__s, int __c, size_t __n)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+#  endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C" { const void * std::memchr (const void *, int, size_t); }
+       extern "C++" { void * std::memchr (void *, int, size_t); }  */
+_GL_CXXALIAS_SYS_CAST2 (memchr,
+                        void *, (void const *__s, int __c, size_t __n),
+                        void const *, (void const *__s, int __c, size_t __n));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memchr, void *, (void *__s, int __c, size_t __n));
+_GL_CXXALIASWARN1 (memchr, void const *,
+                   (void const *__s, int __c, size_t __n));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (memchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memchr
+/* Assume memchr is always declared.  */
+_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
+                 "use gnulib module memchr for portability" );
+#endif
+
+/* Return the first occurrence of NEEDLE in HAYSTACK.  */
+#if @GNULIB_MEMMEM@
+# if @REPLACE_MEMMEM@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define memmem rpl_memmem
+#  endif
+_GL_FUNCDECL_RPL (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len));
+# else
+#  if ! @HAVE_DECL_MEMMEM@
+_GL_FUNCDECL_SYS (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 3)));
+#  endif
+_GL_CXXALIAS_SYS (memmem, void *,
+                  (void const *__haystack, size_t __haystack_len,
+                   void const *__needle, size_t __needle_len));
+# endif
+_GL_CXXALIASWARN (memmem);
+#elif defined GNULIB_POSIXCHECK
+# undef memmem
+# if HAVE_RAW_DECL_MEMMEM
+_GL_WARN_ON_USE (memmem, "memmem is unportable and often quadratic - "
+                 "use gnulib module memmem-simple for portability, "
+                 "and module memmem for speed" );
+# endif
+#endif
+
+/* Copy N bytes of SRC to DEST, return pointer to bytes after the
+   last written byte.  */
+#if @GNULIB_MEMPCPY@
+# if ! @HAVE_MEMPCPY@
+_GL_FUNCDECL_SYS (mempcpy, void *,
+                  (void *restrict __dest, void const *restrict __src,
+                   size_t __n)
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (mempcpy, void *,
+                  (void *restrict __dest, void const *restrict __src,
+                   size_t __n));
+_GL_CXXALIASWARN (mempcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef mempcpy
+# if HAVE_RAW_DECL_MEMPCPY
+_GL_WARN_ON_USE (mempcpy, "mempcpy is unportable - "
+                 "use gnulib module mempcpy for portability");
+# endif
+#endif
+
+/* Search backwards through a block for a byte (specified as an int).  */
+#if @GNULIB_MEMRCHR@
+# if ! @HAVE_DECL_MEMRCHR@
+_GL_FUNCDECL_SYS (memrchr, void *, (void const *, int, size_t)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+# endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const void * std::memrchr (const void *, int, size_t); }
+       extern "C++" { void * std::memrchr (void *, int, size_t); }  */
+_GL_CXXALIAS_SYS_CAST2 (memrchr,
+                        void *, (void const *, int, size_t),
+                        void const *, (void const *, int, size_t));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (memrchr, void *, (void *, int, size_t));
+_GL_CXXALIASWARN1 (memrchr, void const *, (void const *, int, size_t));
+# else
+_GL_CXXALIASWARN (memrchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef memrchr
+# if HAVE_RAW_DECL_MEMRCHR
+_GL_WARN_ON_USE (memrchr, "memrchr is unportable - "
+                 "use gnulib module memrchr for portability");
+# endif
+#endif
+
+/* Find the first occurrence of C in S.  More efficient than
+   memchr(S,C,N), at the expense of undefined behavior if C does not
+   occur within N bytes.  */
+#if @GNULIB_RAWMEMCHR@
+# if ! @HAVE_RAWMEMCHR@
+_GL_FUNCDECL_SYS (rawmemchr, void *, (void const *__s, int __c_in)
+                                     _GL_ATTRIBUTE_PURE
+                                     _GL_ARG_NONNULL ((1)));
+# endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const void * std::rawmemchr (const void *, int); }
+       extern "C++" { void * std::rawmemchr (void *, int); }  */
+_GL_CXXALIAS_SYS_CAST2 (rawmemchr,
+                        void *, (void const *__s, int __c_in),
+                        void const *, (void const *__s, int __c_in));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (rawmemchr, void *, (void *__s, int __c_in));
+_GL_CXXALIASWARN1 (rawmemchr, void const *, (void const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (rawmemchr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef rawmemchr
+# if HAVE_RAW_DECL_RAWMEMCHR
+_GL_WARN_ON_USE (rawmemchr, "rawmemchr is unportable - "
+                 "use gnulib module rawmemchr for portability");
+# endif
+#endif
+
+/* Copy SRC to DST, returning the address of the terminating '\0' in DST.  */
+#if @GNULIB_STPCPY@
+# if ! @HAVE_STPCPY@
+_GL_FUNCDECL_SYS (stpcpy, char *,
+                  (char *restrict __dst, char const *restrict __src)
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (stpcpy, char *,
+                  (char *restrict __dst, char const *restrict __src));
+_GL_CXXALIASWARN (stpcpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpcpy
+# if HAVE_RAW_DECL_STPCPY
+_GL_WARN_ON_USE (stpcpy, "stpcpy is unportable - "
+                 "use gnulib module stpcpy for portability");
+# endif
+#endif
+
+/* Copy no more than N bytes of SRC to DST, returning a pointer past the
+   last non-NUL byte written into DST.  */
+#if @GNULIB_STPNCPY@
+# if @REPLACE_STPNCPY@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef stpncpy
+#   define stpncpy rpl_stpncpy
+#  endif
+_GL_FUNCDECL_RPL (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n));
+# else
+#  if ! @HAVE_STPNCPY@
+_GL_FUNCDECL_SYS (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (stpncpy, char *,
+                  (char *restrict __dst, char const *restrict __src,
+                   size_t __n));
+# endif
+_GL_CXXALIASWARN (stpncpy);
+#elif defined GNULIB_POSIXCHECK
+# undef stpncpy
+# if HAVE_RAW_DECL_STPNCPY
+_GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
+                 "use gnulib module stpncpy for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strchr() does not work with multibyte strings if the locale encoding is
+   GB18030 and the character to be searched is a digit.  */
+# undef strchr
+/* Assume strchr is always declared.  */
+_GL_WARN_ON_USE (strchr, "strchr cannot work correctly on character strings "
+                 "in some multibyte locales - "
+                 "use mbschr if you care about internationalization");
+#endif
+
+/* Find the first occurrence of C in S or the final NUL byte.  */
+#if @GNULIB_STRCHRNUL@
+# if @REPLACE_STRCHRNUL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strchrnul rpl_strchrnul
+#  endif
+_GL_FUNCDECL_RPL (strchrnul, char *, (const char *__s, int __c_in)
+                                     _GL_ATTRIBUTE_PURE
+                                     _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strchrnul, char *,
+                  (const char *str, int ch));
+# else
+#  if ! @HAVE_STRCHRNUL@
+_GL_FUNCDECL_SYS (strchrnul, char *, (char const *__s, int __c_in)
+                                     _GL_ATTRIBUTE_PURE
+                                     _GL_ARG_NONNULL ((1)));
+#  endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const char * std::strchrnul (const char *, int); }
+       extern "C++" { char * std::strchrnul (char *, int); }  */
+_GL_CXXALIAS_SYS_CAST2 (strchrnul,
+                        char *, (char const *__s, int __c_in),
+                        char const *, (char const *__s, int __c_in));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strchrnul, char *, (char *__s, int __c_in));
+_GL_CXXALIASWARN1 (strchrnul, char const *, (char const *__s, int __c_in));
+# else
+_GL_CXXALIASWARN (strchrnul);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strchrnul
+# if HAVE_RAW_DECL_STRCHRNUL
+_GL_WARN_ON_USE (strchrnul, "strchrnul is unportable - "
+                 "use gnulib module strchrnul for portability");
+# endif
+#endif
+
+/* Duplicate S, returning an identical malloc'd string.  */
+#if @GNULIB_STRDUP@
+# if @REPLACE_STRDUP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strdup
+#   define strdup rpl_strdup
+#  endif
+_GL_FUNCDECL_RPL (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strdup, char *, (char const *__s));
+# else
+#  if defined __cplusplus && defined GNULIB_NAMESPACE && defined strdup
+    /* strdup exists as a function and as a macro.  Get rid of the macro.  */
+#   undef strdup
+#  endif
+#  if !(@HAVE_DECL_STRDUP@ || defined strdup)
+_GL_FUNCDECL_SYS (strdup, char *, (char const *__s) _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strdup, char *, (char const *__s));
+# endif
+_GL_CXXALIASWARN (strdup);
+#elif defined GNULIB_POSIXCHECK
+# undef strdup
+# if HAVE_RAW_DECL_STRDUP
+_GL_WARN_ON_USE (strdup, "strdup is unportable - "
+                 "use gnulib module strdup for portability");
+# endif
+#endif
+
+/* Append no more than N characters from SRC onto DEST.  */
+#if @GNULIB_STRNCAT@
+# if @REPLACE_STRNCAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strncat
+#   define strncat rpl_strncat
+#  endif
+_GL_FUNCDECL_RPL (strncat, char *, (char *dest, const char *src, size_t n)
+                                   _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strncat, char *, (char *dest, const char *src, size_t n));
+# else
+_GL_CXXALIAS_SYS (strncat, char *, (char *dest, const char *src, size_t n));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strncat);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strncat
+# if HAVE_RAW_DECL_STRNCAT
+_GL_WARN_ON_USE (strncat, "strncat is unportable - "
+                 "use gnulib module strncat for portability");
+# endif
+#endif
+
+/* Return a newly allocated copy of at most N bytes of STRING.  */
+#if @GNULIB_STRNDUP@
+# if @REPLACE_STRNDUP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strndup
+#   define strndup rpl_strndup
+#  endif
+_GL_FUNCDECL_RPL (strndup, char *, (char const *__s, size_t __n)
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strndup, char *, (char const *__s, size_t __n));
+# else
+#  if ! @HAVE_DECL_STRNDUP@
+_GL_FUNCDECL_SYS (strndup, char *, (char const *__s, size_t __n)
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strndup, char *, (char const *__s, size_t __n));
+# endif
+_GL_CXXALIASWARN (strndup);
+#elif defined GNULIB_POSIXCHECK
+# undef strndup
+# if HAVE_RAW_DECL_STRNDUP
+_GL_WARN_ON_USE (strndup, "strndup is unportable - "
+                 "use gnulib module strndup for portability");
+# endif
+#endif
+
+/* Find the length (number of bytes) of STRING, but scan at most
+   MAXLEN bytes.  If no '\0' terminator is found in that many bytes,
+   return MAXLEN.  */
+#if @GNULIB_STRNLEN@
+# if @REPLACE_STRNLEN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strnlen
+#   define strnlen rpl_strnlen
+#  endif
+_GL_FUNCDECL_RPL (strnlen, size_t, (char const *__s, size_t __maxlen)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (strnlen, size_t, (char const *__s, size_t __maxlen));
+# else
+#  if ! @HAVE_DECL_STRNLEN@
+_GL_FUNCDECL_SYS (strnlen, size_t, (char const *__s, size_t __maxlen)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (strnlen, size_t, (char const *__s, size_t __maxlen));
+# endif
+_GL_CXXALIASWARN (strnlen);
+#elif defined GNULIB_POSIXCHECK
+# undef strnlen
+# if HAVE_RAW_DECL_STRNLEN
+_GL_WARN_ON_USE (strnlen, "strnlen is unportable - "
+                 "use gnulib module strnlen for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strcspn() assumes the second argument is a list of single-byte characters.
+   Even in this simple case, it does not work with multibyte strings if the
+   locale encoding is GB18030 and one of the characters to be searched is a
+   digit.  */
+# undef strcspn
+/* Assume strcspn is always declared.  */
+_GL_WARN_ON_USE (strcspn, "strcspn cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbscspn if you care about internationalization");
+#endif
+
+/* Find the first occurrence in S of any character in ACCEPT.  */
+#if @GNULIB_STRPBRK@
+# if ! @HAVE_STRPBRK@
+_GL_FUNCDECL_SYS (strpbrk, char *, (char const *__s, char const *__accept)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+# endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C" { const char * strpbrk (const char *, const char *); }
+       extern "C++" { char * strpbrk (char *, const char *); }  */
+_GL_CXXALIAS_SYS_CAST2 (strpbrk,
+                        char *, (char const *__s, char const *__accept),
+                        const char *, (char const *__s, char const *__accept));
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strpbrk, char *, (char *__s, char const *__accept));
+_GL_CXXALIASWARN1 (strpbrk, char const *,
+                   (char const *__s, char const *__accept));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strpbrk);
+# endif
+# if defined GNULIB_POSIXCHECK
+/* strpbrk() assumes the second argument is a list of single-byte characters.
+   Even in this simple case, it does not work with multibyte strings if the
+   locale encoding is GB18030 and one of the characters to be searched is a
+   digit.  */
+#  undef strpbrk
+_GL_WARN_ON_USE (strpbrk, "strpbrk cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbspbrk if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strpbrk
+# if HAVE_RAW_DECL_STRPBRK
+_GL_WARN_ON_USE (strpbrk, "strpbrk is unportable - "
+                 "use gnulib module strpbrk for portability");
+# endif
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strspn() assumes the second argument is a list of single-byte characters.
+   Even in this simple case, it cannot work with multibyte strings.  */
+# undef strspn
+/* Assume strspn is always declared.  */
+_GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbsspn if you care about internationalization");
+#endif
+
+#if defined GNULIB_POSIXCHECK
+/* strrchr() does not work with multibyte strings if the locale encoding is
+   GB18030 and the character to be searched is a digit.  */
+# undef strrchr
+/* Assume strrchr is always declared.  */
+_GL_WARN_ON_USE (strrchr, "strrchr cannot work correctly on character strings "
+                 "in some multibyte locales - "
+                 "use mbsrchr if you care about internationalization");
+#endif
+
+/* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
+   If one is found, overwrite it with a NUL, and advance *STRINGP
+   to point to the next char after it.  Otherwise, set *STRINGP to NULL.
+   If *STRINGP was already NULL, nothing happens.
+   Return the old value of *STRINGP.
+
+   This is a variant of strtok() that is multithread-safe and supports
+   empty fields.
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+   Caveat: It doesn't work with multibyte strings unless all of the delimiter
+           characters are ASCII characters < 0x30.
+
+   See also strtok_r().  */
+#if @GNULIB_STRSEP@
+# if ! @HAVE_STRSEP@
+_GL_FUNCDECL_SYS (strsep, char *,
+                  (char **restrict __stringp, char const *restrict __delim)
+                  _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strsep, char *,
+                  (char **restrict __stringp, char const *restrict __delim));
+_GL_CXXALIASWARN (strsep);
+# if defined GNULIB_POSIXCHECK
+#  undef strsep
+_GL_WARN_ON_USE (strsep, "strsep cannot work correctly on character strings "
+                 "in multibyte locales - "
+                 "use mbssep if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strsep
+# if HAVE_RAW_DECL_STRSEP
+_GL_WARN_ON_USE (strsep, "strsep is unportable - "
+                 "use gnulib module strsep for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSTR@
+# if @REPLACE_STRSTR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strstr rpl_strstr
+#  endif
+_GL_FUNCDECL_RPL (strstr, char *, (const char *haystack, const char *needle)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strstr, char *, (const char *haystack, const char *needle));
+# else
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const char * strstr (const char *, const char *); }
+       extern "C++" { char * strstr (char *, const char *); }  */
+_GL_CXXALIAS_SYS_CAST2 (strstr,
+                        char *, (const char *haystack, const char *needle),
+                        const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strstr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strstr, const char *,
+                   (const char *haystack, const char *needle));
+# elif __GLIBC__ >= 2
+_GL_CXXALIASWARN (strstr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strstr() does not work with multibyte strings if the locale encoding is
+   different from UTF-8:
+   POSIX says that it operates on "strings", and "string" in POSIX is defined
+   as a sequence of bytes, not of characters.  */
+# undef strstr
+/* Assume strstr is always declared.  */
+_GL_WARN_ON_USE (strstr, "strstr is quadratic on many systems, and cannot "
+                 "work correctly on character strings in most "
+                 "multibyte locales - "
+                 "use mbsstr if you care about internationalization, "
+                 "or use strstr if you care about speed");
+#endif
+
+/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
+   comparison.  */
+#if @GNULIB_STRCASESTR@
+# if @REPLACE_STRCASESTR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strcasestr rpl_strcasestr
+#  endif
+_GL_FUNCDECL_RPL (strcasestr, char *,
+                  (const char *haystack, const char *needle)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (strcasestr, char *,
+                  (const char *haystack, const char *needle));
+# else
+#  if ! @HAVE_STRCASESTR@
+_GL_FUNCDECL_SYS (strcasestr, char *,
+                  (const char *haystack, const char *needle)
+                  _GL_ATTRIBUTE_PURE
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+  /* On some systems, this function is defined as an overloaded function:
+       extern "C++" { const char * strcasestr (const char *, const char *); }
+       extern "C++" { char * strcasestr (char *, const char *); }  */
+_GL_CXXALIAS_SYS_CAST2 (strcasestr,
+                        char *, (const char *haystack, const char *needle),
+                        const char *, (const char *haystack, const char *needle));
+# endif
+# if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 10) && !defined __UCLIBC__) \
+     && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+_GL_CXXALIASWARN1 (strcasestr, char *, (char *haystack, const char *needle));
+_GL_CXXALIASWARN1 (strcasestr, const char *,
+                   (const char *haystack, const char *needle));
+# else
+_GL_CXXALIASWARN (strcasestr);
+# endif
+#elif defined GNULIB_POSIXCHECK
+/* strcasestr() does not work with multibyte strings:
+   It is a glibc extension, and glibc implements it only for unibyte
+   locales.  */
+# undef strcasestr
+# if HAVE_RAW_DECL_STRCASESTR
+_GL_WARN_ON_USE (strcasestr, "strcasestr does work correctly on character "
+                 "strings in multibyte locales - "
+                 "use mbscasestr if you care about "
+                 "internationalization, or use c-strcasestr if you want "
+                 "a locale independent function");
+# endif
+#endif
+
+/* Parse S into tokens separated by characters in DELIM.
+   If S is NULL, the saved pointer in SAVE_PTR is used as
+   the next starting point.  For example:
+        char s[] = "-abc-=-def";
+        char *sp;
+        x = strtok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
+        x = strtok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
+        x = strtok_r(NULL, "=", &sp);   // x = NULL
+                // s = "abc\0-def\0"
+
+   This is a variant of strtok() that is multithread-safe.
+
+   For the POSIX documentation for this function, see:
+   https://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok.html
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+   Caveat: It doesn't work with multibyte strings unless all of the delimiter
+           characters are ASCII characters < 0x30.
+
+   See also strsep().  */
+#if @GNULIB_STRTOK_R@
+# if @REPLACE_STRTOK_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strtok_r
+#   define strtok_r rpl_strtok_r
+#  endif
+_GL_FUNCDECL_RPL (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr)
+                  _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr));
+# else
+#  if @UNDEFINE_STRTOK_R@ || defined GNULIB_POSIXCHECK
+#   undef strtok_r
+#  endif
+#  if ! @HAVE_DECL_STRTOK_R@
+_GL_FUNCDECL_SYS (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr)
+                  _GL_ARG_NONNULL ((2, 3)));
+#  endif
+_GL_CXXALIAS_SYS (strtok_r, char *,
+                  (char *restrict s, char const *restrict delim,
+                   char **restrict save_ptr));
+# endif
+_GL_CXXALIASWARN (strtok_r);
+# if defined GNULIB_POSIXCHECK
+_GL_WARN_ON_USE (strtok_r, "strtok_r cannot work correctly on character "
+                 "strings in multibyte locales - "
+                 "use mbstok_r if you care about internationalization");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strtok_r
+# if HAVE_RAW_DECL_STRTOK_R
+_GL_WARN_ON_USE (strtok_r, "strtok_r is unportable - "
+                 "use gnulib module strtok_r for portability");
+# endif
+#endif
+
+
+/* The following functions are not specified by POSIX.  They are gnulib
+   extensions.  */
+
+#if @GNULIB_MBSLEN@
+/* Return the number of multibyte characters in the character string STRING.
+   This considers multibyte characters, unlike strlen, which counts bytes.  */
+# ifdef __MirBSD__  /* MirBSD defines mbslen as a macro.  Override it.  */
+#  undef mbslen
+# endif
+# if @HAVE_MBSLEN@  /* AIX, OSF/1, MirBSD define mbslen already in libc.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbslen rpl_mbslen
+#  endif
+_GL_FUNCDECL_RPL (mbslen, size_t, (const char *string)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbslen, size_t, (const char *string));
+# else
+_GL_FUNCDECL_SYS (mbslen, size_t, (const char *string)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbslen, size_t, (const char *string));
+# endif
+_GL_CXXALIASWARN (mbslen);
+#endif
+
+#if @GNULIB_MBSNLEN@
+/* Return the number of multibyte characters in the character string starting
+   at STRING and ending at STRING + LEN.  */
+_GL_EXTERN_C size_t mbsnlen (const char *string, size_t len)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1));
+#endif
+
+#if @GNULIB_MBSCHR@
+/* Locate the first single-byte character C in the character string STRING,
+   and return a pointer to it.  Return NULL if C is not found in STRING.
+   Unlike strchr(), this function works correctly in multibyte locales with
+   encodings such as GB18030.  */
+# if defined __hpux
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbschr rpl_mbschr /* avoid collision with HP-UX function */
+#  endif
+_GL_FUNCDECL_RPL (mbschr, char *, (const char *string, int c)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbschr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbschr, char *, (const char *string, int c)
+                                  _GL_ATTRIBUTE_PURE
+                                  _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbschr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbschr);
+#endif
+
+#if @GNULIB_MBSRCHR@
+/* Locate the last single-byte character C in the character string STRING,
+   and return a pointer to it.  Return NULL if C is not found in STRING.
+   Unlike strrchr(), this function works correctly in multibyte locales with
+   encodings such as GB18030.  */
+# if defined __hpux || defined __INTERIX
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbsrchr rpl_mbsrchr /* avoid collision with system function */
+#  endif
+_GL_FUNCDECL_RPL (mbsrchr, char *, (const char *string, int c)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (mbsrchr, char *, (const char *string, int c));
+# else
+_GL_FUNCDECL_SYS (mbsrchr, char *, (const char *string, int c)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (mbsrchr, char *, (const char *string, int c));
+# endif
+_GL_CXXALIASWARN (mbsrchr);
+#endif
+
+#if @GNULIB_MBSSTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+   string HAYSTACK.  Return NULL if NEEDLE is not found in HAYSTACK.
+   Unlike strstr(), this function works correctly in multibyte locales with
+   encodings different from UTF-8.  */
+_GL_EXTERN_C char * mbsstr (const char *haystack, const char *needle)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASECMP@
+/* Compare the character strings S1 and S2, ignoring case, returning less than,
+   equal to or greater than zero if S1 is lexicographically less than, equal to
+   or greater than S2.
+   Note: This function may, in multibyte locales, return 0 for strings of
+   different lengths!
+   Unlike strcasecmp(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C int mbscasecmp (const char *s1, const char *s2)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSNCASECMP@
+/* Compare the initial segment of the character string S1 consisting of at most
+   N characters with the initial segment of the character string S2 consisting
+   of at most N characters, ignoring case, returning less than, equal to or
+   greater than zero if the initial segment of S1 is lexicographically less
+   than, equal to or greater than the initial segment of S2.
+   Note: This function may, in multibyte locales, return 0 for initial segments
+   of different lengths!
+   Unlike strncasecmp(), this function works correctly in multibyte locales.
+   But beware that N is not a byte count but a character count!  */
+_GL_EXTERN_C int mbsncasecmp (const char *s1, const char *s2, size_t n)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPCASECMP@
+/* Compare the initial segment of the character string STRING consisting of
+   at most mbslen (PREFIX) characters with the character string PREFIX,
+   ignoring case.  If the two match, return a pointer to the first byte
+   after this prefix in STRING.  Otherwise, return NULL.
+   Note: This function may, in multibyte locales, return non-NULL if STRING
+   is of smaller length than PREFIX!
+   Unlike strncasecmp(), this function works correctly in multibyte
+   locales.  */
+_GL_EXTERN_C char * mbspcasecmp (const char *string, const char *prefix)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCASESTR@
+/* Find the first occurrence of the character string NEEDLE in the character
+   string HAYSTACK, using case-insensitive comparison.
+   Note: This function may, in multibyte locales, return success even if
+   strlen (haystack) < strlen (needle) !
+   Unlike strcasestr(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C char * mbscasestr (const char *haystack, const char *needle)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSCSPN@
+/* Find the first occurrence in the character string STRING of any character
+   in the character string ACCEPT.  Return the number of bytes from the
+   beginning of the string to this occurrence, or to the end of the string
+   if none exists.
+   Unlike strcspn(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C size_t mbscspn (const char *string, const char *accept)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSPBRK@
+/* Find the first occurrence in the character string STRING of any character
+   in the character string ACCEPT.  Return the pointer to it, or NULL if none
+   exists.
+   Unlike strpbrk(), this function works correctly in multibyte locales.  */
+# if defined __hpux
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
+#  endif
+_GL_FUNCDECL_RPL (mbspbrk, char *, (const char *string, const char *accept)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (mbspbrk, char *, (const char *string, const char *accept));
+# else
+_GL_FUNCDECL_SYS (mbspbrk, char *, (const char *string, const char *accept)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_SYS (mbspbrk, char *, (const char *string, const char *accept));
+# endif
+_GL_CXXALIASWARN (mbspbrk);
+#endif
+
+#if @GNULIB_MBSSPN@
+/* Find the first occurrence in the character string STRING of any character
+   not in the character string REJECT.  Return the number of bytes from the
+   beginning of the string to this occurrence, or to the end of the string
+   if none exists.
+   Unlike strspn(), this function works correctly in multibyte locales.  */
+_GL_EXTERN_C size_t mbsspn (const char *string, const char *reject)
+     _GL_ATTRIBUTE_PURE
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSSEP@
+/* Search the next delimiter (multibyte character listed in the character
+   string DELIM) starting at the character string *STRINGP.
+   If one is found, overwrite it with a NUL, and advance *STRINGP to point
+   to the next multibyte character after it.  Otherwise, set *STRINGP to NULL.
+   If *STRINGP was already NULL, nothing happens.
+   Return the old value of *STRINGP.
+
+   This is a variant of mbstok_r() that supports empty fields.
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+
+   See also mbstok_r().  */
+_GL_EXTERN_C char * mbssep (char **stringp, const char *delim)
+     _GL_ARG_NONNULL ((1, 2));
+#endif
+
+#if @GNULIB_MBSTOK_R@
+/* Parse the character string STRING into tokens separated by characters in
+   the character string DELIM.
+   If STRING is NULL, the saved pointer in SAVE_PTR is used as
+   the next starting point.  For example:
+        char s[] = "-abc-=-def";
+        char *sp;
+        x = mbstok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
+        x = mbstok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
+        x = mbstok_r(NULL, "=", &sp);   // x = NULL
+                // s = "abc\0-def\0"
+
+   Caveat: It modifies the original string.
+   Caveat: These functions cannot be used on constant strings.
+   Caveat: The identity of the delimiting character is lost.
+
+   See also mbssep().  */
+_GL_EXTERN_C char * mbstok_r (char *string, const char *delim, char **save_ptr)
+     _GL_ARG_NONNULL ((2, 3));
+#endif
+
+/* Map any int, typically from errno, into an error message.  */
+#if @GNULIB_STRERROR@
+# if @REPLACE_STRERROR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerror
+#   define strerror rpl_strerror
+#  endif
+_GL_FUNCDECL_RPL (strerror, char *, (int));
+_GL_CXXALIAS_RPL (strerror, char *, (int));
+# else
+_GL_CXXALIAS_SYS (strerror, char *, (int));
+# endif
+# if __GLIBC__ >= 2
+_GL_CXXALIASWARN (strerror);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror
+/* Assume strerror is always declared.  */
+_GL_WARN_ON_USE (strerror, "strerror is unportable - "
+                 "use gnulib module strerror to guarantee non-NULL result");
+#endif
+
+/* Map any int, typically from errno, into an error message.  Multithread-safe.
+   Uses the POSIX declaration, not the glibc declaration.  */
+#if @GNULIB_STRERROR_R@
+# if @REPLACE_STRERROR_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef strerror_r
+#   define strerror_r rpl_strerror_r
+#  endif
+_GL_FUNCDECL_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen)
+                                   _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# else
+#  if !@HAVE_DECL_STRERROR_R@
+_GL_FUNCDECL_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen)
+                                   _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (strerror_r, int, (int errnum, char *buf, size_t buflen));
+# endif
+# if @HAVE_DECL_STRERROR_R@
+_GL_CXXALIASWARN (strerror_r);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef strerror_r
+# if HAVE_RAW_DECL_STRERROR_R
+_GL_WARN_ON_USE (strerror_r, "strerror_r is unportable - "
+                 "use gnulib module strerror_r-posix for portability");
+# endif
+#endif
+
+#if @GNULIB_STRSIGNAL@
+# if @REPLACE_STRSIGNAL@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define strsignal rpl_strsignal
+#  endif
+_GL_FUNCDECL_RPL (strsignal, char *, (int __sig));
+_GL_CXXALIAS_RPL (strsignal, char *, (int __sig));
+# else
+#  if ! @HAVE_DECL_STRSIGNAL@
+_GL_FUNCDECL_SYS (strsignal, char *, (int __sig));
+#  endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is
+   'const char *'.  */
+_GL_CXXALIAS_SYS_CAST (strsignal, char *, (int __sig));
+# endif
+_GL_CXXALIASWARN (strsignal);
+#elif defined GNULIB_POSIXCHECK
+# undef strsignal
+# if HAVE_RAW_DECL_STRSIGNAL
+_GL_WARN_ON_USE (strsignal, "strsignal is unportable - "
+                 "use gnulib module strsignal for portability");
+# endif
+#endif
+
+#if @GNULIB_STRVERSCMP@
+# if !@HAVE_STRVERSCMP@
+_GL_FUNCDECL_SYS (strverscmp, int, (const char *, const char *)
+                                   _GL_ATTRIBUTE_PURE
+                                   _GL_ARG_NONNULL ((1, 2)));
+# endif
+_GL_CXXALIAS_SYS (strverscmp, int, (const char *, const char *));
+_GL_CXXALIASWARN (strverscmp);
+#elif defined GNULIB_POSIXCHECK
+# undef strverscmp
+# if HAVE_RAW_DECL_STRVERSCMP
+_GL_WARN_ON_USE (strverscmp, "strverscmp is unportable - "
+                 "use gnulib module strverscmp for portability");
+# endif
+#endif
+
+
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif /* _@GUARD_PREFIX@_STRING_H */
+#endif
diff --git a/lib/stripslash.c b/lib/stripslash.c
new file mode 100644 (file)
index 0000000..6818b30
--- /dev/null
@@ -0,0 +1,45 @@
+/* stripslash.c -- remove redundant trailing slashes from a file name
+
+   Copyright (C) 1990, 2001, 2003-2006, 2009-2020 Free Software Foundation,
+   Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "dirname.h"
+
+/* Remove trailing slashes from FILE.  Return true if a trailing slash
+   was removed.  This is useful when using file name completion from a
+   shell that adds a "/" after directory names (such as tcsh and
+   bash), because on symlinks to directories, several system calls
+   have different semantics according to whether a trailing slash is
+   present.  */
+
+bool
+strip_trailing_slashes (char *file)
+{
+  char *base = last_component (file);
+  char *base_lim;
+  bool had_slash;
+
+  /* last_component returns "" for file system roots, but we need to turn
+     "///" into "/".  */
+  if (! *base)
+    base = file;
+  base_lim = base + base_len (base);
+  had_slash = (*base_lim != '\0');
+  *base_lim = '\0';
+  return had_slash;
+}
diff --git a/lib/sys_types.in.h b/lib/sys_types.in.h
new file mode 100644 (file)
index 0000000..e7e1a22
--- /dev/null
@@ -0,0 +1,106 @@
+/* Provide a more complete sys/types.h.
+
+   Copyright (C) 2011-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if defined _WIN32 && !defined __CYGWIN__ \
+    && (defined __need_off_t || defined __need___off64_t \
+        || defined __need_ssize_t || defined __need_time_t)
+
+/* Special invocation convention inside mingw header files.  */
+
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+
+#else
+/* Normal invocation convention.  */
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* The include_next requires a split double-inclusion guard.  */
+# define _GL_INCLUDING_SYS_TYPES_H
+#@INCLUDE_NEXT@ @NEXT_SYS_TYPES_H@
+# undef _GL_INCLUDING_SYS_TYPES_H
+
+#ifndef _@GUARD_PREFIX@_SYS_TYPES_H
+#define _@GUARD_PREFIX@_SYS_TYPES_H
+
+/* Override off_t if Large File Support is requested on native Windows.  */
+#if @WINDOWS_64_BIT_OFF_T@
+/* Same as int64_t in <stdint.h>.  */
+# if defined _MSC_VER
+#  define off_t __int64
+# else
+#  define off_t long long int
+# endif
+/* Indicator, for gnulib internal purposes.  */
+# define _GL_WINDOWS_64_BIT_OFF_T 1
+#endif
+
+/* Override dev_t and ino_t if distinguishable inodes support is requested
+   on native Windows.  */
+#if @WINDOWS_STAT_INODES@
+
+# if @WINDOWS_STAT_INODES@ == 2
+/* Experimental, not useful in Windows 10.  */
+
+/* Define dev_t to a 64-bit type.  */
+#  if !defined GNULIB_defined_dev_t
+typedef unsigned long long int rpl_dev_t;
+#   undef dev_t
+#   define dev_t rpl_dev_t
+#   define GNULIB_defined_dev_t 1
+#  endif
+
+/* Define ino_t to a 128-bit type.  */
+#  if !defined GNULIB_defined_ino_t
+/* MSVC does not have a 128-bit integer type.
+   GCC has a 128-bit integer type __int128, but only on 64-bit targets.  */
+typedef struct { unsigned long long int _gl_ino[2]; } rpl_ino_t;
+#   undef ino_t
+#   define ino_t rpl_ino_t
+#   define GNULIB_defined_ino_t 1
+#  endif
+
+# else /* @WINDOWS_STAT_INODES@ == 1 */
+
+/* Define ino_t to a 64-bit type.  */
+#  if !defined GNULIB_defined_ino_t
+typedef unsigned long long int rpl_ino_t;
+#   undef ino_t
+#   define ino_t rpl_ino_t
+#   define GNULIB_defined_ino_t 1
+#  endif
+
+# endif
+
+/* Indicator, for gnulib internal purposes.  */
+# define _GL_WINDOWS_STAT_INODES @WINDOWS_STAT_INODES@
+
+#endif
+
+/* MSVC 9 defines size_t in <stddef.h>, not in <sys/types.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (defined _WIN32 && ! defined __CYGWIN__) && ! defined __GLIBC__
+# include <stddef.h>
+#endif
+
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* _@GUARD_PREFIX@_SYS_TYPES_H */
+#endif /* __need_XXX */
diff --git a/lib/unistd.c b/lib/unistd.c
new file mode 100644 (file)
index 0000000..72bad1c
--- /dev/null
@@ -0,0 +1,4 @@
+#include <config.h>
+#define _GL_UNISTD_INLINE _GL_EXTERN_INLINE
+#include "unistd.h"
+typedef int dummy;
diff --git a/lib/unistd.in.h b/lib/unistd.in.h
new file mode 100644 (file)
index 0000000..7909416
--- /dev/null
@@ -0,0 +1,1719 @@
+/* Substitute for and wrapper around <unistd.h>.
+   Copyright (C) 2003-2020 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef _@GUARD_PREFIX@_UNISTD_H
+
+#if __GNUC__ >= 3
+@PRAGMA_SYSTEM_HEADER@
+#endif
+@PRAGMA_COLUMNS@
+
+#if @HAVE_UNISTD_H@ && defined _GL_INCLUDING_UNISTD_H
+/* Special invocation convention:
+   - On Mac OS X 10.3.9 we have a sequence of nested includes
+     <unistd.h> -> <signal.h> -> <pthread.h> -> <unistd.h>
+     In this situation, the functions are not yet declared, therefore we cannot
+     provide the C++ aliases.  */
+
+#@INCLUDE_NEXT@ @NEXT_UNISTD_H@
+
+#else
+/* Normal invocation convention.  */
+
+/* The include_next requires a split double-inclusion guard.  */
+#if @HAVE_UNISTD_H@
+# define _GL_INCLUDING_UNISTD_H
+# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
+# undef _GL_INCLUDING_UNISTD_H
+#endif
+
+/* Get all possible declarations of gethostname().  */
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@ \
+  && !defined _GL_INCLUDING_WINSOCK2_H
+# define _GL_INCLUDING_WINSOCK2_H
+# include <winsock2.h>
+# undef _GL_INCLUDING_WINSOCK2_H
+#endif
+
+#if !defined _@GUARD_PREFIX@_UNISTD_H && !defined _GL_INCLUDING_WINSOCK2_H
+#define _@GUARD_PREFIX@_UNISTD_H
+
+/* NetBSD 5.0 mis-defines NULL.  Also get size_t.  */
+/* But avoid namespace pollution on glibc systems.  */
+#ifndef __GLIBC__
+# include <stddef.h>
+#endif
+
+/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>.  */
+/* MSVC declares 'unlink' in <stdio.h>, not in <unistd.h>.  We must include
+   it before we  #define unlink rpl_unlink.  */
+/* Cygwin 1.7.1 declares symlinkat in <stdio.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (!(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET) \
+     || ((@GNULIB_UNLINK@ || defined GNULIB_POSIXCHECK) \
+         && (defined _WIN32 && ! defined __CYGWIN__)) \
+     || ((@GNULIB_SYMLINKAT@ || defined GNULIB_POSIXCHECK) \
+         && defined __CYGWIN__)) \
+    && ! defined __GLIBC__
+# include <stdio.h>
+#endif
+
+/* Cygwin 1.7.1 and Android 4.3 declare unlinkat in <fcntl.h>, not in
+   <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_UNLINKAT@ || defined GNULIB_POSIXCHECK) \
+    && (defined __CYGWIN__ || defined __ANDROID__) \
+    && ! defined __GLIBC__
+# include <fcntl.h>
+#endif
+
+/* mingw fails to declare _exit in <unistd.h>.  */
+/* mingw, MSVC, BeOS, Haiku declare environ in <stdlib.h>, not in
+   <unistd.h>.  */
+/* Solaris declares getcwd not only in <unistd.h> but also in <stdlib.h>.  */
+/* OSF Tru64 Unix cannot see gnulib rpl_strtod when system <stdlib.h> is
+   included here.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if !defined __GLIBC__ && !defined __osf__
+# define __need_system_stdlib_h
+# include <stdlib.h>
+# undef __need_system_stdlib_h
+#endif
+
+/* Native Windows platforms declare chdir, getcwd, rmdir in
+   <io.h> and/or <direct.h>, not in <unistd.h>.
+   They also declare access(), chmod(), close(), dup(), dup2(), isatty(),
+   lseek(), read(), unlink(), write() in <io.h>.  */
+#if ((@GNULIB_CHDIR@ || @GNULIB_GETCWD@ || @GNULIB_RMDIR@ \
+      || defined GNULIB_POSIXCHECK) \
+     && (defined _WIN32 && ! defined __CYGWIN__))
+# include <io.h>     /* mingw32, mingw64 */
+# include <direct.h> /* mingw64, MSVC 9 */
+#elif (@GNULIB_CLOSE@ || @GNULIB_DUP@ || @GNULIB_DUP2@ || @GNULIB_ISATTY@ \
+       || @GNULIB_LSEEK@ || @GNULIB_READ@ || @GNULIB_UNLINK@ || @GNULIB_WRITE@ \
+       || defined GNULIB_POSIXCHECK) \
+      && (defined _WIN32 && ! defined __CYGWIN__)
+# include <io.h>
+#endif
+
+/* AIX and OSF/1 5.1 declare getdomainname in <netdb.h>, not in <unistd.h>.
+   NonStop Kernel declares gethostname in <netdb.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if ((@GNULIB_GETDOMAINNAME@ && (defined _AIX || defined __osf__)) \
+     || (@GNULIB_GETHOSTNAME@ && defined __TANDEM)) \
+    && !defined __GLIBC__
+# include <netdb.h>
+#endif
+
+/* Android 4.3 declares fchownat in <sys/stat.h>, not in <unistd.h>.  */
+/* But avoid namespace pollution on glibc systems.  */
+#if (@GNULIB_FCHOWNAT@ || defined GNULIB_POSIXCHECK) && defined __ANDROID__ \
+    && !defined __GLIBC__
+# include <sys/stat.h>
+#endif
+
+/* MSVC defines off_t in <sys/types.h>.
+   May also define off_t to a 64-bit type on native Windows.  */
+/* But avoid namespace pollution on glibc systems.  */
+#ifndef __GLIBC__
+/* Get off_t, ssize_t.  */
+# include <sys/types.h>
+#endif
+
+/* The definitions of _GL_FUNCDECL_RPL etc. are copied here.  */
+
+/* The definition of _GL_ARG_NONNULL is copied here.  */
+
+/* The definition of _GL_WARN_ON_USE is copied here.  */
+
+
+/* Get getopt(), optarg, optind, opterr, optopt.  */
+#if @GNULIB_UNISTD_H_GETOPT@ && !defined _GL_SYSTEM_GETOPT
+# include <getopt-cdefs.h>
+# include <getopt-pfx-core.h>
+#endif
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef _GL_UNISTD_INLINE
+# define _GL_UNISTD_INLINE _GL_INLINE
+#endif
+
+/* Hide some function declarations from <winsock2.h>.  */
+
+#if @GNULIB_GETHOSTNAME@ && @UNISTD_H_HAVE_WINSOCK2_H@
+# if !defined _@GUARD_PREFIX@_SYS_SOCKET_H
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef socket
+#   define socket              socket_used_without_including_sys_socket_h
+#   undef connect
+#   define connect             connect_used_without_including_sys_socket_h
+#   undef accept
+#   define accept              accept_used_without_including_sys_socket_h
+#   undef bind
+#   define bind                bind_used_without_including_sys_socket_h
+#   undef getpeername
+#   define getpeername         getpeername_used_without_including_sys_socket_h
+#   undef getsockname
+#   define getsockname         getsockname_used_without_including_sys_socket_h
+#   undef getsockopt
+#   define getsockopt          getsockopt_used_without_including_sys_socket_h
+#   undef listen
+#   define listen              listen_used_without_including_sys_socket_h
+#   undef recv
+#   define recv                recv_used_without_including_sys_socket_h
+#   undef send
+#   define send                send_used_without_including_sys_socket_h
+#   undef recvfrom
+#   define recvfrom            recvfrom_used_without_including_sys_socket_h
+#   undef sendto
+#   define sendto              sendto_used_without_including_sys_socket_h
+#   undef setsockopt
+#   define setsockopt          setsockopt_used_without_including_sys_socket_h
+#   undef shutdown
+#   define shutdown            shutdown_used_without_including_sys_socket_h
+#  else
+    _GL_WARN_ON_USE (socket,
+                     "socket() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (connect,
+                     "connect() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (accept,
+                     "accept() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (bind,
+                     "bind() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (getpeername,
+                     "getpeername() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (getsockname,
+                     "getsockname() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (getsockopt,
+                     "getsockopt() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (listen,
+                     "listen() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (recv,
+                     "recv() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (send,
+                     "send() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (recvfrom,
+                     "recvfrom() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (sendto,
+                     "sendto() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (setsockopt,
+                     "setsockopt() used without including <sys/socket.h>");
+    _GL_WARN_ON_USE (shutdown,
+                     "shutdown() used without including <sys/socket.h>");
+#  endif
+# endif
+# if !defined _@GUARD_PREFIX@_SYS_SELECT_H
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef select
+#   define select              select_used_without_including_sys_select_h
+#  else
+    _GL_WARN_ON_USE (select,
+                     "select() used without including <sys/select.h>");
+#  endif
+# endif
+#endif
+
+
+/* OS/2 EMX lacks these macros.  */
+#ifndef STDIN_FILENO
+# define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+# define STDOUT_FILENO 1
+#endif
+#ifndef STDERR_FILENO
+# define STDERR_FILENO 2
+#endif
+
+/* Ensure *_OK macros exist.  */
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+
+/* Declare overridden functions.  */
+
+
+#if @GNULIB_ACCESS@
+# if @REPLACE_ACCESS@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef access
+#   define access rpl_access
+#  endif
+_GL_FUNCDECL_RPL (access, int, (const char *file, int mode)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (access, int, (const char *file, int mode));
+# else
+_GL_CXXALIAS_SYS (access, int, (const char *file, int mode));
+# endif
+_GL_CXXALIASWARN (access);
+#elif defined GNULIB_POSIXCHECK
+# undef access
+# if HAVE_RAW_DECL_ACCESS
+/* The access() function is a security risk.  */
+_GL_WARN_ON_USE (access, "access does not always support X_OK - "
+                 "use gnulib module access for portability; "
+                 "also, this function is a security risk - "
+                 "use the gnulib module faccessat instead");
+# endif
+#endif
+
+
+#if @GNULIB_CHDIR@
+_GL_CXXALIAS_SYS (chdir, int, (const char *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIASWARN (chdir);
+#elif defined GNULIB_POSIXCHECK
+# undef chdir
+# if HAVE_RAW_DECL_CHDIR
+_GL_WARN_ON_USE (chown, "chdir is not always in <unistd.h> - "
+                 "use gnulib module chdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+   to GID (if GID is not -1).  Follow symbolic links.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html.  */
+# if @REPLACE_CHOWN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef chown
+#   define chown rpl_chown
+#  endif
+_GL_FUNCDECL_RPL (chown, int, (const char *file, uid_t uid, gid_t gid)
+                              _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (chown, int, (const char *file, uid_t uid, gid_t gid));
+# else
+#  if !@HAVE_CHOWN@
+_GL_FUNCDECL_SYS (chown, int, (const char *file, uid_t uid, gid_t gid)
+                              _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (chown, int, (const char *file, uid_t uid, gid_t gid));
+# endif
+_GL_CXXALIASWARN (chown);
+#elif defined GNULIB_POSIXCHECK
+# undef chown
+# if HAVE_RAW_DECL_CHOWN
+_GL_WARN_ON_USE (chown, "chown fails to follow symlinks on some systems and "
+                 "doesn't treat a uid or gid of -1 on some systems - "
+                 "use gnulib module chown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_CLOSE@
+# if @REPLACE_CLOSE@
+/* Automatically included by modules that need a replacement for close.  */
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef close
+#   define close rpl_close
+#  endif
+_GL_FUNCDECL_RPL (close, int, (int fd));
+_GL_CXXALIAS_RPL (close, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (close, int, (int fd));
+# endif
+_GL_CXXALIASWARN (close);
+#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
+# undef close
+# define close close_used_without_requesting_gnulib_module_close
+#elif defined GNULIB_POSIXCHECK
+# undef close
+/* Assume close is always declared.  */
+_GL_WARN_ON_USE (close, "close does not portably work on sockets - "
+                 "use gnulib module close for portability");
+#endif
+
+
+#if @GNULIB_COPY_FILE_RANGE@
+# if !@HAVE_COPY_FILE_RANGE@
+_GL_FUNCDECL_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+                                             int ofd, off_t *opos,
+                                             size_t len, unsigned flags));
+_GL_CXXALIAS_SYS (copy_file_range, ssize_t, (int ifd, off_t *ipos,
+                                             int ofd, off_t *opos,
+                                             size_t len, unsigned flags));
+# endif
+_GL_CXXALIASWARN (copy_file_range);
+#elif defined GNULIB_POSIXCHECK
+/* Assume copy_file_range is always declared.  */
+_GL_WARN_ON_USE (copy_file_range,
+                 "copy_file_range is unportable - "
+                 "use gnulib module copy_file_range for portability");
+#endif
+
+
+#if @GNULIB_DUP@
+# if @REPLACE_DUP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dup rpl_dup
+#  endif
+_GL_FUNCDECL_RPL (dup, int, (int oldfd));
+_GL_CXXALIAS_RPL (dup, int, (int oldfd));
+# else
+_GL_CXXALIAS_SYS (dup, int, (int oldfd));
+# endif
+_GL_CXXALIASWARN (dup);
+#elif defined GNULIB_POSIXCHECK
+# undef dup
+# if HAVE_RAW_DECL_DUP
+_GL_WARN_ON_USE (dup, "dup is unportable - "
+                 "use gnulib module dup for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP2@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD.  Do nothing if
+   NEWFD = OLDFD, otherwise close NEWFD first if it is open.
+   Return newfd if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup2.html>.  */
+# if @REPLACE_DUP2@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dup2 rpl_dup2
+#  endif
+_GL_FUNCDECL_RPL (dup2, int, (int oldfd, int newfd));
+_GL_CXXALIAS_RPL (dup2, int, (int oldfd, int newfd));
+# else
+#  if !@HAVE_DUP2@
+_GL_FUNCDECL_SYS (dup2, int, (int oldfd, int newfd));
+#  endif
+_GL_CXXALIAS_SYS (dup2, int, (int oldfd, int newfd));
+# endif
+_GL_CXXALIASWARN (dup2);
+#elif defined GNULIB_POSIXCHECK
+# undef dup2
+# if HAVE_RAW_DECL_DUP2
+_GL_WARN_ON_USE (dup2, "dup2 is unportable - "
+                 "use gnulib module dup2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_DUP3@
+/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
+   specified flags.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   Close NEWFD first if it is open.
+   Return newfd if successful, otherwise -1 and errno set.
+   See the Linux man page at
+   <https://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>.  */
+# if @HAVE_DUP3@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define dup3 rpl_dup3
+#  endif
+_GL_FUNCDECL_RPL (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_RPL (dup3, int, (int oldfd, int newfd, int flags));
+# else
+_GL_FUNCDECL_SYS (dup3, int, (int oldfd, int newfd, int flags));
+_GL_CXXALIAS_SYS (dup3, int, (int oldfd, int newfd, int flags));
+# endif
+_GL_CXXALIASWARN (dup3);
+#elif defined GNULIB_POSIXCHECK
+# undef dup3
+# if HAVE_RAW_DECL_DUP3
+_GL_WARN_ON_USE (dup3, "dup3 is unportable - "
+                 "use gnulib module dup3 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ENVIRON@
+# if defined __CYGWIN__ && !defined __i386__
+/* The 'environ' variable is defined in a DLL. Therefore its declaration needs
+   the '__declspec(dllimport)' attribute, but the system's <unistd.h> lacks it.
+   This leads to a link error on 64-bit Cygwin when the option
+   -Wl,--disable-auto-import is in use.  */
+_GL_EXTERN_C __declspec(dllimport) char **environ;
+# endif
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values.  An array of strings of the form
+   "VARIABLE=VALUE", terminated with a NULL.  */
+#  if defined __APPLE__ && defined __MACH__
+#   include <TargetConditionals.h>
+#   if !TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR
+#    define _GL_USE_CRT_EXTERNS
+#   endif
+#  endif
+#  ifdef _GL_USE_CRT_EXTERNS
+#   include <crt_externs.h>
+#   define environ (*_NSGetEnviron ())
+#  else
+#   ifdef __cplusplus
+extern "C" {
+#   endif
+extern char **environ;
+#   ifdef __cplusplus
+}
+#   endif
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# if HAVE_RAW_DECL_ENVIRON
+_GL_UNISTD_INLINE char ***
+_GL_WARN_ON_USE_ATTRIBUTE ("environ is unportable - "
+                           "use gnulib module environ for portability")
+rpl_environ (void)
+{
+  return &environ;
+}
+#  undef environ
+#  define environ (*rpl_environ ())
+# endif
+#endif
+
+
+#if @GNULIB_EUIDACCESS@
+/* Like access(), except that it uses the effective user id and group id of
+   the current process.  */
+# if !@HAVE_EUIDACCESS@
+_GL_FUNCDECL_SYS (euidaccess, int, (const char *filename, int mode)
+                                   _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (euidaccess, int, (const char *filename, int mode));
+_GL_CXXALIASWARN (euidaccess);
+# if defined GNULIB_POSIXCHECK
+/* Like access(), this function is a security risk.  */
+_GL_WARN_ON_USE (euidaccess, "the euidaccess function is a security risk - "
+                 "use the gnulib module faccessat instead");
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef euidaccess
+# if HAVE_RAW_DECL_EUIDACCESS
+_GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
+                 "use gnulib module euidaccess for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FACCESSAT@
+# if @REPLACE_FACCESSAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef faccessat
+#   define faccessat rpl_faccessat
+#  endif
+_GL_FUNCDECL_RPL (faccessat, int,
+                  (int fd, char const *name, int mode, int flag)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (faccessat, int,
+                  (int fd, char const *name, int mode, int flag));
+# else
+#  if !@HAVE_FACCESSAT@
+_GL_FUNCDECL_SYS (faccessat, int,
+                  (int fd, char const *file, int mode, int flag)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (faccessat, int,
+                  (int fd, char const *file, int mode, int flag));
+# endif
+_GL_CXXALIASWARN (faccessat);
+#elif defined GNULIB_POSIXCHECK
+# undef faccessat
+# if HAVE_RAW_DECL_FACCESSAT
+_GL_WARN_ON_USE (faccessat, "faccessat is not portable - "
+                 "use gnulib module faccessat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHDIR@
+/* Change the process' current working directory to the directory on which
+   the given file descriptor is open.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchdir.html>.  */
+# if ! @HAVE_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+
+/* Gnulib internal hooks needed to maintain the fchdir metadata.  */
+_GL_EXTERN_C int _gl_register_fd (int fd, const char *filename)
+     _GL_ARG_NONNULL ((2));
+_GL_EXTERN_C void _gl_unregister_fd (int fd);
+_GL_EXTERN_C int _gl_register_dup (int oldfd, int newfd);
+_GL_EXTERN_C const char *_gl_directory_name (int fd);
+
+# else
+#  if !@HAVE_DECL_FCHDIR@
+_GL_FUNCDECL_SYS (fchdir, int, (int /*fd*/));
+#  endif
+# endif
+_GL_CXXALIAS_SYS (fchdir, int, (int /*fd*/));
+_GL_CXXALIASWARN (fchdir);
+#elif defined GNULIB_POSIXCHECK
+# undef fchdir
+# if HAVE_RAW_DECL_FCHDIR
+_GL_WARN_ON_USE (fchdir, "fchdir is unportable - "
+                 "use gnulib module fchdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FCHOWNAT@
+# if @REPLACE_FCHOWNAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef fchownat
+#   define fchownat rpl_fchownat
+#  endif
+_GL_FUNCDECL_RPL (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag));
+# else
+#  if !@HAVE_FCHOWNAT@
+_GL_FUNCDECL_SYS (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (fchownat, int, (int fd, char const *file,
+                                  uid_t owner, gid_t group, int flag));
+# endif
+_GL_CXXALIASWARN (fchownat);
+#elif defined GNULIB_POSIXCHECK
+# undef fchownat
+# if HAVE_RAW_DECL_FCHOWNAT
+_GL_WARN_ON_USE (fchownat, "fchownat is not portable - "
+                 "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FDATASYNC@
+/* Synchronize changes to a file.
+   Return 0 if successful, otherwise -1 and errno set.
+   See POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html>.  */
+# if !@HAVE_FDATASYNC@ || !@HAVE_DECL_FDATASYNC@
+_GL_FUNCDECL_SYS (fdatasync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fdatasync, int, (int fd));
+_GL_CXXALIASWARN (fdatasync);
+#elif defined GNULIB_POSIXCHECK
+# undef fdatasync
+# if HAVE_RAW_DECL_FDATASYNC
+_GL_WARN_ON_USE (fdatasync, "fdatasync is unportable - "
+                 "use gnulib module fdatasync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FSYNC@
+/* Synchronize changes, including metadata, to a file.
+   Return 0 if successful, otherwise -1 and errno set.
+   See POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html>.  */
+# if !@HAVE_FSYNC@
+_GL_FUNCDECL_SYS (fsync, int, (int fd));
+# endif
+_GL_CXXALIAS_SYS (fsync, int, (int fd));
+_GL_CXXALIASWARN (fsync);
+#elif defined GNULIB_POSIXCHECK
+# undef fsync
+# if HAVE_RAW_DECL_FSYNC
+_GL_WARN_ON_USE (fsync, "fsync is unportable - "
+                 "use gnulib module fsync for portability");
+# endif
+#endif
+
+
+#if @GNULIB_FTRUNCATE@
+/* Change the size of the file to which FD is opened to become equal to LENGTH.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html>.  */
+# if @REPLACE_FTRUNCATE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ftruncate
+#   define ftruncate rpl_ftruncate
+#  endif
+_GL_FUNCDECL_RPL (ftruncate, int, (int fd, off_t length));
+_GL_CXXALIAS_RPL (ftruncate, int, (int fd, off_t length));
+# else
+#  if !@HAVE_FTRUNCATE@
+_GL_FUNCDECL_SYS (ftruncate, int, (int fd, off_t length));
+#  endif
+_GL_CXXALIAS_SYS (ftruncate, int, (int fd, off_t length));
+# endif
+_GL_CXXALIASWARN (ftruncate);
+#elif defined GNULIB_POSIXCHECK
+# undef ftruncate
+# if HAVE_RAW_DECL_FTRUNCATE
+_GL_WARN_ON_USE (ftruncate, "ftruncate is unportable - "
+                 "use gnulib module ftruncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETCWD@
+/* Get the name of the current working directory, and put it in SIZE bytes
+   of BUF.
+   Return BUF if successful, or NULL if the directory couldn't be determined
+   or SIZE was too small.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html>.
+   Additionally, the gnulib module 'getcwd' guarantees the following GNU
+   extension: If BUF is NULL, an array is allocated with 'malloc'; the array
+   is SIZE bytes long, unless SIZE == 0, in which case it is as big as
+   necessary.  */
+# if @REPLACE_GETCWD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define getcwd rpl_getcwd
+#  endif
+_GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
+_GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
+# else
+/* Need to cast, because on mingw, the second parameter is
+                                                   int size.  */
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
+# endif
+_GL_CXXALIASWARN (getcwd);
+#elif defined GNULIB_POSIXCHECK
+# undef getcwd
+# if HAVE_RAW_DECL_GETCWD
+_GL_WARN_ON_USE (getcwd, "getcwd is unportable - "
+                 "use gnulib module getcwd for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDOMAINNAME@
+/* Return the NIS domain name of the machine.
+   WARNING! The NIS domain name is unrelated to the fully qualified host name
+            of the machine.  It is also unrelated to email addresses.
+   WARNING! The NIS domain name is usually the empty string or "(none)" when
+            not using NIS.
+
+   Put up to LEN bytes of the NIS domain name into NAME.
+   Null terminate it if the name is shorter than LEN.
+   If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
+   Return 0 if successful, otherwise set errno and return -1.  */
+# if @REPLACE_GETDOMAINNAME@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getdomainname
+#   define getdomainname rpl_getdomainname
+#  endif
+_GL_FUNCDECL_RPL (getdomainname, int, (char *name, size_t len)
+                                      _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getdomainname, int, (char *name, size_t len));
+# else
+#  if !@HAVE_DECL_GETDOMAINNAME@
+_GL_FUNCDECL_SYS (getdomainname, int, (char *name, size_t len)
+                                      _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (getdomainname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (getdomainname);
+#elif defined GNULIB_POSIXCHECK
+# undef getdomainname
+# if HAVE_RAW_DECL_GETDOMAINNAME
+_GL_WARN_ON_USE (getdomainname, "getdomainname is unportable - "
+                 "use gnulib module getdomainname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETDTABLESIZE@
+/* Return the maximum number of file descriptors in the current process.
+   In POSIX, this is same as sysconf (_SC_OPEN_MAX).  */
+# if @REPLACE_GETDTABLESIZE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getdtablesize
+#   define getdtablesize rpl_getdtablesize
+#  endif
+_GL_FUNCDECL_RPL (getdtablesize, int, (void));
+_GL_CXXALIAS_RPL (getdtablesize, int, (void));
+# else
+#  if !@HAVE_GETDTABLESIZE@
+_GL_FUNCDECL_SYS (getdtablesize, int, (void));
+#  endif
+/* Need to cast, because on AIX, the parameter list is
+                                           (...).  */
+_GL_CXXALIAS_SYS_CAST (getdtablesize, int, (void));
+# endif
+_GL_CXXALIASWARN (getdtablesize);
+#elif defined GNULIB_POSIXCHECK
+# undef getdtablesize
+# if HAVE_RAW_DECL_GETDTABLESIZE
+_GL_WARN_ON_USE (getdtablesize, "getdtablesize is unportable - "
+                 "use gnulib module getdtablesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETGROUPS@
+/* Return the supplemental groups that the current process belongs to.
+   It is unspecified whether the effective group id is in the list.
+   If N is 0, return the group count; otherwise, N describes how many
+   entries are available in GROUPS.  Return -1 and set errno if N is
+   not 0 and not large enough.  Fails with ENOSYS on some systems.  */
+# if @REPLACE_GETGROUPS@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getgroups
+#   define getgroups rpl_getgroups
+#  endif
+_GL_FUNCDECL_RPL (getgroups, int, (int n, gid_t *groups));
+_GL_CXXALIAS_RPL (getgroups, int, (int n, gid_t *groups));
+# else
+#  if !@HAVE_GETGROUPS@
+_GL_FUNCDECL_SYS (getgroups, int, (int n, gid_t *groups));
+#  endif
+_GL_CXXALIAS_SYS (getgroups, int, (int n, gid_t *groups));
+# endif
+_GL_CXXALIASWARN (getgroups);
+#elif defined GNULIB_POSIXCHECK
+# undef getgroups
+# if HAVE_RAW_DECL_GETGROUPS
+_GL_WARN_ON_USE (getgroups, "getgroups is unportable - "
+                 "use gnulib module getgroups for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETHOSTNAME@
+/* Return the standard host name of the machine.
+   WARNING! The host name may or may not be fully qualified.
+
+   Put up to LEN bytes of the host name into NAME.
+   Null terminate it if the name is shorter than LEN.
+   If the host name is longer than LEN, set errno = EINVAL and return -1.
+   Return 0 if successful, otherwise set errno and return -1.  */
+# if @UNISTD_H_HAVE_WINSOCK2_H@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef gethostname
+#   define gethostname rpl_gethostname
+#  endif
+_GL_FUNCDECL_RPL (gethostname, int, (char *name, size_t len)
+                                    _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (gethostname, int, (char *name, size_t len));
+# else
+#  if !@HAVE_GETHOSTNAME@
+_GL_FUNCDECL_SYS (gethostname, int, (char *name, size_t len)
+                                    _GL_ARG_NONNULL ((1)));
+#  endif
+/* Need to cast, because on Solaris 10 and OSF/1 5.1 systems, the second
+   parameter is
+                                                      int len.  */
+_GL_CXXALIAS_SYS_CAST (gethostname, int, (char *name, size_t len));
+# endif
+_GL_CXXALIASWARN (gethostname);
+#elif @UNISTD_H_HAVE_WINSOCK2_H@
+# undef gethostname
+# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
+#elif defined GNULIB_POSIXCHECK
+# undef gethostname
+# if HAVE_RAW_DECL_GETHOSTNAME
+_GL_WARN_ON_USE (gethostname, "gethostname is unportable - "
+                 "use gnulib module gethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN@
+/* Returns the user's login name, or NULL if it cannot be found.  Upon error,
+   returns NULL with errno set.
+
+   See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
+
+   Most programs don't need to use this function, because the information is
+   available through environment variables:
+     ${LOGNAME-$USER}        on Unix platforms,
+     $USERNAME               on native Windows platforms.
+ */
+# if !@HAVE_DECL_GETLOGIN@
+_GL_FUNCDECL_SYS (getlogin, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getlogin, char *, (void));
+_GL_CXXALIASWARN (getlogin);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin
+# if HAVE_RAW_DECL_GETLOGIN
+_GL_WARN_ON_USE (getlogin, "getlogin is unportable - "
+                 "use gnulib module getlogin for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETLOGIN_R@
+/* Copies the user's login name to NAME.
+   The array pointed to by NAME has room for SIZE bytes.
+
+   Returns 0 if successful.  Upon error, an error number is returned, or -1 in
+   the case that the login name cannot be found but no specific error is
+   provided (this case is hopefully rare but is left open by the POSIX spec).
+
+   See <https://pubs.opengroup.org/onlinepubs/9699919799/functions/getlogin.html>.
+
+   Most programs don't need to use this function, because the information is
+   available through environment variables:
+     ${LOGNAME-$USER}        on Unix platforms,
+     $USERNAME               on native Windows platforms.
+ */
+# if @REPLACE_GETLOGIN_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define getlogin_r rpl_getlogin_r
+#  endif
+_GL_FUNCDECL_RPL (getlogin_r, int, (char *name, size_t size)
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getlogin_r, int, (char *name, size_t size));
+# else
+#  if !@HAVE_DECL_GETLOGIN_R@
+_GL_FUNCDECL_SYS (getlogin_r, int, (char *name, size_t size)
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+/* Need to cast, because on Solaris 10 systems, the second argument is
+                                                     int size.  */
+_GL_CXXALIAS_SYS_CAST (getlogin_r, int, (char *name, size_t size));
+# endif
+_GL_CXXALIASWARN (getlogin_r);
+#elif defined GNULIB_POSIXCHECK
+# undef getlogin_r
+# if HAVE_RAW_DECL_GETLOGIN_R
+_GL_WARN_ON_USE (getlogin_r, "getlogin_r is unportable - "
+                 "use gnulib module getlogin_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPAGESIZE@
+# if @REPLACE_GETPAGESIZE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define getpagesize rpl_getpagesize
+#  endif
+_GL_FUNCDECL_RPL (getpagesize, int, (void));
+_GL_CXXALIAS_RPL (getpagesize, int, (void));
+# else
+/* On HP-UX, getpagesize exists, but it is not declared in <unistd.h> even if
+   the compiler options -D_HPUX_SOURCE -D_XOPEN_SOURCE=600 are used.  */
+#  if defined __hpux
+_GL_FUNCDECL_SYS (getpagesize, int, (void));
+#  endif
+#  if !@HAVE_GETPAGESIZE@
+#   if !defined getpagesize
+/* This is for POSIX systems.  */
+#    if !defined _gl_getpagesize && defined _SC_PAGESIZE
+#     if ! (defined __VMS && __VMS_VER < 70000000)
+#      define _gl_getpagesize() sysconf (_SC_PAGESIZE)
+#     endif
+#    endif
+/* This is for older VMS.  */
+#    if !defined _gl_getpagesize && defined __VMS
+#     ifdef __ALPHA
+#      define _gl_getpagesize() 8192
+#     else
+#      define _gl_getpagesize() 512
+#     endif
+#    endif
+/* This is for BeOS.  */
+#    if !defined _gl_getpagesize && @HAVE_OS_H@
+#     include <OS.h>
+#     if defined B_PAGE_SIZE
+#      define _gl_getpagesize() B_PAGE_SIZE
+#     endif
+#    endif
+/* This is for AmigaOS4.0.  */
+#    if !defined _gl_getpagesize && defined __amigaos4__
+#     define _gl_getpagesize() 2048
+#    endif
+/* This is for older Unix systems.  */
+#    if !defined _gl_getpagesize && @HAVE_SYS_PARAM_H@
+#     include <sys/param.h>
+#     ifdef EXEC_PAGESIZE
+#      define _gl_getpagesize() EXEC_PAGESIZE
+#     else
+#      ifdef NBPG
+#       ifndef CLSIZE
+#        define CLSIZE 1
+#       endif
+#       define _gl_getpagesize() (NBPG * CLSIZE)
+#      else
+#       ifdef NBPC
+#        define _gl_getpagesize() NBPC
+#       endif
+#      endif
+#     endif
+#    endif
+#    if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#     define getpagesize() _gl_getpagesize ()
+#    else
+#     if !GNULIB_defined_getpagesize_function
+_GL_UNISTD_INLINE int
+getpagesize ()
+{
+  return _gl_getpagesize ();
+}
+#      define GNULIB_defined_getpagesize_function 1
+#     endif
+#    endif
+#   endif
+#  endif
+/* Need to cast, because on Cygwin 1.5.x systems, the return type is size_t.  */
+_GL_CXXALIAS_SYS_CAST (getpagesize, int, (void));
+# endif
+# if @HAVE_DECL_GETPAGESIZE@
+_GL_CXXALIASWARN (getpagesize);
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef getpagesize
+# if HAVE_RAW_DECL_GETPAGESIZE
+_GL_WARN_ON_USE (getpagesize, "getpagesize is unportable - "
+                 "use gnulib module getpagesize for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETPASS@
+/* Function getpass() from module 'getpass':
+     Read a password from /dev/tty or stdin.
+   Function getpass() from module 'getpass-gnu':
+     Read a password of arbitrary length from /dev/tty or stdin.  */
+# if @REPLACE_GETPASS@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef getpass
+#   define getpass rpl_getpass
+#  endif
+_GL_FUNCDECL_RPL (getpass, char *, (const char *prompt)
+                                   _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (getpass, char *, (const char *prompt));
+# else
+#  if !@HAVE_GETPASS@
+_GL_FUNCDECL_SYS (getpass, char *, (const char *prompt)
+                                   _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (getpass, char *, (const char *prompt));
+# endif
+_GL_CXXALIASWARN (getpass);
+#elif defined GNULIB_POSIXCHECK
+# undef getpass
+# if HAVE_RAW_DECL_GETPASS
+_GL_WARN_ON_USE (getpass, "getpass is unportable - "
+                 "use gnulib module getpass or getpass-gnu for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GETUSERSHELL@
+/* Return the next valid login shell on the system, or NULL when the end of
+   the list has been reached.  */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (getusershell, char *, (void));
+# endif
+_GL_CXXALIAS_SYS (getusershell, char *, (void));
+_GL_CXXALIASWARN (getusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef getusershell
+# if HAVE_RAW_DECL_GETUSERSHELL
+_GL_WARN_ON_USE (getusershell, "getusershell is unportable - "
+                 "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Rewind to pointer that is advanced at each getusershell() call.  */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (setusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (setusershell, void, (void));
+_GL_CXXALIASWARN (setusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef setusershell
+# if HAVE_RAW_DECL_SETUSERSHELL
+_GL_WARN_ON_USE (setusershell, "setusershell is unportable - "
+                 "use gnulib module getusershell for portability");
+# endif
+#endif
+
+#if @GNULIB_GETUSERSHELL@
+/* Free the pointer that is advanced at each getusershell() call and
+   associated resources.  */
+# if !@HAVE_DECL_GETUSERSHELL@
+_GL_FUNCDECL_SYS (endusershell, void, (void));
+# endif
+_GL_CXXALIAS_SYS (endusershell, void, (void));
+_GL_CXXALIASWARN (endusershell);
+#elif defined GNULIB_POSIXCHECK
+# undef endusershell
+# if HAVE_RAW_DECL_ENDUSERSHELL
+_GL_WARN_ON_USE (endusershell, "endusershell is unportable - "
+                 "use gnulib module getusershell for portability");
+# endif
+#endif
+
+
+#if @GNULIB_GROUP_MEMBER@
+/* Determine whether group id is in calling user's group list.  */
+# if !@HAVE_GROUP_MEMBER@
+_GL_FUNCDECL_SYS (group_member, int, (gid_t gid));
+# endif
+_GL_CXXALIAS_SYS (group_member, int, (gid_t gid));
+_GL_CXXALIASWARN (group_member);
+#elif defined GNULIB_POSIXCHECK
+# undef group_member
+# if HAVE_RAW_DECL_GROUP_MEMBER
+_GL_WARN_ON_USE (group_member, "group_member is unportable - "
+                 "use gnulib module group-member for portability");
+# endif
+#endif
+
+
+#if @GNULIB_ISATTY@
+# if @REPLACE_ISATTY@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef isatty
+#   define isatty rpl_isatty
+#  endif
+_GL_FUNCDECL_RPL (isatty, int, (int fd));
+_GL_CXXALIAS_RPL (isatty, int, (int fd));
+# else
+_GL_CXXALIAS_SYS (isatty, int, (int fd));
+# endif
+_GL_CXXALIASWARN (isatty);
+#elif defined GNULIB_POSIXCHECK
+# undef isatty
+# if HAVE_RAW_DECL_ISATTY
+_GL_WARN_ON_USE (isatty, "isatty has portability problems on native Windows - "
+                 "use gnulib module isatty for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LCHOWN@
+/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
+   to GID (if GID is not -1).  Do not follow symbolic links.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html>.  */
+# if @REPLACE_LCHOWN@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef lchown
+#   define lchown rpl_lchown
+#  endif
+_GL_FUNCDECL_RPL (lchown, int, (char const *file, uid_t owner, gid_t group)
+                               _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (lchown, int, (char const *file, uid_t owner, gid_t group));
+# else
+#  if !@HAVE_LCHOWN@
+_GL_FUNCDECL_SYS (lchown, int, (char const *file, uid_t owner, gid_t group)
+                               _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (lchown, int, (char const *file, uid_t owner, gid_t group));
+# endif
+_GL_CXXALIASWARN (lchown);
+#elif defined GNULIB_POSIXCHECK
+# undef lchown
+# if HAVE_RAW_DECL_LCHOWN
+_GL_WARN_ON_USE (lchown, "lchown is unportable to pre-POSIX.1-2001 systems - "
+                 "use gnulib module lchown for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINK@
+/* Create a new hard link for an existing file.
+   Return 0 if successful, otherwise -1 and errno set.
+   See POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html>.  */
+# if @REPLACE_LINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define link rpl_link
+#  endif
+_GL_FUNCDECL_RPL (link, int, (const char *path1, const char *path2)
+                             _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (link, int, (const char *path1, const char *path2));
+# else
+#  if !@HAVE_LINK@
+_GL_FUNCDECL_SYS (link, int, (const char *path1, const char *path2)
+                             _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (link, int, (const char *path1, const char *path2));
+# endif
+_GL_CXXALIASWARN (link);
+#elif defined GNULIB_POSIXCHECK
+# undef link
+# if HAVE_RAW_DECL_LINK
+_GL_WARN_ON_USE (link, "link is unportable - "
+                 "use gnulib module link for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LINKAT@
+/* Create a new hard link for an existing file, relative to two
+   directories.  FLAG controls whether symlinks are followed.
+   Return 0 if successful, otherwise -1 and errno set.  */
+# if @REPLACE_LINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef linkat
+#   define linkat rpl_linkat
+#  endif
+_GL_FUNCDECL_RPL (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag)
+                  _GL_ARG_NONNULL ((2, 4)));
+_GL_CXXALIAS_RPL (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag));
+# else
+#  if !@HAVE_LINKAT@
+_GL_FUNCDECL_SYS (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag)
+                  _GL_ARG_NONNULL ((2, 4)));
+#  endif
+_GL_CXXALIAS_SYS (linkat, int,
+                  (int fd1, const char *path1, int fd2, const char *path2,
+                   int flag));
+# endif
+_GL_CXXALIASWARN (linkat);
+#elif defined GNULIB_POSIXCHECK
+# undef linkat
+# if HAVE_RAW_DECL_LINKAT
+_GL_WARN_ON_USE (linkat, "linkat is unportable - "
+                 "use gnulib module linkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_LSEEK@
+/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
+   Return the new offset if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html>.  */
+# if @REPLACE_LSEEK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define lseek rpl_lseek
+#  endif
+_GL_FUNCDECL_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+_GL_CXXALIAS_RPL (lseek, off_t, (int fd, off_t offset, int whence));
+# else
+_GL_CXXALIAS_SYS (lseek, off_t, (int fd, off_t offset, int whence));
+# endif
+_GL_CXXALIASWARN (lseek);
+#elif defined GNULIB_POSIXCHECK
+# undef lseek
+# if HAVE_RAW_DECL_LSEEK
+_GL_WARN_ON_USE (lseek, "lseek does not fail with ESPIPE on pipes on some "
+                 "systems - use gnulib module lseek for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE@
+/* Create a pipe, defaulting to O_BINARY mode.
+   Store the read-end as fd[0] and the write-end as fd[1].
+   Return 0 upon success, or -1 with errno set upon failure.  */
+# if !@HAVE_PIPE@
+_GL_FUNCDECL_SYS (pipe, int, (int fd[2]) _GL_ARG_NONNULL ((1)));
+# endif
+_GL_CXXALIAS_SYS (pipe, int, (int fd[2]));
+_GL_CXXALIASWARN (pipe);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe
+# if HAVE_RAW_DECL_PIPE
+_GL_WARN_ON_USE (pipe, "pipe is unportable - "
+                 "use gnulib module pipe-posix for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PIPE2@
+/* Create a pipe, applying the given flags when opening the read-end of the
+   pipe and the write-end of the pipe.
+   The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
+   and O_TEXT, O_BINARY (defined in "binary-io.h").
+   Store the read-end as fd[0] and the write-end as fd[1].
+   Return 0 upon success, or -1 with errno set upon failure.
+   See also the Linux man page at
+   <https://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>.  */
+# if @HAVE_PIPE2@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define pipe2 rpl_pipe2
+#  endif
+_GL_FUNCDECL_RPL (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (pipe2, int, (int fd[2], int flags));
+# else
+_GL_FUNCDECL_SYS (pipe2, int, (int fd[2], int flags) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_SYS (pipe2, int, (int fd[2], int flags));
+# endif
+_GL_CXXALIASWARN (pipe2);
+#elif defined GNULIB_POSIXCHECK
+# undef pipe2
+# if HAVE_RAW_DECL_PIPE2
+_GL_WARN_ON_USE (pipe2, "pipe2 is unportable - "
+                 "use gnulib module pipe2 for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PREAD@
+/* Read at most BUFSIZE bytes from FD into BUF, starting at OFFSET.
+   Return the number of bytes placed into BUF if successful, otherwise
+   set errno and return -1.  0 indicates EOF.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html>.  */
+# if @REPLACE_PREAD@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef pread
+#   define pread rpl_pread
+#  endif
+_GL_FUNCDECL_RPL (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset));
+# else
+#  if !@HAVE_PREAD@
+_GL_FUNCDECL_SYS (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (pread, ssize_t,
+                  (int fd, void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pread);
+#elif defined GNULIB_POSIXCHECK
+# undef pread
+# if HAVE_RAW_DECL_PREAD
+_GL_WARN_ON_USE (pread, "pread is unportable - "
+                 "use gnulib module pread for portability");
+# endif
+#endif
+
+
+#if @GNULIB_PWRITE@
+/* Write at most BUFSIZE bytes from BUF into FD, starting at OFFSET.
+   Return the number of bytes written if successful, otherwise
+   set errno and return -1.  0 indicates nothing written.  See the
+   POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html>.  */
+# if @REPLACE_PWRITE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef pwrite
+#   define pwrite rpl_pwrite
+#  endif
+_GL_FUNCDECL_RPL (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset));
+# else
+#  if !@HAVE_PWRITE@
+_GL_FUNCDECL_SYS (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset)
+                  _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (pwrite, ssize_t,
+                  (int fd, const void *buf, size_t bufsize, off_t offset));
+# endif
+_GL_CXXALIASWARN (pwrite);
+#elif defined GNULIB_POSIXCHECK
+# undef pwrite
+# if HAVE_RAW_DECL_PWRITE
+_GL_WARN_ON_USE (pwrite, "pwrite is unportable - "
+                 "use gnulib module pwrite for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READ@
+/* Read up to COUNT bytes from file descriptor FD into the buffer starting
+   at BUF.  See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html>.  */
+# if @REPLACE_READ@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef read
+#   define read rpl_read
+#  endif
+_GL_FUNCDECL_RPL (read, ssize_t, (int fd, void *buf, size_t count)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (read, ssize_t, (int fd, void *buf, size_t count));
+# else
+/* Need to cast, because on mingw, the third parameter is
+                                                          unsigned int count
+   and the return type is 'int'.  */
+_GL_CXXALIAS_SYS_CAST (read, ssize_t, (int fd, void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (read);
+#endif
+
+
+#if @GNULIB_READLINK@
+/* Read the contents of the symbolic link FILE and place the first BUFSIZE
+   bytes of it into BUF.  Return the number of bytes placed into BUF if
+   successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>.  */
+# if @REPLACE_READLINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define readlink rpl_readlink
+#  endif
+_GL_FUNCDECL_RPL (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize)
+                  _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize));
+# else
+#  if !@HAVE_READLINK@
+_GL_FUNCDECL_SYS (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize)
+                  _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (readlink, ssize_t,
+                  (const char *file, char *buf, size_t bufsize));
+# endif
+_GL_CXXALIASWARN (readlink);
+#elif defined GNULIB_POSIXCHECK
+# undef readlink
+# if HAVE_RAW_DECL_READLINK
+_GL_WARN_ON_USE (readlink, "readlink is unportable - "
+                 "use gnulib module readlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_READLINKAT@
+# if @REPLACE_READLINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define readlinkat rpl_readlinkat
+#  endif
+_GL_FUNCDECL_RPL (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len)
+                  _GL_ARG_NONNULL ((2, 3)));
+_GL_CXXALIAS_RPL (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len));
+# else
+#  if !@HAVE_READLINKAT@
+_GL_FUNCDECL_SYS (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len)
+                  _GL_ARG_NONNULL ((2, 3)));
+#  endif
+_GL_CXXALIAS_SYS (readlinkat, ssize_t,
+                  (int fd, char const *file, char *buf, size_t len));
+# endif
+_GL_CXXALIASWARN (readlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef readlinkat
+# if HAVE_RAW_DECL_READLINKAT
+_GL_WARN_ON_USE (readlinkat, "readlinkat is not portable - "
+                 "use gnulib module readlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_RMDIR@
+/* Remove the directory DIR.  */
+# if @REPLACE_RMDIR@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   define rmdir rpl_rmdir
+#  endif
+_GL_FUNCDECL_RPL (rmdir, int, (char const *name) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (rmdir, int, (char const *name));
+# else
+_GL_CXXALIAS_SYS (rmdir, int, (char const *name));
+# endif
+_GL_CXXALIASWARN (rmdir);
+#elif defined GNULIB_POSIXCHECK
+# undef rmdir
+# if HAVE_RAW_DECL_RMDIR
+_GL_WARN_ON_USE (rmdir, "rmdir is unportable - "
+                 "use gnulib module rmdir for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SETHOSTNAME@
+/* Set the host name of the machine.
+   The host name may or may not be fully qualified.
+
+   Put LEN bytes of NAME into the host name.
+   Return 0 if successful, otherwise, set errno and return -1.
+
+   Platforms with no ability to set the hostname return -1 and set
+   errno = ENOSYS.  */
+# if !@HAVE_SETHOSTNAME@ || !@HAVE_DECL_SETHOSTNAME@
+_GL_FUNCDECL_SYS (sethostname, int, (const char *name, size_t len)
+                                    _GL_ARG_NONNULL ((1)));
+# endif
+/* Need to cast, because on Solaris 11 2011-10, Mac OS X 10.5, IRIX 6.5
+   and FreeBSD 6.4 the second parameter is int.  On Solaris 11
+   2011-10, the first parameter is not const.  */
+_GL_CXXALIAS_SYS_CAST (sethostname, int, (const char *name, size_t len));
+_GL_CXXALIASWARN (sethostname);
+#elif defined GNULIB_POSIXCHECK
+# undef sethostname
+# if HAVE_RAW_DECL_SETHOSTNAME
+_GL_WARN_ON_USE (sethostname, "sethostname is unportable - "
+                 "use gnulib module sethostname for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SLEEP@
+/* Pause the execution of the current thread for N seconds.
+   Returns the number of seconds left to sleep.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html>.  */
+# if @REPLACE_SLEEP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef sleep
+#   define sleep rpl_sleep
+#  endif
+_GL_FUNCDECL_RPL (sleep, unsigned int, (unsigned int n));
+_GL_CXXALIAS_RPL (sleep, unsigned int, (unsigned int n));
+# else
+#  if !@HAVE_SLEEP@
+_GL_FUNCDECL_SYS (sleep, unsigned int, (unsigned int n));
+#  endif
+_GL_CXXALIAS_SYS (sleep, unsigned int, (unsigned int n));
+# endif
+_GL_CXXALIASWARN (sleep);
+#elif defined GNULIB_POSIXCHECK
+# undef sleep
+# if HAVE_RAW_DECL_SLEEP
+_GL_WARN_ON_USE (sleep, "sleep is unportable - "
+                 "use gnulib module sleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINK@
+# if @REPLACE_SYMLINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef symlink
+#   define symlink rpl_symlink
+#  endif
+_GL_FUNCDECL_RPL (symlink, int, (char const *contents, char const *file)
+                                _GL_ARG_NONNULL ((1, 2)));
+_GL_CXXALIAS_RPL (symlink, int, (char const *contents, char const *file));
+# else
+#  if !@HAVE_SYMLINK@
+_GL_FUNCDECL_SYS (symlink, int, (char const *contents, char const *file)
+                                _GL_ARG_NONNULL ((1, 2)));
+#  endif
+_GL_CXXALIAS_SYS (symlink, int, (char const *contents, char const *file));
+# endif
+_GL_CXXALIASWARN (symlink);
+#elif defined GNULIB_POSIXCHECK
+# undef symlink
+# if HAVE_RAW_DECL_SYMLINK
+_GL_WARN_ON_USE (symlink, "symlink is not portable - "
+                 "use gnulib module symlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_SYMLINKAT@
+# if @REPLACE_SYMLINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef symlinkat
+#   define symlinkat rpl_symlinkat
+#  endif
+_GL_FUNCDECL_RPL (symlinkat, int,
+                  (char const *contents, int fd, char const *file)
+                  _GL_ARG_NONNULL ((1, 3)));
+_GL_CXXALIAS_RPL (symlinkat, int,
+                  (char const *contents, int fd, char const *file));
+# else
+#  if !@HAVE_SYMLINKAT@
+_GL_FUNCDECL_SYS (symlinkat, int,
+                  (char const *contents, int fd, char const *file)
+                  _GL_ARG_NONNULL ((1, 3)));
+#  endif
+_GL_CXXALIAS_SYS (symlinkat, int,
+                  (char const *contents, int fd, char const *file));
+# endif
+_GL_CXXALIASWARN (symlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef symlinkat
+# if HAVE_RAW_DECL_SYMLINKAT
+_GL_WARN_ON_USE (symlinkat, "symlinkat is not portable - "
+                 "use gnulib module symlinkat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TRUNCATE@
+/* Change the size of the file designated by FILENAME to become equal to LENGTH.
+   Return 0 if successful, otherwise -1 and errno set.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html>.  */
+# if @REPLACE_TRUNCATE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef truncate
+#   define truncate rpl_truncate
+#  endif
+_GL_FUNCDECL_RPL (truncate, int, (const char *filename, off_t length)
+                                 _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (truncate, int, (const char *filename, off_t length));
+# else
+#  if !@HAVE_DECL_TRUNCATE@
+_GL_FUNCDECL_SYS (truncate, int, (const char *filename, off_t length)
+                                 _GL_ARG_NONNULL ((1)));
+#  endif
+_GL_CXXALIAS_SYS (truncate, int, (const char *filename, off_t length));
+# endif
+_GL_CXXALIASWARN (truncate);
+#elif defined GNULIB_POSIXCHECK
+# undef truncate
+# if HAVE_RAW_DECL_TRUNCATE
+_GL_WARN_ON_USE (truncate, "truncate is unportable - "
+                 "use gnulib module truncate for portability");
+# endif
+#endif
+
+
+#if @GNULIB_TTYNAME_R@
+/* Store at most BUFLEN characters of the pathname of the terminal FD is
+   open on in BUF.  Return 0 on success, otherwise an error number.  */
+# if @REPLACE_TTYNAME_R@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef ttyname_r
+#   define ttyname_r rpl_ttyname_r
+#  endif
+_GL_FUNCDECL_RPL (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen));
+# else
+#  if !@HAVE_DECL_TTYNAME_R@
+_GL_FUNCDECL_SYS (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen) _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (ttyname_r, int,
+                  (int fd, char *buf, size_t buflen));
+# endif
+_GL_CXXALIASWARN (ttyname_r);
+#elif defined GNULIB_POSIXCHECK
+# undef ttyname_r
+# if HAVE_RAW_DECL_TTYNAME_R
+_GL_WARN_ON_USE (ttyname_r, "ttyname_r is not portable - "
+                 "use gnulib module ttyname_r for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINK@
+# if @REPLACE_UNLINK@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlink
+#   define unlink rpl_unlink
+#  endif
+_GL_FUNCDECL_RPL (unlink, int, (char const *file) _GL_ARG_NONNULL ((1)));
+_GL_CXXALIAS_RPL (unlink, int, (char const *file));
+# else
+_GL_CXXALIAS_SYS (unlink, int, (char const *file));
+# endif
+_GL_CXXALIASWARN (unlink);
+#elif defined GNULIB_POSIXCHECK
+# undef unlink
+# if HAVE_RAW_DECL_UNLINK
+_GL_WARN_ON_USE (unlink, "unlink is not portable - "
+                 "use gnulib module unlink for portability");
+# endif
+#endif
+
+
+#if @GNULIB_UNLINKAT@
+# if @REPLACE_UNLINKAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef unlinkat
+#   define unlinkat rpl_unlinkat
+#  endif
+_GL_FUNCDECL_RPL (unlinkat, int, (int fd, char const *file, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (unlinkat, int, (int fd, char const *file, int flag));
+# else
+#  if !@HAVE_UNLINKAT@
+_GL_FUNCDECL_SYS (unlinkat, int, (int fd, char const *file, int flag)
+                                 _GL_ARG_NONNULL ((2)));
+#  endif
+_GL_CXXALIAS_SYS (unlinkat, int, (int fd, char const *file, int flag));
+# endif
+_GL_CXXALIASWARN (unlinkat);
+#elif defined GNULIB_POSIXCHECK
+# undef unlinkat
+# if HAVE_RAW_DECL_UNLINKAT
+_GL_WARN_ON_USE (unlinkat, "unlinkat is not portable - "
+                 "use gnulib module openat for portability");
+# endif
+#endif
+
+
+#if @GNULIB_USLEEP@
+/* Pause the execution of the current thread for N microseconds.
+   Returns 0 on completion, or -1 on range error.
+   See the POSIX:2001 specification
+   <https://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html>.  */
+# if @REPLACE_USLEEP@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef usleep
+#   define usleep rpl_usleep
+#  endif
+_GL_FUNCDECL_RPL (usleep, int, (useconds_t n));
+_GL_CXXALIAS_RPL (usleep, int, (useconds_t n));
+# else
+#  if !@HAVE_USLEEP@
+_GL_FUNCDECL_SYS (usleep, int, (useconds_t n));
+#  endif
+/* Need to cast, because on Haiku, the first parameter is
+                                     unsigned int n.  */
+_GL_CXXALIAS_SYS_CAST (usleep, int, (useconds_t n));
+# endif
+_GL_CXXALIASWARN (usleep);
+#elif defined GNULIB_POSIXCHECK
+# undef usleep
+# if HAVE_RAW_DECL_USLEEP
+_GL_WARN_ON_USE (usleep, "usleep is unportable - "
+                 "use gnulib module usleep for portability");
+# endif
+#endif
+
+
+#if @GNULIB_WRITE@
+/* Write up to COUNT bytes starting at BUF to file descriptor FD.
+   See the POSIX:2008 specification
+   <https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html>.  */
+# if @REPLACE_WRITE@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef write
+#   define write rpl_write
+#  endif
+_GL_FUNCDECL_RPL (write, ssize_t, (int fd, const void *buf, size_t count)
+                                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (write, ssize_t, (int fd, const void *buf, size_t count));
+# else
+/* Need to cast, because on mingw, the third parameter is
+                                                             unsigned int count
+   and the return type is 'int'.  */
+_GL_CXXALIAS_SYS_CAST (write, ssize_t, (int fd, const void *buf, size_t count));
+# endif
+_GL_CXXALIASWARN (write);
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
+#endif /* _GL_INCLUDING_UNISTD_H */
+#endif /* _@GUARD_PREFIX@_UNISTD_H */
diff --git a/lib/verify.h b/lib/verify.h
new file mode 100644 (file)
index 0000000..d9ab89a
--- /dev/null
@@ -0,0 +1,301 @@
+/* Compile-time assert-like macros.
+
+   Copyright (C) 2005-2006, 2009-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
+
+#ifndef _GL_VERIFY_H
+#define _GL_VERIFY_H
+
+
+/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
+   works as per C11.  This is supported by GCC 4.6.0 and later, in C
+   mode.
+
+   Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
+   per C2X, and define _GL_HAVE_STATIC_ASSERT1 if static_assert (R)
+   works as per C++17.  This is supported by GCC 9.1 and later.
+
+   Support compilers claiming conformance to the relevant standard,
+   and also support GCC when not pedantic.  If we were willing to slow
+   'configure' down we could also use it with other compilers, but
+   since this affects only the quality of diagnostics, why bother?  */
+#ifndef __cplusplus
+# if (201112L <= __STDC_VERSION__ \
+      || (!defined __STRICT_ANSI__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)))
+#  define _GL_HAVE__STATIC_ASSERT 1
+# endif
+# if (202000L <= __STDC_VERSION__ \
+      || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))
+#  define _GL_HAVE__STATIC_ASSERT1 1
+# endif
+#else
+# if 201703L <= __cplusplus || 9 <= __GNUC__
+#  define _GL_HAVE_STATIC_ASSERT1 1
+# endif
+#endif
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+   system headers, defines a conflicting _Static_assert that is no
+   better than ours; override it.  */
+#ifndef _GL_HAVE__STATIC_ASSERT
+# include <stddef.h>
+# undef _Static_assert
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero.  To
+   be portable, R should be an integer constant expression.  Unlike
+   assert (R), there is no run-time overhead.
+
+   If _Static_assert works, verify (R) uses it directly.  Similarly,
+   _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
+   that is an operand of sizeof.
+
+   The code below uses several ideas for C++ compilers, and for C
+   compilers that do not support _Static_assert:
+
+   * The first step is ((R) ? 1 : -1).  Given an expression R, of
+     integral or boolean or floating-point type, this yields an
+     expression of integral type, whose value is later verified to be
+     constant and nonnegative.
+
+   * Next this expression W is wrapped in a type
+     struct _gl_verify_type {
+       unsigned int _gl_verify_error_if_negative: W;
+     }.
+     If W is negative, this yields a compile-time error.  No compiler can
+     deal with a bit-field of negative size.
+
+     One might think that an array size check would have the same
+     effect, that is, that the type struct { unsigned int dummy[W]; }
+     would work as well.  However, inside a function, some compilers
+     (such as C++ compilers and GNU C) allow local parameters and
+     variables inside array size expressions.  With these compilers,
+     an array size check would not properly diagnose this misuse of
+     the verify macro:
+
+       void function (int n) { verify (n < 0); }
+
+   * For the verify macro, the struct _gl_verify_type will need to
+     somehow be embedded into a declaration.  To be portable, this
+     declaration must declare an object, a constant, a function, or a
+     typedef name.  If the declared entity uses the type directly,
+     such as in
+
+       struct dummy {...};
+       typedef struct {...} dummy;
+       extern struct {...} *dummy;
+       extern void dummy (struct {...} *);
+       extern struct {...} *dummy (void);
+
+     two uses of the verify macro would yield colliding declarations
+     if the entity names are not disambiguated.  A workaround is to
+     attach the current line number to the entity name:
+
+       #define _GL_CONCAT0(x, y) x##y
+       #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+       extern struct {...} * _GL_CONCAT (dummy, __LINE__);
+
+     But this has the problem that two invocations of verify from
+     within the same macro would collide, since the __LINE__ value
+     would be the same for both invocations.  (The GCC __COUNTER__
+     macro solves this problem, but is not portable.)
+
+     A solution is to use the sizeof operator.  It yields a number,
+     getting rid of the identity of the type.  Declarations like
+
+       extern int dummy [sizeof (struct {...})];
+       extern void dummy (int [sizeof (struct {...})]);
+       extern int (*dummy (void)) [sizeof (struct {...})];
+
+     can be repeated.
+
+   * Should the implementation use a named struct or an unnamed struct?
+     Which of the following alternatives can be used?
+
+       extern int dummy [sizeof (struct {...})];
+       extern int dummy [sizeof (struct _gl_verify_type {...})];
+       extern void dummy (int [sizeof (struct {...})]);
+       extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
+       extern int (*dummy (void)) [sizeof (struct {...})];
+       extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
+
+     In the second and sixth case, the struct type is exported to the
+     outer scope; two such declarations therefore collide.  GCC warns
+     about the first, third, and fourth cases.  So the only remaining
+     possibility is the fifth case:
+
+       extern int (*dummy (void)) [sizeof (struct {...})];
+
+   * GCC warns about duplicate declarations of the dummy function if
+     -Wredundant-decls is used.  GCC 4.3 and later have a builtin
+     __COUNTER__ macro that can let us generate unique identifiers for
+     each dummy function, to suppress this warning.
+
+   * This implementation exploits the fact that older versions of GCC,
+     which do not support _Static_assert, also do not warn about the
+     last declaration mentioned above.
+
+   * GCC warns if -Wnested-externs is enabled and 'verify' is used
+     within a function body; but inside a function, you can always
+     arrange to use verify_expr instead.
+
+   * In C++, any struct definition inside sizeof is invalid.
+     Use a template type to work around the problem.  */
+
+/* Concatenate two preprocessor tokens.  */
+#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+#define _GL_CONCAT0(x, y) x##y
+
+/* _GL_COUNTER is an integer, preferably one that changes each time we
+   use it.  Use __COUNTER__ if it works, falling back on __LINE__
+   otherwise.  __LINE__ isn't perfect, but it's better than a
+   constant.  */
+#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+# define _GL_COUNTER __COUNTER__
+#else
+# define _GL_COUNTER __LINE__
+#endif
+
+/* Generate a symbol with the given prefix, making it unique if
+   possible.  */
+#define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
+
+/* Verify requirement R at compile-time, as an integer constant expression
+   that returns 1.  If R is false, fail at compile-time, preferably
+   with a diagnostic that includes the string-literal DIAGNOSTIC.  */
+
+#define _GL_VERIFY_TRUE(R, DIAGNOSTIC) \
+   (!!sizeof (_GL_VERIFY_TYPE (R, DIAGNOSTIC)))
+
+#ifdef __cplusplus
+# if !GNULIB_defined_struct__gl_verify_type
+template <int w>
+  struct _gl_verify_type {
+    unsigned int _gl_verify_error_if_negative: w;
+  };
+#  define GNULIB_defined_struct__gl_verify_type 1
+# endif
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+    _gl_verify_type<(R) ? 1 : -1>
+#elif defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+    struct {                                   \
+      _Static_assert (R, DIAGNOSTIC);          \
+      int _gl_dummy;                          \
+    }
+#else
+# define _GL_VERIFY_TYPE(R, DIAGNOSTIC) \
+    struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
+#endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+   trailing ';'.  If R is false, fail at compile-time.
+
+   This macro requires three or more arguments but uses at most the first
+   two, so that the _Static_assert macro optionally defined below supports
+   both the C11 two-argument syntax and the C2X one-argument syntax.
+
+   Unfortunately, unlike C11, this implementation must appear as an
+   ordinary declaration, and cannot appear inside struct { ... }.  */
+
+#if defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)
+#else
+# define _GL_VERIFY(R, DIAGNOSTIC, ...)                                \
+    extern int (*_GL_GENSYM (_gl_verify_function) (void))             \
+      [_GL_VERIFY_TRUE (R, DIAGNOSTIC)]
+#endif
+
+/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h.  */
+#ifdef _GL_STATIC_ASSERT_H
+# if !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert
+#  define _Static_assert(...) \
+     _GL_VERIFY (__VA_ARGS__, "static assertion failed", -)
+# endif
+# if !defined _GL_HAVE_STATIC_ASSERT1 && !defined static_assert
+#  define static_assert _Static_assert /* C11 requires this #define.  */
+# endif
+#endif
+
+/* @assert.h omit start@  */
+
+#if 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))
+# define _GL_HAS_BUILTIN_TRAP 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_TRAP __has_builtin (__builtin_trap)
+#else
+# define _GL_HAS_BUILTIN_TRAP 0
+#endif
+
+#if 4 < __GNUC__ + (5 <= __GNUC_MINOR__)
+# define _GL_HAS_BUILTIN_UNREACHABLE 1
+#elif defined __has_builtin
+# define _GL_HAS_BUILTIN_UNREACHABLE __has_builtin (__builtin_unreachable)
+#else
+# define _GL_HAS_BUILTIN_UNREACHABLE 0
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero.  To
+   be portable, R should be an integer constant expression.  Unlike
+   assert (R), there is no run-time overhead.
+
+   There are two macros, since no single macro can be used in all
+   contexts in C.  verify_expr (R, E) is for scalar contexts, including
+   integer constant expression contexts.  verify (R) is for declaration
+   contexts, e.g., the top level.  */
+
+/* Verify requirement R at compile-time.  Return the value of the
+   expression E.  */
+
+#define verify_expr(R, E) \
+   (_GL_VERIFY_TRUE (R, "verify_expr (" #R ", " #E ")") ? (E) : (E))
+
+/* Verify requirement R at compile-time, as a declaration without a
+   trailing ';'.  verify (R) acts like static_assert (R) except that
+   it is portable to C11/C++14 and earlier, it can issue better
+   diagnostics, and its name is shorter and may be more convenient.  */
+
+#ifdef __PGI
+/* PGI barfs if R is long.  */
+# define verify(R) _GL_VERIFY (R, "verify (...)", -)
+#else
+# define verify(R) _GL_VERIFY (R, "verify (" #R ")", -)
+#endif
+
+/* Assume that R always holds.  Behavior is undefined if R is false,
+   fails to evaluate, or has side effects.  Although assuming R can
+   help a compiler generate better code or diagnostics, performance
+   can suffer if R uses hard-to-optimize features such as function
+   calls not inlined by the compiler.  */
+
+#if _GL_HAS_BUILTIN_UNREACHABLE
+# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
+#elif 1200 <= _MSC_VER
+# define assume(R) __assume (R)
+#elif (defined GCC_LINT || defined lint) && _GL_HAS_BUILTIN_TRAP
+  /* Doing it this way helps various packages when configured with
+     --enable-gcc-warnings, which compiles with -Dlint.  It's nicer
+     when 'assume' silences warnings even with older GCCs.  */
+# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
+#else
+  /* Some tools grok NOTREACHED, e.g., Oracle Studio 12.6.  */
+# define assume(R) ((R) ? (void) 0 : /*NOTREACHED*/ (void) 0)
+#endif
+
+/* @assert.h omit end@  */
+
+#endif
diff --git a/lib/warn-on-use.h b/lib/warn-on-use.h
new file mode 100644 (file)
index 0000000..1be2cbb
--- /dev/null
@@ -0,0 +1,131 @@
+/* A C macro for emitting warnings if a function is used.
+   Copyright (C) 2010-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
+   for FUNCTION which will then trigger a compiler warning containing
+   the text of "literal string" anywhere that function is called, if
+   supported by the compiler.  If the compiler does not support this
+   feature, the macro expands to an unused extern declaration.
+
+   _GL_WARN_ON_USE_ATTRIBUTE ("literal string") expands to the
+   attribute used in _GL_WARN_ON_USE.  If the compiler does not support
+   this feature, it expands to empty.
+
+   These macros are useful for marking a function as a potential
+   portability trap, with the intent that "literal string" include
+   instructions on the replacement function that should be used
+   instead.
+   _GL_WARN_ON_USE is for functions with 'extern' linkage.
+   _GL_WARN_ON_USE_ATTRIBUTE is for functions with 'static' or 'inline'
+   linkage.
+
+   However, one of the reasons that a function is a portability trap is
+   if it has the wrong signature.  Declaring FUNCTION with a different
+   signature in C is a compilation error, so this macro must use the
+   same type as any existing declaration so that programs that avoid
+   the problematic FUNCTION do not fail to compile merely because they
+   included a header that poisoned the function.  But this implies that
+   _GL_WARN_ON_USE is only safe to use if FUNCTION is known to already
+   have a declaration.  Use of this macro implies that there must not
+   be any other macro hiding the declaration of FUNCTION; but
+   undefining FUNCTION first is part of the poisoning process anyway
+   (although for symbols that are provided only via a macro, the result
+   is a compilation error rather than a warning containing
+   "literal string").  Also note that in C++, it is only safe to use if
+   FUNCTION has no overloads.
+
+   For an example, it is possible to poison 'getline' by:
+   - adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
+     [getline]) in configure.ac, which potentially defines
+     HAVE_RAW_DECL_GETLINE
+   - adding this code to a header that wraps the system <stdio.h>:
+     #undef getline
+     #if HAVE_RAW_DECL_GETLINE
+     _GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
+       "not universally present; use the gnulib module getline");
+     #endif
+
+   It is not possible to directly poison global variables.  But it is
+   possible to write a wrapper accessor function, and poison that
+   (less common usage, like &environ, will cause a compilation error
+   rather than issue the nice warning, but the end result of informing
+   the developer about their portability problem is still achieved):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     rpl_environ (void) { return &environ; }
+     _GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   or better (avoiding contradictory use of 'static' and 'extern'):
+     #if HAVE_RAW_DECL_ENVIRON
+     static char ***
+     _GL_WARN_ON_USE_ATTRIBUTE ("environ is not always properly declared")
+     rpl_environ (void) { return &environ; }
+     # undef environ
+     # define environ (*rpl_environ ())
+     #endif
+   */
+#ifndef _GL_WARN_ON_USE
+
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+/* A compiler attribute is available in gcc versions 4.3.0 and later.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message) \
+  __attribute__ ((__warning__ (message)))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE(function, message) \
+extern __typeof__ (function) function
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE(function, message) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+#  define _GL_WARN_ON_USE_ATTRIBUTE(message)
+# endif
+#endif
+
+/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
+   is like _GL_WARN_ON_USE (function, "string"), except that the function is
+   declared with the given prototype, consisting of return type, parameters,
+   and attributes.
+   This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
+   not work in this case.  */
+#ifndef _GL_WARN_ON_USE_CXX
+# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
+#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+extern rettype function parameters_and_attributes \
+     __attribute__ ((__warning__ (msg)))
+# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
+/* Verify the existence of the function.  */
+#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+extern rettype function parameters_and_attributes
+# else /* Unsupported.  */
+#  define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
+_GL_WARN_EXTERN_C int _gl_warn_on_use
+# endif
+#endif
+
+/* _GL_WARN_EXTERN_C declaration;
+   performs the declaration with C linkage.  */
+#ifndef _GL_WARN_EXTERN_C
+# if defined __cplusplus
+#  define _GL_WARN_EXTERN_C extern "C"
+# else
+#  define _GL_WARN_EXTERN_C extern
+# endif
+#endif
diff --git a/lib/xalloc-die.c b/lib/xalloc-die.c
new file mode 100644 (file)
index 0000000..68559de
--- /dev/null
@@ -0,0 +1,41 @@
+/* Report a memory allocation failure and exit.
+
+   Copyright (C) 1997-2000, 2002-2004, 2006, 2009-2020 Free Software
+   Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "xalloc.h"
+
+#include <stdlib.h>
+
+#include "error.h"
+#include "exitfail.h"
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+void
+xalloc_die (void)
+{
+  error (exit_failure, 0, "%s", _("memory exhausted"));
+
+  /* _Noreturn cannot be given to error, since it may return if
+     its first argument is 0.  To help compilers understand the
+     xalloc_die does not return, call abort.  Also, the abort is a
+     safety feature if exit_failure is 0 (which shouldn't happen).  */
+  abort ();
+}
diff --git a/lib/xalloc-oversized.h b/lib/xalloc-oversized.h
new file mode 100644 (file)
index 0000000..13ee230
--- /dev/null
@@ -0,0 +1,60 @@
+/* xalloc-oversized.h -- memory allocation size checking
+
+   Copyright (C) 1990-2000, 2003-2004, 2006-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef XALLOC_OVERSIZED_H_
+#define XALLOC_OVERSIZED_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+/* True if N * S would overflow in a size_t calculation,
+   or would generate a value larger than PTRDIFF_MAX.
+   This expands to a constant expression if N and S are both constants.
+   By gnulib convention, SIZE_MAX represents overflow in size
+   calculations, so the conservative size_t-based dividend to use here
+   is SIZE_MAX - 1.  */
+#define __xalloc_oversized(n, s) \
+  ((size_t) (PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX - 1) / (s) < (n))
+
+#if PTRDIFF_MAX < SIZE_MAX
+typedef ptrdiff_t __xalloc_count_type;
+#else
+typedef size_t __xalloc_count_type;
+#endif
+
+/* Return 1 if an array of N objects, each of size S, cannot exist
+   reliably due to size or ptrdiff_t arithmetic overflow.  S must be
+   positive and N must be nonnegative.  This is a macro, not a
+   function, so that it works correctly even when SIZE_MAX < N.  */
+
+#if 7 <= __GNUC__
+# define xalloc_oversized(n, s) \
+   __builtin_mul_overflow_p (n, s, (__xalloc_count_type) 1)
+#elif 5 <= __GNUC__ && !defined __ICC && !__STRICT_ANSI__
+# define xalloc_oversized(n, s) \
+   (__builtin_constant_p (n) && __builtin_constant_p (s) \
+    ? __xalloc_oversized (n, s) \
+    : ({ __xalloc_count_type __xalloc_count; \
+         __builtin_mul_overflow (n, s, &__xalloc_count); }))
+
+/* Other compilers use integer division; this may be slower but is
+   more portable.  */
+#else
+# define xalloc_oversized(n, s) __xalloc_oversized (n, s)
+#endif
+
+#endif /* !XALLOC_OVERSIZED_H_ */
diff --git a/lib/xalloc.h b/lib/xalloc.h
new file mode 100644 (file)
index 0000000..9563b0b
--- /dev/null
@@ -0,0 +1,262 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+   Copyright (C) 1990-2000, 2003-2004, 2006-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef XALLOC_H_
+#define XALLOC_H_
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include "xalloc-oversized.h"
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef XALLOC_INLINE
+# define XALLOC_INLINE _GL_INLINE
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if ! defined __clang__ && \
+    (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
+#else
+# define _GL_ATTRIBUTE_ALLOC_SIZE(args)
+#endif
+
+/* This function is always triggered when memory is exhausted.
+   It must be defined by the application, either explicitly
+   or by using gnulib's xalloc-die module.  This is the
+   function to call when one wants the program to die because of a
+   memory allocation failure.  */
+extern _Noreturn void xalloc_die (void);
+
+void *xmalloc (size_t s)
+      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+void *xzalloc (size_t s)
+      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+void *xcalloc (size_t n, size_t s)
+      _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+void *xrealloc (void *p, size_t s)
+      _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+void *x2realloc (void *p, size_t *pn);
+void *xmemdup (void const *p, size_t s)
+      _GL_ATTRIBUTE_ALLOC_SIZE ((2));
+char *xstrdup (char const *str)
+      _GL_ATTRIBUTE_MALLOC;
+
+/* In the following macros, T must be an elementary or structure/union or
+   typedef'ed type, or a pointer to such a type.  To apply one of the
+   following macros to a function pointer or array type, you need to typedef
+   it first and use the typedef name.  */
+
+/* Allocate an object of type T dynamically, with error checking.  */
+/* extern t *XMALLOC (typename t); */
+#define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking.  */
+/* extern t *XNMALLOC (size_t n, typename t); */
+#define XNMALLOC(n, t) \
+   ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
+
+/* Allocate an object of type T dynamically, with error checking,
+   and zero it.  */
+/* extern t *XZALLOC (typename t); */
+#define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking,
+   and zero it.  */
+/* extern t *XCALLOC (size_t n, typename t); */
+#define XCALLOC(n, t) \
+   ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
+
+
+/* Allocate an array of N objects, each with S bytes of memory,
+   dynamically, with error checking.  S must be nonzero.  */
+
+XALLOC_INLINE void *xnmalloc (size_t n, size_t s)
+                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2));
+XALLOC_INLINE void *
+xnmalloc (size_t n, size_t s)
+{
+  if (xalloc_oversized (n, s))
+    xalloc_die ();
+  return xmalloc (n * s);
+}
+
+/* Change the size of an allocated block of memory P to an array of N
+   objects each of S bytes, with error checking.  S must be nonzero.  */
+
+XALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s)
+                    _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3));
+XALLOC_INLINE void *
+xnrealloc (void *p, size_t n, size_t s)
+{
+  if (xalloc_oversized (n, s))
+    xalloc_die ();
+  return xrealloc (p, n * s);
+}
+
+/* If P is null, allocate a block of at least *PN such objects;
+   otherwise, reallocate P so that it contains more than *PN objects
+   each of S bytes.  S must be nonzero.  Set *PN to the new number of
+   objects, and return the pointer to the new block.  *PN is never set
+   to zero, and the returned pointer is never null.
+
+   Repeated reallocations are guaranteed to make progress, either by
+   allocating an initial block with a nonzero size, or by allocating a
+   larger block.
+
+   In the following implementation, nonzero sizes are increased by a
+   factor of approximately 1.5 so that repeated reallocations have
+   O(N) overall cost rather than O(N**2) cost, but the
+   specification for this function does not guarantee that rate.
+
+   Here is an example of use:
+
+     int *p = NULL;
+     size_t used = 0;
+     size_t allocated = 0;
+
+     void
+     append_int (int value)
+       {
+         if (used == allocated)
+           p = x2nrealloc (p, &allocated, sizeof *p);
+         p[used++] = value;
+       }
+
+   This causes x2nrealloc to allocate a block of some nonzero size the
+   first time it is called.
+
+   To have finer-grained control over the initial size, set *PN to a
+   nonzero value before calling this function with P == NULL.  For
+   example:
+
+     int *p = NULL;
+     size_t used = 0;
+     size_t allocated = 0;
+     size_t allocated1 = 1000;
+
+     void
+     append_int (int value)
+       {
+         if (used == allocated)
+           {
+             p = x2nrealloc (p, &allocated1, sizeof *p);
+             allocated = allocated1;
+           }
+         p[used++] = value;
+       }
+
+   */
+
+XALLOC_INLINE void *
+x2nrealloc (void *p, size_t *pn, size_t s)
+{
+  size_t n = *pn;
+
+  if (! p)
+    {
+      if (! n)
+        {
+          /* The approximate size to use for initial small allocation
+             requests, when the invoking code specifies an old size of
+             zero.  This is the largest "small" request for the GNU C
+             library malloc.  */
+          enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+          n = DEFAULT_MXFAST / s;
+          n += !n;
+        }
+      if (xalloc_oversized (n, s))
+        xalloc_die ();
+    }
+  else
+    {
+      /* Set N = floor (1.5 * N) + 1 so that progress is made even if N == 0.
+         Check for overflow, so that N * S stays in both ptrdiff_t and
+         size_t range.  The check may be slightly conservative, but an
+         exact check isn't worth the trouble.  */
+      if ((PTRDIFF_MAX < SIZE_MAX ? PTRDIFF_MAX : SIZE_MAX) / 3 * 2 / s
+          <= n)
+        xalloc_die ();
+      n += n / 2 + 1;
+    }
+
+  *pn = n;
+  return xrealloc (p, n * s);
+}
+
+/* Return a pointer to a new buffer of N bytes.  This is like xmalloc,
+   except it returns char *.  */
+
+XALLOC_INLINE char *xcharalloc (size_t n)
+                    _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1));
+XALLOC_INLINE char *
+xcharalloc (size_t n)
+{
+  return XNMALLOC (n, char);
+}
+
+#ifdef __cplusplus
+}
+
+/* C++ does not allow conversions from void * to other pointer types
+   without a cast.  Use templates to work around the problem when
+   possible.  */
+
+template <typename T> inline T *
+xrealloc (T *p, size_t s)
+{
+  return (T *) xrealloc ((void *) p, s);
+}
+
+template <typename T> inline T *
+xnrealloc (T *p, size_t n, size_t s)
+{
+  return (T *) xnrealloc ((void *) p, n, s);
+}
+
+template <typename T> inline T *
+x2realloc (T *p, size_t *pn)
+{
+  return (T *) x2realloc ((void *) p, pn);
+}
+
+template <typename T> inline T *
+x2nrealloc (T *p, size_t *pn, size_t s)
+{
+  return (T *) x2nrealloc ((void *) p, pn, s);
+}
+
+template <typename T> inline T *
+xmemdup (T const *p, size_t s)
+{
+  return (T *) xmemdup ((void const *) p, s);
+}
+
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* !XALLOC_H_ */
diff --git a/lib/xconcat-filename.c b/lib/xconcat-filename.c
new file mode 100644 (file)
index 0000000..e04d433
--- /dev/null
@@ -0,0 +1,41 @@
+/* Construct a full filename from a directory and a relative filename.
+   Copyright (C) 2001-2004, 2006-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3 of the License, or any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <haible@clisp.cons.org>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "concat-filename.h"
+
+#include "xalloc.h"
+
+/* Concatenate a directory filename, a relative filename and an optional
+   suffix.  The directory may end with the directory separator.  The second
+   argument may not start with the directory separator (it is relative).
+   Return a freshly allocated filename.  */
+char *
+xconcatenated_filename (const char *directory, const char *filename,
+                        const char *suffix)
+{
+  char *result;
+
+  result = concatenated_filename (directory, filename, suffix);
+  if (result == NULL)
+    xalloc_die ();
+
+  return result;
+}
diff --git a/lib/xmalloc.c b/lib/xmalloc.c
new file mode 100644 (file)
index 0000000..4868736
--- /dev/null
@@ -0,0 +1,122 @@
+/* xmalloc.c -- malloc with out of memory checking
+
+   Copyright (C) 1990-2000, 2002-2006, 2008-2020 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#define XALLOC_INLINE _GL_EXTERN_INLINE
+
+#include "xalloc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+/* 1 if calloc is known to be compatible with GNU calloc.  This
+   matters if we are not also using the calloc module, which defines
+   HAVE_CALLOC_GNU and supports the GNU API even on non-GNU platforms.  */
+#if defined HAVE_CALLOC_GNU || (defined __GLIBC__ && !defined __UCLIBC__)
+enum { HAVE_GNU_CALLOC = 1 };
+#else
+enum { HAVE_GNU_CALLOC = 0 };
+#endif
+
+/* Allocate N bytes of memory dynamically, with error checking.  */
+
+void *
+xmalloc (size_t n)
+{
+  void *p = malloc (n);
+  if (!p && n != 0)
+    xalloc_die ();
+  return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+   with error checking.  */
+
+void *
+xrealloc (void *p, size_t n)
+{
+  if (!n && p)
+    {
+      /* The GNU and C99 realloc behaviors disagree here.  Act like
+         GNU, even if the underlying realloc is C99.  */
+      free (p);
+      return NULL;
+    }
+
+  p = realloc (p, n);
+  if (!p && n)
+    xalloc_die ();
+  return p;
+}
+
+/* If P is null, allocate a block of at least *PN bytes; otherwise,
+   reallocate P so that it contains more than *PN bytes.  *PN must be
+   nonzero unless P is null.  Set *PN to the new block's size, and
+   return the pointer to the new block.  *PN is never set to zero, and
+   the returned pointer is never null.  */
+
+void *
+x2realloc (void *p, size_t *pn)
+{
+  return x2nrealloc (p, pn, 1);
+}
+
+/* Allocate N bytes of zeroed memory dynamically, with error checking.
+   There's no need for xnzalloc (N, S), since it would be equivalent
+   to xcalloc (N, S).  */
+
+void *
+xzalloc (size_t n)
+{
+  return xcalloc (n, 1);
+}
+
+/* Allocate zeroed memory for N elements of S bytes, with error
+   checking.  S must be nonzero.  */
+
+void *
+xcalloc (size_t n, size_t s)
+{
+  void *p;
+  /* Test for overflow, since objects with size greater than
+     PTRDIFF_MAX cause pointer subtraction to go awry.  Omit size-zero
+     tests if HAVE_GNU_CALLOC, since GNU calloc never returns NULL if
+     successful.  */
+  if (xalloc_oversized (n, s)
+      || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0)))
+    xalloc_die ();
+  return p;
+}
+
+/* Clone an object P of size S, with error checking.  There's no need
+   for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
+   need for an arithmetic overflow check.  */
+
+void *
+xmemdup (void const *p, size_t s)
+{
+  return memcpy (xmalloc (s), p, s);
+}
+
+/* Clone STRING.  */
+
+char *
+xstrdup (char const *string)
+{
+  return xmemdup (string, strlen (string) + 1);
+}
diff --git a/load.c b/load.c
deleted file mode 100644 (file)
index 37e7b8e..0000000
--- a/load.c
+++ /dev/null
@@ -1,267 +0,0 @@
-/* Loading dynamic objects for GNU Make.
-Copyright (C) 2012-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#if MAKE_LOAD
-
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <dlfcn.h>
-#include <errno.h>
-
-#define SYMBOL_EXTENSION        "_gmk_setup"
-
-#include "debug.h"
-#include "filedef.h"
-#include "variable.h"
-
-/* Tru64 V4.0 does not have this flag */
-#ifndef RTLD_GLOBAL
-# define RTLD_GLOBAL 0
-#endif
-
-struct load_list
-  {
-    struct load_list *next;
-    const char *name;
-    void *dlp;
-  };
-
-static struct load_list *loaded_syms = NULL;
-
-static load_func_t
-load_object (const floc *flocp, int noerror, const char *ldname,
-             const char *symname)
-{
-  static void *global_dl = NULL;
-  load_func_t symp;
-
-  if (! global_dl)
-    {
-      global_dl = dlopen (NULL, RTLD_NOW|RTLD_GLOBAL);
-      if (! global_dl)
-        {
-          const char *err = dlerror ();
-          OS (fatal, flocp, _("Failed to open global symbol table: %s"), err);
-        }
-    }
-
-  symp = (load_func_t) dlsym (global_dl, symname);
-  if (! symp)
-    {
-      struct load_list *new;
-      void *dlp = NULL;
-
-    /* If the path has no "/", try the current directory first.  */
-      if (! strchr (ldname, '/')
-#ifdef HAVE_DOS_PATHS
-          && ! strchr (ldname, '\\')
-#endif
-         )
-        dlp = dlopen (concat (2, "./", ldname), RTLD_LAZY|RTLD_GLOBAL);
-
-      /* If we haven't opened it yet, try the default search path.  */
-      if (! dlp)
-        dlp = dlopen (ldname, RTLD_LAZY|RTLD_GLOBAL);
-
-      /* Still no?  Then fail.  */
-      if (! dlp)
-        {
-          const char *err = dlerror ();
-          if (noerror)
-            DB (DB_BASIC, ("%s", err));
-          else
-            OS (error, flocp, "%s", err);
-          return NULL;
-        }
-
-      /* Assert that the GPL license symbol is defined.  */
-      symp = (load_func_t) dlsym (dlp, "plugin_is_GPL_compatible");
-      if (! symp)
-        OS (fatal, flocp,
-             _("Loaded object %s is not declared to be GPL compatible"),
-             ldname);
-
-      symp = (load_func_t) dlsym (dlp, symname);
-      if (! symp)
-        {
-          const char *err = dlerror ();
-          OSSS (fatal, flocp, _("Failed to load symbol %s from %s: %s"),
-                symname, ldname, err);
-        }
-
-      /* Add this symbol to a trivial lookup table.  This is not efficient but
-         it's highly unlikely we'll be loading lots of objects, and we only
-         need it to look them up on unload, if we rebuild them.  */
-      new = xmalloc (sizeof (struct load_list));
-      new->name = xstrdup (ldname);
-      new->dlp = dlp;
-      new->next = loaded_syms;
-      loaded_syms = new;
-    }
-
-  return symp;
-}
-
-int
-load_file (const floc *flocp, const char **ldname, int noerror)
-{
-  int nmlen = strlen (*ldname);
-  char *new = alloca (nmlen + CSTRLEN (SYMBOL_EXTENSION) + 1);
-  char *symname = NULL;
-  char *loaded;
-  const char *fp;
-  int r;
-  load_func_t symp;
-
-  /* Break the input into an object file name and a symbol name.  If no symbol
-     name was provided, compute one from the object file name.  */
-  fp = strchr (*ldname, '(');
-  if (fp)
-    {
-      const char *ep;
-
-      /* There's an open paren, so see if there's a close paren: if so use
-         that as the symbol name.  We can't have whitespace: it would have
-         been chopped up before this function is called.  */
-      ep = strchr (fp+1, ')');
-      if (ep && ep[1] == '\0')
-        {
-          int l = fp - *ldname;;
-
-          ++fp;
-          if (fp == ep)
-            OS (fatal, flocp, _("Empty symbol name for load: %s"), *ldname);
-
-          /* Make a copy of the ldname part.  */
-          memcpy (new, *ldname, l);
-          new[l] = '\0';
-          *ldname = new;
-          nmlen = l;
-
-          /* Make a copy of the symbol name part.  */
-          symname = new + l + 1;
-          memcpy (symname, fp, ep - fp);
-          symname[ep - fp] = '\0';
-        }
-    }
-
-  /* Add this name to the string cache so it can be reused later.  */
-  *ldname = strcache_add (*ldname);
-
-  /* If this object has been loaded, we're done.  */
-  loaded = allocated_variable_expand ("$(.LOADED)");
-  fp = strstr (loaded, *ldname);
-  r = fp && (fp==loaded || fp[-1]==' ') && (fp[nmlen]=='\0' || fp[nmlen]==' ');
-  if (r)
-    goto exit;
-
-  /* If we didn't find a symbol name yet, construct it from the ldname.  */
-  if (! symname)
-    {
-      char *p = new;
-
-      fp = strrchr (*ldname, '/');
-#ifdef HAVE_DOS_PATHS
-      if (fp)
-        {
-          const char *fp2 = strchr (fp, '\\');
-
-          if (fp2 > fp)
-            fp = fp2;
-        }
-      else
-        fp = strrchr (*ldname, '\\');
-      /* The (improbable) case of d:foo.  */
-      if (fp && *fp && fp[1] == ':')
-        fp++;
-#endif
-      if (!fp)
-        fp = *ldname;
-      else
-        ++fp;
-      while (isalnum (*fp) || *fp == '_')
-        *(p++) = *(fp++);
-      strcpy (p, SYMBOL_EXTENSION);
-      symname = new;
-    }
-
-  DB (DB_VERBOSE, (_("Loading symbol %s from %s\n"), symname, *ldname));
-
-  /* Load it!  */
-  symp = load_object (flocp, noerror, *ldname, symname);
-  if (! symp)
-    return 0;
-
-  /* Invoke the symbol.  */
-  r = (*symp) (flocp);
-
-  /* If it succeeded, add the load file to the loaded variable.  */
-  if (r > 0)
-    {
-      size_t loadlen = strlen (loaded);
-      char *newval = alloca (loadlen + strlen (*ldname) + 2);
-      /* Don't add a space if it's empty.  */
-      if (loadlen)
-        {
-          memcpy (newval, loaded, loadlen);
-          newval[loadlen++] = ' ';
-        }
-      strcpy (&newval[loadlen], *ldname);
-      do_variable_definition (flocp, ".LOADED", newval, o_default, f_simple, 0);
-    }
-
- exit:
-  free (loaded);
-  return r;
-}
-
-void
-unload_file (const char *name)
-{
-  struct load_list *d;
-
-  for (d = loaded_syms; d != NULL; d = d->next)
-    if (streq (d->name, name) && d->dlp)
-      {
-        if (dlclose (d->dlp))
-          perror_with_name ("dlclose", d->name);
-        d->dlp = NULL;
-        break;
-      }
-}
-
-#else
-
-int
-load_file (const floc *flocp, const char **ldname UNUSED, int noerror)
-{
-  if (! noerror)
-    O (fatal, flocp,
-       _("The 'load' operation is not supported on this platform."));
-
-  return 0;
-}
-
-void
-unload_file (const char *name UNUSED)
-{
-  O (fatal, NILF, "INTERNAL: Cannot unload when load is not supported!");
-}
-
-#endif  /* MAKE_LOAD */
diff --git a/loadapi.c b/loadapi.c
deleted file mode 100644 (file)
index 14b75f8..0000000
--- a/loadapi.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* API for GNU Make dynamic objects.
-Copyright (C) 2013-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include "filedef.h"
-#include "variable.h"
-#include "dep.h"
-
-/* Allocate a buffer in our context, so we can free it.  */
-char *
-gmk_alloc (unsigned int len)
-{
-  return xmalloc (len);
-}
-
-/* Free a buffer returned by gmk_expand().  */
-void
-gmk_free (char *s)
-{
-  free (s);
-}
-
-/* Evaluate a buffer as make syntax.
-   Ideally eval_buffer() will take const char *, but not yet.  */
-void
-gmk_eval (const char *buffer, const gmk_floc *gfloc)
-{
-  /* Preserve existing variable buffer context.  */
-  char *pbuf;
-  unsigned int plen;
-  char *s;
-  floc fl;
-  floc *flp;
-
-  if (gfloc)
-    {
-      fl.filenm = gfloc->filenm;
-      fl.lineno = gfloc->lineno;
-      fl.offset = 0;
-      flp = &fl;
-    }
-  else
-    flp = NULL;
-
-  install_variable_buffer (&pbuf, &plen);
-
-  s = xstrdup (buffer);
-  eval_buffer (s, flp);
-  free (s);
-
-  restore_variable_buffer (pbuf, plen);
-}
-
-/* Expand a string and return an allocated buffer.
-   Caller must call gmk_free() with this buffer.  */
-char *
-gmk_expand (const char *ref)
-{
-  return allocated_variable_expand (ref);
-}
-
-/* Register a function to be called from makefiles.  */
-void
-gmk_add_function (const char *name, gmk_func_ptr func,
-                  unsigned int min, unsigned int max, unsigned int flags)
-{
-  define_new_function (reading_file, name, min, max, flags, func);
-}
diff --git a/m4/00gnulib.m4 b/m4/00gnulib.m4
new file mode 100644 (file)
index 0000000..1a1a1d7
--- /dev/null
@@ -0,0 +1,46 @@
+# 00gnulib.m4 serial 3
+dnl Copyright (C) 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This file must be named something that sorts before all other
+dnl gnulib-provided .m4 files.  It is needed until such time as we can
+dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE and
+dnl m4_divert semantics.
+
+# Until autoconf 2.63, handling of the diversion stack required m4_init
+# to be called first; but this does not happen with aclocal.  Wrapping
+# the entire execution in another layer of the diversion stack fixes this.
+# Worse, prior to autoconf 2.62, m4_wrap depended on the underlying m4
+# for whether it was FIFO or LIFO; in order to properly balance with
+# m4_init, we need to undo our push just before anything wrapped within
+# the m4_init body.  The way to ensure this is to wrap both sides of
+# m4_init with a one-shot macro that does the pop at the right time.
+m4_ifndef([_m4_divert_diversion],
+[m4_divert_push([KILL])
+m4_define([gl_divert_fixup], [m4_divert_pop()m4_define([$0])])
+m4_define([m4_init],
+  [gl_divert_fixup()]m4_defn([m4_init])[gl_divert_fixup()])])
+
+
+# AC_DEFUN_ONCE([NAME], VALUE)
+# ----------------------------
+# Define NAME to expand to VALUE on the first use (whether by direct
+# expansion, or by AC_REQUIRE), and to nothing on all subsequent uses.
+# Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier.  This
+# definition is slower than the version in Autoconf 2.64, because it
+# can only use interfaces that existed since 2.59; but it achieves the
+# same effect.  Quoting is necessary to avoid confusing Automake.
+m4_version_prereq([2.63.263], [],
+[m4_define([AC][_DEFUN_ONCE],
+  [AC][_DEFUN([$1],
+    [AC_REQUIRE([_gl_DEFUN_ONCE([$1])],
+      [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl
+[AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])])
+
+# gl_00GNULIB
+# -----------
+# Witness macro that this file has been included.  Needed to force
+# Automake to include this file prior to all other gnulib .m4 files.
+AC_DEFUN([gl_00GNULIB])
diff --git a/m4/absolute-header.m4 b/m4/absolute-header.m4
new file mode 100644 (file)
index 0000000..39726ba
--- /dev/null
@@ -0,0 +1,102 @@
+# absolute-header.m4 serial 16
+dnl Copyright (C) 2006-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Derek Price.
+
+# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
+# ---------------------------------------
+# Find the absolute name of a header file, testing first if the header exists.
+# If the header were sys/inttypes.h, this macro would define
+# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
+# in config.h
+# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+AC_DEFUN([gl_ABSOLUTE_HEADER],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PREPROC_REQUIRE()dnl
+dnl FIXME: gl_absolute_header and ac_header_exists must be used unquoted
+dnl until we can assume autoconf 2.64 or newer.
+m4_foreach_w([gl_HEADER_NAME], [$1],
+  [AS_VAR_PUSHDEF([gl_absolute_header],
+                  [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
+  AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+    m4_defn([gl_absolute_header]),
+    [AS_VAR_PUSHDEF([ac_header_exists],
+                    [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
+    AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
+    if test AS_VAR_GET(ac_header_exists) = yes; then
+      gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
+    fi
+    AS_VAR_POPDEF([ac_header_exists])dnl
+    ])dnl
+  AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
+                     ["AS_VAR_GET(gl_absolute_header)"],
+                     [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
+  AS_VAR_POPDEF([gl_absolute_header])dnl
+])dnl
+])# gl_ABSOLUTE_HEADER
+
+# gl_ABSOLUTE_HEADER_ONE(HEADER)
+# ------------------------------
+# Like gl_ABSOLUTE_HEADER, except that:
+#   - it assumes that the header exists,
+#   - it uses the current CPPFLAGS,
+#   - it does not cache the result,
+#   - it is silent.
+AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
+  dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
+  dnl that contain only a #include of other header files and no
+  dnl non-comment tokens of their own. This leads to a failure to
+  dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
+  dnl and others. The workaround is to force preservation of comments
+  dnl through option -C. This ensures all necessary #line directives
+  dnl are present. GCC supports option -C as well.
+  case "$host_os" in
+    aix*) gl_absname_cpp="$ac_cpp -C" ;;
+    *)    gl_absname_cpp="$ac_cpp" ;;
+  esac
+changequote(,)
+  case "$host_os" in
+    mingw*)
+      dnl For the sake of native Windows compilers (excluding gcc),
+      dnl treat backslash as a directory separator, like /.
+      dnl Actually, these compilers use a double-backslash as
+      dnl directory separator, inside the
+      dnl   # line "filename"
+      dnl directives.
+      gl_dirsep_regex='[/\\]'
+      ;;
+    *)
+      gl_dirsep_regex='\/'
+      ;;
+  esac
+  dnl A sed expression that turns a string into a basic regular
+  dnl expression, for use within "/.../".
+  gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
+  gl_header_literal_regex=`echo '$1' \
+                           | sed -e "$gl_make_literal_regex_sed"`
+  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
+      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
+      s|^/[^/]|//&|
+      p
+      q
+    }'
+changequote([,])
+  dnl eval is necessary to expand gl_absname_cpp.
+  dnl Ultrix and Pyramid sh refuse to redirect output of eval,
+  dnl so use subshell.
+  AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
+[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
+  sed -n "$gl_absolute_header_sed"`])
+])
diff --git a/m4/access.m4 b/m4/access.m4
new file mode 100644 (file)
index 0000000..cfe799d
--- /dev/null
@@ -0,0 +1,16 @@
+# access.m4 serial 1
+dnl Copyright (C) 2019-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ACCESS],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  dnl On native Windows, access (= _access) does not support the X_OK mode.
+  dnl It works by chance on some versions of mingw.
+  case "$host_os" in
+    mingw*) REPLACE_ACCESS=1 ;;
+  esac
+])
diff --git a/m4/acinclude.m4 b/m4/acinclude.m4
new file mode 100644 (file)
index 0000000..a812aa0
--- /dev/null
@@ -0,0 +1,132 @@
+dnl acinclude.m4 -- Extra macros needed for GNU make.
+dnl
+dnl Automake will incorporate this into its generated aclocal.m4.
+dnl Copyright (C) 1998-2020 Free Software Foundation, Inc.
+dnl This file is part of GNU Make.
+dnl
+dnl GNU Make is free software; you can redistribute it and/or modify it under
+dnl the terms of the GNU General Public License as published by the Free
+dnl Software Foundation; either version 3 of the License, or (at your option)
+dnl any later version.
+dnl
+dnl GNU Make is distributed in the hope that it will be useful, but WITHOUT
+dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+dnl FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.
+dnl more details.
+dnl
+dnl You should have received a copy of the GNU General Public License along
+dnl with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+dnl ---------------------------------------------------------------------------
+dnl Got this from the lynx 2.8 distribution.
+dnl by T.E.Dickey <dickey@clark.net>
+dnl and Jim Spath <jspath@mail.bcpl.lib.md.us>
+dnl and Philippe De Muyter <phdm@macqel.be>
+dnl
+dnl Created: 1997/1/28
+dnl Updated: 1997/12/23
+dnl ---------------------------------------------------------------------------
+dnl After checking for functions in the default $LIBS, make a further check
+dnl for the functions that are netlib-related (these aren't always in the
+dnl libc, etc., and have to be handled specially because there are conflicting
+dnl and broken implementations.
+dnl Common library requirements (in order):
+dnl    -lresolv -lsocket -lnsl
+dnl    -lnsl -lsocket
+dnl    -lsocket
+dnl    -lbsd
+AC_DEFUN([CF_NETLIBS],[
+cf_test_netlibs=no
+AC_MSG_CHECKING(for network libraries)
+AC_CACHE_VAL(cf_cv_netlibs,[
+AC_MSG_RESULT(working...)
+cf_cv_netlibs=""
+cf_test_netlibs=yes
+AC_CHECK_FUNCS(gethostname,,[
+       CF_RECHECK_FUNC(gethostname,nsl,cf_cv_netlibs,[
+               CF_RECHECK_FUNC(gethostname,socket,cf_cv_netlibs)])])
+#
+# FIXME:  sequent needs this library (i.e., -lsocket -linet -lnsl), but
+# I don't know the entrypoints - 97/7/22 TD
+AC_CHECK_LIB(inet,main,cf_cv_netlibs="-linet $cf_cv_netlibs")
+#
+if test "$ac_cv_func_lsocket" != no ; then
+AC_CHECK_FUNCS(socket,,[
+       CF_RECHECK_FUNC(socket,socket,cf_cv_netlibs,[
+               CF_RECHECK_FUNC(socket,bsd,cf_cv_netlibs)])])
+fi
+#
+AC_CHECK_FUNCS(gethostbyname,,[
+       CF_RECHECK_FUNC(gethostbyname,nsl,cf_cv_netlibs)])
+])
+LIBS="$LIBS $cf_cv_netlibs"
+test $cf_test_netlibs = no && echo "$cf_cv_netlibs" >&AC_FD_MSG
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Re-check on a function to see if we can pick it up by adding a library.
+dnl    $1 = function to check
+dnl    $2 = library to check in
+dnl    $3 = environment to update (e.g., $LIBS)
+dnl    $4 = what to do if this fails
+dnl
+dnl This uses 'unset' if the shell happens to support it, but leaves the
+dnl configuration variable set to 'unknown' if not.  This is a little better
+dnl than the normal autoconf test, which gives misleading results if a test
+dnl for the function is made (e.g., with AC_CHECK_FUNC) after this macro is
+dnl used (autoconf does not distinguish between a null token and one that is
+dnl set to 'no').
+AC_DEFUN([CF_RECHECK_FUNC],[
+AC_CHECK_LIB($2,$1,[
+       CF_UPPER(cf_tr_func,$1)
+       AC_DEFINE_UNQUOTED(HAVE_$cf_tr_func,1,[Define if you have function $1])
+       ac_cv_func_$1=yes
+       $3="-l$2 [$]$3"],[
+       ac_cv_func_$1=unknown
+       unset ac_cv_func_$1 2>/dev/null
+       $4],
+       [[$]$3])
+])dnl
+dnl ---------------------------------------------------------------------------
+dnl Make an uppercase version of a variable
+dnl $1=uppercase($2)
+AC_DEFUN([CF_UPPER],
+[
+changequote(,)dnl
+$1=`echo $2 | tr '[a-z]' '[A-Z]'`
+changequote([,])dnl
+])dnl
+
+
+dnl ---------------------------------------------------------------------------
+dnl From Paul Eggert <eggert@twinsun.com>
+dnl Update for Darwin by Troy Runkel <Troy.Runkel@mathworks.com>
+dnl Update for AIX by Olexiy Buyanskyy (Savannah bug 32485)
+
+AC_DEFUN([AC_STRUCT_ST_MTIM_NSEC],
+ [AC_CACHE_CHECK([for nanoseconds field of struct stat],
+   ac_cv_struct_st_mtim_nsec,
+   [ac_save_CPPFLAGS="$CPPFLAGS"
+    ac_cv_struct_st_mtim_nsec=no
+    # st_mtim.tv_nsec -- the usual case
+    # st_mtim._tv_nsec -- Solaris 2.6, if
+    #  (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1
+    #   && !defined __EXTENSIONS__)
+    # st_mtim.st__tim.tv_nsec -- UnixWare 2.1.2
+    # st_mtime_n -- AIX 5.2 and above
+    # st_mtimespec.tv_nsec -- Darwin (Mac OSX)
+    for ac_val in st_mtim.tv_nsec st_mtim._tv_nsec st_mtim.st__tim.tv_nsec st_mtime_n st_mtimespec.tv_nsec; do
+      CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val"
+      AC_TRY_COMPILE([#include <sys/types.h>
+#include <sys/stat.h>
+       ], [struct stat s; s.ST_MTIM_NSEC;],
+        [ac_cv_struct_st_mtim_nsec=$ac_val; break])
+    done
+    CPPFLAGS="$ac_save_CPPFLAGS"
+   ])
+
+  if test $ac_cv_struct_st_mtim_nsec != no; then
+    AC_DEFINE_UNQUOTED([ST_MTIM_NSEC], [$ac_cv_struct_st_mtim_nsec],
+       [Define if struct stat contains a nanoseconds field])
+  fi
+ ]
+)
diff --git a/m4/alloca.m4 b/m4/alloca.m4
new file mode 100644 (file)
index 0000000..5922524
--- /dev/null
@@ -0,0 +1,128 @@
+# alloca.m4 serial 15
+dnl Copyright (C) 2002-2004, 2006-2007, 2009-2020 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_ALLOCA],
+[
+  AC_REQUIRE([AC_FUNC_ALLOCA])
+  if test $ac_cv_func_alloca_works = no; then
+    gl_PREREQ_ALLOCA
+  fi
+
+  # Define an additional variable used in the Makefile substitution.
+  if test $ac_cv_working_alloca_h = yes; then
+    AC_CACHE_CHECK([for alloca as a compiler built-in], [gl_cv_rpl_alloca], [
+      AC_EGREP_CPP([Need own alloca], [
+#if defined __GNUC__ || defined _AIX || defined _MSC_VER
+        Need own alloca
+#endif
+        ], [gl_cv_rpl_alloca=yes], [gl_cv_rpl_alloca=no])
+    ])
+    if test $gl_cv_rpl_alloca = yes; then
+      dnl OK, alloca can be implemented through a compiler built-in.
+      AC_DEFINE([HAVE_ALLOCA], [1],
+        [Define to 1 if you have 'alloca' after including <alloca.h>,
+         a header that may be supplied by this distribution.])
+      ALLOCA_H=alloca.h
+    else
+      dnl alloca exists as a library function, i.e. it is slow and probably
+      dnl a memory leak. Don't define HAVE_ALLOCA in this case.
+      ALLOCA_H=
+    fi
+  else
+    ALLOCA_H=alloca.h
+  fi
+  AC_SUBST([ALLOCA_H])
+  AM_CONDITIONAL([GL_GENERATE_ALLOCA_H], [test -n "$ALLOCA_H"])
+
+  if test $ac_cv_working_alloca_h = yes; then
+    HAVE_ALLOCA_H=1
+  else
+    HAVE_ALLOCA_H=0
+  fi
+  AC_SUBST([HAVE_ALLOCA_H])
+])
+
+# Prerequisites of lib/alloca.c.
+# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA.
+AC_DEFUN([gl_PREREQ_ALLOCA], [:])
+
+# This works around a bug in autoconf <= 2.68.
+# See <https://lists.gnu.org/r/bug-gnulib/2011-06/msg00277.html>.
+
+m4_version_prereq([2.69], [] ,[
+
+# This is taken from the following Autoconf patch:
+# https://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=6cd9f12520b0d6f76d3230d7565feba1ecf29497
+
+# _AC_LIBOBJ_ALLOCA
+# -----------------
+# Set up the LIBOBJ replacement of 'alloca'.  Well, not exactly
+# AC_LIBOBJ since we actually set the output variable 'ALLOCA'.
+# Nevertheless, for Automake, AC_LIBSOURCES it.
+m4_define([_AC_LIBOBJ_ALLOCA],
+[# The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+AC_LIBSOURCES(alloca.c)
+AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.$ac_objext])dnl
+AC_DEFINE(C_ALLOCA, 1, [Define to 1 if using 'alloca.c'.])
+
+AC_CACHE_CHECK(whether 'alloca.c' needs Cray hooks, ac_cv_os_cray,
+[AC_EGREP_CPP(webecray,
+[#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+], ac_cv_os_cray=yes, ac_cv_os_cray=no)])
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    AC_CHECK_FUNC($ac_func,
+                  [AC_DEFINE_UNQUOTED(CRAY_STACKSEG_END, $ac_func,
+                                      [Define to one of '_getb67', 'GETB67',
+                                       'getb67' for Cray-2 and Cray-YMP
+                                       systems. This function is required for
+                                       'alloca.c' support on those systems.])
+    break])
+  done
+fi
+
+AC_CACHE_CHECK([stack direction for C alloca],
+               [ac_cv_c_stack_direction],
+[AC_RUN_IFELSE([AC_LANG_SOURCE(
+[AC_INCLUDES_DEFAULT
+int
+find_stack_direction (int *addr, int depth)
+{
+  int dir, dummy = 0;
+  if (! addr)
+    addr = &dummy;
+  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
+  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
+  return dir + dummy;
+}
+
+int
+main (int argc, char **argv)
+{
+  return find_stack_direction (0, argc + !argv + 20) < 0;
+}])],
+               [ac_cv_c_stack_direction=1],
+               [ac_cv_c_stack_direction=-1],
+               [ac_cv_c_stack_direction=0])])
+AH_VERBATIM([STACK_DIRECTION],
+[/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown */
+@%:@undef STACK_DIRECTION])dnl
+AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction)
+])# _AC_LIBOBJ_ALLOCA
+])
diff --git a/m4/asm-underscore.m4 b/m4/asm-underscore.m4
new file mode 100644 (file)
index 0000000..09be5ee
--- /dev/null
@@ -0,0 +1,72 @@
+# asm-underscore.m4 serial 4
+dnl Copyright (C) 2010-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible. Based on as-underscore.m4 in GNU clisp.
+
+# gl_ASM_SYMBOL_PREFIX
+# Tests for the prefix of C symbols at the assembly language level and the
+# linker level. This prefix is either an underscore or empty. Defines the
+# C macro USER_LABEL_PREFIX to this prefix, and sets ASM_SYMBOL_PREFIX to
+# a stringified variant of this prefix.
+
+AC_DEFUN([gl_ASM_SYMBOL_PREFIX],
+[
+  AC_REQUIRE([AC_PROG_EGREP])
+  dnl We don't use GCC's __USER_LABEL_PREFIX__ here, because
+  dnl 1. It works only for GCC.
+  dnl 2. It is incorrectly defined on some platforms, in some GCC versions.
+  AC_REQUIRE([gl_C_ASM])
+  AC_CACHE_CHECK(
+    [whether C symbols are prefixed with underscore at the linker level],
+    [gl_cv_prog_as_underscore],
+    [cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" int foo (void);
+#endif
+int foo(void) { return 0; }
+EOF
+     # Look for the assembly language name in the .s file.
+     AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1
+     if LC_ALL=C $EGREP '(^|[[^a-zA-Z0-9_]])_foo([[^a-zA-Z0-9_]]|$)' conftest.$gl_asmext >/dev/null; then
+       gl_cv_prog_as_underscore=yes
+     else
+       gl_cv_prog_as_underscore=no
+     fi
+     rm -f conftest*
+    ])
+  if test $gl_cv_prog_as_underscore = yes; then
+    USER_LABEL_PREFIX=_
+  else
+    USER_LABEL_PREFIX=
+  fi
+  AC_DEFINE_UNQUOTED([USER_LABEL_PREFIX], [$USER_LABEL_PREFIX],
+    [Define to the prefix of C symbols at the assembler and linker level,
+     either an underscore or empty.])
+  ASM_SYMBOL_PREFIX='"'${USER_LABEL_PREFIX}'"'
+  AC_SUBST([ASM_SYMBOL_PREFIX])
+])
+
+# gl_C_ASM
+# Determines how to produce an assembly language file from C source code.
+# Sets the variables:
+#   gl_asmext - the extension of assembly language output,
+#   gl_c_asm_opt - the C compiler option that produces assembly language output.
+
+AC_DEFUN([gl_C_ASM],
+[
+  AC_EGREP_CPP([MicrosoftCompiler],
+    [
+#ifdef _MSC_VER
+MicrosoftCompiler
+#endif
+    ],
+    [gl_asmext='asm'
+     gl_c_asm_opt='-c -Fa'
+    ],
+    [gl_asmext='s'
+     gl_c_asm_opt='-S'
+    ])
+])
diff --git a/m4/close.m4 b/m4/close.m4
new file mode 100644 (file)
index 0000000..378ec4c
--- /dev/null
@@ -0,0 +1,35 @@
+# close.m4 serial 9
+dnl Copyright (C) 2008-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_CLOSE],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  m4_ifdef([gl_MSVC_INVAL], [
+    AC_REQUIRE([gl_MSVC_INVAL])
+    if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+      REPLACE_CLOSE=1
+    fi
+  ])
+  m4_ifdef([gl_PREREQ_SYS_H_WINSOCK2], [
+    gl_PREREQ_SYS_H_WINSOCK2
+    if test $UNISTD_H_HAVE_WINSOCK2_H = 1; then
+      dnl Even if the 'socket' module is not used here, another part of the
+      dnl application may use it and pass file descriptors that refer to
+      dnl sockets to the close() function. So enable the support for sockets.
+      REPLACE_CLOSE=1
+    fi
+  ])
+  dnl Replace close() for supporting the gnulib-defined fchdir() function,
+  dnl to keep fchdir's bookkeeping up-to-date.
+  m4_ifdef([gl_FUNC_FCHDIR], [
+    if test $REPLACE_CLOSE = 0; then
+      gl_TEST_FCHDIR
+      if test $HAVE_FCHDIR = 0; then
+        REPLACE_CLOSE=1
+      fi
+    fi
+  ])
+])
diff --git a/m4/dirname.m4 b/m4/dirname.m4
new file mode 100644 (file)
index 0000000..9995ff3
--- /dev/null
@@ -0,0 +1,19 @@
+#serial 10   -*- autoconf -*-
+dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_DIRNAME],
+[
+  AC_REQUIRE([gl_DIRNAME_LGPL])
+])
+
+AC_DEFUN([gl_DIRNAME_LGPL],
+[
+  dnl Prerequisites of lib/dirname.h.
+  AC_REQUIRE([gl_DOUBLE_SLASH_ROOT])
+
+  dnl No prerequisites of lib/basename-lgpl.c, lib/dirname-lgpl.c,
+  dnl lib/stripslash.c.
+])
diff --git a/m4/dospaths.m4 b/m4/dospaths.m4
new file mode 100644 (file)
index 0000000..4c77e33
--- /dev/null
@@ -0,0 +1,33 @@
+# Test if the system uses DOS-style pathnames (drive specs and backslashes)
+# By Paul Smith <psmith@gnu.org>.  Based on dos.m4 by Jim Meyering.
+#
+# Copyright (C) 1993-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+AC_DEFUN([pds_AC_DOS_PATHS], [
+  AC_CACHE_CHECK([whether system uses MSDOS-style paths], [ac_cv_dos_paths], [
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __EMX__ && !defined __MSYS__ && !defined __CYGWIN__
+neither MSDOS nor Windows nor OS2
+#endif
+]])],
+        [ac_cv_dos_paths=yes],
+        [ac_cv_dos_paths=no])])
+
+  AS_IF([test x"$ac_cv_dos_paths" = xyes],
+  [ AC_DEFINE_UNQUOTED([HAVE_DOS_PATHS], 1,
+                       [Define if the system uses DOS-style pathnames.])])
+])
diff --git a/m4/double-slash-root.m4 b/m4/double-slash-root.m4
new file mode 100644 (file)
index 0000000..c463ac4
--- /dev/null
@@ -0,0 +1,38 @@
+# double-slash-root.m4 serial 4   -*- Autoconf -*-
+dnl Copyright (C) 2006, 2008-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_DOUBLE_SLASH_ROOT],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CACHE_CHECK([whether // is distinct from /], [gl_cv_double_slash_root],
+    [ if test x"$cross_compiling" = xyes ; then
+        # When cross-compiling, there is no way to tell whether // is special
+        # short of a list of hosts.  However, the only known hosts to date
+        # that have a distinct // are Apollo DomainOS (too old to port to),
+        # Cygwin, and z/OS.  If anyone knows of another system for which // has
+        # special semantics and is distinct from /, please report it to
+        # <bug-gnulib@gnu.org>.
+        case $host in
+          *-cygwin | i370-ibm-openedition)
+            gl_cv_double_slash_root=yes ;;
+          *)
+            # Be optimistic and assume that / and // are the same when we
+            # don't know.
+            gl_cv_double_slash_root='unknown, assuming no' ;;
+        esac
+      else
+        set x `ls -di / // 2>/dev/null`
+        if test "$[2]" = "$[4]" && wc //dev/null >/dev/null 2>&1; then
+          gl_cv_double_slash_root=no
+        else
+          gl_cv_double_slash_root=yes
+        fi
+      fi])
+  if test "$gl_cv_double_slash_root" = yes; then
+    AC_DEFINE([DOUBLE_SLASH_IS_DISTINCT_ROOT], [1],
+      [Define to 1 if // is a file system root distinct from /.])
+  fi
+])
diff --git a/m4/dup2.m4 b/m4/dup2.m4
new file mode 100644 (file)
index 0000000..21b1ecc
--- /dev/null
@@ -0,0 +1,117 @@
+#serial 25
+dnl Copyright (C) 2002, 2005, 2007, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_DUP2],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  m4_ifdef([gl_FUNC_DUP2_OBSOLETE], [
+    AC_CHECK_FUNCS_ONCE([dup2])
+    if test $ac_cv_func_dup2 = no; then
+      HAVE_DUP2=0
+    fi
+  ], [
+    AC_DEFINE([HAVE_DUP2], [1], [Define to 1 if you have the 'dup2' function.])
+  ])
+  if test $HAVE_DUP2 = 1; then
+    AC_CACHE_CHECK([whether dup2 works], [gl_cv_func_dup2_works],
+      [AC_RUN_IFELSE([
+         AC_LANG_PROGRAM(
+           [[#include <errno.h>
+             #include <fcntl.h>
+             #include <limits.h>
+             #include <sys/resource.h>
+             #include <unistd.h>
+             #ifndef RLIM_SAVED_CUR
+             # define RLIM_SAVED_CUR RLIM_INFINITY
+             #endif
+             #ifndef RLIM_SAVED_MAX
+             # define RLIM_SAVED_MAX RLIM_INFINITY
+             #endif
+           ]],
+           [[int result = 0;
+             int bad_fd = INT_MAX;
+             struct rlimit rlim;
+             if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+                 && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+                 && rlim.rlim_cur != RLIM_INFINITY
+                 && rlim.rlim_cur != RLIM_SAVED_MAX
+                 && rlim.rlim_cur != RLIM_SAVED_CUR)
+               bad_fd = rlim.rlim_cur;
+             #ifdef FD_CLOEXEC
+               if (fcntl (1, F_SETFD, FD_CLOEXEC) == -1)
+                 result |= 1;
+             #endif
+             if (dup2 (1, 1) != 1)
+               result |= 2;
+             #ifdef FD_CLOEXEC
+               if (fcntl (1, F_GETFD) != FD_CLOEXEC)
+                 result |= 4;
+             #endif
+             close (0);
+             if (dup2 (0, 0) != -1)
+               result |= 8;
+             /* Many gnulib modules require POSIX conformance of EBADF.  */
+             if (dup2 (2, bad_fd) == -1 && errno != EBADF)
+               result |= 16;
+             /* Flush out some cygwin core dumps.  */
+             if (dup2 (2, -1) != -1 || errno != EBADF)
+               result |= 32;
+             dup2 (2, 255);
+             dup2 (2, 256);
+             /* On OS/2 kLIBC, dup2() does not work on a directory fd.  */
+             {
+               int fd = open (".", O_RDONLY);
+               if (fd == -1)
+                 result |= 64;
+               else if (dup2 (fd, fd + 1) == -1)
+                 result |= 128;
+
+               close (fd);
+             }
+             return result;]])
+        ],
+        [gl_cv_func_dup2_works=yes], [gl_cv_func_dup2_works=no],
+        [case "$host_os" in
+           mingw*) # on this platform, dup2 always returns 0 for success
+             gl_cv_func_dup2_works="guessing no" ;;
+           cygwin*) # on cygwin 1.5.x, dup2(1,1) returns 0
+             gl_cv_func_dup2_works="guessing no" ;;
+           aix* | freebsd*)
+                   # on AIX 7.1 and FreeBSD 6.1, dup2 (1,toobig) gives EMFILE,
+                   # not EBADF.
+             gl_cv_func_dup2_works="guessing no" ;;
+           haiku*) # on Haiku alpha 2, dup2(1, 1) resets FD_CLOEXEC.
+             gl_cv_func_dup2_works="guessing no" ;;
+           *-android*) # implemented using dup3(), which fails if oldfd == newfd
+             gl_cv_func_dup2_works="guessing no" ;;
+           os2*) # on OS/2 kLIBC, dup2() does not work on a directory fd.
+             gl_cv_func_dup2_works="guessing no" ;;
+           *) gl_cv_func_dup2_works="guessing yes" ;;
+         esac])
+      ])
+    case "$gl_cv_func_dup2_works" in
+      *yes) ;;
+      *)
+        REPLACE_DUP2=1
+        AC_CHECK_FUNCS([setdtablesize])
+        ;;
+    esac
+  fi
+  dnl Replace dup2() for supporting the gnulib-defined fchdir() function,
+  dnl to keep fchdir's bookkeeping up-to-date.
+  m4_ifdef([gl_FUNC_FCHDIR], [
+    gl_TEST_FCHDIR
+    if test $HAVE_FCHDIR = 0; then
+      if test $HAVE_DUP2 = 1; then
+        REPLACE_DUP2=1
+      fi
+    fi
+  ])
+])
+
+# Prerequisites of lib/dup2.c.
+AC_DEFUN([gl_PREREQ_DUP2], [])
diff --git a/m4/eaccess.m4 b/m4/eaccess.m4
new file mode 100644 (file)
index 0000000..7eea8e9
--- /dev/null
@@ -0,0 +1,12 @@
+# eaccess.m4 serial 2
+dnl Copyright (C) 2003, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_EACCESS],
+[
+  AC_CHECK_FUNC([eaccess], ,
+    [AC_DEFINE([eaccess], [access],
+       [Define as 'access' if you don't have the eaccess() function.])])
+])
diff --git a/m4/errno_h.m4 b/m4/errno_h.m4
new file mode 100644 (file)
index 0000000..dd4994f
--- /dev/null
@@ -0,0 +1,133 @@
+# errno_h.m4 serial 13
+dnl Copyright (C) 2004, 2006, 2008-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN_ONCE([gl_HEADER_ERRNO_H],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_CACHE_CHECK([for complete errno.h], [gl_cv_header_errno_h_complete], [
+    AC_EGREP_CPP([booboo],[
+#include <errno.h>
+#if !defined ETXTBSY
+booboo
+#endif
+#if !defined ENOMSG
+booboo
+#endif
+#if !defined EIDRM
+booboo
+#endif
+#if !defined ENOLINK
+booboo
+#endif
+#if !defined EPROTO
+booboo
+#endif
+#if !defined EMULTIHOP
+booboo
+#endif
+#if !defined EBADMSG
+booboo
+#endif
+#if !defined EOVERFLOW
+booboo
+#endif
+#if !defined ENOTSUP
+booboo
+#endif
+#if !defined ENETRESET
+booboo
+#endif
+#if !defined ECONNABORTED
+booboo
+#endif
+#if !defined ESTALE
+booboo
+#endif
+#if !defined EDQUOT
+booboo
+#endif
+#if !defined ECANCELED
+booboo
+#endif
+#if !defined EOWNERDEAD
+booboo
+#endif
+#if !defined ENOTRECOVERABLE
+booboo
+#endif
+#if !defined EILSEQ
+booboo
+#endif
+      ],
+      [gl_cv_header_errno_h_complete=no],
+      [gl_cv_header_errno_h_complete=yes])
+  ])
+  if test $gl_cv_header_errno_h_complete = yes; then
+    ERRNO_H=''
+  else
+    gl_NEXT_HEADERS([errno.h])
+    ERRNO_H='errno.h'
+  fi
+  AC_SUBST([ERRNO_H])
+  AM_CONDITIONAL([GL_GENERATE_ERRNO_H], [test -n "$ERRNO_H"])
+  gl_REPLACE_ERRNO_VALUE([EMULTIHOP])
+  gl_REPLACE_ERRNO_VALUE([ENOLINK])
+  gl_REPLACE_ERRNO_VALUE([EOVERFLOW])
+])
+
+# Assuming $1 = EOVERFLOW.
+# The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+# POSIX.  But some systems (like OpenBSD 4.0 or AIX 3) don't define it, and
+# some systems (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+# Check for the value of EOVERFLOW.
+# Set the variables EOVERFLOW_HIDDEN and EOVERFLOW_VALUE.
+AC_DEFUN([gl_REPLACE_ERRNO_VALUE],
+[
+  if test -n "$ERRNO_H"; then
+    AC_CACHE_CHECK([for ]$1[ value], [gl_cv_header_errno_h_]$1, [
+      AC_EGREP_CPP([yes],[
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+      ],
+      [gl_cv_header_errno_h_]$1[=yes],
+      [gl_cv_header_errno_h_]$1[=no])
+      if test $gl_cv_header_errno_h_]$1[ = no; then
+        AC_EGREP_CPP([yes],[
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+#ifdef ]$1[
+yes
+#endif
+          ], [gl_cv_header_errno_h_]$1[=hidden])
+        if test $gl_cv_header_errno_h_]$1[ = hidden; then
+          dnl The macro exists but is hidden.
+          dnl Define it to the same value.
+          AC_COMPUTE_INT([gl_cv_header_errno_h_]$1, $1, [
+#define _XOPEN_SOURCE_EXTENDED 1
+#include <errno.h>
+/* The following two lines are a workaround against an autoconf-2.52 bug.  */
+#include <stdio.h>
+#include <stdlib.h>
+])
+        fi
+      fi
+    ])
+    case $gl_cv_header_errno_h_]$1[ in
+      yes | no)
+        ]$1[_HIDDEN=0; ]$1[_VALUE=
+        ;;
+      *)
+        ]$1[_HIDDEN=1; ]$1[_VALUE="$gl_cv_header_errno_h_]$1["
+        ;;
+    esac
+    AC_SUBST($1[_HIDDEN])
+    AC_SUBST($1[_VALUE])
+  fi
+])
diff --git a/m4/error.m4 b/m4/error.m4
new file mode 100644 (file)
index 0000000..60c229d
--- /dev/null
@@ -0,0 +1,27 @@
+#serial 14
+
+# Copyright (C) 1996-1998, 2001-2004, 2009-2020 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_ERROR],
+[
+  dnl We don't use AC_FUNC_ERROR_AT_LINE any more, because it is no longer
+  dnl maintained in Autoconf and because it invokes AC_LIBOBJ.
+  AC_CACHE_CHECK([for error_at_line], [ac_cv_lib_error_at_line],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <error.h>]],
+          [[error_at_line (0, 0, "", 0, "an error occurred");]])],
+       [ac_cv_lib_error_at_line=yes],
+       [ac_cv_lib_error_at_line=no])])
+])
+
+# Prerequisites of lib/error.c.
+AC_DEFUN([gl_PREREQ_ERROR],
+[
+  AC_REQUIRE([AC_FUNC_STRERROR_R])
+  :
+])
diff --git a/m4/extensions.m4 b/m4/extensions.m4
new file mode 100644 (file)
index 0000000..d7c95ef
--- /dev/null
@@ -0,0 +1,189 @@
+# serial 18  -*- Autoconf -*-
+# Enable extensions on systems that normally disable them.
+
+# Copyright (C) 2003, 2006-2020 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This definition of AC_USE_SYSTEM_EXTENSIONS is stolen from git
+# Autoconf.  Perhaps we can remove this once we can assume Autoconf
+# 2.70 or later everywhere, but since Autoconf mutates rapidly
+# enough in this area it's likely we'll need to redefine
+# AC_USE_SYSTEM_EXTENSIONS for quite some time.
+
+# If autoconf reports a warning
+#     warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# or  warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
+# the fix is
+#   1) to ensure that AC_USE_SYSTEM_EXTENSIONS is never directly invoked
+#      but always AC_REQUIREd,
+#   2) to ensure that for each occurrence of
+#        AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+#      or
+#        AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+#      the corresponding gnulib module description has 'extensions' among
+#      its dependencies. This will ensure that the gl_USE_SYSTEM_EXTENSIONS
+#      invocation occurs in gl_EARLY, not in gl_INIT.
+
+# AC_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+#
+# Remember that #undef in AH_VERBATIM gets replaced with #define by
+# AC_DEFINE.  The goal here is to define all known feature-enabling
+# macros, then, if reports of conflicts are made, disable macros that
+# cause problems on some platforms (such as __EXTENSIONS__).
+AC_DEFUN_ONCE([AC_USE_SYSTEM_EXTENSIONS],
+[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
+AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
+
+  AC_CHECK_HEADER([minix/config.h], [MINIX=yes], [MINIX=])
+  if test "$MINIX" = yes; then
+    AC_DEFINE([_POSIX_SOURCE], [1],
+      [Define to 1 if you need to in order for 'stat' and other
+       things to work.])
+    AC_DEFINE([_POSIX_1_SOURCE], [2],
+      [Define to 2 if the system does not provide POSIX.1 features
+       except with this defined.])
+    AC_DEFINE([_MINIX], [1],
+      [Define to 1 if on MINIX.])
+    AC_DEFINE([_NETBSD_SOURCE], [1],
+      [Define to 1 to make NetBSD features available.  MINIX 3 needs this.])
+  fi
+
+dnl Use a different key than __EXTENSIONS__, as that name broke existing
+dnl configure.ac when using autoheader 2.62.
+  AH_VERBATIM([USE_SYSTEM_EXTENSIONS],
+[/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS.  */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable NetBSD extensions on NetBSD.  */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD extensions on NetBSD.  */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009.  */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
+   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
+   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+])
+  AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__],
+    [ac_cv_safe_to_define___extensions__],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([[
+#         define __EXTENSIONS__ 1
+          ]AC_INCLUDES_DEFAULT])],
+       [ac_cv_safe_to_define___extensions__=yes],
+       [ac_cv_safe_to_define___extensions__=no])])
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    AC_DEFINE([__EXTENSIONS__])
+  AC_DEFINE([_ALL_SOURCE])
+  AC_DEFINE([_DARWIN_C_SOURCE])
+  AC_DEFINE([_GNU_SOURCE])
+  AC_DEFINE([_NETBSD_SOURCE])
+  AC_DEFINE([_OPENBSD_SOURCE])
+  AC_DEFINE([_POSIX_PTHREAD_SEMANTICS])
+  AC_DEFINE([__STDC_WANT_IEC_60559_ATTRIBS_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_BFP_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_DFP_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_FUNCS_EXT__])
+  AC_DEFINE([__STDC_WANT_IEC_60559_TYPES_EXT__])
+  AC_DEFINE([__STDC_WANT_LIB_EXT2__])
+  AC_DEFINE([__STDC_WANT_MATH_SPEC_FUNCS__])
+  AC_DEFINE([_TANDEM_SOURCE])
+  AC_CACHE_CHECK([whether _XOPEN_SOURCE should be defined],
+    [ac_cv_should_define__xopen_source],
+    [ac_cv_should_define__xopen_source=no
+     AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM([[
+          #include <wchar.h>
+          mbstate_t x;]])],
+       [],
+       [AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM([[
+             #define _XOPEN_SOURCE 500
+             #include <wchar.h>
+             mbstate_t x;]])],
+          [ac_cv_should_define__xopen_source=yes])])])
+  test $ac_cv_should_define__xopen_source = yes &&
+    AC_DEFINE([_XOPEN_SOURCE], [500])
+  AC_DEFINE([_HPUX_ALT_XOPEN_SOCKET_API])
+])# AC_USE_SYSTEM_EXTENSIONS
+
+# gl_USE_SYSTEM_EXTENSIONS
+# ------------------------
+# Enable extensions on systems that normally disable them,
+# typically due to standards-conformance issues.
+AC_DEFUN_ONCE([gl_USE_SYSTEM_EXTENSIONS],
+[
+  dnl Require this macro before AC_USE_SYSTEM_EXTENSIONS.
+  dnl gnulib does not need it. But if it gets required by third-party macros
+  dnl after AC_USE_SYSTEM_EXTENSIONS is required, autoconf 2.62..2.63 emit a
+  dnl warning: "AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS".
+  dnl Note: We can do this only for one of the macros AC_AIX, AC_GNU_SOURCE,
+  dnl AC_MINIX. If people still use AC_AIX or AC_MINIX, they are out of luck.
+  AC_REQUIRE([AC_GNU_SOURCE])
+
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+])
diff --git a/m4/extern-inline.m4 b/m4/extern-inline.m4
new file mode 100644 (file)
index 0000000..75c5008
--- /dev/null
@@ -0,0 +1,114 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+  AH_VERBATIM([extern_inline],
+[/* Please see the Gnulib manual for how to use these macros.
+
+   Suppress extern inline with HP-UX cc, as it appears to be broken; see
+   <https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>.
+
+   Suppress extern inline with Sun C in standards-conformance mode, as it
+   mishandles inline functions that call each other.  E.g., for 'inline void f
+   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+   'reference to static identifier "f" in extern inline function'.
+   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+   on configurations that mistakenly use 'static inline' to implement
+   functions or macros in standard C headers like <ctype.h>.  For example,
+   if isdigit is mistakenly implemented via a static inline function,
+   a program containing an extern inline function that calls isdigit
+   may not work since the C standard prohibits extern inline functions
+   from calling static functions (ISO C 99 section 6.7.4.(3).
+   This bug is known to occur on:
+
+     OS X 10.8 and earlier; see:
+     https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html
+
+     DragonFly; see
+     http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log
+
+     FreeBSD; see:
+     https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html
+
+   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+   for clang but remains for g++; see <https://trac.macports.org/ticket/41033>.
+   Assume DragonFly and FreeBSD will be similar.
+
+   GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+   inline semantics, unless -fgnu89-inline is used.  It defines a macro
+   __GNUC_STDC_INLINE__ to indicate this situation or a macro
+   __GNUC_GNU_INLINE__ to indicate the opposite situation.
+   GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+   semantics but warns, unless -fgnu89-inline is used:
+     warning: C99 inline functions are not supported; using GNU89
+     warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+   It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
+ */
+#if (((defined __APPLE__ && defined __MACH__) \
+      || defined __DragonFly__ || defined __FreeBSD__) \
+     && (defined __header_inline \
+         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+            && ! defined __clang__) \
+         : ((! defined _DONT_USE_CTYPE_INLINE_ \
+             && (defined __GNUC__ || defined __cplusplus)) \
+            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+                && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+      : (199901L <= __STDC_VERSION__ \
+         && !defined __HP_cc \
+         && !defined __PGI \
+         && !(defined __SUNPRO_C && __STDC__))) \
+     && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+       && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
+#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+#  define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+   suppress bogus "no previous prototype for 'FOO'"
+   and "no previous declaration for 'FOO'" diagnostics,
+   when FOO is an inline function in the header; see
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+#  define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+#  define _GL_INLINE_HEADER_CONST_PRAGMA \
+     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+    _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])
diff --git a/m4/fcntl-o.m4 b/m4/fcntl-o.m4
new file mode 100644 (file)
index 0000000..747b865
--- /dev/null
@@ -0,0 +1,139 @@
+# fcntl-o.m4 serial 6
+dnl Copyright (C) 2006, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_PREREQ([2.60])
+
+# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
+# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
+# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
+AC_DEFUN([gl_FCNTL_O_FLAGS],
+[
+  dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_CHECK_FUNCS_ONCE([symlink])
+  AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>
+           #include <sys/stat.h>
+           #if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <io.h>
+           # include <stdlib.h>
+           # defined sleep(n) _sleep ((n) * 1000)
+           #endif
+           #include <fcntl.h>
+           #ifndef O_NOATIME
+            #define O_NOATIME 0
+           #endif
+           #ifndef O_NOFOLLOW
+            #define O_NOFOLLOW 0
+           #endif
+           static int const constants[] =
+            {
+              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+            };
+          ]],
+          [[
+            int result = !constants;
+            #if HAVE_SYMLINK
+            {
+              static char const sym[] = "conftest.sym";
+              if (symlink ("/dev/null", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              if (unlink (sym) != 0 || symlink (".", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              unlink (sym);
+            }
+            #endif
+            {
+              static char const file[] = "confdefs.h";
+              int fd = open (file, O_RDONLY | O_NOATIME);
+              if (fd < 0)
+                result |= 8;
+              else
+                {
+                  struct stat st0;
+                  if (fstat (fd, &st0) != 0)
+                    result |= 16;
+                  else
+                    {
+                      char c;
+                      sleep (1);
+                      if (read (fd, &c, 1) != 1)
+                        result |= 24;
+                      else
+                        {
+                          if (close (fd) != 0)
+                            result |= 32;
+                          else
+                            {
+                              struct stat st1;
+                              if (stat (file, &st1) != 0)
+                                result |= 40;
+                              else
+                                if (st0.st_atime != st1.st_atime)
+                                  result |= 64;
+                            }
+                        }
+                    }
+                }
+            }
+            return result;]])],
+       [gl_cv_header_working_fcntl_h=yes],
+       [case $? in #(
+        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+         *) gl_cv_header_working_fcntl_h='no';;
+        esac],
+       [case "$host_os" in
+                  # Guess 'no' on native Windows.
+          mingw*) gl_cv_header_working_fcntl_h='no' ;;
+          *)      gl_cv_header_working_fcntl_h=cross-compiling ;;
+        esac
+       ])
+    ])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+    [Define to 1 if O_NOATIME works.])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+    [Define to 1 if O_NOFOLLOW works.])
+])
diff --git a/m4/fcntl.m4 b/m4/fcntl.m4
new file mode 100644 (file)
index 0000000..562ae23
--- /dev/null
@@ -0,0 +1,126 @@
+# fcntl.m4 serial 9
+dnl Copyright (C) 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# For now, this module ensures that fcntl()
+# - supports F_DUPFD correctly
+# - supports or emulates F_DUPFD_CLOEXEC
+# - supports F_GETFD
+# Still to be ported to mingw:
+# - F_SETFD
+# - F_GETFL, F_SETFL
+# - F_GETOWN, F_SETOWN
+# - F_GETLK, F_SETLK, F_SETLKW
+AC_DEFUN([gl_FUNC_FCNTL],
+[
+  dnl Persuade glibc to expose F_DUPFD_CLOEXEC.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CHECK_FUNCS_ONCE([fcntl])
+  if test $ac_cv_func_fcntl = no; then
+    gl_REPLACE_FCNTL
+  else
+    dnl cygwin 1.5.x F_DUPFD has wrong errno, and allows negative target
+    dnl haiku alpha 2 F_DUPFD has wrong errno
+    AC_CACHE_CHECK([whether fcntl handles F_DUPFD correctly],
+      [gl_cv_func_fcntl_f_dupfd_works],
+      [AC_RUN_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[#include <errno.h>
+              #include <fcntl.h>
+              #include <limits.h>
+              #include <sys/resource.h>
+              #include <unistd.h>
+              #ifndef RLIM_SAVED_CUR
+              # define RLIM_SAVED_CUR RLIM_INFINITY
+              #endif
+              #ifndef RLIM_SAVED_MAX
+              # define RLIM_SAVED_MAX RLIM_INFINITY
+              #endif
+            ]],
+            [[int result = 0;
+              int bad_fd = INT_MAX;
+              struct rlimit rlim;
+              if (getrlimit (RLIMIT_NOFILE, &rlim) == 0
+                  && 0 <= rlim.rlim_cur && rlim.rlim_cur <= INT_MAX
+                  && rlim.rlim_cur != RLIM_INFINITY
+                  && rlim.rlim_cur != RLIM_SAVED_MAX
+                  && rlim.rlim_cur != RLIM_SAVED_CUR)
+                bad_fd = rlim.rlim_cur;
+              if (fcntl (0, F_DUPFD, -1) != -1) result |= 1;
+              if (errno != EINVAL) result |= 2;
+              if (fcntl (0, F_DUPFD, bad_fd) != -1) result |= 4;
+              if (errno != EINVAL) result |= 8;
+              /* On OS/2 kLIBC, F_DUPFD does not work on a directory fd */
+              {
+                int fd;
+                fd = open (".", O_RDONLY);
+                if (fd == -1)
+                  result |= 16;
+                else if (fcntl (fd, F_DUPFD, STDERR_FILENO + 1) == -1)
+                  result |= 32;
+
+                close (fd);
+              }
+              return result;]])],
+         [gl_cv_func_fcntl_f_dupfd_works=yes],
+         [gl_cv_func_fcntl_f_dupfd_works=no],
+         [case $host_os in
+            aix* | cygwin* | haiku*)
+               gl_cv_func_fcntl_f_dupfd_works="guessing no" ;;
+            *) gl_cv_func_fcntl_f_dupfd_works="guessing yes" ;;
+          esac])])
+    case $gl_cv_func_fcntl_f_dupfd_works in
+      *yes) ;;
+      *) gl_REPLACE_FCNTL
+        AC_DEFINE([FCNTL_DUPFD_BUGGY], [1], [Define this to 1 if F_DUPFD
+          behavior does not match POSIX]) ;;
+    esac
+
+    dnl Many systems lack F_DUPFD_CLOEXEC
+    AC_CACHE_CHECK([whether fcntl understands F_DUPFD_CLOEXEC],
+      [gl_cv_func_fcntl_f_dupfd_cloexec],
+      [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>
+#ifndef F_DUPFD_CLOEXEC
+choke me
+#endif
+         ]])],
+         [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#ifdef __linux__
+/* The Linux kernel only added F_DUPFD_CLOEXEC in 2.6.24, so we always replace
+   it to support the semantics on older kernels that failed with EINVAL.  */
+choke me
+#endif
+           ]])],
+           [gl_cv_func_fcntl_f_dupfd_cloexec=yes],
+           [gl_cv_func_fcntl_f_dupfd_cloexec="needs runtime check"])],
+         [gl_cv_func_fcntl_f_dupfd_cloexec=no])])
+    if test "$gl_cv_func_fcntl_f_dupfd_cloexec" != yes; then
+      gl_REPLACE_FCNTL
+      dnl No witness macro needed for this bug.
+    fi
+  fi
+  dnl Replace fcntl() for supporting the gnulib-defined fchdir() function,
+  dnl to keep fchdir's bookkeeping up-to-date.
+  m4_ifdef([gl_FUNC_FCHDIR], [
+    gl_TEST_FCHDIR
+    if test $HAVE_FCHDIR = 0; then
+      gl_REPLACE_FCNTL
+    fi
+  ])
+])
+
+AC_DEFUN([gl_REPLACE_FCNTL],
+[
+  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+  AC_CHECK_FUNCS_ONCE([fcntl])
+  if test $ac_cv_func_fcntl = no; then
+    HAVE_FCNTL=0
+  else
+    REPLACE_FCNTL=1
+  fi
+])
diff --git a/m4/fcntl_h.m4 b/m4/fcntl_h.m4
new file mode 100644 (file)
index 0000000..6b25393
--- /dev/null
@@ -0,0 +1,52 @@
+# serial 16
+# Configure fcntl.h.
+dnl Copyright (C) 2006-2007, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+AC_DEFUN([gl_FCNTL_H],
+[
+  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+  AC_REQUIRE([gl_FCNTL_O_FLAGS])
+  gl_NEXT_HEADERS([fcntl.h])
+
+  dnl Ensure the type pid_t gets defined.
+  AC_REQUIRE([AC_TYPE_PID_T])
+
+  dnl Ensure the type mode_t gets defined.
+  AC_REQUIRE([AC_TYPE_MODE_T])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, if it is not common
+  dnl enough to be declared everywhere.
+  gl_WARN_ON_USE_PREPARE([[#include <fcntl.h>
+    ]], [fcntl openat])
+])
+
+AC_DEFUN([gl_FCNTL_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_FCNTL_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_FCNTL_H_DEFAULTS],
+[
+  GNULIB_CREAT=0;        AC_SUBST([GNULIB_CREAT])
+  GNULIB_FCNTL=0;        AC_SUBST([GNULIB_FCNTL])
+  GNULIB_NONBLOCKING=0;  AC_SUBST([GNULIB_NONBLOCKING])
+  GNULIB_OPEN=0;         AC_SUBST([GNULIB_OPEN])
+  GNULIB_OPENAT=0;       AC_SUBST([GNULIB_OPENAT])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_FCNTL=1;          AC_SUBST([HAVE_FCNTL])
+  HAVE_OPENAT=1;         AC_SUBST([HAVE_OPENAT])
+  REPLACE_CREAT=0;       AC_SUBST([REPLACE_CREAT])
+  REPLACE_FCNTL=0;       AC_SUBST([REPLACE_FCNTL])
+  REPLACE_OPEN=0;        AC_SUBST([REPLACE_OPEN])
+  REPLACE_OPENAT=0;      AC_SUBST([REPLACE_OPENAT])
+])
diff --git a/m4/findprog-in.m4 b/m4/findprog-in.m4
new file mode 100644 (file)
index 0000000..54ea10e
--- /dev/null
@@ -0,0 +1,11 @@
+# findprog-in.m4 serial 1
+dnl Copyright (C) 2003, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FINDPROG_IN],
+[
+  dnl Prerequisites of lib/findprog-in.c.
+  AC_REQUIRE([gl_FUNC_EACCESS])
+])
diff --git a/m4/getdtablesize.m4 b/m4/getdtablesize.m4
new file mode 100644 (file)
index 0000000..ab2e3fe
--- /dev/null
@@ -0,0 +1,60 @@
+# getdtablesize.m4 serial 7
+dnl Copyright (C) 2008-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_GETDTABLESIZE],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CHECK_FUNCS_ONCE([getdtablesize])
+  AC_CHECK_DECLS_ONCE([getdtablesize])
+  if test $ac_cv_func_getdtablesize = yes &&
+     test $ac_cv_have_decl_getdtablesize = yes; then
+    AC_CACHE_CHECK([whether getdtablesize works],
+      [gl_cv_func_getdtablesize_works],
+      [dnl There are two concepts: the "maximum possible file descriptor value + 1"
+       dnl and the "maximum number of open file descriptors in a process".
+       dnl Per SUSv2 and POSIX, getdtablesize() should return the first one.
+       dnl On most platforms, the first and the second concept are the same.
+       dnl On OpenVMS, however, they are different and getdtablesize() returns
+       dnl the second one; thus the test below fails. But we don't care
+       dnl because there's no good way to write a replacement getdtablesize().
+       case "$host_os" in
+         vms*) gl_cv_func_getdtablesize_works="no (limitation)" ;;
+         *)
+           dnl Cygwin 1.7.25 automatically increases the RLIMIT_NOFILE soft
+           dnl limit up to an unchangeable hard limit; all other platforms
+           dnl correctly require setrlimit before getdtablesize() can report
+           dnl a larger value.
+           AC_RUN_IFELSE([
+             AC_LANG_PROGRAM([[#include <unistd.h>]],
+               [int size = getdtablesize();
+                if (dup2 (0, getdtablesize()) != -1)
+                  return 1;
+                if (size != getdtablesize())
+                  return 2;
+               ])],
+             [gl_cv_func_getdtablesize_works=yes],
+             [gl_cv_func_getdtablesize_works=no],
+             [case "$host_os" in
+                cygwin*) # on cygwin 1.5.25, getdtablesize() automatically grows
+                  gl_cv_func_getdtablesize_works="guessing no" ;;
+                *) gl_cv_func_getdtablesize_works="guessing yes" ;;
+              esac
+             ])
+           ;;
+       esac
+      ])
+    case "$gl_cv_func_getdtablesize_works" in
+      *yes | "no (limitation)") ;;
+      *) REPLACE_GETDTABLESIZE=1 ;;
+    esac
+  else
+    HAVE_GETDTABLESIZE=0
+  fi
+])
+
+# Prerequisites of lib/getdtablesize.c.
+AC_DEFUN([gl_PREREQ_GETDTABLESIZE], [:])
diff --git a/m4/getloadavg.m4 b/m4/getloadavg.m4
new file mode 100644 (file)
index 0000000..3bd2a14
--- /dev/null
@@ -0,0 +1,159 @@
+# Check for getloadavg.
+
+# Copyright (C) 1992-1996, 1999-2000, 2002-2003, 2006, 2008-2020 Free Software
+# Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 8
+
+# Autoconf defines AC_FUNC_GETLOADAVG, but that is obsolescent.
+# New applications should use gl_GETLOADAVG instead.
+
+# gl_GETLOADAVG
+# -------------
+AC_DEFUN([gl_GETLOADAVG],
+[AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+
+# Persuade glibc <stdlib.h> to declare getloadavg().
+AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+gl_save_LIBS=$LIBS
+
+# getloadavg is present in libc on glibc >= 2.2, Mac OS X, FreeBSD >= 2.0,
+# NetBSD >= 0.9, OpenBSD >= 2.0, Solaris >= 7.
+HAVE_GETLOADAVG=1
+AC_CHECK_FUNC([getloadavg], [],
+  [gl_func_getloadavg_done=no
+
+   # Some systems with -lutil have (and need) -lkvm as well, some do not.
+   # On Solaris, -lkvm requires nlist from -lelf, so check that first
+   # to get the right answer into the cache.
+   # For kstat on solaris, we need to test for libelf and libkvm to force the
+   # definition of SVR4 below.
+   if test $gl_func_getloadavg_done = no; then
+     AC_CHECK_LIB([elf], [elf_begin], [LIBS="-lelf $LIBS"])
+     AC_CHECK_LIB([kvm], [kvm_open], [LIBS="-lkvm $LIBS"])
+     # Check for the 4.4BSD definition of getloadavg.
+     AC_CHECK_LIB([util], [getloadavg],
+       [LIBS="-lutil $LIBS" gl_func_getloadavg_done=yes])
+   fi
+
+   if test $gl_func_getloadavg_done = no; then
+     # There is a commonly available library for RS/6000 AIX.
+     # Since it is not a standard part of AIX, it might be installed locally.
+     gl_getloadavg_LIBS=$LIBS
+     LIBS="-L/usr/local/lib $LIBS"
+     AC_CHECK_LIB([getloadavg], [getloadavg],
+                  [LIBS="-lgetloadavg $LIBS" gl_func_getloadavg_done=yes],
+                  [LIBS=$gl_getloadavg_LIBS])
+   fi
+
+   # Set up the replacement function if necessary.
+   if test $gl_func_getloadavg_done = no; then
+     HAVE_GETLOADAVG=0
+
+     # Solaris has libkstat which does not require root.
+     AC_CHECK_LIB([kstat], [kstat_open])
+     test $ac_cv_lib_kstat_kstat_open = yes && gl_func_getloadavg_done=yes
+
+     # AIX has libperfstat which does not require root
+     if test $gl_func_getloadavg_done = no; then
+       AC_CHECK_LIB([perfstat], [perfstat_cpu_total])
+       test $ac_cv_lib_perfstat_perfstat_cpu_total = yes && gl_func_getloadavg_done=yes
+     fi
+
+     if test $gl_func_getloadavg_done = no; then
+       AC_CHECK_HEADER([sys/dg_sys_info.h],
+         [gl_func_getloadavg_done=yes
+          AC_DEFINE([DGUX], [1], [Define to 1 for DGUX with <sys/dg_sys_info.h>.])
+          AC_CHECK_LIB([dgc], [dg_sys_info])])
+     fi
+   fi])
+
+if test "x$gl_save_LIBS" = x; then
+  GETLOADAVG_LIBS=$LIBS
+else
+  GETLOADAVG_LIBS=`echo "$LIBS" | sed "s!$gl_save_LIBS!!"`
+fi
+LIBS=$gl_save_LIBS
+
+AC_SUBST([GETLOADAVG_LIBS])dnl
+
+# Test whether the system declares getloadavg. Solaris has the function
+# but declares it in <sys/loadavg.h>, not <stdlib.h>.
+AC_CHECK_HEADERS([sys/loadavg.h])
+if test $ac_cv_header_sys_loadavg_h = yes; then
+  HAVE_SYS_LOADAVG_H=1
+else
+  HAVE_SYS_LOADAVG_H=0
+fi
+AC_CHECK_DECL([getloadavg], [], [HAVE_DECL_GETLOADAVG=0],
+  [[#if HAVE_SYS_LOADAVG_H
+    /* OpenIndiana has a bug: <sys/time.h> must be included before
+       <sys/loadavg.h>.  */
+    # include <sys/time.h>
+    # include <sys/loadavg.h>
+    #endif
+    #include <stdlib.h>]])
+])# gl_GETLOADAVG
+
+
+# gl_PREREQ_GETLOADAVG
+# --------------------
+# Set up the AC_LIBOBJ replacement of 'getloadavg'.
+AC_DEFUN([gl_PREREQ_GETLOADAVG],
+[
+# Figure out what our getloadavg.c needs.
+
+AC_CHECK_HEADERS_ONCE([sys/param.h unistd.h])
+
+# On HPUX9, an unprivileged user can get load averages this way.
+if test $gl_func_getloadavg_done = no; then
+  AC_CHECK_FUNCS([pstat_getdynamic], [gl_func_getloadavg_done=yes])
+fi
+
+# We cannot check for <dwarf.h>, because Solaris 2 does not use dwarf (it
+# uses stabs), but it is still SVR4.  We cannot check for <elf.h> because
+# Irix 4.0.5F has the header but not the library.
+if test $gl_func_getloadavg_done = no && test "$ac_cv_lib_elf_elf_begin" = yes \
+    && test "$ac_cv_lib_kvm_kvm_open" = yes; then
+  gl_func_getloadavg_done=yes
+  AC_DEFINE([SVR4], [1], [Define to 1 on System V Release 4.])
+fi
+
+if test $gl_func_getloadavg_done = no; then
+  AC_CHECK_HEADER([inq_stats/cpustats.h],
+  [gl_func_getloadavg_done=yes
+   AC_DEFINE([UMAX], [1], [Define to 1 for Encore UMAX.])
+   AC_DEFINE([UMAX4_3], [1],
+             [Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h>
+              instead of <sys/cpustats.h>.])])
+fi
+
+if test $gl_func_getloadavg_done = no; then
+  AC_CHECK_HEADER([sys/cpustats.h],
+  [gl_func_getloadavg_done=yes; AC_DEFINE([UMAX])])
+fi
+
+if test $gl_func_getloadavg_done = no; then
+  AC_CHECK_HEADERS([mach/mach.h])
+fi
+
+AC_CHECK_HEADERS([nlist.h],
+[AC_CHECK_MEMBERS([struct nlist.n_un.n_name],
+                  [], [],
+                  [@%:@include <nlist.h>])
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <nlist.h>]],
+                   [[struct nlist x;
+                    #ifdef HAVE_STRUCT_NLIST_N_UN_N_NAME
+                    x.n_un.n_name = "";
+                    #else
+                    x.n_name = "";
+                    #endif]])],
+                [AC_DEFINE([N_NAME_POINTER], [1],
+                           [Define to 1 if the nlist n_name member is a pointer])])
+])dnl
+])# gl_PREREQ_GETLOADAVG
diff --git a/m4/getprogname.m4 b/m4/getprogname.m4
new file mode 100644 (file)
index 0000000..6baefc9
--- /dev/null
@@ -0,0 +1,43 @@
+# getprogname.m4 - check for getprogname or replacements for it
+
+# Copyright (C) 2016-2020 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([gl_FUNC_GETPROGNAME],
+[
+  AC_CHECK_FUNCS_ONCE([getprogname getexecname])
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  ac_found=0
+  AC_CHECK_DECLS([program_invocation_name], [ac_found=1], [],
+    [#include <errno.h>])
+  AC_CHECK_DECLS([program_invocation_short_name], [ac_found=1], [],
+    [#include <errno.h>])
+  AC_CHECK_DECLS([__argv], [ac_found=1], [], [#include <stdlib.h>])
+
+  # Incur the cost of this test only if none of the above worked.
+  if test $ac_found = 0; then
+    # On OpenBSD 5.1, using the global __progname variable appears to be
+    # the only way to implement getprogname.
+    AC_CACHE_CHECK([whether __progname is defined in default libraries],
+      [gl_cv_var___progname],
+      [
+        gl_cv_var___progname=
+        AC_LINK_IFELSE(
+          [AC_LANG_PROGRAM(
+            [[extern char *__progname;]],
+            [[return *__progname;]]
+          )],
+          [gl_cv_var___progname=yes]
+        )
+      ]
+    )
+    if test "$gl_cv_var___progname" = yes; then
+      AC_DEFINE([HAVE_VAR___PROGNAME], 1,
+        [Define if you have a global __progname variable])
+    fi
+  fi
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
new file mode 100644 (file)
index 0000000..be247bf
--- /dev/null
@@ -0,0 +1,401 @@
+# gettext.m4 serial 66 (gettext-0.18.2)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.  If NEEDSYMBOL is specified and is
+dnl    'need-formatstring-macros', then GNU gettext implementations that don't
+dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value '$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
+    [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+  define([gt_included_intl],
+    ifelse([$1], [external],
+      ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
+      [yes]))
+  define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
+  gt_NEEDS_INIT
+  AM_GNU_GETTEXT_NEED([$2])
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Sometimes libintl requires libiconv, so first search for libiconv.
+  dnl Ideally we would do this search only after the
+  dnl      if test "$USE_NLS" = "yes"; then
+  dnl        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+  dnl the configure script would need to contain the same shell code
+  dnl again, outside any 'if'. There are two solutions:
+  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+  dnl documented, we avoid it.
+  ifelse(gt_included_intl, yes, , [
+    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+  ])
+
+  dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
+  gt_INTL_MACOSX
+
+  dnl Set USE_NLS.
+  AC_REQUIRE([AM_NLS])
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl Add a version number to the cache macros.
+  case " $gt_needs " in
+    *" need-formatstring-macros "*) gt_api_version=3 ;;
+    *" need-ngettext "*) gt_api_version=2 ;;
+    *) gt_api_version=1 ;;
+  esac
+  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH([included-gettext],
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        if test $gt_api_version -ge 3; then
+          gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+        else
+          gt_revision_test_code=
+        fi
+        if test $gt_api_version -ge 2; then
+          gt_expression_test_code=' + * ngettext ("", "", 0)'
+        else
+          gt_expression_test_code=
+        fi
+
+        AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+         [AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+               ]],
+               [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+               ]])],
+            [eval "$gt_func_gnugettext_libc=yes"],
+            [eval "$gt_func_gnugettext_libc=no"])])
+
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            [$gt_func_gnugettext_libintl],
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+                 ]],
+                 [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+                 ]])],
+              [eval "$gt_func_gnugettext_libintl=yes"],
+              [eval "$gt_func_gnugettext_libintl=no"])
+            dnl Now see whether libintl exists and depends on libiconv.
+            if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_LINK_IFELSE(
+                [AC_LANG_PROGRAM(
+                   [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+                   ]],
+                   [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+                   ]])],
+                [LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+                ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      CATOBJEXT=
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test -n "$INTL_MACOSX_LIBS"; then
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Some extra flags are needed during linking.
+        LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+      fi
+    fi
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE([ENABLE_NLS], [1],
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to use NLS])
+  AC_MSG_RESULT([$USE_NLS])
+  if test "$USE_NLS" = "yes"; then
+    AC_MSG_CHECKING([where the gettext function comes from])
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    AC_MSG_RESULT([$gt_source])
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE([HAVE_GETTEXT], [1],
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE([HAVE_DCGETTEXT], [1],
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST([BUILD_INCLUDED_LIBINTL])
+    AC_SUBST([USE_INCLUDED_LIBINTL])
+    AC_SUBST([CATOBJEXT])
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST([DATADIRNAME])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST([INSTOBJEXT])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST([GENCAT])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INTLOBJS=
+    if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+    AC_SUBST([INTLOBJS])
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST([INTLLIBS])
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST([LIBINTL])
+  AC_SUBST([LTLIBINTL])
+  AC_SUBST([POSUB])
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+  m4_divert_text([DEFAULTS], [gt_needs=])
+  m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+  m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/m4/gnulib-cache.m4 b/m4/gnulib-cache.m4
new file mode 100644 (file)
index 0000000..93c826b
--- /dev/null
@@ -0,0 +1,69 @@
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the specification of how gnulib-tool is used.
+# It acts as a cache: It is written and read by gnulib-tool.
+# In projects that use version control, this file is meant to be put under
+# version control, like the configure.ac and various Makefile.am files.
+
+
+# Specification in the form of a command-line invocation:
+# gnulib-tool --import --local-dir=gl \
+#  --lib=libgnu \
+#  --source-base=lib \
+#  --m4-base=m4 \
+#  --doc-base=doc \
+#  --tests-base=tests \
+#  --aux-dir=build-aux \
+#  --no-conditional-dependencies \
+#  --no-libtool \
+#  --macro-prefix=gl \
+#  alloca \
+#  fdl \
+#  findprog-in \
+#  getloadavg \
+#  host-cpu-c-abi \
+#  make-glob \
+#  strerror
+
+# Specification in the form of a few gnulib-tool.m4 macro invocations:
+gl_LOCAL_DIR([gl])
+gl_MODULES([
+  alloca
+  fdl
+  findprog-in
+  getloadavg
+  host-cpu-c-abi
+  make-glob
+  strerror
+])
+gl_AVOID([])
+gl_SOURCE_BASE([lib])
+gl_M4_BASE([m4])
+gl_PO_BASE([])
+gl_DOC_BASE([doc])
+gl_TESTS_BASE([tests])
+gl_LIB([libgnu])
+gl_MAKEFILE_NAME([])
+gl_MACRO_PREFIX([gl])
+gl_PO_DOMAIN([])
+gl_WITNESS_C_MACRO([])
diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4
new file mode 100644 (file)
index 0000000..6c4cad6
--- /dev/null
@@ -0,0 +1,459 @@
+# gnulib-common.m4 serial 46
+dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ([2.62])
+
+# gl_COMMON
+# is expanded unconditionally through gnulib-tool magic.
+AC_DEFUN([gl_COMMON], [
+  dnl Use AC_REQUIRE here, so that the code is expanded once only.
+  AC_REQUIRE([gl_00GNULIB])
+  AC_REQUIRE([gl_COMMON_BODY])
+])
+AC_DEFUN([gl_COMMON_BODY], [
+  AH_VERBATIM([_Noreturn],
+[/* The _Noreturn keyword of C11.  */
+#ifndef _Noreturn
+# if (defined __cplusplus \
+      && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+          || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+      && 0)
+    /* [[noreturn]] is not practically usable, because with it the syntax
+         extern _Noreturn void func (...);
+       would not be valid; such a declaration would only be valid with 'extern'
+       and '_Noreturn' swapped, or without the 'extern' keyword.  However, some
+       AIX system header files and several gnulib header files use precisely
+       this syntax with 'extern'.  */
+#  define _Noreturn [[noreturn]]
+# elif ((!defined __cplusplus || defined __clang__) \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
+            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+   /* _Noreturn works as-is.  */
+# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
+])
+  AH_VERBATIM([isoc99_inline],
+[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+   the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+   earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+   __APPLE__ && __MACH__ test for Mac OS X.
+   __APPLE_CC__ tests for the Apple compiler and its version.
+   __STDC_VERSION__ tests for the C99 mode.  */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif])
+  AH_VERBATIM([unused_parameter],
+[/* Define as a marker that can be attached to declarations that might not
+    be used.  This helps to reduce warnings, such as from
+    GCC -Wunused-parameter.  */
+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_UNUSED
+#endif
+/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
+   is a misnomer outside of parameter lists.  */
+#define _UNUSED_PARAMETER_ _GL_UNUSED
+
+/* gcc supports the "unused" attribute on possibly unused labels, and
+   g++ has since version 4.5.  Note to support C++ as well as C,
+   _GL_UNUSED_LABEL should be used with a trailing ;  */
+#if !defined __cplusplus || __GNUC__ > 4 \
+    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+# define _GL_UNUSED_LABEL _GL_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+/* The __pure__ attribute was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The __const__ attribute was added in gcc 2.95.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST /* empty */
+#endif
+
+/* The __malloc__ attribute was added in gcc 3.  */
+#if 3 <= __GNUC__
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC /* empty */
+#endif
+])
+  AH_VERBATIM([async_safe],
+[/* The _GL_ASYNC_SAFE marker should be attached to functions that are
+   signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
+   invoked from such signal handlers.  Such functions have some restrictions:
+     * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
+       or should be listed as async-signal-safe in POSIX
+       <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
+       section 2.4.3.  Note that malloc(), sprintf(), and fwrite(), in
+       particular, are NOT async-signal-safe.
+     * All memory locations (variables and struct fields) that these functions
+       access must be marked 'volatile'.  This holds for both read and write
+       accesses.  Otherwise the compiler might optimize away stores to and
+       reads from such locations that occur in the program, depending on its
+       data flow analysis.  For example, when the program contains a loop
+       that is intended to inspect a variable set from within a signal handler
+           while (!signal_occurred)
+             ;
+       the compiler is allowed to transform this into an endless loop if the
+       variable 'signal_occurred' is not declared 'volatile'.
+   Additionally, recall that:
+     * A signal handler should not modify errno (except if it is a handler
+       for a fatal signal and ends by raising the same signal again, thus
+       provoking the termination of the process).  If it invokes a function
+       that may clobber errno, it needs to save and restore the value of
+       errno.  */
+#define _GL_ASYNC_SAFE
+])
+  dnl Hint which direction to take regarding cross-compilation guesses:
+  dnl When a user installs a program on a platform they are not intimately
+  dnl familiar with, --enable-cross-guesses=conservative is the appropriate
+  dnl choice.  It implements the "If we don't know, assume the worst" principle.
+  dnl However, when an operating system developer (on a platform which is not
+  dnl yet known to gnulib) builds packages for their platform, they want to
+  dnl expose, not hide, possible platform bugs; in this case,
+  dnl --enable-cross-guesses=risky is the appropriate choice.
+  dnl Sets the variables
+  dnl gl_cross_guess_normal    (to be used when 'yes' is good and 'no' is bad),
+  dnl gl_cross_guess_inverted  (to be used when 'no' is good and 'yes' is bad).
+  AC_ARG_ENABLE([cross-guesses],
+    [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}],
+       [specify policy for cross-compilation guesses])],
+    [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
+       AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses])
+       enableval=conservative
+     fi
+     gl_cross_guesses="$enableval"],
+    [gl_cross_guesses=conservative])
+  if test $gl_cross_guesses = risky; then
+    gl_cross_guess_normal="guessing yes"
+    gl_cross_guess_inverted="guessing no"
+  else
+    gl_cross_guess_normal="guessing no"
+    gl_cross_guess_inverted="guessing yes"
+  fi
+  dnl Preparation for running test programs:
+  dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
+  dnl to /dev/tty, so they can be redirected to log files.  Such diagnostics
+  dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
+  LIBC_FATAL_STDERR_=1
+  export LIBC_FATAL_STDERR_
+])
+
+# gl_MODULE_INDICATOR_CONDITION
+# expands to a C preprocessor expression that evaluates to 1 or 0, depending
+# whether a gnulib module that has been requested shall be considered present
+# or not.
+m4_define([gl_MODULE_INDICATOR_CONDITION], [1])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
+# sets the shell variable that indicates the presence of the given module to
+# a C preprocessor expression that will evaluate to 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
+[
+  gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
+    [GNULIB_[]m4_translit([[$1]],
+                          [abcdefghijklmnopqrstuvwxyz./-],
+                          [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
+    [gl_MODULE_INDICATOR_CONDITION])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
+# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
+# The shell variable's value is a C preprocessor expression that evaluates
+# to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
+[
+  m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
+    [
+     dnl Simplify the expression VALUE || 1 to 1.
+     $1=1
+    ],
+    [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
+                                             [gl_MODULE_INDICATOR_CONDITION])])
+])
+
+# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
+# modifies the shell variable to include the given condition.  The shell
+# variable's value is a C preprocessor expression that evaluates to 0 or 1.
+AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
+[
+  dnl Simplify the expression 1 || CONDITION to 1.
+  if test "$[]$1" != 1; then
+    dnl Simplify the expression 0 || CONDITION to CONDITION.
+    if test "$[]$1" = 0; then
+      $1=$2
+    else
+      $1="($[]$1 || $2)"
+    fi
+  fi
+])
+
+# gl_MODULE_INDICATOR([modulename])
+# defines a C macro indicating the presence of the given module
+# in a location where it can be used.
+#                                             |  Value  |   Value   |
+#                                             | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules:          |    1    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: |    0    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module not present at all:                  |    0    |     0     |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR],
+[
+  AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
+      [abcdefghijklmnopqrstuvwxyz./-],
+      [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
+    [gl_MODULE_INDICATOR_CONDITION],
+    [Define to a C preprocessor expression that evaluates to 1 or 0,
+     depending whether the gnulib module $1 shall be considered present.])
+])
+
+# gl_MODULE_INDICATOR_FOR_TESTS([modulename])
+# defines a C macro indicating the presence of the given module
+# in lib or tests. This is useful to determine whether the module
+# should be tested.
+#                                             |  Value  |   Value   |
+#                                             | in lib/ | in tests/ |
+# --------------------------------------------+---------+-----------+
+# Module present among main modules:          |    1    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module present among tests-related modules: |    1    |     1     |
+# --------------------------------------------+---------+-----------+
+# Module not present at all:                  |    0    |     0     |
+# --------------------------------------------+---------+-----------+
+AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
+[
+  AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
+      [abcdefghijklmnopqrstuvwxyz./-],
+      [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
+    [Define to 1 when the gnulib module $1 should be tested.])
+])
+
+# gl_ASSERT_NO_GNULIB_POSIXCHECK
+# asserts that there will never be a need to #define GNULIB_POSIXCHECK.
+# and thereby enables an optimization of configure and config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
+[
+  dnl Override gl_WARN_ON_USE_PREPARE.
+  dnl But hide this definition from 'aclocal'.
+  AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
+])
+
+# gl_ASSERT_NO_GNULIB_TESTS
+# asserts that there will be no gnulib tests in the scope of the configure.ac
+# and thereby enables an optimization of config.h.
+# Used by Emacs.
+AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
+[
+  dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
+  AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
+])
+
+# Test whether <features.h> exists.
+# Set HAVE_FEATURES_H.
+AC_DEFUN([gl_FEATURES_H],
+[
+  AC_CHECK_HEADERS_ONCE([features.h])
+  if test $ac_cv_header_features_h = yes; then
+    HAVE_FEATURES_H=1
+  else
+    HAVE_FEATURES_H=0
+  fi
+  AC_SUBST([HAVE_FEATURES_H])
+])
+
+# AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH])
+# ----------------------------------------------------
+# Backport of autoconf-2.63b's macro.
+# Remove this macro when we can assume autoconf >= 2.64.
+m4_ifndef([AS_VAR_IF],
+[m4_define([AS_VAR_IF],
+[AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])])
+
+# gl_PROG_CC_C99
+# Modifies the value of the shell variable CC in an attempt to make $CC
+# understand ISO C99 source code.
+# This is like AC_PROG_CC_C99, except that
+# - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC
+#   <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00367.html>,
+#   but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99
+#   <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00441.html>.
+# Remaining problems:
+# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options
+#   to CC twice
+#   <https://lists.gnu.org/r/bug-gnulib/2011-09/msg00431.html>.
+# - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard.
+AC_DEFUN([gl_PROG_CC_C99],
+[
+  dnl Change that version number to the minimum Autoconf version that supports
+  dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls.
+  m4_version_prereq([9.0],
+    [AC_REQUIRE([AC_PROG_CC_C99])],
+    [AC_REQUIRE([AC_PROG_CC_STDC])])
+])
+
+# gl_PROG_AR_RANLIB
+# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
+# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
+# the values.
+AC_DEFUN([gl_PROG_AR_RANLIB],
+[
+  dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
+  dnl as "cc", and GCC as "gcc". They have different object file formats and
+  dnl library formats. In particular, the GNU binutils programs ar and ranlib
+  dnl produce libraries that work only with gcc, not with cc.
+  AC_REQUIRE([AC_PROG_CC])
+  dnl The '][' hides this use from 'aclocal'.
+  AC_BEFORE([$0], [A][M_PROG_AR])
+  AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
+    [
+      AC_EGREP_CPP([Amsterdam],
+        [
+#ifdef __ACK__
+Amsterdam
+#endif
+        ],
+        [gl_cv_c_amsterdam_compiler=yes],
+        [gl_cv_c_amsterdam_compiler=no])
+    ])
+
+  dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
+  dnl building with __ACK__.
+  if test $gl_cv_c_amsterdam_compiler = yes; then
+    if test -z "$AR"; then
+      AR='cc -c.a'
+    fi
+    if test -z "$ARFLAGS"; then
+      ARFLAGS='-o'
+    fi
+  else
+    dnl AM_PROG_AR was added in automake v1.11.2.  AM_PROG_AR does not AC_SUBST
+    dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
+    dnl script on-demand, if not specified by ./configure of course).
+    dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
+    dnl will be ignored.  Also, pay attention to call AM_PROG_AR in else block
+    dnl because AM_PROG_AR is written so it could re-set AR variable even for
+    dnl __ACK__.  It may seem like its easier to avoid calling the macro here,
+    dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
+    dnl default value and automake should usually know them).
+    dnl
+    dnl The '][' hides this use from 'aclocal'.
+    m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
+  fi
+
+  dnl In case the code above has not helped with setting AR/ARFLAGS, use
+  dnl Automake-documented default values for AR and ARFLAGS, but prefer
+  dnl ${host}-ar over ar (useful for cross-compiling).
+  AC_CHECK_TOOL([AR], [ar], [ar])
+  if test -z "$ARFLAGS"; then
+    ARFLAGS='cr'
+  fi
+
+  AC_SUBST([AR])
+  AC_SUBST([ARFLAGS])
+  if test -z "$RANLIB"; then
+    if test $gl_cv_c_amsterdam_compiler = yes; then
+      RANLIB=':'
+    else
+      dnl Use the ranlib program if it is available.
+      AC_PROG_RANLIB
+    fi
+  fi
+  AC_SUBST([RANLIB])
+])
+
+# AC_C_RESTRICT
+# This definition is copied from post-2.69 Autoconf and overrides the
+# AC_C_RESTRICT macro from autoconf 2.60..2.69.  It can be removed
+# once autoconf >= 2.70 can be assumed.  It's painful to check version
+# numbers, and in practice this macro is more up-to-date than Autoconf
+# is, so override Autoconf unconditionally.
+AC_DEFUN([AC_C_RESTRICT],
+[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
+  [ac_cv_c_restrict=no
+   # The order here caters to the fact that C++ does not require restrict.
+   for ac_kw in __restrict __restrict__ _Restrict restrict; do
+     AC_COMPILE_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[typedef int *int_ptr;
+           int foo (int_ptr $ac_kw ip) { return ip[0]; }
+           int bar (int [$ac_kw]); /* Catch GCC bug 14050.  */
+           int bar (int ip[$ac_kw]) { return ip[0]; }
+         ]],
+         [[int s[1];
+           int *$ac_kw t = s;
+           t[0] = 0;
+           return foo (t) + bar (t);
+         ]])],
+      [ac_cv_c_restrict=$ac_kw])
+     test "$ac_cv_c_restrict" != no && break
+   done
+  ])
+ AH_VERBATIM([restrict],
+[/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#undef restrict
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
+# define _Restrict
+# define __restrict__
+#endif])
+ case $ac_cv_c_restrict in
+   restrict) ;;
+   no) AC_DEFINE([restrict], []) ;;
+   *)  AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
+ esac
+])# AC_C_RESTRICT
+
+# gl_BIGENDIAN
+# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
+# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
+# macros invoke AC_C_BIGENDIAN with arguments.
+AC_DEFUN([gl_BIGENDIAN],
+[
+  AC_C_BIGENDIAN
+])
+
+# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
+# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
+# output a spurious "(cached)" mark in the midst of other configure output.
+# This macro should be used instead of AC_CACHE_VAL when it is not surrounded
+# by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
+AC_DEFUN([gl_CACHE_VAL_SILENT],
+[
+  saved_as_echo_n="$as_echo_n"
+  as_echo_n=':'
+  AC_CACHE_VAL([$1], [$2])
+  as_echo_n="$saved_as_echo_n"
+])
+
+# AS_VAR_COPY was added in autoconf 2.63b
+m4_define_default([AS_VAR_COPY],
+[AS_LITERAL_IF([$1[]$2], [$1=$$2], [eval $1=\$$2])])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
new file mode 100644 (file)
index 0000000..44d182d
--- /dev/null
@@ -0,0 +1,481 @@
+# DO NOT EDIT! GENERATED AUTOMATICALLY!
+# Copyright (C) 2002-2020 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this file.  If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License,
+# this file may be distributed as part of a program that
+# contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# Generated by gnulib-tool.
+#
+# This file represents the compiled summary of the specification in
+# gnulib-cache.m4. It lists the computed macro invocations that need
+# to be invoked from configure.ac.
+# In projects that use version control, this file can be treated like
+# other built files.
+
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Checks for programs", right after AC_PROG_CC, and certainly before
+# any checks for libraries, header files, types and library functions.
+AC_DEFUN([gl_EARLY],
+[
+  m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace
+  m4_pattern_allow([^gl_ES$])dnl a valid locale name
+  m4_pattern_allow([^gl_LIBOBJS$])dnl a variable
+  m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable
+
+  # Pre-early section.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  AC_REQUIRE([gl_PROG_AR_RANLIB])
+
+  # Code from module absolute-header:
+  # Code from module access:
+  # Code from module alloca:
+  # Code from module alloca-opt:
+  # Code from module close:
+  # Code from module concat-filename:
+  # Code from module dirname-lgpl:
+  # Code from module dosname:
+  # Code from module double-slash-root:
+  # Code from module dup2:
+  # Code from module errno:
+  # Code from module error:
+  # Code from module exitfail:
+  # Code from module extensions:
+  # Code from module extern-inline:
+  # Code from module fcntl:
+  # Code from module fcntl-h:
+  # Code from module fd-hook:
+  # Code from module fdl:
+  # Code from module filename:
+  # Code from module findprog-in:
+  # Code from module getdtablesize:
+  # Code from module getloadavg:
+  # Code from module getprogname:
+  # Code from module gettext-h:
+  # Code from module host-cpu-c-abi:
+  # Code from module include_next:
+  # Code from module intprops:
+  # Code from module limits-h:
+  # Code from module make-glob:
+  # Code from module malloc-posix:
+  # Code from module msvc-inval:
+  # Code from module msvc-nothrow:
+  # Code from module multiarch:
+  # Code from module snippet/_Noreturn:
+  # Code from module snippet/arg-nonnull:
+  # Code from module snippet/c++defs:
+  # Code from module snippet/warn-on-use:
+  # Code from module ssize_t:
+  # Code from module stdbool:
+  # Code from module stddef:
+  # Code from module stdint:
+  # Code from module stdio:
+  # Code from module stdlib:
+  # Code from module stpcpy:
+  # Code from module strerror:
+  # Code from module strerror-override:
+  # Code from module string:
+  # Code from module sys_types:
+  # Code from module unistd:
+  # Code from module verify:
+  # Code from module xalloc:
+  # Code from module xalloc-die:
+  # Code from module xalloc-oversized:
+  # Code from module xconcat-filename:
+])
+
+# This macro should be invoked from ./configure.ac, in the section
+# "Check for header files, types and library functions".
+AC_DEFUN([gl_INIT],
+[
+  AM_CONDITIONAL([GL_COND_LIBTOOL], [false])
+  gl_cond_libtool=false
+  gl_libdeps=
+  gl_ltlibdeps=
+  gl_m4_base='m4'
+  m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ]))
+  m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS]))
+  m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES]))
+  m4_pushdef([gl_LIBSOURCES_LIST], [])
+  m4_pushdef([gl_LIBSOURCES_DIR], [])
+  gl_COMMON
+  gl_source_base='lib'
+  gl_FUNC_ACCESS
+  if test $REPLACE_ACCESS = 1; then
+    AC_LIBOBJ([access])
+  fi
+  gl_UNISTD_MODULE_INDICATOR([access])
+  gl_FUNC_ALLOCA
+  gl_FUNC_CLOSE
+  if test $REPLACE_CLOSE = 1; then
+    AC_LIBOBJ([close])
+  fi
+  gl_UNISTD_MODULE_INDICATOR([close])
+  gl_DIRNAME_LGPL
+  gl_DOUBLE_SLASH_ROOT
+  gl_FUNC_DUP2
+  if test $HAVE_DUP2 = 0 || test $REPLACE_DUP2 = 1; then
+    AC_LIBOBJ([dup2])
+    gl_PREREQ_DUP2
+  fi
+  gl_UNISTD_MODULE_INDICATOR([dup2])
+  gl_HEADER_ERRNO_H
+  gl_ERROR
+  if test $ac_cv_lib_error_at_line = no; then
+    AC_LIBOBJ([error])
+    gl_PREREQ_ERROR
+  fi
+  m4_ifdef([AM_XGETTEXT_OPTION],
+    [AM_][XGETTEXT_OPTION([--flag=error:3:c-format])
+     AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])])
+  AC_REQUIRE([gl_EXTERN_INLINE])
+  gl_FUNC_FCNTL
+  if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
+    AC_LIBOBJ([fcntl])
+  fi
+  gl_FCNTL_MODULE_INDICATOR([fcntl])
+  gl_FCNTL_H
+  gl_FINDPROG_IN
+  gl_FUNC_GETDTABLESIZE
+  if test $HAVE_GETDTABLESIZE = 0 || test $REPLACE_GETDTABLESIZE = 1; then
+    AC_LIBOBJ([getdtablesize])
+    gl_PREREQ_GETDTABLESIZE
+  fi
+  gl_UNISTD_MODULE_INDICATOR([getdtablesize])
+  gl_GETLOADAVG
+  if test $HAVE_GETLOADAVG = 0; then
+    AC_LIBOBJ([getloadavg])
+    gl_PREREQ_GETLOADAVG
+  fi
+  gl_STDLIB_MODULE_INDICATOR([getloadavg])
+  gl_FUNC_GETPROGNAME
+  AC_SUBST([LIBINTL])
+  AC_SUBST([LTLIBINTL])
+  AC_REQUIRE([gl_HOST_CPU_C_ABI])
+  gl_LIMITS_H
+  # Check the system to see if it provides GNU glob.  If not, use our
+  # local version.
+  AC_CACHE_CHECK([if system libc has GNU glob], [make_cv_sys_gnu_glob],
+  [ AC_EGREP_CPP([gnu glob],[
+  #include <features.h>
+  #include <glob.h>
+  #include <fnmatch.h>
+  #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
+  # include <gnu-versions.h>
+  # if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2
+     gnu glob
+  # endif
+  #endif],
+          [make_cv_sys_gnu_glob=yes],
+          [make_cv_sys_gnu_glob=no])])
+  # Tell automake about this, so it can build the right .c files.
+  AM_CONDITIONAL([USE_SYSTEM_GLOB], [test "$make_cv_sys_gnu_glob" = yes])
+  # Tell build.sh which to use
+  USE_SYSTEM_GLOB="$make_cv_sys_gnu_glob"
+  AC_SUBST([USE_SYSTEM_GLOB])
+  gl_FUNC_MALLOC_POSIX
+  if test $REPLACE_MALLOC = 1; then
+    AC_LIBOBJ([malloc])
+  fi
+  gl_STDLIB_MODULE_INDICATOR([malloc-posix])
+  AC_REQUIRE([gl_MSVC_INVAL])
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+    AC_LIBOBJ([msvc-inval])
+  fi
+  AC_REQUIRE([gl_MSVC_NOTHROW])
+  if test $HAVE_MSVC_INVALID_PARAMETER_HANDLER = 1; then
+    AC_LIBOBJ([msvc-nothrow])
+  fi
+  gl_MODULE_INDICATOR([msvc-nothrow])
+  gl_MULTIARCH
+  gt_TYPE_SSIZE_T
+  AM_STDBOOL_H
+  gl_STDDEF_H
+  gl_STDINT_H
+  gl_STDIO_H
+  gl_STDLIB_H
+  gl_FUNC_STPCPY
+  if test $HAVE_STPCPY = 0; then
+    AC_LIBOBJ([stpcpy])
+    gl_PREREQ_STPCPY
+  fi
+  gl_STRING_MODULE_INDICATOR([stpcpy])
+  gl_FUNC_STRERROR
+  if test $REPLACE_STRERROR = 1; then
+    AC_LIBOBJ([strerror])
+  fi
+  gl_MODULE_INDICATOR([strerror])
+  gl_STRING_MODULE_INDICATOR([strerror])
+  AC_REQUIRE([gl_HEADER_ERRNO_H])
+  AC_REQUIRE([gl_FUNC_STRERROR_0])
+  if test -n "$ERRNO_H" || test $REPLACE_STRERROR_0 = 1; then
+    AC_LIBOBJ([strerror-override])
+    gl_PREREQ_SYS_H_WINSOCK2
+  fi
+  gl_HEADER_STRING_H
+  gl_SYS_TYPES_H
+  AC_PROG_MKDIR_P
+  gl_UNISTD_H
+  gl_XALLOC
+  # End of code from modules
+  m4_ifval(gl_LIBSOURCES_LIST, [
+    m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
+      for gl_file in ]gl_LIBSOURCES_LIST[ ; do
+        if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then
+          echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2
+          exit 1
+        fi
+      done])dnl
+      m4_if(m4_sysval, [0], [],
+        [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+  ])
+  m4_popdef([gl_LIBSOURCES_DIR])
+  m4_popdef([gl_LIBSOURCES_LIST])
+  m4_popdef([AC_LIBSOURCES])
+  m4_popdef([AC_REPLACE_FUNCS])
+  m4_popdef([AC_LIBOBJ])
+  AC_CONFIG_COMMANDS_PRE([
+    gl_libobjs=
+    gl_ltlibobjs=
+    if test -n "$gl_LIBOBJS"; then
+      # Remove the extension.
+      sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+        gl_libobjs="$gl_libobjs $i.$ac_objext"
+        gl_ltlibobjs="$gl_ltlibobjs $i.lo"
+      done
+    fi
+    AC_SUBST([gl_LIBOBJS], [$gl_libobjs])
+    AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs])
+  ])
+  gltests_libdeps=
+  gltests_ltlibdeps=
+  m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ]))
+  m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS]))
+  m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES]))
+  m4_pushdef([gltests_LIBSOURCES_LIST], [])
+  m4_pushdef([gltests_LIBSOURCES_DIR], [])
+  gl_COMMON
+  gl_source_base='tests'
+changequote(,)dnl
+  gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS
+changequote([, ])dnl
+  AC_SUBST([gltests_WITNESS])
+  gl_module_indicator_condition=$gltests_WITNESS
+  m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition])
+  m4_popdef([gl_MODULE_INDICATOR_CONDITION])
+  m4_ifval(gltests_LIBSOURCES_LIST, [
+    m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ ||
+      for gl_file in ]gltests_LIBSOURCES_LIST[ ; do
+        if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then
+          echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2
+          exit 1
+        fi
+      done])dnl
+      m4_if(m4_sysval, [0], [],
+        [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])])
+  ])
+  m4_popdef([gltests_LIBSOURCES_DIR])
+  m4_popdef([gltests_LIBSOURCES_LIST])
+  m4_popdef([AC_LIBSOURCES])
+  m4_popdef([AC_REPLACE_FUNCS])
+  m4_popdef([AC_LIBOBJ])
+  AC_CONFIG_COMMANDS_PRE([
+    gltests_libobjs=
+    gltests_ltlibobjs=
+    if test -n "$gltests_LIBOBJS"; then
+      # Remove the extension.
+      sed_drop_objext='s/\.o$//;s/\.obj$//'
+      for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do
+        gltests_libobjs="$gltests_libobjs $i.$ac_objext"
+        gltests_ltlibobjs="$gltests_ltlibobjs $i.lo"
+      done
+    fi
+    AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs])
+    AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs])
+  ])
+  LIBGNU_LIBDEPS="$gl_libdeps"
+  AC_SUBST([LIBGNU_LIBDEPS])
+  LIBGNU_LTLIBDEPS="$gl_ltlibdeps"
+  AC_SUBST([LIBGNU_LTLIBDEPS])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_LIBOBJ], [
+  AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl
+  gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gl_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gl_REPLACE_FUNCS], [
+  m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+  AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gl_LIBSOURCES], [
+  m4_foreach([_gl_NAME], [$1], [
+    m4_if(_gl_NAME, [alloca.c], [], [
+      m4_define([gl_LIBSOURCES_DIR], [lib])
+      m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ])
+    ])
+  ])
+])
+
+# Like AC_LIBOBJ, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_LIBOBJ], [
+  AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl
+  gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext"
+])
+
+# Like AC_REPLACE_FUNCS, except that the module name goes
+# into gltests_LIBOBJS instead of into LIBOBJS.
+AC_DEFUN([gltests_REPLACE_FUNCS], [
+  m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl
+  AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)])
+])
+
+# Like AC_LIBSOURCES, except the directory where the source file is
+# expected is derived from the gnulib-tool parameterization,
+# and alloca is special cased (for the alloca-opt module).
+# We could also entirely rely on EXTRA_lib..._SOURCES.
+AC_DEFUN([gltests_LIBSOURCES], [
+  m4_foreach([_gl_NAME], [$1], [
+    m4_if(_gl_NAME, [alloca.c], [], [
+      m4_define([gltests_LIBSOURCES_DIR], [tests])
+      m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ])
+    ])
+  ])
+])
+
+# This macro records the list of files which have been installed by
+# gnulib-tool and may be removed by future gnulib-tool invocations.
+AC_DEFUN([gl_FILE_LIST], [
+  doc/fdl.texi
+  lib/_Noreturn.h
+  lib/access.c
+  lib/alloca.c
+  lib/alloca.in.h
+  lib/arg-nonnull.h
+  lib/basename-lgpl.c
+  lib/c++defs.h
+  lib/close.c
+  lib/concat-filename.c
+  lib/concat-filename.h
+  lib/dirname-lgpl.c
+  lib/dirname.h
+  lib/dosname.h
+  lib/dup2.c
+  lib/errno.in.h
+  lib/error.c
+  lib/error.h
+  lib/exitfail.c
+  lib/exitfail.h
+  lib/fcntl.c
+  lib/fcntl.in.h
+  lib/fd-hook.c
+  lib/fd-hook.h
+  lib/filename.h
+  lib/findprog-in.c
+  lib/findprog.h
+  lib/getdtablesize.c
+  lib/getloadavg.c
+  lib/getprogname.c
+  lib/getprogname.h
+  lib/gettext.h
+  lib/intprops.h
+  lib/limits.in.h
+  lib/malloc.c
+  lib/msvc-inval.c
+  lib/msvc-inval.h
+  lib/msvc-nothrow.c
+  lib/msvc-nothrow.h
+  lib/stdbool.in.h
+  lib/stddef.in.h
+  lib/stdint.in.h
+  lib/stdio.in.h
+  lib/stdlib.in.h
+  lib/stpcpy.c
+  lib/strerror-override.c
+  lib/strerror-override.h
+  lib/strerror.c
+  lib/string.in.h
+  lib/stripslash.c
+  lib/sys_types.in.h
+  lib/unistd.c
+  lib/unistd.in.h
+  lib/verify.h
+  lib/warn-on-use.h
+  lib/xalloc-die.c
+  lib/xalloc-oversized.h
+  lib/xalloc.h
+  lib/xconcat-filename.c
+  lib/xmalloc.c
+  m4/00gnulib.m4
+  m4/absolute-header.m4
+  m4/access.m4
+  m4/alloca.m4
+  m4/asm-underscore.m4
+  m4/close.m4
+  m4/dirname.m4
+  m4/double-slash-root.m4
+  m4/dup2.m4
+  m4/eaccess.m4
+  m4/errno_h.m4
+  m4/error.m4
+  m4/extensions.m4
+  m4/extern-inline.m4
+  m4/fcntl-o.m4
+  m4/fcntl.m4
+  m4/fcntl_h.m4
+  m4/findprog-in.m4
+  m4/getdtablesize.m4
+  m4/getloadavg.m4
+  m4/getprogname.m4
+  m4/gnulib-common.m4
+  m4/host-cpu-c-abi.m4
+  m4/include_next.m4
+  m4/limits-h.m4
+  m4/malloc.m4
+  m4/msvc-inval.m4
+  m4/msvc-nothrow.m4
+  m4/multiarch.m4
+  m4/off_t.m4
+  m4/ssize_t.m4
+  m4/stdbool.m4
+  m4/stddef_h.m4
+  m4/stdint.m4
+  m4/stdio_h.m4
+  m4/stdlib_h.m4
+  m4/stpcpy.m4
+  m4/strerror.m4
+  m4/string_h.m4
+  m4/sys_socket_h.m4
+  m4/sys_types_h.m4
+  m4/unistd_h.m4
+  m4/warn-on-use.m4
+  m4/wchar_t.m4
+  m4/wint_t.m4
+  m4/xalloc.m4
+])
diff --git a/m4/host-cpu-c-abi.m4 b/m4/host-cpu-c-abi.m4
new file mode 100644 (file)
index 0000000..6db2aa2
--- /dev/null
@@ -0,0 +1,675 @@
+# host-cpu-c-abi.m4 serial 13
+dnl Copyright (C) 2002-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible and Sam Steingold.
+
+dnl Sets the HOST_CPU variable to the canonical name of the CPU.
+dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its
+dnl C language ABI (application binary interface).
+dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in
+dnl config.h.
+dnl
+dnl This canonical name can be used to select a particular assembly language
+dnl source file that will interoperate with C code on the given host.
+dnl
+dnl For example:
+dnl * 'i386' and 'sparc' are different canonical names, because code for i386
+dnl   will not run on SPARC CPUs and vice versa. They have different
+dnl   instruction sets.
+dnl * 'sparc' and 'sparc64' are different canonical names, because code for
+dnl   'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code
+dnl   contains 32-bit instructions, whereas 'sparc64' code contains 64-bit
+dnl   instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit
+dnl   mode, but not both.
+dnl * 'mips' and 'mipsn32' are different canonical names, because they use
+dnl   different argument passing and return conventions for C functions, and
+dnl   although the instruction set of 'mips' is a large subset of the
+dnl   instruction set of 'mipsn32'.
+dnl * 'mipsn32' and 'mips64' are different canonical names, because they use
+dnl   different sizes for the C types like 'int' and 'void *', and although
+dnl   the instruction sets of 'mipsn32' and 'mips64' are the same.
+dnl * The same canonical name is used for different endiannesses. You can
+dnl   determine the endianness through preprocessor symbols:
+dnl   - 'arm': test __ARMEL__.
+dnl   - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL.
+dnl   - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN.
+dnl * The same name 'i386' is used for CPUs of type i386, i486, i586
+dnl   (Pentium), AMD K7, Pentium II, Pentium IV, etc., because
+dnl   - Instructions that do not exist on all of these CPUs (cmpxchg,
+dnl     MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your
+dnl     assembly language source files use such instructions, you will
+dnl     need to make the distinction.
+dnl   - Speed of execution of the common instruction set is reasonable across
+dnl     the entire family of CPUs. If you have assembly language source files
+dnl     that are optimized for particular CPU types (like GNU gmp has), you
+dnl     will need to make the distinction.
+dnl   See <https://en.wikipedia.org/wiki/X86_instruction_listings>.
+AC_DEFUN([gl_HOST_CPU_C_ABI],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([gl_C_ASM])
+  AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi],
+    [case "$host_cpu" in
+
+changequote(,)dnl
+       i[34567]86 )
+changequote([,])dnl
+         gl_cv_host_cpu_c_abi=i386
+         ;;
+
+       x86_64 )
+         # On x86_64 systems, the C compiler may be generating code in one of
+         # these ABIs:
+         # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+         # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+         #   with native Windows (mingw, MSVC).
+         # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+         # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if (defined __x86_64__ || defined __amd64__ \
+                     || defined _M_X64 || defined _M_AMD64)
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [AC_COMPILE_IFELSE(
+              [AC_LANG_SOURCE(
+                 [[#if defined __ILP32__ || defined _ILP32
+                    int ok;
+                   #else
+                    error fail
+                   #endif
+                 ]])],
+              [gl_cv_host_cpu_c_abi=x86_64-x32],
+              [gl_cv_host_cpu_c_abi=x86_64])],
+           [gl_cv_host_cpu_c_abi=i386])
+         ;;
+
+changequote(,)dnl
+       alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] )
+changequote([,])dnl
+         gl_cv_host_cpu_c_abi=alpha
+         ;;
+
+       arm* | aarch64 )
+         # Assume arm with EABI.
+         # On arm64 systems, the C compiler may be generating code in one of
+         # these ABIs:
+         # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+         # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+         # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#ifdef __aarch64__
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [AC_COMPILE_IFELSE(
+              [AC_LANG_SOURCE(
+                [[#if defined __ILP32__ || defined _ILP32
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+              [gl_cv_host_cpu_c_abi=arm64-ilp32],
+              [gl_cv_host_cpu_c_abi=arm64])],
+           [# Don't distinguish little-endian and big-endian arm, since they
+            # don't require different machine code for simple operations and
+            # since the user can distinguish them through the preprocessor
+            # defines __ARMEL__ vs. __ARMEB__.
+            # But distinguish arm which passes floating-point arguments and
+            # return values in integer registers (r0, r1, ...) - this is
+            # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which
+            # passes them in float registers (s0, s1, ...) and double registers
+            # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer
+            # sets the preprocessor defines __ARM_PCS (for the first case) and
+            # __ARM_PCS_VFP (for the second case), but older GCC does not.
+            echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c
+            # Look for a reference to the register d0 in the .s file.
+            AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1
+            if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then
+              gl_cv_host_cpu_c_abi=armhf
+            else
+              gl_cv_host_cpu_c_abi=arm
+            fi
+            rm -f conftest*
+           ])
+         ;;
+
+       hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+         # On hppa, the C compiler may be generating 32-bit code or 64-bit
+         # code. In the latter case, it defines _LP64 and __LP64__.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#ifdef __LP64__
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [gl_cv_host_cpu_c_abi=hppa64],
+           [gl_cv_host_cpu_c_abi=hppa])
+         ;;
+
+       ia64* )
+         # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+         # 32-bit code. In the latter case, it defines _ILP32.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#ifdef _ILP32
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [gl_cv_host_cpu_c_abi=ia64-ilp32],
+           [gl_cv_host_cpu_c_abi=ia64])
+         ;;
+
+       mips* )
+         # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+         # at 32.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [gl_cv_host_cpu_c_abi=mips64],
+           [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but
+            # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32.
+            # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but
+            # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32.
+            AC_COMPILE_IFELSE(
+              [AC_LANG_SOURCE(
+                 [[#if (_MIPS_SIM == _ABIN32)
+                    int ok;
+                   #else
+                    error fail
+                   #endif
+                 ]])],
+              [gl_cv_host_cpu_c_abi=mipsn32],
+              [gl_cv_host_cpu_c_abi=mips])])
+         ;;
+
+       powerpc* )
+         # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+         # No need to distinguish them here; the caller may distinguish
+         # them based on the OS.
+         # On powerpc64 systems, the C compiler may still be generating
+         # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+         # be generating 64-bit code.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __powerpc64__ || defined _ARCH_PPC64
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [# On powerpc64, there are two ABIs on Linux: The AIX compatible
+            # one and the ELFv2 one. The latter defines _CALL_ELF=2.
+            AC_COMPILE_IFELSE(
+              [AC_LANG_SOURCE(
+                 [[#if defined _CALL_ELF && _CALL_ELF == 2
+                    int ok;
+                   #else
+                    error fail
+                   #endif
+                 ]])],
+              [gl_cv_host_cpu_c_abi=powerpc64-elfv2],
+              [gl_cv_host_cpu_c_abi=powerpc64])
+           ],
+           [gl_cv_host_cpu_c_abi=powerpc])
+         ;;
+
+       rs6000 )
+         gl_cv_host_cpu_c_abi=powerpc
+         ;;
+
+       riscv32 | riscv64 )
+         # There are 2 architectures (with variants): rv32* and rv64*.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if __riscv_xlen == 64
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [cpu=riscv64],
+           [cpu=riscv32])
+         # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+         # Size of 'long' and 'void *':
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __LP64__
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [main_abi=lp64],
+           [main_abi=ilp32])
+         # Float ABIs:
+         # __riscv_float_abi_double:
+         #   'float' and 'double' are passed in floating-point registers.
+         # __riscv_float_abi_single:
+         #   'float' are passed in floating-point registers.
+         # __riscv_float_abi_soft:
+         #   No values are passed in floating-point registers.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __riscv_float_abi_double
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [float_abi=d],
+           [AC_COMPILE_IFELSE(
+              [AC_LANG_SOURCE(
+                 [[#if defined __riscv_float_abi_single
+                     int ok;
+                   #else
+                     error fail
+                   #endif
+                 ]])],
+              [float_abi=f],
+              [float_abi=''])
+           ])
+         gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}"
+         ;;
+
+       s390* )
+         # On s390x, the C compiler may be generating 64-bit (= s390x) code
+         # or 31-bit (= s390) code.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __LP64__ || defined __s390x__
+                  int ok;
+                #else
+                  error fail
+                #endif
+              ]])],
+           [gl_cv_host_cpu_c_abi=s390x],
+           [gl_cv_host_cpu_c_abi=s390])
+         ;;
+
+       sparc | sparc64 )
+         # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+         # C compiler still generates 32-bit code.
+         AC_COMPILE_IFELSE(
+           [AC_LANG_SOURCE(
+              [[#if defined __sparcv9 || defined __arch64__
+                 int ok;
+                #else
+                 error fail
+                #endif
+              ]])],
+           [gl_cv_host_cpu_c_abi=sparc64],
+           [gl_cv_host_cpu_c_abi=sparc])
+         ;;
+
+       *)
+         gl_cv_host_cpu_c_abi="$host_cpu"
+         ;;
+     esac
+    ])
+
+  dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same.
+  HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'`
+  HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi"
+  AC_SUBST([HOST_CPU])
+  AC_SUBST([HOST_CPU_C_ABI])
+
+  # This was
+  #   AC_DEFINE_UNQUOTED([__${HOST_CPU}__])
+  #   AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__])
+  # earlier, but KAI C++ 3.2d doesn't like this.
+  sed -e 's/-/_/g' >> confdefs.h <<EOF
+#ifndef __${HOST_CPU}__
+#define __${HOST_CPU}__ 1
+#endif
+#ifndef __${HOST_CPU_C_ABI}__
+#define __${HOST_CPU_C_ABI}__ 1
+#endif
+EOF
+  AH_TOP([/* CPU and C ABI indicator */
+#ifndef __i386__
+#undef __i386__
+#endif
+#ifndef __x86_64_x32__
+#undef __x86_64_x32__
+#endif
+#ifndef __x86_64__
+#undef __x86_64__
+#endif
+#ifndef __alpha__
+#undef __alpha__
+#endif
+#ifndef __arm__
+#undef __arm__
+#endif
+#ifndef __armhf__
+#undef __armhf__
+#endif
+#ifndef __arm64_ilp32__
+#undef __arm64_ilp32__
+#endif
+#ifndef __arm64__
+#undef __arm64__
+#endif
+#ifndef __hppa__
+#undef __hppa__
+#endif
+#ifndef __hppa64__
+#undef __hppa64__
+#endif
+#ifndef __ia64_ilp32__
+#undef __ia64_ilp32__
+#endif
+#ifndef __ia64__
+#undef __ia64__
+#endif
+#ifndef __m68k__
+#undef __m68k__
+#endif
+#ifndef __mips__
+#undef __mips__
+#endif
+#ifndef __mipsn32__
+#undef __mipsn32__
+#endif
+#ifndef __mips64__
+#undef __mips64__
+#endif
+#ifndef __powerpc__
+#undef __powerpc__
+#endif
+#ifndef __powerpc64__
+#undef __powerpc64__
+#endif
+#ifndef __powerpc64_elfv2__
+#undef __powerpc64_elfv2__
+#endif
+#ifndef __riscv32__
+#undef __riscv32__
+#endif
+#ifndef __riscv64__
+#undef __riscv64__
+#endif
+#ifndef __riscv32_ilp32__
+#undef __riscv32_ilp32__
+#endif
+#ifndef __riscv32_ilp32f__
+#undef __riscv32_ilp32f__
+#endif
+#ifndef __riscv32_ilp32d__
+#undef __riscv32_ilp32d__
+#endif
+#ifndef __riscv64_ilp32__
+#undef __riscv64_ilp32__
+#endif
+#ifndef __riscv64_ilp32f__
+#undef __riscv64_ilp32f__
+#endif
+#ifndef __riscv64_ilp32d__
+#undef __riscv64_ilp32d__
+#endif
+#ifndef __riscv64_lp64__
+#undef __riscv64_lp64__
+#endif
+#ifndef __riscv64_lp64f__
+#undef __riscv64_lp64f__
+#endif
+#ifndef __riscv64_lp64d__
+#undef __riscv64_lp64d__
+#endif
+#ifndef __s390__
+#undef __s390__
+#endif
+#ifndef __s390x__
+#undef __s390x__
+#endif
+#ifndef __sh__
+#undef __sh__
+#endif
+#ifndef __sparc__
+#undef __sparc__
+#endif
+#ifndef __sparc64__
+#undef __sparc64__
+#endif
+])
+
+])
+
+
+dnl Sets the HOST_CPU_C_ABI_32BIT variable to 'yes' if the C language ABI
+dnl (application binary interface) is a 32-bit one, to 'no' if it is a 64-bit
+dnl one, or to 'unknown' if unknown.
+dnl This is a simplified variant of gl_HOST_CPU_C_ABI.
+AC_DEFUN([gl_HOST_CPU_C_ABI_32BIT],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_CACHE_CHECK([32-bit host C ABI], [gl_cv_host_cpu_c_abi_32bit],
+    [if test -n "$gl_cv_host_cpu_c_abi"; then
+       case "$gl_cv_host_cpu_c_abi" in
+         i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
+           gl_cv_host_cpu_c_abi_32bit=yes ;;
+         x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
+           gl_cv_host_cpu_c_abi_32bit=no ;;
+         *)
+           gl_cv_host_cpu_c_abi_32bit=unknown ;;
+       esac
+     else
+       case "$host_cpu" in
+
+         # CPUs that only support a 32-bit ABI.
+         arc \
+         | bfin \
+         | cris* \
+         | csky \
+         | epiphany \
+         | ft32 \
+         | h8300 \
+         | m68k \
+         | microblaze | microblazeel \
+         | nds32 | nds32le | nds32be \
+         | nios2 | nios2eb | nios2el \
+         | or1k* \
+         | or32 \
+         | sh | sh[1234] | sh[1234]e[lb] \
+         | tic6x \
+         | xtensa* )
+           gl_cv_host_cpu_c_abi_32bit=yes
+           ;;
+
+         # CPUs that only support a 64-bit ABI.
+changequote(,)dnl
+         alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
+         | mmix )
+changequote([,])dnl
+           gl_cv_host_cpu_c_abi_32bit=no
+           ;;
+
+changequote(,)dnl
+         i[34567]86 )
+changequote([,])dnl
+           gl_cv_host_cpu_c_abi_32bit=yes
+           ;;
+
+         x86_64 )
+           # On x86_64 systems, the C compiler may be generating code in one of
+           # these ABIs:
+           # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
+           # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
+           #   with native Windows (mingw, MSVC).
+           # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
+           # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if (defined __x86_64__ || defined __amd64__ \
+                       || defined _M_X64 || defined _M_AMD64) \
+                      && !(defined __ILP32__ || defined _ILP32)
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         arm* | aarch64 )
+           # Assume arm with EABI.
+           # On arm64 systems, the C compiler may be generating code in one of
+           # these ABIs:
+           # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
+           # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
+           # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32)
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
+           # On hppa, the C compiler may be generating 32-bit code or 64-bit
+           # code. In the latter case, it defines _LP64 and __LP64__.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#ifdef __LP64__
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         ia64* )
+           # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
+           # 32-bit code. In the latter case, it defines _ILP32.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#ifdef _ILP32
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=yes],
+             [gl_cv_host_cpu_c_abi_32bit=no])
+           ;;
+
+         mips* )
+           # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
+           # at 32.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         powerpc* )
+           # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
+           # No need to distinguish them here; the caller may distinguish
+           # them based on the OS.
+           # On powerpc64 systems, the C compiler may still be generating
+           # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
+           # be generating 64-bit code.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if defined __powerpc64__ || defined _ARCH_PPC64
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         rs6000 )
+           gl_cv_host_cpu_c_abi_32bit=yes
+           ;;
+
+         riscv32 | riscv64 )
+           # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
+           # Size of 'long' and 'void *':
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if defined __LP64__
+                    int ok;
+                  #else
+                    error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         s390* )
+           # On s390x, the C compiler may be generating 64-bit (= s390x) code
+           # or 31-bit (= s390) code.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if defined __LP64__ || defined __s390x__
+                    int ok;
+                  #else
+                    error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         sparc | sparc64 )
+           # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
+           # C compiler still generates 32-bit code.
+           AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE(
+                [[#if defined __sparcv9 || defined __arch64__
+                   int ok;
+                  #else
+                   error fail
+                  #endif
+                ]])],
+             [gl_cv_host_cpu_c_abi_32bit=no],
+             [gl_cv_host_cpu_c_abi_32bit=yes])
+           ;;
+
+         *)
+           gl_cv_host_cpu_c_abi_32bit=unknown
+           ;;
+       esac
+     fi
+    ])
+
+  HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
+])
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644 (file)
index 0000000..4e37363
--- /dev/null
@@ -0,0 +1,271 @@
+# iconv.m4 serial 19 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[
+#include <stdlib.h>
+#include <iconv.h>
+         ]],
+         [[iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);]])],
+      [am_cv_func_iconv=yes])
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+           ]],
+           [[iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);]])],
+        [am_cv_lib_iconv=yes]
+        [am_cv_func_iconv=yes])
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+      dnl Solaris 10.
+      am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        AC_RUN_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+             ]],
+             [[int result = 0;
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    result |= 16;
+  return result;
+]])],
+          [am_cv_func_iconv_works=yes], ,
+          [case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac])
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+    ])
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+    AC_DEFINE([HAVE_ICONV], [1],
+      [Define if you have the iconv() function and it works.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST([LIBICONV])
+  AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl   warnings.
+m4_define([gl_iconv_AC_DEFUN],
+  m4_version_prereq([2.64],
+    [[AC_DEFUN_ONCE(
+        [$1], [$2])]],
+    [m4_ifdef([gl_00GNULIB],
+       [[AC_DEFUN_ONCE(
+           [$1], [$2])]],
+       [[AC_DEFUN(
+           [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL([am_cv_proto_iconv], [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+           ]],
+           [[]])],
+        [am_cv_proto_iconv_arg1=""],
+        [am_cv_proto_iconv_arg1="const"])
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([
+         $am_cv_proto_iconv])
+    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+      [Define as const if the declaration of iconv() needs const.])
+    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+    m4_ifdef([gl_ICONV_H_DEFAULTS],
+      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+       if test -n "$am_cv_proto_iconv_arg1"; then
+         ICONV_CONST="const"
+       fi
+      ])
+  fi
+])
diff --git a/m4/include_next.m4 b/m4/include_next.m4
new file mode 100644 (file)
index 0000000..9009e29
--- /dev/null
@@ -0,0 +1,224 @@
+# include_next.m4 serial 24
+dnl Copyright (C) 2006-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Derek Price.
+
+dnl Sets INCLUDE_NEXT, INCLUDE_NEXT_AS_FIRST_DIRECTIVE, PRAGMA_SYSTEM_HEADER,
+dnl and PRAGMA_COLUMNS.
+dnl
+dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
+dnl 'include' otherwise.
+dnl
+dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
+dnl supports it in the special case that it is the first include directive in
+dnl the given file, or to 'include' otherwise.
+dnl
+dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
+dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
+dnl '#pragma GCC system_header' has the same effect as if the file was found
+dnl through the include search path specified with '-isystem' options (as
+dnl opposed to the search path specified with '-I' options). Namely, gcc
+dnl does not warn about some things, and on some systems (Solaris and Interix)
+dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
+dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
+dnl of plain '__STDC__'.
+dnl
+dnl PRAGMA_COLUMNS can be used in files that override system header files, so
+dnl as to avoid compilation errors on HP NonStop systems when the gnulib file
+dnl is included by a system header file that does a "#pragma COLUMNS 80" (which
+dnl has the effect of truncating the lines of that file and all files that it
+dnl includes to 80 columns) and the gnulib file has lines longer than 80
+dnl columns.
+
+AC_DEFUN([gl_INCLUDE_NEXT],
+[
+  AC_LANG_PREPROC_REQUIRE()
+  AC_CACHE_CHECK([whether the preprocessor supports include_next],
+    [gl_cv_have_include_next],
+    [rm -rf conftestd1a conftestd1b conftestd2
+     mkdir conftestd1a conftestd1b conftestd2
+     dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
+     dnl AIX 6.1 support include_next when used as first preprocessor directive
+     dnl in a file, but not when preceded by another include directive. Check
+     dnl for this bug by including <stdio.h>.
+     dnl Additionally, with this same compiler, include_next is a no-op when
+     dnl used in a header file that was included by specifying its absolute
+     dnl file name. Despite these two bugs, include_next is used in the
+     dnl compiler's <math.h>. By virtue of the second bug, we need to use
+     dnl include_next as well in this case.
+     cat <<EOF > conftestd1a/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd1b/conftest.h
+#define DEFINED_IN_CONFTESTD1
+#include <stdio.h>
+#include_next <conftest.h>
+#ifdef DEFINED_IN_CONFTESTD2
+int foo;
+#else
+#error "include_next doesn't work"
+#endif
+EOF
+     cat <<EOF > conftestd2/conftest.h
+#ifndef DEFINED_IN_CONFTESTD1
+#error "include_next test doesn't work"
+#endif
+#define DEFINED_IN_CONFTESTD2
+EOF
+     gl_save_CPPFLAGS="$CPPFLAGS"
+     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
+dnl We intentionally avoid using AC_LANG_SOURCE here.
+     AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+       [gl_cv_have_include_next=yes],
+       [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
+        AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
+          [gl_cv_have_include_next=buggy],
+          [gl_cv_have_include_next=no])
+       ])
+     CPPFLAGS="$gl_save_CPPFLAGS"
+     rm -rf conftestd1a conftestd1b conftestd2
+    ])
+  PRAGMA_SYSTEM_HEADER=
+  if test $gl_cv_have_include_next = yes; then
+    INCLUDE_NEXT=include_next
+    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    if test -n "$GCC"; then
+      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
+    fi
+  else
+    if test $gl_cv_have_include_next = buggy; then
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
+    else
+      INCLUDE_NEXT=include
+      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
+    fi
+  fi
+  AC_SUBST([INCLUDE_NEXT])
+  AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
+  AC_SUBST([PRAGMA_SYSTEM_HEADER])
+  AC_CACHE_CHECK([whether system header files limit the line length],
+    [gl_cv_pragma_columns],
+    [dnl HP NonStop systems, which define __TANDEM, have this misfeature.
+     AC_EGREP_CPP([choke me],
+       [
+#ifdef __TANDEM
+choke me
+#endif
+       ],
+       [gl_cv_pragma_columns=yes],
+       [gl_cv_pragma_columns=no])
+    ])
+  if test $gl_cv_pragma_columns = yes; then
+    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
+  else
+    PRAGMA_COLUMNS=
+  fi
+  AC_SUBST([PRAGMA_COLUMNS])
+])
+
+# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------------
+# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
+# '<foo.h>'; otherwise define it to be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# Also, if #include_next works as first preprocessing directive in a file,
+# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
+# be
+# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
+# That way, a header file with the following line:
+#       #@INCLUDE_NEXT@ @NEXT_FOO_H@
+# or
+#       #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
+# behaves (after sed substitution) as if it contained
+#       #include_next <foo.h>
+# even if the compiler does not support include_next.
+# The three "///" are to pacify Sun C 5.8, which otherwise would say
+# "warning: #include of /usr/include/... may be non-portable".
+# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
+# Note: This macro assumes that the header file is not empty after
+# preprocessing, i.e. it does not only define preprocessor macros but also
+# provides some type/enum definitions or function/variable declarations.
+#
+# This macro also checks whether each header exists, by invoking
+# AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument.
+AC_DEFUN([gl_CHECK_NEXT_HEADERS],
+[
+  gl_NEXT_HEADERS_INTERNAL([$1], [check])
+])
+
+# gl_NEXT_HEADERS(HEADER1 HEADER2 ...)
+# ------------------------------------
+# Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist.
+# This is suitable for headers like <stddef.h> that are standardized by C89
+# and therefore can be assumed to exist.
+AC_DEFUN([gl_NEXT_HEADERS],
+[
+  gl_NEXT_HEADERS_INTERNAL([$1], [assume])
+])
+
+# The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS.
+AC_DEFUN([gl_NEXT_HEADERS_INTERNAL],
+[
+  AC_REQUIRE([gl_INCLUDE_NEXT])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  m4_if([$2], [check],
+    [AC_CHECK_HEADERS_ONCE([$1])
+    ])
+
+dnl FIXME: gl_next_header and gl_header_exists must be used unquoted
+dnl until we can assume autoconf 2.64 or newer.
+  m4_foreach_w([gl_HEADER_NAME], [$1],
+    [AS_VAR_PUSHDEF([gl_next_header],
+                    [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
+     if test $gl_cv_have_include_next = yes; then
+       AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
+     else
+       AC_CACHE_CHECK(
+         [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
+         m4_defn([gl_next_header]),
+         [m4_if([$2], [check],
+            [AS_VAR_PUSHDEF([gl_header_exists],
+                            [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
+             if test AS_VAR_GET(gl_header_exists) = yes; then
+             AS_VAR_POPDEF([gl_header_exists])
+            ])
+           gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
+           AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
+           AS_VAR_SET(gl_next_header, ['"'$gl_header'"'])
+          m4_if([$2], [check],
+            [else
+               AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
+             fi
+            ])
+         ])
+     fi
+     AC_SUBST(
+       AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
+       [AS_VAR_GET(gl_next_header)])
+     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
+       gl_next_as_first_directive='<'gl_HEADER_NAME'>'
+     else
+       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
+       gl_next_as_first_directive=AS_VAR_GET(gl_next_header)
+     fi
+     AC_SUBST(
+       AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
+       [$gl_next_as_first_directive])
+     AS_VAR_POPDEF([gl_next_header])])
+])
+
+# Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE;
+# this fallback is safe for all earlier autoconf versions.
+m4_define_default([AC_LANG_DEFINES_PROVIDED])
diff --git a/m4/intlmacosx.m4 b/m4/intlmacosx.m4
new file mode 100644 (file)
index 0000000..8a045f6
--- /dev/null
@@ -0,0 +1,56 @@
+# intlmacosx.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2004-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Checks for special options needed on Mac OS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+  dnl Check for API introduced in Mac OS X 10.2.
+  AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+    [gt_cv_func_CFPreferencesCopyAppValue],
+    [gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <CoreFoundation/CFPreferences.h>]],
+          [[CFPreferencesCopyAppValue(NULL, NULL)]])],
+       [gt_cv_func_CFPreferencesCopyAppValue=yes],
+       [gt_cv_func_CFPreferencesCopyAppValue=no])
+     LIBS="$gt_save_LIBS"])
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+    AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
+      [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+  fi
+  dnl Check for API introduced in Mac OS X 10.3.
+  AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
+    [gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <CoreFoundation/CFLocale.h>]],
+          [[CFLocaleCopyCurrent();]])],
+       [gt_cv_func_CFLocaleCopyCurrent=yes],
+       [gt_cv_func_CFLocaleCopyCurrent=no])
+     LIBS="$gt_save_LIBS"])
+  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
+      [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+  fi
+  INTL_MACOSX_LIBS=
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+  fi
+  AC_SUBST([INTL_MACOSX_LIBS])
+])
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644 (file)
index 0000000..ddc569f
--- /dev/null
@@ -0,0 +1,119 @@
+# lib-ld.m4 serial 6
+dnl Copyright (C) 1996-2003, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes
+  ;;
+*)
+  acl_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+        [assume the C compiler uses GNU ld [default=no]])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL([acl_cv_path_LD],
+[if test -z "$LD"; then
+  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$acl_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break
+        ;;
+      *)
+        test "$with_gnu_ld" != yes && break
+        ;;
+      esac
+    fi
+  done
+  IFS="$acl_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT([$LD])
+else
+  AC_MSG_RESULT([no])
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644 (file)
index 0000000..3522d99
--- /dev/null
@@ -0,0 +1,777 @@
+# lib-link.m4 serial 26 (gettext-0.18.2)
+dnl Copyright (C) 2001-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[m4_translit([$1],[./+-], [____])])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[m4_translit([$1],[./+-], [____])])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+    dnl because these -l options might require -L options that are present in
+    dnl LIBS. -l options benefit only from the -L options listed before it.
+    dnl Otherwise, add it to the front of LIBS, because it may be a static
+    dnl library that depends on another static library that is present in LIBS.
+    dnl Static libraries benefit only from the static libraries listed after
+    dnl it.
+    case " $LIB[]NAME" in
+      *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+      *)       LIBS="$LIB[]NAME $LIBS" ;;
+    esac
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[$3]], [[$4]])],
+      [ac_cv_lib[]Name=yes],
+      [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+    LIB[]NAME[]_PREFIX=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl   acl_libext,
+dnl   acl_shlibext,
+dnl   acl_libname_spec,
+dnl   acl_library_names_spec,
+dnl   acl_hardcode_libdir_flag_spec,
+dnl   acl_hardcode_libdir_separator,
+dnl   acl_hardcode_direct,
+dnl   acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE([rpath],
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  define([acl_frompackage_]NAME, [$2])
+  popdef([NAME])
+  pushdef([PACK],[$2])
+  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  define([acl_libsinpackage_]PACKUP,
+    m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+  popdef([PACKUP])
+  popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+  dnl Autoconf >= 2.61 supports dots in --with options.
+  pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH(P_A_C_K[-prefix],
+[[  --with-]]P_A_C_K[[-prefix[=DIR]  search for ]PACKLIBS[ in DIR/include and DIR/lib
+  --without-]]P_A_C_K[[-prefix     don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  LIB[]NAME[]_PREFIX=
+  dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+  dnl computed. So it has to be reset here.
+  HAVE_LIB[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+            dnl The same code as in the loop below:
+            dnl First look for a shared library.
+            if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+            dnl Then look for a static library.
+            if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  dnl First look for a shared library.
+                  if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                  dnl Then look for a static library.
+                  if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$acl_hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+  popdef([P_A_C_K])
+  popdef([PACKLIBS])
+  popdef([PACKUP])
+  popdef([PACK])
+  popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+  AC_REQUIRE([AC_LIB_RPATH])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  $1=
+  if test "$enable_rpath" != no; then
+    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+      dnl Use an explicit option to hardcode directories into the resulting
+      dnl binary.
+      rpathdirs=
+      next=
+      for opt in $2; do
+        if test -n "$next"; then
+          dir="$next"
+          dnl No need to hardcode the standard /usr/lib.
+          if test "X$dir" != "X/usr/$acl_libdirstem" \
+             && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+            rpathdirs="$rpathdirs $dir"
+          fi
+          next=
+        else
+          case $opt in
+            -L) next=yes ;;
+            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+                 dnl No need to hardcode the standard /usr/lib.
+                 if test "X$dir" != "X/usr/$acl_libdirstem" \
+                    && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+                   rpathdirs="$rpathdirs $dir"
+                 fi
+                 next= ;;
+            *) next= ;;
+          esac
+        fi
+      done
+      if test "X$rpathdirs" != "X"; then
+        if test -n ""$3""; then
+          dnl libtool is used for linking. Use -R options.
+          for dir in $rpathdirs; do
+            $1="${$1}${$1:+ }-R$dir"
+          done
+        else
+          dnl The linker is used for linking directly.
+          if test -n "$acl_hardcode_libdir_separator"; then
+            dnl Weird platform: only the last -rpath option counts, the user
+            dnl must pass all path elements in one option.
+            alldirs=
+            for dir in $rpathdirs; do
+              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+            done
+            acl_save_libdir="$libdir"
+            libdir="$alldirs"
+            eval flag=\"$acl_hardcode_libdir_flag_spec\"
+            libdir="$acl_save_libdir"
+            $1="$flag"
+          else
+            dnl The -rpath options are cumulative.
+            for dir in $rpathdirs; do
+              acl_save_libdir="$libdir"
+              libdir="$dir"
+              eval flag=\"$acl_hardcode_libdir_flag_spec\"
+              libdir="$acl_save_libdir"
+              $1="${$1}${$1:+ }$flag"
+            done
+          fi
+        fi
+      fi
+    fi
+  fi
+  AC_SUBST([$1])
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644 (file)
index 0000000..31f49e4
--- /dev/null
@@ -0,0 +1,224 @@
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl   "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl   "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+  dnl There is no formal standard regarding lib and lib64.
+  dnl On glibc systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+  dnl the compiler's default mode by looking at the compiler's library search
+  dnl path. If at least one of its elements ends in /lib64 or points to a
+  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+  dnl Otherwise we use the default, namely "lib".
+  dnl On Solaris systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+      dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+      dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+      dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+      dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+      dnl symlink is missing, so we set acl_libdirstem2 too.
+      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+        [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+           ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+        ])
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS=   }"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
diff --git a/m4/limits-h.m4 b/m4/limits-h.m4
new file mode 100644 (file)
index 0000000..0b4f092
--- /dev/null
@@ -0,0 +1,43 @@
+dnl Check whether limits.h has needed features.
+
+dnl Copyright 2016-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_DEFUN_ONCE([gl_LIMITS_H],
+[
+  gl_CHECK_NEXT_HEADERS([limits.h])
+
+  AC_CACHE_CHECK([whether limits.h has LLONG_MAX, WORD_BIT, ULLONG_WIDTH etc.],
+    [gl_cv_header_limits_width],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+             #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+            #endif
+            #include <limits.h>
+            long long llm = LLONG_MAX;
+            int wb = WORD_BIT;
+            int ullw = ULLONG_WIDTH;
+          ]])],
+       [gl_cv_header_limits_width=yes],
+       [gl_cv_header_limits_width=no])])
+  if test "$gl_cv_header_limits_width" = yes; then
+    LIMITS_H=
+  else
+    LIMITS_H=limits.h
+  fi
+  AC_SUBST([LIMITS_H])
+  AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
+])
+
+dnl Unconditionally enables the replacement of <limits.h>.
+AC_DEFUN([gl_REPLACE_LIMITS_H],
+[
+  AC_REQUIRE([gl_LIMITS_H])
+  LIMITS_H='limits.h'
+  AM_CONDITIONAL([GL_GENERATE_LIMITS_H], [test -n "$LIMITS_H"])
+])
diff --git a/m4/longlong.m4 b/m4/longlong.m4
new file mode 100644 (file)
index 0000000..eefb37c
--- /dev/null
@@ -0,0 +1,113 @@
+# longlong.m4 serial 17
+dnl Copyright (C) 1999-2007, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+     [ac_cv_type_long_long_int=yes
+      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+        if test $ac_cv_type_long_long_int = yes; then
+          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+          dnl If cross compiling, assume the bug is not important, since
+          dnl nobody cross compiles for this platform as far as we know.
+          AC_RUN_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[@%:@include <limits.h>
+                 @%:@ifndef LLONG_MAX
+                 @%:@ define HALF \
+                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
+                 @%:@endif]],
+               [[long long int n = 1;
+                 int i;
+                 for (i = 0; ; i++)
+                   {
+                     long long int m = n << i;
+                     if (m >> i != n)
+                       return 1;
+                     if (LLONG_MAX / 2 < m)
+                       break;
+                   }
+                 return 0;]])],
+            [],
+            [ac_cv_type_long_long_int=no],
+            [:])
+        fi
+      fi])
+  if test $ac_cv_type_long_long_int = yes; then
+    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'long long int'.])
+  fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+  AC_CACHE_CHECK([for unsigned long long int],
+    [ac_cv_type_unsigned_long_long_int],
+    [ac_cv_type_unsigned_long_long_int=yes
+     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+       AC_LINK_IFELSE(
+         [_AC_TYPE_LONG_LONG_SNIPPET],
+         [],
+         [ac_cv_type_unsigned_long_long_int=no])
+     fi])
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'unsigned long long int'.])
+  fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+  AC_LANG_PROGRAM(
+    [[/* For now, do not test the preprocessor; as of 2007 there are too many
+         implementations with broken preprocessors.  Perhaps this can
+         be revisited in 2012.  In the meantime, code should not expect
+         #if to work with literals wider than 32 bits.  */
+      /* Test literals.  */
+      long long int ll = 9223372036854775807ll;
+      long long int nll = -9223372036854775807LL;
+      unsigned long long int ull = 18446744073709551615ULL;
+      /* Test constant expressions.   */
+      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+                     ? 1 : -1)];
+      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+                     ? 1 : -1)];
+      int i = 63;]],
+    [[/* Test availability of runtime routines for shift and division.  */
+      long long int llmax = 9223372036854775807ll;
+      unsigned long long int ullmax = 18446744073709551615ull;
+      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+              | (llmax / ll) | (llmax % ll)
+              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+              | (ullmax / ull) | (ullmax % ull));]])
+])
diff --git a/m4/malloc.m4 b/m4/malloc.m4
new file mode 100644 (file)
index 0000000..c1f8ea3
--- /dev/null
@@ -0,0 +1,104 @@
+# malloc.m4 serial 20
+dnl Copyright (C) 2007, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# This is adapted with modifications from upstream Autoconf here:
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=04be2b7a29d65d9a08e64e8e56e594c91749598c
+AC_DEFUN([_AC_FUNC_MALLOC_IF],
+[
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl for cross-compiles
+  AC_CHECK_HEADERS([stdlib.h])
+  AC_CACHE_CHECK([for GNU libc compatible malloc],
+    [ac_cv_func_malloc_0_nonnull],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#if defined STDC_HEADERS || defined HAVE_STDLIB_H
+            # include <stdlib.h>
+            #else
+            char *malloc ();
+            #endif
+          ]],
+          [[char *p = malloc (0);
+            int result = !p;
+            free (p);
+            return result;]])
+       ],
+       [ac_cv_func_malloc_0_nonnull=yes],
+       [ac_cv_func_malloc_0_nonnull=no],
+       [case "$host_os" in
+          # Guess yes on platforms where we know the result.
+          *-gnu* | gnu* | *-musl* | freebsd* | netbsd* | openbsd* \
+          | hpux* | solaris* | cygwin* | mingw*)
+            ac_cv_func_malloc_0_nonnull="guessing yes" ;;
+          # If we don't know, obey --enable-cross-guesses.
+          *) ac_cv_func_malloc_0_nonnull="$gl_cross_guess_normal" ;;
+        esac
+       ])
+    ])
+  case "$ac_cv_func_malloc_0_nonnull" in
+    *yes)
+      $1
+      ;;
+    *)
+      $2
+      ;;
+  esac
+])# _AC_FUNC_MALLOC_IF
+
+# gl_FUNC_MALLOC_GNU
+# ------------------
+# Test whether 'malloc (0)' is handled like in GNU libc, and replace malloc if
+# it is not.
+AC_DEFUN([gl_FUNC_MALLOC_GNU],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  dnl _AC_FUNC_MALLOC_IF is defined in Autoconf.
+  _AC_FUNC_MALLOC_IF(
+    [AC_DEFINE([HAVE_MALLOC_GNU], [1],
+               [Define to 1 if your system has a GNU libc compatible 'malloc'
+                function, and to 0 otherwise.])],
+    [AC_DEFINE([HAVE_MALLOC_GNU], [0])
+     REPLACE_MALLOC=1
+    ])
+])
+
+# gl_FUNC_MALLOC_POSIX
+# --------------------
+# Test whether 'malloc' is POSIX compliant (sets errno to ENOMEM when it
+# fails), and replace malloc if it is not.
+AC_DEFUN([gl_FUNC_MALLOC_POSIX],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  AC_REQUIRE([gl_CHECK_MALLOC_POSIX])
+  if test $gl_cv_func_malloc_posix = yes; then
+    AC_DEFINE([HAVE_MALLOC_POSIX], [1],
+      [Define if the 'malloc' function is POSIX compliant.])
+  else
+    REPLACE_MALLOC=1
+  fi
+])
+
+# Test whether malloc, realloc, calloc are POSIX compliant,
+# Set gl_cv_func_malloc_posix to yes or no accordingly.
+AC_DEFUN([gl_CHECK_MALLOC_POSIX],
+[
+  AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant],
+    [gl_cv_func_malloc_posix],
+    [
+      dnl It is too dangerous to try to allocate a large amount of memory:
+      dnl some systems go to their knees when you do that. So assume that
+      dnl all Unix implementations of the function are POSIX compliant.
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[]],
+           [[#if defined _WIN32 && ! defined __CYGWIN__
+             choke me
+             #endif
+            ]])],
+        [gl_cv_func_malloc_posix=yes],
+        [gl_cv_func_malloc_posix=no])
+    ])
+])
diff --git a/m4/msvc-inval.m4 b/m4/msvc-inval.m4
new file mode 100644 (file)
index 0000000..dcf398d
--- /dev/null
@@ -0,0 +1,19 @@
+# msvc-inval.m4 serial 1
+dnl Copyright (C) 2011-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MSVC_INVAL],
+[
+  AC_CHECK_FUNCS_ONCE([_set_invalid_parameter_handler])
+  if test $ac_cv_func__set_invalid_parameter_handler = yes; then
+    HAVE_MSVC_INVALID_PARAMETER_HANDLER=1
+    AC_DEFINE([HAVE_MSVC_INVALID_PARAMETER_HANDLER], [1],
+      [Define to 1 on MSVC platforms that have the "invalid parameter handler"
+       concept.])
+  else
+    HAVE_MSVC_INVALID_PARAMETER_HANDLER=0
+  fi
+  AC_SUBST([HAVE_MSVC_INVALID_PARAMETER_HANDLER])
+])
diff --git a/m4/msvc-nothrow.m4 b/m4/msvc-nothrow.m4
new file mode 100644 (file)
index 0000000..13198d8
--- /dev/null
@@ -0,0 +1,10 @@
+# msvc-nothrow.m4 serial 1
+dnl Copyright (C) 2011-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_MSVC_NOTHROW],
+[
+  AC_REQUIRE([gl_MSVC_INVAL])
+])
diff --git a/m4/multiarch.m4 b/m4/multiarch.m4
new file mode 100644 (file)
index 0000000..3c2034c
--- /dev/null
@@ -0,0 +1,62 @@
+# multiarch.m4 serial 7
+dnl Copyright (C) 2008-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Determine whether the compiler is or may be producing universal binaries.
+#
+# On Mac OS X 10.5 and later systems, the user can create libraries and
+# executables that work on multiple system types--known as "fat" or
+# "universal" binaries--by specifying multiple '-arch' options to the
+# compiler but only a single '-arch' option to the preprocessor.  Like
+# this:
+#
+#     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+#                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+#                 CPP="gcc -E" CXXCPP="g++ -E"
+#
+# Detect this situation and set APPLE_UNIVERSAL_BUILD accordingly.
+
+AC_DEFUN_ONCE([gl_MULTIARCH],
+[
+  dnl Code similar to autoconf-2.63 AC_C_BIGENDIAN.
+  gl_cv_c_multiarch=no
+  AC_COMPILE_IFELSE(
+    [AC_LANG_SOURCE(
+      [[#ifndef __APPLE_CC__
+         not a universal capable compiler
+        #endif
+        typedef int dummy;
+      ]])],
+    [
+     dnl Check for potential -arch flags.  It is not universal unless
+     dnl there are at least two -arch flags with different values.
+     arch=
+     prev=
+     for word in ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}; do
+       if test -n "$prev"; then
+         case $word in
+           i?86 | x86_64 | ppc | ppc64)
+             if test -z "$arch" || test "$arch" = "$word"; then
+               arch="$word"
+             else
+               gl_cv_c_multiarch=yes
+             fi
+             ;;
+         esac
+         prev=
+       else
+         if test "x$word" = "x-arch"; then
+           prev=arch
+         fi
+       fi
+     done
+    ])
+  if test $gl_cv_c_multiarch = yes; then
+    APPLE_UNIVERSAL_BUILD=1
+  else
+    APPLE_UNIVERSAL_BUILD=0
+  fi
+  AC_SUBST([APPLE_UNIVERSAL_BUILD])
+])
diff --git a/m4/nls.m4 b/m4/nls.m4
new file mode 100644 (file)
index 0000000..53cdc8b
--- /dev/null
+++ b/m4/nls.m4
@@ -0,0 +1,32 @@
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE([nls],
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT([$USE_NLS])
+  AC_SUBST([USE_NLS])
+])
diff --git a/m4/off_t.m4 b/m4/off_t.m4
new file mode 100644 (file)
index 0000000..6e19af8
--- /dev/null
@@ -0,0 +1,18 @@
+# off_t.m4 serial 1
+dnl Copyright (C) 2012-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Check whether to override the 'off_t' type.
+dnl Set WINDOWS_64_BIT_OFF_T.
+
+AC_DEFUN([gl_TYPE_OFF_T],
+[
+  m4_ifdef([gl_LARGEFILE], [
+    AC_REQUIRE([gl_LARGEFILE])
+  ], [
+    WINDOWS_64_BIT_OFF_T=0
+  ])
+  AC_SUBST([WINDOWS_64_BIT_OFF_T])
+])
diff --git a/m4/po.m4 b/m4/po.m4
new file mode 100644 (file)
index 0000000..43012dc
--- /dev/null
+++ b/m4/po.m4
@@ -0,0 +1,453 @@
+# po.m4 serial 24 (gettext-0.19)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+  AC_REQUIRE([AC_PROG_SED])dnl
+  AC_REQUIRE([AM_NLS])dnl
+
+  dnl Release version of the gettext macros. This is used to ensure that
+  dnl the gettext macros and po/Makefile.in.in are in sync.
+  AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
+
+  dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+  case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([MSGFMT_015])
+changequote(,)dnl
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([GMSGFMT_015])
+
+  dnl Search for GNU xgettext 0.12 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+  case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([XGETTEXT_015])
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+  dnl Installation directories.
+  dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
+  dnl have to define it here, so that it can be used in po/Makefile.
+  test -n "$localedir" || localedir='${datadir}/locale'
+  AC_SUBST([localedir])
+
+  dnl Support for AM_XGETTEXT_OPTION.
+  test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+  AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+  AC_CONFIG_COMMANDS([po-directories], [[
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        # Treat a directory as a PO directory if and only if it has a
+        # POTFILES.in file. This allows packages to have multiple PO
+        # directories under different names or in different locations.
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done]],
+   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake < 1.5.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+  # When this code is run, in config.status, two variables have already been
+  # set:
+  # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+  # - LINGUAS is the value of the environment variable LINGUAS at configure
+  #   time.
+
+changequote(,)dnl
+  # Adjust a relative srcdir.
+  ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+  ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+  ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+  # In autoconf-2.13 it is called $ac_given_srcdir.
+  # In autoconf-2.50 it is called $srcdir.
+  test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+  case "$ac_given_srcdir" in
+    .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+    /*) top_srcdir="$ac_given_srcdir" ;;
+    *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  # Find a way to echo strings without interpreting backslash.
+  if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+    gt_echo='echo'
+  else
+    if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+      gt_echo='printf %s\n'
+    else
+      echo_func () {
+        cat <<EOT
+$*
+EOT
+      }
+      gt_echo='echo_func'
+    fi
+  fi
+
+  # A sed script that extracts the value of VARIABLE from a Makefile.
+  tab=`printf '\t'`
+  sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
+  # Seen the first line of the variable definition.
+  s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
+  ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+  # Set POTFILES to the value of the Makefile variable POTFILES.
+  sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+  POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+  # Compute POTFILES_DEPS as
+  #   $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+  POTFILES_DEPS=
+  for file in $POTFILES; do
+    POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+  done
+  POMAKEFILEDEPS=""
+
+  if test -n "$OBSOLETE_ALL_LINGUAS"; then
+    test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+  fi
+  if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+    # The LINGUAS file contains the set of available languages.
+    ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+    POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+  else
+    # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+    sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+    ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+  fi
+  # Hide the ALL_LINGUAS assignment from automake < 1.5.
+  eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+  # Compute POFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+  # Compute UPDATEPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+  # Compute DUMMYPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+  # Compute GMOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+  # Compute PROPERTIESFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+  # Compute CLASSFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+  # Compute QMFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+  # Compute MSGFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+  # Compute RESOURCESDLLFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+  case "$ac_given_srcdir" in
+    .) srcdirpre= ;;
+    *) srcdirpre='$(srcdir)/' ;;
+  esac
+  POFILES=
+  UPDATEPOFILES=
+  DUMMYPOFILES=
+  GMOFILES=
+  PROPERTIESFILES=
+  CLASSFILES=
+  QMFILES=
+  MSGFILES=
+  RESOURCESDLLFILES=
+  for lang in $ALL_LINGUAS; do
+    POFILES="$POFILES $srcdirpre$lang.po"
+    UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+    DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+    PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+    CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+    QMFILES="$QMFILES $srcdirpre$lang.qm"
+    frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+    MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+    frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+    RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+  done
+  # CATALOGS depends on both $ac_dir and the user's LINGUAS
+  # environment variable.
+  INST_LINGUAS=
+  if test -n "$ALL_LINGUAS"; then
+    for presentlang in $ALL_LINGUAS; do
+      useit=no
+      if test "%UNSET%" != "$LINGUAS"; then
+        desiredlanguages="$LINGUAS"
+      else
+        desiredlanguages="$ALL_LINGUAS"
+      fi
+      for desiredlang in $desiredlanguages; do
+        # Use the presentlang catalog if desiredlang is
+        #   a. equal to presentlang, or
+        #   b. a variant of presentlang (because in this case,
+        #      presentlang can be used as a fallback for messages
+        #      which are not translated in the desiredlang catalog).
+        case "$desiredlang" in
+          "$presentlang"*) useit=yes;;
+        esac
+      done
+      if test $useit = yes; then
+        INST_LINGUAS="$INST_LINGUAS $presentlang"
+      fi
+    done
+  fi
+  CATALOGS=
+  JAVACATALOGS=
+  QTCATALOGS=
+  TCLCATALOGS=
+  CSHARPCATALOGS=
+  if test -n "$INST_LINGUAS"; then
+    for lang in $INST_LINGUAS; do
+      CATALOGS="$CATALOGS $lang.gmo"
+      JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+      QTCATALOGS="$QTCATALOGS $lang.qm"
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+      CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+    done
+  fi
+
+  sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+  tab=`printf '\t'`
+  if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if test -n "$POMAKEFILEDEPS"; then
+    cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+  fi
+  mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+  XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+  AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
new file mode 100644 (file)
index 0000000..b499f79
--- /dev/null
@@ -0,0 +1,91 @@
+# progtest.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1996-2003, 2005, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+AC_PREREQ([2.50])
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL([ac_cv_path_$1],
+[case "[$]$1" in
+  [[\\/]]* | ?:[[\\/]]*)
+    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in ifelse([$5], , $PATH, [$5]); do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+          if [$3]; then
+            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+    ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$][$1])
+else
+  AC_MSG_RESULT([no])
+fi
+AC_SUBST([$1])dnl
+])
diff --git a/m4/ssize_t.m4 b/m4/ssize_t.m4
new file mode 100644 (file)
index 0000000..6c0a588
--- /dev/null
@@ -0,0 +1,23 @@
+# ssize_t.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2001-2003, 2006, 2010-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether ssize_t is defined.
+
+AC_DEFUN([gt_TYPE_SSIZE_T],
+[
+  AC_CACHE_CHECK([for ssize_t], [gt_cv_ssize_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>]],
+          [[int x = sizeof (ssize_t *) + sizeof (ssize_t);
+            return !x;]])],
+       [gt_cv_ssize_t=yes], [gt_cv_ssize_t=no])])
+  if test $gt_cv_ssize_t = no; then
+    AC_DEFINE([ssize_t], [int],
+              [Define as a signed type of the same size as size_t.])
+  fi
+])
diff --git a/m4/stdbool.m4 b/m4/stdbool.m4
new file mode 100644 (file)
index 0000000..6bb087e
--- /dev/null
@@ -0,0 +1,122 @@
+# Check for stdbool.h that conforms to C99.
+
+dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+#serial 8
+
+# Prepare for substituting <stdbool.h> if it is not supported.
+
+AC_DEFUN([AM_STDBOOL_H],
+[
+  AC_REQUIRE([AC_CHECK_HEADER_STDBOOL])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  dnl On some platforms, <stdbool.h> does not exist or does not conform to C99.
+  dnl On Solaris 10 with CC=cc CXX=CC, <stdbool.h> exists but is not usable
+  dnl in C++ mode (and no <cstdbool> exists). In this case, we use our
+  dnl replacement, also in C mode (for binary compatibility between C and C++).
+  if test "$ac_cv_header_stdbool_h" = yes; then
+    case "$host_os" in
+      solaris*)
+        if test -z "$GCC"; then
+          STDBOOL_H='stdbool.h'
+        else
+          STDBOOL_H=''
+        fi
+        ;;
+      *)
+        STDBOOL_H=''
+        ;;
+    esac
+  else
+    STDBOOL_H='stdbool.h'
+  fi
+  AC_SUBST([STDBOOL_H])
+  AM_CONDITIONAL([GL_GENERATE_STDBOOL_H], [test -n "$STDBOOL_H"])
+
+  if test "$ac_cv_type__Bool" = yes; then
+    HAVE__BOOL=1
+  else
+    HAVE__BOOL=0
+  fi
+  AC_SUBST([HAVE__BOOL])
+])
+
+# AM_STDBOOL_H will be renamed to gl_STDBOOL_H in the future.
+AC_DEFUN([gl_STDBOOL_H], [AM_STDBOOL_H])
+
+# This version of the macro is needed in autoconf <= 2.68.
+
+AC_DEFUN([AC_CHECK_HEADER_STDBOOL],
+  [AC_CACHE_CHECK([for stdbool.h that conforms to C99],
+     [ac_cv_header_stdbool_h],
+     [AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+             #include <stdbool.h>
+
+             #ifdef __cplusplus
+              typedef bool Bool;
+             #else
+              typedef _Bool Bool;
+              #ifndef bool
+               "error: bool is not defined"
+              #endif
+              #ifndef false
+               "error: false is not defined"
+              #endif
+              #if false
+               "error: false is not 0"
+              #endif
+              #ifndef true
+               "error: true is not defined"
+              #endif
+              #if true != 1
+               "error: true is not 1"
+              #endif
+             #endif
+
+             #ifndef __bool_true_false_are_defined
+              "error: __bool_true_false_are_defined is not defined"
+             #endif
+
+             struct s { Bool s: 1; Bool t; bool u: 1; bool v; } s;
+
+             char a[true == 1 ? 1 : -1];
+             char b[false == 0 ? 1 : -1];
+             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+             char d[(bool) 0.5 == true ? 1 : -1];
+             /* See body of main program for 'e'.  */
+             char f[(Bool) 0.0 == false ? 1 : -1];
+             char g[true];
+             char h[sizeof (Bool)];
+             char i[sizeof s.t];
+             enum { j = false, k = true, l = false * true, m = true * 256 };
+             /* The following fails for
+                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+             Bool n[m];
+             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+             char p[-1 - (Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+             /* Catch a bug in an HP-UX C compiler.  See
+                https://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+                https://lists.gnu.org/r/bug-coreutils/2005-11/msg00161.html
+              */
+             Bool q = true;
+             Bool *pq = &q;
+             bool *qq = &q;
+           ]],
+           [[
+             bool e = &s;
+             *pq |= q; *pq |= ! q;
+             *qq |= q; *qq |= ! q;
+             /* Refer to every declared value, to avoid compiler optimizations.  */
+             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+                     + !m + !n + !o + !p + !q + !pq + !qq);
+           ]])],
+        [ac_cv_header_stdbool_h=yes],
+        [ac_cv_header_stdbool_h=no])])
+   AC_CHECK_TYPES([_Bool])
+])
diff --git a/m4/stddef_h.m4 b/m4/stddef_h.m4
new file mode 100644 (file)
index 0000000..6bcfadb
--- /dev/null
@@ -0,0 +1,72 @@
+dnl A placeholder for <stddef.h>, for platforms that have issues.
+# stddef_h.m4 serial 6
+dnl Copyright (C) 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDDEF_H],
+[
+  AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+  AC_REQUIRE([gt_TYPE_WCHAR_T])
+  STDDEF_H=
+
+  dnl Test whether the type max_align_t exists and whether its alignment
+  dnl "is as great as is supported by the implementation in all contexts".
+  AC_CACHE_CHECK([for good max_align_t],
+    [gl_cv_type_max_align_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stddef.h>
+            unsigned int s = sizeof (max_align_t);
+            #if defined __GNUC__ || defined __IBM__ALIGNOF__
+            int check1[2 * (__alignof__ (double) <= __alignof__ (max_align_t)) - 1];
+            int check2[2 * (__alignof__ (long double) <= __alignof__ (max_align_t)) - 1];
+            #endif
+          ]])],
+       [gl_cv_type_max_align_t=yes],
+       [gl_cv_type_max_align_t=no])
+    ])
+  if test $gl_cv_type_max_align_t = no; then
+    HAVE_MAX_ALIGN_T=0
+    STDDEF_H=stddef.h
+  fi
+
+  if test $gt_cv_c_wchar_t = no; then
+    HAVE_WCHAR_T=0
+    STDDEF_H=stddef.h
+  fi
+
+  AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
+    [gl_cv_decl_null_works],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
+      int test[2 * (sizeof NULL == sizeof (void *)) -1];
+]])],
+      [gl_cv_decl_null_works=yes],
+      [gl_cv_decl_null_works=no])])
+  if test $gl_cv_decl_null_works = no; then
+    REPLACE_NULL=1
+    STDDEF_H=stddef.h
+  fi
+
+  AC_SUBST([STDDEF_H])
+  AM_CONDITIONAL([GL_GENERATE_STDDEF_H], [test -n "$STDDEF_H"])
+  if test -n "$STDDEF_H"; then
+    gl_NEXT_HEADERS([stddef.h])
+  fi
+])
+
+AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+])
+
+AC_DEFUN([gl_STDDEF_H_DEFAULTS],
+[
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  REPLACE_NULL=0;                AC_SUBST([REPLACE_NULL])
+  HAVE_MAX_ALIGN_T=1;            AC_SUBST([HAVE_MAX_ALIGN_T])
+  HAVE_WCHAR_T=1;                AC_SUBST([HAVE_WCHAR_T])
+])
diff --git a/m4/stdint.m4 b/m4/stdint.m4
new file mode 100644 (file)
index 0000000..29ad826
--- /dev/null
@@ -0,0 +1,535 @@
+# stdint.m4 serial 54
+dnl Copyright (C) 2001-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert and Bruno Haible.
+dnl Test whether <stdint.h> is supported or must be substituted.
+
+AC_PREREQ([2.61])
+
+AC_DEFUN_ONCE([gl_STDINT_H],
+[
+  AC_PREREQ([2.59])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  AC_REQUIRE([gl_LIMITS_H])
+  AC_REQUIRE([gt_TYPE_WINT_T])
+
+  dnl For backward compatibility. Some packages may still be testing these
+  dnl macros.
+  AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+    [Define to 1 if the system has the type 'long long int'.])
+  AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+    [Define to 1 if the system has the type 'unsigned long long int'.])
+
+  dnl Check for <wchar.h>, in the same way as gl_WCHAR_H does.
+  AC_CHECK_HEADERS_ONCE([wchar.h])
+  if test $ac_cv_header_wchar_h = yes; then
+    HAVE_WCHAR_H=1
+  else
+    HAVE_WCHAR_H=0
+  fi
+  AC_SUBST([HAVE_WCHAR_H])
+
+  dnl Check for <inttypes.h>.
+  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_inttypes_h.
+  if test $ac_cv_header_inttypes_h = yes; then
+    HAVE_INTTYPES_H=1
+  else
+    HAVE_INTTYPES_H=0
+  fi
+  AC_SUBST([HAVE_INTTYPES_H])
+
+  dnl Check for <sys/types.h>.
+  dnl AC_INCLUDES_DEFAULT defines $ac_cv_header_sys_types_h.
+  if test $ac_cv_header_sys_types_h = yes; then
+    HAVE_SYS_TYPES_H=1
+  else
+    HAVE_SYS_TYPES_H=0
+  fi
+  AC_SUBST([HAVE_SYS_TYPES_H])
+
+  gl_CHECK_NEXT_HEADERS([stdint.h])
+  if test $ac_cv_header_stdint_h = yes; then
+    HAVE_STDINT_H=1
+  else
+    HAVE_STDINT_H=0
+  fi
+  AC_SUBST([HAVE_STDINT_H])
+
+  dnl Now see whether we need a substitute <stdint.h>.
+  if test $ac_cv_header_stdint_h = yes; then
+    AC_CACHE_CHECK([whether stdint.h conforms to C99],
+      [gl_cv_header_working_stdint_h],
+      [gl_cv_header_working_stdint_h=no
+       AC_COMPILE_IFELSE([
+         AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+/* Dragonfly defines WCHAR_MIN, WCHAR_MAX only in <wchar.h>.  */
+#if !(defined WCHAR_MIN && defined WCHAR_MAX)
+#error "WCHAR_MIN, WCHAR_MAX not defined in <stdint.h>"
+#endif
+]
+gl_STDINT_INCLUDES
+[
+#ifdef INT8_MAX
+int8_t a1 = INT8_MAX;
+int8_t a1min = INT8_MIN;
+#endif
+#ifdef INT16_MAX
+int16_t a2 = INT16_MAX;
+int16_t a2min = INT16_MIN;
+#endif
+#ifdef INT32_MAX
+int32_t a3 = INT32_MAX;
+int32_t a3min = INT32_MIN;
+#endif
+#ifdef INT64_MAX
+int64_t a4 = INT64_MAX;
+int64_t a4min = INT64_MIN;
+#endif
+#ifdef UINT8_MAX
+uint8_t b1 = UINT8_MAX;
+#else
+typedef int b1[(unsigned char) -1 != 255 ? 1 : -1];
+#endif
+#ifdef UINT16_MAX
+uint16_t b2 = UINT16_MAX;
+#endif
+#ifdef UINT32_MAX
+uint32_t b3 = UINT32_MAX;
+#endif
+#ifdef UINT64_MAX
+uint64_t b4 = UINT64_MAX;
+#endif
+int_least8_t c1 = INT8_C (0x7f);
+int_least8_t c1max = INT_LEAST8_MAX;
+int_least8_t c1min = INT_LEAST8_MIN;
+int_least16_t c2 = INT16_C (0x7fff);
+int_least16_t c2max = INT_LEAST16_MAX;
+int_least16_t c2min = INT_LEAST16_MIN;
+int_least32_t c3 = INT32_C (0x7fffffff);
+int_least32_t c3max = INT_LEAST32_MAX;
+int_least32_t c3min = INT_LEAST32_MIN;
+int_least64_t c4 = INT64_C (0x7fffffffffffffff);
+int_least64_t c4max = INT_LEAST64_MAX;
+int_least64_t c4min = INT_LEAST64_MIN;
+uint_least8_t d1 = UINT8_C (0xff);
+uint_least8_t d1max = UINT_LEAST8_MAX;
+uint_least16_t d2 = UINT16_C (0xffff);
+uint_least16_t d2max = UINT_LEAST16_MAX;
+uint_least32_t d3 = UINT32_C (0xffffffff);
+uint_least32_t d3max = UINT_LEAST32_MAX;
+uint_least64_t d4 = UINT64_C (0xffffffffffffffff);
+uint_least64_t d4max = UINT_LEAST64_MAX;
+int_fast8_t e1 = INT_FAST8_MAX;
+int_fast8_t e1min = INT_FAST8_MIN;
+int_fast16_t e2 = INT_FAST16_MAX;
+int_fast16_t e2min = INT_FAST16_MIN;
+int_fast32_t e3 = INT_FAST32_MAX;
+int_fast32_t e3min = INT_FAST32_MIN;
+int_fast64_t e4 = INT_FAST64_MAX;
+int_fast64_t e4min = INT_FAST64_MIN;
+uint_fast8_t f1 = UINT_FAST8_MAX;
+uint_fast16_t f2 = UINT_FAST16_MAX;
+uint_fast32_t f3 = UINT_FAST32_MAX;
+uint_fast64_t f4 = UINT_FAST64_MAX;
+#ifdef INTPTR_MAX
+intptr_t g = INTPTR_MAX;
+intptr_t gmin = INTPTR_MIN;
+#endif
+#ifdef UINTPTR_MAX
+uintptr_t h = UINTPTR_MAX;
+#endif
+intmax_t i = INTMAX_MAX;
+uintmax_t j = UINTMAX_MAX;
+
+/* Check that SIZE_MAX has the correct type, if possible.  */
+#if 201112 <= __STDC_VERSION__
+int k = _Generic (SIZE_MAX, size_t: 0);
+#elif (2 <= __GNUC__ || defined __IBM__TYPEOF__ \
+       || (0x5110 <= __SUNPRO_C && !__STDC__))
+extern size_t k;
+extern __typeof__ (SIZE_MAX) k;
+#endif
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ TYPE_MAXIMUM (t)))
+#define TYPE_MAXIMUM(t) \
+  ((t) ((t) 0 < (t) -1 \
+        ? (t) -1 \
+        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
+struct s {
+  int check_PTRDIFF:
+      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+      ? 1 : -1;
+  /* Detect bug in FreeBSD 6.0 / ia64.  */
+  int check_SIG_ATOMIC:
+      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+      ? 1 : -1;
+  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+  int check_WCHAR:
+      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+      ? 1 : -1;
+  /* Detect bug in mingw.  */
+  int check_WINT:
+      WINT_MIN == TYPE_MINIMUM (wint_t)
+      && WINT_MAX == TYPE_MAXIMUM (wint_t)
+      ? 1 : -1;
+
+  /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
+  int check_UINT8_C:
+        (-1 < UINT8_C (0)) == (-1 < (uint_least8_t) 0) ? 1 : -1;
+  int check_UINT16_C:
+        (-1 < UINT16_C (0)) == (-1 < (uint_least16_t) 0) ? 1 : -1;
+
+  /* Detect bugs in OpenBSD 3.9 stdint.h.  */
+#ifdef UINT8_MAX
+  int check_uint8: (uint8_t) -1 == UINT8_MAX ? 1 : -1;
+#endif
+#ifdef UINT16_MAX
+  int check_uint16: (uint16_t) -1 == UINT16_MAX ? 1 : -1;
+#endif
+#ifdef UINT32_MAX
+  int check_uint32: (uint32_t) -1 == UINT32_MAX ? 1 : -1;
+#endif
+#ifdef UINT64_MAX
+  int check_uint64: (uint64_t) -1 == UINT64_MAX ? 1 : -1;
+#endif
+  int check_uint_least8: (uint_least8_t) -1 == UINT_LEAST8_MAX ? 1 : -1;
+  int check_uint_least16: (uint_least16_t) -1 == UINT_LEAST16_MAX ? 1 : -1;
+  int check_uint_least32: (uint_least32_t) -1 == UINT_LEAST32_MAX ? 1 : -1;
+  int check_uint_least64: (uint_least64_t) -1 == UINT_LEAST64_MAX ? 1 : -1;
+  int check_uint_fast8: (uint_fast8_t) -1 == UINT_FAST8_MAX ? 1 : -1;
+  int check_uint_fast16: (uint_fast16_t) -1 == UINT_FAST16_MAX ? 1 : -1;
+  int check_uint_fast32: (uint_fast32_t) -1 == UINT_FAST32_MAX ? 1 : -1;
+  int check_uint_fast64: (uint_fast64_t) -1 == UINT_FAST64_MAX ? 1 : -1;
+  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
+  int check_uintmax: (uintmax_t) -1 == UINTMAX_MAX ? 1 : -1;
+  int check_size: (size_t) -1 == SIZE_MAX ? 1 : -1;
+};
+         ]])],
+         [dnl Determine whether the various *_MIN, *_MAX macros are usable
+          dnl in preprocessor expression. We could do it by compiling a test
+          dnl program for each of these macros. It is faster to run a program
+          dnl that inspects the macro expansion.
+          dnl This detects a bug on HP-UX 11.23/ia64.
+          AC_RUN_IFELSE([
+            AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#define __STDC_CONSTANT_MACROS 1
+#define __STDC_LIMIT_MACROS 1
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+#include <stdio.h>
+#include <string.h>
+#define MVAL(macro) MVAL1(macro)
+#define MVAL1(expression) #expression
+static const char *macro_values[] =
+  {
+#ifdef INT8_MAX
+    MVAL (INT8_MAX),
+#endif
+#ifdef INT16_MAX
+    MVAL (INT16_MAX),
+#endif
+#ifdef INT32_MAX
+    MVAL (INT32_MAX),
+#endif
+#ifdef INT64_MAX
+    MVAL (INT64_MAX),
+#endif
+#ifdef UINT8_MAX
+    MVAL (UINT8_MAX),
+#endif
+#ifdef UINT16_MAX
+    MVAL (UINT16_MAX),
+#endif
+#ifdef UINT32_MAX
+    MVAL (UINT32_MAX),
+#endif
+#ifdef UINT64_MAX
+    MVAL (UINT64_MAX),
+#endif
+    NULL
+  };
+]], [[
+  const char **mv;
+  for (mv = macro_values; *mv != NULL; mv++)
+    {
+      const char *value = *mv;
+      /* Test whether it looks like a cast expression.  */
+      if (strncmp (value, "((unsigned int)"/*)*/, 15) == 0
+          || strncmp (value, "((unsigned short)"/*)*/, 17) == 0
+          || strncmp (value, "((unsigned char)"/*)*/, 16) == 0
+          || strncmp (value, "((int)"/*)*/, 6) == 0
+          || strncmp (value, "((signed short)"/*)*/, 15) == 0
+          || strncmp (value, "((signed char)"/*)*/, 14) == 0)
+        return mv - macro_values + 1;
+    }
+  return 0;
+]])],
+              [gl_cv_header_working_stdint_h=yes],
+              [],
+              [case "$host_os" in
+                         # Guess yes on native Windows.
+                 mingw*) gl_cv_header_working_stdint_h="guessing yes" ;;
+                         # In general, assume it works.
+                 *)      gl_cv_header_working_stdint_h="guessing yes" ;;
+               esac
+              ])
+         ])
+      ])
+  fi
+
+  HAVE_C99_STDINT_H=0
+  HAVE_SYS_BITYPES_H=0
+  HAVE_SYS_INTTYPES_H=0
+  STDINT_H=stdint.h
+  case "$gl_cv_header_working_stdint_h" in
+    *yes)
+      HAVE_C99_STDINT_H=1
+      dnl Now see whether the system <stdint.h> works without
+      dnl __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS defined.
+      AC_CACHE_CHECK([whether stdint.h predates C++11],
+        [gl_cv_header_stdint_predates_cxx11_h],
+        [gl_cv_header_stdint_predates_cxx11_h=yes
+         AC_COMPILE_IFELSE([
+           AC_LANG_PROGRAM([[
+#define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1 /* work if build isn't clean */
+#include <stdint.h>
+]
+gl_STDINT_INCLUDES
+[
+intmax_t im = INTMAX_MAX;
+int32_t i32 = INT32_C (0x7fffffff);
+           ]])],
+           [gl_cv_header_stdint_predates_cxx11_h=no])])
+
+      if test "$gl_cv_header_stdint_predates_cxx11_h" = yes; then
+        AC_DEFINE([__STDC_CONSTANT_MACROS], [1],
+                  [Define to 1 if the system <stdint.h> predates C++11.])
+        AC_DEFINE([__STDC_LIMIT_MACROS], [1],
+                  [Define to 1 if the system <stdint.h> predates C++11.])
+      fi
+      AC_CACHE_CHECK([whether stdint.h has UINTMAX_WIDTH etc.],
+        [gl_cv_header_stdint_width],
+        [gl_cv_header_stdint_width=no
+         AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM([[
+              /* Work if build is not clean.  */
+              #define _GL_JUST_INCLUDE_SYSTEM_STDINT_H 1
+              #ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+               #define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+              #endif
+              #include <stdint.h>
+              ]gl_STDINT_INCLUDES[
+              int iw = UINTMAX_WIDTH;
+              ]])],
+           [gl_cv_header_stdint_width=yes])])
+      if test "$gl_cv_header_stdint_width" = yes; then
+        STDINT_H=
+      fi
+      ;;
+    *)
+      dnl Check for <sys/inttypes.h>, and for
+      dnl <sys/bitypes.h> (used in Linux libc4 >= 4.6.7 and libc5).
+      AC_CHECK_HEADERS([sys/inttypes.h sys/bitypes.h])
+      if test $ac_cv_header_sys_inttypes_h = yes; then
+        HAVE_SYS_INTTYPES_H=1
+      fi
+      if test $ac_cv_header_sys_bitypes_h = yes; then
+        HAVE_SYS_BITYPES_H=1
+      fi
+      gl_STDINT_TYPE_PROPERTIES
+      ;;
+  esac
+
+  dnl The substitute stdint.h needs the substitute limit.h's _GL_INTEGER_WIDTH.
+  gl_REPLACE_LIMITS_H
+
+  AC_SUBST([HAVE_C99_STDINT_H])
+  AC_SUBST([HAVE_SYS_BITYPES_H])
+  AC_SUBST([HAVE_SYS_INTTYPES_H])
+  AC_SUBST([STDINT_H])
+  AM_CONDITIONAL([GL_GENERATE_STDINT_H], [test -n "$STDINT_H"])
+])
+
+dnl gl_STDINT_BITSIZEOF(TYPES, INCLUDES)
+dnl Determine the size of each of the given types in bits.
+AC_DEFUN([gl_STDINT_BITSIZEOF],
+[
+  dnl Use a shell loop, to avoid bloating configure, and
+  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+  dnl   config.h.in,
+  dnl - extra AC_SUBST calls, so that the right substitutions are made.
+  m4_foreach_w([gltype], [$1],
+    [AH_TEMPLATE([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+       [Define to the number of bits in type ']gltype['.])])
+  for gltype in $1 ; do
+    AC_CACHE_CHECK([for bit size of $gltype], [gl_cv_bitsizeof_${gltype}],
+      [AC_COMPUTE_INT([result], [sizeof ($gltype) * CHAR_BIT],
+         [$2
+#include <limits.h>], [result=unknown])
+       eval gl_cv_bitsizeof_${gltype}=\$result
+      ])
+    eval result=\$gl_cv_bitsizeof_${gltype}
+    if test $result = unknown; then
+      dnl Use a nonempty default, because some compilers, such as IRIX 5 cc,
+      dnl do a syntax check even on unused #if conditions and give an error
+      dnl on valid C code like this:
+      dnl   #if 0
+      dnl   # if  > 32
+      dnl   # endif
+      dnl   #endif
+      result=0
+    fi
+    GLTYPE=`echo "$gltype" | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    AC_DEFINE_UNQUOTED([BITSIZEOF_${GLTYPE}], [$result])
+    eval BITSIZEOF_${GLTYPE}=\$result
+  done
+  m4_foreach_w([gltype], [$1],
+    [AC_SUBST([BITSIZEOF_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_CHECK_TYPES_SIGNED(TYPES, INCLUDES)
+dnl Determine the signedness of each of the given types.
+dnl Define HAVE_SIGNED_TYPE if type is signed.
+AC_DEFUN([gl_CHECK_TYPES_SIGNED],
+[
+  dnl Use a shell loop, to avoid bloating configure, and
+  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+  dnl   config.h.in,
+  dnl - extra AC_SUBST calls, so that the right substitutions are made.
+  m4_foreach_w([gltype], [$1],
+    [AH_TEMPLATE([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]),
+       [Define to 1 if ']gltype[' is a signed integer type.])])
+  for gltype in $1 ; do
+    AC_CACHE_CHECK([whether $gltype is signed], [gl_cv_type_${gltype}_signed],
+      [AC_COMPILE_IFELSE(
+         [AC_LANG_PROGRAM([$2[
+            int verify[2 * (($gltype) -1 < ($gltype) 0) - 1];]])],
+         result=yes, result=no)
+       eval gl_cv_type_${gltype}_signed=\$result
+      ])
+    eval result=\$gl_cv_type_${gltype}_signed
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    if test "$result" = yes; then
+      AC_DEFINE_UNQUOTED([HAVE_SIGNED_${GLTYPE}], [1])
+      eval HAVE_SIGNED_${GLTYPE}=1
+    else
+      eval HAVE_SIGNED_${GLTYPE}=0
+    fi
+  done
+  m4_foreach_w([gltype], [$1],
+    [AC_SUBST([HAVE_SIGNED_]m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_]))])
+])
+
+dnl gl_INTEGER_TYPE_SUFFIX(TYPES, INCLUDES)
+dnl Determine the suffix to use for integer constants of the given types.
+dnl Define t_SUFFIX for each such type.
+AC_DEFUN([gl_INTEGER_TYPE_SUFFIX],
+[
+  dnl Use a shell loop, to avoid bloating configure, and
+  dnl - extra AH_TEMPLATE calls, so that autoheader knows what to put into
+  dnl   config.h.in,
+  dnl - extra AC_SUBST calls, so that the right substitutions are made.
+  m4_foreach_w([gltype], [$1],
+    [AH_TEMPLATE(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX],
+       [Define to l, ll, u, ul, ull, etc., as suitable for
+        constants of type ']gltype['.])])
+  for gltype in $1 ; do
+    AC_CACHE_CHECK([for $gltype integer literal suffix],
+      [gl_cv_type_${gltype}_suffix],
+      [eval gl_cv_type_${gltype}_suffix=no
+       eval result=\$gl_cv_type_${gltype}_signed
+       if test "$result" = yes; then
+         glsufu=
+       else
+         glsufu=u
+       fi
+       for glsuf in "$glsufu" ${glsufu}l ${glsufu}ll ${glsufu}i64; do
+         case $glsuf in
+           '')  gltype1='int';;
+           l)   gltype1='long int';;
+           ll)  gltype1='long long int';;
+           i64) gltype1='__int64';;
+           u)   gltype1='unsigned int';;
+           ul)  gltype1='unsigned long int';;
+           ull) gltype1='unsigned long long int';;
+           ui64)gltype1='unsigned __int64';;
+         esac
+         AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM([$2[
+              extern $gltype foo;
+              extern $gltype1 foo;]])],
+           [eval gl_cv_type_${gltype}_suffix=\$glsuf])
+         eval result=\$gl_cv_type_${gltype}_suffix
+         test "$result" != no && break
+       done])
+    GLTYPE=`echo $gltype | tr 'abcdefghijklmnopqrstuvwxyz ' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_'`
+    eval result=\$gl_cv_type_${gltype}_suffix
+    test "$result" = no && result=
+    eval ${GLTYPE}_SUFFIX=\$result
+    AC_DEFINE_UNQUOTED([${GLTYPE}_SUFFIX], [$result])
+  done
+  m4_foreach_w([gltype], [$1],
+    [AC_SUBST(m4_translit(gltype,[abcdefghijklmnopqrstuvwxyz ],[ABCDEFGHIJKLMNOPQRSTUVWXYZ_])[_SUFFIX])])
+])
+
+dnl gl_STDINT_INCLUDES
+AC_DEFUN([gl_STDINT_INCLUDES],
+[[
+  /* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+     included before <wchar.h>.  */
+  #include <stddef.h>
+  #include <signal.h>
+  #if HAVE_WCHAR_H
+  # include <stdio.h>
+  # include <time.h>
+  # include <wchar.h>
+  #endif
+]])
+
+dnl gl_STDINT_TYPE_PROPERTIES
+dnl Compute HAVE_SIGNED_t, BITSIZEOF_t and t_SUFFIX, for all the types t
+dnl of interest to stdint.in.h.
+AC_DEFUN([gl_STDINT_TYPE_PROPERTIES],
+[
+  AC_REQUIRE([gl_MULTIARCH])
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+    gl_STDINT_BITSIZEOF([ptrdiff_t size_t],
+      [gl_STDINT_INCLUDES])
+  fi
+  gl_STDINT_BITSIZEOF([sig_atomic_t wchar_t wint_t],
+    [gl_STDINT_INCLUDES])
+  gl_CHECK_TYPES_SIGNED([sig_atomic_t wchar_t wint_t],
+    [gl_STDINT_INCLUDES])
+  gl_cv_type_ptrdiff_t_signed=yes
+  gl_cv_type_size_t_signed=no
+  if test $APPLE_UNIVERSAL_BUILD = 0; then
+    gl_INTEGER_TYPE_SUFFIX([ptrdiff_t size_t],
+      [gl_STDINT_INCLUDES])
+  fi
+  gl_INTEGER_TYPE_SUFFIX([sig_atomic_t wchar_t wint_t],
+    [gl_STDINT_INCLUDES])
+
+  dnl If wint_t is smaller than 'int', it cannot satisfy the ISO C 99
+  dnl requirement that wint_t is "unchanged by default argument promotions".
+  dnl In this case gnulib's <wchar.h> and <wctype.h> override wint_t.
+  dnl Set the variable BITSIZEOF_WINT_T accordingly.
+  if test $GNULIB_OVERRIDES_WINT_T = 1; then
+    BITSIZEOF_WINT_T=32
+  fi
+])
diff --git a/m4/stdio_h.m4 b/m4/stdio_h.m4
new file mode 100644 (file)
index 0000000..c603b51
--- /dev/null
@@ -0,0 +1,225 @@
+# stdio_h.m4 serial 49
+dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDIO_H],
+[
+  AH_VERBATIM([MINGW_ANSI_STDIO],
+[/* Use GNU style printf and scanf.  */
+#ifndef __USE_MINGW_ANSI_STDIO
+# undef __USE_MINGW_ANSI_STDIO
+#endif
+])
+  AC_DEFINE([__USE_MINGW_ANSI_STDIO])
+  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+  gl_NEXT_HEADERS([stdio.h])
+
+  dnl Determine whether __USE_MINGW_ANSI_STDIO makes printf and
+  dnl inttypes.h behave like gnu instead of system; we must give our
+  dnl printf wrapper the right attribute to match.
+  AC_CACHE_CHECK([which flavor of printf attribute matches inttypes macros],
+    [gl_cv_func_printf_attribute_flavor],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+       #define __STDC_FORMAT_MACROS 1
+       #include <stdio.h>
+       #include <inttypes.h>
+       /* For non-mingw systems, compilation will trivially succeed.
+          For mingw, compilation will succeed for older mingw (system
+          printf, "I64d") and fail for newer mingw (gnu printf, "lld"). */
+       #if (defined _WIN32 && ! defined __CYGWIN__) && \
+         (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4))
+       extern char PRIdMAX_probe[sizeof PRIdMAX == sizeof "I64d" ? 1 : -1];
+       #endif
+      ]])], [gl_cv_func_printf_attribute_flavor=system],
+      [gl_cv_func_printf_attribute_flavor=gnu])])
+  if test "$gl_cv_func_printf_attribute_flavor" = gnu; then
+    AC_DEFINE([GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU], [1],
+      [Define to 1 if printf and friends should be labeled with
+       attribute "__gnu_printf__" instead of "__printf__"])
+  fi
+
+  dnl No need to create extra modules for these functions. Everyone who uses
+  dnl <stdio.h> likely needs them.
+  GNULIB_FSCANF=1
+  gl_MODULE_INDICATOR([fscanf])
+  GNULIB_SCANF=1
+  gl_MODULE_INDICATOR([scanf])
+  GNULIB_FGETC=1
+  GNULIB_GETC=1
+  GNULIB_GETCHAR=1
+  GNULIB_FGETS=1
+  GNULIB_FREAD=1
+  dnl This ifdef is necessary to avoid an error "missing file lib/stdio-read.c"
+  dnl "expected source file, required through AC_LIBSOURCES, not found". It is
+  dnl also an optimization, to avoid performing a configure check whose result
+  dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
+  dnl or GNULIB_NONBLOCKING redundant.
+  m4_ifdef([gl_NONBLOCKING_IO], [
+    gl_NONBLOCKING_IO
+    if test $gl_cv_have_nonblocking != yes; then
+      REPLACE_STDIO_READ_FUNCS=1
+      AC_LIBOBJ([stdio-read])
+    fi
+  ])
+
+  dnl No need to create extra modules for these functions. Everyone who uses
+  dnl <stdio.h> likely needs them.
+  GNULIB_FPRINTF=1
+  GNULIB_PRINTF=1
+  GNULIB_VFPRINTF=1
+  GNULIB_VPRINTF=1
+  GNULIB_FPUTC=1
+  GNULIB_PUTC=1
+  GNULIB_PUTCHAR=1
+  GNULIB_FPUTS=1
+  GNULIB_PUTS=1
+  GNULIB_FWRITE=1
+  dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
+  dnl "expected source file, required through AC_LIBSOURCES, not found". It is
+  dnl also an optimization, to avoid performing a configure check whose result
+  dnl is not used. But it does not make the test of GNULIB_STDIO_H_SIGPIPE or
+  dnl GNULIB_SIGPIPE redundant.
+  m4_ifdef([gl_SIGNAL_SIGPIPE], [
+    gl_SIGNAL_SIGPIPE
+    if test $gl_cv_header_signal_h_SIGPIPE != yes; then
+      REPLACE_STDIO_WRITE_FUNCS=1
+      AC_LIBOBJ([stdio-write])
+    fi
+  ])
+  dnl This ifdef is necessary to avoid an error "missing file lib/stdio-write.c"
+  dnl "expected source file, required through AC_LIBSOURCES, not found". It is
+  dnl also an optimization, to avoid performing a configure check whose result
+  dnl is not used. But it does not make the test of GNULIB_STDIO_H_NONBLOCKING
+  dnl or GNULIB_NONBLOCKING redundant.
+  m4_ifdef([gl_NONBLOCKING_IO], [
+    gl_NONBLOCKING_IO
+    if test $gl_cv_have_nonblocking != yes; then
+      REPLACE_STDIO_WRITE_FUNCS=1
+      AC_LIBOBJ([stdio-write])
+    fi
+  ])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by both C89 and C11.
+  gl_WARN_ON_USE_PREPARE([[#include <stdio.h>
+    ]], [dprintf fpurge fseeko ftello getdelim getline gets pclose popen
+    renameat snprintf tmpfile vdprintf vsnprintf])
+])
+
+AC_DEFUN([gl_STDIO_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_STDIO_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_STDIO_H_DEFAULTS],
+[
+  GNULIB_DPRINTF=0;              AC_SUBST([GNULIB_DPRINTF])
+  GNULIB_FCLOSE=0;               AC_SUBST([GNULIB_FCLOSE])
+  GNULIB_FDOPEN=0;               AC_SUBST([GNULIB_FDOPEN])
+  GNULIB_FFLUSH=0;               AC_SUBST([GNULIB_FFLUSH])
+  GNULIB_FGETC=0;                AC_SUBST([GNULIB_FGETC])
+  GNULIB_FGETS=0;                AC_SUBST([GNULIB_FGETS])
+  GNULIB_FOPEN=0;                AC_SUBST([GNULIB_FOPEN])
+  GNULIB_FPRINTF=0;              AC_SUBST([GNULIB_FPRINTF])
+  GNULIB_FPRINTF_POSIX=0;        AC_SUBST([GNULIB_FPRINTF_POSIX])
+  GNULIB_FPURGE=0;               AC_SUBST([GNULIB_FPURGE])
+  GNULIB_FPUTC=0;                AC_SUBST([GNULIB_FPUTC])
+  GNULIB_FPUTS=0;                AC_SUBST([GNULIB_FPUTS])
+  GNULIB_FREAD=0;                AC_SUBST([GNULIB_FREAD])
+  GNULIB_FREOPEN=0;              AC_SUBST([GNULIB_FREOPEN])
+  GNULIB_FSCANF=0;               AC_SUBST([GNULIB_FSCANF])
+  GNULIB_FSEEK=0;                AC_SUBST([GNULIB_FSEEK])
+  GNULIB_FSEEKO=0;               AC_SUBST([GNULIB_FSEEKO])
+  GNULIB_FTELL=0;                AC_SUBST([GNULIB_FTELL])
+  GNULIB_FTELLO=0;               AC_SUBST([GNULIB_FTELLO])
+  GNULIB_FWRITE=0;               AC_SUBST([GNULIB_FWRITE])
+  GNULIB_GETC=0;                 AC_SUBST([GNULIB_GETC])
+  GNULIB_GETCHAR=0;              AC_SUBST([GNULIB_GETCHAR])
+  GNULIB_GETDELIM=0;             AC_SUBST([GNULIB_GETDELIM])
+  GNULIB_GETLINE=0;              AC_SUBST([GNULIB_GETLINE])
+  GNULIB_OBSTACK_PRINTF=0;       AC_SUBST([GNULIB_OBSTACK_PRINTF])
+  GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX])
+  GNULIB_PCLOSE=0;               AC_SUBST([GNULIB_PCLOSE])
+  GNULIB_PERROR=0;               AC_SUBST([GNULIB_PERROR])
+  GNULIB_POPEN=0;                AC_SUBST([GNULIB_POPEN])
+  GNULIB_PRINTF=0;               AC_SUBST([GNULIB_PRINTF])
+  GNULIB_PRINTF_POSIX=0;         AC_SUBST([GNULIB_PRINTF_POSIX])
+  GNULIB_PUTC=0;                 AC_SUBST([GNULIB_PUTC])
+  GNULIB_PUTCHAR=0;              AC_SUBST([GNULIB_PUTCHAR])
+  GNULIB_PUTS=0;                 AC_SUBST([GNULIB_PUTS])
+  GNULIB_REMOVE=0;               AC_SUBST([GNULIB_REMOVE])
+  GNULIB_RENAME=0;               AC_SUBST([GNULIB_RENAME])
+  GNULIB_RENAMEAT=0;             AC_SUBST([GNULIB_RENAMEAT])
+  GNULIB_SCANF=0;                AC_SUBST([GNULIB_SCANF])
+  GNULIB_SNPRINTF=0;             AC_SUBST([GNULIB_SNPRINTF])
+  GNULIB_SPRINTF_POSIX=0;        AC_SUBST([GNULIB_SPRINTF_POSIX])
+  GNULIB_STDIO_H_NONBLOCKING=0;  AC_SUBST([GNULIB_STDIO_H_NONBLOCKING])
+  GNULIB_STDIO_H_SIGPIPE=0;      AC_SUBST([GNULIB_STDIO_H_SIGPIPE])
+  GNULIB_TMPFILE=0;              AC_SUBST([GNULIB_TMPFILE])
+  GNULIB_VASPRINTF=0;            AC_SUBST([GNULIB_VASPRINTF])
+  GNULIB_VFSCANF=0;              AC_SUBST([GNULIB_VFSCANF])
+  GNULIB_VSCANF=0;               AC_SUBST([GNULIB_VSCANF])
+  GNULIB_VDPRINTF=0;             AC_SUBST([GNULIB_VDPRINTF])
+  GNULIB_VFPRINTF=0;             AC_SUBST([GNULIB_VFPRINTF])
+  GNULIB_VFPRINTF_POSIX=0;       AC_SUBST([GNULIB_VFPRINTF_POSIX])
+  GNULIB_VPRINTF=0;              AC_SUBST([GNULIB_VPRINTF])
+  GNULIB_VPRINTF_POSIX=0;        AC_SUBST([GNULIB_VPRINTF_POSIX])
+  GNULIB_VSNPRINTF=0;            AC_SUBST([GNULIB_VSNPRINTF])
+  GNULIB_VSPRINTF_POSIX=0;       AC_SUBST([GNULIB_VSPRINTF_POSIX])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_DECL_FPURGE=1;            AC_SUBST([HAVE_DECL_FPURGE])
+  HAVE_DECL_FSEEKO=1;            AC_SUBST([HAVE_DECL_FSEEKO])
+  HAVE_DECL_FTELLO=1;            AC_SUBST([HAVE_DECL_FTELLO])
+  HAVE_DECL_GETDELIM=1;          AC_SUBST([HAVE_DECL_GETDELIM])
+  HAVE_DECL_GETLINE=1;           AC_SUBST([HAVE_DECL_GETLINE])
+  HAVE_DECL_OBSTACK_PRINTF=1;    AC_SUBST([HAVE_DECL_OBSTACK_PRINTF])
+  HAVE_DECL_SNPRINTF=1;          AC_SUBST([HAVE_DECL_SNPRINTF])
+  HAVE_DECL_VSNPRINTF=1;         AC_SUBST([HAVE_DECL_VSNPRINTF])
+  HAVE_DPRINTF=1;                AC_SUBST([HAVE_DPRINTF])
+  HAVE_FSEEKO=1;                 AC_SUBST([HAVE_FSEEKO])
+  HAVE_FTELLO=1;                 AC_SUBST([HAVE_FTELLO])
+  HAVE_PCLOSE=1;                 AC_SUBST([HAVE_PCLOSE])
+  HAVE_POPEN=1;                  AC_SUBST([HAVE_POPEN])
+  HAVE_RENAMEAT=1;               AC_SUBST([HAVE_RENAMEAT])
+  HAVE_VASPRINTF=1;              AC_SUBST([HAVE_VASPRINTF])
+  HAVE_VDPRINTF=1;               AC_SUBST([HAVE_VDPRINTF])
+  REPLACE_DPRINTF=0;             AC_SUBST([REPLACE_DPRINTF])
+  REPLACE_FCLOSE=0;              AC_SUBST([REPLACE_FCLOSE])
+  REPLACE_FDOPEN=0;              AC_SUBST([REPLACE_FDOPEN])
+  REPLACE_FFLUSH=0;              AC_SUBST([REPLACE_FFLUSH])
+  REPLACE_FOPEN=0;               AC_SUBST([REPLACE_FOPEN])
+  REPLACE_FPRINTF=0;             AC_SUBST([REPLACE_FPRINTF])
+  REPLACE_FPURGE=0;              AC_SUBST([REPLACE_FPURGE])
+  REPLACE_FREOPEN=0;             AC_SUBST([REPLACE_FREOPEN])
+  REPLACE_FSEEK=0;               AC_SUBST([REPLACE_FSEEK])
+  REPLACE_FSEEKO=0;              AC_SUBST([REPLACE_FSEEKO])
+  REPLACE_FTELL=0;               AC_SUBST([REPLACE_FTELL])
+  REPLACE_FTELLO=0;              AC_SUBST([REPLACE_FTELLO])
+  REPLACE_GETDELIM=0;            AC_SUBST([REPLACE_GETDELIM])
+  REPLACE_GETLINE=0;             AC_SUBST([REPLACE_GETLINE])
+  REPLACE_OBSTACK_PRINTF=0;      AC_SUBST([REPLACE_OBSTACK_PRINTF])
+  REPLACE_PERROR=0;              AC_SUBST([REPLACE_PERROR])
+  REPLACE_POPEN=0;               AC_SUBST([REPLACE_POPEN])
+  REPLACE_PRINTF=0;              AC_SUBST([REPLACE_PRINTF])
+  REPLACE_REMOVE=0;              AC_SUBST([REPLACE_REMOVE])
+  REPLACE_RENAME=0;              AC_SUBST([REPLACE_RENAME])
+  REPLACE_RENAMEAT=0;            AC_SUBST([REPLACE_RENAMEAT])
+  REPLACE_SNPRINTF=0;            AC_SUBST([REPLACE_SNPRINTF])
+  REPLACE_SPRINTF=0;             AC_SUBST([REPLACE_SPRINTF])
+  REPLACE_STDIO_READ_FUNCS=0;    AC_SUBST([REPLACE_STDIO_READ_FUNCS])
+  REPLACE_STDIO_WRITE_FUNCS=0;   AC_SUBST([REPLACE_STDIO_WRITE_FUNCS])
+  REPLACE_TMPFILE=0;             AC_SUBST([REPLACE_TMPFILE])
+  REPLACE_VASPRINTF=0;           AC_SUBST([REPLACE_VASPRINTF])
+  REPLACE_VDPRINTF=0;            AC_SUBST([REPLACE_VDPRINTF])
+  REPLACE_VFPRINTF=0;            AC_SUBST([REPLACE_VFPRINTF])
+  REPLACE_VPRINTF=0;             AC_SUBST([REPLACE_VPRINTF])
+  REPLACE_VSNPRINTF=0;           AC_SUBST([REPLACE_VSNPRINTF])
+  REPLACE_VSPRINTF=0;            AC_SUBST([REPLACE_VSPRINTF])
+])
diff --git a/m4/stdlib_h.m4 b/m4/stdlib_h.m4
new file mode 100644 (file)
index 0000000..61a3e31
--- /dev/null
@@ -0,0 +1,136 @@
+# stdlib_h.m4 serial 48
+dnl Copyright (C) 2007-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDLIB_H],
+[
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  gl_NEXT_HEADERS([stdlib.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by C89.
+  gl_WARN_ON_USE_PREPARE([[#include <stdlib.h>
+#if HAVE_SYS_LOADAVG_H
+/* OpenIndiana has a bug: <sys/time.h> must be included before
+   <sys/loadavg.h>.  */
+# include <sys/time.h>
+# include <sys/loadavg.h>
+#endif
+#if HAVE_RANDOM_H
+# include <random.h>
+#endif
+    ]], [_Exit atoll canonicalize_file_name getloadavg getsubopt grantpt
+    initstate initstate_r mbtowc mkdtemp mkostemp mkostemps mkstemp mkstemps
+    posix_openpt ptsname ptsname_r qsort_r random random_r reallocarray
+    realpath rpmatch secure_getenv setenv setstate setstate_r srandom
+    srandom_r strtod strtold strtoll strtoull unlockpt unsetenv])
+])
+
+AC_DEFUN([gl_STDLIB_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_STDLIB_H_DEFAULTS],
+[
+  GNULIB__EXIT=0;         AC_SUBST([GNULIB__EXIT])
+  GNULIB_ATOLL=0;         AC_SUBST([GNULIB_ATOLL])
+  GNULIB_CALLOC_POSIX=0;  AC_SUBST([GNULIB_CALLOC_POSIX])
+  GNULIB_CANONICALIZE_FILE_NAME=0;  AC_SUBST([GNULIB_CANONICALIZE_FILE_NAME])
+  GNULIB_GETLOADAVG=0;    AC_SUBST([GNULIB_GETLOADAVG])
+  GNULIB_GETSUBOPT=0;     AC_SUBST([GNULIB_GETSUBOPT])
+  GNULIB_GRANTPT=0;       AC_SUBST([GNULIB_GRANTPT])
+  GNULIB_MALLOC_POSIX=0;  AC_SUBST([GNULIB_MALLOC_POSIX])
+  GNULIB_MBTOWC=0;        AC_SUBST([GNULIB_MBTOWC])
+  GNULIB_MKDTEMP=0;       AC_SUBST([GNULIB_MKDTEMP])
+  GNULIB_MKOSTEMP=0;      AC_SUBST([GNULIB_MKOSTEMP])
+  GNULIB_MKOSTEMPS=0;     AC_SUBST([GNULIB_MKOSTEMPS])
+  GNULIB_MKSTEMP=0;       AC_SUBST([GNULIB_MKSTEMP])
+  GNULIB_MKSTEMPS=0;      AC_SUBST([GNULIB_MKSTEMPS])
+  GNULIB_POSIX_OPENPT=0;  AC_SUBST([GNULIB_POSIX_OPENPT])
+  GNULIB_PTSNAME=0;       AC_SUBST([GNULIB_PTSNAME])
+  GNULIB_PTSNAME_R=0;     AC_SUBST([GNULIB_PTSNAME_R])
+  GNULIB_PUTENV=0;        AC_SUBST([GNULIB_PUTENV])
+  GNULIB_QSORT_R=0;       AC_SUBST([GNULIB_QSORT_R])
+  GNULIB_RANDOM=0;        AC_SUBST([GNULIB_RANDOM])
+  GNULIB_RANDOM_R=0;      AC_SUBST([GNULIB_RANDOM_R])
+  GNULIB_REALLOCARRAY=0;  AC_SUBST([GNULIB_REALLOCARRAY])
+  GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX])
+  GNULIB_REALPATH=0;      AC_SUBST([GNULIB_REALPATH])
+  GNULIB_RPMATCH=0;       AC_SUBST([GNULIB_RPMATCH])
+  GNULIB_SECURE_GETENV=0; AC_SUBST([GNULIB_SECURE_GETENV])
+  GNULIB_SETENV=0;        AC_SUBST([GNULIB_SETENV])
+  GNULIB_STRTOD=0;        AC_SUBST([GNULIB_STRTOD])
+  GNULIB_STRTOLD=0;       AC_SUBST([GNULIB_STRTOLD])
+  GNULIB_STRTOLL=0;       AC_SUBST([GNULIB_STRTOLL])
+  GNULIB_STRTOULL=0;      AC_SUBST([GNULIB_STRTOULL])
+  GNULIB_SYSTEM_POSIX=0;  AC_SUBST([GNULIB_SYSTEM_POSIX])
+  GNULIB_UNLOCKPT=0;      AC_SUBST([GNULIB_UNLOCKPT])
+  GNULIB_UNSETENV=0;      AC_SUBST([GNULIB_UNSETENV])
+  GNULIB_WCTOMB=0;        AC_SUBST([GNULIB_WCTOMB])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE__EXIT=1;              AC_SUBST([HAVE__EXIT])
+  HAVE_ATOLL=1;              AC_SUBST([HAVE_ATOLL])
+  HAVE_CANONICALIZE_FILE_NAME=1;  AC_SUBST([HAVE_CANONICALIZE_FILE_NAME])
+  HAVE_DECL_GETLOADAVG=1;    AC_SUBST([HAVE_DECL_GETLOADAVG])
+  HAVE_GETSUBOPT=1;          AC_SUBST([HAVE_GETSUBOPT])
+  HAVE_GRANTPT=1;            AC_SUBST([HAVE_GRANTPT])
+  HAVE_INITSTATE=1;          AC_SUBST([HAVE_INITSTATE])
+  HAVE_DECL_INITSTATE=1;     AC_SUBST([HAVE_DECL_INITSTATE])
+  HAVE_MBTOWC=1;             AC_SUBST([HAVE_MBTOWC])
+  HAVE_MKDTEMP=1;            AC_SUBST([HAVE_MKDTEMP])
+  HAVE_MKOSTEMP=1;           AC_SUBST([HAVE_MKOSTEMP])
+  HAVE_MKOSTEMPS=1;          AC_SUBST([HAVE_MKOSTEMPS])
+  HAVE_MKSTEMP=1;            AC_SUBST([HAVE_MKSTEMP])
+  HAVE_MKSTEMPS=1;           AC_SUBST([HAVE_MKSTEMPS])
+  HAVE_POSIX_OPENPT=1;       AC_SUBST([HAVE_POSIX_OPENPT])
+  HAVE_PTSNAME=1;            AC_SUBST([HAVE_PTSNAME])
+  HAVE_PTSNAME_R=1;          AC_SUBST([HAVE_PTSNAME_R])
+  HAVE_QSORT_R=1;            AC_SUBST([HAVE_QSORT_R])
+  HAVE_RANDOM=1;             AC_SUBST([HAVE_RANDOM])
+  HAVE_RANDOM_H=1;           AC_SUBST([HAVE_RANDOM_H])
+  HAVE_RANDOM_R=1;           AC_SUBST([HAVE_RANDOM_R])
+  HAVE_REALLOCARRAY=1;       AC_SUBST([HAVE_REALLOCARRAY])
+  HAVE_REALPATH=1;           AC_SUBST([HAVE_REALPATH])
+  HAVE_RPMATCH=1;            AC_SUBST([HAVE_RPMATCH])
+  HAVE_SECURE_GETENV=1;      AC_SUBST([HAVE_SECURE_GETENV])
+  HAVE_SETENV=1;             AC_SUBST([HAVE_SETENV])
+  HAVE_DECL_SETENV=1;        AC_SUBST([HAVE_DECL_SETENV])
+  HAVE_SETSTATE=1;           AC_SUBST([HAVE_SETSTATE])
+  HAVE_DECL_SETSTATE=1;      AC_SUBST([HAVE_DECL_SETSTATE])
+  HAVE_STRTOD=1;             AC_SUBST([HAVE_STRTOD])
+  HAVE_STRTOLD=1;            AC_SUBST([HAVE_STRTOLD])
+  HAVE_STRTOLL=1;            AC_SUBST([HAVE_STRTOLL])
+  HAVE_STRTOULL=1;           AC_SUBST([HAVE_STRTOULL])
+  HAVE_STRUCT_RANDOM_DATA=1; AC_SUBST([HAVE_STRUCT_RANDOM_DATA])
+  HAVE_SYS_LOADAVG_H=0;      AC_SUBST([HAVE_SYS_LOADAVG_H])
+  HAVE_UNLOCKPT=1;           AC_SUBST([HAVE_UNLOCKPT])
+  HAVE_DECL_UNSETENV=1;      AC_SUBST([HAVE_DECL_UNSETENV])
+  REPLACE_CALLOC=0;          AC_SUBST([REPLACE_CALLOC])
+  REPLACE_CANONICALIZE_FILE_NAME=0;  AC_SUBST([REPLACE_CANONICALIZE_FILE_NAME])
+  REPLACE_INITSTATE=0;       AC_SUBST([REPLACE_INITSTATE])
+  REPLACE_MALLOC=0;          AC_SUBST([REPLACE_MALLOC])
+  REPLACE_MBTOWC=0;          AC_SUBST([REPLACE_MBTOWC])
+  REPLACE_MKSTEMP=0;         AC_SUBST([REPLACE_MKSTEMP])
+  REPLACE_PTSNAME=0;         AC_SUBST([REPLACE_PTSNAME])
+  REPLACE_PTSNAME_R=0;       AC_SUBST([REPLACE_PTSNAME_R])
+  REPLACE_PUTENV=0;          AC_SUBST([REPLACE_PUTENV])
+  REPLACE_QSORT_R=0;         AC_SUBST([REPLACE_QSORT_R])
+  REPLACE_RANDOM=0;          AC_SUBST([REPLACE_RANDOM])
+  REPLACE_RANDOM_R=0;        AC_SUBST([REPLACE_RANDOM_R])
+  REPLACE_REALLOC=0;         AC_SUBST([REPLACE_REALLOC])
+  REPLACE_REALPATH=0;        AC_SUBST([REPLACE_REALPATH])
+  REPLACE_SETENV=0;          AC_SUBST([REPLACE_SETENV])
+  REPLACE_SETSTATE=0;        AC_SUBST([REPLACE_SETSTATE])
+  REPLACE_STRTOD=0;          AC_SUBST([REPLACE_STRTOD])
+  REPLACE_STRTOLD=0;         AC_SUBST([REPLACE_STRTOLD])
+  REPLACE_UNSETENV=0;        AC_SUBST([REPLACE_UNSETENV])
+  REPLACE_WCTOMB=0;          AC_SUBST([REPLACE_WCTOMB])
+])
diff --git a/m4/stpcpy.m4 b/m4/stpcpy.m4
new file mode 100644 (file)
index 0000000..0f0fa9e
--- /dev/null
@@ -0,0 +1,25 @@
+# stpcpy.m4 serial 8
+dnl Copyright (C) 2002, 2007, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STPCPY],
+[
+  dnl Persuade glibc <string.h> to declare stpcpy().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  dnl The stpcpy() declaration in lib/string.in.h uses 'restrict'.
+  AC_REQUIRE([AC_C_RESTRICT])
+
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_CHECK_FUNCS([stpcpy])
+  if test $ac_cv_func_stpcpy = no; then
+    HAVE_STPCPY=0
+  fi
+])
+
+# Prerequisites of lib/stpcpy.c.
+AC_DEFUN([gl_PREREQ_STPCPY], [
+  :
+])
diff --git a/m4/strerror.m4 b/m4/strerror.m4
new file mode 100644 (file)
index 0000000..fd84ce8
--- /dev/null
@@ -0,0 +1,102 @@
+# strerror.m4 serial 21
+dnl Copyright (C) 2002, 2007-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_FUNC_STRERROR],
+[
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  AC_REQUIRE([gl_HEADER_ERRNO_H])
+  AC_REQUIRE([gl_FUNC_STRERROR_0])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
+    AC_REQUIRE([gl_FUNC_STRERROR_R_WORKS])
+  ])
+  if test "$ERRNO_H:$REPLACE_STRERROR_0" = :0; then
+    AC_CACHE_CHECK([for working strerror function],
+     [gl_cv_func_working_strerror],
+     [AC_RUN_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[#include <string.h>
+           ]],
+           [[if (!*strerror (-2)) return 1;]])],
+        [gl_cv_func_working_strerror=yes],
+        [gl_cv_func_working_strerror=no],
+        [case "$host_os" in
+                          # Guess yes on glibc systems.
+           *-gnu* | gnu*) gl_cv_func_working_strerror="guessing yes" ;;
+                          # Guess yes on musl systems.
+           *-musl*)       gl_cv_func_working_strerror="guessing yes" ;;
+                          # If we don't know, obey --enable-cross-guesses.
+           *)             gl_cv_func_working_strerror="$gl_cross_guess_normal" ;;
+         esac
+        ])
+    ])
+    case "$gl_cv_func_working_strerror" in
+      *yes) ;;
+      *)
+        dnl The system's strerror() fails to return a string for out-of-range
+        dnl integers. Replace it.
+        REPLACE_STRERROR=1
+        ;;
+    esac
+    m4_ifdef([gl_FUNC_STRERROR_R_WORKS], [
+      dnl If the system's strerror_r or __xpg_strerror_r clobbers strerror's
+      dnl buffer, we must replace strerror.
+      case "$gl_cv_func_strerror_r_works" in
+        *no) REPLACE_STRERROR=1 ;;
+      esac
+    ])
+  else
+    dnl The system's strerror() cannot know about the new errno values we add
+    dnl to <errno.h>, or any fix for strerror(0). Replace it.
+    REPLACE_STRERROR=1
+  fi
+])
+
+dnl Detect if strerror(0) passes (that is, does not set errno, and does not
+dnl return a string that matches strerror(-1)).
+AC_DEFUN([gl_FUNC_STRERROR_0],
+[
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+  REPLACE_STRERROR_0=0
+  AC_CACHE_CHECK([whether strerror(0) succeeds],
+   [gl_cv_func_strerror_0_works],
+   [AC_RUN_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[#include <string.h>
+           #include <errno.h>
+         ]],
+         [[int result = 0;
+           char *str;
+           errno = 0;
+           str = strerror (0);
+           if (!*str) result |= 1;
+           if (errno) result |= 2;
+           if (strstr (str, "nknown") || strstr (str, "ndefined"))
+             result |= 4;
+           return result;]])],
+      [gl_cv_func_strerror_0_works=yes],
+      [gl_cv_func_strerror_0_works=no],
+      [case "$host_os" in
+                        # Guess yes on glibc systems.
+         *-gnu* | gnu*) gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # Guess yes on musl systems.
+         *-musl*)       gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # Guess yes on native Windows.
+         mingw*)        gl_cv_func_strerror_0_works="guessing yes" ;;
+                        # If we don't know, obey --enable-cross-guesses.
+         *)             gl_cv_func_strerror_0_works="$gl_cross_guess_normal" ;;
+       esac
+      ])
+  ])
+  case "$gl_cv_func_strerror_0_works" in
+    *yes) ;;
+    *)
+      REPLACE_STRERROR_0=1
+      AC_DEFINE([REPLACE_STRERROR_0], [1], [Define to 1 if strerror(0)
+        does not return a message implying success.])
+      ;;
+  esac
+])
diff --git a/m4/string_h.m4 b/m4/string_h.m4
new file mode 100644 (file)
index 0000000..4c1f685
--- /dev/null
@@ -0,0 +1,122 @@
+# Configure a GNU-like replacement for <string.h>.
+
+# Copyright (C) 2007-2020 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 22
+
+# Written by Paul Eggert.
+
+AC_DEFUN([gl_HEADER_STRING_H],
+[
+  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+  dnl once only, before all statements that occur in other macros.
+  AC_REQUIRE([gl_HEADER_STRING_H_BODY])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_BODY],
+[
+  AC_REQUIRE([AC_C_RESTRICT])
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  gl_NEXT_HEADERS([string.h])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use, and which is not
+  dnl guaranteed by C89.
+  gl_WARN_ON_USE_PREPARE([[#include <string.h>
+    ]],
+    [ffsl ffsll memmem mempcpy memrchr rawmemchr stpcpy stpncpy strchrnul
+     strdup strncat strndup strnlen strpbrk strsep strcasestr strtok_r
+     strerror_r strsignal strverscmp])
+])
+
+AC_DEFUN([gl_STRING_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_HEADER_STRING_H_DEFAULTS],
+[
+  GNULIB_EXPLICIT_BZERO=0; AC_SUBST([GNULIB_EXPLICIT_BZERO])
+  GNULIB_FFSL=0;        AC_SUBST([GNULIB_FFSL])
+  GNULIB_FFSLL=0;       AC_SUBST([GNULIB_FFSLL])
+  GNULIB_MEMCHR=0;      AC_SUBST([GNULIB_MEMCHR])
+  GNULIB_MEMMEM=0;      AC_SUBST([GNULIB_MEMMEM])
+  GNULIB_MEMPCPY=0;     AC_SUBST([GNULIB_MEMPCPY])
+  GNULIB_MEMRCHR=0;     AC_SUBST([GNULIB_MEMRCHR])
+  GNULIB_RAWMEMCHR=0;   AC_SUBST([GNULIB_RAWMEMCHR])
+  GNULIB_STPCPY=0;      AC_SUBST([GNULIB_STPCPY])
+  GNULIB_STPNCPY=0;     AC_SUBST([GNULIB_STPNCPY])
+  GNULIB_STRCHRNUL=0;   AC_SUBST([GNULIB_STRCHRNUL])
+  GNULIB_STRDUP=0;      AC_SUBST([GNULIB_STRDUP])
+  GNULIB_STRNCAT=0;     AC_SUBST([GNULIB_STRNCAT])
+  GNULIB_STRNDUP=0;     AC_SUBST([GNULIB_STRNDUP])
+  GNULIB_STRNLEN=0;     AC_SUBST([GNULIB_STRNLEN])
+  GNULIB_STRPBRK=0;     AC_SUBST([GNULIB_STRPBRK])
+  GNULIB_STRSEP=0;      AC_SUBST([GNULIB_STRSEP])
+  GNULIB_STRSTR=0;      AC_SUBST([GNULIB_STRSTR])
+  GNULIB_STRCASESTR=0;  AC_SUBST([GNULIB_STRCASESTR])
+  GNULIB_STRTOK_R=0;    AC_SUBST([GNULIB_STRTOK_R])
+  GNULIB_MBSLEN=0;      AC_SUBST([GNULIB_MBSLEN])
+  GNULIB_MBSNLEN=0;     AC_SUBST([GNULIB_MBSNLEN])
+  GNULIB_MBSCHR=0;      AC_SUBST([GNULIB_MBSCHR])
+  GNULIB_MBSRCHR=0;     AC_SUBST([GNULIB_MBSRCHR])
+  GNULIB_MBSSTR=0;      AC_SUBST([GNULIB_MBSSTR])
+  GNULIB_MBSCASECMP=0;  AC_SUBST([GNULIB_MBSCASECMP])
+  GNULIB_MBSNCASECMP=0; AC_SUBST([GNULIB_MBSNCASECMP])
+  GNULIB_MBSPCASECMP=0; AC_SUBST([GNULIB_MBSPCASECMP])
+  GNULIB_MBSCASESTR=0;  AC_SUBST([GNULIB_MBSCASESTR])
+  GNULIB_MBSCSPN=0;     AC_SUBST([GNULIB_MBSCSPN])
+  GNULIB_MBSPBRK=0;     AC_SUBST([GNULIB_MBSPBRK])
+  GNULIB_MBSSPN=0;      AC_SUBST([GNULIB_MBSSPN])
+  GNULIB_MBSSEP=0;      AC_SUBST([GNULIB_MBSSEP])
+  GNULIB_MBSTOK_R=0;    AC_SUBST([GNULIB_MBSTOK_R])
+  GNULIB_STRERROR=0;    AC_SUBST([GNULIB_STRERROR])
+  GNULIB_STRERROR_R=0;  AC_SUBST([GNULIB_STRERROR_R])
+  GNULIB_STRSIGNAL=0;   AC_SUBST([GNULIB_STRSIGNAL])
+  GNULIB_STRVERSCMP=0;  AC_SUBST([GNULIB_STRVERSCMP])
+  HAVE_MBSLEN=0;        AC_SUBST([HAVE_MBSLEN])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_EXPLICIT_BZERO=1;        AC_SUBST([HAVE_EXPLICIT_BZERO])
+  HAVE_FFSL=1;                  AC_SUBST([HAVE_FFSL])
+  HAVE_FFSLL=1;                 AC_SUBST([HAVE_FFSLL])
+  HAVE_MEMCHR=1;                AC_SUBST([HAVE_MEMCHR])
+  HAVE_DECL_MEMMEM=1;           AC_SUBST([HAVE_DECL_MEMMEM])
+  HAVE_MEMPCPY=1;               AC_SUBST([HAVE_MEMPCPY])
+  HAVE_DECL_MEMRCHR=1;          AC_SUBST([HAVE_DECL_MEMRCHR])
+  HAVE_RAWMEMCHR=1;             AC_SUBST([HAVE_RAWMEMCHR])
+  HAVE_STPCPY=1;                AC_SUBST([HAVE_STPCPY])
+  HAVE_STPNCPY=1;               AC_SUBST([HAVE_STPNCPY])
+  HAVE_STRCHRNUL=1;             AC_SUBST([HAVE_STRCHRNUL])
+  HAVE_DECL_STRDUP=1;           AC_SUBST([HAVE_DECL_STRDUP])
+  HAVE_DECL_STRNDUP=1;          AC_SUBST([HAVE_DECL_STRNDUP])
+  HAVE_DECL_STRNLEN=1;          AC_SUBST([HAVE_DECL_STRNLEN])
+  HAVE_STRPBRK=1;               AC_SUBST([HAVE_STRPBRK])
+  HAVE_STRSEP=1;                AC_SUBST([HAVE_STRSEP])
+  HAVE_STRCASESTR=1;            AC_SUBST([HAVE_STRCASESTR])
+  HAVE_DECL_STRTOK_R=1;         AC_SUBST([HAVE_DECL_STRTOK_R])
+  HAVE_DECL_STRERROR_R=1;       AC_SUBST([HAVE_DECL_STRERROR_R])
+  HAVE_DECL_STRSIGNAL=1;        AC_SUBST([HAVE_DECL_STRSIGNAL])
+  HAVE_STRVERSCMP=1;            AC_SUBST([HAVE_STRVERSCMP])
+  REPLACE_MEMCHR=0;             AC_SUBST([REPLACE_MEMCHR])
+  REPLACE_MEMMEM=0;             AC_SUBST([REPLACE_MEMMEM])
+  REPLACE_STPNCPY=0;            AC_SUBST([REPLACE_STPNCPY])
+  REPLACE_STRCHRNUL=0;          AC_SUBST([REPLACE_STRCHRNUL])
+  REPLACE_STRDUP=0;             AC_SUBST([REPLACE_STRDUP])
+  REPLACE_STRNCAT=0;            AC_SUBST([REPLACE_STRNCAT])
+  REPLACE_STRNDUP=0;            AC_SUBST([REPLACE_STRNDUP])
+  REPLACE_STRNLEN=0;            AC_SUBST([REPLACE_STRNLEN])
+  REPLACE_STRSTR=0;             AC_SUBST([REPLACE_STRSTR])
+  REPLACE_STRCASESTR=0;         AC_SUBST([REPLACE_STRCASESTR])
+  REPLACE_STRTOK_R=0;           AC_SUBST([REPLACE_STRTOK_R])
+  REPLACE_STRERROR=0;           AC_SUBST([REPLACE_STRERROR])
+  REPLACE_STRERROR_R=0;         AC_SUBST([REPLACE_STRERROR_R])
+  REPLACE_STRSIGNAL=0;          AC_SUBST([REPLACE_STRSIGNAL])
+  UNDEFINE_STRTOK_R=0;          AC_SUBST([UNDEFINE_STRTOK_R])
+])
diff --git a/m4/sys_socket_h.m4 b/m4/sys_socket_h.m4
new file mode 100644 (file)
index 0000000..1471aea
--- /dev/null
@@ -0,0 +1,188 @@
+# sys_socket_h.m4 serial 24
+dnl Copyright (C) 2005-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Simon Josefsson.
+
+AC_DEFUN([gl_HEADER_SYS_SOCKET],
+[
+  AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+
+  dnl On OSF/1, the functions recv(), send(), recvfrom(), sendto() have
+  dnl old-style declarations (with return type 'int' instead of 'ssize_t')
+  dnl unless _POSIX_PII_SOCKET is defined.
+  case "$host_os" in
+    osf*)
+      AC_DEFINE([_POSIX_PII_SOCKET], [1],
+        [Define to 1 in order to get the POSIX compatible declarations
+         of socket functions.])
+      ;;
+  esac
+
+  AC_CACHE_CHECK([whether <sys/socket.h> is self-contained],
+    [gl_cv_header_sys_socket_h_selfcontained],
+    [
+      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[]])],
+        [gl_cv_header_sys_socket_h_selfcontained=yes],
+        [gl_cv_header_sys_socket_h_selfcontained=no])
+    ])
+  if test $gl_cv_header_sys_socket_h_selfcontained = yes; then
+    dnl If the shutdown function exists, <sys/socket.h> should define
+    dnl SHUT_RD, SHUT_WR, SHUT_RDWR.
+    AC_CHECK_FUNCS([shutdown])
+    if test $ac_cv_func_shutdown = yes; then
+      AC_CACHE_CHECK([whether <sys/socket.h> defines the SHUT_* macros],
+        [gl_cv_header_sys_socket_h_shut],
+        [
+          AC_COMPILE_IFELSE(
+            [AC_LANG_PROGRAM([[#include <sys/socket.h>]],
+               [[int a[] = { SHUT_RD, SHUT_WR, SHUT_RDWR };]])],
+            [gl_cv_header_sys_socket_h_shut=yes],
+            [gl_cv_header_sys_socket_h_shut=no])
+        ])
+      if test $gl_cv_header_sys_socket_h_shut = no; then
+        SYS_SOCKET_H='sys/socket.h'
+      fi
+    fi
+  fi
+  # We need to check for ws2tcpip.h now.
+  gl_PREREQ_SYS_H_SOCKET
+  AC_CHECK_TYPES([struct sockaddr_storage, sa_family_t],,,[
+  /* sys/types.h is not needed according to POSIX, but the
+     sys/socket.h in i386-unknown-freebsd4.10 and
+     powerpc-apple-darwin5.5 required it. */
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_WS2TCPIP_H
+#include <ws2tcpip.h>
+#endif
+])
+  if test $ac_cv_type_struct_sockaddr_storage = no; then
+    HAVE_STRUCT_SOCKADDR_STORAGE=0
+  fi
+  if test $ac_cv_type_sa_family_t = no; then
+    HAVE_SA_FAMILY_T=0
+  fi
+  if test $ac_cv_type_struct_sockaddr_storage != no; then
+    AC_CHECK_MEMBERS([struct sockaddr_storage.ss_family],
+      [],
+      [HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=0],
+      [#include <sys/types.h>
+       #ifdef HAVE_SYS_SOCKET_H
+       #include <sys/socket.h>
+       #endif
+       #ifdef HAVE_WS2TCPIP_H
+       #include <ws2tcpip.h>
+       #endif
+      ])
+  fi
+  if test $HAVE_STRUCT_SOCKADDR_STORAGE = 0 || test $HAVE_SA_FAMILY_T = 0 \
+     || test $HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY = 0; then
+    SYS_SOCKET_H='sys/socket.h'
+  fi
+  gl_PREREQ_SYS_H_WINSOCK2
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[
+/* Some systems require prerequisite headers.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+    ]], [socket connect accept bind getpeername getsockname getsockopt
+    listen recv send recvfrom sendto setsockopt shutdown accept4])
+])
+
+AC_DEFUN([gl_PREREQ_SYS_H_SOCKET],
+[
+  dnl Check prerequisites of the <sys/socket.h> replacement.
+  AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])
+  gl_CHECK_NEXT_HEADERS([sys/socket.h])
+  if test $ac_cv_header_sys_socket_h = yes; then
+    HAVE_SYS_SOCKET_H=1
+  else
+    HAVE_SYS_SOCKET_H=0
+  fi
+  AC_SUBST([HAVE_SYS_SOCKET_H])
+  gl_PREREQ_SYS_H_WS2TCPIP
+])
+
+# Common prerequisites of the <sys/socket.h> replacement and of the
+# <sys/select.h> replacement.
+# Sets and substitutes HAVE_WINSOCK2_H.
+AC_DEFUN([gl_PREREQ_SYS_H_WINSOCK2],
+[
+  m4_ifdef([gl_UNISTD_H_DEFAULTS], [AC_REQUIRE([gl_UNISTD_H_DEFAULTS])])
+  m4_ifdef([gl_SYS_IOCTL_H_DEFAULTS], [AC_REQUIRE([gl_SYS_IOCTL_H_DEFAULTS])])
+  AC_CHECK_HEADERS_ONCE([sys/socket.h])
+  if test $ac_cv_header_sys_socket_h != yes; then
+    dnl We cannot use AC_CHECK_HEADERS_ONCE here, because that would make
+    dnl the check for those headers unconditional; yet cygwin reports
+    dnl that the headers are present but cannot be compiled (since on
+    dnl cygwin, all socket information should come from sys/socket.h).
+    AC_CHECK_HEADERS([winsock2.h])
+  fi
+  if test "$ac_cv_header_winsock2_h" = yes; then
+    HAVE_WINSOCK2_H=1
+    UNISTD_H_HAVE_WINSOCK2_H=1
+    SYS_IOCTL_H_HAVE_WINSOCK2_H=1
+  else
+    HAVE_WINSOCK2_H=0
+  fi
+  AC_SUBST([HAVE_WINSOCK2_H])
+])
+
+# Common prerequisites of the <sys/socket.h> replacement and of the
+# <arpa/inet.h> replacement.
+# Sets and substitutes HAVE_WS2TCPIP_H.
+AC_DEFUN([gl_PREREQ_SYS_H_WS2TCPIP],
+[
+  AC_REQUIRE([gl_CHECK_SOCKET_HEADERS])
+  if test $ac_cv_header_sys_socket_h = yes; then
+    HAVE_WS2TCPIP_H=0
+  else
+    if test $ac_cv_header_ws2tcpip_h = yes; then
+      HAVE_WS2TCPIP_H=1
+    else
+      HAVE_WS2TCPIP_H=0
+    fi
+  fi
+  AC_SUBST([HAVE_WS2TCPIP_H])
+])
+
+AC_DEFUN([gl_SYS_SOCKET_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_SYS_SOCKET_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_SYS_SOCKET_H_DEFAULTS],
+[
+  GNULIB_SOCKET=0;      AC_SUBST([GNULIB_SOCKET])
+  GNULIB_CONNECT=0;     AC_SUBST([GNULIB_CONNECT])
+  GNULIB_ACCEPT=0;      AC_SUBST([GNULIB_ACCEPT])
+  GNULIB_BIND=0;        AC_SUBST([GNULIB_BIND])
+  GNULIB_GETPEERNAME=0; AC_SUBST([GNULIB_GETPEERNAME])
+  GNULIB_GETSOCKNAME=0; AC_SUBST([GNULIB_GETSOCKNAME])
+  GNULIB_GETSOCKOPT=0;  AC_SUBST([GNULIB_GETSOCKOPT])
+  GNULIB_LISTEN=0;      AC_SUBST([GNULIB_LISTEN])
+  GNULIB_RECV=0;        AC_SUBST([GNULIB_RECV])
+  GNULIB_SEND=0;        AC_SUBST([GNULIB_SEND])
+  GNULIB_RECVFROM=0;    AC_SUBST([GNULIB_RECVFROM])
+  GNULIB_SENDTO=0;      AC_SUBST([GNULIB_SENDTO])
+  GNULIB_SETSOCKOPT=0;  AC_SUBST([GNULIB_SETSOCKOPT])
+  GNULIB_SHUTDOWN=0;    AC_SUBST([GNULIB_SHUTDOWN])
+  GNULIB_ACCEPT4=0;     AC_SUBST([GNULIB_ACCEPT4])
+  HAVE_STRUCT_SOCKADDR_STORAGE=1; AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE])
+  HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY=1;
+                        AC_SUBST([HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY])
+  HAVE_SA_FAMILY_T=1;   AC_SUBST([HAVE_SA_FAMILY_T])
+  HAVE_ACCEPT4=1;       AC_SUBST([HAVE_ACCEPT4])
+])
diff --git a/m4/sys_types_h.m4 b/m4/sys_types_h.m4
new file mode 100644 (file)
index 0000000..be918dc
--- /dev/null
@@ -0,0 +1,60 @@
+# sys_types_h.m4 serial 9
+dnl Copyright (C) 2011-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN_ONCE([gl_SYS_TYPES_H],
+[
+  dnl Use sane struct stat types in OpenVMS 8.2 and later.
+  AC_DEFINE([_USE_STD_STAT], 1, [For standard stat data types on VMS.])
+
+  AC_REQUIRE([gl_SYS_TYPES_H_DEFAULTS])
+  gl_NEXT_HEADERS([sys/types.h])
+
+  dnl Ensure the type pid_t gets defined.
+  AC_REQUIRE([AC_TYPE_PID_T])
+
+  dnl Ensure the type mode_t gets defined.
+  AC_REQUIRE([AC_TYPE_MODE_T])
+
+  dnl Whether to override the 'off_t' type.
+  AC_REQUIRE([gl_TYPE_OFF_T])
+
+  dnl Whether to override the 'dev_t' and 'ino_t' types.
+  m4_ifdef([gl_WINDOWS_STAT_INODES], [
+    AC_REQUIRE([gl_WINDOWS_STAT_INODES])
+  ], [
+    WINDOWS_STAT_INODES=0
+  ])
+  AC_SUBST([WINDOWS_STAT_INODES])
+])
+
+AC_DEFUN([gl_SYS_TYPES_H_DEFAULTS],
+[
+])
+
+# This works around a buggy version in autoconf <= 2.69.
+# See <https://lists.gnu.org/r/autoconf/2016-08/msg00014.html>
+
+m4_version_prereq([2.70], [], [
+
+# This is taken from the following Autoconf patch:
+# https://git.savannah.gnu.org/cgit/autoconf.git/commit/?id=e17a30e987d7ee695fb4294a82d987ec3dc9b974
+
+m4_undefine([AC_HEADER_MAJOR])
+AC_DEFUN([AC_HEADER_MAJOR],
+[AC_CHECK_HEADERS_ONCE([sys/types.h])
+AC_CHECK_HEADER([sys/mkdev.h],
+  [AC_DEFINE([MAJOR_IN_MKDEV], [1],
+    [Define to 1 if `major', `minor', and `makedev' are declared in
+     <mkdev.h>.])])
+if test $ac_cv_header_sys_mkdev_h = no; then
+  AC_CHECK_HEADER([sys/sysmacros.h],
+    [AC_DEFINE([MAJOR_IN_SYSMACROS], [1],
+      [Define to 1 if `major', `minor', and `makedev' are declared in
+       <sysmacros.h>.])])
+fi
+])
+
+])
diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
new file mode 100644 (file)
index 0000000..7453866
--- /dev/null
@@ -0,0 +1,201 @@
+# unistd_h.m4 serial 76
+dnl Copyright (C) 2006-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Simon Josefsson, Bruno Haible.
+
+AC_DEFUN([gl_UNISTD_H],
+[
+  dnl Use AC_REQUIRE here, so that the default behavior below is expanded
+  dnl once only, before all statements that occur in other macros.
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+
+  gl_CHECK_NEXT_HEADERS([unistd.h])
+  if test $ac_cv_header_unistd_h = yes; then
+    HAVE_UNISTD_H=1
+  else
+    HAVE_UNISTD_H=0
+  fi
+  AC_SUBST([HAVE_UNISTD_H])
+
+  dnl Ensure the type pid_t gets defined.
+  AC_REQUIRE([AC_TYPE_PID_T])
+
+  dnl Determine WINDOWS_64_BIT_OFF_T.
+  AC_REQUIRE([gl_TYPE_OFF_T])
+
+  dnl Check for declarations of anything we want to poison if the
+  dnl corresponding gnulib module is not in use.
+  gl_WARN_ON_USE_PREPARE([[
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+/* Some systems declare various items in the wrong headers.  */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <fcntl.h>
+# include <stdio.h>
+# include <stdlib.h>
+# if defined _WIN32 && ! defined __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+    ]], [access chdir chown dup dup2 dup3 environ euidaccess faccessat fchdir
+    fchownat fdatasync fsync ftruncate getcwd getdomainname getdtablesize
+    getgroups gethostname getlogin getlogin_r getpagesize getpass
+    getusershell setusershell endusershell
+    group_member isatty lchown link linkat lseek pipe pipe2 pread pwrite
+    readlink readlinkat rmdir sethostname sleep symlink symlinkat
+    truncate ttyname_r unlink unlinkat usleep])
+])
+
+AC_DEFUN([gl_UNISTD_MODULE_INDICATOR],
+[
+  dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  gl_MODULE_INDICATOR_SET_VARIABLE([$1])
+  dnl Define it also as a C macro, for the benefit of the unit tests.
+  gl_MODULE_INDICATOR_FOR_TESTS([$1])
+])
+
+AC_DEFUN([gl_UNISTD_H_DEFAULTS],
+[
+  GNULIB_ACCESS=0;               AC_SUBST([GNULIB_ACCESS])
+  GNULIB_CHDIR=0;                AC_SUBST([GNULIB_CHDIR])
+  GNULIB_CHOWN=0;                AC_SUBST([GNULIB_CHOWN])
+  GNULIB_CLOSE=0;                AC_SUBST([GNULIB_CLOSE])
+  GNULIB_COPY_FILE_RANGE=0;      AC_SUBST([GNULIB_COPY_FILE_RANGE])
+  GNULIB_DUP=0;                  AC_SUBST([GNULIB_DUP])
+  GNULIB_DUP2=0;                 AC_SUBST([GNULIB_DUP2])
+  GNULIB_DUP3=0;                 AC_SUBST([GNULIB_DUP3])
+  GNULIB_ENVIRON=0;              AC_SUBST([GNULIB_ENVIRON])
+  GNULIB_EUIDACCESS=0;           AC_SUBST([GNULIB_EUIDACCESS])
+  GNULIB_FACCESSAT=0;            AC_SUBST([GNULIB_FACCESSAT])
+  GNULIB_FCHDIR=0;               AC_SUBST([GNULIB_FCHDIR])
+  GNULIB_FCHOWNAT=0;             AC_SUBST([GNULIB_FCHOWNAT])
+  GNULIB_FDATASYNC=0;            AC_SUBST([GNULIB_FDATASYNC])
+  GNULIB_FSYNC=0;                AC_SUBST([GNULIB_FSYNC])
+  GNULIB_FTRUNCATE=0;            AC_SUBST([GNULIB_FTRUNCATE])
+  GNULIB_GETCWD=0;               AC_SUBST([GNULIB_GETCWD])
+  GNULIB_GETDOMAINNAME=0;        AC_SUBST([GNULIB_GETDOMAINNAME])
+  GNULIB_GETDTABLESIZE=0;        AC_SUBST([GNULIB_GETDTABLESIZE])
+  GNULIB_GETGROUPS=0;            AC_SUBST([GNULIB_GETGROUPS])
+  GNULIB_GETHOSTNAME=0;          AC_SUBST([GNULIB_GETHOSTNAME])
+  GNULIB_GETLOGIN=0;             AC_SUBST([GNULIB_GETLOGIN])
+  GNULIB_GETLOGIN_R=0;           AC_SUBST([GNULIB_GETLOGIN_R])
+  GNULIB_GETPAGESIZE=0;          AC_SUBST([GNULIB_GETPAGESIZE])
+  GNULIB_GETPASS=0;              AC_SUBST([GNULIB_GETPASS])
+  GNULIB_GETUSERSHELL=0;         AC_SUBST([GNULIB_GETUSERSHELL])
+  GNULIB_GROUP_MEMBER=0;         AC_SUBST([GNULIB_GROUP_MEMBER])
+  GNULIB_ISATTY=0;               AC_SUBST([GNULIB_ISATTY])
+  GNULIB_LCHOWN=0;               AC_SUBST([GNULIB_LCHOWN])
+  GNULIB_LINK=0;                 AC_SUBST([GNULIB_LINK])
+  GNULIB_LINKAT=0;               AC_SUBST([GNULIB_LINKAT])
+  GNULIB_LSEEK=0;                AC_SUBST([GNULIB_LSEEK])
+  GNULIB_PIPE=0;                 AC_SUBST([GNULIB_PIPE])
+  GNULIB_PIPE2=0;                AC_SUBST([GNULIB_PIPE2])
+  GNULIB_PREAD=0;                AC_SUBST([GNULIB_PREAD])
+  GNULIB_PWRITE=0;               AC_SUBST([GNULIB_PWRITE])
+  GNULIB_READ=0;                 AC_SUBST([GNULIB_READ])
+  GNULIB_READLINK=0;             AC_SUBST([GNULIB_READLINK])
+  GNULIB_READLINKAT=0;           AC_SUBST([GNULIB_READLINKAT])
+  GNULIB_RMDIR=0;                AC_SUBST([GNULIB_RMDIR])
+  GNULIB_SETHOSTNAME=0;          AC_SUBST([GNULIB_SETHOSTNAME])
+  GNULIB_SLEEP=0;                AC_SUBST([GNULIB_SLEEP])
+  GNULIB_SYMLINK=0;              AC_SUBST([GNULIB_SYMLINK])
+  GNULIB_SYMLINKAT=0;            AC_SUBST([GNULIB_SYMLINKAT])
+  GNULIB_TRUNCATE=0;             AC_SUBST([GNULIB_TRUNCATE])
+  GNULIB_TTYNAME_R=0;            AC_SUBST([GNULIB_TTYNAME_R])
+  GNULIB_UNISTD_H_NONBLOCKING=0; AC_SUBST([GNULIB_UNISTD_H_NONBLOCKING])
+  GNULIB_UNISTD_H_SIGPIPE=0;     AC_SUBST([GNULIB_UNISTD_H_SIGPIPE])
+  GNULIB_UNLINK=0;               AC_SUBST([GNULIB_UNLINK])
+  GNULIB_UNLINKAT=0;             AC_SUBST([GNULIB_UNLINKAT])
+  GNULIB_USLEEP=0;               AC_SUBST([GNULIB_USLEEP])
+  GNULIB_WRITE=0;                AC_SUBST([GNULIB_WRITE])
+  dnl Assume proper GNU behavior unless another module says otherwise.
+  HAVE_CHOWN=1;           AC_SUBST([HAVE_CHOWN])
+  HAVE_COPY_FILE_RANGE=1; AC_SUBST([HAVE_COPY_FILE_RANGE])
+  HAVE_DUP2=1;            AC_SUBST([HAVE_DUP2])
+  HAVE_DUP3=1;            AC_SUBST([HAVE_DUP3])
+  HAVE_EUIDACCESS=1;      AC_SUBST([HAVE_EUIDACCESS])
+  HAVE_FACCESSAT=1;       AC_SUBST([HAVE_FACCESSAT])
+  HAVE_FCHDIR=1;          AC_SUBST([HAVE_FCHDIR])
+  HAVE_FCHOWNAT=1;        AC_SUBST([HAVE_FCHOWNAT])
+  HAVE_FDATASYNC=1;       AC_SUBST([HAVE_FDATASYNC])
+  HAVE_FSYNC=1;           AC_SUBST([HAVE_FSYNC])
+  HAVE_FTRUNCATE=1;       AC_SUBST([HAVE_FTRUNCATE])
+  HAVE_GETDTABLESIZE=1;   AC_SUBST([HAVE_GETDTABLESIZE])
+  HAVE_GETGROUPS=1;       AC_SUBST([HAVE_GETGROUPS])
+  HAVE_GETHOSTNAME=1;     AC_SUBST([HAVE_GETHOSTNAME])
+  HAVE_GETLOGIN=1;        AC_SUBST([HAVE_GETLOGIN])
+  HAVE_GETPAGESIZE=1;     AC_SUBST([HAVE_GETPAGESIZE])
+  HAVE_GETPASS=1;         AC_SUBST([HAVE_GETPASS])
+  HAVE_GROUP_MEMBER=1;    AC_SUBST([HAVE_GROUP_MEMBER])
+  HAVE_LCHOWN=1;          AC_SUBST([HAVE_LCHOWN])
+  HAVE_LINK=1;            AC_SUBST([HAVE_LINK])
+  HAVE_LINKAT=1;          AC_SUBST([HAVE_LINKAT])
+  HAVE_PIPE=1;            AC_SUBST([HAVE_PIPE])
+  HAVE_PIPE2=1;           AC_SUBST([HAVE_PIPE2])
+  HAVE_PREAD=1;           AC_SUBST([HAVE_PREAD])
+  HAVE_PWRITE=1;          AC_SUBST([HAVE_PWRITE])
+  HAVE_READLINK=1;        AC_SUBST([HAVE_READLINK])
+  HAVE_READLINKAT=1;      AC_SUBST([HAVE_READLINKAT])
+  HAVE_SETHOSTNAME=1;     AC_SUBST([HAVE_SETHOSTNAME])
+  HAVE_SLEEP=1;           AC_SUBST([HAVE_SLEEP])
+  HAVE_SYMLINK=1;         AC_SUBST([HAVE_SYMLINK])
+  HAVE_SYMLINKAT=1;       AC_SUBST([HAVE_SYMLINKAT])
+  HAVE_UNLINKAT=1;        AC_SUBST([HAVE_UNLINKAT])
+  HAVE_USLEEP=1;          AC_SUBST([HAVE_USLEEP])
+  HAVE_DECL_ENVIRON=1;    AC_SUBST([HAVE_DECL_ENVIRON])
+  HAVE_DECL_FCHDIR=1;     AC_SUBST([HAVE_DECL_FCHDIR])
+  HAVE_DECL_FDATASYNC=1;  AC_SUBST([HAVE_DECL_FDATASYNC])
+  HAVE_DECL_GETDOMAINNAME=1; AC_SUBST([HAVE_DECL_GETDOMAINNAME])
+  HAVE_DECL_GETLOGIN=1;   AC_SUBST([HAVE_DECL_GETLOGIN])
+  HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
+  HAVE_DECL_GETPAGESIZE=1; AC_SUBST([HAVE_DECL_GETPAGESIZE])
+  HAVE_DECL_GETUSERSHELL=1; AC_SUBST([HAVE_DECL_GETUSERSHELL])
+  HAVE_DECL_SETHOSTNAME=1; AC_SUBST([HAVE_DECL_SETHOSTNAME])
+  HAVE_DECL_TRUNCATE=1;   AC_SUBST([HAVE_DECL_TRUNCATE])
+  HAVE_DECL_TTYNAME_R=1;  AC_SUBST([HAVE_DECL_TTYNAME_R])
+  HAVE_OS_H=0;            AC_SUBST([HAVE_OS_H])
+  HAVE_SYS_PARAM_H=0;     AC_SUBST([HAVE_SYS_PARAM_H])
+  REPLACE_ACCESS=0;       AC_SUBST([REPLACE_ACCESS])
+  REPLACE_CHOWN=0;        AC_SUBST([REPLACE_CHOWN])
+  REPLACE_CLOSE=0;        AC_SUBST([REPLACE_CLOSE])
+  REPLACE_DUP=0;          AC_SUBST([REPLACE_DUP])
+  REPLACE_DUP2=0;         AC_SUBST([REPLACE_DUP2])
+  REPLACE_FACCESSAT=0;    AC_SUBST([REPLACE_FACCESSAT])
+  REPLACE_FCHOWNAT=0;     AC_SUBST([REPLACE_FCHOWNAT])
+  REPLACE_FTRUNCATE=0;    AC_SUBST([REPLACE_FTRUNCATE])
+  REPLACE_GETCWD=0;       AC_SUBST([REPLACE_GETCWD])
+  REPLACE_GETDOMAINNAME=0; AC_SUBST([REPLACE_GETDOMAINNAME])
+  REPLACE_GETDTABLESIZE=0; AC_SUBST([REPLACE_GETDTABLESIZE])
+  REPLACE_GETLOGIN_R=0;   AC_SUBST([REPLACE_GETLOGIN_R])
+  REPLACE_GETGROUPS=0;    AC_SUBST([REPLACE_GETGROUPS])
+  REPLACE_GETPAGESIZE=0;  AC_SUBST([REPLACE_GETPAGESIZE])
+  REPLACE_GETPASS=0;      AC_SUBST([REPLACE_GETPASS])
+  REPLACE_ISATTY=0;       AC_SUBST([REPLACE_ISATTY])
+  REPLACE_LCHOWN=0;       AC_SUBST([REPLACE_LCHOWN])
+  REPLACE_LINK=0;         AC_SUBST([REPLACE_LINK])
+  REPLACE_LINKAT=0;       AC_SUBST([REPLACE_LINKAT])
+  REPLACE_LSEEK=0;        AC_SUBST([REPLACE_LSEEK])
+  REPLACE_PREAD=0;        AC_SUBST([REPLACE_PREAD])
+  REPLACE_PWRITE=0;       AC_SUBST([REPLACE_PWRITE])
+  REPLACE_READ=0;         AC_SUBST([REPLACE_READ])
+  REPLACE_READLINK=0;     AC_SUBST([REPLACE_READLINK])
+  REPLACE_READLINKAT=0;   AC_SUBST([REPLACE_READLINKAT])
+  REPLACE_RMDIR=0;        AC_SUBST([REPLACE_RMDIR])
+  REPLACE_SLEEP=0;        AC_SUBST([REPLACE_SLEEP])
+  REPLACE_SYMLINK=0;      AC_SUBST([REPLACE_SYMLINK])
+  REPLACE_SYMLINKAT=0;    AC_SUBST([REPLACE_SYMLINKAT])
+  REPLACE_TRUNCATE=0;     AC_SUBST([REPLACE_TRUNCATE])
+  REPLACE_TTYNAME_R=0;    AC_SUBST([REPLACE_TTYNAME_R])
+  REPLACE_UNLINK=0;       AC_SUBST([REPLACE_UNLINK])
+  REPLACE_UNLINKAT=0;     AC_SUBST([REPLACE_UNLINKAT])
+  REPLACE_USLEEP=0;       AC_SUBST([REPLACE_USLEEP])
+  REPLACE_WRITE=0;        AC_SUBST([REPLACE_WRITE])
+  UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
+  UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
+                           AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
+])
diff --git a/m4/warn-on-use.m4 b/m4/warn-on-use.m4
new file mode 100644 (file)
index 0000000..5c8ee45
--- /dev/null
@@ -0,0 +1,51 @@
+# warn-on-use.m4 serial 6
+dnl Copyright (C) 2010-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# gl_WARN_ON_USE_PREPARE(INCLUDES, NAMES)
+# ---------------------------------------
+# If the module 'posixcheck' is in use:
+#
+# For each whitespace-separated element in the list of NAMES, define
+# HAVE_RAW_DECL_name if the function has a declaration among INCLUDES
+# even after being undefined as a macro.
+#
+# See warn-on-use.h for some hints on how to poison function names, as
+# well as ideas on poisoning global variables and macros.  NAMES may
+# include global variables, but remember that only functions work with
+# _GL_WARN_ON_USE.  Typically, INCLUDES only needs to list a single
+# header, but if the replacement header pulls in other headers because
+# some systems declare functions in the wrong header, then INCLUDES
+# should do likewise.
+#
+# It is generally safe to assume declarations for functions declared
+# in the intersection of C89 and C11 (such as printf) without
+# needing gl_WARN_ON_USE_PREPARE.
+AC_DEFUN([gl_WARN_ON_USE_PREPARE],
+[
+  m4_ifdef([gl_POSIXCHECK],
+    [m4_foreach_w([gl_decl], [$2],
+       [AH_TEMPLATE([HAVE_RAW_DECL_]AS_TR_CPP(m4_defn([gl_decl])),
+         [Define to 1 if ]m4_defn([gl_decl])[ is declared even after
+          undefining macros.])])dnl
+dnl FIXME: gl_Symbol must be used unquoted until we can assume
+dnl autoconf 2.64 or newer.
+     for gl_func in m4_flatten([$2]); do
+       AS_VAR_PUSHDEF([gl_Symbol], [gl_cv_have_raw_decl_$gl_func])dnl
+       AC_CACHE_CHECK([whether $gl_func is declared without a macro],
+         gl_Symbol,
+         [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([$1],
+[@%:@undef $gl_func
+  (void) $gl_func;])],
+           [AS_VAR_SET(gl_Symbol, [yes])], [AS_VAR_SET(gl_Symbol, [no])])])
+       AS_VAR_IF(gl_Symbol, [yes],
+         [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_RAW_DECL_$gl_func]), [1])
+          dnl shortcut - if the raw declaration exists, then set a cache
+          dnl variable to allow skipping any later AC_CHECK_DECL efforts
+          eval ac_cv_have_decl_$gl_func=yes])
+       AS_VAR_POPDEF([gl_Symbol])dnl
+     done
+    ])
+])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
new file mode 100644 (file)
index 0000000..e48d464
--- /dev/null
@@ -0,0 +1,24 @@
+# wchar_t.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2002-2003, 2008-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+  AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stddef.h>
+            wchar_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wchar_t=yes],
+       [gt_cv_c_wchar_t=no])])
+  if test $gt_cv_c_wchar_t = yes; then
+    AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+  fi
+])
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
new file mode 100644 (file)
index 0000000..877fd86
--- /dev/null
@@ -0,0 +1,74 @@
+# wint_t.m4 serial 7
+dnl Copyright (C) 2003, 2007-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type and whether gnulib's
+dnl <wchar.h> or <wctype.h> would, if present, override 'wint_t'.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+  AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+   before <wchar.h>.  */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+            wint_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wint_t=yes],
+       [gt_cv_c_wint_t=no])])
+  if test $gt_cv_c_wint_t = yes; then
+    AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+
+    dnl Determine whether gnulib's <wchar.h> or <wctype.h> would, if present,
+    dnl override 'wint_t'.
+    AC_CACHE_CHECK([whether wint_t is too small],
+      [gl_cv_type_wint_t_too_small],
+      [AC_COMPILE_IFELSE(
+           [AC_LANG_PROGRAM([[
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
+   included before <wchar.h>.  */
+#if !(defined __GLIBC__ && !defined __UCLIBC__)
+# include <stddef.h>
+# include <stdio.h>
+# include <time.h>
+#endif
+#include <wchar.h>
+              int verify[sizeof (wint_t) < sizeof (int) ? -1 : 1];
+              ]])],
+           [gl_cv_type_wint_t_too_small=no],
+           [gl_cv_type_wint_t_too_small=yes])])
+    if test $gl_cv_type_wint_t_too_small = yes; then
+      GNULIB_OVERRIDES_WINT_T=1
+    else
+      GNULIB_OVERRIDES_WINT_T=0
+    fi
+  else
+    GNULIB_OVERRIDES_WINT_T=0
+  fi
+  AC_SUBST([GNULIB_OVERRIDES_WINT_T])
+])
+
+dnl Prerequisites of the 'wint_t' override.
+AC_DEFUN([gl_TYPE_WINT_T_PREREQ],
+[
+  AC_CHECK_HEADERS_ONCE([crtdefs.h])
+  if test $ac_cv_header_crtdefs_h = yes; then
+    HAVE_CRTDEFS_H=1
+  else
+    HAVE_CRTDEFS_H=0
+  fi
+  AC_SUBST([HAVE_CRTDEFS_H])
+])
diff --git a/m4/xalloc.m4 b/m4/xalloc.m4
new file mode 100644 (file)
index 0000000..a556870
--- /dev/null
@@ -0,0 +1,7 @@
+# xalloc.m4 serial 18
+dnl Copyright (C) 2002-2006, 2009-2020 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XALLOC], [:])
diff --git a/main.c b/main.c
deleted file mode 100644 (file)
index fa8045f..0000000
--- a/main.c
+++ /dev/null
@@ -1,3479 +0,0 @@
-/* Argument parsing and main program of GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "os.h"
-#include "filedef.h"
-#include "dep.h"
-#include "variable.h"
-#include "job.h"
-#include "commands.h"
-#include "rule.h"
-#include "debug.h"
-#include "getopt.h"
-
-#include <assert.h>
-#ifdef _AMIGA
-# include <dos/dos.h>
-# include <proto/dos.h>
-#endif
-#ifdef WINDOWS32
-# include <windows.h>
-# include <io.h>
-# include "pathstuff.h"
-# include "sub_proc.h"
-# include "w32err.h"
-#endif
-#ifdef __EMX__
-# include <sys/types.h>
-# include <sys/wait.h>
-#endif
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-
-#ifdef _AMIGA
-int __stack = 20000; /* Make sure we have 20K of stack space */
-#endif
-#ifdef VMS
-int vms_use_mcr_command = 0;
-int vms_always_use_cmd_file = 0;
-int vms_gnv_shell = 0;
-int vms_legacy_behavior = 0;
-int vms_comma_separator = 0;
-int vms_unix_simulation = 0;
-int vms_report_unix_paths = 0;
-
-/* Evaluates if a VMS environment option is set, only look at first character */
-static int
-get_vms_env_flag (const char *name, int default_value)
-{
-char * value;
-char x;
-
-  value = getenv (name);
-  if (value == NULL)
-    return default_value;
-
-  x = toupper (value[0]);
-  switch (x)
-    {
-    case '1':
-    case 'T':
-    case 'E':
-      return 1;
-      break;
-    case '0':
-    case 'F':
-    case 'D':
-      return 0;
-    }
-}
-#endif
-
-#if defined HAVE_WAITPID || defined HAVE_WAIT3
-# define HAVE_WAIT_NOHANG
-#endif
-
-#ifndef HAVE_UNISTD_H
-int chdir ();
-#endif
-#ifndef STDC_HEADERS
-# ifndef sun                    /* Sun has an incorrect decl in a header.  */
-void exit (int) __attribute__ ((noreturn));
-# endif
-double atof ();
-#endif
-
-static void clean_jobserver (int status);
-static void print_data_base (void);
-static void print_version (void);
-static void decode_switches (int argc, const char **argv, int env);
-static void decode_env_switches (const char *envar, unsigned int len);
-static struct variable *define_makeflags (int all, int makefile);
-static char *quote_for_env (char *out, const char *in);
-static void initialize_global_hash_tables (void);
-
-\f
-/* The structure that describes an accepted command switch.  */
-
-struct command_switch
-  {
-    int c;                      /* The switch character.  */
-
-    enum                        /* Type of the value.  */
-      {
-        flag,                   /* Turn int flag on.  */
-        flag_off,               /* Turn int flag off.  */
-        string,                 /* One string per invocation.  */
-        strlist,                /* One string per switch.  */
-        filename,               /* A string containing a file name.  */
-        positive_int,           /* A positive integer.  */
-        floating,               /* A floating-point number (double).  */
-        ignore                  /* Ignored.  */
-      } type;
-
-    void *value_ptr;    /* Pointer to the value-holding variable.  */
-
-    unsigned int env:1;         /* Can come from MAKEFLAGS.  */
-    unsigned int toenv:1;       /* Should be put in MAKEFLAGS.  */
-    unsigned int no_makefile:1; /* Don't propagate when remaking makefiles.  */
-
-    const void *noarg_value;    /* Pointer to value used if no arg given.  */
-    const void *default_value;  /* Pointer to default value.  */
-
-    const char *long_name;      /* Long option name.  */
-  };
-
-/* True if C is a switch value that corresponds to a short option.  */
-
-#define short_option(c) ((c) <= CHAR_MAX)
-
-/* The structure used to hold the list of strings given
-   in command switches of a type that takes strlist arguments.  */
-
-struct stringlist
-  {
-    const char **list;  /* Nil-terminated list of strings.  */
-    unsigned int idx;   /* Index into above.  */
-    unsigned int max;   /* Number of pointers allocated.  */
-  };
-
-
-/* The recognized command switches.  */
-
-/* Nonzero means do extra verification (that may slow things down).  */
-
-int verify_flag;
-
-/* Nonzero means do not print commands to be executed (-s).  */
-
-int silent_flag;
-
-/* Nonzero means just touch the files
-   that would appear to need remaking (-t)  */
-
-int touch_flag;
-
-/* Nonzero means just print what commands would need to be executed,
-   don't actually execute them (-n).  */
-
-int just_print_flag;
-
-/* Print debugging info (--debug).  */
-
-static struct stringlist *db_flags = 0;
-static int debug_flag = 0;
-
-int db_level = 0;
-
-/* Synchronize output (--output-sync).  */
-
-char *output_sync_option = 0;
-
-#ifdef WINDOWS32
-/* Suspend make in main for a short time to allow debugger to attach */
-
-int suspend_flag = 0;
-#endif
-
-/* Environment variables override makefile definitions.  */
-
-int env_overrides = 0;
-
-/* Nonzero means ignore status codes returned by commands
-   executed to remake files.  Just treat them all as successful (-i).  */
-
-int ignore_errors_flag = 0;
-
-/* Nonzero means don't remake anything, just print the data base
-   that results from reading the makefile (-p).  */
-
-int print_data_base_flag = 0;
-
-/* Nonzero means don't remake anything; just return a nonzero status
-   if the specified targets are not up to date (-q).  */
-
-int question_flag = 0;
-
-/* Nonzero means do not use any of the builtin rules (-r) / variables (-R).  */
-
-int no_builtin_rules_flag = 0;
-int no_builtin_variables_flag = 0;
-
-/* Nonzero means keep going even if remaking some file fails (-k).  */
-
-int keep_going_flag;
-int default_keep_going_flag = 0;
-
-/* Nonzero means check symlink mtimes.  */
-
-int check_symlink_flag = 0;
-
-/* Nonzero means print directory before starting and when done (-w).  */
-
-int print_directory_flag = 0;
-
-/* Nonzero means ignore print_directory_flag and never print the directory.
-   This is necessary because print_directory_flag is set implicitly.  */
-
-int inhibit_print_directory_flag = 0;
-
-/* Nonzero means print version information.  */
-
-int print_version_flag = 0;
-
-/* List of makefiles given with -f switches.  */
-
-static struct stringlist *makefiles = 0;
-
-/* Size of the stack when we started.  */
-
-#ifdef SET_STACK_SIZE
-struct rlimit stack_limit;
-#endif
-
-
-/* Number of job slots for parallelism.  */
-
-unsigned int job_slots;
-
-#define INVALID_JOB_SLOTS (-1)
-static unsigned int master_job_slots = 0;
-static int arg_job_slots = INVALID_JOB_SLOTS;
-
-static const int default_job_slots = INVALID_JOB_SLOTS;
-
-/* Value of job_slots that means no limit.  */
-
-static const int inf_jobs = 0;
-
-/* Authorization for the jobserver.  */
-
-static char *jobserver_auth = NULL;
-
-/* Handle for the mutex used on Windows to synchronize output of our
-   children under -O.  */
-
-char *sync_mutex = NULL;
-
-/* Maximum load average at which multiple jobs will be run.
-   Negative values mean unlimited, while zero means limit to
-   zero load (which could be useful to start infinite jobs remotely
-   but one at a time locally).  */
-#ifndef NO_FLOAT
-double max_load_average = -1.0;
-double default_load_average = -1.0;
-#else
-int max_load_average = -1;
-int default_load_average = -1;
-#endif
-
-/* List of directories given with -C switches.  */
-
-static struct stringlist *directories = 0;
-
-/* List of include directories given with -I switches.  */
-
-static struct stringlist *include_directories = 0;
-
-/* List of files given with -o switches.  */
-
-static struct stringlist *old_files = 0;
-
-/* List of files given with -W switches.  */
-
-static struct stringlist *new_files = 0;
-
-/* List of strings to be eval'd.  */
-static struct stringlist *eval_strings = 0;
-
-/* If nonzero, we should just print usage and exit.  */
-
-static int print_usage_flag = 0;
-
-/* If nonzero, we should print a warning message
-   for each reference to an undefined variable.  */
-
-int warn_undefined_variables_flag;
-
-/* If nonzero, always build all targets, regardless of whether
-   they appear out of date or not.  */
-
-static int always_make_set = 0;
-int always_make_flag = 0;
-
-/* If nonzero, we're in the "try to rebuild makefiles" phase.  */
-
-int rebuilding_makefiles = 0;
-
-/* Remember the original value of the SHELL variable, from the environment.  */
-
-struct variable shell_var;
-
-/* This character introduces a command: it's the first char on the line.  */
-
-char cmd_prefix = '\t';
-
-\f
-/* The usage output.  We write it this way to make life easier for the
-   translators, especially those trying to translate to right-to-left
-   languages like Hebrew.  */
-
-static const char *const usage[] =
-  {
-    N_("Options:\n"),
-    N_("\
-  -b, -m                      Ignored for compatibility.\n"),
-    N_("\
-  -B, --always-make           Unconditionally make all targets.\n"),
-    N_("\
-  -C DIRECTORY, --directory=DIRECTORY\n\
-                              Change to DIRECTORY before doing anything.\n"),
-    N_("\
-  -d                          Print lots of debugging information.\n"),
-    N_("\
-  --debug[=FLAGS]             Print various types of debugging information.\n"),
-    N_("\
-  -e, --environment-overrides\n\
-                              Environment variables override makefiles.\n"),
-    N_("\
-  --eval=STRING               Evaluate STRING as a makefile statement.\n"),
-    N_("\
-  -f FILE, --file=FILE, --makefile=FILE\n\
-                              Read FILE as a makefile.\n"),
-    N_("\
-  -h, --help                  Print this message and exit.\n"),
-    N_("\
-  -i, --ignore-errors         Ignore errors from recipes.\n"),
-    N_("\
-  -I DIRECTORY, --include-dir=DIRECTORY\n\
-                              Search DIRECTORY for included makefiles.\n"),
-    N_("\
-  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.\n"),
-    N_("\
-  -k, --keep-going            Keep going when some targets can't be made.\n"),
-    N_("\
-  -l [N], --load-average[=N], --max-load[=N]\n\
-                              Don't start multiple jobs unless load is below N.\n"),
-    N_("\
-  -L, --check-symlink-times   Use the latest mtime between symlinks and target.\n"),
-    N_("\
-  -n, --just-print, --dry-run, --recon\n\
-                              Don't actually run any recipe; just print them.\n"),
-    N_("\
-  -o FILE, --old-file=FILE, --assume-old=FILE\n\
-                              Consider FILE to be very old and don't remake it.\n"),
-    N_("\
-  -O[TYPE], --output-sync[=TYPE]\n\
-                              Synchronize output of parallel jobs by TYPE.\n"),
-    N_("\
-  -p, --print-data-base       Print make's internal database.\n"),
-    N_("\
-  -q, --question              Run no recipe; exit status says if up to date.\n"),
-    N_("\
-  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"),
-    N_("\
-  -R, --no-builtin-variables  Disable the built-in variable settings.\n"),
-    N_("\
-  -s, --silent, --quiet       Don't echo recipes.\n"),
-    N_("\
-  -S, --no-keep-going, --stop\n\
-                              Turns off -k.\n"),
-    N_("\
-  -t, --touch                 Touch targets instead of remaking them.\n"),
-    N_("\
-  --trace                     Print tracing information.\n"),
-    N_("\
-  -v, --version               Print the version number of make and exit.\n"),
-    N_("\
-  -w, --print-directory       Print the current directory.\n"),
-    N_("\
-  --no-print-directory        Turn off -w, even if it was turned on implicitly.\n"),
-    N_("\
-  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n\
-                              Consider FILE to be infinitely new.\n"),
-    N_("\
-  --warn-undefined-variables  Warn when an undefined variable is referenced.\n"),
-    NULL
-  };
-
-/* The table of command switches.
-   Order matters here: this is the order MAKEFLAGS will be constructed.
-   So be sure all simple flags (single char, no argument) come first.  */
-
-static const struct command_switch switches[] =
-  {
-    { 'b', ignore, 0, 0, 0, 0, 0, 0, 0 },
-    { 'B', flag, &always_make_set, 1, 1, 0, 0, 0, "always-make" },
-    { 'd', flag, &debug_flag, 1, 1, 0, 0, 0, 0 },
-#ifdef WINDOWS32
-    { 'D', flag, &suspend_flag, 1, 1, 0, 0, 0, "suspend-for-debug" },
-#endif
-    { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", },
-    { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help" },
-    { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors" },
-    { 'k', flag, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
-      "keep-going" },
-    { 'L', flag, &check_symlink_flag, 1, 1, 0, 0, 0, "check-symlink-times" },
-    { 'm', ignore, 0, 0, 0, 0, 0, 0, 0 },
-    { 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, "just-print" },
-    { 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, "print-data-base" },
-    { 'q', flag, &question_flag, 1, 1, 1, 0, 0, "question" },
-    { 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, "no-builtin-rules" },
-    { 'R', flag, &no_builtin_variables_flag, 1, 1, 0, 0, 0,
-      "no-builtin-variables" },
-    { 's', flag, &silent_flag, 1, 1, 0, 0, 0, "silent" },
-    { 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
-      "no-keep-going" },
-    { 't', flag, &touch_flag, 1, 1, 1, 0, 0, "touch" },
-    { 'v', flag, &print_version_flag, 1, 1, 0, 0, 0, "version" },
-    { 'w', flag, &print_directory_flag, 1, 1, 0, 0, 0, "print-directory" },
-
-    /* These options take arguments.  */
-    { 'C', filename, &directories, 0, 0, 0, 0, 0, "directory" },
-    { 'f', filename, &makefiles, 0, 0, 0, 0, 0, "file" },
-    { 'I', filename, &include_directories, 1, 1, 0, 0, 0,
-      "include-dir" },
-    { 'j', positive_int, &arg_job_slots, 1, 1, 0, &inf_jobs, &default_job_slots,
-      "jobs" },
-#ifndef NO_FLOAT
-    { 'l', floating, &max_load_average, 1, 1, 0, &default_load_average,
-      &default_load_average, "load-average" },
-#else
-    { 'l', positive_int, &max_load_average, 1, 1, 0, &default_load_average,
-      &default_load_average, "load-average" },
-#endif
-    { 'o', filename, &old_files, 0, 0, 0, 0, 0, "old-file" },
-    { 'O', string, &output_sync_option, 1, 1, 0, "target", 0, "output-sync" },
-    { 'W', filename, &new_files, 0, 0, 0, 0, 0, "what-if" },
-
-    /* These are long-style options.  */
-    { CHAR_MAX+1, strlist, &db_flags, 1, 1, 0, "basic", 0, "debug" },
-    { CHAR_MAX+2, string, &jobserver_auth, 1, 1, 0, 0, 0, "jobserver-auth" },
-    { CHAR_MAX+3, flag, &trace_flag, 1, 1, 0, 0, 0, "trace" },
-    { CHAR_MAX+4, flag, &inhibit_print_directory_flag, 1, 1, 0, 0, 0,
-      "no-print-directory" },
-    { CHAR_MAX+5, flag, &warn_undefined_variables_flag, 1, 1, 0, 0, 0,
-      "warn-undefined-variables" },
-    { CHAR_MAX+6, strlist, &eval_strings, 1, 0, 0, 0, 0, "eval" },
-    { CHAR_MAX+7, string, &sync_mutex, 1, 1, 0, 0, 0, "sync-mutex" },
-    { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
-  };
-
-/* Secondary long names for options.  */
-
-static struct option long_option_aliases[] =
-  {
-    { "quiet",          no_argument,            0, 's' },
-    { "stop",           no_argument,            0, 'S' },
-    { "new-file",       required_argument,      0, 'W' },
-    { "assume-new",     required_argument,      0, 'W' },
-    { "assume-old",     required_argument,      0, 'o' },
-    { "max-load",       optional_argument,      0, 'l' },
-    { "dry-run",        no_argument,            0, 'n' },
-    { "recon",          no_argument,            0, 'n' },
-    { "makefile",       required_argument,      0, 'f' },
-  };
-
-/* List of goal targets.  */
-
-static struct goaldep *goals, *lastgoal;
-
-/* List of variables which were defined on the command line
-   (or, equivalently, in MAKEFLAGS).  */
-
-struct command_variable
-  {
-    struct command_variable *next;
-    struct variable *variable;
-  };
-static struct command_variable *command_variables;
-\f
-/* The name we were invoked with.  */
-
-#ifdef WINDOWS32
-/* On MS-Windows, we chop off the .exe suffix in 'main', so this
-   cannot be 'const'.  */
-char *program;
-#else
-const char *program;
-#endif
-
-/* Our current directory before processing any -C options.  */
-
-char *directory_before_chdir;
-
-/* Our current directory after processing all -C options.  */
-
-char *starting_directory;
-
-/* Value of the MAKELEVEL variable at startup (or 0).  */
-
-unsigned int makelevel;
-
-/* Pointer to the value of the .DEFAULT_GOAL special variable.
-   The value will be the name of the goal to remake if the command line
-   does not override it.  It can be set by the makefile, or else it's
-   the first target defined in the makefile whose name does not start
-   with '.'.  */
-
-struct variable * default_goal_var;
-
-/* Pointer to structure for the file .DEFAULT
-   whose commands are used for any file that has none of its own.
-   This is zero if the makefiles do not define .DEFAULT.  */
-
-struct file *default_file;
-
-/* Nonzero if we have seen the magic '.POSIX' target.
-   This turns on pedantic compliance with POSIX.2.  */
-
-int posix_pedantic;
-
-/* Nonzero if we have seen the '.SECONDEXPANSION' target.
-   This turns on secondary expansion of prerequisites.  */
-
-int second_expansion;
-
-/* Nonzero if we have seen the '.ONESHELL' target.
-   This causes the entire recipe to be handed to SHELL
-   as a single string, potentially containing newlines.  */
-
-int one_shell;
-
-/* One of OUTPUT_SYNC_* if the "--output-sync" option was given.  This
-   attempts to synchronize the output of parallel jobs such that the results
-   of each job stay together.  */
-
-int output_sync = OUTPUT_SYNC_NONE;
-
-/* Nonzero if the "--trace" option was given.  */
-
-int trace_flag = 0;
-
-/* Nonzero if we have seen the '.NOTPARALLEL' target.
-   This turns off parallel builds for this invocation of make.  */
-
-int not_parallel;
-
-/* Nonzero if some rule detected clock skew; we keep track so (a) we only
-   print one warning about it during the run, and (b) we can print a final
-   warning at the end of the run. */
-
-int clock_skew_detected;
-
-/* Map of possible stop characters for searching strings.  */
-#ifndef UCHAR_MAX
-# define UCHAR_MAX 255
-#endif
-unsigned short stopchar_map[UCHAR_MAX + 1] = {0};
-
-/* If output-sync is enabled we'll collect all the output generated due to
-   options, while reading makefiles, etc.  */
-
-struct output make_sync;
-
-\f
-/* Mask of signals that are being caught with fatal_error_signal.  */
-
-#ifdef POSIX
-sigset_t fatal_signal_set;
-#else
-# ifdef HAVE_SIGSETMASK
-int fatal_signal_mask;
-# endif
-#endif
-
-#if !HAVE_DECL_BSD_SIGNAL && !defined bsd_signal
-# if !defined HAVE_SIGACTION
-#  define bsd_signal signal
-# else
-typedef RETSIGTYPE (*bsd_signal_ret_t) (int);
-
-static bsd_signal_ret_t
-bsd_signal (int sig, bsd_signal_ret_t func)
-{
-  struct sigaction act, oact;
-  act.sa_handler = func;
-  act.sa_flags = SA_RESTART;
-  sigemptyset (&act.sa_mask);
-  sigaddset (&act.sa_mask, sig);
-  if (sigaction (sig, &act, &oact) != 0)
-    return SIG_ERR;
-  return oact.sa_handler;
-}
-# endif
-#endif
-
-static void
-initialize_global_hash_tables (void)
-{
-  init_hash_global_variable_set ();
-  strcache_init ();
-  init_hash_files ();
-  hash_init_directories ();
-  hash_init_function_table ();
-}
-
-/* This character map locate stop chars when parsing GNU makefiles.
-   Each element is true if we should stop parsing on that character.  */
-
-static void
-initialize_stopchar_map (void)
-{
-  int i;
-
-  stopchar_map[(int)'\0'] = MAP_NUL;
-  stopchar_map[(int)'#'] = MAP_COMMENT;
-  stopchar_map[(int)';'] = MAP_SEMI;
-  stopchar_map[(int)'='] = MAP_EQUALS;
-  stopchar_map[(int)':'] = MAP_COLON;
-  stopchar_map[(int)'%'] = MAP_PERCENT;
-  stopchar_map[(int)'|'] = MAP_PIPE;
-  stopchar_map[(int)'.'] = MAP_DOT | MAP_USERFUNC;
-  stopchar_map[(int)','] = MAP_COMMA;
-  stopchar_map[(int)'$'] = MAP_VARIABLE;
-
-  stopchar_map[(int)'-'] = MAP_USERFUNC;
-  stopchar_map[(int)'_'] = MAP_USERFUNC;
-
-  stopchar_map[(int)' '] = MAP_BLANK;
-  stopchar_map[(int)'\t'] = MAP_BLANK;
-
-  stopchar_map[(int)'/'] = MAP_DIRSEP;
-#if defined(VMS)
-  stopchar_map[(int)':'] |= MAP_DIRSEP;
-  stopchar_map[(int)']'] |= MAP_DIRSEP;
-  stopchar_map[(int)'>'] |= MAP_DIRSEP;
-#elif defined(HAVE_DOS_PATHS)
-  stopchar_map[(int)'\\'] |= MAP_DIRSEP;
-#endif
-
-  for (i = 1; i <= UCHAR_MAX; ++i)
-    {
-      if (isspace (i) && NONE_SET (stopchar_map[i], MAP_BLANK))
-        /* Don't mark blank characters as newline characters.  */
-        stopchar_map[i] |= MAP_NEWLINE;
-      else if (isalnum (i))
-        stopchar_map[i] |= MAP_USERFUNC;
-    }
-}
-
-static const char *
-expand_command_line_file (const char *name)
-{
-  const char *cp;
-  char *expanded = 0;
-
-  if (name[0] == '\0')
-    O (fatal, NILF, _("empty string invalid as file name"));
-
-  if (name[0] == '~')
-    {
-      expanded = tilde_expand (name);
-      if (expanded && expanded[0] != '\0')
-        name = expanded;
-    }
-
-  /* This is also done in parse_file_seq, so this is redundant
-     for names read from makefiles.  It is here for names passed
-     on the command line.  */
-  while (name[0] == '.' && name[1] == '/')
-    {
-      name += 2;
-      while (name[0] == '/')
-        /* Skip following slashes: ".//foo" is "foo", not "/foo".  */
-        ++name;
-    }
-
-  if (name[0] == '\0')
-    {
-      /* Nothing else but one or more "./", maybe plus slashes!  */
-      name = "./";
-    }
-
-  cp = strcache_add (name);
-
-  free (expanded);
-
-  return cp;
-}
-
-/* Toggle -d on receipt of SIGUSR1.  */
-
-#ifdef SIGUSR1
-static RETSIGTYPE
-debug_signal_handler (int sig UNUSED)
-{
-  db_level = db_level ? DB_NONE : DB_BASIC;
-}
-#endif
-
-static void
-decode_debug_flags (void)
-{
-  const char **pp;
-
-  if (debug_flag)
-    db_level = DB_ALL;
-
-  if (db_flags)
-    for (pp=db_flags->list; *pp; ++pp)
-      {
-        const char *p = *pp;
-
-        while (1)
-          {
-            switch (tolower (p[0]))
-              {
-              case 'a':
-                db_level |= DB_ALL;
-                break;
-              case 'b':
-                db_level |= DB_BASIC;
-                break;
-              case 'i':
-                db_level |= DB_BASIC | DB_IMPLICIT;
-                break;
-              case 'j':
-                db_level |= DB_JOBS;
-                break;
-              case 'm':
-                db_level |= DB_BASIC | DB_MAKEFILES;
-                break;
-              case 'n':
-                db_level = 0;
-                break;
-              case 'v':
-                db_level |= DB_BASIC | DB_VERBOSE;
-                break;
-              default:
-                OS (fatal, NILF,
-                    _("unknown debug level specification '%s'"), p);
-              }
-
-            while (*(++p) != '\0')
-              if (*p == ',' || *p == ' ')
-                {
-                  ++p;
-                  break;
-                }
-
-            if (*p == '\0')
-              break;
-          }
-      }
-
-  if (db_level)
-    verify_flag = 1;
-
-  if (! db_level)
-    debug_flag = 0;
-}
-
-static void
-decode_output_sync_flags (void)
-{
-#ifdef NO_OUTPUT_SYNC
-  output_sync = OUTPUT_SYNC_NONE;
-#else
-  if (output_sync_option)
-    {
-      if (streq (output_sync_option, "none"))
-        output_sync = OUTPUT_SYNC_NONE;
-      else if (streq (output_sync_option, "line"))
-        output_sync = OUTPUT_SYNC_LINE;
-      else if (streq (output_sync_option, "target"))
-        output_sync = OUTPUT_SYNC_TARGET;
-      else if (streq (output_sync_option, "recurse"))
-        output_sync = OUTPUT_SYNC_RECURSE;
-      else
-        OS (fatal, NILF,
-            _("unknown output-sync type '%s'"), output_sync_option);
-    }
-
-  if (sync_mutex)
-    RECORD_SYNC_MUTEX (sync_mutex);
-#endif
-}
-
-#ifdef WINDOWS32
-
-#ifndef NO_OUTPUT_SYNC
-
-/* This is called from start_job_command when it detects that
-   output_sync option is in effect.  The handle to the synchronization
-   mutex is passed, as a string, to sub-makes via the --sync-mutex
-   command-line argument.  */
-void
-prepare_mutex_handle_string (sync_handle_t handle)
-{
-  if (!sync_mutex)
-    {
-      /* Prepare the mutex handle string for our children.  */
-      /* 2 hex digits per byte + 2 characters for "0x" + null.  */
-      sync_mutex = xmalloc ((2 * sizeof (sync_handle_t)) + 2 + 1);
-      sprintf (sync_mutex, "0x%Ix", handle);
-      define_makeflags (1, 0);
-    }
-}
-
-#endif  /* NO_OUTPUT_SYNC */
-
-/*
- * HANDLE runtime exceptions by avoiding a requestor on the GUI. Capture
- * exception and print it to stderr instead.
- *
- * If ! DB_VERBOSE, just print a simple message and exit.
- * If DB_VERBOSE, print a more verbose message.
- * If compiled for DEBUG, let exception pass through to GUI so that
- *   debuggers can attach.
- */
-LONG WINAPI
-handle_runtime_exceptions (struct _EXCEPTION_POINTERS *exinfo)
-{
-  PEXCEPTION_RECORD exrec = exinfo->ExceptionRecord;
-  LPSTR cmdline = GetCommandLine ();
-  LPSTR prg = strtok (cmdline, " ");
-  CHAR errmsg[1024];
-#ifdef USE_EVENT_LOG
-  HANDLE hEventSource;
-  LPTSTR lpszStrings[1];
-#endif
-
-  if (! ISDB (DB_VERBOSE))
-    {
-      sprintf (errmsg,
-               _("%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"),
-               prg, exrec->ExceptionCode, exrec->ExceptionAddress);
-      fprintf (stderr, errmsg);
-      exit (255);
-    }
-
-  sprintf (errmsg,
-           _("\nUnhandled exception filter called from program %s\nExceptionCode = %lx\nExceptionFlags = %lx\nExceptionAddress = 0x%p\n"),
-           prg, exrec->ExceptionCode, exrec->ExceptionFlags,
-           exrec->ExceptionAddress);
-
-  if (exrec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION
-      && exrec->NumberParameters >= 2)
-    sprintf (&errmsg[strlen(errmsg)],
-             (exrec->ExceptionInformation[0]
-              ? _("Access violation: write operation at address 0x%p\n")
-              : _("Access violation: read operation at address 0x%p\n")),
-             (PVOID)exrec->ExceptionInformation[1]);
-
-  /* turn this on if we want to put stuff in the event log too */
-#ifdef USE_EVENT_LOG
-  hEventSource = RegisterEventSource (NULL, "GNU Make");
-  lpszStrings[0] = errmsg;
-
-  if (hEventSource != NULL)
-    {
-      ReportEvent (hEventSource,         /* handle of event source */
-                   EVENTLOG_ERROR_TYPE,  /* event type */
-                   0,                    /* event category */
-                   0,                    /* event ID */
-                   NULL,                 /* current user's SID */
-                   1,                    /* strings in lpszStrings */
-                   0,                    /* no bytes of raw data */
-                   lpszStrings,          /* array of error strings */
-                   NULL);                /* no raw data */
-
-      (VOID) DeregisterEventSource (hEventSource);
-    }
-#endif
-
-  /* Write the error to stderr too */
-  fprintf (stderr, errmsg);
-
-#ifdef DEBUG
-  return EXCEPTION_CONTINUE_SEARCH;
-#else
-  exit (255);
-  return (255); /* not reached */
-#endif
-}
-
-/*
- * On WIN32 systems we don't have the luxury of a /bin directory that
- * is mapped globally to every drive mounted to the system. Since make could
- * be invoked from any drive, and we don't want to propagate /bin/sh
- * to every single drive. Allow ourselves a chance to search for
- * a value for default shell here (if the default path does not exist).
- */
-
-int
-find_and_set_default_shell (const char *token)
-{
-  int sh_found = 0;
-  char *atoken = 0;
-  const char *search_token;
-  const char *tokend;
-  PATH_VAR(sh_path);
-  extern const char *default_shell;
-
-  if (!token)
-    search_token = default_shell;
-  else
-    search_token = atoken = xstrdup (token);
-
-  /* If the user explicitly requests the DOS cmd shell, obey that request.
-     However, make sure that's what they really want by requiring the value
-     of SHELL either equal, or have a final path element of, "cmd" or
-     "cmd.exe" case-insensitive.  */
-  tokend = search_token + strlen (search_token) - 3;
-  if (((tokend == search_token
-        || (tokend > search_token
-            && (tokend[-1] == '/' || tokend[-1] == '\\')))
-       && !strcasecmp (tokend, "cmd"))
-      || ((tokend - 4 == search_token
-           || (tokend - 4 > search_token
-               && (tokend[-5] == '/' || tokend[-5] == '\\')))
-          && !strcasecmp (tokend - 4, "cmd.exe")))
-    {
-      batch_mode_shell = 1;
-      unixy_shell = 0;
-      sprintf (sh_path, "%s", search_token);
-      default_shell = xstrdup (w32ify (sh_path, 0));
-      DB (DB_VERBOSE, (_("find_and_set_shell() setting default_shell = %s\n"),
-                       default_shell));
-      sh_found = 1;
-    }
-  else if (!no_default_sh_exe
-           && (token == NULL || !strcmp (search_token, default_shell)))
-    {
-      /* no new information, path already set or known */
-      sh_found = 1;
-    }
-  else if (_access (search_token, 0) == 0)
-    {
-      /* search token path was found */
-      sprintf (sh_path, "%s", search_token);
-      default_shell = xstrdup (w32ify (sh_path, 0));
-      DB (DB_VERBOSE, (_("find_and_set_shell() setting default_shell = %s\n"),
-                       default_shell));
-      sh_found = 1;
-    }
-  else
-    {
-      char *p;
-      struct variable *v = lookup_variable (STRING_SIZE_TUPLE ("PATH"));
-
-      /* Search Path for shell */
-      if (v && v->value)
-        {
-          char *ep;
-
-          p  = v->value;
-          ep = strchr (p, PATH_SEPARATOR_CHAR);
-
-          while (ep && *ep)
-            {
-              *ep = '\0';
-
-              sprintf (sh_path, "%s/%s", p, search_token);
-              if (_access (sh_path, 0) == 0)
-                {
-                  default_shell = xstrdup (w32ify (sh_path, 0));
-                  sh_found = 1;
-                  *ep = PATH_SEPARATOR_CHAR;
-
-                  /* terminate loop */
-                  p += strlen (p);
-                }
-              else
-                {
-                  *ep = PATH_SEPARATOR_CHAR;
-                  p = ++ep;
-                }
-
-              ep = strchr (p, PATH_SEPARATOR_CHAR);
-            }
-
-          /* be sure to check last element of Path */
-          if (p && *p)
-            {
-              sprintf (sh_path, "%s/%s", p, search_token);
-              if (_access (sh_path, 0) == 0)
-                {
-                  default_shell = xstrdup (w32ify (sh_path, 0));
-                  sh_found = 1;
-                }
-            }
-
-          if (sh_found)
-            DB (DB_VERBOSE,
-                (_("find_and_set_shell() path search set default_shell = %s\n"),
-                 default_shell));
-        }
-    }
-
-  /* naive test */
-  if (!unixy_shell && sh_found
-      && (strstr (default_shell, "sh") || strstr (default_shell, "SH")))
-    {
-      unixy_shell = 1;
-      batch_mode_shell = 0;
-    }
-
-#ifdef BATCH_MODE_ONLY_SHELL
-  batch_mode_shell = 1;
-#endif
-
-  free (atoken);
-
-  return (sh_found);
-}
-#endif  /* WINDOWS32 */
-
-#ifdef __MSDOS__
-static void
-msdos_return_to_initial_directory (void)
-{
-  if (directory_before_chdir)
-    chdir (directory_before_chdir);
-}
-#endif  /* __MSDOS__ */
-
-static void
-reset_jobserver (void)
-{
-  jobserver_clear ();
-  free (jobserver_auth);
-  jobserver_auth = NULL;
-}
-
-#ifdef _AMIGA
-int
-main (int argc, char **argv)
-#else
-int
-main (int argc, char **argv, char **envp)
-#endif
-{
-  static char *stdin_nm = 0;
-  int makefile_status = MAKE_SUCCESS;
-  struct goaldep *read_files;
-  PATH_VAR (current_directory);
-  unsigned int restarts = 0;
-  unsigned int syncing = 0;
-  int argv_slots;
-#ifdef WINDOWS32
-  const char *unix_path = NULL;
-  const char *windows32_path = NULL;
-
-  SetUnhandledExceptionFilter (handle_runtime_exceptions);
-
-  /* start off assuming we have no shell */
-  unixy_shell = 0;
-  no_default_sh_exe = 1;
-#endif
-
-  output_init (&make_sync);
-
-  initialize_stopchar_map();
-
-#ifdef SET_STACK_SIZE
- /* Get rid of any avoidable limit on stack size.  */
-  {
-    struct rlimit rlim;
-
-    /* Set the stack limit huge so that alloca does not fail.  */
-    if (getrlimit (RLIMIT_STACK, &rlim) == 0
-        && rlim.rlim_cur > 0 && rlim.rlim_cur < rlim.rlim_max)
-      {
-        stack_limit = rlim;
-        rlim.rlim_cur = rlim.rlim_max;
-        setrlimit (RLIMIT_STACK, &rlim);
-      }
-    else
-      stack_limit.rlim_cur = 0;
-  }
-#endif
-
-  /* Needed for OS/2 */
-  initialize_main (&argc, &argv);
-
-#ifdef MAKE_MAINTAINER_MODE
-  /* In maintainer mode we always enable verification.  */
-  verify_flag = 1;
-#endif
-
-#if defined (__MSDOS__) && !defined (_POSIX_SOURCE)
-  /* Request the most powerful version of 'system', to
-     make up for the dumb default shell.  */
-  __system_flags = (__system_redirect
-                    | __system_use_shell
-                    | __system_allow_multiple_cmds
-                    | __system_allow_long_cmds
-                    | __system_handle_null_commands
-                    | __system_emulate_chdir);
-
-#endif
-
-  /* Set up gettext/internationalization support.  */
-  setlocale (LC_ALL, "");
-  /* The cast to void shuts up compiler warnings on systems that
-     disable NLS.  */
-  (void)bindtextdomain (PACKAGE, LOCALEDIR);
-  (void)textdomain (PACKAGE);
-
-#ifdef  POSIX
-  sigemptyset (&fatal_signal_set);
-#define ADD_SIG(sig)    sigaddset (&fatal_signal_set, sig)
-#else
-#ifdef  HAVE_SIGSETMASK
-  fatal_signal_mask = 0;
-#define ADD_SIG(sig)    fatal_signal_mask |= sigmask (sig)
-#else
-#define ADD_SIG(sig)    (void)sig
-#endif
-#endif
-
-#define FATAL_SIG(sig)                                                        \
-  if (bsd_signal (sig, fatal_error_signal) == SIG_IGN)                        \
-    bsd_signal (sig, SIG_IGN);                                                \
-  else                                                                        \
-    ADD_SIG (sig);
-
-#ifdef SIGHUP
-  FATAL_SIG (SIGHUP);
-#endif
-#ifdef SIGQUIT
-  FATAL_SIG (SIGQUIT);
-#endif
-  FATAL_SIG (SIGINT);
-  FATAL_SIG (SIGTERM);
-
-#ifdef __MSDOS__
-  /* Windows 9X delivers FP exceptions in child programs to their
-     parent!  We don't want Make to die when a child divides by zero,
-     so we work around that lossage by catching SIGFPE.  */
-  FATAL_SIG (SIGFPE);
-#endif
-
-#ifdef  SIGDANGER
-  FATAL_SIG (SIGDANGER);
-#endif
-#ifdef SIGXCPU
-  FATAL_SIG (SIGXCPU);
-#endif
-#ifdef SIGXFSZ
-  FATAL_SIG (SIGXFSZ);
-#endif
-
-#undef  FATAL_SIG
-
-  /* Do not ignore the child-death signal.  This must be done before
-     any children could possibly be created; otherwise, the wait
-     functions won't work on systems with the SVR4 ECHILD brain
-     damage, if our invoker is ignoring this signal.  */
-
-#ifdef HAVE_WAIT_NOHANG
-# if defined SIGCHLD
-  (void) bsd_signal (SIGCHLD, SIG_DFL);
-# endif
-# if defined SIGCLD && SIGCLD != SIGCHLD
-  (void) bsd_signal (SIGCLD, SIG_DFL);
-# endif
-#endif
-
-  output_init (NULL);
-
-  /* Figure out where this program lives.  */
-
-  if (argv[0] == 0)
-    argv[0] = (char *)"";
-  if (argv[0][0] == '\0')
-    program = "make";
-  else
-    {
-      program = strrchr (argv[0], '/');
-#if defined(__MSDOS__) || defined(__EMX__)
-      if (program == 0)
-        program = strrchr (argv[0], '\\');
-      else
-        {
-          /* Some weird environments might pass us argv[0] with
-             both kinds of slashes; we must find the rightmost.  */
-          char *p = strrchr (argv[0], '\\');
-          if (p && p > program)
-            program = p;
-        }
-      if (program == 0 && argv[0][1] == ':')
-        program = argv[0] + 1;
-#endif
-#ifdef WINDOWS32
-      if (program == 0)
-        {
-          /* Extract program from full path */
-          program = strrchr (argv[0], '\\');
-          if (program)
-            {
-              int argv0_len = strlen (program);
-              if (argv0_len > 4 && streq (&program[argv0_len - 4], ".exe"))
-                /* Remove .exe extension */
-                program[argv0_len - 4] = '\0';
-            }
-        }
-#endif
-#ifdef VMS
-      set_program_name (argv[0]);
-      program = program_name;
-      {
-        const char *shell;
-        char pwdbuf[256];
-        char *pwd;
-        shell = getenv ("SHELL");
-        if (shell != NULL)
-          vms_gnv_shell = 1;
-
-        /* Need to know if CRTL set to report UNIX paths.  Use getcwd as
-           it works on all versions of VMS. */
-        pwd = getcwd(pwdbuf, 256);
-        if (pwd[0] == '/')
-          vms_report_unix_paths = 1;
-
-        vms_use_mcr_command = get_vms_env_flag ("GNV$MAKE_USE_MCR", 0);
-
-        vms_always_use_cmd_file = get_vms_env_flag ("GNV$MAKE_USE_CMD_FILE", 0);
-
-        /* Legacy behavior is on VMS is older behavior that needed to be
-           changed to be compatible with standard make behavior.
-           For now only completely disable when running under a Bash shell.
-           TODO: Update VMS built in recipes and macros to not need this
-           behavior, at which time the default may change. */
-        vms_legacy_behavior = get_vms_env_flag ("GNV$MAKE_OLD_VMS",
-                                                !vms_gnv_shell);
-
-        /* VMS was changed to use a comma separator in the past, but that is
-           incompatible with built in functions that expect space separated
-           lists.  Allow this to be selectively turned off. */
-        vms_comma_separator = get_vms_env_flag ("GNV$MAKE_COMMA",
-                                                vms_legacy_behavior);
-
-        /* Some Posix shell syntax options are incompatible with VMS syntax.
-           VMS requires double quotes for strings and escapes quotes
-           differently.  When this option is active, VMS will try
-           to simulate Posix shell simulations instead of using
-           VMS DCL behavior. */
-        vms_unix_simulation = get_vms_env_flag ("GNV$MAKE_SHELL_SIM",
-                                                !vms_legacy_behavior);
-
-      }
-      if (need_vms_symbol () && !vms_use_mcr_command)
-        create_foreign_command (program_name, argv[0]);
-#else
-      if (program == 0)
-        program = argv[0];
-      else
-        ++program;
-#endif
-    }
-
-  /* Set up to access user data (files).  */
-  user_access ();
-
-  initialize_global_hash_tables ();
-
-  /* Figure out where we are.  */
-
-#ifdef WINDOWS32
-  if (getcwd_fs (current_directory, GET_PATH_MAX) == 0)
-#else
-  if (getcwd (current_directory, GET_PATH_MAX) == 0)
-#endif
-    {
-#ifdef  HAVE_GETCWD
-      perror_with_name ("getcwd", "");
-#else
-      OS (error, NILF, "getwd: %s", current_directory);
-#endif
-      current_directory[0] = '\0';
-      directory_before_chdir = 0;
-    }
-  else
-    directory_before_chdir = xstrdup (current_directory);
-
-#ifdef  __MSDOS__
-  /* Make sure we will return to the initial directory, come what may.  */
-  atexit (msdos_return_to_initial_directory);
-#endif
-
-  /* Initialize the special variables.  */
-  define_variable_cname (".VARIABLES", "", o_default, 0)->special = 1;
-  /* define_variable_cname (".TARGETS", "", o_default, 0)->special = 1; */
-  define_variable_cname (".RECIPEPREFIX", "", o_default, 0)->special = 1;
-  define_variable_cname (".SHELLFLAGS", "-c", o_default, 0);
-  define_variable_cname (".LOADED", "", o_default, 0);
-
-  /* Set up .FEATURES
-     Use a separate variable because define_variable_cname() is a macro and
-     some compilers (MSVC) don't like conditionals in macros.  */
-  {
-    const char *features = "target-specific order-only second-expansion"
-                           " else-if shortest-stem undefine oneshell"
-#ifndef NO_ARCHIVES
-                           " archives"
-#endif
-#ifdef MAKE_JOBSERVER
-                           " jobserver"
-#endif
-#ifndef NO_OUTPUT_SYNC
-                           " output-sync"
-#endif
-#ifdef MAKE_SYMLINKS
-                           " check-symlink"
-#endif
-#ifdef HAVE_GUILE
-                           " guile"
-#endif
-#ifdef MAKE_LOAD
-                           " load"
-#endif
-                           ;
-
-    define_variable_cname (".FEATURES", features, o_default, 0);
-  }
-
-  /* Configure GNU Guile support */
-  guile_gmake_setup (NILF);
-
-  /* Read in variables from the environment.  It is important that this be
-     done before $(MAKE) is figured out so its definitions will not be
-     from the environment.  */
-
-#ifndef _AMIGA
-  {
-    unsigned int i;
-
-    for (i = 0; envp[i] != 0; ++i)
-      {
-        struct variable *v;
-        const char *ep = envp[i];
-        /* By default, export all variables culled from the environment.  */
-        enum variable_export export = v_export;
-        unsigned int len;
-
-        while (! STOP_SET (*ep, MAP_EQUALS))
-          ++ep;
-
-        /* If there's no equals sign it's a malformed environment.  Ignore.  */
-        if (*ep == '\0')
-          continue;
-
-#ifdef WINDOWS32
-        if (!unix_path && strneq (envp[i], "PATH=", 5))
-          unix_path = ep+1;
-        else if (!strnicmp (envp[i], "Path=", 5))
-          {
-            if (!windows32_path)
-              windows32_path = ep+1;
-            /* PATH gets defined after the loop exits.  */
-            continue;
-          }
-#endif
-
-        /* Length of the variable name, and skip the '='.  */
-        len = ep++ - envp[i];
-
-        /* If this is MAKE_RESTARTS, check to see if the "already printed
-           the enter statement" flag is set.  */
-        if (len == 13 && strneq (envp[i], "MAKE_RESTARTS", 13))
-          {
-            if (*ep == '-')
-              {
-                OUTPUT_TRACED ();
-                ++ep;
-              }
-            restarts = (unsigned int) atoi (ep);
-            export = v_noexport;
-          }
-
-        v = define_variable (envp[i], len, ep, o_env, 1);
-
-        /* POSIX says the value of SHELL set in the makefile won't change the
-           value of SHELL given to subprocesses.  */
-        if (streq (v->name, "SHELL"))
-          {
-#ifndef __MSDOS__
-            export = v_noexport;
-#endif
-            shell_var.name = xstrdup ("SHELL");
-            shell_var.length = 5;
-            shell_var.value = xstrdup (ep);
-          }
-
-        v->export = export;
-      }
-  }
-#ifdef WINDOWS32
-    /* If we didn't find a correctly spelled PATH we define PATH as
-     * either the first misspelled value or an empty string
-     */
-    if (!unix_path)
-      define_variable_cname ("PATH", windows32_path ? windows32_path : "",
-                             o_env, 1)->export = v_export;
-#endif
-#else /* For Amiga, read the ENV: device, ignoring all dirs */
-    {
-        BPTR env, file, old;
-        char buffer[1024];
-        int len;
-        __aligned struct FileInfoBlock fib;
-
-        env = Lock ("ENV:", ACCESS_READ);
-        if (env)
-          {
-            old = CurrentDir (DupLock (env));
-            Examine (env, &fib);
-
-            while (ExNext (env, &fib))
-              {
-                if (fib.fib_DirEntryType < 0) /* File */
-                  {
-                    /* Define an empty variable. It will be filled in
-                       variable_lookup(). Makes startup quite a bit faster. */
-                    define_variable (fib.fib_FileName,
-                                     strlen (fib.fib_FileName),
-                                     "", o_env, 1)->export = v_export;
-                  }
-              }
-            UnLock (env);
-            UnLock (CurrentDir (old));
-          }
-    }
-#endif
-
-  /* Decode the switches.  */
-  decode_env_switches (STRING_SIZE_TUPLE ("GNUMAKEFLAGS"));
-
-  /* Clear GNUMAKEFLAGS to avoid duplication.  */
-  define_variable_cname ("GNUMAKEFLAGS", "", o_env, 0);
-
-  decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS"));
-
-#if 0
-  /* People write things like:
-        MFLAGS="CC=gcc -pipe" "CFLAGS=-g"
-     and we set the -p, -i and -e switches.  Doesn't seem quite right.  */
-  decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS"));
-#endif
-
-  /* In output sync mode we need to sync any output generated by reading the
-     makefiles, such as in $(info ...) or stderr from $(shell ...) etc.  */
-
-  syncing = make_sync.syncout = (output_sync == OUTPUT_SYNC_LINE
-                                 || output_sync == OUTPUT_SYNC_TARGET);
-  OUTPUT_SET (&make_sync);
-
-  /* Remember the job slots set through the environment vs. command line.  */
-  {
-    int env_slots = arg_job_slots;
-    arg_job_slots = INVALID_JOB_SLOTS;
-
-    decode_switches (argc, (const char **)argv, 0);
-    argv_slots = arg_job_slots;
-
-    if (arg_job_slots == INVALID_JOB_SLOTS)
-      arg_job_slots = env_slots;
-  }
-
-  /* Set a variable specifying whether stdout/stdin is hooked to a TTY.  */
-#ifdef HAVE_ISATTY
-  if (isatty (fileno (stdout)))
-    if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMOUT")))
-      {
-        const char *tty = TTYNAME (fileno (stdout));
-        define_variable_cname ("MAKE_TERMOUT", tty ? tty : DEFAULT_TTYNAME,
-                               o_default, 0)->export = v_export;
-      }
-  if (isatty (fileno (stderr)))
-    if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMERR")))
-      {
-        const char *tty = TTYNAME (fileno (stderr));
-        define_variable_cname ("MAKE_TERMERR", tty ? tty : DEFAULT_TTYNAME,
-                               o_default, 0)->export = v_export;
-      }
-#endif
-
-  /* Reset in case the switches changed our minds.  */
-  syncing = (output_sync == OUTPUT_SYNC_LINE
-             || output_sync == OUTPUT_SYNC_TARGET);
-
-  if (make_sync.syncout && ! syncing)
-    output_close (&make_sync);
-
-  make_sync.syncout = syncing;
-  OUTPUT_SET (&make_sync);
-
-  /* Figure out the level of recursion.  */
-  {
-    struct variable *v = lookup_variable (STRING_SIZE_TUPLE (MAKELEVEL_NAME));
-    if (v && v->value[0] != '\0' && v->value[0] != '-')
-      makelevel = (unsigned int) atoi (v->value);
-    else
-      makelevel = 0;
-  }
-
-#ifdef WINDOWS32
-  if (suspend_flag)
-    {
-      fprintf (stderr, "%s (pid = %ld)\n", argv[0], GetCurrentProcessId ());
-      fprintf (stderr, _("%s is suspending for 30 seconds..."), argv[0]);
-      Sleep (30 * 1000);
-      fprintf (stderr, _("done sleep(30). Continuing.\n"));
-    }
-#endif
-
-  /* Set always_make_flag if -B was given and we've not restarted already.  */
-  always_make_flag = always_make_set && (restarts == 0);
-
-  /* Print version information, and exit.  */
-  if (print_version_flag)
-    {
-      print_version ();
-      die (MAKE_SUCCESS);
-    }
-
-  if (ISDB (DB_BASIC))
-    print_version ();
-
-#ifndef VMS
-  /* Set the "MAKE_COMMAND" variable to the name we were invoked with.
-     (If it is a relative pathname with a slash, prepend our directory name
-     so the result will run the same program regardless of the current dir.
-     If it is a name with no slash, we can only hope that PATH did not
-     find it in the current directory.)  */
-#ifdef WINDOWS32
-  /*
-   * Convert from backslashes to forward slashes for
-   * programs like sh which don't like them. Shouldn't
-   * matter if the path is one way or the other for
-   * CreateProcess().
-   */
-  if (strpbrk (argv[0], "/:\\") || strstr (argv[0], "..")
-      || strneq (argv[0], "//", 2))
-    argv[0] = xstrdup (w32ify (argv[0], 1));
-#else /* WINDOWS32 */
-#if defined (__MSDOS__) || defined (__EMX__)
-  if (strchr (argv[0], '\\'))
-    {
-      char *p;
-
-      argv[0] = xstrdup (argv[0]);
-      for (p = argv[0]; *p; p++)
-        if (*p == '\\')
-          *p = '/';
-    }
-  /* If argv[0] is not in absolute form, prepend the current
-     directory.  This can happen when Make is invoked by another DJGPP
-     program that uses a non-absolute name.  */
-  if (current_directory[0] != '\0'
-      && argv[0] != 0
-      && (argv[0][0] != '/' && (argv[0][0] == '\0' || argv[0][1] != ':'))
-# ifdef __EMX__
-      /* do not prepend cwd if argv[0] contains no '/', e.g. "make" */
-      && (strchr (argv[0], '/') != 0 || strchr (argv[0], '\\') != 0)
-# endif
-      )
-    argv[0] = xstrdup (concat (3, current_directory, "/", argv[0]));
-#else  /* !__MSDOS__ */
-  if (current_directory[0] != '\0'
-      && argv[0] != 0 && argv[0][0] != '/' && strchr (argv[0], '/') != 0
-#ifdef HAVE_DOS_PATHS
-      && (argv[0][0] != '\\' && (!argv[0][0] || argv[0][1] != ':'))
-      && strchr (argv[0], '\\') != 0
-#endif
-      )
-    argv[0] = xstrdup (concat (3, current_directory, "/", argv[0]));
-#endif /* !__MSDOS__ */
-#endif /* WINDOWS32 */
-#endif
-
-  /* We may move, but until we do, here we are.  */
-  starting_directory = current_directory;
-
-  /* Set up the job_slots value and the jobserver.  This can't be usefully set
-     in the makefile, and we want to verify the authorization is valid before
-     make has a chance to start using it for something else.  */
-
-  if (jobserver_auth)
-    {
-      if (argv_slots == INVALID_JOB_SLOTS)
-        {
-          if (jobserver_parse_auth (jobserver_auth))
-            {
-              /* Success!  Use the jobserver.  */
-              job_slots = 0;
-              goto job_setup_complete;
-            }
-
-          O (error, NILF, _("warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."));
-          arg_job_slots = 1;
-        }
-
-      /* The user provided a -j setting on the command line: use it.  */
-      else if (!restarts)
-        /* If restarts is >0 we already printed this message.  */
-        O (error, NILF,
-           _("warning: -jN forced in submake: disabling jobserver mode."));
-
-      /* We failed to use our parent's jobserver.  */
-      reset_jobserver ();
-      job_slots = (unsigned int)arg_job_slots;
-    }
-  else if (arg_job_slots == INVALID_JOB_SLOTS)
-    /* The default is one job at a time.  */
-    job_slots = 1;
-  else
-    /* Use whatever was provided.  */
-    job_slots = (unsigned int)arg_job_slots;
-
- job_setup_complete:
-
-  /* The extra indirection through $(MAKE_COMMAND) is done
-     for hysterical raisins.  */
-
-#ifdef VMS
-  if (vms_use_mcr_command)
-    define_variable_cname ("MAKE_COMMAND", vms_command (argv[0]), o_default, 0);
-  else
-    define_variable_cname ("MAKE_COMMAND", program, o_default, 0);
-#else
-  define_variable_cname ("MAKE_COMMAND", argv[0], o_default, 0);
-#endif
-  define_variable_cname ("MAKE", "$(MAKE_COMMAND)", o_default, 1);
-
-  if (command_variables != 0)
-    {
-      struct command_variable *cv;
-      struct variable *v;
-      unsigned int len = 0;
-      char *value, *p;
-
-      /* Figure out how much space will be taken up by the command-line
-         variable definitions.  */
-      for (cv = command_variables; cv != 0; cv = cv->next)
-        {
-          v = cv->variable;
-          len += 2 * strlen (v->name);
-          if (! v->recursive)
-            ++len;
-          ++len;
-          len += 2 * strlen (v->value);
-          ++len;
-        }
-
-      /* Now allocate a buffer big enough and fill it.  */
-      p = value = alloca (len);
-      for (cv = command_variables; cv != 0; cv = cv->next)
-        {
-          v = cv->variable;
-          p = quote_for_env (p, v->name);
-          if (! v->recursive)
-            *p++ = ':';
-          *p++ = '=';
-          p = quote_for_env (p, v->value);
-          *p++ = ' ';
-        }
-      p[-1] = '\0';             /* Kill the final space and terminate.  */
-
-      /* Define an unchangeable variable with a name that no POSIX.2
-         makefile could validly use for its own variable.  */
-      define_variable_cname ("-*-command-variables-*-", value, o_automatic, 0);
-
-      /* Define the variable; this will not override any user definition.
-         Normally a reference to this variable is written into the value of
-         MAKEFLAGS, allowing the user to override this value to affect the
-         exported value of MAKEFLAGS.  In POSIX-pedantic mode, we cannot
-         allow the user's setting of MAKEOVERRIDES to affect MAKEFLAGS, so
-         a reference to this hidden variable is written instead. */
-      define_variable_cname ("MAKEOVERRIDES", "${-*-command-variables-*-}",
-                             o_env, 1);
-#ifdef VMS
-      vms_export_dcl_symbol ("MAKEOVERRIDES", "${-*-command-variables-*-}");
-#endif
-    }
-
-  /* If there were -C flags, move ourselves about.  */
-  if (directories != 0)
-    {
-      unsigned int i;
-      for (i = 0; directories->list[i] != 0; ++i)
-        {
-          const char *dir = directories->list[i];
-#ifdef WINDOWS32
-          /* WINDOWS32 chdir() doesn't work if the directory has a trailing '/'
-             But allow -C/ just in case someone wants that.  */
-          {
-            char *p = (char *)dir + strlen (dir) - 1;
-            while (p > dir && (p[0] == '/' || p[0] == '\\'))
-              --p;
-            p[1] = '\0';
-          }
-#endif
-          if (chdir (dir) < 0)
-            pfatal_with_name (dir);
-        }
-    }
-
-#ifdef WINDOWS32
-  /*
-   * THIS BLOCK OF CODE MUST COME AFTER chdir() CALL ABOVE IN ORDER
-   * TO NOT CONFUSE THE DEPENDENCY CHECKING CODE IN implicit.c.
-   *
-   * The functions in dir.c can incorrectly cache information for "."
-   * before we have changed directory and this can cause file
-   * lookups to fail because the current directory (.) was pointing
-   * at the wrong place when it was first evaluated.
-   */
-   no_default_sh_exe = !find_and_set_default_shell (NULL);
-#endif /* WINDOWS32 */
-
-  /* Except under -s, always do -w in sub-makes and under -C.  */
-  if (!silent_flag && (directories != 0 || makelevel > 0))
-    print_directory_flag = 1;
-
-  /* Let the user disable that with --no-print-directory.  */
-  if (inhibit_print_directory_flag)
-    print_directory_flag = 0;
-
-  /* If -R was given, set -r too (doesn't make sense otherwise!)  */
-  if (no_builtin_variables_flag)
-    no_builtin_rules_flag = 1;
-
-  /* Construct the list of include directories to search.  */
-
-  construct_include_path (include_directories == 0
-                          ? 0 : include_directories->list);
-
-  /* If we chdir'ed, figure out where we are now.  */
-  if (directories)
-    {
-#ifdef WINDOWS32
-      if (getcwd_fs (current_directory, GET_PATH_MAX) == 0)
-#else
-      if (getcwd (current_directory, GET_PATH_MAX) == 0)
-#endif
-        {
-#ifdef  HAVE_GETCWD
-          perror_with_name ("getcwd", "");
-#else
-          OS (error, NILF, "getwd: %s", current_directory);
-#endif
-          starting_directory = 0;
-        }
-      else
-        starting_directory = current_directory;
-    }
-
-  define_variable_cname ("CURDIR", current_directory, o_file, 0);
-
-  /* Read any stdin makefiles into temporary files.  */
-
-  if (makefiles != 0)
-    {
-      unsigned int i;
-      for (i = 0; i < makefiles->idx; ++i)
-        if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0')
-          {
-            /* This makefile is standard input.  Since we may re-exec
-               and thus re-read the makefiles, we read standard input
-               into a temporary file and read from that.  */
-            FILE *outfile;
-            char *template;
-            const char *tmpdir;
-
-            if (stdin_nm)
-              O (fatal, NILF,
-                 _("Makefile from standard input specified twice."));
-
-#ifdef VMS
-# define DEFAULT_TMPDIR     "/sys$scratch/"
-#else
-# ifdef P_tmpdir
-#  define DEFAULT_TMPDIR    P_tmpdir
-# else
-#  define DEFAULT_TMPDIR    "/tmp"
-# endif
-#endif
-#define DEFAULT_TMPFILE     "GmXXXXXX"
-
-            if (((tmpdir = getenv ("TMPDIR")) == NULL || *tmpdir == '\0')
-#if defined (__MSDOS__) || defined (WINDOWS32) || defined (__EMX__)
-                /* These are also used commonly on these platforms.  */
-                && ((tmpdir = getenv ("TEMP")) == NULL || *tmpdir == '\0')
-                && ((tmpdir = getenv ("TMP")) == NULL || *tmpdir == '\0')
-#endif
-               )
-              tmpdir = DEFAULT_TMPDIR;
-
-            template = alloca (strlen (tmpdir) + CSTRLEN (DEFAULT_TMPFILE) + 2);
-            strcpy (template, tmpdir);
-
-#ifdef HAVE_DOS_PATHS
-            if (strchr ("/\\", template[strlen (template) - 1]) == NULL)
-              strcat (template, "/");
-#else
-# ifndef VMS
-            if (template[strlen (template) - 1] != '/')
-              strcat (template, "/");
-# endif /* !VMS */
-#endif /* !HAVE_DOS_PATHS */
-
-            strcat (template, DEFAULT_TMPFILE);
-            outfile = output_tmpfile (&stdin_nm, template);
-            if (outfile == 0)
-              pfatal_with_name (_("fopen (temporary file)"));
-            while (!feof (stdin) && ! ferror (stdin))
-              {
-                char buf[2048];
-                unsigned int n = fread (buf, 1, sizeof (buf), stdin);
-                if (n > 0 && fwrite (buf, 1, n, outfile) != n)
-                  pfatal_with_name (_("fwrite (temporary file)"));
-              }
-            fclose (outfile);
-
-            /* Replace the name that read_all_makefiles will
-               see with the name of the temporary file.  */
-            makefiles->list[i] = strcache_add (stdin_nm);
-
-            /* Make sure the temporary file will not be remade.  */
-            {
-              struct file *f = enter_file (strcache_add (stdin_nm));
-              f->updated = 1;
-              f->update_status = us_success;
-              f->command_state = cs_finished;
-              /* Can't be intermediate, or it'll be removed too early for
-                 make re-exec.  */
-              f->intermediate = 0;
-              f->dontcare = 0;
-            }
-          }
-    }
-
-#ifndef __EMX__ /* Don't use a SIGCHLD handler for OS/2 */
-#if !defined(HAVE_WAIT_NOHANG) || defined(MAKE_JOBSERVER)
-  /* Set up to handle children dying.  This must be done before
-     reading in the makefiles so that 'shell' function calls will work.
-
-     If we don't have a hanging wait we have to fall back to old, broken
-     functionality here and rely on the signal handler and counting
-     children.
-
-     If we're using the jobs pipe we need a signal handler so that SIGCHLD is
-     not ignored; we need it to interrupt the read(2) of the jobserver pipe if
-     we're waiting for a token.
-
-     If none of these are true, we don't need a signal handler at all.  */
-  {
-# if defined SIGCHLD
-    bsd_signal (SIGCHLD, child_handler);
-# endif
-# if defined SIGCLD && SIGCLD != SIGCHLD
-    bsd_signal (SIGCLD, child_handler);
-# endif
-  }
-
-#ifdef HAVE_PSELECT
-  /* If we have pselect() then we need to block SIGCHLD so it's deferred.  */
-  {
-    sigset_t block;
-    sigemptyset (&block);
-    sigaddset (&block, SIGCHLD);
-    if (sigprocmask (SIG_SETMASK, &block, NULL) < 0)
-      pfatal_with_name ("sigprocmask(SIG_SETMASK, SIGCHLD)");
-  }
-#endif
-
-#endif
-#endif
-
-  /* Let the user send us SIGUSR1 to toggle the -d flag during the run.  */
-#ifdef SIGUSR1
-  bsd_signal (SIGUSR1, debug_signal_handler);
-#endif
-
-  /* Define the initial list of suffixes for old-style rules.  */
-  set_default_suffixes ();
-
-  /* Define the file rules for the built-in suffix rules.  These will later
-     be converted into pattern rules.  We used to do this in
-     install_default_implicit_rules, but since that happens after reading
-     makefiles, it results in the built-in pattern rules taking precedence
-     over makefile-specified suffix rules, which is wrong.  */
-  install_default_suffix_rules ();
-
-  /* Define some internal and special variables.  */
-  define_automatic_variables ();
-
-  /* Set up the MAKEFLAGS and MFLAGS variables for makefiles to see.
-     Initialize it to be exported but allow the makefile to reset it.  */
-  define_makeflags (0, 0)->export = v_export;
-
-  /* Define the default variables.  */
-  define_default_variables ();
-
-  default_file = enter_file (strcache_add (".DEFAULT"));
-
-  default_goal_var = define_variable_cname (".DEFAULT_GOAL", "", o_file, 0);
-
-  /* Evaluate all strings provided with --eval.
-     Also set up the $(-*-eval-flags-*-) variable.  */
-
-  if (eval_strings)
-    {
-      char *p, *value;
-      unsigned int i;
-      unsigned int len = (CSTRLEN ("--eval=") + 1) * eval_strings->idx;
-
-      for (i = 0; i < eval_strings->idx; ++i)
-        {
-          p = xstrdup (eval_strings->list[i]);
-          len += 2 * strlen (p);
-          eval_buffer (p, NULL);
-          free (p);
-        }
-
-      p = value = alloca (len);
-      for (i = 0; i < eval_strings->idx; ++i)
-        {
-          strcpy (p, "--eval=");
-          p += CSTRLEN ("--eval=");
-          p = quote_for_env (p, eval_strings->list[i]);
-          *(p++) = ' ';
-        }
-      p[-1] = '\0';
-
-      define_variable_cname ("-*-eval-flags-*-", value, o_automatic, 0);
-    }
-
-  /* Read all the makefiles.  */
-
-  read_files = read_all_makefiles (makefiles == 0 ? 0 : makefiles->list);
-
-#ifdef WINDOWS32
-  /* look one last time after reading all Makefiles */
-  if (no_default_sh_exe)
-    no_default_sh_exe = !find_and_set_default_shell (NULL);
-#endif /* WINDOWS32 */
-
-#if defined (__MSDOS__) || defined (__EMX__) || defined (VMS)
-  /* We need to know what kind of shell we will be using.  */
-  {
-    extern int _is_unixy_shell (const char *_path);
-    struct variable *shv = lookup_variable (STRING_SIZE_TUPLE ("SHELL"));
-    extern int unixy_shell;
-    extern const char *default_shell;
-
-    if (shv && *shv->value)
-      {
-        char *shell_path = recursively_expand (shv);
-
-        if (shell_path && _is_unixy_shell (shell_path))
-          unixy_shell = 1;
-        else
-          unixy_shell = 0;
-        if (shell_path)
-          default_shell = shell_path;
-      }
-  }
-#endif /* __MSDOS__ || __EMX__ */
-
-  {
-    int old_builtin_rules_flag = no_builtin_rules_flag;
-    int old_builtin_variables_flag = no_builtin_variables_flag;
-
-    /* Decode switches again, for variables set by the makefile.  */
-    decode_env_switches (STRING_SIZE_TUPLE ("GNUMAKEFLAGS"));
-
-    /* Clear GNUMAKEFLAGS to avoid duplication.  */
-    define_variable_cname ("GNUMAKEFLAGS", "", o_override, 0);
-
-    decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS"));
-#if 0
-    decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS"));
-#endif
-
-    /* Reset in case the switches changed our mind.  */
-    syncing = (output_sync == OUTPUT_SYNC_LINE
-               || output_sync == OUTPUT_SYNC_TARGET);
-
-    if (make_sync.syncout && ! syncing)
-      output_close (&make_sync);
-
-    make_sync.syncout = syncing;
-    OUTPUT_SET (&make_sync);
-
-    /* If we've disabled builtin rules, get rid of them.  */
-    if (no_builtin_rules_flag && ! old_builtin_rules_flag)
-      {
-        if (suffix_file->builtin)
-          {
-            free_dep_chain (suffix_file->deps);
-            suffix_file->deps = 0;
-          }
-        define_variable_cname ("SUFFIXES", "", o_default, 0);
-      }
-
-    /* If we've disabled builtin variables, get rid of them.  */
-    if (no_builtin_variables_flag && ! old_builtin_variables_flag)
-      undefine_default_variables ();
-  }
-
-#if defined (__MSDOS__) || defined (__EMX__) || defined (VMS)
-  if (arg_job_slots != 1
-# ifdef __EMX__
-      && _osmode != OS2_MODE /* turn off -j if we are in DOS mode */
-# endif
-      )
-    {
-      O (error, NILF,
-         _("Parallel jobs (-j) are not supported on this platform."));
-      O (error, NILF, _("Resetting to single job (-j1) mode."));
-      arg_job_slots = job_slots = 1;
-    }
-#endif
-
-  /* If we have >1 slot at this point, then we're a top-level make.
-     Set up the jobserver.
-
-     Every make assumes that it always has one job it can run.  For the
-     submakes it's the token they were given by their parent.  For the top
-     make, we just subtract one from the number the user wants.  */
-
-  if (job_slots > 1 && jobserver_setup (job_slots - 1))
-    {
-      /* Fill in the jobserver_auth for our children.  */
-      jobserver_auth = jobserver_get_auth ();
-
-      if (jobserver_auth)
-        {
-          /* We're using the jobserver so set job_slots to 0.  */
-          master_job_slots = job_slots;
-          job_slots = 0;
-        }
-    }
-
-  /* If we're not using parallel jobs, then we don't need output sync.
-     This is so people can enable output sync in GNUMAKEFLAGS or similar, but
-     not have it take effect unless parallel builds are enabled.  */
-  if (syncing && job_slots == 1)
-    {
-      OUTPUT_UNSET ();
-      output_close (&make_sync);
-      syncing = 0;
-      output_sync = OUTPUT_SYNC_NONE;
-    }
-
-#ifndef MAKE_SYMLINKS
-  if (check_symlink_flag)
-    {
-      O (error, NILF, _("Symbolic links not supported: disabling -L."));
-      check_symlink_flag = 0;
-    }
-#endif
-
-  /* Set up MAKEFLAGS and MFLAGS again, so they will be right.  */
-
-  define_makeflags (1, 0);
-
-  /* Make each 'struct goaldep' point at the 'struct file' for the file
-     depended on.  Also do magic for special targets.  */
-
-  snap_deps ();
-
-  /* Convert old-style suffix rules to pattern rules.  It is important to
-     do this before installing the built-in pattern rules below, so that
-     makefile-specified suffix rules take precedence over built-in pattern
-     rules.  */
-
-  convert_to_pattern ();
-
-  /* Install the default implicit pattern rules.
-     This used to be done before reading the makefiles.
-     But in that case, built-in pattern rules were in the chain
-     before user-defined ones, so they matched first.  */
-
-  install_default_implicit_rules ();
-
-  /* Compute implicit rule limits.  */
-
-  count_implicit_rule_limits ();
-
-  /* Construct the listings of directories in VPATH lists.  */
-
-  build_vpath_lists ();
-
-  /* Mark files given with -o flags as very old and as having been updated
-     already, and files given with -W flags as brand new (time-stamp as far
-     as possible into the future).  If restarts is set we'll do -W later.  */
-
-  if (old_files != 0)
-    {
-      const char **p;
-      for (p = old_files->list; *p != 0; ++p)
-        {
-          struct file *f = enter_file (*p);
-          f->last_mtime = f->mtime_before_update = OLD_MTIME;
-          f->updated = 1;
-          f->update_status = us_success;
-          f->command_state = cs_finished;
-        }
-    }
-
-  if (!restarts && new_files != 0)
-    {
-      const char **p;
-      for (p = new_files->list; *p != 0; ++p)
-        {
-          struct file *f = enter_file (*p);
-          f->last_mtime = f->mtime_before_update = NEW_MTIME;
-        }
-    }
-
-  /* Initialize the remote job module.  */
-  remote_setup ();
-
-  /* Dump any output we've collected.  */
-
-  OUTPUT_UNSET ();
-  output_close (&make_sync);
-
-  if (read_files != 0)
-    {
-      /* Update any makefiles if necessary.  */
-
-      FILE_TIMESTAMP *makefile_mtimes = 0;
-      unsigned int mm_idx = 0;
-      char **aargv = NULL;
-      const char **nargv;
-      int nargc;
-      enum update_status status;
-
-      DB (DB_BASIC, (_("Updating makefiles....\n")));
-
-      /* Remove any makefiles we don't want to try to update.
-         Also record the current modtimes so we can compare them later.  */
-      {
-        register struct goaldep *d, *last;
-        last = 0;
-        d = read_files;
-        while (d != 0)
-          {
-            struct file *f = d->file;
-            if (f->double_colon)
-              for (f = f->double_colon; f != NULL; f = f->prev)
-                {
-                  if (f->deps == 0 && f->cmds != 0)
-                    {
-                      /* This makefile is a :: target with commands, but
-                         no dependencies.  So, it will always be remade.
-                         This might well cause an infinite loop, so don't
-                         try to remake it.  (This will only happen if
-                         your makefiles are written exceptionally
-                         stupidly; but if you work for Athena, that's how
-                         you write your makefiles.)  */
-
-                      DB (DB_VERBOSE,
-                          (_("Makefile '%s' might loop; not remaking it.\n"),
-                           f->name));
-
-                      if (last == 0)
-                        read_files = d->next;
-                      else
-                        last->next = d->next;
-
-                      /* Free the storage.  */
-                      free_goaldep (d);
-
-                      d = last == 0 ? read_files : last->next;
-
-                      break;
-                    }
-                }
-
-            if (f == NULL || !f->double_colon)
-              {
-                makefile_mtimes = xrealloc (makefile_mtimes,
-                                            (mm_idx+1)
-                                            * sizeof (FILE_TIMESTAMP));
-                makefile_mtimes[mm_idx++] = file_mtime_no_search (d->file);
-                last = d;
-                d = d->next;
-              }
-          }
-      }
-
-      /* Set up 'MAKEFLAGS' specially while remaking makefiles.  */
-      define_makeflags (1, 1);
-
-      {
-        int orig_db_level = db_level;
-
-        if (! ISDB (DB_MAKEFILES))
-          db_level = DB_NONE;
-
-        rebuilding_makefiles = 1;
-        status = update_goal_chain (read_files);
-        rebuilding_makefiles = 0;
-
-        db_level = orig_db_level;
-      }
-
-      switch (status)
-        {
-        case us_question:
-          /* The only way this can happen is if the user specified -q and asked
-             for one of the makefiles to be remade as a target on the command
-             line.  Since we're not actually updating anything with -q we can
-             treat this as "did nothing".  */
-
-        case us_none:
-          /* Did nothing.  */
-          break;
-
-        case us_failed:
-          /* Failed to update.  Figure out if we care.  */
-          {
-            /* Nonzero if any makefile was successfully remade.  */
-            int any_remade = 0;
-            /* Nonzero if any makefile we care about failed
-               in updating or could not be found at all.  */
-            int any_failed = 0;
-            unsigned int i;
-            struct goaldep *d;
-
-            for (i = 0, d = read_files; d != 0; ++i, d = d->next)
-              {
-                if (d->file->updated)
-                  {
-                    /* This makefile was updated.  */
-                    if (d->file->update_status == us_success)
-                      {
-                        /* It was successfully updated.  */
-                        any_remade |= (file_mtime_no_search (d->file)
-                                       != makefile_mtimes[i]);
-                      }
-                    else if (! (d->flags & RM_DONTCARE))
-                      {
-                        FILE_TIMESTAMP mtime;
-                        /* The update failed and this makefile was not
-                           from the MAKEFILES variable, so we care.  */
-                        OS (error, NILF, _("Failed to remake makefile '%s'."),
-                            d->file->name);
-                        mtime = file_mtime_no_search (d->file);
-                        any_remade |= (mtime != NONEXISTENT_MTIME
-                                       && mtime != makefile_mtimes[i]);
-                        makefile_status = MAKE_FAILURE;
-                      }
-                  }
-                else
-                  /* This makefile was not found at all.  */
-                  if (! (d->flags & RM_DONTCARE))
-                    {
-                      const char *dnm = dep_name (d);
-                      size_t l = strlen (dnm);
-
-                      /* This is a makefile we care about.  See how much.  */
-                      if (d->flags & RM_INCLUDED)
-                        /* An included makefile.  We don't need to die, but we
-                           do want to complain.  */
-                        error (NILF, l,
-                               _("Included makefile '%s' was not found."), dnm);
-                      else
-                        {
-                          /* A normal makefile.  We must die later.  */
-                          error (NILF, l,
-                                 _("Makefile '%s' was not found"), dnm);
-                          any_failed = 1;
-                        }
-                    }
-              }
-            /* Reset this to empty so we get the right error message below.  */
-            read_files = 0;
-
-            if (any_remade)
-              goto re_exec;
-            if (any_failed)
-              die (MAKE_FAILURE);
-            break;
-          }
-
-        case us_success:
-        re_exec:
-          /* Updated successfully.  Re-exec ourselves.  */
-
-          remove_intermediates (0);
-
-          if (print_data_base_flag)
-            print_data_base ();
-
-          clean_jobserver (0);
-
-          if (makefiles != 0)
-            {
-              /* These names might have changed.  */
-              int i, j = 0;
-              for (i = 1; i < argc; ++i)
-                if (strneq (argv[i], "-f", 2)) /* XXX */
-                  {
-                    if (argv[i][2] == '\0')
-                      /* This cast is OK since we never modify argv.  */
-                      argv[++i] = (char *) makefiles->list[j];
-                    else
-                      argv[i] = xstrdup (concat (2, "-f", makefiles->list[j]));
-                    ++j;
-                  }
-            }
-
-          /* Add -o option for the stdin temporary file, if necessary.  */
-          nargc = argc;
-          if (stdin_nm)
-            {
-              void *m = xmalloc ((nargc + 2) * sizeof (char *));
-              aargv = m;
-              memcpy (aargv, argv, argc * sizeof (char *));
-              aargv[nargc++] = xstrdup (concat (2, "-o", stdin_nm));
-              aargv[nargc] = 0;
-              nargv = m;
-            }
-          else
-            nargv = (const char**)argv;
-
-          if (directories != 0 && directories->idx > 0)
-            {
-              int bad = 1;
-              if (directory_before_chdir != 0)
-                {
-                  if (chdir (directory_before_chdir) < 0)
-                      perror_with_name ("chdir", "");
-                  else
-                    bad = 0;
-                }
-              if (bad)
-                O (fatal, NILF,
-                   _("Couldn't change back to original directory."));
-            }
-
-          ++restarts;
-
-          if (ISDB (DB_BASIC))
-            {
-              const char **p;
-              printf (_("Re-executing[%u]:"), restarts);
-              for (p = nargv; *p != 0; ++p)
-                printf (" %s", *p);
-              putchar ('\n');
-              fflush (stdout);
-            }
-
-#ifndef _AMIGA
-          {
-            char **p;
-            for (p = environ; *p != 0; ++p)
-              {
-                if (strneq (*p, MAKELEVEL_NAME "=", MAKELEVEL_LENGTH+1))
-                  {
-                    *p = alloca (40);
-                    sprintf (*p, "%s=%u", MAKELEVEL_NAME, makelevel);
-#ifdef VMS
-                    vms_putenv_symbol (*p);
-#endif
-                  }
-                else if (strneq (*p, "MAKE_RESTARTS=", CSTRLEN ("MAKE_RESTARTS=")))
-                  {
-                    *p = alloca (40);
-                    sprintf (*p, "MAKE_RESTARTS=%s%u",
-                             OUTPUT_IS_TRACED () ? "-" : "", restarts);
-                    restarts = 0;
-                  }
-              }
-          }
-#else /* AMIGA */
-          {
-            char buffer[256];
-
-            sprintf (buffer, "%u", makelevel);
-            SetVar (MAKELEVEL_NAME, buffer, -1, GVF_GLOBAL_ONLY);
-
-            sprintf (buffer, "%s%u", OUTPUT_IS_TRACED () ? "-" : "", restarts);
-            SetVar ("MAKE_RESTARTS", buffer, -1, GVF_GLOBAL_ONLY);
-            restarts = 0;
-          }
-#endif
-
-          /* If we didn't set the restarts variable yet, add it.  */
-          if (restarts)
-            {
-              char *b = alloca (40);
-              sprintf (b, "MAKE_RESTARTS=%s%u",
-                       OUTPUT_IS_TRACED () ? "-" : "", restarts);
-              putenv (b);
-            }
-
-          fflush (stdout);
-          fflush (stderr);
-
-#ifdef _AMIGA
-          exec_command (nargv);
-          exit (0);
-#elif defined (__EMX__)
-          {
-            /* It is not possible to use execve() here because this
-               would cause the parent process to be terminated with
-               exit code 0 before the child process has been terminated.
-               Therefore it may be the best solution simply to spawn the
-               child process including all file handles and to wait for its
-               termination. */
-            int pid;
-            int r;
-            pid = child_execute_job (NULL, 1, nargv, environ);
-
-            /* is this loop really necessary? */
-            do {
-              pid = wait (&r);
-            } while (pid <= 0);
-            /* use the exit code of the child process */
-            exit (WIFEXITED(r) ? WEXITSTATUS(r) : EXIT_FAILURE);
-          }
-#else
-#ifdef SET_STACK_SIZE
-          /* Reset limits, if necessary.  */
-          if (stack_limit.rlim_cur)
-            setrlimit (RLIMIT_STACK, &stack_limit);
-#endif
-          exec_command ((char **)nargv, environ);
-#endif
-          free (aargv);
-          break;
-        }
-
-      /* Free the makefile mtimes.  */
-      free (makefile_mtimes);
-    }
-
-  /* Set up 'MAKEFLAGS' again for the normal targets.  */
-  define_makeflags (1, 0);
-
-  /* Set always_make_flag if -B was given.  */
-  always_make_flag = always_make_set;
-
-  /* If restarts is set we haven't set up -W files yet, so do that now.  */
-  if (restarts && new_files != 0)
-    {
-      const char **p;
-      for (p = new_files->list; *p != 0; ++p)
-        {
-          struct file *f = enter_file (*p);
-          f->last_mtime = f->mtime_before_update = NEW_MTIME;
-        }
-    }
-
-  /* If there is a temp file from reading a makefile from stdin, get rid of
-     it now.  */
-  if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT)
-    perror_with_name (_("unlink (temporary file): "), stdin_nm);
-
-  /* If there were no command-line goals, use the default.  */
-  if (goals == 0)
-    {
-      char *p;
-
-      if (default_goal_var->recursive)
-        p = variable_expand (default_goal_var->value);
-      else
-        {
-          p = variable_buffer_output (variable_buffer, default_goal_var->value,
-                                      strlen (default_goal_var->value));
-          *p = '\0';
-          p = variable_buffer;
-        }
-
-      if (*p != '\0')
-        {
-          struct file *f = lookup_file (p);
-
-          /* If .DEFAULT_GOAL is a non-existent target, enter it into the
-             table and let the standard logic sort it out. */
-          if (f == 0)
-            {
-              struct nameseq *ns;
-
-              ns = PARSE_SIMPLE_SEQ (&p, struct nameseq);
-              if (ns)
-                {
-                  /* .DEFAULT_GOAL should contain one target. */
-                  if (ns->next != 0)
-                    O (fatal, NILF,
-                       _(".DEFAULT_GOAL contains more than one target"));
-
-                  f = enter_file (strcache_add (ns->name));
-
-                  ns->name = 0; /* It was reused by enter_file(). */
-                  free_ns_chain (ns);
-                }
-            }
-
-          if (f)
-            {
-              goals = alloc_goaldep ();
-              goals->file = f;
-            }
-        }
-    }
-  else
-    lastgoal->next = 0;
-
-
-  if (!goals)
-    {
-      if (read_files == 0)
-        O (fatal, NILF, _("No targets specified and no makefile found"));
-
-      O (fatal, NILF, _("No targets"));
-    }
-
-  /* Update the goals.  */
-
-  DB (DB_BASIC, (_("Updating goal targets....\n")));
-
-  {
-    switch (update_goal_chain (goals))
-    {
-      case us_none:
-        /* Nothing happened.  */
-        /* FALLTHROUGH */
-      case us_success:
-        /* Keep the previous result.  */
-        break;
-      case us_question:
-        /* We are under -q and would run some commands.  */
-        makefile_status = MAKE_TROUBLE;
-        break;
-      case us_failed:
-        /* Updating failed.  POSIX.2 specifies exit status >1 for this; */
-        makefile_status = MAKE_FAILURE;
-        break;
-    }
-
-    /* If we detected some clock skew, generate one last warning */
-    if (clock_skew_detected)
-      O (error, NILF,
-         _("warning:  Clock skew detected.  Your build may be incomplete."));
-
-    /* Exit.  */
-    die (makefile_status);
-  }
-
-  /* NOTREACHED */
-  exit (MAKE_SUCCESS);
-}
-\f
-/* Parsing of arguments, decoding of switches.  */
-
-static char options[1 + sizeof (switches) / sizeof (switches[0]) * 3];
-static struct option long_options[(sizeof (switches) / sizeof (switches[0])) +
-                                  (sizeof (long_option_aliases) /
-                                   sizeof (long_option_aliases[0]))];
-
-/* Fill in the string and vector for getopt.  */
-static void
-init_switches (void)
-{
-  char *p;
-  unsigned int c;
-  unsigned int i;
-
-  if (options[0] != '\0')
-    /* Already done.  */
-    return;
-
-  p = options;
-
-  /* Return switch and non-switch args in order, regardless of
-     POSIXLY_CORRECT.  Non-switch args are returned as option 1.  */
-  *p++ = '-';
-
-  for (i = 0; switches[i].c != '\0'; ++i)
-    {
-      long_options[i].name = (switches[i].long_name == 0 ? "" :
-                              switches[i].long_name);
-      long_options[i].flag = 0;
-      long_options[i].val = switches[i].c;
-      if (short_option (switches[i].c))
-        *p++ = switches[i].c;
-      switch (switches[i].type)
-        {
-        case flag:
-        case flag_off:
-        case ignore:
-          long_options[i].has_arg = no_argument;
-          break;
-
-        case string:
-        case strlist:
-        case filename:
-        case positive_int:
-        case floating:
-          if (short_option (switches[i].c))
-            *p++ = ':';
-          if (switches[i].noarg_value != 0)
-            {
-              if (short_option (switches[i].c))
-                *p++ = ':';
-              long_options[i].has_arg = optional_argument;
-            }
-          else
-            long_options[i].has_arg = required_argument;
-          break;
-        }
-    }
-  *p = '\0';
-  for (c = 0; c < (sizeof (long_option_aliases) /
-                   sizeof (long_option_aliases[0]));
-       ++c)
-    long_options[i++] = long_option_aliases[c];
-  long_options[i].name = 0;
-}
-
-
-/* Non-option argument.  It might be a variable definition.  */
-static void
-handle_non_switch_argument (const char *arg, int env)
-{
-  struct variable *v;
-
-  if (arg[0] == '-' && arg[1] == '\0')
-    /* Ignore plain '-' for compatibility.  */
-    return;
-
-#ifdef VMS
-  {
-    /* VMS DCL quoting can result in foo="bar baz" showing up here.
-       Need to remove the double quotes from the value. */
-    char * eq_ptr;
-    char * new_arg;
-    eq_ptr = strchr (arg, '=');
-    if ((eq_ptr != NULL) && (eq_ptr[1] == '"'))
-      {
-         int len;
-         int seg1;
-         int seg2;
-         len = strlen(arg);
-         new_arg = alloca(len);
-         seg1 = eq_ptr - arg + 1;
-         strncpy(new_arg, arg, (seg1));
-         seg2 = len - seg1 - 1;
-         strncpy(&new_arg[seg1], &eq_ptr[2], seg2);
-         new_arg[seg1 + seg2] = 0;
-         if (new_arg[seg1 + seg2 - 1] == '"')
-           new_arg[seg1 + seg2 - 1] = 0;
-         arg = new_arg;
-      }
-  }
-#endif
-  v = try_variable_definition (0, arg, o_command, 0);
-  if (v != 0)
-    {
-      /* It is indeed a variable definition.  If we don't already have this
-         one, record a pointer to the variable for later use in
-         define_makeflags.  */
-      struct command_variable *cv;
-
-      for (cv = command_variables; cv != 0; cv = cv->next)
-        if (cv->variable == v)
-          break;
-
-      if (! cv)
-        {
-          cv = xmalloc (sizeof (*cv));
-          cv->variable = v;
-          cv->next = command_variables;
-          command_variables = cv;
-        }
-    }
-  else if (! env)
-    {
-      /* Not an option or variable definition; it must be a goal
-         target!  Enter it as a file and add it to the dep chain of
-         goals.  */
-      struct file *f = enter_file (strcache_add (expand_command_line_file (arg)));
-      f->cmd_target = 1;
-
-      if (goals == 0)
-        {
-          goals = alloc_goaldep ();
-          lastgoal = goals;
-        }
-      else
-        {
-          lastgoal->next = alloc_goaldep ();
-          lastgoal = lastgoal->next;
-        }
-
-      lastgoal->file = f;
-
-      {
-        /* Add this target name to the MAKECMDGOALS variable. */
-        struct variable *gv;
-        const char *value;
-
-        gv = lookup_variable (STRING_SIZE_TUPLE ("MAKECMDGOALS"));
-        if (gv == 0)
-          value = f->name;
-        else
-          {
-            /* Paste the old and new values together */
-            unsigned int oldlen, newlen;
-            char *vp;
-
-            oldlen = strlen (gv->value);
-            newlen = strlen (f->name);
-            vp = alloca (oldlen + 1 + newlen + 1);
-            memcpy (vp, gv->value, oldlen);
-            vp[oldlen] = ' ';
-            memcpy (&vp[oldlen + 1], f->name, newlen + 1);
-            value = vp;
-          }
-        define_variable_cname ("MAKECMDGOALS", value, o_default, 0);
-      }
-    }
-}
-
-/* Print a nice usage method.  */
-
-static void
-print_usage (int bad)
-{
-  const char *const *cpp;
-  FILE *usageto;
-
-  if (print_version_flag)
-    print_version ();
-
-  usageto = bad ? stderr : stdout;
-
-  fprintf (usageto, _("Usage: %s [options] [target] ...\n"), program);
-
-  for (cpp = usage; *cpp; ++cpp)
-    fputs (_(*cpp), usageto);
-
-  if (!remote_description || *remote_description == '\0')
-    fprintf (usageto, _("\nThis program built for %s\n"), make_host);
-  else
-    fprintf (usageto, _("\nThis program built for %s (%s)\n"),
-             make_host, remote_description);
-
-  fprintf (usageto, _("Report bugs to <bug-make@gnu.org>\n"));
-}
-
-/* Decode switches from ARGC and ARGV.
-   They came from the environment if ENV is nonzero.  */
-
-static void
-decode_switches (int argc, const char **argv, int env)
-{
-  int bad = 0;
-  register const struct command_switch *cs;
-  register struct stringlist *sl;
-  register int c;
-
-  /* getopt does most of the parsing for us.
-     First, get its vectors set up.  */
-
-  init_switches ();
-
-  /* Let getopt produce error messages for the command line,
-     but not for options from the environment.  */
-  opterr = !env;
-  /* Reset getopt's state.  */
-  optind = 0;
-
-  while (optind < argc)
-    {
-      const char *coptarg;
-
-      /* Parse the next argument.  */
-      c = getopt_long (argc, (char*const*)argv, options, long_options, NULL);
-      coptarg = optarg;
-      if (c == EOF)
-        /* End of arguments, or "--" marker seen.  */
-        break;
-      else if (c == 1)
-        /* An argument not starting with a dash.  */
-        handle_non_switch_argument (coptarg, env);
-      else if (c == '?')
-        /* Bad option.  We will print a usage message and die later.
-           But continue to parse the other options so the user can
-           see all he did wrong.  */
-        bad = 1;
-      else
-        for (cs = switches; cs->c != '\0'; ++cs)
-          if (cs->c == c)
-            {
-              /* Whether or not we will actually do anything with
-                 this switch.  We test this individually inside the
-                 switch below rather than just once outside it, so that
-                 options which are to be ignored still consume args.  */
-              int doit = !env || cs->env;
-
-              switch (cs->type)
-                {
-                default:
-                  abort ();
-
-                case ignore:
-                  break;
-
-                case flag:
-                case flag_off:
-                  if (doit)
-                    *(int *) cs->value_ptr = cs->type == flag;
-                  break;
-
-                case string:
-                case strlist:
-                case filename:
-                  if (!doit)
-                    break;
-
-                  if (! coptarg)
-                    coptarg = xstrdup (cs->noarg_value);
-                  else if (*coptarg == '\0')
-                    {
-                      char opt[2] = "c";
-                      const char *op = opt;
-
-                      if (short_option (cs->c))
-                        opt[0] = cs->c;
-                      else
-                        op = cs->long_name;
-
-                      error (NILF, strlen (op),
-                             _("the '%s%s' option requires a non-empty string argument"),
-                             short_option (cs->c) ? "-" : "--", op);
-                      bad = 1;
-                      break;
-                    }
-
-                  if (cs->type == string)
-                    {
-                      char **val = (char **)cs->value_ptr;
-                      free (*val);
-                      *val = xstrdup (coptarg);
-                      break;
-                    }
-
-                  sl = *(struct stringlist **) cs->value_ptr;
-                  if (sl == 0)
-                    {
-                      sl = xmalloc (sizeof (struct stringlist));
-                      sl->max = 5;
-                      sl->idx = 0;
-                      sl->list = xmalloc (5 * sizeof (char *));
-                      *(struct stringlist **) cs->value_ptr = sl;
-                    }
-                  else if (sl->idx == sl->max - 1)
-                    {
-                      sl->max += 5;
-                      /* MSVC erroneously warns without a cast here.  */
-                      sl->list = xrealloc ((void *)sl->list,
-                                           sl->max * sizeof (char *));
-                    }
-                  if (cs->type == filename)
-                    sl->list[sl->idx++] = expand_command_line_file (coptarg);
-                  else
-                    sl->list[sl->idx++] = xstrdup (coptarg);
-                  sl->list[sl->idx] = 0;
-                  break;
-
-                case positive_int:
-                  /* See if we have an option argument; if we do require that
-                     it's all digits, not something like "10foo".  */
-                  if (coptarg == 0 && argc > optind)
-                    {
-                      const char *cp;
-                      for (cp=argv[optind]; ISDIGIT (cp[0]); ++cp)
-                        ;
-                      if (cp[0] == '\0')
-                        coptarg = argv[optind++];
-                    }
-
-                  if (!doit)
-                    break;
-
-                  if (coptarg)
-                    {
-                      int i = atoi (coptarg);
-                      const char *cp;
-
-                      /* Yes, I realize we're repeating this in some cases.  */
-                      for (cp = coptarg; ISDIGIT (cp[0]); ++cp)
-                        ;
-
-                      if (i < 1 || cp[0] != '\0')
-                        {
-                          error (NILF, 0,
-                                 _("the '-%c' option requires a positive integer argument"),
-                                 cs->c);
-                          bad = 1;
-                        }
-                      else
-                        *(unsigned int *) cs->value_ptr = i;
-                    }
-                  else
-                    *(unsigned int *) cs->value_ptr
-                      = *(unsigned int *) cs->noarg_value;
-                  break;
-
-#ifndef NO_FLOAT
-                case floating:
-                  if (coptarg == 0 && optind < argc
-                      && (ISDIGIT (argv[optind][0]) || argv[optind][0] == '.'))
-                    coptarg = argv[optind++];
-
-                  if (doit)
-                    *(double *) cs->value_ptr
-                      = (coptarg != 0 ? atof (coptarg)
-                         : *(double *) cs->noarg_value);
-
-                  break;
-#endif
-                }
-
-              /* We've found the switch.  Stop looking.  */
-              break;
-            }
-    }
-
-  /* There are no more options according to getting getopt, but there may
-     be some arguments left.  Since we have asked for non-option arguments
-     to be returned in order, this only happens when there is a "--"
-     argument to prevent later arguments from being options.  */
-  while (optind < argc)
-    handle_non_switch_argument (argv[optind++], env);
-
-  if (!env && (bad || print_usage_flag))
-    {
-      print_usage (bad);
-      die (bad ? MAKE_FAILURE : MAKE_SUCCESS);
-    }
-
-  /* If there are any options that need to be decoded do it now.  */
-  decode_debug_flags ();
-  decode_output_sync_flags ();
-}
-
-/* Decode switches from environment variable ENVAR (which is LEN chars long).
-   We do this by chopping the value into a vector of words, prepending a
-   dash to the first word if it lacks one, and passing the vector to
-   decode_switches.  */
-
-static void
-decode_env_switches (const char *envar, unsigned int len)
-{
-  char *varref = alloca (2 + len + 2);
-  char *value, *p, *buf;
-  int argc;
-  const char **argv;
-
-  /* Get the variable's value.  */
-  varref[0] = '$';
-  varref[1] = '(';
-  memcpy (&varref[2], envar, len);
-  varref[2 + len] = ')';
-  varref[2 + len + 1] = '\0';
-  value = variable_expand (varref);
-
-  /* Skip whitespace, and check for an empty value.  */
-  NEXT_TOKEN (value);
-  len = strlen (value);
-  if (len == 0)
-    return;
-
-  /* Allocate a vector that is definitely big enough.  */
-  argv = alloca ((1 + len + 1) * sizeof (char *));
-
-  /* getopt will look at the arguments starting at ARGV[1].
-     Prepend a spacer word.  */
-  argv[0] = 0;
-  argc = 1;
-
-  /* We need a buffer to copy the value into while we split it into words
-     and unquote it.  Set up in case we need to prepend a dash later.  */
-  buf = alloca (1 + len + 1);
-  buf[0] = '-';
-  p = buf+1;
-  argv[argc] = p;
-  while (*value != '\0')
-    {
-      if (*value == '\\' && value[1] != '\0')
-        ++value;                /* Skip the backslash.  */
-      else if (ISBLANK (*value))
-        {
-          /* End of the word.  */
-          *p++ = '\0';
-          argv[++argc] = p;
-          do
-            ++value;
-          while (ISBLANK (*value));
-          continue;
-        }
-      *p++ = *value++;
-    }
-  *p = '\0';
-  argv[++argc] = 0;
-  assert (p < buf + len + 2);
-
-  if (argv[1][0] != '-' && strchr (argv[1], '=') == 0)
-    /* The first word doesn't start with a dash and isn't a variable
-       definition, so add a dash.  */
-    argv[1] = buf;
-
-  /* Parse those words.  */
-  decode_switches (argc, argv, 1);
-}
-\f
-/* Quote the string IN so that it will be interpreted as a single word with
-   no magic by decode_env_switches; also double dollar signs to avoid
-   variable expansion in make itself.  Write the result into OUT, returning
-   the address of the next character to be written.
-   Allocating space for OUT twice the length of IN is always sufficient.  */
-
-static char *
-quote_for_env (char *out, const char *in)
-{
-  while (*in != '\0')
-    {
-      if (*in == '$')
-        *out++ = '$';
-      else if (ISBLANK (*in) || *in == '\\')
-        *out++ = '\\';
-      *out++ = *in++;
-    }
-
-  return out;
-}
-
-/* Define the MAKEFLAGS and MFLAGS variables to reflect the settings of the
-   command switches.  Include options with args if ALL is nonzero.
-   Don't include options with the 'no_makefile' flag set if MAKEFILE.  */
-
-static struct variable *
-define_makeflags (int all, int makefile)
-{
-  const char ref[] = "$(MAKEOVERRIDES)";
-  const char posixref[] = "$(-*-command-variables-*-)";
-  const char evalref[] = "$(-*-eval-flags-*-)";
-  const struct command_switch *cs;
-  char *flagstring;
-  char *p;
-
-  /* We will construct a linked list of 'struct flag's describing
-     all the flags which need to go in MAKEFLAGS.  Then, once we
-     know how many there are and their lengths, we can put them all
-     together in a string.  */
-
-  struct flag
-    {
-      struct flag *next;
-      const struct command_switch *cs;
-      const char *arg;
-    };
-  struct flag *flags = 0;
-  struct flag *last = 0;
-  unsigned int flagslen = 0;
-#define ADD_FLAG(ARG, LEN) \
-  do {                                                                        \
-    struct flag *new = alloca (sizeof (struct flag));                         \
-    new->cs = cs;                                                             \
-    new->arg = (ARG);                                                         \
-    new->next = 0;                                                            \
-    if (! flags)                                                              \
-      flags = new;                                                            \
-    else                                                                      \
-      last->next = new;                                                       \
-    last = new;                                                               \
-    if (new->arg == 0)                                                        \
-      /* Just a single flag letter: " -x"  */                                 \
-      flagslen += 3;                                                          \
-    else                                                                      \
-      /* " -xfoo", plus space to escape "foo".  */                            \
-      flagslen += 1 + 1 + 1 + (3 * (LEN));                                    \
-    if (!short_option (cs->c))                                                \
-      /* This switch has no single-letter version, so we use the long.  */    \
-      flagslen += 2 + strlen (cs->long_name);                                 \
-  } while (0)
-
-  for (cs = switches; cs->c != '\0'; ++cs)
-    if (cs->toenv && (!makefile || !cs->no_makefile))
-      switch (cs->type)
-        {
-        case ignore:
-          break;
-
-        case flag:
-        case flag_off:
-          if ((!*(int *) cs->value_ptr) == (cs->type == flag_off)
-              && (cs->default_value == 0
-                  || *(int *) cs->value_ptr != *(int *) cs->default_value))
-            ADD_FLAG (0, 0);
-          break;
-
-        case positive_int:
-          if (all)
-            {
-              if ((cs->default_value != 0
-                   && (*(unsigned int *) cs->value_ptr
-                       == *(unsigned int *) cs->default_value)))
-                break;
-              else if (cs->noarg_value != 0
-                       && (*(unsigned int *) cs->value_ptr ==
-                           *(unsigned int *) cs->noarg_value))
-                ADD_FLAG ("", 0); /* Optional value omitted; see below.  */
-              else
-                {
-                  char *buf = alloca (30);
-                  sprintf (buf, "%u", *(unsigned int *) cs->value_ptr);
-                  ADD_FLAG (buf, strlen (buf));
-                }
-            }
-          break;
-
-#ifndef NO_FLOAT
-        case floating:
-          if (all)
-            {
-              if (cs->default_value != 0
-                  && (*(double *) cs->value_ptr
-                      == *(double *) cs->default_value))
-                break;
-              else if (cs->noarg_value != 0
-                       && (*(double *) cs->value_ptr
-                           == *(double *) cs->noarg_value))
-                ADD_FLAG ("", 0); /* Optional value omitted; see below.  */
-              else
-                {
-                  char *buf = alloca (100);
-                  sprintf (buf, "%g", *(double *) cs->value_ptr);
-                  ADD_FLAG (buf, strlen (buf));
-                }
-            }
-          break;
-#endif
-
-        case string:
-          if (all)
-            {
-              p = *((char **)cs->value_ptr);
-              if (p)
-                ADD_FLAG (p, strlen (p));
-            }
-          break;
-
-        case filename:
-        case strlist:
-          if (all)
-            {
-              struct stringlist *sl = *(struct stringlist **) cs->value_ptr;
-              if (sl != 0)
-                {
-                  unsigned int i;
-                  for (i = 0; i < sl->idx; ++i)
-                    ADD_FLAG (sl->list[i], strlen (sl->list[i]));
-                }
-            }
-          break;
-
-        default:
-          abort ();
-        }
-
-#undef  ADD_FLAG
-
-  /* Four more for the possible " -- ", plus variable references.  */
-  flagslen += 4 + CSTRLEN (posixref) + 1 + CSTRLEN (evalref) + 1;
-
-  /* Construct the value in FLAGSTRING.
-     We allocate enough space for a preceding dash and trailing null.  */
-  flagstring = alloca (1 + flagslen + 1);
-  memset (flagstring, '\0', 1 + flagslen + 1);
-  p = flagstring;
-
-  /* Start with a dash, for MFLAGS.  */
-  *p++ = '-';
-
-  /* Add simple options as a group.  */
-  while (flags != 0 && !flags->arg && short_option (flags->cs->c))
-    {
-      *p++ = flags->cs->c;
-      flags = flags->next;
-    }
-
-  /* Now add more complex flags: ones with options and/or long names.  */
-  while (flags)
-    {
-      *p++ = ' ';
-      *p++ = '-';
-
-      /* Add the flag letter or name to the string.  */
-      if (short_option (flags->cs->c))
-        *p++ = flags->cs->c;
-      else
-        {
-          /* Long options require a double-dash.  */
-          *p++ = '-';
-          strcpy (p, flags->cs->long_name);
-          p += strlen (p);
-        }
-      /* An omitted optional argument has an ARG of "".  */
-      if (flags->arg && flags->arg[0] != '\0')
-        {
-          if (!short_option (flags->cs->c))
-            /* Long options require '='.  */
-            *p++ = '=';
-          p = quote_for_env (p, flags->arg);
-        }
-      flags = flags->next;
-    }
-
-  /* If no flags at all, get rid of the initial dash.  */
-  if (p == &flagstring[1])
-    {
-      flagstring[0] = '\0';
-      p = flagstring;
-    }
-
-  /* Define MFLAGS before appending variable definitions.  Omit an initial
-     empty dash.  Since MFLAGS is not parsed for flags, there is no reason to
-     override any makefile redefinition.  */
-  define_variable_cname ("MFLAGS",
-                         flagstring + (flagstring[0] == '-' && flagstring[1] == ' ' ? 2 : 0),
-                         o_env, 1);
-
-  /* Write a reference to -*-eval-flags-*-, which contains all the --eval
-     flag options.  */
-  if (eval_strings)
-    {
-      *p++ = ' ';
-      memcpy (p, evalref, CSTRLEN (evalref));
-      p += CSTRLEN (evalref);
-    }
-
-  if (all && command_variables)
-    {
-      /* Write a reference to $(MAKEOVERRIDES), which contains all the
-         command-line variable definitions.  Separate the variables from the
-         switches with a "--" arg.  */
-
-      strcpy (p, " -- ");
-      p += 4;
-
-      /* Copy in the string.  */
-      if (posix_pedantic)
-        {
-          memcpy (p, posixref, CSTRLEN (posixref));
-          p += CSTRLEN (posixref);
-        }
-      else
-        {
-          memcpy (p, ref, CSTRLEN (ref));
-          p += CSTRLEN (ref);
-        }
-    }
-
-  /* If there is a leading dash, omit it.  */
-  if (flagstring[0] == '-')
-    ++flagstring;
-
-  /* This used to use o_env, but that lost when a makefile defined MAKEFLAGS.
-     Makefiles set MAKEFLAGS to add switches, but we still want to redefine
-     its value with the full set of switches.  Then we used o_file, but that
-     lost when users added -e, causing a previous MAKEFLAGS env. var. to take
-     precedence over the new one.  Of course, an override or command
-     definition will still take precedence.  */
-  return define_variable_cname ("MAKEFLAGS", flagstring,
-                                env_overrides ? o_env_override : o_file, 1);
-}
-\f
-/* Print version information.  */
-
-static void
-print_version (void)
-{
-  static int printed_version = 0;
-
-  const char *precede = print_data_base_flag ? "# " : "";
-
-  if (printed_version)
-    /* Do it only once.  */
-    return;
-
-  printf ("%sGNU Make %s\n", precede, version_string);
-
-  if (!remote_description || *remote_description == '\0')
-    printf (_("%sBuilt for %s\n"), precede, make_host);
-  else
-    printf (_("%sBuilt for %s (%s)\n"),
-            precede, make_host, remote_description);
-
-  /* Print this untranslated.  The coding standards recommend translating the
-     (C) to the copyright symbol, but this string is going to change every
-     year, and none of the rest of it should be translated (including the
-     word "Copyright"), so it hardly seems worth it.  */
-
-  printf ("%sCopyright (C) 1988-2016 Free Software Foundation, Inc.\n",
-          precede);
-
-  printf (_("%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\
-%sThis is free software: you are free to change and redistribute it.\n\
-%sThere is NO WARRANTY, to the extent permitted by law.\n"),
-            precede, precede, precede);
-
-  printed_version = 1;
-
-  /* Flush stdout so the user doesn't have to wait to see the
-     version information while make thinks about things.  */
-  fflush (stdout);
-}
-
-/* Print a bunch of information about this and that.  */
-
-static void
-print_data_base (void)
-{
-  time_t when = time ((time_t *) 0);
-
-  print_version ();
-
-  printf (_("\n# Make data base, printed on %s"), ctime (&when));
-
-  print_variable_data_base ();
-  print_dir_data_base ();
-  print_rule_data_base ();
-  print_file_data_base ();
-  print_vpath_data_base ();
-  strcache_print_stats ("#");
-
-  when = time ((time_t *) 0);
-  printf (_("\n# Finished Make data base on %s\n"), ctime (&when));
-}
-
-static void
-clean_jobserver (int status)
-{
-  /* Sanity: have we written all our jobserver tokens back?  If our
-     exit status is 2 that means some kind of syntax error; we might not
-     have written all our tokens so do that now.  If tokens are left
-     after any other error code, that's bad.  */
-
-  if (jobserver_enabled() && jobserver_tokens)
-    {
-      if (status != 2)
-        ON (error, NILF,
-            "INTERNAL: Exiting with %u jobserver tokens (should be 0)!",
-            jobserver_tokens);
-      else
-        /* Don't write back the "free" token */
-        while (--jobserver_tokens)
-          jobserver_release (0);
-    }
-
-
-  /* Sanity: If we're the master, were all the tokens written back?  */
-
-  if (master_job_slots)
-    {
-      /* We didn't write one for ourself, so start at 1.  */
-      unsigned int tokens = 1 + jobserver_acquire_all ();
-
-      if (tokens != master_job_slots)
-        ONN (error, NILF,
-             "INTERNAL: Exiting with %u jobserver tokens available; should be %u!",
-             tokens, master_job_slots);
-
-      reset_jobserver ();
-    }
-}
-\f
-/* Exit with STATUS, cleaning up as necessary.  */
-
-void
-die (int status)
-{
-  static char dying = 0;
-
-  if (!dying)
-    {
-      int err;
-
-      dying = 1;
-
-      if (print_version_flag)
-        print_version ();
-
-      /* Wait for children to die.  */
-      err = (status != 0);
-      while (job_slots_used > 0)
-        reap_children (1, err);
-
-      /* Let the remote job module clean up its state.  */
-      remote_cleanup ();
-
-      /* Remove the intermediate files.  */
-      remove_intermediates (0);
-
-      if (print_data_base_flag)
-        print_data_base ();
-
-      if (verify_flag)
-        verify_file_data_base ();
-
-      clean_jobserver (status);
-
-      if (output_context)
-        {
-          /* die() might be called in a recipe output context due to an
-             $(error ...) function.  */
-          output_close (output_context);
-
-          if (output_context != &make_sync)
-            output_close (&make_sync);
-
-          OUTPUT_UNSET ();
-        }
-
-      output_close (NULL);
-
-      /* Try to move back to the original directory.  This is essential on
-         MS-DOS (where there is really only one process), and on Unix it
-         puts core files in the original directory instead of the -C
-         directory.  Must wait until after remove_intermediates(), or unlinks
-         of relative pathnames fail.  */
-      if (directory_before_chdir != 0)
-        {
-          /* If it fails we don't care: shut up GCC.  */
-          int _x UNUSED;
-          _x = chdir (directory_before_chdir);
-        }
-    }
-
-  exit (status);
-}
diff --git a/make.1 b/make.1
deleted file mode 100644 (file)
index d4bd284..0000000
--- a/make.1
+++ /dev/null
@@ -1,381 +0,0 @@
-.TH MAKE 1 "28 February 2016" "GNU" "User Commands"
-.SH NAME
-make \- GNU make utility to maintain groups of programs
-.SH SYNOPSIS
-.B make
-[\fIOPTION\fR]... [\fITARGET\fR]...
-.SH DESCRIPTION
-.LP
-The
-.I make
-utility will determine automatically which pieces of a large program need to
-be recompiled, and issue the commands to recompile them.  The manual describes
-the GNU implementation of
-.BR make ,
-which was written by Richard Stallman and Roland McGrath, and is currently
-maintained by Paul Smith.  Our examples show C programs, since they are very
-common, but you can use
-.B make
-with any programming language whose compiler can be run with a shell command.
-In fact,
-.B make
-is not limited to programs.  You can use it to describe any task where some
-files must be updated automatically from others whenever the others change.
-.LP
-To prepare to use
-.BR make ,
-you must write a file called the
-.I makefile
-that describes the relationships among files in your program, and the states
-the commands for updating each file.  In a program, typically the executable
-file is updated from object files, which are in turn made by compiling source
-files.
-.LP
-Once a suitable makefile exists, each time you change some source files,
-this simple shell command:
-.sp 1
-.RS
-.B make
-.RE
-.sp 1
-suffices to perform all necessary recompilations.
-The
-.B make
-program uses the makefile description and the last-modification times of the
-files to decide which of the files need to be updated.  For each of those
-files, it issues the commands recorded in the makefile.
-.LP
-.B make
-executes commands in the
-.I makefile
-to update one or more target
-.IR names ,
-where
-.I name
-is typically a program.
-If no
-.B \-f
-option is present,
-.B make
-will look for the makefiles
-.IR GNUmakefile ,
-.IR makefile ,
-and
-.IR Makefile ,
-in that order.
-.LP
-Normally you should call your makefile either
-.I makefile
-or
-.IR Makefile .
-(We recommend
-.I Makefile
-because it appears prominently near the beginning of a directory
-listing, right near other important files such as
-.IR  README .)
-The first name checked,
-.IR GNUmakefile ,
-is not recommended for most makefiles.  You should use this name if you have a
-makefile that is specific to GNU
-.BR make ,
-and will not be understood by other versions of
-.BR make .
-If
-.I makefile
-is '\-', the standard input is read.
-.LP
-.B make
-updates a target if it depends on prerequisite files
-that have been modified since the target was last modified,
-or if the target does not exist.
-.SH OPTIONS
-.sp 1
-.TP 0.5i
-\fB\-b\fR, \fB\-m\fR
-These options are ignored for compatibility with other versions of
-.BR make .
-.TP 0.5i
-\fB\-B\fR, \fB\-\-always\-make\fR
-Unconditionally make all targets.
-.TP 0.5i
-\fB\-C\fR \fIdir\fR, \fB\-\-directory\fR=\fIdir\fR
-Change to directory
-.I dir
-before reading the makefiles or doing anything else.
-If multiple
-.B \-C
-options are specified, each is interpreted relative to the
-previous one:
-.BR "\-C " /
-.BR "\-C " etc
-is equivalent to
-.BR "\-C " /etc.
-This is typically used with recursive invocations of
-.BR make .
-.TP 0.5i
-.B \-d
-Print debugging information in addition to normal processing.
-The debugging information says which files are being considered for
-remaking, which file-times are being compared and with what results,
-which files actually need to be remade, which implicit rules are
-considered and which are applied---everything interesting about how
-.B make
-decides what to do.
-.TP 0.5i
-.BI \-\-debug "[=FLAGS]"
-Print debugging information in addition to normal processing.
-If the
-.I FLAGS
-are omitted, then the behavior is the same as if
-.B \-d
-was specified.
-.I FLAGS
-may be
-.I a
-for all debugging output (same as using
-.BR \-d ),
-.I b
-for basic debugging,
-.I v
-for more verbose basic debugging,
-.I i
-for showing implicit rules,
-.I j
-for details on invocation of commands, and
-.I m
-for debugging while remaking makefiles.  Use
-.I n
-to disable all previous debugging flags.
-.TP 0.5i
-\fB\-e\fR, \fB\-\-environment\-overrides\fR
-Give variables taken from the environment precedence
-over variables from makefiles.
-.TP 0.5i
-\fB\-f\fR \fIfile\fR, \fB\-\-file\fR=\fIfile\fR, \fB\-\-makefile\fR=\fIFILE\fR
-Use
-.I file
-as a makefile.
-.TP 0.5i
-\fB\-i\fR, \fB\-\-ignore\-errors\fR
-Ignore all errors in commands executed to remake files.
-.TP 0.5i
-\fB\-I\fR \fIdir\fR, \fB\-\-include\-dir\fR=\fIdir\fR
-Specifies a directory
-.I dir
-to search for included makefiles.
-If several
-.B \-I
-options are used to specify several directories, the directories are
-searched in the order specified.
-Unlike the arguments to other flags of
-.BR make ,
-directories given with
-.B \-I
-flags may come directly after the flag:
-.BI \-I dir
-is allowed, as well as
-.B \-I
-.IR dir .
-This syntax is allowed for compatibility with the C
-preprocessor's
-.B \-I
-flag.
-.TP 0.5i
-\fB\-j\fR [\fIjobs\fR], \fB\-\-jobs\fR[=\fIjobs\fR]
-Specifies the number of
-.I jobs
-(commands) to run simultaneously.
-If there is more than one
-.B \-j
-option, the last one is effective.
-If the
-.B \-j
-option is given without an argument,
-.BR make
-will not limit the number of jobs that can run simultaneously.
-.TP 0.5i
-\fB\-k\fR, \fB\-\-keep\-going\fR
-Continue as much as possible after an error.
-While the target that failed, and those that depend on it, cannot
-be remade, the other dependencies of these targets can be processed
-all the same.
-.TP 0.5i
-\fB\-l\fR [\fIload\fR], \fB\-\-load\-average\fR[=\fIload\fR]
-Specifies that no new jobs (commands) should be started if there are
-others jobs running and the load average is at least
-.I load
-(a floating-point number).
-With no argument, removes a previous load limit.
-.TP 0.5i
-\fB\-L\fR, \fB\-\-check\-symlink\-times\fR
-Use the latest mtime between symlinks and target.
-.TP 0.5i
-\fB\-n\fR, \fB\-\-just\-print\fR, \fB\-\-dry\-run\fR, \fB\-\-recon\fR
-Print the commands that would be executed, but do not execute them (except in
-certain circumstances).
-.TP 0.5i
-\fB\-o\fR \fIfile\fR, \fB\-\-old\-file\fR=\fIfile\fR, \fB\-\-assume\-old\fR=\fIfile\fR
-Do not remake the file
-.I file
-even if it is older than its dependencies, and do not remake anything
-on account of changes in
-.IR file .
-Essentially the file is treated as very old and its rules are ignored.
-.TP 0.5i
-\fB\-O\fR[\fItype\fR], \fB\-\-output\-sync\fR[=\fItype\fR]
-When running multiple jobs in parallel with \fB-j\fR, ensure the output of
-each job is collected together rather than interspersed with output from
-other jobs.  If
-.I type
-is not specified or is
-.B target
-the output from the entire recipe for each target is grouped together.  If
-.I type
-is
-.B line
-the output from each command line within a recipe is grouped together.
-If
-.I type
-is
-.B recurse
-output from an entire recursive make is grouped together.  If
-.I type
-is
-.B none
-output synchronization is disabled.
-.TP 0.5i
-\fB\-p\fR, \fB\-\-print\-data\-base\fR
-Print the data base (rules and variable values) that results from
-reading the makefiles; then execute as usual or as otherwise
-specified.
-This also prints the version information given by the
-.B \-v
-switch (see below).
-To print the data base without trying to remake any files, use
-.IR "make \-p \-f/dev/null" .
-.TP 0.5i
-\fB\-q\fR, \fB\-\-question\fR
-``Question mode''.
-Do not run any commands, or print anything; just return an exit status
-that is zero if the specified targets are already up to date, nonzero
-otherwise.
-.TP 0.5i
-\fB\-r\fR, \fB\-\-no\-builtin\-rules\fR
-Eliminate use of the built\-in implicit rules.
-Also clear out the default list of suffixes for suffix rules.
-.TP 0.5i
-\fB\-R\fR, \fB\-\-no\-builtin\-variables\fR
-Don't define any built\-in variables.
-.TP 0.5i
-\fB\-s\fR, \fB\-\-silent\fR, \fB\-\-quiet\fR
-Silent operation; do not print the commands as they are executed.
-.TP 0.5i
-\fB\-S\fR, \fB\-\-no\-keep\-going\fR, \fB\-\-stop\fR
-Cancel the effect of the
-.B \-k
-option.
-This is never necessary except in a recursive
-.B make
-where
-.B \-k
-might be inherited from the top-level
-.B make
-via MAKEFLAGS or if you set
-.B \-k
-in MAKEFLAGS in your environment.
-.TP 0.5i
-\fB\-t\fR, \fB\-\-touch\fR
-Touch files (mark them up to date without really changing them)
-instead of running their commands.
-This is used to pretend that the commands were done, in order to fool
-future invocations of
-.BR make .
-.TP 0.5i
-.B \-\-trace
-Information about the disposition of each target is printed (why the target is
-being rebuilt and what commands are run to rebuild it).
-.TP 0.5i
-\fB\-v\fR, \fB\-\-version\fR
-Print the version of the
-.B make
-program plus a copyright, a list of authors and a notice that there
-is no warranty.
-.TP 0.5i
-\fB\-w\fR, \fB\-\-print\-directory\fR
-Print a message containing the working directory
-before and after other processing.
-This may be useful for tracking down errors from complicated nests of
-recursive
-.B make
-commands.
-.TP 0.5i
-.B \-\-no\-print\-directory
-Turn off
-.BR \-w ,
-even if it was turned on implicitly.
-.TP 0.5i
-\fB\-W\fR \fIfile\fR, \fB\-\-what\-if\fR=\fIfile\fR, \fB\-\-new\-file\fR=\fIfile\fR, \fB\-\-assume\-new\fR=\fIfile\fR
-Pretend that the target
-.I file
-has just been modified.
-When used with the
-.B \-n
-flag, this shows you what would happen if you were to modify that file.
-Without
-.BR \-n ,
-it is almost the same as running a
-.I touch
-command on the given file before running
-.BR make ,
-except that the modification time is changed only in the imagination of
-.BR make .
-.TP 0.5i
-.B \-\-warn\-undefined\-variables
-Warn when an undefined variable is referenced.
-.SH "EXIT STATUS"
-GNU
-.B make
-exits with a status of zero if all makefiles were successfully parsed
-and no targets that were built failed.  A status of one will be returned
-if the
-.B \-q
-flag was used and
-.B make
-determines that a target needs to be rebuilt.  A status of two will be
-returned if any errors were encountered.
-.SH "SEE ALSO"
-The full documentation for
-.B make
-is maintained as a Texinfo manual.  If the
-.B info
-and
-.B make
-programs are properly installed at your site, the command
-.IP
-.B info make
-.PP
-should give you access to the complete manual.
-.SH BUGS
-See the chapter ``Problems and Bugs'' in
-.IR "The GNU Make Manual" .
-.SH AUTHOR
-This manual page contributed by Dennis Morse of Stanford University.
-Further updates contributed by Mike Frysinger.  It has been reworked by Roland
-McGrath.  Maintained by Paul Smith.
-.SH "COPYRIGHT"
-Copyright \(co 1992-1993, 1996-2016 Free Software Foundation, Inc.
-This file is part of
-.IR "GNU make" .
-.LP
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-.LP
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-.LP
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see
-.IR http://www.gnu.org/licenses/ .
diff --git a/make.lnk b/make.lnk
deleted file mode 100644 (file)
index 0d983bf..0000000
--- a/make.lnk
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM LIB:cres.o "commands.o"+"job.o"+"dir.o"+"file.o"+"misc.o"+"main.o"+"read.o"+"remake.o"+"rule.o"+"implicit.o"+"default.o"+"variable.o"+"expand.o"+"function.o"+"vpath.o"+"version.o"+"ar.o"+"arscan.o"+"signame.o"+"remote-stub.o"+"getopt.o"+"getopt1.o"+"alloca.o"+"amiga.o"+"hash.o"+"strcache.o"+"output.o"
-TO "make.new"
-LIB glob/glob.lib LIB:sc.lib LIB:amiga.lib
-QUIET
-
diff --git a/make_msvc_net2003.sln b/make_msvc_net2003.sln
deleted file mode 100644 (file)
index e993896..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00\r
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "make_msvc.net2003", "make_msvc_net2003.vcproj", "{E96B5060-3240-4723-91C9-E64F1C877A04}"\r
-       ProjectSection(ProjectDependencies) = postProject\r
-       EndProjectSection\r
-EndProject\r
-Global\r
-       GlobalSection(SolutionConfiguration) = preSolution\r
-               Debug = Debug\r
-               Release = Release\r
-       EndGlobalSection\r
-       GlobalSection(ProjectConfiguration) = postSolution\r
-               {E96B5060-3240-4723-91C9-E64F1C877A04}.Debug.ActiveCfg = Debug|Win32\r
-               {E96B5060-3240-4723-91C9-E64F1C877A04}.Debug.Build.0 = Debug|Win32\r
-               {E96B5060-3240-4723-91C9-E64F1C877A04}.Release.ActiveCfg = Release|Win32\r
-               {E96B5060-3240-4723-91C9-E64F1C877A04}.Release.Build.0 = Release|Win32\r
-       EndGlobalSection\r
-       GlobalSection(ExtensibilityGlobals) = postSolution\r
-       EndGlobalSection\r
-       GlobalSection(ExtensibilityAddIns) = postSolution\r
-       EndGlobalSection\r
-EndGlobal\r
diff --git a/make_msvc_net2003.vcproj b/make_msvc_net2003.vcproj
deleted file mode 100644 (file)
index bcc2e8b..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>\r
-<VisualStudioProject\r
-       ProjectType="Visual C++"\r
-       Version="7.10"\r
-       Name="make_msvc.net2003"\r
-       ProjectGUID="{E96B5060-3240-4723-91C9-E64F1C877A04}"\r
-       Keyword="Win32Proj">\r
-       <Platforms>\r
-               <Platform\r
-                       Name="Win32"/>\r
-       </Platforms>\r
-       <Configurations>\r
-               <Configuration\r
-                       Name="Debug|Win32"\r
-                       OutputDirectory="Debug"\r
-                       IntermediateDirectory="Debug"\r
-                       ConfigurationType="1"\r
-                       CharacterSet="2">\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               Optimization="0"\r
-                               AdditionalIncludeDirectories=".;w32/include;glob"\r
-                               PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;HAVE_CONFIG_H=1;WINDOWS32=1"\r
-                               MinimalRebuild="TRUE"\r
-                               BasicRuntimeChecks="3"\r
-                               RuntimeLibrary="1"\r
-                               ForceConformanceInForLoopScope="TRUE"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="4"\r
-                               SuppressStartupBanner="TRUE"\r
-                               Detect64BitPortabilityProblems="FALSE"\r
-                               DebugInformationFormat="4"/>\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"/>\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               OutputFile="$(OutDir)/make_msvc.net2003.exe"\r
-                               LinkIncremental="2"\r
-                               GenerateDebugInformation="TRUE"\r
-                               ProgramDatabaseFile="$(OutDir)/make_msvc.net2003.pdb"\r
-                               SubSystem="1"\r
-                               TargetMachine="1"/>\r
-                       <Tool\r
-                               Name="VCMIDLTool"/>\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"/>\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                               Description="Copying config.h.W32 to config.h"\r
-                               CommandLine="if not exist config.h copy config.h.W32 config.h"/>\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"/>\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"/>\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"/>\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"/>\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"/>\r
-                       <Tool\r
-                               Name="VCManagedWrapperGeneratorTool"/>\r
-                       <Tool\r
-                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
-               </Configuration>\r
-               <Configuration\r
-                       Name="Release|Win32"\r
-                       OutputDirectory="Release"\r
-                       IntermediateDirectory="Release"\r
-                       ConfigurationType="1"\r
-                       CharacterSet="2">\r
-                       <Tool\r
-                               Name="VCCLCompilerTool"\r
-                               AdditionalIncludeDirectories=".;w32/include;glob"\r
-                               PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H=1;WINDOWS32=1"\r
-                               RuntimeLibrary="0"\r
-                               ForceConformanceInForLoopScope="TRUE"\r
-                               UsePrecompiledHeader="0"\r
-                               WarningLevel="4"\r
-                               Detect64BitPortabilityProblems="FALSE"\r
-                               DebugInformationFormat="3"/>\r
-                       <Tool\r
-                               Name="VCCustomBuildTool"/>\r
-                       <Tool\r
-                               Name="VCLinkerTool"\r
-                               OutputFile="$(OutDir)/make_msvc.net2003.exe"\r
-                               LinkIncremental="1"\r
-                               GenerateDebugInformation="TRUE"\r
-                               SubSystem="1"\r
-                               OptimizeReferences="2"\r
-                               EnableCOMDATFolding="2"\r
-                               TargetMachine="1"/>\r
-                       <Tool\r
-                               Name="VCMIDLTool"/>\r
-                       <Tool\r
-                               Name="VCPostBuildEventTool"/>\r
-                       <Tool\r
-                               Name="VCPreBuildEventTool"\r
-                               Description="Copying config.h.W32 to config.h"\r
-                               CommandLine="if not exist config.h copy config.h.W32 config.h"/>\r
-                       <Tool\r
-                               Name="VCPreLinkEventTool"/>\r
-                       <Tool\r
-                               Name="VCResourceCompilerTool"/>\r
-                       <Tool\r
-                               Name="VCWebServiceProxyGeneratorTool"/>\r
-                       <Tool\r
-                               Name="VCXMLDataGeneratorTool"/>\r
-                       <Tool\r
-                               Name="VCWebDeploymentTool"/>\r
-                       <Tool\r
-                               Name="VCManagedWrapperGeneratorTool"/>\r
-                       <Tool\r
-                               Name="VCAuxiliaryManagedWrapperGeneratorTool"/>\r
-               </Configuration>\r
-       </Configurations>\r
-       <References>\r
-       </References>\r
-       <Files>\r
-               <Filter\r
-                       Name="src"\r
-                       Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"\r
-                       UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">\r
-                       <File\r
-                               RelativePath=".\ar.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\arscan.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\commands.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\default.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\dir.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\expand.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\file.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\function.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\getloadavg.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\getopt.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\getopt1.c">\r
-                       </File>\r
-\r
-                       <File\r
-                               RelativePath=".\guile.c">\r
-                       </File>\r
-\r
-                       <File\r
-                               RelativePath=".\hash.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\strcache.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\implicit.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\job.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\load.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\output.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\main.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\misc.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\read.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\remake.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\remote-stub.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\rule.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\signame.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\variable.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\version.c">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\vpath.c">\r
-                       </File>\r
-                       <Filter\r
-                               Name="w32"\r
-                               Filter="">\r
-                               <File\r
-                                       RelativePath=".\w32\compat\dirent.c">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\compat\posixfcn.c">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\subproc\misc.c">\r
-                                       <FileConfiguration\r
-                                               Name="Debug|Win32">\r
-                                               <Tool\r
-                                                       Name="VCCLCompilerTool"\r
-                                                       ObjectFile="$(IntDir)/$(InputName)1.obj"/>\r
-                                       </FileConfiguration>\r
-                                       <FileConfiguration\r
-                                               Name="Release|Win32">\r
-                                               <Tool\r
-                                                       Name="VCCLCompilerTool"\r
-                                                       ObjectFile="$(IntDir)/$(InputName)1.obj"/>\r
-                                       </FileConfiguration>\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\pathstuff.c">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\w32os.c">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\subproc\sub_proc.c">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\subproc\w32err.c">\r
-                               </File>\r
-                       </Filter>\r
-                       <Filter\r
-                               Name="glob"\r
-                               Filter="">\r
-                               <File\r
-                                       RelativePath=".\glob\fnmatch.c">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\glob\glob.c">\r
-                               </File>\r
-                       </Filter>\r
-               </Filter>\r
-               <Filter\r
-                       Name="include"\r
-                       Filter="h;hpp;hxx;hm;inl;inc;xsd"\r
-                       UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">\r
-                       <File\r
-                               RelativePath=".\commands.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\config.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\debug.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\dep.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\filedef.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\getopt.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\gettext.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\gmk-default.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\hash.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\job.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\output.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\makeint.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\rule.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\variable.h">\r
-                       </File>\r
-                       <File\r
-                               RelativePath=".\vmsdir.h">\r
-                       </File>\r
-                       <Filter\r
-                               Name="w32"\r
-                               Filter="">\r
-                               <File\r
-                                       RelativePath=".\w32\include\dirent.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\include\pathstuff.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\subproc\proc.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\include\sub_proc.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\w32\include\w32err.h">\r
-                               </File>\r
-                       </Filter>\r
-                       <Filter\r
-                               Name="glob"\r
-                               Filter="">\r
-                               <File\r
-                                       RelativePath=".\glob\fnmatch.h">\r
-                               </File>\r
-                               <File\r
-                                       RelativePath=".\glob\glob.h">\r
-                               </File>\r
-                       </Filter>\r
-               </Filter>\r
-       </Files>\r
-       <Globals>\r
-       </Globals>\r
-</VisualStudioProject>\r
index f5796954fd10a65f936caaf3780c340676df008a..eff906ef0b8692472e6daa258b7fe0ca52fe4f2e 100644 (file)
@@ -71,14 +71,19 @@ $ if (p3.nes."WALL")
 $ then
 $   gosub check_cc_qual
 $ endif
-$ filelist = "alloca ar arscan commands default dir expand file function " + -
-             "guile hash implicit job load main misc read remake " + -
-             "remote-stub rule output signame variable version " + -
-             "vmsfunctions vmsify vpath vms_progname vms_exit " + -
-            "vms_export_symbol [.glob]glob [.glob]fnmatch getopt1 " + -
-             "getopt strcache"
-$!
-$ copy config.h-vms config.h
+$ filelist = "[.src]ar [.src]arscan [.src]commands [.src]default [.src]dir " + -
+             "[.src]expand [.src]file [.src]function [.src]guile " + -
+             "[.src]hash [.src]implicit [.src]job [.src]load [.src]main " + -
+             "[.src]misc [.src]read [.src]remake [.src]remote-stub " + -
+             "[.src]rule [.src]output [.src]signame [.src]variable " + -
+             "[.src]version [.src]strcache [.src]vpath " + -
+             "[.src]vmsfunctions [.src]vmsify [.src]vms_progname " + -
+             "[.src]vms_exit [.src]vms_export_symbol " + -
+             "[.lib]alloca [.lib]fnmatch [.lib]glob [.src]getopt1 [.src]getopt"
+$!
+$ copy [.src]config.h-vms [.src]config.h
+$ copy [.lib]fnmatch.in.h [.lib]fnmatch.h
+$ copy [.lib]glob.in.h [.lib]glob.h
 $ n=0
 $ open/write optf make.opt
 $ loop:
@@ -141,7 +146,7 @@ $ else
 $   objdir := []
 $   write optf objdir+p1
 $ endif
-$ cc'ccopt'/nested=none/include=([],[.glob])/obj='objdir' -
+$ cc'ccopt'/nested=none/include=([],[.src],[.lib])/obj='objdir' -
   /define=("allocated_variable_expand_for_file=alloc_var_expand_for_file",-
   "unlink=remove","HAVE_CONFIG_H","VMS") -
   'p1'
@@ -149,7 +154,7 @@ $ exit
 $ endsubroutine : compileit
 $!
 $!-----------------------------------------------------------------------------
-$!Copyright (C) 1996-2016 Free Software Foundation, Inc.
+$!Copyright (C) 1996-2020 Free Software Foundation, Inc.
 $!This file is part of GNU Make.
 $!
 $!GNU Make is free software; you can redistribute it and/or modify it under
diff --git a/makefile.vms b/makefile.vms
deleted file mode 100644 (file)
index 37702d5..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-# -*-Makefile-*- to build GNU make on VMS
-#
-# Copyright (C) 1996-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# VMS extensions from GNU Make 3.60 imported by
-#  Klaus Kämpf (kkaempf@rmi.de)
-# Modified for version 3.78.1 by Hartmut.Becker@compaq.com.
-# Modified for version 3.80 by zinser@decus.de
-# Modified for versions 3.81, 3.99.90 by Hartmut Becker
-
-CC = cc
-CP = copy
-
-%.obj: %.c
-       $(CC) $(CFLAGS)/obj=$@ $<
-#
-#      Makefile for GNU Make
-#
-
-ifeq ($(CC),cc)
-cinclude = /nested=none/include=([],[.glob])
-cprefix = /prefix=(all,except=(glob,globfree))
-cwarn = /standard=relaxed/warn=(disable=questcompare)
-CFLAGS = $(defines) $(cinclude)$(cprefix)$(cwarn)
-else
-CFLAGS = $(defines) $(cinclude)
-endif
-#LDFLAGS = /deb
-LDFLAGS =
-
-ifeq ($(CC),cc)
-defines = /define=("unlink=remove","HAVE_CONFIG_H","VMS","allocated_variable_expand_for_file=alloc_var_expand_for_file")
-else
-ifeq ($(ARCH),VAX)
-defines = /define=("HAVE_CONFIG_H","GCC_IS_NATIVE","VAX")
-else
-defines = /define=("HAVE_CONFIG_H","GCC_IS_NATIVE")
-endif
-endif
-
-LOAD_AVG = /define="NO_LDAV"
-
-# If you don't want archive support, comment these out.
-ARCHIVES = ,ar.obj,arscan.obj
-ARCHIVES_SRC = ar.c arscan.c
-
-# If your system needs extra libraries loaded in, define them here.
-# System V probably need -lPW for alloca.
-# if on vax, uncomment the following line
-#LOADLIBES = ,c.opt/opt
-ifeq ($(CC),cc)
-#LOADLIBES =,sys$$library:vaxcrtl.olb/lib
-CRT0 =
-else
-LOADLIBES =,gnu_cc_library:libgcc.olb/lib
-endif
-
-# If your system doesn't have alloca, or the one provided is bad,
-# get it from the Emacs distribution and define these.
-#ALLOCA = ,alloca.obj
-#ALLOCASRC = alloca.c
-
-# If there are remote execution facilities defined,
-# enable them with switches here (see remote-*.c).
-REMOTE =
-
-# Any extra object files your system needs.
-extras = ,signame.obj,remote-stub.obj,vmsfunctions.obj,vmsify.obj
-#,directory.obj
-# as an alternative:
-glob = ,[.glob]glob.obj,[.glob]fnmatch.obj
-getopt = ,getopt.obj,getopt1.obj
-# Directory to install 'make' in.
-bindir = []
-# Directory to install the man page in.
-mandir = []
-# Number to put on the man page filename.
-manext = 1
-
-guile = ,guile.obj
-
-objs = commands.obj,job.obj,output.obj,dir.obj,file.obj,misc.obj,hash.obj,\
-       load.obj,main.obj,read.obj,remake.obj,rule.obj,implicit.obj,\
-       default.obj,variable.obj,expand.obj,function.obj,strcache.obj,\
-       vpath.obj,version.obj,vms_progname.obj,vms_exit.obj,\
-       vms_export_symbol.obj$(guile)$(ARCHIVES)$(extras)$(getopt)$(glob)
-
-srcs = commands.c job.c output.c dir.c file.c misc.c guile.c hash.c \
-       load.c main.c read.c remake.c rule.c implicit.c \
-       default.c variable.c expand.c function.c strcache.c \
-       vpath.c version.c vmsfunctions.c vmsify.c vms_progname.c vms_exit.c \
-       vms_export_symbol.c $(ARCHIVES_SRC) $(ALLOCASRC) \
-       commands.h dep.h filedef.h job.h output.h makeint.h rule.h variable.h
-
-
-.PHONY: all doc
-all: config.h make.exe
-
-doc: make.info make.dvi
-
-
-make.exe: $(objs)
-       $(LD)$(LDFLAGS)/exe=$@ $^$(LOADLIBES)$(CRT0)
-
-.PHONY: clean realclean
-clean:
-       -purge [...]
-       -$(RM) make.exe;,*.obj;
-       -$(RM) [.glob]*.obj;
-
-ar.obj: ar.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h dep.h \
-     [.glob]fnmatch.h
-arscan.obj: arscan.c makeint.h config.h gnumake.h gettext.h
-commands.obj: commands.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h dep.h variable.h job.h output.h commands.h
-default.obj: default.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h variable.h rule.h dep.h job.h output.h commands.h
-dir.obj: dir.c makeint.h config.h gnumake.h gettext.h hash.h filedef.h \
-     dep.h [.glob]glob.h
-expand.obj: expand.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h job.h output.h commands.h variable.h rule.h
-file.obj: file.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \
-     dep.h job.h output.h commands.h variable.h debug.h
-[.glob]fnmatch.obj: [.glob]fnmatch.c config.h [.glob]fnmatch.h
-function.obj: function.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h variable.h dep.h job.h output.h commands.h debug.h
-getopt.obj: getopt.c config.h gettext.h getopt.h
-getopt1.obj: getopt1.c config.h getopt.h
-[.glob]glob.obj: [.glob]glob.c config.h [.glob]fnmatch.h [.glob]glob.h
-guile.obj: guile.c makeint.h config.h gnumake.h gettext.h
-hash.obj: hash.c makeint.h config.h gnumake.h gettext.h hash.h
-implicit.obj: implicit.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h rule.h dep.h debug.h variable.h job.h output.h commands.h
-job.obj: job.c makeint.h config.h gnumake.h gettext.h job.h output.h debug.h \
-     filedef.h hash.h commands.h variable.h debug.h vmsjobs.c
-load.obj: load.c makeint.h config.h gnumake.h gettext.h
-main.obj: main.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \
-     dep.h variable.h job.h output.h commands.h rule.h debug.h getopt.h
-misc.obj: misc.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \
-     dep.h debug.h
-output.obj: output.c makeint.h config.h gnumake.h gettext.h job.h output.h
-read.obj: read.c makeint.h config.h gnumake.h gettext.h [.glob]glob.h \
-     filedef.h hash.h dep.h job.h output.h commands.h variable.h rule.h \
-     debug.h
-remake.obj: remake.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h job.h output.h commands.h dep.h variable.h debug.h
-remote-stub.obj: remote-stub.c makeint.h config.h gnumake.h gettext.h \
-     filedef.h hash.h job.h output.h commands.h
-rule.obj: rule.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \
-     dep.h job.h output.h commands.h variable.h rule.h
-signame.obj: signame.c makeint.h config.h gnumake.h gettext.h
-strcache.obj: strcache.c makeint.h config.h gnumake.h gettext.h hash.h
-variable.obj: variable.c makeint.h config.h gnumake.h gettext.h filedef.h \
-     hash.h dep.h job.h output.h commands.h variable.h rule.h
-version.obj: version.c config.h
-vmsfunctions.obj: vmsfunctions.c makeint.h config.h gnumake.h gettext.h \
-     debug.h job.h output.h vmsdir.h
-vmsify.obj: vmsify.c
-vpath.obj: vpath.c makeint.h config.h gnumake.h gettext.h filedef.h hash.h \
-     variable.h
-vms_progname.obj: vms_progname.c
-vms_exit.obj: vms_exit.c
-vms_export_symbol.obj: vms_export_symbol.c
-
-config.h: config.h-vms
-       $(CP) $< $@
diff --git a/makeint.h b/makeint.h
deleted file mode 100644 (file)
index 8f718eb..0000000
--- a/makeint.h
+++ /dev/null
@@ -1,792 +0,0 @@
-/* Miscellaneous global declarations and portability cruft for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* We use <config.h> instead of "config.h" so that a compilation
-   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
-   (which it would do because makeint.h was found in $srcdir).  */
-#include <config.h>
-#undef  HAVE_CONFIG_H
-#define HAVE_CONFIG_H 1
-
-/* Specify we want GNU source code.  This must be defined before any
-   system headers are included.  */
-
-#define _GNU_SOURCE 1
-
-/* AIX requires this to be the first thing in the file.  */
-#if HAVE_ALLOCA_H
-# include <alloca.h>
-#else
-# ifdef _AIX
- #pragma alloca
-# else
-#  if !defined(__GNUC__) && !defined(WINDOWS32)
-#   ifndef alloca /* predefined by HP cc +Olibcalls */
-char *alloca ();
-#   endif
-#  endif
-# endif
-#endif
-
-/* Disable assert() unless we're a maintainer.
-   Some asserts are compute-intensive.  */
-#ifndef MAKE_MAINTAINER_MODE
-# define NDEBUG 1
-#endif
-
-/* Include the externally-visible content.
-   Be sure to use the local one, and not one installed on the system.
-   Define GMK_BUILDING_MAKE for proper selection of dllexport/dllimport
-   declarations for MS-Windows.  */
-#ifdef WINDOWS32
-# define GMK_BUILDING_MAKE
-#endif
-#include "gnumake.h"
-
-#ifdef  CRAY
-/* This must happen before #include <signal.h> so
-   that the declaration therein is changed.  */
-# define signal bsdsignal
-#endif
-
-/* If we're compiling for the dmalloc debugger, turn off string inlining.  */
-#if defined(HAVE_DMALLOC_H) && defined(__GNUC__)
-# define __NO_STRING_INLINES
-#endif
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <stdio.h>
-#include <ctype.h>
-
-#ifdef HAVE_SYS_TIMEB_H
-/* SCO 3.2 "devsys 4.2" has a prototype for 'ftime' in <time.h> that bombs
-   unless <sys/timeb.h> has been included first.  */
-# include <sys/timeb.h>
-#endif
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
-#endif
-
-#include <errno.h>
-
-#ifndef errno
-extern int errno;
-#endif
-
-#ifdef __VMS
-/* In strict ANSI mode, VMS compilers should not be defining the
-   VMS macro.  Define it here instead of a bulk edit for the correct code.
- */
-# ifndef VMS
-#  define VMS
-# endif
-#endif
-
-#ifdef  HAVE_UNISTD_H
-# include <unistd.h>
-/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get
-   POSIX.1 behavior with 'cc -YPOSIX', which predefines POSIX itself!  */
-# if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS)
-#  define POSIX 1
-# endif
-#endif
-
-/* Some systems define _POSIX_VERSION but are not really POSIX.1.  */
-#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386)))
-# undef POSIX
-#endif
-
-#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE)
-# define POSIX 1
-#endif
-
-#ifndef RETSIGTYPE
-# define RETSIGTYPE     void
-#endif
-
-#ifndef sigmask
-# define sigmask(sig)   (1 << ((sig) - 1))
-#endif
-
-#ifndef HAVE_SA_RESTART
-# define SA_RESTART 0
-#endif
-
-#ifdef HAVE_VFORK_H
-# include <vfork.h>
-#endif
-
-#ifdef  HAVE_LIMITS_H
-# include <limits.h>
-#endif
-#ifdef  HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-
-#ifndef PATH_MAX
-# ifndef POSIX
-#  define PATH_MAX      MAXPATHLEN
-# endif
-#endif
-#ifndef MAXPATHLEN
-# define MAXPATHLEN 1024
-#endif
-
-#ifdef  PATH_MAX
-# define GET_PATH_MAX   PATH_MAX
-# define PATH_VAR(var)  char var[PATH_MAX]
-#else
-# define NEED_GET_PATH_MAX 1
-# define GET_PATH_MAX   (get_path_max ())
-# define PATH_VAR(var)  char *var = alloca (GET_PATH_MAX)
-unsigned int get_path_max (void);
-#endif
-
-#ifndef CHAR_BIT
-# define CHAR_BIT 8
-#endif
-
-#ifndef USHRT_MAX
-# define USHRT_MAX 65535
-#endif
-
-/* Nonzero if the integer type T is signed.
-   Use <= to avoid GCC warnings about always-false expressions.  */
-#define INTEGER_TYPE_SIGNED(t) ((t) -1 <= 0)
-
-/* The minimum and maximum values for the integer type T.
-   Use ~ (t) 0, not -1, for portability to 1's complement hosts.  */
-#define INTEGER_TYPE_MINIMUM(t) \
-  (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))
-#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t))
-
-#ifndef CHAR_MAX
-# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char)
-#endif
-
-#ifdef STAT_MACROS_BROKEN
-# ifdef S_ISREG
-#  undef S_ISREG
-# endif
-# ifdef S_ISDIR
-#  undef S_ISDIR
-# endif
-#endif  /* STAT_MACROS_BROKEN.  */
-
-#ifndef S_ISREG
-# define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
-#endif
-#ifndef S_ISDIR
-# define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
-#endif
-
-#ifdef VMS
-# include <fcntl.h>
-# include <types.h>
-# include <unixlib.h>
-# include <unixio.h>
-# include <perror.h>
-/* Needed to use alloca on VMS.  */
-# include <builtins.h>
-
-extern int vms_use_mcr_command;
-extern int vms_always_use_cmd_file;
-extern int vms_gnv_shell;
-extern int vms_comma_separator;
-extern int vms_legacy_behavior;
-extern int vms_unix_simulation;
-#endif
-
-#ifndef __attribute__
-/* This feature is available in gcc versions 2.5 and later.  */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
-#  define __attribute__(x)
-# endif
-/* The __-protected variants of 'format' and 'printf' attributes
-   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
-# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
-#  define __format__ format
-#  define __printf__ printf
-# endif
-#endif
-#define UNUSED  __attribute__ ((unused))
-
-#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
-# include <stdlib.h>
-# include <string.h>
-# define ANSI_STRING 1
-#else   /* No standard headers.  */
-# ifdef HAVE_STRING_H
-#  include <string.h>
-#  define ANSI_STRING 1
-# else
-#  include <strings.h>
-# endif
-# ifdef HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# else
-void *malloc (int);
-void *realloc (void *, int);
-void free (void *);
-
-void abort (void) __attribute__ ((noreturn));
-void exit (int) __attribute__ ((noreturn));
-# endif /* HAVE_STDLIB_H.  */
-
-#endif /* Standard headers.  */
-
-/* These should be in stdlib.h.  Make sure we have them.  */
-#ifndef EXIT_SUCCESS
-# define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-# define EXIT_FAILURE 1
-#endif
-
-#ifndef  ANSI_STRING
-
-/* SCO Xenix has a buggy macro definition in <string.h>.  */
-#undef  strerror
-#if !defined(__DECC)
-char *strerror (int errnum);
-#endif
-
-#endif  /* !ANSI_STRING.  */
-#undef  ANSI_STRING
-
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#if HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#define FILE_TIMESTAMP uintmax_t
-
-#if !defined(HAVE_STRSIGNAL)
-char *strsignal (int signum);
-#endif
-
-/* ISDIGIT offers the following features:
-   - Its arg may be any int or unsigned int; it need not be an unsigned char.
-   - It's guaranteed to evaluate its argument exactly once.
-      NOTE!  Make relies on this behavior, don't change it!
-   - It's typically faster.
-   POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
-   only '0' through '9' are digits.  Prefer ISDIGIT to isdigit() unless
-   it's important to use the locale's definition of 'digit' even when the
-   host does not conform to POSIX.  */
-#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
-
-/* Test if two strings are equal. Is this worthwhile?  Should be profiled.  */
-#define streq(a, b) \
-   ((a) == (b) || \
-    (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
-
-/* Test if two strings are equal, but match case-insensitively on systems
-   which have case-insensitive filesystems.  Should only be used for
-   filenames!  */
-#ifdef HAVE_CASE_INSENSITIVE_FS
-# define patheq(a, b) \
-    ((a) == (b) \
-     || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \
-         && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1))))
-#else
-# define patheq(a, b) streq(a, b)
-#endif
-
-#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0)
-
-#if defined(__GNUC__) || defined(ENUM_BITFIELDS)
-# define ENUM_BITFIELD(bits)    :bits
-#else
-# define ENUM_BITFIELD(bits)
-#endif
-
-/* Handle gettext and locales.  */
-
-#if HAVE_LOCALE_H
-# include <locale.h>
-#else
-# define setlocale(category, locale)
-#endif
-
-#include <gettext.h>
-
-#define _(msgid)            gettext (msgid)
-#define N_(msgid)           gettext_noop (msgid)
-#define S_(msg1,msg2,num)   ngettext (msg1,msg2,num)
-
-/* This is needed for getcwd() and chdir(), on some W32 systems.  */
-#if defined(HAVE_DIRECT_H)
-# include <direct.h>
-#endif
-
-#ifdef WINDOWS32
-# include <fcntl.h>
-# include <malloc.h>
-# define pipe(_p)        _pipe((_p), 512, O_BINARY)
-# define kill(_pid,_sig) w32_kill((_pid),(_sig))
-/* MSVC and Watcom C don't have ftruncate.  */
-# if defined(_MSC_VER) || defined(__WATCOMC__)
-#  define ftruncate(_fd,_len) _chsize(_fd,_len)
-# endif
-/* MinGW64 doesn't have _S_ISDIR.  */
-# ifndef _S_ISDIR
-#  define _S_ISDIR(m)  S_ISDIR(m)
-# endif
-
-void sync_Path_environment (void);
-int w32_kill (pid_t pid, int sig);
-int find_and_set_default_shell (const char *token);
-
-/* indicates whether or not we have Bourne shell */
-extern int no_default_sh_exe;
-
-/* is default_shell unixy? */
-extern int unixy_shell;
-
-/* We don't have a preferred fixed value for LOCALEDIR.  */
-# ifndef LOCALEDIR
-#  define LOCALEDIR NULL
-# endif
-
-/* Include only the minimal stuff from windows.h.   */
-# define WIN32_LEAN_AND_MEAN
-#endif  /* WINDOWS32 */
-
-#define ANY_SET(_v,_m)  (((_v)&(_m)) != 0)
-#define NONE_SET(_v,_m) (! ANY_SET ((_v),(_m)))
-
-#define MAP_NUL         0x0001
-#define MAP_BLANK       0x0002
-#define MAP_NEWLINE     0x0004
-#define MAP_COMMENT     0x0008
-#define MAP_SEMI        0x0010
-#define MAP_EQUALS      0x0020
-#define MAP_COLON       0x0040
-#define MAP_PERCENT     0x0080
-#define MAP_PIPE        0x0100
-#define MAP_DOT         0x0200
-#define MAP_COMMA       0x0400
-
-/* These are the valid characters for a user-defined function.  */
-#define MAP_USERFUNC    0x2000
-/* This means not only a '$', but skip the variable reference.  */
-#define MAP_VARIABLE    0x4000
-/* The set of characters which are directory separators is OS-specific.  */
-#define MAP_DIRSEP      0x8000
-
-#ifdef VMS
-# define MAP_VMSCOMMA   MAP_COMMA
-#else
-# define MAP_VMSCOMMA   0x0000
-#endif
-
-#define MAP_SPACE       (MAP_BLANK|MAP_NEWLINE)
-
-/* Handle other OSs.
-   To overcome an issue parsing paths in a DOS/Windows environment when
-   built in a unix based environment, override the PATH_SEPARATOR_CHAR
-   definition unless being built for Cygwin. */
-#if defined(HAVE_DOS_PATHS) && !defined(__CYGWIN__)
-# undef PATH_SEPARATOR_CHAR
-# define PATH_SEPARATOR_CHAR ';'
-# define MAP_PATHSEP    MAP_SEMI
-#elif !defined(PATH_SEPARATOR_CHAR)
-# if defined (VMS)
-#  define PATH_SEPARATOR_CHAR (vms_comma_separator ? ',' : ':')
-#  define MAP_PATHSEP    (vms_comma_separator ? MAP_COMMA : MAP_SEMI)
-# else
-#  define PATH_SEPARATOR_CHAR ':'
-#  define MAP_PATHSEP    MAP_COLON
-# endif
-#elif PATH_SEPARATOR_CHAR == ':'
-# define MAP_PATHSEP     MAP_COLON
-#elif PATH_SEPARATOR_CHAR == ';'
-# define MAP_PATHSEP     MAP_SEMI
-#elif PATH_SEPARATOR_CHAR == ','
-# define MAP_PATHSEP     MAP_COMMA
-#else
-# error "Unknown PATH_SEPARATOR_CHAR"
-#endif
-
-#define STOP_SET(_v,_m) ANY_SET(stopchar_map[(unsigned char)(_v)],(_m))
-
-#define ISBLANK(c)      STOP_SET((c),MAP_BLANK)
-#define ISSPACE(c)      STOP_SET((c),MAP_SPACE)
-#define NEXT_TOKEN(s)   while (ISSPACE (*(s))) ++(s)
-#define END_OF_TOKEN(s) while (! STOP_SET (*(s), MAP_SPACE|MAP_NUL)) ++(s)
-
-#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT)
-# define SET_STACK_SIZE
-#endif
-#ifdef SET_STACK_SIZE
-# include <sys/resource.h>
-extern struct rlimit stack_limit;
-#endif
-
-#include <glob.h>
-
-#define NILF ((floc *)0)
-
-#define CSTRLEN(_s)           (sizeof (_s)-1)
-#define STRING_SIZE_TUPLE(_s) (_s), CSTRLEN(_s)
-
-/* The number of bytes needed to represent the largest integer as a string.  */
-#define INTSTR_LENGTH         CSTRLEN ("18446744073709551616")
-
-#define DEFAULT_TTYNAME "true"
-#ifdef HAVE_TTYNAME
-# define TTYNAME(_f) ttyname (_f)
-#else
-# define TTYNAME(_f) DEFAULT_TTYNAME
-#endif
-
-\f
-
-/* Specify the location of elements read from makefiles.  */
-typedef struct
-  {
-    const char *filenm;
-    unsigned long lineno;
-    unsigned long offset;
-  } floc;
-
-const char *concat (unsigned int, ...);
-void message (int prefix, size_t length, const char *fmt, ...)
-              __attribute__ ((__format__ (__printf__, 3, 4)));
-void error (const floc *flocp, size_t length, const char *fmt, ...)
-            __attribute__ ((__format__ (__printf__, 3, 4)));
-void fatal (const floc *flocp, size_t length, const char *fmt, ...)
-            __attribute__ ((noreturn, __format__ (__printf__, 3, 4)));
-
-#define O(_t,_a,_f)           _t((_a), 0, (_f))
-#define OS(_t,_a,_f,_s)       _t((_a), strlen (_s), (_f), (_s))
-#define OSS(_t,_a,_f,_s1,_s2) _t((_a), strlen (_s1) + strlen (_s2), \
-                                 (_f), (_s1), (_s2))
-#define OSSS(_t,_a,_f,_s1,_s2,_s3) _t((_a), strlen (_s1) + strlen (_s2) + strlen (_s3), \
-                                      (_f), (_s1), (_s2), (_s3))
-#define ON(_t,_a,_f,_n)       _t((_a), INTSTR_LENGTH, (_f), (_n))
-#define ONN(_t,_a,_f,_n1,_n2) _t((_a), INTSTR_LENGTH*2, (_f), (_n1), (_n2))
-
-#define OSN(_t,_a,_f,_s,_n)   _t((_a), strlen (_s) + INTSTR_LENGTH, \
-                                 (_f), (_s), (_n))
-#define ONS(_t,_a,_f,_n,_s)   _t((_a), INTSTR_LENGTH + strlen (_s), \
-                                 (_f), (_n), (_s))
-
-#define OUT_OF_MEM() O (fatal, NILF, _("virtual memory exhausted"))
-
-void die (int) __attribute__ ((noreturn));
-void pfatal_with_name (const char *) __attribute__ ((noreturn));
-void perror_with_name (const char *, const char *);
-#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
-void *xmalloc (unsigned int);
-void *xcalloc (unsigned int);
-void *xrealloc (void *, unsigned int);
-char *xstrdup (const char *);
-char *xstrndup (const char *, unsigned int);
-char *find_next_token (const char **, unsigned int *);
-char *next_token (const char *);
-char *end_of_token (const char *);
-void collapse_continuations (char *);
-char *lindex (const char *, const char *, int);
-int alpha_compare (const void *, const void *);
-void print_spaces (unsigned int);
-char *find_percent (char *);
-const char *find_percent_cached (const char **);
-
-#ifndef NO_ARCHIVES
-int ar_name (const char *);
-void ar_parse_name (const char *, char **, char **);
-int ar_touch (const char *);
-time_t ar_member_date (const char *);
-
-typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated,
-                                      long int hdrpos, long int datapos,
-                                      long int size, long int date, int uid,
-                                      int gid, unsigned int mode,
-                                      const void *arg);
-
-long int ar_scan (const char *archive, ar_member_func_t function, const void *arg);
-int ar_name_equal (const char *name, const char *mem, int truncated);
-#ifndef VMS
-int ar_member_touch (const char *arname, const char *memname);
-#endif
-#endif
-
-int dir_file_exists_p (const char *, const char *);
-int file_exists_p (const char *);
-int file_impossible_p (const char *);
-void file_impossible (const char *);
-const char *dir_name (const char *);
-void print_dir_data_base (void);
-void dir_setup_glob (glob_t *);
-void hash_init_directories (void);
-
-void define_default_variables (void);
-void undefine_default_variables (void);
-void set_default_suffixes (void);
-void install_default_suffix_rules (void);
-void install_default_implicit_rules (void);
-
-void build_vpath_lists (void);
-void construct_vpath_list (char *pattern, char *dirpath);
-const char *vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr,
-                          unsigned int* vpath_index, unsigned int* path_index);
-int gpath_search (const char *file, unsigned int len);
-
-void construct_include_path (const char **arg_dirs);
-
-void user_access (void);
-void make_access (void);
-void child_access (void);
-
-char *strip_whitespace (const char **begpp, const char **endpp);
-
-void show_goal_error (void);
-
-/* String caching  */
-void strcache_init (void);
-void strcache_print_stats (const char *prefix);
-int strcache_iscached (const char *str);
-const char *strcache_add (const char *str);
-const char *strcache_add_len (const char *str, unsigned int len);
-
-/* Guile support  */
-int guile_gmake_setup (const floc *flocp);
-
-/* Loadable object support.  Sets to the strcached name of the loaded file.  */
-typedef int (*load_func_t)(const floc *flocp);
-int load_file (const floc *flocp, const char **filename, int noerror);
-void unload_file (const char *name);
-
-/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
-   because such systems often declare them in header files anyway.  */
-
-#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
-
-long int atol ();
-# ifndef VMS
-long int lseek ();
-# endif
-
-# ifdef  HAVE_GETCWD
-#  if !defined(VMS) && !defined(__DECC)
-char *getcwd ();
-#  endif
-# else
-char *getwd ();
-#  define getcwd(buf, len)       getwd (buf)
-# endif
-
-#endif  /* Not GNU C library or POSIX.  */
-
-#if !HAVE_STRCASECMP
-# if HAVE_STRICMP
-#  define strcasecmp stricmp
-# elif HAVE_STRCMPI
-#  define strcasecmp strcmpi
-# else
-/* Create our own, in misc.c */
-int strcasecmp (const char *s1, const char *s2);
-# endif
-#endif
-
-#if !HAVE_STRNCASECMP
-# if HAVE_STRNICMP
-#  define strncasecmp strnicmp
-# elif HAVE_STRNCMPI
-#  define strncasecmp strncmpi
-# else
-/* Create our own, in misc.c */
-int strncasecmp (const char *s1, const char *s2, int n);
-# endif
-#endif
-
-#define OUTPUT_SYNC_NONE    0
-#define OUTPUT_SYNC_LINE    1
-#define OUTPUT_SYNC_TARGET  2
-#define OUTPUT_SYNC_RECURSE 3
-
-/* Non-GNU systems may not declare this in unistd.h.  */
-extern char **environ;
-
-extern const floc *reading_file;
-extern const floc **expanding_var;
-
-extern unsigned short stopchar_map[];
-
-extern int just_print_flag, silent_flag, ignore_errors_flag, keep_going_flag;
-extern int print_data_base_flag, question_flag, touch_flag, always_make_flag;
-extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag;
-extern int print_version_flag, print_directory_flag, check_symlink_flag;
-extern int warn_undefined_variables_flag, trace_flag, posix_pedantic;
-extern int not_parallel, second_expansion, clock_skew_detected;
-extern int rebuilding_makefiles, one_shell, output_sync, verify_flag;
-
-extern const char *default_shell;
-
-/* can we run commands via 'sh -c xxx' or must we use batch files? */
-extern int batch_mode_shell;
-
-/* Resetting the command script introduction prefix character.  */
-#define RECIPEPREFIX_NAME          ".RECIPEPREFIX"
-#define RECIPEPREFIX_DEFAULT       '\t'
-extern char cmd_prefix;
-
-extern unsigned int job_slots;
-#ifndef NO_FLOAT
-extern double max_load_average;
-#else
-extern int max_load_average;
-#endif
-
-#ifdef WINDOWS32
-extern char *program;
-#else
-extern const char *program;
-#endif
-
-#ifdef VMS
-const char *vms_command (const char *argv0);
-const char *vms_progname (const char *argv0);
-
-void vms_exit (int);
-# define _exit(foo) vms_exit(foo)
-# define exit(foo) vms_exit(foo)
-
-extern char *program_name;
-
-void
-set_program_name (const char *arv0);
-
-int
-need_vms_symbol (void);
-
-int
-create_foreign_command (const char *command, const char *image);
-
-int
-vms_export_dcl_symbol (const char *name, const char *value);
-
-int
-vms_putenv_symbol (const char *string);
-
-void
-vms_restore_symbol (const char *string);
-
-#endif
-
-void remote_setup (void);
-void remote_cleanup (void);
-int start_remote_job_p (int);
-int start_remote_job (char **, char **, int, int *, int *, int *);
-int remote_status (int *, int *, int *, int);
-void block_remote_children (void);
-void unblock_remote_children (void);
-int remote_kill (int id, int sig);
-void print_variable_data_base (void);
-void print_vpath_data_base (void);
-
-extern char *starting_directory;
-extern unsigned int makelevel;
-extern char *version_string, *remote_description, *make_host;
-
-extern unsigned int commands_started;
-
-extern int handling_fatal_signal;
-
-
-#ifndef MIN
-#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
-#endif
-#ifndef MAX
-#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
-#endif
-
-
-#define MAKE_SUCCESS 0
-#define MAKE_TROUBLE 1
-#define MAKE_FAILURE 2
-
-/* Set up heap debugging library dmalloc.  */
-
-#ifdef HAVE_DMALLOC_H
-#include <dmalloc.h>
-#endif
-
-#ifndef initialize_main
-# ifdef __EMX__
-#  define initialize_main(pargc, pargv) \
-                          { _wildcard(pargc, pargv); _response(pargc, pargv); }
-# else
-#  define initialize_main(pargc, pargv)
-# endif
-#endif
-
-#ifdef __EMX__
-# if !defined chdir
-#  define chdir _chdir2
-# endif
-# if !defined getcwd
-#  define getcwd _getcwd2
-# endif
-
-/* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of
-   chdir() and getcwd(). This avoids some error messages for the
-   make testsuite but restricts the drive letter support. */
-# ifdef NO_CHDIR2
-#  warning NO_CHDIR2: usage of drive letters restricted
-#  undef chdir
-#  undef getcwd
-# endif
-#endif
-
-#ifndef initialize_main
-# define initialize_main(pargc, pargv)
-#endif
-
-
-/* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag
-   properly according to POSIX.  So, we try to wrap common system calls with
-   checks for EINTR.  Note that there are still plenty of system calls that
-   can fail with EINTR but this, reportedly, gets the vast majority of
-   failure cases.  If you still experience failures you'll need to either get
-   a system where SA_RESTART works, or you need to avoid -j.  */
-
-#define EINTRLOOP(_v,_c)   while (((_v)=_c)==-1 && errno==EINTR)
-
-/* While system calls that return integers are pretty consistent about
-   returning -1 on failure and setting errno in that case, functions that
-   return pointers are not always so well behaved.  Sometimes they return
-   NULL for expected behavior: one good example is readdir() which returns
-   NULL at the end of the directory--and _doesn't_ reset errno.  So, we have
-   to do it ourselves here.  */
-
-#define ENULLLOOP(_v,_c)   do { errno = 0; (_v) = _c; } \
-                           while((_v)==0 && errno==EINTR)
diff --git a/misc.c b/misc.c
deleted file mode 100644 (file)
index e7ab809..0000000
--- a/misc.c
+++ /dev/null
@@ -1,712 +0,0 @@
-/* Miscellaneous generic support functions for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "dep.h"
-#include "debug.h"
-
-/* GNU make no longer supports pre-ANSI89 environments.  */
-
-#include <stdarg.h>
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#else
-# include <sys/file.h>
-#endif
-
-/* Compare strings *S1 and *S2.
-   Return negative if the first is less, positive if it is greater,
-   zero if they are equal.  */
-
-int
-alpha_compare (const void *v1, const void *v2)
-{
-  const char *s1 = *((char **)v1);
-  const char *s2 = *((char **)v2);
-
-  if (*s1 != *s2)
-    return *s1 - *s2;
-  return strcmp (s1, s2);
-}
-\f
-/* Discard each backslash-newline combination from LINE.
-   Backslash-backslash-newline combinations become backslash-newlines.
-   This is done by copying the text at LINE into itself.  */
-
-void
-collapse_continuations (char *line)
-{
-  char *in, *out, *p;
-
-  in = strchr (line, '\n');
-  if (in == 0)
-    return;
-
-  out = in;
-  while (out > line && out[-1] == '\\')
-    --out;
-
-  while (*in != '\0')
-    {
-      /* BS_WRITE gets the number of quoted backslashes at
-         the end just before IN, and BACKSLASH gets nonzero
-         if the next character is quoted.  */
-      unsigned int backslash = 0;
-      unsigned int bs_write = 0;
-      for (p = in - 1; p >= line && *p == '\\'; --p)
-        {
-          if (backslash)
-            ++bs_write;
-          backslash = !backslash;
-
-          /* It should be impossible to go back this far without exiting,
-             but if we do, we can't get the right answer.  */
-          if (in == out - 1)
-            abort ();
-        }
-
-      /* Output the appropriate number of backslashes.  */
-      while (bs_write-- > 0)
-        *out++ = '\\';
-
-      /* Skip the newline.  */
-      ++in;
-
-      if (backslash)
-        {
-          /* Backslash/newline handling:
-             In traditional GNU make all trailing whitespace, consecutive
-             backslash/newlines, and any leading non-newline whitespace on the
-             next line is reduced to a single space.
-             In POSIX, each backslash/newline and is replaced by a space.  */
-          while (ISBLANK (*in))
-            ++in;
-          if (! posix_pedantic)
-            while (out > line && ISBLANK (out[-1]))
-              --out;
-          *out++ = ' ';
-        }
-      else
-        /* If the newline isn't quoted, put it in the output.  */
-        *out++ = '\n';
-
-      /* Now copy the following line to the output.
-         Stop when we find backslashes followed by a newline.  */
-      while (*in != '\0')
-        if (*in == '\\')
-          {
-            p = in + 1;
-            while (*p == '\\')
-              ++p;
-            if (*p == '\n')
-              {
-                in = p;
-                break;
-              }
-            while (in < p)
-              *out++ = *in++;
-          }
-        else
-          *out++ = *in++;
-    }
-
-  *out = '\0';
-}
-\f
-/* Print N spaces (used in debug for target-depth).  */
-
-void
-print_spaces (unsigned int n)
-{
-  while (n-- > 0)
-    putchar (' ');
-}
-
-\f
-/* Return a string whose contents concatenate the NUM strings provided
-   This string lives in static, re-used memory.  */
-
-const char *
-concat (unsigned int num, ...)
-{
-  static unsigned int rlen = 0;
-  static char *result = NULL;
-  unsigned int ri = 0;
-  va_list args;
-
-  va_start (args, num);
-
-  while (num-- > 0)
-    {
-      const char *s = va_arg (args, const char *);
-      unsigned int l = xstrlen (s);
-
-      if (l == 0)
-        continue;
-
-      if (ri + l > rlen)
-        {
-          rlen = ((rlen ? rlen : 60) + l) * 2;
-          result = xrealloc (result, rlen);
-        }
-
-      memcpy (result + ri, s, l);
-      ri += l;
-    }
-
-  va_end (args);
-
-  /* Get some more memory if we don't have enough space for the
-     terminating '\0'.   */
-  if (ri == rlen)
-    {
-      rlen = (rlen ? rlen : 60) * 2;
-      result = xrealloc (result, rlen);
-    }
-
-  result[ri] = '\0';
-
-  return result;
-}
-\f
-
-#ifndef HAVE_STRERROR
-#undef  strerror
-char *
-strerror (int errnum)
-{
-  extern int errno, sys_nerr;
-#ifndef __DECC
-  extern char *sys_errlist[];
-#endif
-  static char buf[] = "Unknown error 12345678901234567890";
-
-  if (errno < sys_nerr)
-    return sys_errlist[errnum];
-
-  sprintf (buf, _("Unknown error %d"), errnum);
-  return buf;
-}
-#endif
-\f
-/* Like malloc but get fatal error if memory is exhausted.  */
-/* Don't bother if we're using dmalloc; it provides these for us.  */
-
-#ifndef HAVE_DMALLOC_H
-
-#undef xmalloc
-#undef xcalloc
-#undef xrealloc
-#undef xstrdup
-
-void *
-xmalloc (unsigned int size)
-{
-  /* Make sure we don't allocate 0, for pre-ISO implementations.  */
-  void *result = malloc (size ? size : 1);
-  if (result == 0)
-    OUT_OF_MEM();
-  return result;
-}
-
-
-void *
-xcalloc (unsigned int size)
-{
-  /* Make sure we don't allocate 0, for pre-ISO implementations.  */
-  void *result = calloc (size ? size : 1, 1);
-  if (result == 0)
-    OUT_OF_MEM();
-  return result;
-}
-
-
-void *
-xrealloc (void *ptr, unsigned int size)
-{
-  void *result;
-
-  /* Some older implementations of realloc() don't conform to ISO.  */
-  if (! size)
-    size = 1;
-  result = ptr ? realloc (ptr, size) : malloc (size);
-  if (result == 0)
-    OUT_OF_MEM();
-  return result;
-}
-
-
-char *
-xstrdup (const char *ptr)
-{
-  char *result;
-
-#ifdef HAVE_STRDUP
-  result = strdup (ptr);
-#else
-  result = malloc (strlen (ptr) + 1);
-#endif
-
-  if (result == 0)
-    OUT_OF_MEM();
-
-#ifdef HAVE_STRDUP
-  return result;
-#else
-  return strcpy (result, ptr);
-#endif
-}
-
-#endif  /* HAVE_DMALLOC_H */
-
-char *
-xstrndup (const char *str, unsigned int length)
-{
-  char *result;
-
-#ifdef HAVE_STRNDUP
-  result = strndup (str, length);
-  if (result == 0)
-    OUT_OF_MEM();
-#else
-  result = xmalloc (length + 1);
-  if (length > 0)
-    strncpy (result, str, length);
-  result[length] = '\0';
-#endif
-
-  return result;
-}
-\f
-
-/* Limited INDEX:
-   Search through the string STRING, which ends at LIMIT, for the character C.
-   Returns a pointer to the first occurrence, or nil if none is found.
-   Like INDEX except that the string searched ends where specified
-   instead of at the first null.  */
-
-char *
-lindex (const char *s, const char *limit, int c)
-{
-  while (s < limit)
-    if (*s++ == c)
-      return (char *)(s - 1);
-
-  return 0;
-}
-\f
-/* Return the address of the first whitespace or null in the string S.  */
-
-char *
-end_of_token (const char *s)
-{
-  END_OF_TOKEN (s);
-  return (char *)s;
-}
-
-/* Return the address of the first nonwhitespace or null in the string S.  */
-
-char *
-next_token (const char *s)
-{
-  NEXT_TOKEN (s);
-  return (char *)s;
-}
-
-/* Find the next token in PTR; return the address of it, and store the length
-   of the token into *LENGTHPTR if LENGTHPTR is not nil.  Set *PTR to the end
-   of the token, so this function can be called repeatedly in a loop.  */
-
-char *
-find_next_token (const char **ptr, unsigned int *lengthptr)
-{
-  const char *p = next_token (*ptr);
-
-  if (*p == '\0')
-    return 0;
-
-  *ptr = end_of_token (p);
-  if (lengthptr != 0)
-    *lengthptr = *ptr - p;
-
-  return (char *)p;
-}
-\f
-
-/* Copy a chain of 'struct dep'.  For 2nd expansion deps, dup the name.  */
-
-struct dep *
-copy_dep_chain (const struct dep *d)
-{
-  struct dep *firstnew = 0;
-  struct dep *lastnew = 0;
-
-  while (d != 0)
-    {
-      struct dep *c = xmalloc (sizeof (struct dep));
-      memcpy (c, d, sizeof (struct dep));
-
-      if (c->need_2nd_expansion)
-        c->name = xstrdup (c->name);
-
-      c->next = 0;
-      if (firstnew == 0)
-        firstnew = lastnew = c;
-      else
-        lastnew = lastnew->next = c;
-
-      d = d->next;
-    }
-
-  return firstnew;
-}
-
-/* Free a chain of struct nameseq.
-   For struct dep chains use free_dep_chain.  */
-
-void
-free_ns_chain (struct nameseq *ns)
-{
-  while (ns != 0)
-    {
-      struct nameseq *t = ns;
-      ns = ns->next;
-      free_ns (t);
-    }
-}
-\f
-
-#if !HAVE_STRCASECMP && !HAVE_STRICMP && !HAVE_STRCMPI
-/* If we don't have strcasecmp() (from POSIX), or anything that can substitute
-   for it, define our own version.  */
-
-int
-strcasecmp (const char *s1, const char *s2)
-{
-  while (1)
-    {
-      int c1 = (int) *(s1++);
-      int c2 = (int) *(s2++);
-
-      if (isalpha (c1))
-        c1 = tolower (c1);
-      if (isalpha (c2))
-        c2 = tolower (c2);
-
-      if (c1 != '\0' && c1 == c2)
-        continue;
-
-      return (c1 - c2);
-    }
-}
-#endif
-
-#if !HAVE_STRNCASECMP && !HAVE_STRNICMP && !HAVE_STRNCMPI
-/* If we don't have strncasecmp() (from POSIX), or anything that can
-   substitute for it, define our own version.  */
-
-int
-strncasecmp (const char *s1, const char *s2, int n)
-{
-  while (n-- > 0)
-    {
-      int c1 = (int) *(s1++);
-      int c2 = (int) *(s2++);
-
-      if (isalpha (c1))
-        c1 = tolower (c1);
-      if (isalpha (c2))
-        c2 = tolower (c2);
-
-      if (c1 != '\0' && c1 == c2)
-        continue;
-
-      return (c1 - c2);
-    }
-
-  return 0;
-}
-#endif
-\f
-#ifdef  GETLOADAVG_PRIVILEGED
-
-#ifdef POSIX
-
-/* Hopefully if a system says it's POSIX.1 and has the setuid and setgid
-   functions, they work as POSIX.1 says.  Some systems (Alpha OSF/1 1.2,
-   for example) which claim to be POSIX.1 also have the BSD setreuid and
-   setregid functions, but they don't work as in BSD and only the POSIX.1
-   way works.  */
-
-#undef HAVE_SETREUID
-#undef HAVE_SETREGID
-
-#else   /* Not POSIX.  */
-
-/* Some POSIX.1 systems have the seteuid and setegid functions.  In a
-   POSIX-like system, they are the best thing to use.  However, some
-   non-POSIX systems have them too but they do not work in the POSIX style
-   and we must use setreuid and setregid instead.  */
-
-#undef HAVE_SETEUID
-#undef HAVE_SETEGID
-
-#endif  /* POSIX.  */
-
-#ifndef HAVE_UNISTD_H
-extern int getuid (), getgid (), geteuid (), getegid ();
-extern int setuid (), setgid ();
-#ifdef HAVE_SETEUID
-extern int seteuid ();
-#else
-#ifdef  HAVE_SETREUID
-extern int setreuid ();
-#endif  /* Have setreuid.  */
-#endif  /* Have seteuid.  */
-#ifdef HAVE_SETEGID
-extern int setegid ();
-#else
-#ifdef  HAVE_SETREGID
-extern int setregid ();
-#endif  /* Have setregid.  */
-#endif  /* Have setegid.  */
-#endif  /* No <unistd.h>.  */
-
-/* Keep track of the user and group IDs for user- and make- access.  */
-static int user_uid = -1, user_gid = -1, make_uid = -1, make_gid = -1;
-#define access_inited   (user_uid != -1)
-static enum { make, user } current_access;
-
-
-/* Under -d, write a message describing the current IDs.  */
-
-static void
-log_access (const char *flavor)
-{
-  if (! ISDB (DB_JOBS))
-    return;
-
-  /* All the other debugging messages go to stdout,
-     but we write this one to stderr because it might be
-     run in a child fork whose stdout is piped.  */
-
-  fprintf (stderr, _("%s: user %lu (real %lu), group %lu (real %lu)\n"),
-           flavor, (unsigned long) geteuid (), (unsigned long) getuid (),
-           (unsigned long) getegid (), (unsigned long) getgid ());
-  fflush (stderr);
-}
-
-
-static void
-init_access (void)
-{
-#ifndef VMS
-  user_uid = getuid ();
-  user_gid = getgid ();
-
-  make_uid = geteuid ();
-  make_gid = getegid ();
-
-  /* Do these ever fail?  */
-  if (user_uid == -1 || user_gid == -1 || make_uid == -1 || make_gid == -1)
-    pfatal_with_name ("get{e}[gu]id");
-
-  log_access (_("Initialized access"));
-
-  current_access = make;
-#endif
-}
-
-#endif  /* GETLOADAVG_PRIVILEGED */
-
-/* Give the process appropriate permissions for access to
-   user data (i.e., to stat files, or to spawn a child process).  */
-void
-user_access (void)
-{
-#ifdef  GETLOADAVG_PRIVILEGED
-
-  if (!access_inited)
-    init_access ();
-
-  if (current_access == user)
-    return;
-
-  /* We are in "make access" mode.  This means that the effective user and
-     group IDs are those of make (if it was installed setuid or setgid).
-     We now want to set the effective user and group IDs to the real IDs,
-     which are the IDs of the process that exec'd make.  */
-
-#ifdef  HAVE_SETEUID
-
-  /* Modern systems have the seteuid/setegid calls which set only the
-     effective IDs, which is ideal.  */
-
-  if (seteuid (user_uid) < 0)
-    pfatal_with_name ("user_access: seteuid");
-
-#else   /* Not HAVE_SETEUID.  */
-
-#ifndef HAVE_SETREUID
-
-  /* System V has only the setuid/setgid calls to set user/group IDs.
-     There is an effective ID, which can be set by setuid/setgid.
-     It can be set (unless you are root) only to either what it already is
-     (returned by geteuid/getegid, now in make_uid/make_gid),
-     the real ID (return by getuid/getgid, now in user_uid/user_gid),
-     or the saved set ID (what the effective ID was before this set-ID
-     executable (make) was exec'd).  */
-
-  if (setuid (user_uid) < 0)
-    pfatal_with_name ("user_access: setuid");
-
-#else   /* HAVE_SETREUID.  */
-
-  /* In 4BSD, the setreuid/setregid calls set both the real and effective IDs.
-     They may be set to themselves or each other.  So you have two alternatives
-     at any one time.  If you use setuid/setgid, the effective will be set to
-     the real, leaving only one alternative.  Using setreuid/setregid, however,
-     you can toggle between your two alternatives by swapping the values in a
-     single setreuid or setregid call.  */
-
-  if (setreuid (make_uid, user_uid) < 0)
-    pfatal_with_name ("user_access: setreuid");
-
-#endif  /* Not HAVE_SETREUID.  */
-#endif  /* HAVE_SETEUID.  */
-
-#ifdef  HAVE_SETEGID
-  if (setegid (user_gid) < 0)
-    pfatal_with_name ("user_access: setegid");
-#else
-#ifndef HAVE_SETREGID
-  if (setgid (user_gid) < 0)
-    pfatal_with_name ("user_access: setgid");
-#else
-  if (setregid (make_gid, user_gid) < 0)
-    pfatal_with_name ("user_access: setregid");
-#endif
-#endif
-
-  current_access = user;
-
-  log_access (_("User access"));
-
-#endif  /* GETLOADAVG_PRIVILEGED */
-}
-
-/* Give the process appropriate permissions for access to
-   make data (i.e., the load average).  */
-void
-make_access (void)
-{
-#ifdef  GETLOADAVG_PRIVILEGED
-
-  if (!access_inited)
-    init_access ();
-
-  if (current_access == make)
-    return;
-
-  /* See comments in user_access, above.  */
-
-#ifdef  HAVE_SETEUID
-  if (seteuid (make_uid) < 0)
-    pfatal_with_name ("make_access: seteuid");
-#else
-#ifndef HAVE_SETREUID
-  if (setuid (make_uid) < 0)
-    pfatal_with_name ("make_access: setuid");
-#else
-  if (setreuid (user_uid, make_uid) < 0)
-    pfatal_with_name ("make_access: setreuid");
-#endif
-#endif
-
-#ifdef  HAVE_SETEGID
-  if (setegid (make_gid) < 0)
-    pfatal_with_name ("make_access: setegid");
-#else
-#ifndef HAVE_SETREGID
-  if (setgid (make_gid) < 0)
-    pfatal_with_name ("make_access: setgid");
-#else
-  if (setregid (user_gid, make_gid) < 0)
-    pfatal_with_name ("make_access: setregid");
-#endif
-#endif
-
-  current_access = make;
-
-  log_access (_("Make access"));
-
-#endif  /* GETLOADAVG_PRIVILEGED */
-}
-
-/* Give the process appropriate permissions for a child process.
-   This is like user_access, but you can't get back to make_access.  */
-void
-child_access (void)
-{
-#ifdef  GETLOADAVG_PRIVILEGED
-
-  if (!access_inited)
-    abort ();
-
-  /* Set both the real and effective UID and GID to the user's.
-     They cannot be changed back to make's.  */
-
-#ifndef HAVE_SETREUID
-  if (setuid (user_uid) < 0)
-    pfatal_with_name ("child_access: setuid");
-#else
-  if (setreuid (user_uid, user_uid) < 0)
-    pfatal_with_name ("child_access: setreuid");
-#endif
-
-#ifndef HAVE_SETREGID
-  if (setgid (user_gid) < 0)
-    pfatal_with_name ("child_access: setgid");
-#else
-  if (setregid (user_gid, user_gid) < 0)
-    pfatal_with_name ("child_access: setregid");
-#endif
-
-  log_access (_("Child access"));
-
-#endif  /* GETLOADAVG_PRIVILEGED */
-}
-
-#ifdef NEED_GET_PATH_MAX
-unsigned int
-get_path_max (void)
-{
-  static unsigned int value;
-
-  if (value == 0)
-    {
-      long int x = pathconf ("/", _PC_PATH_MAX);
-      if (x > 0)
-        value = x;
-      else
-        return MAXPATHLEN;
-    }
-
-  return value;
-}
-#endif
diff --git a/mk/Amiga.mk b/mk/Amiga.mk
new file mode 100644 (file)
index 0000000..074c53e
--- /dev/null
@@ -0,0 +1,45 @@
+# GNU -*-Makefile-*- to build GNU make on Amiga
+#
+# Amiga overrides for use with Basic.mk.
+#
+# Copyright (C) 2017-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+CC = sc
+LD = $(CC) Link
+
+MKDIR.cmd = makedir $1
+RM.cmd = delete $1
+CP.cmd = copy $1 To $2
+
+CPPFLAGS =
+CFLAGS =
+LDFLAGS =
+
+prog_SOURCES += $(alloca_SOURCES) $(loadavg_SOURCES) $(glob_SOURCES) $(amiga_SOURCES)
+
+BUILT_SOURCES += $(lib)alloca.h $(lib)fnmatch.h $(lib)glob.h
+
+extra_CPPFLAGS = IDir $(OUTDIR)src IDir $(SRCDIR)/src IDir $(OUTDIR)lib IDir $(SRCDIR)/lib
+
+C_SOURCE =
+OUTPUT_OPTION =
+LDFLAGS = From LIB:cres.o
+LDLIBS = Lib LIB:sc.lib LIB:amiga.lib
+LINK_OUTPUT = To $@
+
+$(OUTDIR)src/config.h: $(SRCDIR)/src/config.ami
+       $(call CP.cmd,$<,$@)
diff --git a/mk/VMS.mk b/mk/VMS.mk
new file mode 100644 (file)
index 0000000..75d33fe
--- /dev/null
+++ b/mk/VMS.mk
@@ -0,0 +1,97 @@
+# GNU -*-Makefile-*- to build GNU make on VMS
+#
+# VMS overrides for use with Basic.mk.
+#
+# Copyright (C) 2017-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+src = [.src]
+lib = [.lib]
+SRCDIR = []
+
+OBJEXT = .obj
+EXEEXT = .exe
+
+e =
+s = $e $e
+c = ,
+
+defs = HAVE_CONFIG_H
+
+ifeq ($(CC),cc)
+defs += VMS unlink=remove allocated_variable_expand_for_file=alloc_var_expand_for_file
+else
+defs += GCC_IS_NATIVE
+ifeq ($(ARCH),VAX)
+defs += VAX
+endif
+endif
+
+extra_CPPFLAGS = /define=($(subst $s,$c,$(patsubst %,"%",$(defs))))
+
+cinclude = /nested=none/include=($(src),$(lib))
+ifeq ($(CC),cc)
+cprefix = /prefix=(all,except=(glob,globfree))
+cwarn = /standard=relaxed/warn=(disable=questcompare)
+endif
+
+extra_CFLAGS = $(cinclude)$(cprefix)$(cwarn)
+
+#extra_LDFLAGS = /deb
+extra_LDFLAGS =
+
+# If your system needs extra libraries loaded in, define them here.
+# System V probably need -lPW for alloca.
+# if on vax, uncomment the following line
+#LDLIBS = ,c.opt/opt
+ifeq ($(CC),cc)
+#LDLIBS =,sys$$library:vaxcrtl.olb/lib
+else
+LDLIBS =,gnu_cc_library:libgcc.olb/lib
+endif
+
+# If your system doesn't have alloca, or the one provided is bad,
+# uncomment this
+#ALLOCA = $(alloca_SOURCES)
+
+# If your system doesn't have alloca.h, or the one provided is bad,
+# uncomment this
+#BUILT_SOURCES += $(lib)alloca.h
+
+prog_SOURCES += $(ALLOCA) $(glob_SOURCES) $(vms_SOURCES)
+
+BUILT_SOURCES += $(lib)fnmatch.h $(lib)glob.h
+
+COMPILE.cmd = $(CC) $(extra_CFLAGS)$(CFLAGS)/obj=$@ $(extra_CPPFLAGS)$(CPPFLAGS) $1
+
+LINK.cmd = $(LD)$(extra_LDFLAGS)$(LDFLAGS)/exe=$@ $(subst $s,$c,$1)$(LDLIBS)
+
+# Don't know how to do this
+CHECK.cmd =
+
+MKDIR.cmd = create/dir $1
+RM.cmd = delete $1
+CP.cmd = copy $1 $2
+
+define CLEANSPACE
+       -purge [...]
+       -delete $(PROG);
+       -delete $(src)*.$(OBJEXT);
+endef
+
+
+$(OUTDIR)$(src)config.h: $(SRCDIR)$(src)config.h.W32
+       $(call CP.cmd,$<,$@)
diff --git a/mk/Windows32.mk b/mk/Windows32.mk
new file mode 100644 (file)
index 0000000..494be02
--- /dev/null
@@ -0,0 +1,122 @@
+# GNU -*-Makefile-*- to build GNU make on Windows
+#
+# Windows overrides for use with Basic.mk.
+#
+# Copyright (C) 2017-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# TARGET_TYPE can be either "release" or "debug"
+TARGET_TYPE = release
+
+# TOOLCHAIN can be either "msvc" or "gcc"
+TOOLCHAIN = msvc
+
+# Translate a POSIX path into a Windows path.  Don't bother with drives.
+# Used only inside recipes, with DOS/CMD tools that require it.
+P2W = $(subst /,\,$1)
+
+prog_SOURCES += $(loadavg_SOURCES) $(glob_SOURCES) $(w32_SOURCES)
+
+BUILT_SOURCES += $(lib)alloca.h $(lib)fnmatch.h $(lib)glob.h
+
+w32_LIBS = kernel32 user32 gdi32 winspool comdlg32 advapi32 shell32 ole32 \
+          oleaut32 uuid odbc32 odbccp32
+
+CPPFLAGS =
+CFLAGS =
+LDFLAGS =
+
+# --- Visual Studio
+msvc_CC = cl.exe
+msvc_LD = link.exe
+
+msvc_CPPFLAGS = /DHAVE_CONFIG_H /DWINDOWS32 /DWIN32 /D_CONSOLE
+msvc_CPPFLAGS += /I$(OUTDIR)src /I$(SRCDIR)/src /I$(SRCDIR)/src/w32/include /I$(OUTDIR)lib /I$(SRCDIR)/lib
+
+msvc_CFLAGS = /nologo /MT /W4 /EHsc
+msvc_CFLAGS += /FR$(OUTDIR) /Fp$(BASE_PROG).pch /Fd$(BASE_PROG).pdb
+
+msvc_LDFLAGS = /nologo /SUBSYSTEM:console /PDB:$(BASE_PROG).pdb
+
+msvc_LDLIBS = $(addsuffix .lib,$(w32_LIBS))
+
+msvc_C_SOURCE = /c
+msvc_OUTPUT_OPTION = /Fo$@
+msvc_LINK_OUTPUT = /OUT:$@
+
+release_msvc_OUTDIR = ./WinRel/
+release_msvc_CPPFLAGS = /D NDEBUG
+release_msvc_CFLAGS = /O2
+
+debug_msvc_OUTDIR = ./WinDebug/
+debug_msvc_CPPFLAGS = /D _DEBUG
+debug_msvc_CFLAGS = /Zi /Od
+debug_msvc_LDFLAGS = /DEBUG
+
+# --- GCC
+gcc_CC = gcc
+gcc_LD = $(gcc_CC)
+
+release_gcc_OUTDIR = ./GccRel/
+debug_gcc_OUTDIR = ./GccDebug/
+
+gcc_CPPFLAGS = -DHAVE_CONFIG_H -I$(OUTDIR)src -I$(SRCDIR)/src -I$(SRCDIR)/src/w32/include -I$(OUTDIR)lib -I$(SRCDIR)/lib
+gcc_CFLAGS = -mthreads -Wall -std=gnu99 -gdwarf-2 -g3
+gcc_LDFLAGS = -mthreads -gdwarf-2 -g3
+gcc_LDLIBS = $(addprefix -l,$(w32_libs))
+
+gcc_C_SOURCE = -c
+gcc_OUTPUT_OPTION = -o $@
+gcc_LINK_OUTPUT = -o $@
+
+debug_gcc_CFLAGS = -O0
+release_gcc_CFLAGS = -O2
+
+# ---
+
+LINK.cmd = $(LD) $(extra_LDFLAGS) $(LDFLAGS) $(TARGET_ARCH) $1 $(LDLIBS) $(LINK_OUTPUT)
+
+CHECK.cmd = cmd /c cd tests \& .\run_make_tests.bat -make ../$(PROG)
+
+MKDIR.cmd = cmd /c mkdir $(call P2W,$1)
+RM.cmd = cmd /c del /F /Q $(call P2W,$1)
+CP.cmd = cmd /c copy /Y $(call P2W,$1 $2)
+
+CC = $($(TOOLCHAIN)_CC)
+LD = $($(TOOLCHAIN)_LD)
+
+C_SOURCE = $($(TOOLCHAIN)_C_SOURCE)
+OUTPUT_OPTION = $($(TOOLCHAIN)_OUTPUT_OPTION)
+LINK_OUTPUT = $($(TOOLCHAIN)_LINK_OUTPUT)
+
+OUTDIR = $($(TARGET_TYPE)_$(TOOLCHAIN)_OUTDIR)
+
+OBJEXT = obj
+EXEEXT = .exe
+
+_CUSTOM = $($(TOOLCHAIN)_$1) $($(TARGET_TYPE)_$1) $($(TARGET_TYPE)_$(TOOLCHAIN)_$1)
+
+# I'm not sure why this builds gnumake rather than make...?
+PROG = $(OUTDIR)gnumake$(EXEEXT)
+BASE_PROG = $(basename $(PROG))
+
+extra_CPPFLAGS = $(call _CUSTOM,CPPFLAGS)
+extra_CFLAGS = $(call _CUSTOM,CFLAGS)
+extra_LDFLAGS = $(call _CUSTOM,LDFLAGS)
+LDLIBS = $(call _CUSTOM,LDLIBS)
+
+$(OUTDIR)src/config.h: $(SRCDIR)/src/config.h.W32
+       $(call CP.cmd,$<,$@)
diff --git a/mk/msdosdjgpp.mk b/mk/msdosdjgpp.mk
new file mode 100644 (file)
index 0000000..420937d
--- /dev/null
@@ -0,0 +1,43 @@
+# GNU -*-Makefile-*- to build GNU make on MS-DOS with DJGPP
+#
+# MS-DOS overrides for use with Basic.mk.
+#
+# Copyright (C) 2017-2020 Free Software Foundation, Inc.
+# This file is part of GNU Make.
+#
+# GNU Make is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 3 of the License, or (at your option) any later
+# version.
+#
+# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program.  If not, see <http://www.gnu.org/licenses/>.
+
+OBJEXT = o
+EXEEXT = .exe
+
+CC = gcc
+
+# Translate a POSIX path into a Windows path.  Don't bother with drives.
+# Used only inside recipes, with DOS/CMD tools that require it.
+P2W = $(subst /,\,$1)
+
+prog_SOURCES += $(loadavg_SOURCES) $(glob_SOURCES)
+
+BUILT_SOURCES += $(lib)alloca.h $(lib)fnmatch.h $(lib)glob.h
+
+INCLUDEDIR = c:/djgpp/include
+LIBDIR = c:/djgpp/lib
+LOCALEDIR = c:/djgpp/share
+
+MKDIR.cmd = command.com /c mkdir $(call P2W,$1)
+RM.cmd = command.com /c del /F /Q $(call P2W,$1)
+CP.cmd = command.com /c copy /Y $(call P2W,$1 $2)
+
+$(OUTDIR)src/config.h: $(SRCDIR)/src/configh.dos
+       $(call CP.cmd,$<,$@)
diff --git a/os.h b/os.h
deleted file mode 100644 (file)
index c1a19e1..0000000
--- a/os.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Declarations for operating system interfaces for GNU Make.
-Copyright (C) 2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* This section provides OS-specific functions to support the jobserver.  */
-
-#ifdef MAKE_JOBSERVER
-
-/* Returns 1 if the jobserver is enabled, else 0.  */
-unsigned int jobserver_enabled (void);
-
-/* Called in the master instance to set up the jobserver initially.  */
-unsigned int jobserver_setup (int job_slots);
-
-/* Called in a child instance to connect to the jobserver.  */
-unsigned int jobserver_parse_auth (const char* auth);
-
-/* Returns an allocated buffer used to pass to child instances.  */
-char *jobserver_get_auth (void);
-
-/* Clear this instance's jobserver configuration.  */
-void jobserver_clear (void);
-
-/* Recover all the jobserver tokens and return the number we got.  */
-unsigned int jobserver_acquire_all (void);
-
-/* Release a jobserver token.  If it fails and is_fatal is 1, fatal.  */
-void jobserver_release (int is_fatal);
-
-/* Notify the jobserver that a child exited.  */
-void jobserver_signal (void);
-
-/* Get ready to start a non-recursive child.  */
-void jobserver_pre_child (int);
-
-/* Complete starting a non-recursive child.  */
-void jobserver_post_child (int);
-
-/* Set up to acquire a new token.  */
-void jobserver_pre_acquire (void);
-
-/* Wait until we can acquire a jobserver token.
-   TIMEOUT is 1 if we have other jobs waiting for the load to go down;
-   in this case we won't wait forever, so we can check the load.
-   Returns 1 if we got a token, or 0 if we stopped waiting due to a child
-   exiting or a timeout.    */
-unsigned int jobserver_acquire (int timeout);
-
-#else
-
-#define jobserver_enabled()         (0)
-#define jobserver_setup(_slots)     (0)
-#define jobserver_parse_auth(_auth) (0)
-#define jobserver_get_auth()        (NULL)
-#define jobserver_clear()           (void)(0)
-#define jobserver_release(_fatal)   (void)(0)
-#define jobserver_acquire_all()     (0)
-#define jobserver_signal()          (void)(0)
-#define jobserver_pre_child(_r)     (void)(0)
-#define jobserver_post_child(_r)    (void)(0)
-#define jobserver_pre_acquire()     (void)(0)
-#define jobserver_acquire(_tmout)   (0)
-
-#endif
-
-/* Create a "bad" file descriptor for stdin when parallel jobs are run.  */
-#if !defined(VMD) && !defined(WINDOWS32) && !defined(_AMIGA) && !defined(__MSDOS__)
-int get_bad_stdin (void);
-#else
-# define get_bad_stdin() (-1)
-#endif
diff --git a/output.c b/output.c
deleted file mode 100644 (file)
index 65182c4..0000000
--- a/output.c
+++ /dev/null
@@ -1,723 +0,0 @@
-/* Output to stdout / stderr for GNU make
-Copyright (C) 2013-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "job.h"
-
-/* GNU make no longer supports pre-ANSI89 environments.  */
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdarg.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#else
-# include <sys/file.h>
-#endif
-
-#ifdef WINDOWS32
-# include <windows.h>
-# include <io.h>
-# include "sub_proc.h"
-#endif /* WINDOWS32 */
-
-struct output *output_context = NULL;
-unsigned int stdio_traced = 0;
-
-#define OUTPUT_NONE (-1)
-
-#define OUTPUT_ISSET(_out) ((_out)->out >= 0 || (_out)->err >= 0)
-
-#ifdef HAVE_FCNTL_H
-# define STREAM_OK(_s) ((fcntl (fileno (_s), F_GETFD) != -1) || (errno != EBADF))
-#else
-# define STREAM_OK(_s) 1
-#endif
-
-/* Write a string to the current STDOUT or STDERR.  */
-static void
-_outputs (struct output *out, int is_err, const char *msg)
-{
-  if (! out || ! out->syncout)
-    {
-      FILE *f = is_err ? stderr : stdout;
-      fputs (msg, f);
-      fflush (f);
-    }
-  else
-    {
-      int fd = is_err ? out->err : out->out;
-      int len = strlen (msg);
-      int r;
-
-      EINTRLOOP (r, lseek (fd, 0, SEEK_END));
-      while (1)
-        {
-          EINTRLOOP (r, write (fd, msg, len));
-          if (r == len || r <= 0)
-            break;
-          len -= r;
-          msg += r;
-        }
-    }
-}
-\f
-/* Write a message indicating that we've just entered or
-   left (according to ENTERING) the current directory.  */
-
-static int
-log_working_directory (int entering)
-{
-  static char *buf = NULL;
-  static unsigned int len = 0;
-  unsigned int need;
-  const char *fmt;
-  char *p;
-
-  /* Get enough space for the longest possible output.  */
-  need = strlen (program) + INTSTR_LENGTH + 2 + 1;
-  if (starting_directory)
-    need += strlen (starting_directory);
-
-  /* Use entire sentences to give the translators a fighting chance.  */
-  if (makelevel == 0)
-    if (starting_directory == 0)
-      if (entering)
-        fmt = _("%s: Entering an unknown directory\n");
-      else
-        fmt = _("%s: Leaving an unknown directory\n");
-    else
-      if (entering)
-        fmt = _("%s: Entering directory '%s'\n");
-      else
-        fmt = _("%s: Leaving directory '%s'\n");
-  else
-    if (starting_directory == 0)
-      if (entering)
-        fmt = _("%s[%u]: Entering an unknown directory\n");
-      else
-        fmt = _("%s[%u]: Leaving an unknown directory\n");
-    else
-      if (entering)
-        fmt = _("%s[%u]: Entering directory '%s'\n");
-      else
-        fmt = _("%s[%u]: Leaving directory '%s'\n");
-
-  need += strlen (fmt);
-
-  if (need > len)
-    {
-      buf = xrealloc (buf, need);
-      len = need;
-    }
-
-  p = buf;
-  if (print_data_base_flag)
-    {
-      *(p++) = '#';
-      *(p++) = ' ';
-    }
-
-  if (makelevel == 0)
-    if (starting_directory == 0)
-      sprintf (p, fmt , program);
-    else
-      sprintf (p, fmt, program, starting_directory);
-  else if (starting_directory == 0)
-    sprintf (p, fmt, program, makelevel);
-  else
-    sprintf (p, fmt, program, makelevel, starting_directory);
-
-  _outputs (NULL, 0, buf);
-
-  return 1;
-}
-
-/* Set a file descriptor to be in O_APPEND mode.
-   If it fails, just ignore it.  */
-
-static void
-set_append_mode (int fd)
-{
-#if defined(F_GETFL) && defined(F_SETFL) && defined(O_APPEND)
-  int flags = fcntl (fd, F_GETFL, 0);
-  if (flags >= 0)
-    fcntl (fd, F_SETFL, flags | O_APPEND);
-#endif
-}
-\f
-
-#ifndef NO_OUTPUT_SYNC
-
-/* Semaphore for use in -j mode with output_sync. */
-static sync_handle_t sync_handle = -1;
-
-#define FD_NOT_EMPTY(_f) ((_f) != OUTPUT_NONE && lseek ((_f), 0, SEEK_END) > 0)
-
-/* Set up the sync handle.  Disables output_sync on error.  */
-static int
-sync_init (void)
-{
-  int combined_output = 0;
-
-#ifdef WINDOWS32
-  if ((!STREAM_OK (stdout) && !STREAM_OK (stderr))
-      || (sync_handle = create_mutex ()) == -1)
-    {
-      perror_with_name ("output-sync suppressed: ", "stderr");
-      output_sync = 0;
-    }
-  else
-    {
-      combined_output = same_stream (stdout, stderr);
-      prepare_mutex_handle_string (sync_handle);
-    }
-
-#else
-  if (STREAM_OK (stdout))
-    {
-      struct stat stbuf_o, stbuf_e;
-
-      sync_handle = fileno (stdout);
-      combined_output = (fstat (fileno (stdout), &stbuf_o) == 0
-                         && fstat (fileno (stderr), &stbuf_e) == 0
-                         && stbuf_o.st_dev == stbuf_e.st_dev
-                         && stbuf_o.st_ino == stbuf_e.st_ino);
-    }
-  else if (STREAM_OK (stderr))
-    sync_handle = fileno (stderr);
-  else
-    {
-      perror_with_name ("output-sync suppressed: ", "stderr");
-      output_sync = 0;
-    }
-#endif
-
-  return combined_output;
-}
-
-/* Support routine for output_sync() */
-static void
-pump_from_tmp (int from, FILE *to)
-{
-  static char buffer[8192];
-
-#ifdef WINDOWS32
-  int prev_mode;
-
-  /* "from" is opened by open_tmpfd, which does it in binary mode, so
-     we need the mode of "to" to match that.  */
-  prev_mode = _setmode (fileno (to), _O_BINARY);
-#endif
-
-  if (lseek (from, 0, SEEK_SET) == -1)
-    perror ("lseek()");
-
-  while (1)
-    {
-      int len;
-      EINTRLOOP (len, read (from, buffer, sizeof (buffer)));
-      if (len < 0)
-        perror ("read()");
-      if (len <= 0)
-        break;
-      if (fwrite (buffer, len, 1, to) < 1)
-        {
-          perror ("fwrite()");
-          break;
-        }
-      fflush (to);
-    }
-
-#ifdef WINDOWS32
-  /* Switch "to" back to its original mode, so that log messages by
-     Make have the same EOL format as without --output-sync.  */
-  _setmode (fileno (to), prev_mode);
-#endif
-}
-
-/* Obtain the lock for writing output.  */
-static void *
-acquire_semaphore (void)
-{
-  static struct flock fl;
-
-  fl.l_type = F_WRLCK;
-  fl.l_whence = SEEK_SET;
-  fl.l_start = 0;
-  fl.l_len = 1;
-  if (fcntl (sync_handle, F_SETLKW, &fl) != -1)
-    return &fl;
-  perror ("fcntl()");
-  return NULL;
-}
-
-/* Release the lock for writing output.  */
-static void
-release_semaphore (void *sem)
-{
-  struct flock *flp = (struct flock *)sem;
-  flp->l_type = F_UNLCK;
-  if (fcntl (sync_handle, F_SETLKW, flp) == -1)
-    perror ("fcntl()");
-}
-
-/* Returns a file descriptor to a temporary file.  The file is automatically
-   closed/deleted on exit.  Don't use a FILE* stream.  */
-int
-output_tmpfd (void)
-{
-  int fd = -1;
-  FILE *tfile = tmpfile ();
-
-  if (! tfile)
-    pfatal_with_name ("tmpfile");
-
-  /* Create a duplicate so we can close the stream.  */
-  fd = dup (fileno (tfile));
-  if (fd < 0)
-    pfatal_with_name ("dup");
-
-  fclose (tfile);
-
-  set_append_mode (fd);
-
-  return fd;
-}
-
-/* Adds file descriptors to the child structure to support output_sync; one
-   for stdout and one for stderr as long as they are open.  If stdout and
-   stderr share a device they can share a temp file too.
-   Will reset output_sync on error.  */
-static void
-setup_tmpfile (struct output *out)
-{
-  /* Is make's stdout going to the same place as stderr?  */
-  static int combined_output = -1;
-
-  if (combined_output < 0)
-    combined_output = sync_init ();
-
-  if (STREAM_OK (stdout))
-    {
-      int fd = output_tmpfd ();
-      if (fd < 0)
-        goto error;
-      CLOSE_ON_EXEC (fd);
-      out->out = fd;
-    }
-
-  if (STREAM_OK (stderr))
-    {
-      if (out->out != OUTPUT_NONE && combined_output)
-        out->err = out->out;
-      else
-        {
-          int fd = output_tmpfd ();
-          if (fd < 0)
-            goto error;
-          CLOSE_ON_EXEC (fd);
-          out->err = fd;
-        }
-    }
-
-  return;
-
-  /* If we failed to create a temp file, disable output sync going forward.  */
- error:
-  output_close (out);
-  output_sync = OUTPUT_SYNC_NONE;
-}
-
-/* Synchronize the output of jobs in -j mode to keep the results of
-   each job together. This is done by holding the results in temp files,
-   one for stdout and potentially another for stderr, and only releasing
-   them to "real" stdout/stderr when a semaphore can be obtained. */
-
-void
-output_dump (struct output *out)
-{
-  int outfd_not_empty = FD_NOT_EMPTY (out->out);
-  int errfd_not_empty = FD_NOT_EMPTY (out->err);
-
-  if (outfd_not_empty || errfd_not_empty)
-    {
-      int traced = 0;
-
-      /* Try to acquire the semaphore.  If it fails, dump the output
-         unsynchronized; still better than silently discarding it.
-         We want to keep this lock for as little time as possible.  */
-      void *sem = acquire_semaphore ();
-
-      /* Log the working directory for this dump.  */
-      if (print_directory_flag && output_sync != OUTPUT_SYNC_RECURSE)
-        traced = log_working_directory (1);
-
-      if (outfd_not_empty)
-        pump_from_tmp (out->out, stdout);
-      if (errfd_not_empty && out->err != out->out)
-        pump_from_tmp (out->err, stderr);
-
-      if (traced)
-        log_working_directory (0);
-
-      /* Exit the critical section.  */
-      if (sem)
-        release_semaphore (sem);
-
-      /* Truncate and reset the output, in case we use it again.  */
-      if (out->out != OUTPUT_NONE)
-        {
-          int e;
-          lseek (out->out, 0, SEEK_SET);
-          EINTRLOOP (e, ftruncate (out->out, 0));
-        }
-      if (out->err != OUTPUT_NONE && out->err != out->out)
-        {
-          int e;
-          lseek (out->err, 0, SEEK_SET);
-          EINTRLOOP (e, ftruncate (out->err, 0));
-        }
-    }
-}
-#endif /* NO_OUTPUT_SYNC */
-\f
-
-/* Provide support for temporary files.  */
-
-#ifndef HAVE_STDLIB_H
-# ifdef HAVE_MKSTEMP
-int mkstemp (char *template);
-# else
-char *mktemp (char *template);
-# endif
-#endif
-
-FILE *
-output_tmpfile (char **name, const char *template)
-{
-#ifdef HAVE_FDOPEN
-  int fd;
-#endif
-
-#if defined HAVE_MKSTEMP || defined HAVE_MKTEMP
-# define TEMPLATE_LEN   strlen (template)
-#else
-# define TEMPLATE_LEN   L_tmpnam
-#endif
-  *name = xmalloc (TEMPLATE_LEN + 1);
-  strcpy (*name, template);
-
-#if defined HAVE_MKSTEMP && defined HAVE_FDOPEN
-  /* It's safest to use mkstemp(), if we can.  */
-  fd = mkstemp (*name);
-  if (fd == -1)
-    return 0;
-  return fdopen (fd, "w");
-#else
-# ifdef HAVE_MKTEMP
-  (void) mktemp (*name);
-# else
-  (void) tmpnam (*name);
-# endif
-
-# ifdef HAVE_FDOPEN
-  /* Can't use mkstemp(), but guard against a race condition.  */
-  EINTRLOOP (fd, open (*name, O_CREAT|O_EXCL|O_WRONLY, 0600));
-  if (fd == -1)
-    return 0;
-  return fdopen (fd, "w");
-# else
-  /* Not secure, but what can we do?  */
-  return fopen (*name, "w");
-# endif
-#endif
-}
-\f
-
-/* This code is stolen from gnulib.
-   If/when we abandon the requirement to work with K&R compilers, we can
-   remove this (and perhaps other parts of GNU make!) and migrate to using
-   gnulib directly.
-
-   This is called only through atexit(), which means die() has already been
-   invoked.  So, call exit() here directly.  Apparently that works...?
-*/
-
-/* Close standard output, exiting with status 'exit_failure' on failure.
-   If a program writes *anything* to stdout, that program should close
-   stdout and make sure that it succeeds before exiting.  Otherwise,
-   suppose that you go to the extreme of checking the return status
-   of every function that does an explicit write to stdout.  The last
-   printf can succeed in writing to the internal stream buffer, and yet
-   the fclose(stdout) could still fail (due e.g., to a disk full error)
-   when it tries to write out that buffered data.  Thus, you would be
-   left with an incomplete output file and the offending program would
-   exit successfully.  Even calling fflush is not always sufficient,
-   since some file systems (NFS and CODA) buffer written/flushed data
-   until an actual close call.
-
-   Besides, it's wasteful to check the return value from every call
-   that writes to stdout -- just let the internal stream state record
-   the failure.  That's what the ferror test is checking below.
-
-   It's important to detect such failures and exit nonzero because many
-   tools (most notably 'make' and other build-management systems) depend
-   on being able to detect failure in other tools via their exit status.  */
-
-static void
-close_stdout (void)
-{
-  int prev_fail = ferror (stdout);
-  int fclose_fail = fclose (stdout);
-
-  if (prev_fail || fclose_fail)
-    {
-      if (fclose_fail)
-        perror_with_name (_("write error: stdout"), "");
-      else
-        O (error, NILF, _("write error: stdout"));
-      exit (MAKE_TROUBLE);
-    }
-}
-\f
-
-void
-output_init (struct output *out)
-{
-  if (out)
-    {
-      out->out = out->err = OUTPUT_NONE;
-      out->syncout = !!output_sync;
-      return;
-    }
-
-  /* Configure this instance of make.  Be sure stdout is line-buffered.  */
-
-#ifdef HAVE_SETVBUF
-# ifdef SETVBUF_REVERSED
-  setvbuf (stdout, _IOLBF, xmalloc (BUFSIZ), BUFSIZ);
-# else  /* setvbuf not reversed.  */
-  /* Some buggy systems lose if we pass 0 instead of allocating ourselves.  */
-  setvbuf (stdout, 0, _IOLBF, BUFSIZ);
-# endif /* setvbuf reversed.  */
-#elif HAVE_SETLINEBUF
-  setlinebuf (stdout);
-#endif  /* setlinebuf missing.  */
-
-  /* Force stdout/stderr into append mode.  This ensures parallel jobs won't
-     lose output due to overlapping writes.  */
-  set_append_mode (fileno (stdout));
-  set_append_mode (fileno (stderr));
-
-#ifdef HAVE_ATEXIT
-  if (STREAM_OK (stdout))
-    atexit (close_stdout);
-#endif
-}
-
-void
-output_close (struct output *out)
-{
-  if (! out)
-    {
-      if (stdio_traced)
-        log_working_directory (0);
-      return;
-    }
-
-#ifndef NO_OUTPUT_SYNC
-  output_dump (out);
-#endif
-
-  if (out->out >= 0)
-    close (out->out);
-  if (out->err >= 0 && out->err != out->out)
-    close (out->err);
-
-  output_init (out);
-}
-
-/* We're about to generate output: be sure it's set up.  */
-void
-output_start (void)
-{
-#ifndef NO_OUTPUT_SYNC
-  /* If we're syncing output make sure the temporary file is set up.  */
-  if (output_context && output_context->syncout)
-    if (! OUTPUT_ISSET(output_context))
-      setup_tmpfile (output_context);
-#endif
-
-  /* If we're not syncing this output per-line or per-target, make sure we emit
-     the "Entering..." message where appropriate.  */
-  if (output_sync == OUTPUT_SYNC_NONE || output_sync == OUTPUT_SYNC_RECURSE)
-    if (! stdio_traced && print_directory_flag)
-      stdio_traced = log_working_directory (1);
-}
-
-void
-outputs (int is_err, const char *msg)
-{
-  if (! msg || *msg == '\0')
-    return;
-
-  output_start ();
-
-  _outputs (output_context, is_err, msg);
-}
-\f
-
-static struct fmtstring
-  {
-    char *buffer;
-    size_t size;
-  } fmtbuf = { NULL, 0 };
-
-static char *
-get_buffer (size_t need)
-{
-  /* Make sure we have room.  NEED includes space for \0.  */
-  if (need > fmtbuf.size)
-    {
-      fmtbuf.size += need * 2;
-      fmtbuf.buffer = xrealloc (fmtbuf.buffer, fmtbuf.size);
-    }
-
-  fmtbuf.buffer[need-1] = '\0';
-
-  return fmtbuf.buffer;
-}
-
-/* Print a message on stdout.  */
-
-void
-message (int prefix, size_t len, const char *fmt, ...)
-{
-  va_list args;
-  char *p;
-
-  len += strlen (fmt) + strlen (program) + INTSTR_LENGTH + 4 + 1 + 1;
-  p = get_buffer (len);
-
-  if (prefix)
-    {
-      if (makelevel == 0)
-        sprintf (p, "%s: ", program);
-      else
-        sprintf (p, "%s[%u]: ", program, makelevel);
-      p += strlen (p);
-    }
-
-  va_start (args, fmt);
-  vsprintf (p, fmt, args);
-  va_end (args);
-
-  strcat (p, "\n");
-
-  assert (fmtbuf.buffer[len-1] == '\0');
-  outputs (0, fmtbuf.buffer);
-}
-
-/* Print an error message.  */
-
-void
-error (const floc *flocp, size_t len, const char *fmt, ...)
-{
-  va_list args;
-  char *p;
-
-  len += (strlen (fmt) + strlen (program)
-          + (flocp && flocp->filenm ? strlen (flocp->filenm) : 0)
-          + INTSTR_LENGTH + 4 + 1 + 1);
-  p = get_buffer (len);
-
-  if (flocp && flocp->filenm)
-    sprintf (p, "%s:%lu: ", flocp->filenm, flocp->lineno + flocp->offset);
-  else if (makelevel == 0)
-    sprintf (p, "%s: ", program);
-  else
-    sprintf (p, "%s[%u]: ", program, makelevel);
-  p += strlen (p);
-
-  va_start (args, fmt);
-  vsprintf (p, fmt, args);
-  va_end (args);
-
-  strcat (p, "\n");
-
-  assert (fmtbuf.buffer[len-1] == '\0');
-  outputs (1, fmtbuf.buffer);
-}
-
-/* Print an error message and exit.  */
-
-void
-fatal (const floc *flocp, size_t len, const char *fmt, ...)
-{
-  va_list args;
-  const char *stop = _(".  Stop.\n");
-  char *p;
-
-  len += (strlen (fmt) + strlen (program)
-          + (flocp && flocp->filenm ? strlen (flocp->filenm) : 0)
-          + INTSTR_LENGTH + 8 + strlen (stop) + 1);
-  p = get_buffer (len);
-
-  if (flocp && flocp->filenm)
-    sprintf (p, "%s:%lu: *** ", flocp->filenm, flocp->lineno + flocp->offset);
-  else if (makelevel == 0)
-    sprintf (p, "%s: *** ", program);
-  else
-    sprintf (p, "%s[%u]: *** ", program, makelevel);
-  p += strlen (p);
-
-  va_start (args, fmt);
-  vsprintf (p, fmt, args);
-  va_end (args);
-
-  strcat (p, stop);
-
-  assert (fmtbuf.buffer[len-1] == '\0');
-  outputs (1, fmtbuf.buffer);
-
-  die (MAKE_FAILURE);
-}
-
-/* Print an error message from errno.  */
-
-void
-perror_with_name (const char *str, const char *name)
-{
-  const char *err = strerror (errno);
-  OSSS (error, NILF, _("%s%s: %s"), str, name, err);
-}
-
-/* Print an error message from errno and exit.  */
-
-void
-pfatal_with_name (const char *name)
-{
-  const char *err = strerror (errno);
-  OSS (fatal, NILF, _("%s: %s"), name, err);
-
-  /* NOTREACHED */
-}
diff --git a/output.h b/output.h
deleted file mode 100644 (file)
index f4fe065..0000000
--- a/output.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Output to stdout / stderr for GNU make
-Copyright (C) 2013-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-struct output
-  {
-    int out;
-    int err;
-    unsigned int syncout:1;     /* True if we want to synchronize output.  */
- };
-
-extern struct output *output_context;
-extern unsigned int stdio_traced;
-
-#define OUTPUT_SET(_new)    do{ output_context = (_new)->syncout ? (_new) : NULL; }while(0)
-#define OUTPUT_UNSET()      do{ output_context = NULL; }while(0)
-
-#define OUTPUT_TRACED()     do{ stdio_traced = 1; }while(0)
-#define OUTPUT_IS_TRACED()  (!!stdio_traced)
-
-FILE *output_tmpfile (char **, const char *);
-
-/* Initialize and close a child output structure: if NULL do this program's
-   output (this should only be done once).  */
-void output_init (struct output *out);
-void output_close (struct output *out);
-
-/* In situations where output may be about to be displayed but we're not
-   sure if we've set it up yet, call this.  */
-void output_start (void);
-
-/* Show a message on stdout or stderr.  Will start the output if needed.  */
-void outputs (int is_err, const char *msg);
-
-#ifndef NO_OUTPUT_SYNC
-int output_tmpfd (void);
-/* Dump any child output content to stdout, and reset it.  */
-void output_dump (struct output *out);
-#endif
index d9ba7f4f944e2efcc3d05e52d7dc9210c4aa7c39..b1682e8f17a4145a1299e7580ca242fefaacd9b9 100644 (file)
@@ -1,5 +1,29 @@
-# Set of available languages: 25 languages
-
-be cs da de es fi fr ga gl he hr id it ja ko lt nl pl pt_BR ru sv tr uk vi zh_CN
-
-# Can't seem to get en@quot and en@boldquot to build properly?
+be
+bg
+cs
+da
+de
+es
+fi
+fr
+ga
+gl
+he
+hr
+id
+it
+ja
+ko
+lt
+nl
+pl
+pt
+pt_BR
+ru
+sr
+sv
+tr
+uk
+vi
+zh_CN
+zh_TW
index ee018843a6947a8424dfdd1a13204b76908f4fe1..f7abd7b01e1989b7c713afed4e39018910e40af6 100644 (file)
@@ -1,21 +1,3 @@
-# This is a -*-Makefile-*-
-# Copyright (C) 2002-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation; either version 3 of the License, or (at your option)
-# any later version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
 # Makefile variables for PO directory in any package using GNU gettext.
 
 # Usually the message domain is the same as the package name.
@@ -26,7 +8,16 @@ subdir = po
 top_builddir = ..
 
 # These options get passed to xgettext.
-XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ \
+          \
+ --from-code=UTF-8\
+ --flag=_:1:pass-c-format\
+ --flag=N_:1:pass-c-format\
+ --flag=DB:2:c-format --flag=DBF:2:c-format --flag=DBS:2:c-format\
+ --flag=O:3:c-format  --flag=OSN:3:c-format --flag=ONS:3:c-format\
+ --flag=OS:3:c-format --flag=OSS:3:c-format --flag=OSSS:3:c-format\
+ --flag=ON:3:c-format --flag=ONN:3:c-format\
+ $${end_of_xgettext_options+}
 
 # This is the copyright holder that gets inserted into the header of the
 # $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
@@ -38,6 +29,13 @@ XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
 # their copyright.
 COPYRIGHT_HOLDER = Free Software Foundation, Inc.
 
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
 # This is the email address or URL to which the translators shall report
 # bugs in the untranslated strings:
 # - Strings which are not entire sentences, see the maintainer guidelines
@@ -56,4 +54,34 @@ MSGID_BUGS_ADDRESS = bug-make@gnu.org
 
 # This is the list of locale categories, beyond LC_MESSAGES, for which the
 # message catalogs shall be used.  It is usually empty.
-EXTRA_LOCALE_CATEGORIES =
+EXTRA_LOCALE_CATEGORIES = 
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = no
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = yes
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = yes
index 061ff2b93f65da38810e0f9f4c6537c2fa7086be..46e53ef32c37a34c6dd557da547be1c24df75a46 100644 (file)
@@ -1,5 +1,5 @@
 # List of source files containing translatable strings.
-# Copyright (C) 2000-2016 Free Software Foundation, Inc.
+# Copyright (C) 2000-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
 # You should have received a copy of the GNU General Public License along with
 # this program.  If not, see <http://www.gnu.org/licenses/>.
 
-ar.c
-arscan.c
-commands.c
-dir.c
-expand.c
-file.c
-function.c
-getopt.c
-guile.c
-hash.c
-implicit.c
-job.c
-job.h
-load.c
-main.c
-misc.c
-output.c
-posixos.c
-read.c
-remake.c
-remote-cstms.c
-rule.c
-signame.c
-strcache.c
-variable.c
-variable.h
-vmsfunctions.c
-vmsjobs.c
-vpath.c
-w32/w32os.c
+src/ar.c
+src/arscan.c
+src/commands.c
+src/dir.c
+src/expand.c
+src/file.c
+src/function.c
+src/getopt.c
+src/guile.c
+src/hash.c
+src/implicit.c
+src/job.c
+src/load.c
+src/main.c
+src/misc.c
+src/output.c
+src/output.h
+src/posixos.c
+src/read.c
+src/remake.c
+src/remote-cstms.c
+src/rule.c
+src/signame.c
+src/strcache.c
+src/variable.c
+src/variable.h
+src/vmsfunctions.c
+src/vmsjobs.c
+src/vpath.c
+src/w32/w32os.c
index ca376b276b63f608fc01f4c242650f9719f0b16e..0908d0afc6260320a23160810f31ded080eb9adf 100644 (file)
Binary files a/po/be.gmo and b/po/be.gmo differ
index 7f8b309d2b636e932f689cde35a88a5315f4ee12..12408f125edd0ec8f2a8c32398360e97b1b404bb 100644 (file)
--- a/po/be.po
+++ b/po/be.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: make 3.80\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2003-10-21 11:50+0300\n"
 "Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n"
 "Language-Team: Belarusian <i18n@mova.org>\n"
@@ -14,115 +14,117 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-Generator: KBabel 0.9.6\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, fuzzy, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "спроба выкарыстаць непадтрымліваемую мажлівасьць: \"%s\""
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "дакрананьне да ўдзельніку архіва недаступна на VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, fuzzy, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: архіў \"%s\" ня йснуе"
 
-#: ar.c:150
+#: src/ar.c:150
 #, fuzzy, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: \"%s\" - гэта не рэчаісны архіў"
 
-#: ar.c:157
+#: src/ar.c:157
 #, fuzzy, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: удзельнік \"%s\" ня йснуе ў \"%s\""
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr ""
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr ""
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr ""
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (назва мусіла быць абрэзана)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Дата %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, рэжым = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr ""
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr ""
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr ""
 
-#: commands.c:645
+#: src/commands.c:646
 #, fuzzy, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Выдаляецца файл \"%s\""
 
-#: commands.c:647
+#: src/commands.c:648
 #, fuzzy, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Выдаляецца файл \"%s\""
 
-#: commands.c:683
+#: src/commands.c:684
 #, fuzzy
 msgid "#  recipe to execute"
 msgstr "#  загады для выкананьня"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (убудаваны):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, fuzzy, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (з\"%s\", радок %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -130,219 +132,221 @@ msgstr ""
 "\n"
 "# Тэчкі\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr ""
 
-#: dir.c:1085
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1122
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
 msgstr ""
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr ""
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr ""
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Не"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " файлаў, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "не"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr ""
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " так далёка."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr ""
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr ""
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr ""
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr ""
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr ""
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 
-#: file.c:408
+#: src/file.c:408
 #, fuzzy, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Выдаляецца файл \"%s\""
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Выдаляюцца прамежкавыя файлы...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Бягучы час"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: адбітак часу па-за дапушчальнымі межамі, падстаўляецца %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Ня мэта:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr ""
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr ""
 
-#: file.c:971
+#: src/file.c:1025
 #, fuzzy
 msgid "#  Command line target."
 msgstr "загадны радок"
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr ""
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr ""
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr ""
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr ""
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr ""
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr ""
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Так сама робяцца:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Час зьмяненьня ніколі не правяраўся."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Файл ня йснуе."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Файл вельмі стары."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Апошняе зьмяненьне %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Файл быў абноўлены."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Файл ня быў абноўлены."
 
-#: file.c:1008
+#: src/file.c:1062
 #, fuzzy
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Загады, што выконваюцца зараз (ГЭТА - ПАМЫЛКА)."
 
-#: file.c:1011
+#: src/file.c:1065
 #, fuzzy
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Загады, што выконваюцца зараз (ГЭТА - ПАМЫЛКА)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Пасьпяхова абноўлены."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr ""
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr ""
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr ""
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -350,613 +354,614 @@ msgstr ""
 "\n"
 "# Файлы"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
 "# "
 msgstr ""
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr ""
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr ""
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr ""
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr ""
 
-#: function.c:1525
+#: src/function.c:1533
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe (): памылка ў process_init_fd()\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe (): памылка ў process_init_fd()\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, fuzzy, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "памылка ў CreatePipe() (e=%d)\n"
 
-#: function.c:1564
-#, fuzzy
+#: src/function.c:1572
+#, fuzzy, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe (): памылка ў process_init_fd()\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr ""
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, fuzzy, c-format
 msgid "open: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, fuzzy, c-format
 msgid "write: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, fuzzy, c-format
 msgid "close: %s: %s"
 msgstr "%s%s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, fuzzy, c-format
 msgid "read: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "%s: нерэчаісны выбар -- %c.\n"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr ""
 
-#: function.c:2402
+#: src/function.c:2417
 #, fuzzy, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "Ня зроблена для гэтае плятформы: функцыя \"%s\""
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr ""
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr ""
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr ""
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr ""
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr ""
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr ""
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, fuzzy, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: выбар \"%s\" - неадназначы.\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, fuzzy, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: выбар \"--%s\" не дазваляе довад.\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, fuzzy, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: выбар \"%c%s\" не дазваляе довад.\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, fuzzy, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: выбар \"%s\" патрабуе довад.\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, fuzzy, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: нераспазнаны выбар \"--%s\".\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, fuzzy, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: нераспазнаны выбар \"%c%s\".\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: недапушчальны выбар -- %c.\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: нерэчаісны выбар -- %c.\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: выбар патрабуе довад -- %c.\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, fuzzy, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: выбар \"-W %s\" - неадназначын.\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, fuzzy, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: выбар \"-W %s\" не дазваляе довад.\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr ""
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr ""
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
+msgid "Rehash=%u, "
 msgstr ""
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr ""
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr ""
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr ""
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr ""
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr ""
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr ""
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr ""
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, fuzzy, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Выдаляюцца прамежкавыя файлы...\n"
 
-#: job.c:363
+#: src/job.c:370
 #, fuzzy
 msgid "Cannot create a temporary file\n"
 msgstr "fwrite (часовы файл)"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr ""
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr ""
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 #, fuzzy
 msgid "<builtin>"
 msgstr " (убудаваны):"
 
-#: job.c:510
+#: src/job.c:573
 #, fuzzy, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "*** [%s] Памылка %d"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Чакаюцца незавершаныя працы...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr ""
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr ""
 
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr ""
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr ""
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr ""
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr ""
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr ""
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1838
+#: src/job.c:1902
 #, fuzzy, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "touch: архіў \"%s\" ня йснуе"
 
-#: job.c:1841
+#: src/job.c:1905
 #, fuzzy, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s Няма правіла каб зрабіць мэту \"%s\", патрэбную для \"%s\"%s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr ""
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr ""
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr ""
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr ""
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: загад не адшуканы"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: загад не адшуканы"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr ""
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr ""
 
-#: job.c:2584
+#: src/job.c:2862
 #, fuzzy, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL зьменена (раней \"%s\", зараз \"%s\")"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr ""
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, fuzzy, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Паралельня працы (-j) не падтрымліваюцца на гэтае плятхорме."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Выбары:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr ""
 "  -h, --help                  Друкуе гэтае паведамленьне й выходзіць.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base        Друкуе нутраную базу даньняў make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 
-#: main.c:391
+#: src/main.c:388
 #, fuzzy
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet        Не адлюстроўваць загады.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -964,63 +969,64 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                               Выключае -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 
-#: main.c:398
+#: src/main.c:397
 #, fuzzy
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 "  -h, --help                  Друкуе гэтае паведамленьне й выходзіць.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory        Друкуе бягучую тэчку.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "пусты радок нерэчаісны ў якасьці назвы файла"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr ""
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1030,132 +1036,140 @@ msgid ""
 "ExceptionAddress = 0x%p\n"
 msgstr ""
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr ""
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr ""
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr ""
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s спынена на 30 сэкундаў..."
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr ""
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile са стандартнага ўводу зададзены двойчы."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (часовы файл)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (часовы файл)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Паралельня працы (-j) не падтрымліваюцца на гэтае плятхорме."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr ""
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Абнаўляюцца make-файлы....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr ""
 
-#: main.c:2299
+#: src/main.c:2323
 #, fuzzy, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Makefile \"%s\" ня знойдзен"
 
-#: main.c:2304
+#: src/main.c:2328
 #, fuzzy, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Makefile \"%s\" ня знойдзен"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr ""
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr ""
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (часовы файл): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ""
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr ""
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Няма мэт"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr ""
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr ""
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Выкарыстаньне: %s [выбары] [мэта] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1164,7 +1178,7 @@ msgstr ""
 "\n"
 "Гэта праграма пабудавана для %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1173,36 +1187,36 @@ msgstr ""
 "\n"
 "Гэта праграма падубавана для %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Паведамляйце пра памылкі на <bug-make@gnu.org>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, fuzzy, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "выбар \"-%c\" патрабуе станоўчы цэлы довад"
 
-#: main.c:2934
+#: src/main.c:2965
 #, fuzzy, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "выбар \"-%c\" патрабуе станоўчы цэлы довад"
 
-#: main.c:3332
+#: src/main.c:3363
 #, fuzzy, c-format
 msgid "%sBuilt for %s\n"
 msgstr ""
 "\n"
 "Гэта праграма пабудавана для %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, fuzzy, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr ""
 "\n"
 "Гэта праграма падубавана для %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1211,702 +1225,729 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
 "# Make data base, printed on %s"
 msgstr ""
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
 "# Finished Make data base on %s\n"
 msgstr ""
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Невядомая памылка %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: карыстальнік %lu (насамрэч %lu), група %lu (насамрэч %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr ""
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr ""
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr ""
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr ""
 
-#: output.c:104
+#: src/output.c:97
 #, fuzzy, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: уваход у невядомую тэчку"
 
-#: output.c:106
+#: src/output.c:99
 #, fuzzy, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: выхад зь невядомае тэчкі"
 
-#: output.c:109
+#: src/output.c:102
 #, fuzzy, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: уваход у тэчку \"%s\"\n"
 
-#: output.c:111
+#: src/output.c:104
 #, fuzzy, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: выхад з тэчкі \"%s\"\n"
 
-#: output.c:115
+#: src/output.c:108
 #, fuzzy, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: уваход у невядомую тэчку"
 
-#: output.c:117
+#: src/output.c:110
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: выхад зь невядомае тэчкі"
 
-#: output.c:120
+#: src/output.c:113
 #, fuzzy, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: уваход у тэчку \"%s\"\n"
 
-#: output.c:122
+#: src/output.c:115
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: выхад з тэчкі \"%s\"\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr ""
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ""
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "ствараецца трубаправод прац"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 #, fuzzy
 msgid "duping jobs pipe"
 msgstr "ствараецца трубаправод прац"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr ""
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr ""
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr ""
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr ""
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 #, fuzzy
 msgid "pselect jobs pipe"
 msgstr "ствараецца трубаправод прац"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr ""
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Чытаюцца make-файлы...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, fuzzy, c-format
 msgid "Reading makefile '%s'"
 msgstr "Чытаецца make-файл \"%s\""
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (няма дапомнае мэты)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (пошук шляху)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr ""
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr ""
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr ""
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr ""
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr ""
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr ""
 
-#: read.c:1034
-#, fuzzy
+#: src/read.c:1035
+#, fuzzy, c-format
 msgid "missing rule before recipe"
 msgstr "прапушчана правіла перад загадамі"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr " (вы маеце на ўвазе TAB замест 8 прагалаў?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, fuzzy, c-format
 msgid "missing separator"
 msgstr "прапушчан падзяляльнік %s"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr ""
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr ""
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr ""
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, fuzzy, c-format
 msgid "missing 'endif'"
 msgstr "прапушчаны \"endif\""
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr ""
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr ""
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, fuzzy, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "прапушчаны \"endef\", незавершаны \"define\""
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr ""
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr ""
 
-#: read.c:1589
+#: src/read.c:1604
 #, fuzzy, c-format
 msgid "extraneous '%s'"
 msgstr "зьнешні \"%s\""
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr ""
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr ""
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr ""
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr ""
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr ""
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr ""
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr ""
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr ""
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr ""
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr ""
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr ""
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr ""
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr ""
 
-#: remake.c:226
+#: src/remake.c:226
 #, fuzzy, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Нічога ня было зроблена для \"%s\"."
 
-#: remake.c:227
+#: src/remake.c:227
 #, fuzzy, c-format
 msgid "'%s' is up to date."
 msgstr "\"%s\" - састарэл(а)."
 
-#: remake.c:323
+#: src/remake.c:323
 #, fuzzy, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Усё яшэ абнаўляецца файл \"%s\".\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%s Няма правіла каб зрабіць мэту \"%s\", патрэбную для \"%s\"%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr ""
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr ""
 
-#: remake.c:461
+#: src/remake.c:444
 #, fuzzy, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Файл \"%s\" ужо быў разгледжаны.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, fuzzy, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Усё яшэ абнаўляецца файл \"%s\".\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, fuzzy, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Скончана абнаўленьне файла \"%s\".\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, fuzzy, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Файл \"%s\" ня йснуе.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr ""
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr ""
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr ""
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr ""
 
-#: remake.c:691
+#: src/remake.c:674
 #, fuzzy, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Скончана абнаўленьне файла \"%s\".\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr ""
 
-#: remake.c:711
+#: src/remake.c:694
 #, fuzzy, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Скончана абнаўленьне файла \"%s\".\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr ""
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr ""
 
-#: remake.c:773
+#: src/remake.c:756
 #, fuzzy, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Файл \"%s\" ня йснуе.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr ""
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr ""
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr ""
 
-#: remake.c:819
+#: src/remake.c:802
 #, fuzzy, c-format
 msgid "No need to remake target '%s'"
 msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr ""
 
-#: remake.c:841
+#: src/remake.c:824
 #, fuzzy, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr ""
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr ""
 
-#: remake.c:863
+#: src/remake.c:846
 #, fuzzy, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "%sНяма правіла каб зрабіць мэту \"%s\"%s"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr ""
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr ""
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, fuzzy, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Невядомы ўбудаваны загад \"%s\".\n"
 
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Увага! Файл \"%s\" мае час зьмяненьня, які шчэ не надышоў."
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, fuzzy, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Увага! Файл \"%s\" мае час зьмяненьня %.2g с, які шчэ не надышоў."
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ""
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr ""
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
 msgstr ""
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
 msgstr ""
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 
-#: rule.c:523
-msgid " terminal."
-msgstr " тэрмінал."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr ""
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "невядомы сыгнал"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr ""
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr ""
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr ""
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Недапушчальная інструкцыя"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr ""
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr ""
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr ""
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr ""
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr ""
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Забіты"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Памылка шыны"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr ""
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Дрэнны сыстэмны выклік"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Зламаны трубаправод"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr ""
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Завершаны"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr ""
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr ""
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr ""
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr ""
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Спынен"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Спынен (tty увод)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Спынен (вывад на tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Спынена (сыгнал)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr ""
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr ""
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr ""
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr ""
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Акно зьменена"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr ""
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr ""
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "магчым У/В"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr ""
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr ""
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr ""
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Сыгнал пагрозы"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Запыт аб зьвестках"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr ""
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1914,75 +1955,75 @@ msgid ""
 "B\n"
 msgstr ""
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "аўтаматычна"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "дапомны"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "асяродзьдзе"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "make-файл"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr ""
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "загадны радок"
 
-#: variable.c:1647
+#: src/variable.c:1671
 #, fuzzy
 msgid "'override' directive"
 msgstr "дырэктыва \"override\""
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, fuzzy, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (з \"%s\", радок %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr ""
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -1990,123 +2031,123 @@ msgstr ""
 "\n"
 "# Пераменныя\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 
-#: variable.h:224
+#: src/variable.h:229
 #, fuzzy, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "Увага! Нявызначаная пераменная \"%.*s\""
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr ""
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr ""
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, fuzzy, c-format
 msgid "Append output to %s\n"
 msgstr "Перанакіраваны вывад у %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr ""
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
 msgstr ""
 
-#: vpath.c:620
+#: src/vpath.c:620
 #, fuzzy
 msgid "# No 'vpath' search paths."
 msgstr " (пошук шляху)"
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
@@ -2120,6 +2161,12 @@ msgstr ""
 #~ msgid "Redirected input from %s\n"
 #~ msgstr "Перанакіраваны ўвод з %s\n"
 
+#~ msgid "%s: Command not found"
+#~ msgstr "%s: загад не адшуканы"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s спынена на 30 сэкундаў..."
+
 #~ msgid "Do not specify -j or --jobs if sh.exe is not available."
 #~ msgstr "Не задавайце -j ці --jobs, калі sh.exe недаступны."
 
@@ -2132,6 +2179,9 @@ msgstr ""
 #~ "%sпагадненьня аб распаўсюджваньні. Ня йснуе НІЯКАЕ гарантыі, нават аб\n"
 #~ "%sмагчымасьці выкарыстньня зь якой небудзь мэтай.\n"
 
+#~ msgid "Unknown error %d"
+#~ msgstr "Невядомая памылка %d"
+
 #~ msgid "virtual memory exhausted"
 #~ msgstr "віртуальная памяць вычарпана"
 
@@ -2141,6 +2191,12 @@ msgstr ""
 #~ msgid "no file name for `%sinclude'"
 #~ msgstr "няма назвы файла для \"%sinclude\""
 
+#~ msgid "Warning: File `%s' has modification time in the future"
+#~ msgstr "Увага! Файл \"%s\" мае час зьмяненьня, які шчэ не надышоў."
+
+#~ msgid " terminal."
+#~ msgstr " тэрмінал."
+
 #~ msgid ""
 #~ "\n"
 #~ "# No files."
diff --git a/po/bg.gmo b/po/bg.gmo
new file mode 100644 (file)
index 0000000..ea867cc
Binary files /dev/null and b/po/bg.gmo differ
diff --git a/po/bg.po b/po/bg.po
new file mode 100644 (file)
index 0000000..641201e
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,2293 @@
+# Bulgarian translation of make po-file.
+# Copyright (C) 2019, 2020 Free Software Foundation, Inc.
+# This file is distributed under the same license as the make package.
+# Alexander Shopov <ash@kambanaria.org>, 2019, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: make 4.2.93\n"
+"Report-Msgid-Bugs-To: bug-make@gnu.org\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-04 12:41+0100\n"
+"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
+"Language-Team: Bulgarian <dict@ludost.net>\n"
+"Language: bg\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: src/ar.c:46
+#, c-format
+msgid "attempt to use unsupported feature: '%s'"
+msgstr "опит за ползване на „%s“, което не се поддържа"
+
+#: src/ar.c:123
+#, c-format
+msgid "touch archive member is not available on VMS"
+msgstr ""
+"обновяването на информацията чрез „touch“ на член на архив не се поддържа "
+"под VMS"
+
+#: src/ar.c:147
+#, c-format
+msgid "touch: Archive '%s' does not exist"
+msgstr "„touch“: архивът „%s“ не съществува"
+
+#: src/ar.c:150
+#, c-format
+msgid "touch: '%s' is not a valid archive"
+msgstr "„touch“: „%s“ не е поддържан архив"
+
+#: src/ar.c:157
+#, c-format
+msgid "touch: Member '%s' does not exist in '%s'"
+msgstr "„touch“: в „%2$s“ няма член „%1$s“"
+
+#: src/ar.c:164
+#, c-format
+msgid "touch: Bad return code from ar_member_touch on '%s'"
+msgstr "„touch“: неправилен изходен код от „ar_member_touch“ върху „%s“"
+
+#: src/arscan.c:130
+#, c-format
+msgid "lbr$set_module() failed to extract module info, status = %d"
+msgstr "„lbr$set_module()“ не може да получи информация за модула, код = %d"
+
+#: src/arscan.c:236
+#, c-format
+msgid "lbr$ini_control() failed with status = %d"
+msgstr "„lbr$ini_control()“ завърши неуспешно с код = %d"
+
+#: src/arscan.c:261
+#, c-format
+msgid "unable to open library '%s' to lookup member status %d"
+msgstr "библиотеката „%s“ не може да се отвори за проверката на член, код = %d"
+
+#: src/arscan.c:944
+#, c-format
+msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
+msgstr "Член „%s“%s: %ld байта при %ld (%ld).\n"
+
+#: src/arscan.c:945
+msgid " (name might be truncated)"
+msgstr " (името може да е отсечено)"
+
+#: src/arscan.c:947
+#, c-format
+msgid "  Date %s"
+msgstr "  Дата %s"
+
+#: src/arscan.c:948
+#, c-format
+msgid "  uid = %d, gid = %d, mode = 0%o.\n"
+msgstr "  ИД_П = %d, ИД_ГР = %d, режим = 0%o.\n"
+
+#: src/commands.c:403
+#, c-format
+msgid "Recipe has too many lines (%ud)"
+msgstr "Прекалено много редове в рецептата (%ud)"
+
+#: src/commands.c:504
+msgid "*** Break.\n"
+msgstr "••• Прекъсване.\n"
+
+#: src/commands.c:628
+#, c-format
+msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
+msgstr "••• [%s] „%s“ може да е фалшива част от архив — няма да бъде изтрита"
+
+#: src/commands.c:632
+#, c-format
+msgid "*** Archive member '%s' may be bogus; not deleted"
+msgstr "••• „%s“ може да е фалшива част от архив — няма да бъде изтрита"
+
+#: src/commands.c:646
+#, c-format
+msgid "*** [%s] Deleting file '%s'"
+msgstr "••• [%s] Изтриване на файл „%s“"
+
+#: src/commands.c:648
+#, c-format
+msgid "*** Deleting file '%s'"
+msgstr "•••  Изтриване на файл „%s“"
+
+#: src/commands.c:684
+msgid "#  recipe to execute"
+msgstr "#  рецепта за изпълнение"
+
+#: src/commands.c:687
+msgid " (built-in):"
+msgstr " (вградено):"
+
+#: src/commands.c:689
+#, c-format
+msgid " (from '%s', line %lu):\n"
+msgstr " (от „%s“, ред %lu)\n"
+
+#: src/dir.c:1073
+msgid ""
+"\n"
+"# Directories\n"
+msgstr ""
+"\n"
+"# Директории\n"
+
+#: src/dir.c:1085
+#, c-format
+msgid "# %s: could not be stat'd.\n"
+msgstr "# „%s“: не може да се получи информация чрез „stat“.\n"
+
+#: src/dir.c:1089
+msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
+msgstr "# %s (ключ %s, време на промяна %I64u): не може да се отвори.\n"
+
+#: src/dir.c:1094
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
+msgstr "# %s (устройство %d, i-възел [%d,%d,%d]): не може да се отвори.\n"
+
+#: src/dir.c:1099
+#, c-format
+msgid "# %s (device %ld, inode %ld): could not be opened.\n"
+msgstr "# %s (устройство %ld, i-възел %ld): не може да се отвори.\n"
+
+#: src/dir.c:1126
+msgid "# %s (key %s, mtime %I64u): "
+msgstr "# %s (ключ %s, време на промяна %I64u): "
+
+#: src/dir.c:1131
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): "
+msgstr "# %s (устройство %d, i-възел [%d,%d,%d]): "
+
+#: src/dir.c:1136
+#, c-format
+msgid "# %s (device %ld, inode %ld): "
+msgstr "# %s (устройство %ld, i-възел %ld): "
+
+#: src/dir.c:1142 src/dir.c:1163
+msgid "No"
+msgstr "Няма"
+
+#: src/dir.c:1145 src/dir.c:1166
+msgid " files, "
+msgstr " файлове, "
+
+#: src/dir.c:1147 src/dir.c:1168
+msgid "no"
+msgstr "няма"
+
+#: src/dir.c:1150
+msgid " impossibilities"
+msgstr " пречки"
+
+#: src/dir.c:1154
+msgid " so far."
+msgstr " засега."
+
+#: src/dir.c:1171
+#, c-format
+msgid " impossibilities in %lu directories.\n"
+msgstr " пречки в %lu директории.\n"
+
+#: src/expand.c:125
+#, c-format
+msgid "Recursive variable '%s' references itself (eventually)"
+msgstr "Рекурсивната променлива „%s“ сочи себе си (в някой момент)"
+
+#: src/expand.c:271
+#, c-format
+msgid "unterminated variable reference"
+msgstr "незавършен указател към променлива"
+
+#: src/file.c:278
+#, c-format
+msgid "Recipe was specified for file '%s' at %s:%lu,"
+msgstr "Рецептата е указана за файл „%s“ при %s:%lu,"
+
+#: src/file.c:283
+#, c-format
+msgid "Recipe for file '%s' was found by implicit rule search,"
+msgstr "Рецептата за файла „%s“ бе открита при търсене на вградените правила."
+
+#: src/file.c:287
+#, c-format
+msgid "but '%s' is now considered the same file as '%s'."
+msgstr "но сега „%s“ се счита за същия файл като „%s“."
+
+#: src/file.c:290
+#, c-format
+msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
+msgstr "Рецептата за „%s“ се прескача, а се ползва тази за „%s“."
+
+#: src/file.c:310
+#, c-format
+msgid "can't rename single-colon '%s' to double-colon '%s'"
+msgstr ""
+"единичното двоеточие „%s“ не може да се преименува на двойно двоеточие „%s“"
+
+#: src/file.c:316
+#, c-format
+msgid "can't rename double-colon '%s' to single-colon '%s'"
+msgstr ""
+"двойното двоеточие „%s“ не може да се преименува на единично двоеточие „%s“"
+
+#: src/file.c:408
+#, c-format
+msgid "*** Deleting intermediate file '%s'"
+msgstr "••• Изтриване на междинния файл „%s“"
+
+#: src/file.c:412
+#, c-format
+msgid "Removing intermediate files...\n"
+msgstr "Изтриване на междинните файлове…\n"
+
+#: src/file.c:872
+msgid "Current time"
+msgstr "Текущо време"
+
+#: src/file.c:876
+#, c-format
+msgid "%s: Timestamp out of range; substituting %s"
+msgstr "%s: времевото клеймо е извън диапазона, замества се с „%s“"
+
+#: src/file.c:1016
+msgid "# Not a target:"
+msgstr "# Не е цел:"
+
+#: src/file.c:1021
+msgid "#  Precious file (prerequisite of .PRECIOUS)."
+msgstr "#  Ценен файл (изискване на „.PRECIOUS“)."
+
+#: src/file.c:1023
+msgid "#  Phony target (prerequisite of .PHONY)."
+msgstr "#  Фалшива цел (изискване на „.PHONY“)."
+
+#: src/file.c:1025
+msgid "#  Command line target."
+msgstr "#  Цел на командния ред."
+
+#: src/file.c:1027
+msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
+msgstr "#  Стандартен, MAKEFILES или -include/sinclude makefile."
+
+#: src/file.c:1029
+msgid "#  Builtin rule"
+msgstr "#  Вградено правило"
+
+#: src/file.c:1031
+msgid "#  Implicit rule search has been done."
+msgstr "#  Търсенето във вградените правила е извършено."
+
+#: src/file.c:1032
+msgid "#  Implicit rule search has not been done."
+msgstr "#  Търсенето във вградените правила не е извършено."
+
+#: src/file.c:1034
+#, c-format
+msgid "#  Implicit/static pattern stem: '%s'\n"
+msgstr "#  Вградена/статична основа на шаблон: „%s“\n"
+
+#: src/file.c:1036
+msgid "#  File is an intermediate prerequisite."
+msgstr "#  Файлът е междинно изискване."
+
+#: src/file.c:1040
+msgid "#  Also makes:"
+msgstr "#  Също изгражда:"
+
+#: src/file.c:1046
+msgid "#  Modification time never checked."
+msgstr "#  Времето на промяна не е проверено."
+
+#: src/file.c:1048
+msgid "#  File does not exist."
+msgstr "#  Файлът не съществува."
+
+#: src/file.c:1050
+msgid "#  File is very old."
+msgstr "#  Файлът е много стар."
+
+#: src/file.c:1055
+#, c-format
+msgid "#  Last modified %s\n"
+msgstr "#  Последна промяна на „%s“\n"
+
+#: src/file.c:1058
+msgid "#  File has been updated."
+msgstr "#  Файлът е обновен."
+
+#: src/file.c:1058
+msgid "#  File has not been updated."
+msgstr "#  Файлът не е обновен."
+
+#: src/file.c:1062
+msgid "#  Recipe currently running (THIS IS A BUG)."
+msgstr "#  Рецептата в момента се изпълнява (това е ГРЕШКА)."
+
+#: src/file.c:1065
+msgid "#  Dependencies recipe running (THIS IS A BUG)."
+msgstr "#  Рецептата за зависимостите в момента се изпълнява (това е ГРЕШКА)"
+
+#: src/file.c:1074
+msgid "#  Successfully updated."
+msgstr "#  Успешно обновено."
+
+#: src/file.c:1078
+msgid "#  Needs to be updated (-q is set)."
+msgstr "#  Трябва да бъде обновено („-q“ е зададена)."
+
+#: src/file.c:1081
+msgid "#  Failed to be updated."
+msgstr "#  Неуспешно обновяване."
+
+#: src/file.c:1086
+msgid "#  Invalid value in 'command_state' member!"
+msgstr "#  Неправилна стойност в член на „command_state“!"
+
+#: src/file.c:1105
+msgid ""
+"\n"
+"# Files"
+msgstr ""
+"\n"
+"# Файлове"
+
+#: src/file.c:1109
+msgid ""
+"\n"
+"# files hash-table stats:\n"
+"# "
+msgstr ""
+"\n"
+"# статистика за речника за файлове:\n"
+"# "
+
+#: src/file.c:1119
+#, c-format
+msgid "%s: Field '%s' not cached: %s"
+msgstr "%s: полето „%s“ не е кеширано: %s"
+
+#: src/function.c:794
+msgid "non-numeric first argument to 'word' function"
+msgstr "нечислов първи аргумент към функцията „word“"
+
+#: src/function.c:799
+#, c-format
+msgid "first argument to 'word' function must be greater than 0"
+msgstr "първият аргумент към функцията „word“ трябва да е положително число"
+
+#: src/function.c:819
+msgid "non-numeric first argument to 'wordlist' function"
+msgstr "нечислов първи аргумент за функцията „wordlist“"
+
+#: src/function.c:821
+msgid "non-numeric second argument to 'wordlist' function"
+msgstr "нечислов втори аргумент за функцията „wordlist“"
+
+#: src/function.c:1533
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
+msgstr ""
+"„windows32_openpipe“: неуспешно извикване на „DuplicateHandle(In)“ (e=%ld)\n"
+
+#: src/function.c:1557
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
+msgstr ""
+"„windows32_openpipe“: неуспешно извикване на „DuplicateHandle(Out)“ (e=%ld)\n"
+
+#: src/function.c:1564
+#, c-format
+msgid "CreatePipe() failed (e=%ld)\n"
+msgstr "неуспешно извикване на „CreatePipe()“ failed (e=%ld)\n"
+
+#: src/function.c:1572
+#, c-format
+msgid "windows32_openpipe(): process_init_fd() failed\n"
+msgstr "„windows32_openpipe()“: неуспешно извикване на „process_init_fd()“\n"
+
+#: src/function.c:1857
+#, c-format
+msgid "Cleaning up temporary batch file %s\n"
+msgstr "Изчистване на временен файл за пакетна обработка „%s“\n"
+
+#: src/function.c:2230 src/function.c:2255
+#, c-format
+msgid "file: missing filename"
+msgstr "файл: липсва име на файл"
+
+#: src/function.c:2234 src/function.c:2265
+#, c-format
+msgid "open: %s: %s"
+msgstr "отваряне: %s: %s"
+
+#: src/function.c:2242
+#, c-format
+msgid "write: %s: %s"
+msgstr "запазване: %s: %s"
+
+#: src/function.c:2245 src/function.c:2282
+#, c-format
+msgid "close: %s: %s"
+msgstr "затваряне: %s: %s"
+
+#: src/function.c:2258
+#, c-format
+msgid "file: too many arguments"
+msgstr "файл: прекалено много аргументи"
+
+#: src/function.c:2277
+#, c-format
+msgid "read: %s: %s"
+msgstr "четене: %s: %s"
+
+#: src/function.c:2290
+#, c-format
+msgid "file: invalid file operation: %s"
+msgstr "файл: неправилно действие върху файл: %s"
+
+#: src/function.c:2405
+#, c-format
+msgid "insufficient number of arguments (%d) to function '%s'"
+msgstr "недостатъчен брой аргументи (%d) към функцията „%s“"
+
+#: src/function.c:2417
+#, c-format
+msgid "unimplemented on this platform: function '%s'"
+msgstr "без реализация на тази платформа: функция „%s“"
+
+#: src/function.c:2483
+#, c-format
+msgid "unterminated call to function '%s': missing '%c'"
+msgstr "незавършено извикване на функцията „%s“: липсва „%c“"
+
+#: src/function.c:2667
+#, c-format
+msgid "Empty function name"
+msgstr "Празно име на функция"
+
+#: src/function.c:2669
+#, c-format
+msgid "Invalid function name: %s"
+msgstr "Грешно име на функция: „%s“"
+
+#: src/function.c:2671
+#, c-format
+msgid "Function name too long: %s"
+msgstr "Името на функцията е твърде дълго: „%s“"
+
+#: src/function.c:2674
+#, c-format
+msgid "Invalid minimum argument count (%u) for function %s"
+msgstr "Неправилен минимален брой аргументи (%u) за функцията „%s“"
+
+#: src/function.c:2677
+#, c-format
+msgid "Invalid maximum argument count (%u) for function %s"
+msgstr "Неправилен максимален брой аргументи (%u) за функцията „%s“"
+
+#: src/getopt.c:659
+#, c-format
+msgid "%s: option '%s' is ambiguous\n"
+msgstr "%s: опцията „%s“ не е еднозначна\n"
+
+#: src/getopt.c:683
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: опцията „--%s“ не приема аргумент\n"
+
+#: src/getopt.c:688
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: опцията „%c%s“ не приема аргумент\n"
+
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
+msgid "%s: option '%s' requires an argument\n"
+msgstr "%s: опцията „%s“ изисква аргумент\n"
+
+#: src/getopt.c:734
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: непозната опция „--%s“\n"
+
+#: src/getopt.c:738
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: непозната опция „%c%s“\n"
+
+#: src/getopt.c:764
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: непозволена опция — %c\n"
+
+#: src/getopt.c:767
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: неправилна опция — „%c“\n"
+
+#: src/getopt.c:797 src/getopt.c:927
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: опцията изисква аргумент — %c\n"
+
+#: src/getopt.c:844
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: опцията „-W %s“ не е еднозначна\n"
+
+#: src/getopt.c:862
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: опцията „-W %s“ не приема аргумент\n"
+
+#: src/guile.c:58
+#, c-format
+msgid "guile: Expanding '%s'\n"
+msgstr "guile: заместване на „%s“\n"
+
+#: src/guile.c:74
+#, c-format
+msgid "guile: Evaluating '%s'\n"
+msgstr "guile: изчисляване на „%s“\n"
+
+#: src/hash.c:50
+#, c-format
+msgid "can't allocate %lu bytes for hash table: memory exhausted"
+msgstr "не могат да се заделят %lu байта за речник — паметта е изчерпана"
+
+#: src/hash.c:280
+#, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Натоварване=%lu/%lu=%.0f%%, "
+
+#: src/hash.c:282
+#, c-format
+msgid "Rehash=%u, "
+msgstr "Преизграждане на речник=%u, "
+
+#: src/hash.c:283
+#, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Съвпадения=%lu/%lu=%.0f%%"
+
+#: src/implicit.c:38
+#, c-format
+msgid "Looking for an implicit rule for '%s'.\n"
+msgstr "Търсене на вградено правило за „%s“.\n"
+
+#: src/implicit.c:54
+#, c-format
+msgid "Looking for archive-member implicit rule for '%s'.\n"
+msgstr "Търсене на вградено правило по член на архив за „%s“.\n"
+
+#: src/implicit.c:311
+#, c-format
+msgid "Avoiding implicit rule recursion.\n"
+msgstr "Избягване на рекурсия във вградените правила.\n"
+
+#: src/implicit.c:484
+#, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Твърде дълга основа: „%s%.*s“.\n"
+
+#: src/implicit.c:490
+#, c-format
+msgid "Trying pattern rule with stem '%.*s'.\n"
+msgstr "Опит за шаблонно правило с основа „%.*s“.\n"
+
+#: src/implicit.c:717
+#, c-format
+msgid "Rejecting impossible rule prerequisite '%s'.\n"
+msgstr "Отхвърляне на невъзможно изискване „%s“.\n"
+
+#: src/implicit.c:718
+#, c-format
+msgid "Rejecting impossible implicit prerequisite '%s'.\n"
+msgstr "Отхвърляне на невъзможно вградено изискване „%s“.\n"
+
+#: src/implicit.c:732
+#, c-format
+msgid "Trying rule prerequisite '%s'.\n"
+msgstr "Опитване на изискването „%s“.\n"
+
+#: src/implicit.c:733
+#, c-format
+msgid "Trying implicit prerequisite '%s'.\n"
+msgstr "Опитване на вграденото изискване „%s“.\n"
+
+#: src/implicit.c:772
+#, c-format
+msgid "Found prerequisite '%s' as VPATH '%s'\n"
+msgstr "Изисканото „%s“ е открито чрез „VPATH“ като „%s“\n"
+
+#: src/implicit.c:786
+#, c-format
+msgid "Looking for a rule with intermediate file '%s'.\n"
+msgstr "Търсене на правило с междинен файл „%s“.\n"
+
+#: src/job.c:370
+msgid "Cannot create a temporary file\n"
+msgstr "Не може да се създаде временен файл\n"
+
+#: src/job.c:548
+msgid " (core dumped)"
+msgstr " (паметта е разтоварена)"
+
+#: src/job.c:553
+msgid " (ignored)"
+msgstr " (прескачане)"
+
+#: src/job.c:557 src/job.c:1892
+msgid "<builtin>"
+msgstr "<вградено>"
+
+#: src/job.c:573
+#, c-format
+msgid "%s[%s: %s] Error %d%s"
+msgstr "%s[%s: %s] Грешка %d%s"
+
+#: src/job.c:662
+#, c-format
+msgid "*** Waiting for unfinished jobs...."
+msgstr "••• Изчакване на незавършени задачи…"
+
+#: src/job.c:704
+#, c-format
+msgid "Live child %p (%s) PID %s %s\n"
+msgstr "Незавършил дъщерен процес %p (%s) ИД_ПР %s %s\n"
+
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
+msgid " (remote)"
+msgstr " (отдалечено)"
+
+#: src/job.c:898
+#, c-format
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "Приключване на спечелелия дъщерен процес %p ИД_ПР %s %s\n"
+
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Приключване на изгубилия дъщерен процес %p ИД_ПР %s %s\n"
+
+#: src/job.c:950
+#, c-format
+msgid "Cleaning up temp batch file %s\n"
+msgstr "Изчистване на временен файл за пакетна обработка „%s“\n"
+
+#: src/job.c:956
+#, c-format
+msgid "Cleaning up temp batch file %s failed (%d)\n"
+msgstr "Неуспешно изчистване на временен файл за пакетна обработка „%s“: %d\n"
+
+#: src/job.c:1071
+#, c-format
+msgid "Removing child %p PID %s%s from chain.\n"
+msgstr "Изчистване на дъщерния процес %p PID %s%s от веригата.\n"
+
+#: src/job.c:1120
+#, c-format
+msgid "Released token for child %p (%s).\n"
+msgstr "Освобождаване на жетона за дъщерен процес %p (%s).\n"
+
+#: src/job.c:1575 src/job.c:2487
+#, c-format
+msgid "process_easy() failed to launch process (e=%ld)\n"
+msgstr "„process_easy()“ не успя да стартира процес (e=%ld)\n"
+
+#: src/job.c:1579 src/job.c:2491
+#, c-format
+msgid ""
+"\n"
+"Counted %d args in failed launch\n"
+msgstr ""
+"\n"
+"При неуспешно стартиране са изброени %d аргумента\n"
+
+#: src/job.c:1642
+#, c-format
+msgid "Putting child %p (%s) PID %s%s on the chain.\n"
+msgstr "Поставяне на дъщерния процес %p (%s) PID %s%s във веригата.\n"
+
+#: src/job.c:1875
+#, c-format
+msgid "Obtained token for child %p (%s).\n"
+msgstr "Получен е жетон за дъщерен процес %p (%s).\n"
+
+#: src/job.c:1902
+#, c-format
+msgid "%s: target '%s' does not exist"
+msgstr "%s: целта „%s“ не съществува"
+
+#: src/job.c:1905
+#, c-format
+msgid "%s: update target '%s' due to: %s"
+msgstr "%s: обновяване на целта „%s“ заради: %s"
+
+#: src/job.c:2108
+#, c-format
+msgid "cannot enforce load limits on this operating system"
+msgstr ""
+"на тази операционна система не могат да се налагат ограничения за "
+"натоварването"
+
+#: src/job.c:2110
+msgid "cannot enforce load limit: "
+msgstr "ограничението не може да бъде наложено: "
+
+#: src/job.c:2200
+#, c-format
+msgid "no more file handles: could not duplicate stdin\n"
+msgstr ""
+"няма ресурс за отваряне на повече файлове: стандартният вход не може да се "
+"дублира\n"
+
+#: src/job.c:2212
+#, c-format
+msgid "no more file handles: could not duplicate stdout\n"
+msgstr ""
+"няма ресурс за отваряне на повече файлове: стандартният изход не може да се "
+"дублира\n"
+
+#: src/job.c:2226
+#, c-format
+msgid "no more file handles: could not duplicate stderr\n"
+msgstr ""
+"няма ресурс за отваряне на повече файлове: стандартната грешка не може да се "
+"дублира\n"
+
+#: src/job.c:2241
+#, c-format
+msgid "Could not restore stdin\n"
+msgstr "Стандартният вход не може да се възстанови\n"
+
+#: src/job.c:2249
+#, c-format
+msgid "Could not restore stdout\n"
+msgstr "Стандартният изход не може да се възстанови\n"
+
+#: src/job.c:2257
+#, c-format
+msgid "Could not restore stderr\n"
+msgstr "Стандартната грешка не може да се възстанови\n"
+
+#: src/job.c:2520
+#, c-format
+msgid "make reaped child pid %s, still waiting for pid %s\n"
+msgstr ""
+"„make“ приключи дъщерен процес с идентификатор %s, все още се чака за %s\n"
+
+#: src/job.c:2623
+#, c-format
+msgid "spawnvpe: environment space might be exhausted"
+msgstr "spawnvpe: пространството на средата може да е изчерпано"
+
+#: src/job.c:2862
+#, c-format
+msgid "$SHELL changed (was '%s', now '%s')\n"
+msgstr "Променливата „SHELL“ е променена (бе „%s“, а сега е „%s“)\n"
+
+#: src/job.c:3300 src/job.c:3485
+#, c-format
+msgid "Creating temporary batch file %s\n"
+msgstr "Не може да се създаде временен файл за пакетна обработка в „%s“\n"
+
+#: src/job.c:3308
+#, c-format
+msgid ""
+"Batch file contents:\n"
+"\t@echo off\n"
+msgstr ""
+"Съдържание на файл за пакетна обработка:\n"
+"\t@echo off\n"
+
+#: src/job.c:3497
+#, c-format
+msgid ""
+"Batch file contents:%s\n"
+"\t%s\n"
+msgstr ""
+"Съдържание на файла за пакетна обработка:%s\n"
+"\t%s\n"
+
+#: src/job.c:3605
+#, c-format
+msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
+msgstr ""
+"%s (ред %d) неправилен контекст на обвивката (!unixy && !batch_mode_shell)\n"
+
+#: src/load.c:60
+#, c-format
+msgid "Failed to open global symbol table: %s"
+msgstr "Неуспешно отваряне на глобалната таблица със символи: %s"
+
+#: src/load.c:97
+#, c-format
+msgid "Loaded object %s is not declared to be GPL compatible"
+msgstr "Зареденият обект „%s“ не е обявен като съвместим с ОПЛ (GPL)"
+
+#: src/load.c:104
+#, c-format
+msgid "Failed to load symbol %s from %s: %s"
+msgstr "Неуспешно зареждане на символа „%s“ от „%s“: %s"
+
+#: src/load.c:149
+#, c-format
+msgid "Empty symbol name for load: %s"
+msgstr "Празно име на символ за зареждане: „%s“"
+
+#: src/load.c:204
+#, c-format
+msgid "Loading symbol %s from %s\n"
+msgstr "Зареждане на символа „%s“ от „%s“\n"
+
+#: src/load.c:256
+#, c-format
+msgid "The 'load' operation is not supported on this platform."
+msgstr "Операцията за зареждане („load“) не се поддържа на тази платформа"
+
+#: src/main.c:335
+msgid "Options:\n"
+msgstr "Опции:\n"
+
+#: src/main.c:336
+msgid "  -b, -m                      Ignored for compatibility.\n"
+msgstr "  -b, -m                      прескача се, за съвместимост\n"
+
+#: src/main.c:338
+msgid "  -B, --always-make           Unconditionally make all targets.\n"
+msgstr "  -B, --always-make           безусловно изграждане на всички цели\n"
+
+#: src/main.c:340
+msgid ""
+"  -C DIRECTORY, --directory=DIRECTORY\n"
+"                              Change to DIRECTORY before doing anything.\n"
+msgstr ""
+"  -C ДИРЕКТОРИЯ, --directory=ДИРЕКТОРИЯ\n"
+"                              преминаване към тази ДИРЕКТОРИЯ, преди да се\n"
+"                              прави каквото и да е\n"
+
+#: src/main.c:343
+msgid "  -d                          Print lots of debugging information.\n"
+msgstr "  -d                          информация за изчистване на грешки\n"
+
+#: src/main.c:345
+msgid ""
+"  --debug[=FLAGS]             Print various types of debugging information.\n"
+msgstr "  --debug[=ФЛАГОВЕ]           вид информация за изчистване на грешки\n"
+
+#: src/main.c:347
+msgid ""
+"  -e, --environment-overrides\n"
+"                              Environment variables override makefiles.\n"
+msgstr ""
+"  -e, --environment-overrides\n"
+"                              променливите от средата да са с превес над\n"
+"                              указаното във файловете управляващи "
+"изграждането\n"
+"                              (makefile)\n"
+
+#: src/main.c:350
+msgid ""
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr ""
+"  --eval=НИЗ, --eval=НИЗ      изчисляване на НИЗа като израз във файловете\n"
+"                              управляващи изграждането (makefile)\n"
+
+#: src/main.c:352
+msgid ""
+"  -f FILE, --file=FILE, --makefile=FILE\n"
+"                              Read FILE as a makefile.\n"
+msgstr ""
+"  -f ФАЙЛ, --file=ФАЙЛ, --makefile=ФАЙЛ\n"
+"                              ползване на този ФАЙЛ да управлява "
+"изграждането\n"
+"                              (makefile)\n"
+
+#: src/main.c:355
+msgid "  -h, --help                  Print this message and exit.\n"
+msgstr "  -h, --help                  извеждане на тази помощ и изход\n"
+
+#: src/main.c:357
+msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
+msgstr "  -i, --ignore-errors         незачитане на грешките от рецептите\n"
+
+#: src/main.c:359
+msgid ""
+"  -I DIRECTORY, --include-dir=DIRECTORY\n"
+"                              Search DIRECTORY for included makefiles.\n"
+msgstr ""
+"  -I ДИРЕКТОРИЯ, --include-dir=ДИРЕКТОРИЯ\n"
+"                              търсене на вмъкнатите файлове в ДИРЕКТОРИЯта\n"
+
+#: src/main.c:362
+msgid ""
+"  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
+"arg.\n"
+msgstr ""
+"  -j [БРОЙ], --jobs[=БРОЙ]    ограничаване на задачите до максимум този "
+"БРОЙ,\n"
+"                              без аргумент — без ограничения\n"
+
+#: src/main.c:364
+msgid ""
+"  -k, --keep-going            Keep going when some targets can't be made.\n"
+msgstr ""
+"  -k, --keep-going            продължаване дори и някои от целите не могат\n"
+"                              да се изградят\n"
+
+#: src/main.c:366
+msgid ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              Don't start multiple jobs unless load is below "
+"N.\n"
+msgstr ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              множество задачи се стартират, само ако\n"
+"                              натоварването е ≤N\n"
+
+#: src/main.c:369
+msgid ""
+"  -L, --check-symlink-times   Use the latest mtime between symlinks and "
+"target.\n"
+msgstr ""
+"  -L, --check-symlink-times   използване на минималното време на промяна\n"
+"                              измежду символна връзка и целта ѝ\n"
+
+#: src/main.c:371
+msgid ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              Don't actually run any recipe; just print "
+"them.\n"
+msgstr ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              извеждане на целите без изпълнение\n"
+
+#: src/main.c:374
+msgid ""
+"  -o FILE, --old-file=FILE, --assume-old=FILE\n"
+"                              Consider FILE to be very old and don't remake "
+"it.\n"
+msgstr ""
+"  -o ФАЙЛ, --old-file=ФАЙЛ, --assume-old=ФАЙЛ\n"
+"                              без преизграждане на ФАЙЛа, който да се\n"
+"                              счита за много стар\n"
+
+#: src/main.c:377
+msgid ""
+"  -O[TYPE], --output-sync[=TYPE]\n"
+"                              Synchronize output of parallel jobs by TYPE.\n"
+msgstr ""
+"  -O[ВИД], --output-sync[=ВИД]\n"
+"                              ВИД синхронизация на изхода от паралелните "
+"задачи\n"
+
+#: src/main.c:380
+msgid "  -p, --print-data-base       Print make's internal database.\n"
+msgstr ""
+"  -p, --print-data-base       извеждане на вътрешната база от данни на "
+"„make“\n"
+
+#: src/main.c:382
+msgid ""
+"  -q, --question              Run no recipe; exit status says if up to "
+"date.\n"
+msgstr ""
+"  -q, --question              без изпълнение на цели, само изходният код\n"
+"                              да указва дали те са актуални\n"
+
+#: src/main.c:384
+msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
+msgstr "  -r, --no-builtin-rules      изключване на вградените правила\n"
+
+#: src/main.c:386
+msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
+msgstr ""
+"  -R, --no-builtin-variables  изключване на вграденото задаване на "
+"променливи\n"
+
+#: src/main.c:388
+msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
+msgstr "  -s, --silent, --quiet       без извеждане на рецептите\n"
+
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 извеждане на рецептите (изключване на „--"
+"silent“)\n"
+
+#: src/main.c:392
+msgid ""
+"  -S, --no-keep-going, --stop\n"
+"                              Turns off -k.\n"
+msgstr ""
+"  -S, --no-keep-going, --stop\n"
+"                              Изключване на „-k“\n"
+
+#: src/main.c:395
+msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
+msgstr ""
+"  -t, --touch                 обновяване на информацията чрез „touch“ "
+"вместо\n"
+"                              ново изграждане\n"
+
+#: src/main.c:397
+msgid "  --trace                     Print tracing information.\n"
+msgstr ""
+"  --trace                     извеждане на информация за изчистване на "
+"грешки\n"
+
+#: src/main.c:399
+msgid ""
+"  -v, --version               Print the version number of make and exit.\n"
+msgstr "  -v, --version               извеждане на версията и изход\n"
+
+#: src/main.c:401
+msgid "  -w, --print-directory       Print the current directory.\n"
+msgstr "  -w, --print-directory       извеждане на текущата директория\n"
+
+#: src/main.c:403
+msgid ""
+"  --no-print-directory        Turn off -w, even if it was turned on "
+"implicitly.\n"
+msgstr ""
+"  --no-print-directory        изключване на „-w“, дори ако вградената\n"
+"                              функционалност я е включила\n"
+
+#: src/main.c:405
+msgid ""
+"  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
+"                              Consider FILE to be infinitely new.\n"
+msgstr ""
+"  -W ФАЙЛ, --what-if=ФАЙЛ, --new-file=ФАЙЛ, --assume-new=ФАЙЛ\n"
+"                              считане на ФАЙЛа за абсолютно нов\n"
+
+#: src/main.c:408
+msgid ""
+"  --warn-undefined-variables  Warn when an undefined variable is "
+"referenced.\n"
+msgstr ""
+"  --warn-undefined-variables  предупреждаване при използването\n"
+"                              на незададена променлива\n"
+
+#: src/main.c:671
+#, c-format
+msgid "empty string invalid as file name"
+msgstr "задаването на празен низ за име на файл е грешка"
+
+#: src/main.c:754
+#, c-format
+msgid "unknown debug level specification '%s'"
+msgstr "неправилно ниво за изчистване на грешки „%s“"
+
+#: src/main.c:794
+#, c-format
+msgid "unknown output-sync type '%s'"
+msgstr "непознат вид синхронизация „%s“ към опцията „--output-sync“"
+
+#: src/main.c:849
+#, c-format
+msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
+msgstr "%s: прихванато прекъсване/изключение (код = 0x%lx, адрес = 0x%p)\n"
+
+#: src/main.c:856
+#, c-format
+msgid ""
+"\n"
+"Unhandled exception filter called from program %s\n"
+"ExceptionCode = %lx\n"
+"ExceptionFlags = %lx\n"
+"ExceptionAddress = 0x%p\n"
+msgstr ""
+"\n"
+"Филтърът за необработени изключения е извикан от програмата „%s“\n"
+"Код на изключение = %lx\n"
+"Флагове на изключение = %lx\n"
+"Адрес на изключение = 0x%p\n"
+
+#: src/main.c:864
+#, c-format
+msgid "Access violation: write operation at address 0x%p\n"
+msgstr "Нарушение на достъпа: операция за запис на адрес 0x%p\n"
+
+#: src/main.c:865
+#, c-format
+msgid "Access violation: read operation at address 0x%p\n"
+msgstr "Нарушение на достъпа: операция за четене на адрес 0x%p\n"
+
+#: src/main.c:941 src/main.c:956
+#, c-format
+msgid "find_and_set_shell() setting default_shell = %s\n"
+msgstr "„find_and_set_shell()“ задава стандартна обвивка = %s\n"
+
+#: src/main.c:1009
+#, c-format
+msgid "find_and_set_shell() path search set default_shell = %s\n"
+msgstr ""
+"„find_and_set_shell()“ — търсенето в пътя задава стандартна обвивка = %s\n"
+
+#: src/main.c:1609
+#, c-format
+msgid ""
+"warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: сървърът за задачи не е наличен, ползва се „-j1“.  Добавете "
+"„+“ към родителското правило на „make“."
+
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: в подизграждане е зададено „-j%d“.  Режимът на сървър за "
+"задачи се изключва."
+
+#: src/main.c:1781
+#, c-format
+msgid "Makefile from standard input specified twice."
+msgstr ""
+"Файлът управляващ изграждането е зададен двукратно на стандартния вход."
+
+#: src/main.c:1819 src/vmsjobs.c:1248
+msgid "fopen (temporary file)"
+msgstr "отваряне („fopen“ на временен файл)"
+
+#: src/main.c:1825
+msgid "fwrite (temporary file)"
+msgstr "запис („fwrite“ на временен файл)"
+
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: в подизграждане е зададено „-j%d“.  Режимът на сървър за "
+"задачи се изключва."
+
+#: src/main.c:2068
+#, c-format
+msgid "Parallel jobs (-j) are not supported on this platform."
+msgstr "Тази система не поддържа паралелни задачи („-j“)."
+
+#: src/main.c:2069
+#, c-format
+msgid "Resetting to single job (-j1) mode."
+msgstr "Преминаване към еднозадачен режим (-j1)."
+
+#: src/main.c:2109
+#, c-format
+msgid "Symbolic links not supported: disabling -L."
+msgstr "Не се поддържат символни връзки: „-L“ се изключва."
+
+#: src/main.c:2190
+#, c-format
+msgid "Updating makefiles....\n"
+msgstr "Обновяване на управляващите изграждането файлове (makefile)…\n"
+
+#: src/main.c:2226
+#, c-format
+msgid "Makefile '%s' might loop; not remaking it.\n"
+msgstr ""
+"Управляващият изграждането файл „%s“ може да зацикли, затова не се "
+"пресъздава.\n"
+
+#: src/main.c:2303
+#, c-format
+msgid "Failed to remake makefile '%s'."
+msgstr "Неуспешно пресъздаване на управляващия изграждането файл „%s“"
+
+#: src/main.c:2323
+#, c-format
+msgid "Included makefile '%s' was not found."
+msgstr "Вмъкнатият управляващ изграждането файл „%s“ липсва"
+
+#: src/main.c:2328
+#, c-format
+msgid "Makefile '%s' was not found"
+msgstr "Управляващият изграждането файл „%s“ липсва"
+
+#: src/main.c:2394
+#, c-format
+msgid "Couldn't change back to original directory."
+msgstr "Невъзможно връщане към първоначалната директория"
+
+#: src/main.c:2402
+#, c-format
+msgid "Re-executing[%u]:"
+msgstr "Изпълнение наново[%u]:"
+
+#: src/main.c:2522
+msgid "unlink (temporary file): "
+msgstr "изтриване („unlink“ на временен файл): "
+
+#: src/main.c:2555
+#, c-format
+msgid ".DEFAULT_GOAL contains more than one target"
+msgstr "Стандартната цел „.DEFAULT_GOAL“ съдържа повече от една цел"
+
+#: src/main.c:2579
+#, c-format
+msgid "No targets"
+msgstr "Няма цели"
+
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Не е зададена цел, а и липсва управляващ изграждането файл"
+
+#: src/main.c:2586
+#, c-format
+msgid "Updating goal targets....\n"
+msgstr "Обновяване на целите…\n"
+
+#: src/main.c:2610
+#, c-format
+msgid "warning:  Clock skew detected.  Your build may be incomplete."
+msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: проблем със системния часовник — изграждането може да е "
+"непълно."
+
+#: src/main.c:2804
+#, c-format
+msgid "Usage: %s [options] [target] ...\n"
+msgstr "Употреба: %s [ОПЦИЯ]… [ФАЙЛ]…\n"
+
+#: src/main.c:2810
+#, c-format
+msgid ""
+"\n"
+"This program built for %s\n"
+msgstr ""
+"\n"
+"Тази програма е изградена за %s\n"
+
+#: src/main.c:2812
+#, c-format
+msgid ""
+"\n"
+"This program built for %s (%s)\n"
+msgstr ""
+"\n"
+"Тази програма е изградена за %s (%s)\n"
+
+#: src/main.c:2815
+#, c-format
+msgid "Report bugs to <bug-make@gnu.org>\n"
+msgstr ""
+"Съобщавайте за програмни грешки на <bug-make@gnu.org>.\n"
+"За грешки в българския превод на <dict@fsa-bg.org>.\n"
+
+#: src/main.c:2901
+#, c-format
+msgid "the '%s%s' option requires a non-empty string argument"
+msgstr "опцията „%s%s“ изисква непразен аргумент-низ"
+
+#: src/main.c:2965
+#, c-format
+msgid "the '-%c' option requires a positive integer argument"
+msgstr "опцията „%c“ изисква положителен, целочислен аргумент"
+
+#: src/main.c:3363
+#, c-format
+msgid "%sBuilt for %s\n"
+msgstr "%sИзградена за %s\n"
+
+#: src/main.c:3365
+#, c-format
+msgid "%sBuilt for %s (%s)\n"
+msgstr "%sИзградена за %s (%s)\n"
+
+#: src/main.c:3376
+#, c-format
+msgid ""
+"%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+"html>\n"
+"%sThis is free software: you are free to change and redistribute it.\n"
+"%sThere is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"%sЛиценз — Общ публичен лиценз на GNU (GNU GPL), както е публикуван от "
+"Фондацията\n"
+"за свободен софтуер — версия 3 на лиценза или (по ваше решение) по-късна "
+"версия.\n"
+"<http://gnu.org/licenses/gpl.html>\n"
+"%sТази програма е свободен софтуер. Можете да я разпространявате и/или "
+"променяте.\n"
+"%sТя се разпространява БЕЗ НИКАКВИ ГАРАНЦИИ доколкото е позволено от "
+"закона.\n"
+
+#: src/main.c:3397
+#, c-format
+msgid ""
+"\n"
+"# Make data base, printed on %s"
+msgstr ""
+"\n"
+"# Информация за „make“, отпечатана на %s"
+
+#: src/main.c:3407
+#, c-format
+msgid ""
+"\n"
+"# Finished Make data base on %s\n"
+msgstr ""
+"\n"
+"# Край на информацията за „make“, отпечатана на %s\n"
+
+#: src/misc.c:643
+#, c-format
+msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
+msgstr "%s: потр. %lu (реално %lu), група %lu (реално %lu)\n"
+
+#: src/misc.c:664
+msgid "Initialized access"
+msgstr "Инициализиран достъп"
+
+#: src/misc.c:743
+msgid "User access"
+msgstr "Потребителски достъп"
+
+#: src/misc.c:791
+msgid "Make access"
+msgstr "Задаване на достъп"
+
+#: src/misc.c:825
+msgid "Child access"
+msgstr "Дъщерен процес"
+
+#: src/output.c:97
+#, c-format
+msgid "%s: Entering an unknown directory\n"
+msgstr "%s: влизане в непозната директория\n"
+
+#: src/output.c:99
+#, c-format
+msgid "%s: Leaving an unknown directory\n"
+msgstr "%s: излизане от непозната директория\n"
+
+#: src/output.c:102
+#, c-format
+msgid "%s: Entering directory '%s'\n"
+msgstr "%s: влизане в директория „%s“\n"
+
+#: src/output.c:104
+#, c-format
+msgid "%s: Leaving directory '%s'\n"
+msgstr "%s: излизане от директория „%s“\n"
+
+#: src/output.c:108
+#, c-format
+msgid "%s[%u]: Entering an unknown directory\n"
+msgstr "%s[%u]: влизане в непозната директория\n"
+
+#: src/output.c:110
+#, c-format
+msgid "%s[%u]: Leaving an unknown directory\n"
+msgstr "%s[%u]: излизане от непозната директория\n"
+
+#: src/output.c:113
+#, c-format
+msgid "%s[%u]: Entering directory '%s'\n"
+msgstr "%s[%u]: влизане в директория „%s“\n"
+
+#: src/output.c:115
+#, c-format
+msgid "%s[%u]: Leaving directory '%s'\n"
+msgstr "%s[%u]: излизане от директория „%s“\n"
+
+#: src/output.c:442 src/output.c:444
+#, c-format
+msgid "write error: stdout"
+msgstr "грешка при запис: стандартна грешка"
+
+#: src/output.c:624
+msgid ".  Stop.\n"
+msgstr ".  Край.\n"
+
+#: src/output.c:658
+#, c-format
+msgid "%s%s: %s"
+msgstr "%s%s: %s"
+
+#: src/output.c:667
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"опцията „-O[ВИД]“/„--output-sync[=ВИД]“ не е зададена за това изграждане"
+
+#: src/posixos.c:90
+msgid "creating jobs pipe"
+msgstr "създаване на програмен канал със задачи"
+
+#: src/posixos.c:98 src/posixos.c:251
+msgid "duping jobs pipe"
+msgstr "дублиране на програмен канал със задачи"
+
+#: src/posixos.c:104
+msgid "init jobserver pipe"
+msgstr "инициализация на канал за сървър за задачи"
+
+#: src/posixos.c:119
+#, c-format
+msgid "internal error: invalid --jobserver-auth string '%s'"
+msgstr "ВЪТРЕШНА ГРЕШКА: неправилен низ към „--jobserver-auth“: „%s“"
+
+#: src/posixos.c:122
+#, c-format
+msgid "Jobserver client (fds %d,%d)\n"
+msgstr "Клиент за сървър за задачи (fds %d,%d)\n"
+
+#: src/posixos.c:138
+msgid "jobserver pipeline"
+msgstr "програмен канал на сървър за задачи"
+
+#: src/posixos.c:186
+msgid "write jobserver"
+msgstr "запис на сървър за задачи"
+
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "спиране на сървъра за задачи"
+
+#: src/posixos.c:303
+msgid "pselect jobs pipe"
+msgstr "грешка в „pselect“ в канала за задачи"
+
+#: src/posixos.c:319 src/posixos.c:433
+msgid "read jobs pipe"
+msgstr "грешка при четене в канала за задачи"
+
+#: src/read.c:181
+#, c-format
+msgid "Reading makefiles...\n"
+msgstr "Изчитане на файловете управляващи изграждането…\n"
+
+#: src/read.c:336
+#, c-format
+msgid "Reading makefile '%s'"
+msgstr "Изчитане на файла управляващ изграждането „%s“"
+
+#: src/read.c:338
+#, c-format
+msgid " (no default goal)"
+msgstr " (няма стандартна цел)"
+
+#: src/read.c:340
+#, c-format
+msgid " (search path)"
+msgstr " (търсене в път)"
+
+#: src/read.c:342
+#, c-format
+msgid " (don't care)"
+msgstr " (без значение)"
+
+#: src/read.c:344
+#, c-format
+msgid " (no ~ expansion)"
+msgstr " (без заместване на „~“)"
+
+#: src/read.c:655
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile '%s'\n"
+msgstr ""
+"Прескачанe на знака за подредба на байтовете за UTF-8 (BOM) във файла „%s“\n"
+
+#: src/read.c:658
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile buffer\n"
+msgstr ""
+"Прескачанe на знака за подредба на байтовете за UTF-8 (BOM) в буфера на "
+"файла управляващ изграждането\n"
+
+#: src/read.c:787
+#, c-format
+msgid "invalid syntax in conditional"
+msgstr "неправилен синтаксис на условен израз"
+
+#: src/read.c:960
+#, c-format
+msgid "%s: failed to load"
+msgstr "%s: не може да се зареди"
+
+#: src/read.c:986
+#, c-format
+msgid "recipe commences before first target"
+msgstr "рецепта почва преди първата цел"
+
+#: src/read.c:1035
+#, c-format
+msgid "missing rule before recipe"
+msgstr "липсващо правило преди рецепта"
+
+#: src/read.c:1136
+#, c-format
+msgid "missing separator (did you mean TAB instead of 8 spaces?)"
+msgstr ""
+"липсва разделител (дали не трябва да замените 8 интервала с табулатор?)"
+
+#: src/read.c:1138
+#, c-format
+msgid "missing separator"
+msgstr "липсва разделител"
+
+#: src/read.c:1283
+#, c-format
+msgid "missing target pattern"
+msgstr "липсва целеви шаблон"
+
+#: src/read.c:1285
+#, c-format
+msgid "multiple target patterns"
+msgstr "множество целеви шаблони"
+
+#: src/read.c:1289
+#, c-format
+msgid "target pattern contains no '%%'"
+msgstr "целевият шаблон не съдържа „%%“"
+
+#: src/read.c:1404
+#, c-format
+msgid "missing 'endif'"
+msgstr "липсващ „endif“"
+
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
+msgid "empty variable name"
+msgstr "празно име на променлива"
+
+#: src/read.c:1478
+#, c-format
+msgid "extraneous text after 'define' directive"
+msgstr "излишен текст след директива „define“"
+
+#: src/read.c:1503
+#, c-format
+msgid "missing 'endef', unterminated 'define'"
+msgstr "„endef“ липсва — някоя директива „define“ не е завършена"
+
+#: src/read.c:1531
+#, c-format
+msgid "extraneous text after 'endef' directive"
+msgstr "излишен текст след директива „endef“"
+
+#: src/read.c:1603
+#, c-format
+msgid "extraneous text after '%s' directive"
+msgstr "излишен текст след директива „%s“"
+
+#: src/read.c:1604
+#, c-format
+msgid "extraneous '%s'"
+msgstr "излишен „%s“"
+
+#: src/read.c:1632
+#, c-format
+msgid "only one 'else' per conditional"
+msgstr "може да има максимално една директива „else“ за условен израз"
+
+#: src/read.c:1908
+#, c-format
+msgid "Malformed target-specific variable definition"
+msgstr "Неправилна дефиниция на променлива, зависеща от целта"
+
+#: src/read.c:1968
+#, c-format
+msgid "prerequisites cannot be defined in recipes"
+msgstr "изискванията не могат да се дефинират в рецептите"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "целите в група трябва да предоставят рецепта"
+
+#: src/read.c:2029
+#, c-format
+msgid "mixed implicit and static pattern rules"
+msgstr "вградените и правилата със статични шаблони са смесени"
+
+#: src/read.c:2052
+#, c-format
+msgid "mixed implicit and normal rules"
+msgstr "вградените и изричните правила са смесени"
+
+#: src/read.c:2107
+#, c-format
+msgid "target '%s' doesn't match the target pattern"
+msgstr "целта „%s“ не съвпада с целта на шаблона"
+
+#: src/read.c:2122 src/read.c:2168
+#, c-format
+msgid "target file '%s' has both : and :: entries"
+msgstr "целевият файл „%s“ съдържа записи и с „:“, и с „::“"
+
+#: src/read.c:2128
+#, c-format
+msgid "target '%s' given more than once in the same rule"
+msgstr "целта „%s“ е дадена повече от веднъж в едно правило"
+
+#: src/read.c:2138
+#, c-format
+msgid "warning: overriding recipe for target '%s'"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: заместване на рецептата за целта „%s“"
+
+#: src/read.c:2141
+#, c-format
+msgid "warning: ignoring old recipe for target '%s'"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: старата рецепта за „%s“ се прескача"
+
+#: src/read.c:2254
+#, c-format
+msgid "*** mixed implicit and normal rules: deprecated syntax"
+msgstr "••• смесване на вградени и обикновени правила: остарял синтаксис"
+
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: заместване на групата на целта „%s“"
+
+#: src/read.c:2636
+#, c-format
+msgid "warning: NUL character seen; rest of line ignored"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: нулев знак NUL, останалата част на реда се прескача"
+
+#: src/remake.c:226
+#, c-format
+msgid "Nothing to be done for '%s'."
+msgstr "Няма нищо за правене за „%s“."
+
+#: src/remake.c:227
+#, c-format
+msgid "'%s' is up to date."
+msgstr "„%s“ няма нужда да се обновява."
+
+#: src/remake.c:323
+#, c-format
+msgid "Pruning file '%s'.\n"
+msgstr "Окастряне на файл „%s“\n"
+
+#: src/remake.c:389
+#, c-format
+msgid "%sNo rule to make target '%s', needed by '%s'%s"
+msgstr ""
+"%sНяма правило за изграждане на целта „%s“, която е необходима на „%s“%s"
+
+#: src/remake.c:399
+#, c-format
+msgid "%sNo rule to make target '%s'%s"
+msgstr "%sНяма правило за изграждане на целта „%s“%s"
+
+#: src/remake.c:425
+#, c-format
+msgid "Considering target file '%s'.\n"
+msgstr "Разглеждане на целевия файл „%s“\n"
+
+#: src/remake.c:432
+#, c-format
+msgid "Recently tried and failed to update file '%s'.\n"
+msgstr "Скорошен неуспешен опит за обновяване на файла „%s“\n"
+
+#: src/remake.c:444
+#, c-format
+msgid "File '%s' was considered already.\n"
+msgstr "Файлът „%s“ вече е разгледан.\n"
+
+#: src/remake.c:454
+#, c-format
+msgid "Still updating file '%s'.\n"
+msgstr "Все още се обновява файл „%s“.\n"
+
+#: src/remake.c:457
+#, c-format
+msgid "Finished updating file '%s'.\n"
+msgstr "Завършване на обновяването на файл „%s“.\n"
+
+#: src/remake.c:486
+#, c-format
+msgid "File '%s' does not exist.\n"
+msgstr "Файлът „%s“ не съществува.\n"
+
+#: src/remake.c:494
+#, c-format
+msgid ""
+"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
+msgstr ""
+" ••• ПРЕДУПРЕЖДЕНИЕ: файлът „.LOW_RESOLUTION_TIME“, указващ ниска "
+"разделителна способност на времето „%s“, е с времево клеймо с висока "
+"разделителна способност"
+
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
+msgid "Found an implicit rule for '%s'.\n"
+msgstr "Открито е вградено правило за „%s“.\n"
+
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
+msgid "No implicit rule found for '%s'.\n"
+msgstr "Не е открито вградено правило за „%s“.\n"
+
+#: src/remake.c:515
+#, c-format
+msgid "Using default recipe for '%s'.\n"
+msgstr "Използване на стандартната рецепта за „%s“.\n"
+
+#: src/remake.c:549 src/remake.c:1088
+#, c-format
+msgid "Circular %s <- %s dependency dropped."
+msgstr "Цикличната зависимост „%s“ ← „%s“ се прескача."
+
+#: src/remake.c:674
+#, c-format
+msgid "Finished prerequisites of target file '%s'.\n"
+msgstr "Изискванията за целевия файл „%s“ са завършени.\n"
+
+#: src/remake.c:680
+#, c-format
+msgid "The prerequisites of '%s' are being made.\n"
+msgstr "Изискванията на „%s“ се изграждат.\n"
+
+#: src/remake.c:694
+#, c-format
+msgid "Giving up on target file '%s'.\n"
+msgstr "Отказ за изграждане на целевия файл „%s“.\n"
+
+#: src/remake.c:699
+#, c-format
+msgid "Target '%s' not remade because of errors."
+msgstr "Целта „%s“ не е преизградена поради грешки."
+
+#: src/remake.c:751
+#, c-format
+msgid "Prerequisite '%s' is order-only for target '%s'.\n"
+msgstr "Изискването „%s“ е само за последователност за целта „%s“.\n"
+
+#: src/remake.c:756
+#, c-format
+msgid "Prerequisite '%s' of target '%s' does not exist.\n"
+msgstr "Изискването „%s“ на целта „%s“ не съществува.\n"
+
+#: src/remake.c:761
+#, c-format
+msgid "Prerequisite '%s' is newer than target '%s'.\n"
+msgstr "Изискването „%s“ е по-ново от целта „%s“.\n"
+
+#: src/remake.c:764
+#, c-format
+msgid "Prerequisite '%s' is older than target '%s'.\n"
+msgstr "Изискването „%s“ е по-старо от целта „%s“.\n"
+
+#: src/remake.c:782
+#, c-format
+msgid "Target '%s' is double-colon and has no prerequisites.\n"
+msgstr "Целта е „%s“ е „::“ и няма изисквания.\n"
+
+#: src/remake.c:789
+#, c-format
+msgid "No recipe for '%s' and no prerequisites actually changed.\n"
+msgstr "Няма рецепта за „%s“ и никое от изискванията не е променено.\n"
+
+#: src/remake.c:794
+#, c-format
+msgid "Making '%s' due to always-make flag.\n"
+msgstr "„%s“ се изгражда наново поради флаг за изрично преизграждане.\n"
+
+#: src/remake.c:802
+#, c-format
+msgid "No need to remake target '%s'"
+msgstr "Няма нужда за преизграждане на целта „%s“"
+
+#: src/remake.c:804
+#, c-format
+msgid "; using VPATH name '%s'"
+msgstr "; използва се име от „VPATH“ „%s“"
+
+#: src/remake.c:824
+#, c-format
+msgid "Must remake target '%s'.\n"
+msgstr "Целта „%s“ трябва да се преизгради.\n"
+
+#: src/remake.c:830
+#, c-format
+msgid "  Ignoring VPATH name '%s'.\n"
+msgstr "  Прескачане на името от „VPATH“ „%s“.\n"
+
+#: src/remake.c:839
+#, c-format
+msgid "Recipe of '%s' is being run.\n"
+msgstr "Рецептата за „%s“ в момента се изпълнява.\n"
+
+#: src/remake.c:846
+#, c-format
+msgid "Failed to remake target file '%s'.\n"
+msgstr "Неуспешно преизграждане на целевия файл „%s“\n"
+
+#: src/remake.c:849
+#, c-format
+msgid "Successfully remade target file '%s'.\n"
+msgstr "Успешно преизграждане на целевия файл „%s“\n"
+
+#: src/remake.c:852
+#, c-format
+msgid "Target file '%s' needs to be remade under -q.\n"
+msgstr "Целевият файл „%s“ трябва да се преизгради при „-q“.\n"
+
+#: src/remake.c:1047
+#, c-format
+msgid "Using default commands for '%s'.\n"
+msgstr "Използват се стандартни команди за „%s“.\n"
+
+#: src/remake.c:1422
+#, c-format
+msgid "Warning: File '%s' has modification time %s s in the future"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: файлът „%s“ е с време на промяна %s сек. в бъдещето"
+
+#: src/remake.c:1662
+#, c-format
+msgid ".LIBPATTERNS element '%s' is not a pattern"
+msgstr "Елементът „%s“ за „.LIBPATTERNS“ не е шаблон"
+
+#: src/remote-cstms.c:122
+#, c-format
+msgid "Customs won't export: %s\n"
+msgstr "Модулът няма да се изнесе: %s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
+msgid ""
+"\n"
+"# Implicit Rules"
+msgstr ""
+"\n"
+"# Вградени правила"
+
+#: src/rule.c:545
+msgid ""
+"\n"
+"# No implicit rules."
+msgstr ""
+"\n"
+"# Няма вградени правила."
+
+#: src/rule.c:548
+#, c-format
+msgid ""
+"\n"
+"# %u implicit rules, %u (%.1f%%) terminal."
+msgstr ""
+"\n"
+"# %u вградени правила, %u (%.1f%%) крайни."
+
+#: src/rule.c:557
+#, c-format
+msgid "BUG: num_pattern_rules is wrong!  %u != %u"
+msgstr ""
+"ПРОГРАМНА ГРЕШКА: „num_pattern_rules“ върна неправилен резултат!  %u != %u"
+
+#: src/signame.c:84
+msgid "unknown signal"
+msgstr "непознат сигнал"
+
+#: src/signame.c:92
+msgid "Hangup"
+msgstr "Прекъсване на връзката"
+
+#: src/signame.c:95
+msgid "Interrupt"
+msgstr "Прекъсване"
+
+#: src/signame.c:98
+msgid "Quit"
+msgstr "Спиране"
+
+#: src/signame.c:101
+msgid "Illegal Instruction"
+msgstr "Неправилна инструкция"
+
+#: src/signame.c:104
+msgid "Trace/breakpoint trap"
+msgstr "Прекъсване за трасиране"
+
+#: src/signame.c:109
+msgid "Aborted"
+msgstr "Преустановяване"
+
+#: src/signame.c:112
+msgid "IOT trap"
+msgstr "Преустановяване (IOT)"
+
+#: src/signame.c:115
+msgid "EMT trap"
+msgstr "Емулирана инструкция"
+
+#: src/signame.c:118
+msgid "Floating point exception"
+msgstr "Изключение от плаваща запетая"
+
+#: src/signame.c:121
+msgid "Killed"
+msgstr "Убит"
+
+#: src/signame.c:124
+msgid "Bus error"
+msgstr "Грешка в шината"
+
+#: src/signame.c:127
+msgid "Segmentation fault"
+msgstr "Грешка в разделянето"
+
+#: src/signame.c:130
+msgid "Bad system call"
+msgstr "Грешно системно извикване"
+
+#: src/signame.c:133
+msgid "Broken pipe"
+msgstr "Прекъснат програмен канал"
+
+#: src/signame.c:136
+msgid "Alarm clock"
+msgstr "Аларма"
+
+#: src/signame.c:139
+msgid "Terminated"
+msgstr "Прекратен"
+
+#: src/signame.c:142
+msgid "User defined signal 1"
+msgstr "Потребителски сигнал 1"
+
+#: src/signame.c:145
+msgid "User defined signal 2"
+msgstr "Потребителски сигнал 2"
+
+#: src/signame.c:150 src/signame.c:153
+msgid "Child exited"
+msgstr "Преустановен дъщерен процес"
+
+#: src/signame.c:156
+msgid "Power failure"
+msgstr "Проблем в захранването"
+
+#: src/signame.c:159
+msgid "Stopped"
+msgstr "Спрян"
+
+#: src/signame.c:162
+msgid "Stopped (tty input)"
+msgstr "Спиране (вход от tty)"
+
+#: src/signame.c:165
+msgid "Stopped (tty output)"
+msgstr "Спиране (изход към tty)"
+
+#: src/signame.c:168
+msgid "Stopped (signal)"
+msgstr "Спрян (сигнал)"
+
+#: src/signame.c:171
+msgid "CPU time limit exceeded"
+msgstr "Надвишаване на процесорното време"
+
+#: src/signame.c:174
+msgid "File size limit exceeded"
+msgstr "Надвишаване на размера на файл"
+
+#: src/signame.c:177
+msgid "Virtual timer expired"
+msgstr "Изтекъл виртуален таймер"
+
+#: src/signame.c:180
+msgid "Profiling timer expired"
+msgstr "Изтекъл профилиращ таймер"
+
+#: src/signame.c:186
+msgid "Window changed"
+msgstr "Преоразмерен прозорец"
+
+#: src/signame.c:189
+msgid "Continued"
+msgstr "Продължен"
+
+#: src/signame.c:192
+msgid "Urgent I/O condition"
+msgstr "Спешно вх./изх. състояние"
+
+#: src/signame.c:199 src/signame.c:208
+msgid "I/O possible"
+msgstr "Възможен вх./изх."
+
+#: src/signame.c:202
+msgid "SIGWIND"
+msgstr "Преоразмерен прозорец"
+
+#: src/signame.c:205
+msgid "SIGPHONE"
+msgstr "Промяна на състоянието на линията"
+
+#: src/signame.c:211
+msgid "Resource lost"
+msgstr "Загубен ресурс"
+
+#: src/signame.c:214
+msgid "Danger signal"
+msgstr "Сигнал за опасност"
+
+#: src/signame.c:217
+msgid "Information request"
+msgstr "Заявка за информация"
+
+#: src/signame.c:220
+msgid "Floating point co-processor not available"
+msgstr "Липсва копроцесор за числа с плаваща запетая"
+
+#: src/strcache.c:274
+#, c-format
+msgid ""
+"\n"
+"%s No strcache buffers\n"
+msgstr ""
+"\n"
+"%s Няма буфери за „strcache“\n"
+
+#: src/strcache.c:304
+#, c-format
+msgid ""
+"\n"
+"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
+"B\n"
+msgstr ""
+"\n"
+"%s буфери за кеша за низове: %lu (%lu) / низове = %lu / съхранение = %lu B / "
+"средно = %lu B\n"
+
+#: src/strcache.c:308
+#, c-format
+msgid ""
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr ""
+"%s текущ буфер: размер = %hu B / ползвано = %hu B / брой = %hu / средно = %u "
+"B\n"
+
+#: src/strcache.c:319
+#, c-format
+msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
+msgstr "%s други използвани: общо = %lu B / брой = %lu / средно = %lu B\n"
+
+#: src/strcache.c:322
+#, c-format
+msgid ""
+"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
+msgstr ""
+"%s други свободни: общо = %lu B / макс. = %lu B / мин. = %lu B / средно = "
+"%hu B\n"
+
+#: src/strcache.c:326
+#, c-format
+msgid ""
+"\n"
+"%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
+msgstr ""
+"\n"
+"%s производителност на кеша за низове: търсения = %lu / намирания = %lu%%\n"
+
+#: src/strcache.c:328
+msgid ""
+"# hash-table stats:\n"
+"# "
+msgstr ""
+"# статистика на речника:\n"
+"# "
+
+#: src/variable.c:1653
+msgid "automatic"
+msgstr "автоматично"
+
+#: src/variable.c:1656
+msgid "default"
+msgstr "стандартно"
+
+#: src/variable.c:1659
+msgid "environment"
+msgstr "среда"
+
+#: src/variable.c:1662
+msgid "makefile"
+msgstr "файл управляващ изграждането"
+
+#: src/variable.c:1665
+msgid "environment under -e"
+msgstr "обкръжението е твърде голямо за „exec“"
+
+#: src/variable.c:1668
+msgid "command line"
+msgstr "команден ред"
+
+#: src/variable.c:1671
+msgid "'override' directive"
+msgstr "директива „override“"
+
+#: src/variable.c:1682
+#, c-format
+msgid " (from '%s', line %lu)"
+msgstr " (от „%s“, ред %lu)"
+
+#: src/variable.c:1745
+msgid "# variable set hash-table stats:\n"
+msgstr "# статистика за множеството на променливите в речника:\n"
+
+#: src/variable.c:1756
+msgid ""
+"\n"
+"# Variables\n"
+msgstr ""
+"\n"
+"# Променливи\n"
+
+#: src/variable.c:1760
+msgid ""
+"\n"
+"# Pattern-specific Variable Values"
+msgstr ""
+"\n"
+"# Стойности на променливи, зависещи от шаблона"
+
+#: src/variable.c:1774
+msgid ""
+"\n"
+"# No pattern-specific variable values."
+msgstr ""
+"\n"
+"# Няма стойности на променливи, зависещи от шаблона"
+
+#: src/variable.c:1776
+#, c-format
+msgid ""
+"\n"
+"# %u pattern-specific variable values"
+msgstr ""
+"\n"
+"# %u стойности на променливи, зависещи от шаблона"
+
+#: src/variable.h:229
+#, c-format
+msgid "warning: undefined variable '%.*s'"
+msgstr "ПРЕДУПРЕЖДЕНИЕ: недефинирана променлива „%.*s“"
+
+#: src/vmsfunctions.c:91
+#, c-format
+msgid "sys$search() failed with %d\n"
+msgstr "„sys$search()“ завърши неуспешно с код %d\n"
+
+#: src/vmsjobs.c:244
+#, c-format
+msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
+msgstr ""
+"- ПРЕДУПРЕЖДЕНИЕ, вероятно трябва отново да включите управлението на CTRL-Y "
+"от „DCL“.\n"
+
+#: src/vmsjobs.c:681
+#, c-format
+msgid "BUILTIN CD %s\n"
+msgstr "ВГРАДЕНА КОМАНДА „CD“ %s\n"
+
+#: src/vmsjobs.c:1224
+#, c-format
+msgid "DCL: %s\n"
+msgstr "„DCL“: %s\n"
+
+#: src/vmsjobs.c:1284
+#, c-format
+msgid "Append output to %s\n"
+msgstr "Добавяне на изхода към „%s“\n"
+
+#: src/vmsjobs.c:1309
+#, c-format
+msgid "Append %.*s and cleanup\n"
+msgstr "Добавяне на %.*s и изчистване\n"
+
+#: src/vmsjobs.c:1322
+#, c-format
+msgid "Executing %s instead\n"
+msgstr "„%s“ се изпълнява вместо\n"
+
+#: src/vpath.c:603
+msgid ""
+"\n"
+"# VPATH Search Paths\n"
+msgstr ""
+"\n"
+"# Пътища за търсене „VPATH“\n"
+
+#: src/vpath.c:620
+msgid "# No 'vpath' search paths."
+msgstr "# Няма пътища за търсене във „VPATH“"
+
+#: src/vpath.c:622
+#, c-format
+msgid ""
+"\n"
+"# %u 'vpath' search paths.\n"
+msgstr ""
+"\n"
+"# %u пътища за търсене във „VPATH“\n"
+
+#: src/vpath.c:625
+msgid ""
+"\n"
+"# No general ('VPATH' variable) search path."
+msgstr ""
+"\n"
+"# Няма общ път (във „VPATH“) за търсене"
+
+#: src/vpath.c:631
+msgid ""
+"\n"
+"# General ('VPATH' variable) search path:\n"
+"# "
+msgstr ""
+"\n"
+"# Общ път за търсене (във „VPATH“)\n"
+"# "
+
+#: src/w32/w32os.c:44
+#, c-format
+msgid "Jobserver slots limited to %d\n"
+msgstr "Сървърът за задачи приема максимум %d задания\n"
+
+#: src/w32/w32os.c:60
+#, c-format
+msgid "creating jobserver semaphore: (Error %ld: %s)"
+msgstr "създаване на семафор за сървър за задачи: (грешка %ld: %s)"
+
+#: src/w32/w32os.c:79
+#, c-format
+msgid ""
+"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
+msgstr ""
+"ВЪТРЕШНА ГРЕШКА: семафорът на сървъра за задачи не може да се отвори „%s“: "
+"(грешка %ld: %s)"
+
+#: src/w32/w32os.c:82
+#, c-format
+msgid "Jobserver client (semaphore %s)\n"
+msgstr "Клиент на сървър за задачи (семафор %s)\n"
+
+#: src/w32/w32os.c:123
+#, c-format
+msgid "release jobserver semaphore: (Error %ld: %s)"
+msgstr "освобождаване на семафора на сървъра за задачи: (грешка %ld: %s)"
+
+#: src/w32/w32os.c:194
+#, c-format
+msgid "semaphore or child process wait: (Error %ld: %s)"
+msgstr "изчакване на семафор или дъщерен процес: (Грешка %ld: %s)"
index 84066b12a9463f18de151195e8ef19aa06aaaa89..a59c5728008f7b135778a1b9069e8dc6bc476de8 100644 (file)
Binary files a/po/cs.gmo and b/po/cs.gmo differ
index 90d78eaa9997e72b1042bc64ffcb6f756db005e3..e3ab2cbdd37f96445a7e497913a59abf96d79393 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -1,7 +1,7 @@
 # Czech translation of make.
 # Copyright (C) 2010 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
-# Petr Pisar <petr.pisar@atlas.cz>, 2011, 2013, 2014, 2016.
+# Petr Pisar <petr.pisar@atlas.cz>, 2011, 2013, 2014, 2016, 2019, 2020.
 #
 # directive → klíčové slovo (nepřekládat jako příkaz kvůli záměně)
 # hash → haš (zapisovat česky)
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-23 21:16+02:00\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 17:47+01:00\n"
 "Last-Translator: Petr Pisar <petr.pisar@atlas.cz>\n"
 "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
 "Language: cs\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "pokus použít nepodporovanou vlastnost: „%s“"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "nastavení času změny prvku archivu není na VMS dostupné"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Archiv „%s“ neexistuje"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: „%s“ není platným archivem"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Prvek „%s“ v „%s“ neexistuje"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: Chybný návratový kód z funkce ar_member_touch volané nad „%s“"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "funkce lbr$set_module() nedokázala vytáhnout údaje o modulu, status = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "funkce lbr$ini_control() selhala se stavem = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "není možné otevřít knihovnu „%s“ potřebnou k najití stav prvku %d"
 
 # TODO: Pluralize
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Prvek „%s“%s: %'ld bajtů at %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (název může být zkrácen)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Datum %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  UID = %d, GID = %d, práva = 0%o\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Návod má příliš mnoho řádků (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Přerušeno.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Prvek archivu „%s“ je možná chybný, nesmazáno"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Prvek archivu „%s“ ne možná chybný, nesmazáno"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Maže se soubor „%s“"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Maže se soubor „%s“"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  spustitelný návod"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (vestavěný):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (z „%s“, řádek %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -151,223 +153,223 @@ msgstr ""
 "\n"
 "# Adresáře\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: nebylo možné nad ním zavolat stat().\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (klíč %s, čas změny obsahu %ull): nebylo možné otevřít.\n"
+msgstr "# %s (klíč %s, čas změny obsahu %I64u): nebylo možné otevřít.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (zařízení %d, iuzel [%d,%d,%d]): nebylo možné otevřít.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (zařízení %ld, iuzel %ld): nebylo možné otevřít.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (klíč %s, čas změny obsahu %ull): "
+msgstr "# %s (klíč %s, čas změny obsahu %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (zařízení %d, iuzel [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (zařízení %ld, iuzel %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Žádný"
 
 # TODO: Pluralize
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " souborů, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "žádný "
 
 # TODO: Pluralize
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " nemožností "
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " zatím."
 
 # TODO: Pluralize
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " nemožností v %lu adresářích.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Rekurzivní proměnná „%s“ odkazuje na sebe (nakonec)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "neukončený odkaz na proměnnou"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Návod byl určen pro soubor „%s“ v %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Návod pro soubor „%s“ byl nalezen hledáním implicitních pravidel,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "ale „%s“ se nyní považuje za soubor totožný s „%s“."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "Návod pro „%s“ bude ignorován ve prospěch návodu pro „%s“."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 "„%s“ s jednoduchou dvojtečkou nelze přejmenovat na „%s“ s dvojitou dvojtečkou"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 "„%s“ s dvojitou dvojtečkou nelze přejmenovat na „%s“ s jednoduchou dvojtečkou"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "Maže se mezilehlý soubor „%s“ "
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Odstraňují se mezilehlé soubory…\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Aktuální čas"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Časový údaj mimo rozsah, nahrazuje se %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Není cílem:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Cenný soubor (prerekvizita k .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Falešný cíl (prerekvizita k .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Cíl příkazové řádky."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Default, MAKEFILES nebo -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Vestavěné pravidlo"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Hledalo se za pomoci implicitních pravidel."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Nehledalo se za pomoci implicitních pravidel."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Kořen implicitního/statického vzoru: „%s“\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Soubor je mezilehlá prerekvizita."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Rovněž vyrábí:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Čas změny obsahu se nikdy nekontroluje."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Soubor neexistuje."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Soubor je velmi starý."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Obsah naposledy změněn v %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Soubor byl aktualizován."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Soubor nebyl aktualizován."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Návod se právě vykonává (TOTO JE CHYBA)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Návod pro závislosti se právě vykonává (TOTO JE CHYBA)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Úspěšně aktualizováno."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Je třeba aktualizovat (-q je nastaveno)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Aktualizace selhala."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Neplatná hodnota v členu „command_state“!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -375,7 +377,7 @@ msgstr ""
 "\n"
 "# Soubory"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -385,336 +387,344 @@ msgstr ""
 "# Statistika hašovací tabulky souborů:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Položka „%s“ není v keši: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "nečíselný první argument funkce „word“"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "první argument funkce „word“ musí být vetší než 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "nečíselný první argument funkce „wordlist“"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "nečíselný druhý argument funkce „wordlist“"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(vstup) selhalo (chyba=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr ""
 "windows32_openpipe: DuplicateHandle(chybový výstup) selhalo (chyba=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() selhalo (chyba=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() selhalo\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Dočasný dávkový soubor %s se uklízí\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "soubor: chybí název souboru"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "otevření: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "zápis: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "zavření: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "soubor: příliš mnoho argumentů"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "čtení: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "soubor: neplatná operace na souboru: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "nedostatečný počet argumentů (%d) funkce „%s“"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "na této platformě neimplementováno: funkce „%s“"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "neukončené volání funkce „%s“: chybí „%c“"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Prázdný název funkce"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Neplatný název funkce: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Název funkce je příliš dlouhý: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Neplatný minimální počet argumentů (%u) funkce %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Neplatný maximální počet argumentů (%u) funkce %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: přepínač „%s“ není jednoznačný\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: přepínače „--%s“ nepřipouští argument\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: přepínač „%c%s“ nepřipouští argument\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: přepínač „%s“ vyžaduje argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: nerozpoznaný přepínač „--%s“\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: nerozpoznaný přepínač „%c%s“\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: zakázaný přepínač – %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: neplatný přepínač – %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: přepínač vyžaduje argument – %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: přepínač „-W %s“ není jednoznačný\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: přepínač „-W %s“ nepřipouští argument\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Expanduje se „%s“\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Vyhodnocuje se „%s“\n"
 
 # TODO: Pluralize
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "nelze alokovat %lu bajtů na hašovací tabulku: paměť vyčerpána"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Zátěž = %ld/%ld = %.0f %%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Zátěž = %lu/%lu = %.0f %%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Přehašováno = %d, "
+msgid "Rehash=%u, "
+msgstr "Přehašováno = %u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Kolizí = %ld/%ld = %.0f %%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Kolizí = %lu/%lu = %.0f %%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Hledá se implicitní pravidlo pro „%s“.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Hledá se implicitní pravidlo prvku archivu pro „%s“.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Zabraňuje se rekurzi implicitního pravidla.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Kořen je příliš dlouhý „%.*s“.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Kořen je příliš dlouhý: „%s%.*s“.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Zkouší se pravidlo vzoru s kořenem „%.*s“.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Zamítá se nemožná prerekvizita pravidla „%s“.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Zamítá se nemožná implicitní prerekvizita „%s“.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Zkouší se prerekvizita pravidla „%s“.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Zkouší se implicitní prerekvizita „%s“.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Nalezena prerekvizita „%s“ jako VPATH „%s“\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Hledá se pravidlo s mezilehlým souborem „%s“.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Dočasný soubor nelze vytvořit\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (obraz paměti uložen)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ignorováno)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<vestavěný>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Chyba %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Čeká se na nedokončené úlohy…"
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Živý potomek %p (%s) PID %s %s\n"
 
 # Continuation of Live child
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (vzdálený)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Uklízí se prohrávající potomek %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Uklízí se vyhrávající potomek %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Uklízí se prohrávající potomek %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Uklízí se dočasný dávkový soubor %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Úklid dočasného dávkového souboru %s selhal (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Z řetězce se odstraňuje potomek %p PID %s%s.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Uvolněn token pro potomka %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() nedokázala spustit proces (chyba=%ld)\n"
 
 # FIXME: Pluralize
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -723,93 +733,87 @@ msgstr ""
 "\n"
 "Napočítáno %d argumentů v selhaném spuštění\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Do řetězce se přidává potomek %p (%s) PID %s%s.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Získán token pro potomka %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: cíl „%s“ neexistuje"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: aktualizovat cíl „%s“ potřebný pro %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "na tomto operačním systému nelze vynutit omezení zátěže"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "omezení zátěže nelze vynutit: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "nedostatek deskriptorů souboru: standardní vstup nelze zduplikovat\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "nedostatek deskriptorů souboru: standardní výstup nelze zduplikovat\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "nedostatek deskriptorů souboru: chybový výstup nelze zduplikovat\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Standardní vstup nelze obnovit\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Standardní výstup nelze obnovit\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Chybový výstup nelze obnovit\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make uklidil potomka s PID %s, stále se čeká na PID %s\n"
 
-#: job.c:2275
+#: src/job.c:2623
 #, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Příkaz nenalezen\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Příkaz nenalezen\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Program shellu nenalezen"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: možná byl vyčerpán prostor pro prostředí"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "Proměnná $SHELL se změnila (byla „%s“, nyní je „%s“)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Vytváří se dočasný dávkový soubor %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -817,7 +821,7 @@ msgstr ""
 "Obsah dávkového souboru:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -826,58 +830,54 @@ msgstr ""
 "Obsah dávkového souboru:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (řádek %d) Chybný kontext shellu (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-"Přepínač -O[DRUH] (--output-sync[=DRUH]) není v tomto sestavení zahrnut."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Nepodařilo se otevřít tabulku globálních symbolů: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Zavedený objekt %s není veden jako slučitelný s GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Symbol %s z %s se nepodařilo zavést: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Pokus zavést prázdný název symbolu: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Zavádí se symbol %s z %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Na této platformě není operace zavedení (load) podporována."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Přepínače:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ignoruje se kvůli kompatibilitě.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Bezpodmínečně vyrobí všechny cíle.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -885,17 +885,17 @@ msgstr ""
 "  -C ADRESÁŘ, --directory=ADRESÁŘ\n"
 "                              Před děláním čehokoliv se přepne do ADRESÁŘE.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          Vypisuje mnoho ladicích údajů.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=PŘÍZNAKY]          Vypisuje ladicí údaje rozličných druhů.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -903,12 +903,12 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              Proměnné prostředí přebijí ty z makefilu.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
-msgstr "  --eval=ŘETĚZEC              Vyhodnotí ŘETĚZEC jako kód makefilu.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E ŘETĚZEC, --eval=ŘETĚZEC  Vyhodnotí ŘETĚZEC jako kód makefilu.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -916,15 +916,15 @@ msgstr ""
 "  -f SOUBOR, --file=SOUBOR, --makefile=SOUBOR\n"
 "                              Načte SOUBOR coby makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Vypíše tuto zprávu a skončí.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Ignoruje chyby z návodů.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -932,7 +932,7 @@ msgstr ""
 "  -I ADRESÁŘ, --include-dir=ADRESÁŘ\n"
 "                              Vložené makefily hledá v ADRESÁŘI.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -940,13 +940,13 @@ msgstr ""
 "  -j [N], --jobs[=N]          Dovolí nejvíce N úloh najednou;\n"
 "                              nekonečno úloh bez argumentu.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Pokračuje, když některé cíle nelze vyrobit.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -956,7 +956,7 @@ msgstr ""
 "                              Nespouští souběžné úlohy, dokud zátěž\n"
 "                              neklesne pod N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -964,7 +964,7 @@ msgstr ""
 "  -L, --check-symlink-times   Použije nejnovější čas změny obsahu z časů\n"
 "                              symbolických odkazů a cíle.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -974,7 +974,7 @@ msgstr ""
 "                              Ve skutečnosti nevykoná žádný návod, pouze\n"
 "                              jej vypíše.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -984,7 +984,7 @@ msgstr ""
 "                              Považuje SOUBOR za velmi starý a znovu jej\n"
 "                              nevyrobí.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -993,11 +993,11 @@ msgstr ""
 "                              Synchronizuje výstup souběžných úloh podle "
 "DRUHU.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Vypíše vnitřní databázi programu make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -1005,19 +1005,23 @@ msgstr ""
 "  -q, --question              Nespustí žádný návod. Návratový kód řekne,\n"
 "                              jestli je aktuální.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      Vypne vestavěná implicitní pravidla.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  Vypne vestavěné nastavení proměnných.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Neopisuje návod.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr "  --no-silent                 Opisuje návod (vypne režim --silent).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1025,32 +1029,32 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Vypne -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr "  -t, --touch                 Namísto výroby cílů jim změní čas.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Vypisuje trasovací údaje.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Vypíše číslo verze programu make a skončí.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Vypisuje aktuální adresář.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
 "  --no-print-directory        Vypne -w, i kdyby byl zapnut implicitně.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1058,7 +1062,7 @@ msgstr ""
 "  -W SOUBOR, --what-if=SOUBOR, --new-file=SOUBOR, --assume-new=SOUBOR\n"
 "                              Považuje SOUBOR za nekonečně nový.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1066,26 +1070,27 @@ msgstr ""
 "  --warn-undefined-variables  Upozorní, kdykoliv je odkazováno na\n"
 "                              nedefinovanou proměnnou.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "prázdný řetězec není platný název souboru"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "zadána neznámá úroveň ladění „%s“"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "neznámý druh synchronizace výstupu „%s“"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Zachyceno přerušení/výjimka (kód = 0x%lx, adresa = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1100,135 +1105,145 @@ msgstr ""
 "Příznaky výjimky = %lx\n"
 "Adresa výjimky = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Porušení přístupu: operace zápisu na adrese 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Porušení přístupu: operace čtení na adrese 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() nastavuje default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 "find_and_set_shell() při prohledávání cesty nastavila default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s se uspí na 30 sekund…"
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) dokončeno. Pokračuje se.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "pozor: správce úloh není dostupný: použije se -j1. Do nadřízeného pravidla "
 "maku přidejte „+“."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "pozor: -jN vnuceno podřízenému maku: režim správce úloh se vypíná."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr ""
+"pozor: -j%d vnuceno podřízenému programu make: režim správce úloh se restuje."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile na standardním vstupu uveden dvakrát."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (dočasný soubor)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (dočasný soubor)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"pozor: -j%d vnuceno v souboru makefile: režim správce úloh se resetuje."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Na této platformě nejsou paralelní úlohy (-j) podporovány."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Návrat k jednoúlohovému režimu (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Symbolické odkazy nejsou podporovány: vypíná se -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Soubory makefile se aktualizují…\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Makefile „%s“ může cyklit, nebude znovu vyroben.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Výroba nového makefilu „%s“ selhala."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Vložený makefile „%s“ nebyl nalezen."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Makefile „%s“ nebyl nalezen"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Nebylo možné se vrátit do původního adresáře."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Znovu se spouští [%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (dočasný soubor): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL obsahuje více než jeden cíl"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Nezadány žádné cíle a žádné makefily nenalezeny"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Žádné cíle"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Nezadány žádné cíle a žádné makefily nenalezeny"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Aktualizují se cíle…\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr "pozor: Zjištěn posun hodin. Vaše sestavení možná nebude úplné."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Použití: %s [PŘEPÍNAČE] [CÍLE]…\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1237,7 +1252,7 @@ msgstr ""
 "\n"
 "Tento program byl sestaven pro %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1246,34 +1261,34 @@ msgstr ""
 "\n"
 "Tento program byl sestaven pro %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Chyby v programu hlaste anglicky na <bug-make@gnu.org>. Nedostatky\n"
 "v překladu hlaste česky na <translation-team-cs@lists.sourceforge.net>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "přepínače „%s%s“ vyžaduje neprázdný řetězcový argument"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "přepínač „-%c“ vyžaduje kladný celočíselný argument"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sSestaveno pro %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%s Sestaveno pro %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1287,7 +1302,7 @@ msgstr ""
 "%sNesposkytuje se ŽÁDNÁ ZÁRUKA, jak jen zákon dovoluje.\n"
 
 # FIXME: i18n %s (time)
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1297,7 +1312,7 @@ msgstr ""
 "# Databáze maku vypsána v %s"
 
 # FIXME: i18n %s (time)
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1306,344 +1321,381 @@ msgstr ""
 "\n"
 "# Konec databáze maku v %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Neznámá chyba %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: uživatel %lu (reálný %lu), skupina %lu (reálná %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Přístup zahájen"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Přístup uživatelem"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Přístup makem"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Přístup potomkem"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Vstupuje se do neznámého adresáře\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s Opouští se neznámý adresář\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Vstupuje se do adresáře „%s“\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Opouští se adresář „%s“\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Vstupuje se do neznámého adresáře\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Opouští se neznámý adresář\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Vstupuje se do adresáře „%s“\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Opouští se adresář „%s“\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "chyba zápisu: standardní výstup"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ". Konec.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"Přepínač -O[DRUH] (--output-sync[=DRUH]) není v tomto sestavení zahrnut."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "vytváření roury úloh"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "duplikace roury úloh"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "inicializace roury správce úloh"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "vnitřní chyba: neplatný řetězec --jobserver-auth „%s“"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Klient správce úloh (deskriptory %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "kolona správce úloh"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "zápis správce úloh"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "správce úloh vypnut"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "volání pselect nad rourou úloh"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "čtení z roury úloh"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Čtou se makefily…\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Čte se makefile „%s“"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (žádný výchozí cíl)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (vyhledávací cesta)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (nestarat se)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (žádný expanze ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Přeskakuje se UTF-8 BOM v makefilu „%s“\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Přeskakuje se UTF-8 BOM v paměti makefilu\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "neplatná syntaxe podmínky"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: zavedení selhalo"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "návod zahájen před prvním cílem"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "před návodem chybí pravidlo"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "chybí oddělovač (mysleli jste tabulátor místo 8 mezer?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "chybí oddělovač"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "chybí vzor cíle"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "více vzorů cíle"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "vzor cíle neobsahuje „%%“"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "chybí „endif“"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "prázdný název proměnné"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "nadbytečný text po klíčovém slovu „define“"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "chybí „endef“, neukončený „define“"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "nadbytečný text po klíčovém slovu „endef“"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "nadbytečný text po klíčovém slovu „%s“"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "nadbytečný „%s“"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "pouze jeden „else“ na podmínku"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Chybě utvořená definice proměnné specifické pro cíl"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "prerekvizitu nelze definovat v návodu"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "seskupené cíle musí poskytovat návod"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "smíšené implicitní a statická pravidla vzorů"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "smíšené implicitní a normální pravidla"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "cíl „%s“ neodpovídá vzoru cíle"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "cílový soubor „%s“ obsahuje jak :, tak i ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "cíl „%s“ zadán více než jednou ve stejném pravidle"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "pozor: návod pro cíl „%s“ bude přebit"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "pozor: starý návod pro cíl „%s“ bude ignorován"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** smíšená implicitní a normální pravidla: zastaralá skladba"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "pozor: členství ve skupině pro cíl „%s“ bude přebito"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "pozor: zaznamenán znak NUL, zbytek řádku bude ignorován"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Pro „%s“ nebude nic uděláno."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "„%s“ je aktuální."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Uklízí se soubor „%s“.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sŽádné pravidlo jak vyrobit cíl „%s“ potřebný pro „%s“%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sŽádné pravidlo jak vyrobit cíl „%s“%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Zvažuje se cílový soubor „%s“.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Nedávná aktualizace souboru „%s“ selhala.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Soubor „%s“ již byl uvážen.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Stále se aktualizuje soubor „%s“.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Aktualizace soubor „%s“ dokončena.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Soubor „%s“ neexistuje.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1651,149 +1703,149 @@ msgstr ""
 "*** Pozor: Soubor .LOW_RESOLUTION_TIME „%s“ má časový údaj ve vysokém "
 "rozlišení"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Nalezeno implicitní pravidlo pro „%s“.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Pro „%s“ nenalezeno žádné implicitní pravidlo.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Pro „%s“ se použije výchozí návod.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Kruhová závislost „%s ← %s zahozena."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Prerekvizity cílového souboru „%s“ dokončeny.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Prerekvizity „%s“ se vyrábějí.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Výroba cílového souboru „%s“ vzdána.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Cíl „%s“ nebyl kvůli chybám znovu vyroben."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Prerekvizita „%s“ pro cíl „%s“ je jen o pořadí.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Prerekvizita „%s“ cíle „%s“ neexistuje.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Prerekvizita „%s“ je novější než cíl „%s“.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Prerekvizita „%s“ je starší než cíl „%s“.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Cíl „%s“ je dvojdvoutečkový a nemá žádnou prerekvizitu.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Pro „%s“ neexistuje návod a žádná prerekvizita se vskutku nezměnila.\n"
 
 # Always-make flag is make option -B
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Vyrábí se „%s“ kvůli přepínači --always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Cíl „%s“ není třeba znovu vyrábět"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; použije se název „%s“ z VPATH"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Cíl „%s“ je třeba znovu vyrobit.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Ignoruje se název „%s“ z VPATH.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Právě se vykonává návod pro „%s“.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Cílový soubor „%s“ nebylo možné znovu vyrobit.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Cílový soubor „%s“ byl úspěšně znovu vyroben.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Cílový soubor „%s“ je třeba znovu vyrobit za použití -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Pro „%s„ se použijí se výchozí příkazy.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Pozor: Soubor „%s“ má čas změny obsahu v budoucnu"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Pozor: Soubor „%s“ má čas změny obsahu %s s směrem do budoucnosti"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "Prvek .LIBPATTERNS „%s“ není vzorem"
 
 # `Customs' is literal (a library name). See README.customs.
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs nebude exportovat: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1801,7 +1853,7 @@ msgstr ""
 "\n"
 "# Implicitní pravidla"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1809,186 +1861,182 @@ msgstr ""
 "\n"
 "# Žádná implicitní pravidla."
 
-# FIXME: Pluralize by first %u
-#: rule.c:514
+# FIXME: Pluralize
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# Implicitních pravidel: %u, %u"
+"# %u implicitních pravidel, %u (%.1f %%) koncových"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminál."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "CHYBA: num_pattern_rules je chybný! %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "neznámý signál"
 
 # Keep signal names in sync with GNU libc translations.
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Odpojen terminál (SIGHUP)"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Přerušení (SIGINT)"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Konec (SIGQUIT)"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Nedovolená instrukce (SIGILL)"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Trasovací/ladící past (SIGTRAP)"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Neúspěšně ukončen (SIGABRT)"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT past (SIGIOT)"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT past (SIGEMT)"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Výjimka práce s pohyblivou řádovou čárkou (SIGFPE)"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Zabit (SIGKILL)"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Chyba na sběrnici (neplatná adresa) (SIGBUS)"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Neoprávněný přístup do paměti (SIGSEGV)"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Chybné volání systému (SIGSYS)"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Roura přerušena (SIGPIPE)"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Budík (SIGALRM)"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Ukončen (SIGTERM)"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Uživatelem definovaný signál 1 (SIGUSR1)"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Uživatelem definovaný signál 2 (SIGUSR2)"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Potomek skončil (SIGCHLD)"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Výpadek napájení (SIGPWR)"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Pozastaven (SIGTSTP)"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Pozastaven (vstup TTY) (SIGTTIN)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Pozastaven (výstup TTY) (SIGTTOU)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Pozastaven (SIGSTOP)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Překročen časový limit pro procesor (SIGXCPU)"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Překročen limit délky souboru (SIGXFS2)"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtuální časovač vypršel (SIGVTALRM)"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Profilovací časovač vypršel (SIGPROF)"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Okno se změnilo (SIGWINCH)"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Je pokračováno (SIGCONT)"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Naléhavá I/O situace (SIGURG)"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "Vstup/Výstup možný (SIGIO)"
 
 # SIGWIND exists on Darwin
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "Okno se změnilo (SIGWIND)"
 
 # SIGPHONE exists on Unix PC (3B1)
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "Změna stavu linky (SIGPHONE)"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Prostředek byl ztracen (SIGLOST)"
 
 # SIGDANGER exists on AIX
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Nebezpečí nedostatku paměti (SIGDANGER)"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Žádost o informaci (SIGINFO)"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Koprocesor pro práci s pohyblivou řádkou není dostupný (SIGNOFP)"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1997,7 +2045,7 @@ msgstr ""
 "\n"
 "%s Žádná keš řetězců\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2008,20 +2056,20 @@ msgstr ""
 "%s užito z keše řetězců: %lu (%lu) / řetězců = %lu / úložiště = %lu B / "
 "prům.  = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "%s současná keš: velikost = %hu B / užito = %hu B / počet = %hu / prům. = "
-"%hu B\n"
+"%u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s užito dalších: celkem = %lu B / počet = %lu / prům. = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
@@ -2029,7 +2077,7 @@ msgstr ""
 "%s volno dalších: celkem = %lu B / max. = %lu B / min. = %lu B / prům.  = "
 "%hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2038,7 +2086,7 @@ msgstr ""
 "\n"
 "%s vytížení keše řetězců: dotazů = %lu / poměr nálezů = %lu %%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2046,44 +2094,44 @@ msgstr ""
 "# Statistika hašovací tabulky:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatická"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "výchozí"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "prostředí"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "prostředí z přepínače -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "příkazový řádek"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "klíčové slovo „override“"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (z „%s“, řádek %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# statistika hašovací tabulky pro množinu proměnných:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2091,7 +2139,7 @@ msgstr ""
 "\n"
 "# Proměnné\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2099,7 +2147,7 @@ msgstr ""
 "\n"
 "# Hodnoty proměnných specifických pro vzor"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2108,7 +2156,7 @@ msgstr ""
 "# Žádné hodnoty proměnných specifických pro vzor."
 
 # FIXME: Pluralize
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2117,47 +2165,47 @@ msgstr ""
 "\n"
 "# Hodnot proměnných specifických pro vzor: %u"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "pozor: nedefinovaná proměnná „%.*s“"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "volání sys$search() selhalo s %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-pozor, možná byste měli znovu povolit obsluhu CTRL-Y z DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "VESTAVĚNÝ PŘÍKAZ CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Výstup připojen k %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Připojit %.*s a uklidit\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Místo toho se spustí %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2165,12 +2213,12 @@ msgstr ""
 "\n"
 "# Vyhledávací cesty VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Žádné vyhledávací cesty „vpath“."
 
 # FIXME: Pluralize
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2179,7 +2227,7 @@ msgstr ""
 "\n"
 "$ Vyhledávacích cest „vpath“: %u\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2187,7 +2235,7 @@ msgstr ""
 "\n"
 "# Žádná obecná vyhledávací cesta (proměnná „VPATH“)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2197,38 +2245,62 @@ msgstr ""
 "# Obecná vyhledávací cesta (proměnná „VPATH“):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Místa ve správci úloh jsou omezena na %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "vytváření semaforu správce úloh: (Chyba %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 "vnitřní chyba: nelze otevřít semafor správce úloh „%s“: (Chyba %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Klient správce úloh (semafor %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "uvolnění semaforu správce úloh: (Chyba %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "čekání na semafor nebo potomka: (Chyba %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Příkaz nenalezen\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Příkaz nenalezen\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Program shellu nenalezen"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s se uspí na 30 sekund…"
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) dokončeno. Pokračuje se.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Neznámá chyba %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Pozor: Soubor „%s“ má čas změny obsahu v budoucnu"
+
+#~ msgid " terminal."
+#~ msgstr " terminál."
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: návod pro cíl „%s“ selhal"
 
index 8e13d9ae06415e34a4782938b7dd7cb42d346daf..41d50a294df0277269b86a442c08dea7e8498260 100644 (file)
Binary files a/po/da.gmo and b/po/da.gmo differ
index dc18aab3d67fc35af992f041261b9c83212a9038..423809eb5664395be50ab2cc026d8c77988dd478 100644 (file)
--- a/po/da.po
+++ b/po/da.po
 # Danish messages for make
-# Copyright (C) 2001 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2016 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 #
 # Byrial Ole Jensen <byrial@image.dk>, 2001
-# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010.
+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2010, 2016.
+#
+# Ordliste
+# --------
+#
+# archive -> arkiv
+# member (i arkiv) -> element
+# library -> bibliotek
+# recipe -> opskrift?
+# pipe -> pipe
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 3.82\n"
+"Project-Id-Version: make-4.2.1\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2011-01-05 02:26+0100\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2016-12-04 18:52+0100\n"
 "Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
 "Language: da\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
-#, fuzzy, c-format
+#: src/ar.c:46
+#, c-format
 msgid "attempt to use unsupported feature: '%s'"
-msgstr "forsøg på at bruge en ikke understøttet facilitet: '%s'"
+msgstr "forsøg på at bruge funktion som ikke understøttes: \"%s\""
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
-msgstr "'berør arkivmedlem' er ikke tilgængelig på VMS"
+msgstr "\"touch arkivelement\" er ikke tilgængelig på VMS"
 
-#: ar.c:147
-#, fuzzy, c-format
+#: src/ar.c:147
+#, c-format
 msgid "touch: Archive '%s' does not exist"
-msgstr "touch: Arkivet '%s' findes ikke"
+msgstr "touch: Arkivet \"%s\" findes ikke"
 
-#: ar.c:150
-#, fuzzy, c-format
+#: src/ar.c:150
+#, c-format
 msgid "touch: '%s' is not a valid archive"
-msgstr "touch: '%s' er ikke et gyldigt arkiv"
+msgstr "touch: \"%s\" er ikke et gyldigt arkiv"
 
-#: ar.c:157
-#, fuzzy, c-format
+#: src/ar.c:157
+#, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
-msgstr "touch: Medlemmet '%s' findes ikke i '%s'"
+msgstr "touch: Elementet \"%s\" findes ikke i \"%s\""
 
-#: ar.c:164
-#, fuzzy, c-format
+#: src/ar.c:164
+#, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
-msgstr "touch: Forkert returkode fra ar_member_touch på '%s'"
+msgstr "touch: Forkert returkode fra ar_member_touch på \"%s\""
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() kunne ikke udtrække modulinformation, status = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() fejlede med status = %d"
 
-#: arscan.c:261
-#, fuzzy, c-format
+#: src/arscan.c:261
+#, c-format
 msgid "unable to open library '%s' to lookup member status %d"
-msgstr "kan ikke åbne biblioteket '%s' for at søge medlemmet '%s'"
+msgstr "kan ikke åbne biblioteket \"%s\" for at slå elementstatus %d op"
 
-#: arscan.c:965
-#, fuzzy, c-format
+#: src/arscan.c:944
+#, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
-msgstr "Medlem '%s'%s: %ld byte ved %ld (/%ld).\n"
+msgstr "Medlem \"%s\"%s: %ld byte ved %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (navnet kan være forkortet)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Tidsstempel %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, modus = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
-msgstr ""
+msgstr "Opskriften har for mange linjer (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Afbrydelse.\n"
 
-#: commands.c:627
-#, fuzzy, c-format
+#: src/commands.c:628
+#, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
-msgstr "*** [%s] Arkivmedlemmet '%s' er måske falsk; ikke slettet"
+msgstr "*** [%s] Arkivmedlemmet \"%s\" er måske falsk; ikke slettet"
 
-#: commands.c:631
-#, fuzzy, c-format
+#: src/commands.c:632
+#, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
-msgstr "*** Arkivmedlemmet '%s' er måske falsk; ikke slettet"
+msgstr "*** Arkivmedlemmet \"%s\" er måske falsk; ikke slettet"
 
-#: commands.c:645
-#, fuzzy, c-format
+#: src/commands.c:646
+#, c-format
 msgid "*** [%s] Deleting file '%s'"
-msgstr "*** [%s] Sletter filen '%s'"
+msgstr "*** [%s] Sletter filen \"%s\""
 
-#: commands.c:647
-#, fuzzy, c-format
+#: src/commands.c:648
+#, c-format
 msgid "*** Deleting file '%s'"
-msgstr "*** Sletter filen '%s'"
+msgstr "*** Sletter filen \"%s\""
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  kommandoer der skal køres"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (indbyggede):"
 
-#: commands.c:688
-#, fuzzy, c-format
+#: src/commands.c:689
+#, c-format
 msgid " (from '%s', line %lu):\n"
-msgstr " (fra '%s', linje %lu):\n"
+msgstr " (fra \"%s\", linje %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -131,222 +142,219 @@ msgstr ""
 "\n"
 "# Filkataloger\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: kunne ikke undersøges med stat.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (nøgle %s, mtime %d): kunne ikke åbnes.\n"
+msgstr "# %s (nøgle %s, mtime %I64u): kunne ikke åbnes.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (enhed %d, inode [%d,%d,%d]): kunne ikke åbnes.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (enhed %ld, inode %ld): kunne ikke åbnes.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (nøgle %s, mtime %d): "
+msgstr "# %s (nøgle %s, mtime %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (enhed %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (enhed %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Ingen"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " filer, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "ingen"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " umuligheder"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " indtil videre."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " umuligheder i %lu kataloger.\n"
 
-#: expand.c:125
-#, fuzzy, c-format
+#: src/expand.c:125
+#, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
-msgstr "Rekursiv variabel '%s' refererer (i sidste ende) til sig selv"
+msgstr "Rekursiv variabel \"%s\" refererer (i sidste ende) til sig selv"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "uafsluttet variabelreference"
 
-#: file.c:278
-#, fuzzy, c-format
+#: src/file.c:278
+#, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
-msgstr "Kommandoer blev angivet for filen '%s' i %s:%lu,"
+msgstr "Opskrift blev angivet for filen \"%s\" i %s:%lu,"
 
-#: file.c:283
-#, fuzzy, c-format
+#: src/file.c:283
+#, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
-msgstr "Kommandoer for filen '%s' blev fundet ved implicit regelsøgning,"
+msgstr "Opskrift for filen \"%s\" blev fundet ved implicit regelsøgning,"
 
-#: file.c:287
-#, fuzzy, c-format
+#: src/file.c:287
+#, c-format
 msgid "but '%s' is now considered the same file as '%s'."
-msgstr "men '%s' bliver nu anset som samme fil som '%s'."
+msgstr "men \"%s\" bliver nu anset som samme fil som \"%s\"."
 
-#: file.c:290
-#, fuzzy, c-format
+#: src/file.c:290
+#, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
-msgstr "Kommandoer for '%s' vil blive ignoreret til fordel for de for '%s'."
+msgstr ""
+"Opskriften for \"%s\" vil blive ignoreret til fordel for den for \"%s\"."
 
-#: file.c:310
-#, fuzzy, c-format
+#: src/file.c:310
+#, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
-msgstr "kan ikke ændre enkelt-kolon '%s' til dobbelt-kolon '%s'"
+msgstr "kan ikke ændre enkelt-kolon \"%s\" til dobbelt-kolon \"%s\""
 
-#: file.c:316
-#, fuzzy, c-format
+#: src/file.c:316
+#, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
-msgstr "kan ikke ændre dobbelt-kolon '%s' til enkelt-kolon '%s'"
+msgstr "kan ikke ændre dobbelt-kolon \"%s\" til enkelt-kolon \"%s\""
 
-#: file.c:408
-#, fuzzy, c-format
+#: src/file.c:408
+#, c-format
 msgid "*** Deleting intermediate file '%s'"
-msgstr "*** Sletter mellemfil '%s'"
+msgstr "*** Sletter mellemfil \"%s\""
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Sletter mellemfiler ...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Aktuel tid"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Tidsstempel i forkert område; bruger %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Ikke et mål:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Værdifuld fil (forudsætning for .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Falsk mål (forudsætning for .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Kommandolinjemål."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Et forvalg, MAKEFILES, eller -include/sinclude makefile."
 
-#: file.c:975
-#, fuzzy
+#: src/file.c:1029
 msgid "#  Builtin rule"
-msgstr ""
-"\n"
-"# Ingen implicitte regler."
+msgstr "#  Indbygget regel"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Der er udført implicit regelsøgning."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Der er ikke udført implicit regelsøgning."
 
-#: file.c:980
-#, fuzzy, c-format
+#: src/file.c:1034
+#, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
-msgstr "#  Implicit/statisk mønsterstamme: '%s'\n"
+msgstr "#  Implicit/statisk mønsterstamme: \"%s\"\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Filen er en mellemfil."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Skaber også:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Ændringstid ikke tjekket."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Filen findes ikke."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Filen er meget gammel."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Sidst ændret %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Filen er blevet opdateret."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Filen er ikke blevet opdateret."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Der køres kommandoer nu (DETTE ER EN FEJL)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Kommandoer for afhængigheder køres nu (DETTE ER EN FEJL)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Opdateret med godt resultat."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Behøver opdatering (-q er sat)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Opdatering mislykkedes."
 
-#: file.c:1032
-#, fuzzy
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
-msgstr "#  Ugyldig værdi i 'command_state'-felt!"
+msgstr "#  Ugyldig værdi i \"command_state\"-felt!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -354,7 +362,7 @@ msgstr ""
 "\n"
 "# Filer"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -364,338 +372,341 @@ msgstr ""
 "# Statistik for fil-hash-spande:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
-msgstr ""
+msgstr "%s: Feltet \"%s\" er ikke i cache: %s"
 
-#: function.c:790
-#, fuzzy
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
-msgstr "ikke-numerisk første argument til 'word'-funktionen"
+msgstr "ikke-numerisk første argument til \"word\"-funktionen"
 
-#: function.c:795
-#, fuzzy
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
-msgstr "første argument til 'word'-functionen skal være større end 0"
+msgstr "første argument til \"word\"-funktionen skal være større end 0"
 
-#: function.c:815
-#, fuzzy
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
-msgstr "ikke-numerisk første argument til 'wordlist'-funktionen"
+msgstr "ikke-numerisk første argument til \"wordlist\"-funktionen"
 
-#: function.c:817
-#, fuzzy
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
-msgstr "ikke-numerisk andet argument til 'wordlist'-funktionen"
+msgstr "ikke-numerisk andet argument til \"wordlist\"-funktionen"
 
-#: function.c:1525
-#, fuzzy, c-format
+#: src/function.c:1533
+#, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
-msgstr "windows32_openpipe(): DuplicateHandle(In) mislykkedes (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(In) mislykkedes (e=%ld)\n"
 
-#: function.c:1549
-#, fuzzy, c-format
+#: src/function.c:1557
+#, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
-msgstr "windows32_open_pipe(): DuplicateHandle(Err) mislykkedes (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(Err) mislykkedes (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() mislykkedes (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() mislykkedes\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Afrydder midlertidig batchfil %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
-msgstr ""
+msgstr "fil: mangler filnavn"
 
-#: function.c:2219 function.c:2250
-#, fuzzy, c-format
+#: src/function.c:2234 src/function.c:2265
+#, c-format
 msgid "open: %s: %s"
-msgstr "%s: %s"
+msgstr "åbn: %s: %s"
 
-#: function.c:2227
-#, fuzzy, c-format
+#: src/function.c:2242
+#, c-format
 msgid "write: %s: %s"
-msgstr "skrivefejl: %s"
+msgstr "skriv: %s: %s"
 
-#: function.c:2230 function.c:2267
-#, fuzzy, c-format
+#: src/function.c:2245 src/function.c:2282
+#, c-format
 msgid "close: %s: %s"
-msgstr "%s%s: %s"
+msgstr "luk: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
-msgstr ""
+msgstr "fil: for mange argumenter"
 
-#: function.c:2262
-#, fuzzy, c-format
+#: src/function.c:2277
+#, c-format
 msgid "read: %s: %s"
-msgstr "%s: %s"
+msgstr "læs: %s: %s"
 
-#: function.c:2275
-#, fuzzy, c-format
+#: src/function.c:2290
+#, c-format
 msgid "file: invalid file operation: %s"
-msgstr "%s: ugyldigt tilvalg -- %c\n"
+msgstr "fil: ugyldig filoperation: %s"
 
-#: function.c:2390
-#, fuzzy, c-format
+#: src/function.c:2405
+#, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
-msgstr "utilstrækkeligt antal argumenter (%d) til funktionen '%s'"
+msgstr "utilstrækkeligt antal argumenter (%d) til funktionen \"%s\""
 
-#: function.c:2402
-#, fuzzy, c-format
+#: src/function.c:2417
+#, c-format
 msgid "unimplemented on this platform: function '%s'"
-msgstr "ikke implementeret på denne platform: funktion '%s'"
+msgstr "ikke implementeret på denne platform: funktionen \"%s\""
 
-#: function.c:2466
-#, fuzzy, c-format
+#: src/function.c:2483
+#, c-format
 msgid "unterminated call to function '%s': missing '%c'"
-msgstr "uafsluttet kald til funktionen '%s'; manglende '%c'"
+msgstr "uafsluttet kald til funktionen \"%s\"; manglende \"%c\""
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
-msgstr ""
+msgstr "Tomt funktionsnavn"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
-msgstr ""
+msgstr "Ugyldigt funktionsnavn: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
-msgstr ""
+msgstr "Funktionsnavn er for langt: %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "utilstrækkeligt antal argumenter (%d) til funktionen '%s'"
+msgstr "utilstrækkeligt antal argumenter (%u) til funktionen \"%s\""
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "utilstrækkeligt antal argumenter (%d) til funktionen '%s'"
+msgstr "Utilstrækkeligt antal argumenter (%u) til funktionen \"%s\""
 
-#: getopt.c:659
-#, fuzzy, c-format
+#: src/getopt.c:659
+#, c-format
 msgid "%s: option '%s' is ambiguous\n"
-msgstr "%s: tilvalg '%s' er flertydigt\n"
+msgstr "%s: tilvalget \"%s\" er flertydigt\n"
 
-#: getopt.c:683
-#, fuzzy, c-format
+#: src/getopt.c:683
+#, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
-msgstr "%s: tilvalg '--%s' tillader ikke et argument\n"
+msgstr "%s: tilvalget \"--%s\" tillader ikke et argument\n"
 
-#: getopt.c:688
-#, fuzzy, c-format
+#: src/getopt.c:688
+#, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
-msgstr "%s: tilvalg '%c%s' tillader ikke et argument\n"
+msgstr "%s: tilvalget \"%c%s\" tillader ikke et argument\n"
 
-#: getopt.c:705 getopt.c:878
-#, fuzzy, c-format
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
 msgid "%s: option '%s' requires an argument\n"
-msgstr "%s tilvalg '%s' kræver et argument\n"
+msgstr "%s tilvalget \"%s\" kræver et argument\n"
 
-#: getopt.c:734
-#, fuzzy, c-format
+#: src/getopt.c:734
+#, c-format
 msgid "%s: unrecognized option '--%s'\n"
-msgstr "%s: ikke genkendt tilvalg '--%s'\n"
+msgstr "%s: ukendt tilvalg \"--%s\"\n"
 
-#: getopt.c:738
-#, fuzzy, c-format
+#: src/getopt.c:738
+#, c-format
 msgid "%s: unrecognized option '%c%s'\n"
-msgstr "%s: ikke genkendt tilvalg '%c%s'\n"
+msgstr "%s: ukendt tilvalg \"%c%s\"\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: ulovligt tilvalg -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: ugyldigt tilvalg -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: tilvalg kræver et argument -- %c\n"
 
-#: getopt.c:844
-#, fuzzy, c-format
+#: src/getopt.c:844
+#, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
-msgstr "%s: tilvalg '-W %s' er flertydigt\n"
+msgstr "%s: tilvalget \"-W %s\" er flertydigt\n"
 
-#: getopt.c:862
-#, fuzzy, c-format
+#: src/getopt.c:862
+#, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
-msgstr "%s: tilvalg '-W %s' tillader ikke et argument\n"
+msgstr "%s: tilvalget \"-W %s\" tillader ikke et argument\n"
 
-#: guile.c:58
+# expand er normalt at skrive noget ud frem for at forkorte det.  F.eks. %s -> "hello"
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
-msgstr ""
+msgstr "guile: Udskriver \"%s\"\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
-msgstr ""
+msgstr "guile: Evaluerer \"%s\"\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "kan ikke tildele %lu byte til hashtabel: hukommelsen opbrugt"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Fyldning=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Omgrupperinger=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Sammenstød=%ld/%ld=%.0f%%"
 
-#: implicit.c:38
-#, fuzzy, c-format
+#: src/implicit.c:38
+#, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
-msgstr "Kigger efter en implicit regel for '%s'.\n"
+msgstr "Kigger efter en implicit regel for \"%s\".\n"
 
-#: implicit.c:54
-#, fuzzy, c-format
+#: src/implicit.c:54
+#, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
-msgstr "Kigger efter en implicit arkivmedlemsregel for '%s'.\n"
+msgstr "Kigger efter en implicit arkivmedlemsregel for \"%s\".\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Undgår rekursion i implicitte regler.\n"
 
-#: implicit.c:486
-#, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr ""
-
-#: implicit.c:491
+#: src/implicit.c:484
 #, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Stamme for lang: \"%.*s\"\n"
+
+#: src/implicit.c:490
+#, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
-msgstr "Prøver mønsterregel med stammen '%.*s'.\n"
+msgstr "Prøver mønsterregel med stammen \"%.*s\".\n"
 
-#: implicit.c:697
-#, fuzzy, c-format
+#: src/implicit.c:717
+#, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
-msgstr "Afviser umulig regelforudsætning '%s'.\n"
+msgstr "Afviser umulig regelforudsætning \"%s\".\n"
 
-#: implicit.c:698
-#, fuzzy, c-format
+#: src/implicit.c:718
+#, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
-msgstr "Afviser umulig implicit forudsætning '%s'.\n"
+msgstr "Afviser umulig implicit forudsætning \"%s\".\n"
 
-#: implicit.c:711
-#, fuzzy, c-format
+#: src/implicit.c:732
+#, c-format
 msgid "Trying rule prerequisite '%s'.\n"
-msgstr "Prøver regelforudsætning '%s'.\n"
+msgstr "Prøver regelforudsætning \"%s\".\n"
 
-#: implicit.c:712
-#, fuzzy, c-format
+#: src/implicit.c:733
+#, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
-msgstr "Prøver implicit forudsætning '%s'.\n"
+msgstr "Prøver implicit forudsætning \"%s\".\n"
 
-#: implicit.c:751
-#, fuzzy, c-format
+#: src/implicit.c:772
+#, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
-msgstr "Fandt forudsætning '%s' som VPATH '%s'\n"
+msgstr "Fandt forudsætning \"%s\" som VPATH \"%s\"\n"
 
-#: implicit.c:765
-#, fuzzy, c-format
+#: src/implicit.c:786
+#, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
-msgstr "Kigger efter en regel med mellemfil '%s'.\n"
+msgstr "Kigger efter en regel med mellemfil \"%s\".\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Kan ikke oprette midlertidig fil\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (core-fil efterladt)"
 
-#: job.c:490
-#, fuzzy
+#: src/job.c:553
 msgid " (ignored)"
-msgstr "[%s] Fejl %d (ignoreret)"
+msgstr "(ignoreret)"
 
-#: job.c:494 job.c:1828
-#, fuzzy
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
-msgstr " (indbyggede):"
+msgstr "<indbygget>"
 
-#: job.c:510
-#, fuzzy, c-format
+#: src/job.c:573
+#, c-format
 msgid "%s[%s: %s] Error %d%s"
-msgstr "*** [%s] Fejl %d"
+msgstr "%s[%s: %s] Fejl %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Venter på uafsluttede job...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Levende underproces %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (eksternt)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Høster tabende underproces %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Høster vindende underproces %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Høster tabende underproces %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
-msgstr "Afrydder midlertidig jobfil %s\n"
+msgstr "Rydder midlertidig batchfil %s\n"
 
-#: job.c:845
-#, fuzzy, c-format
+#: src/job.c:956
+#, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
-msgstr "Afrydder midlertidig jobfil %s\n"
+msgstr "Oprydning af midlertidig batchfil %s mislykkedes (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Fjerner underproces %p PID %s%s fra kæde.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Frigav symbol for underproces %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() fejlede ved igangsætning af proces (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -704,104 +715,95 @@ msgstr ""
 "\n"
 "Talte %d argumenter i fejlet igangsætning\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Sætter underproces %p (%s) PID %s%s på kæden.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Fik symbol for underproces %p (%s).\n"
 
-#: job.c:1838
-#, fuzzy, c-format
+#: src/job.c:1902
+#, c-format
 msgid "%s: target '%s' does not exist"
-msgstr "touch: Arkivet '%s' findes ikke"
+msgstr "%s: målet \"%s\" findes ikke"
 
-#: job.c:1841
-#, fuzzy, c-format
+#: src/job.c:1905
+#, c-format
 msgid "%s: update target '%s' due to: %s"
-msgstr "%sIngen regel til at skabe mål '%s' som behøves af '%s'%s"
+msgstr "%s: opdatér målet \"%s\" på grund af: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "kan ikke gennemtvinge belastningsgrænser på dette styrestystem"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "kan ikke gennemtvinge belastningsgrænse: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "ikke flere filhåndtag: Kunne ikke duplikere stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "ikke flere filhåndtag: Kunne ikke duplikere stdout\n"
 
-#: job.c:2074
-#, fuzzy
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
-msgstr "ikke flere filhåndtag: Kunne ikke duplikere stdin\n"
+msgstr "ikke flere filhåndtag: kunne ikke duplikere stdin\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Kunne ikke gendanne stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Kunne ikke gendanne stdout\n"
 
-#: job.c:2105
-#, fuzzy
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Kunne ikke gendanne stdin\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make høstede underproces med pid %s, venter endnu på pid %s\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Kommando ikke fundet"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Kommando ikke fundet"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s; Skalprogram ikke fundet"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: miljøplads er måske opbrugt"
 
-#: job.c:2584
-#, fuzzy, c-format
+#: src/job.c:2862
+#, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
-msgstr "$SHELL ændret (var '%s', nu '%s')\n"
+msgstr "$SHELL ændret (var \"%s\", nu \"%s\")\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
-msgstr "Opretter midlertidig jobfil %s\n"
+msgstr "Opretter midlertidig batchfil %s\n"
 
-#: job.c:3030
-#, fuzzy
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
-"Indhold af batchfil:%s\n"
-"\t%s\n"
+"Indhold af batchfil:\n"
+"\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -810,58 +812,54 @@ msgstr ""
 "Indhold af batchfil:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (linje %d) Forkert skal-kontekst (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
-msgstr ""
+msgstr "Kunne ikke åbne global symboltabel: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
-msgstr ""
+msgstr "Det indlæste objekt %s er ikke erklæret som GPL-kompatibelt"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
-msgstr ""
+msgstr "Kunne ikke indlæse symbolet %s fra %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
-msgstr ""
+msgstr "Tomt symbolnavn ved indlæsning: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
-msgstr ""
+msgstr "Indlæser symbol %s fra %s\n"
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
-msgstr "Parallelle job (-j) er ikke understøttet på denne platform."
+msgstr "Operationen indlæs ('load') understøttes ikke på denne platform."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Tilvalg:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ignoreret af hensyn til kompabilitet.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Skab alle mål betingelsesløst.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -869,19 +867,19 @@ msgstr ""
 "  -C KATALOG, --directory=KATALOG\n"
 "                              Skift allerførst til KATALOG.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d                          Udskriv en masse fejlsøgningsinformation.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=FLAG]              Udskriv forskellige slags "
 "fejlsøgningsinformation.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -889,13 +887,14 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              Miljøvariable har forrang for makefiler.\n"
 
-#: main.c:353
+#: src/main.c:350
+#, fuzzy
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 "  --eval=STRENG               Evaluér STRENG som en makefil-erklæring.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -903,15 +902,15 @@ msgstr ""
 "  -f FIL, --file=FIL, --makefile=FIL\n"
 "                              Læs FIL som en makefil.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Udskriv denne besked og afslut.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Ignorér fejl fra kommandoer.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -919,7 +918,7 @@ msgstr ""
 "  -I KATALOG, --include-dir=KATALOG\n"
 "                              Søg i KATALOG efter inkluderede makefiler.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -927,13 +926,13 @@ msgstr ""
 "  -j [N], --jobs[=N]          Tillad N samtidige job; uendelig mange job "
 "uden argument.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Fortsæt selvom nogen mål ikke kan skabes.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -943,7 +942,7 @@ msgstr ""
 "                              Start ikke flere job medmindre belastningen er "
 "under N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -951,7 +950,7 @@ msgstr ""
 "  -L, --check-symlink-times   Brug sidste mtime mellem symbolske lænker og "
 "mål.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -961,7 +960,7 @@ msgstr ""
 "                              Udfør ikke nogen kommandoer; udskriv dem "
 "bare.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -971,17 +970,20 @@ msgstr ""
 "                              Anse FIL som værende meget gammel og genskab "
 "den ikke.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
+"  -O[TYPE], --output-sync[=TYPE]\n"
+"                              Synkronisér udskrift af parallelle job efter "
+"TYPE\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Udskriv makes interne database.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -990,20 +992,28 @@ msgstr ""
 "angiver\n"
 "                                om målet er tidssvarende.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Slå de indbyggede implicitte regler fra.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  Slå de indbyggede variabelværdier fra.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Udskriv ikke kommandoer.\n"
 
-#: main.c:393
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Udfør ingen kommandoer; afslutningskoden "
+"angiver\n"
+"                                om målet er tidssvarende.\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1011,27 +1021,25 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Slår -k fra.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Berør mål i stedet for at genskabe dem.\n"
 
-#: main.c:398
-#, fuzzy
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
-msgstr ""
-"  -d                          Udskriv en masse fejlsøgningsinformation.\n"
+msgstr "  --trace                     Udskriv trace-information.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               Udskriv makes versionnummer og afslut.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Udskriv det aktuelle katalog.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1039,7 +1047,7 @@ msgstr ""
 "  --no-print-directory        Slå -w fra, selv hvis det var slået til "
 "automatisk.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1047,33 +1055,34 @@ msgstr ""
 "  -W FIL, --what-if=FIL, --new-file=FIL, --assume-new=FIL\n"
 "                              Anse FIL som værende nyskabt.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 "  --warn-undefined-variables  Advar når en udefineret variabel bruges.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "en tom streng er ugyldig som filnavn"
 
-#: main.c:766
-#, fuzzy, c-format
+#: src/main.c:754
+#, c-format
 msgid "unknown debug level specification '%s'"
-msgstr "ukendt fejlsøgningsniveau-specifikation '%s'"
+msgstr "ukendt specifikation af fejlsøgningsniveau \"%s\""
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
-msgstr ""
+msgstr "ukendt type \"%s\" af output-sync"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Afbrydelse/undtagelse fanget (kode = 0x%lx, addr = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1088,135 +1097,146 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Adgangskrænkelse: skriveoperation på adresse 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Adgangskrænkelse: læseoperation på adresse 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() sætter default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell()-stisøgning sætter default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s er standset i 30 sekunder..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "udført sleep(30). Fortsætter.\n"
-
-#: main.c:1627
-#, fuzzy
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
-"advarsel: jobserver ikke tilgængelig: bruger -j1. Tilføj '+' til "
+"advarsel: jobserver ikke tilgængelig: bruger -j1. Tilføj \"+\" til "
 "ophavsmakeregel."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr "advarsel: tvunget -jN i undermake: slår jobserver tilstand fra."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefil fra standard-ind er angivet to gange."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (midlertidig fil)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (midlertidig fil)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "advarsel: tvunget -jN i undermake: slår jobserver tilstand fra."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Parallelle job (-j) er ikke understøttet på denne platform."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Sætter tilbage til enkelt job-tilstand (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Symbolske lænker understøttes ikke: Deaktiverer -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Opdaterer makefiler....\n"
 
-#: main.c:2195
-#, fuzzy, c-format
+#: src/main.c:2226
+#, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
-msgstr "Makefilen '%s' får måske make til at gå i ring; genskaber den ikke.\n"
+msgstr ""
+"Makefilen \"%s\" får måske make til at køre i ring; genskaber den ikke.\n"
 
-#: main.c:2279
-#, fuzzy, c-format
+#: src/main.c:2303
+#, c-format
 msgid "Failed to remake makefile '%s'."
-msgstr "Genskabelse af makefilen '%s' mislykkedes."
+msgstr "Genskabelse af makefilen \"%s\" mislykkedes."
 
-#: main.c:2299
-#, fuzzy, c-format
+#: src/main.c:2323
+#, c-format
 msgid "Included makefile '%s' was not found."
-msgstr "Inkluderet makefil '%s' blev ikke fundet."
+msgstr "Inkluderet makefil \"%s\" blev ikke fundet."
 
-#: main.c:2304
-#, fuzzy, c-format
+#: src/main.c:2328
+#, c-format
 msgid "Makefile '%s' was not found"
-msgstr "Makefil '%s' blev ikke fundet."
+msgstr "Makefilen \"%s\" blev ikke fundet"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Kunne ikke skifte tilbage til det originale katalog."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Udfører igen[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (midlertidig fil): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL indeholder mere end et mål"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Ingen angivne mål og ingen makefil fundet"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Ingen mål"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Ingen angivne mål og ingen makefil fundet"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Opdaterer endemål....\n"
 
-#: main.c:2579
+# build?
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
-msgstr "advarsel: Fejl i urets tid opdaget. Din bygning kan være ukomplet."
+msgstr ""
+"advarsel: Der blev registreret en uoverensstemmelse i urets tid. Din "
+"kompilering kan være ufuldstændig."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Brug: %s [tilvalg] [mål] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1225,7 +1245,7 @@ msgstr ""
 "\n"
 "Dette program er bygget til %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1234,32 +1254,32 @@ msgstr ""
 "\n"
 "Dette program er bygget til %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Send fejlmeldinger (på engelsk) til <bug-make@gnu.org>.\n"
 
-#: main.c:2870
-#, fuzzy, c-format
+#: src/main.c:2901
+#, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
-msgstr "'-%s%s'-tilvalget kræver et strengargument, der ikke er tomt"
+msgstr "\"-%s%s\"-tilvalget kræver et strengargument, der ikke er tomt"
 
-#: main.c:2934
-#, fuzzy, c-format
+#: src/main.c:2965
+#, c-format
 msgid "the '-%c' option requires a positive integer argument"
-msgstr "'-%c'-tilvalget kræver et positivt heltalligt argument"
+msgstr "\"-%c\"-tilvalget kræver et positivt heltalligt argument"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sBygget til %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sBygget til %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1272,7 +1292,7 @@ msgstr ""
 "%sDer gives INGEN GARANTI i den grad, som dette tillades af loven.\n"
 
 # %s giver dato og klokkeslæt
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1282,7 +1302,7 @@ msgstr ""
 "# Makedatabase, udskrevet %s"
 
 # %s giver dato og klokkeslæt
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1291,516 +1311,544 @@ msgstr ""
 "\n"
 "# Afsluttet makedatabase %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Ukendt fejl %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: bruger %lu (reelt %lu), gruppe %lu (reelt %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Indledende adgang"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Brugeradgang"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Make-adgang"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Barneadgang"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Går til et ukendt katalog\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Forlader et ukendt katalog\n"
 
-#: output.c:109
-#, fuzzy, c-format
+#: src/output.c:102
+#, c-format
 msgid "%s: Entering directory '%s'\n"
-msgstr "%s: Går til katalog '%s'\n"
+msgstr "%s: Går til katalog \"%s\"\n"
 
-#: output.c:111
-#, fuzzy, c-format
+#: src/output.c:104
+#, c-format
 msgid "%s: Leaving directory '%s'\n"
-msgstr "%s: Forlader katalog '%s'\n"
+msgstr "%s: Forlader katalog \"%s\"\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Går til et ukendt katalog\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Forlader et ukendt katalog\n"
 
-#: output.c:120
-#, fuzzy, c-format
+#: src/output.c:113
+#, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
-msgstr "%s[%u]: Går til katalog '%s'\n"
+msgstr "%s[%u]: Går til katalog \"%s\"\n"
 
-#: output.c:122
-#, fuzzy, c-format
+#: src/output.c:115
+#, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
-msgstr "%s[%u]: Forlader katalog '%s'\n"
+msgstr "%s[%u]: Forlader katalog \"%s\"\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
-msgstr "skrivefejl: %s"
+msgstr "skrivefejl: stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Stop.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+# build?
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"-O[TYPE] (--output-sync[=TYPE]) er ikke konfigureret til denne kompilering."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
-msgstr "oprettelse af jobledning"
+msgstr "opretter job-pipe"
 
-#: posixos.c:72 posixos.c:227
-#, fuzzy
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
-msgstr "oprettelse af jobledning"
+msgstr "kopierer job-pipe"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
-msgstr "klargøring af jobserver-ledning"
+msgstr "klargøring af jobserver-pipe"
 
-#: posixos.c:90
-#, fuzzy, c-format
+#: src/posixos.c:119
+#, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
-msgstr "intern fejl: ugyldig '--jobserver-fds'-streng '%s'"
+msgstr "intern fejl: ugyldig \"--jobserver-auth\"-streng \"%s\""
 
 # fd = fildeskriptor
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Jobserverklient (fd'er %d,%d)\n"
 
-#: posixos.c:109
-#, fuzzy
+#: src/posixos.c:138
 msgid "jobserver pipeline"
-msgstr "klargøring af jobserver-ledning"
+msgstr "jobserver-pipe"
 
-#: posixos.c:154
+# ?
+#: src/posixos.c:186
 msgid "write jobserver"
-msgstr "write jobserver"
+msgstr "skriv jobserver"
 
-#: posixos.c:268
-#, fuzzy
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
-msgstr "read jobs pipe"
+msgstr "pselect job-pipe"
 
-#: posixos.c:279 posixos.c:391
+# ?
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
-msgstr "read jobs pipe"
+msgstr "læs job-pipe"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Læser makefiler...\n"
 
-#: read.c:329
-#, fuzzy, c-format
+#: src/read.c:336
+#, c-format
 msgid "Reading makefile '%s'"
-msgstr "Læser makefil '%s'"
+msgstr "Læser makefilen \"%s\""
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (ingen standard-endemål)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (søgesti)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (ikke nødvendig)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (ingen ~-udfoldning)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
-msgstr ""
+msgstr "Springer UTF-8-BOM over i makefilen \"%s\"\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
-msgstr ""
+msgstr "Springer UTF-8-BOM over i makefilbuffer\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "ugyldig syntaks i betingelse"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
-msgstr ""
+msgstr "%s: kunne ikke indlæse"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "kommandoer begynder før første mål"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "manglende regel før kommandoer"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
-msgstr " (mente du TAB i stedet for 8 mellemrum?)"
+msgstr "manglende skilletegn (mente du TAB i stedet for 8 mellemrum?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "manglende adskiller%s"
+msgstr "manglende skilletegn"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "manglende målmønster"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "flere målmønstre"
 
-#: read.c:1268
-#, fuzzy, c-format
+#: src/read.c:1289
+#, c-format
 msgid "target pattern contains no '%%'"
-msgstr "målmønster indeholder ingen '%%'"
+msgstr "målmønster indeholder ingen \"%%\""
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
-msgstr "manglende 'endif'"
+msgstr "mangler \"endif\""
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "tomt variabelnavn"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
-msgstr "overskydende tekst efter 'define'-direktiv"
+msgstr "overskydende tekst efter \"define\"-direktiv"
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
-msgstr "manglende 'endef', uafsluttet 'define'"
+msgstr "manglende \"endef\", uafsluttet \"define\""
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
-msgstr "overskydende tekst efter 'endef'-direktiv"
+msgstr "overskydende tekst efter \"endef\"-direktiv"
 
-#: read.c:1588
-#, fuzzy, c-format
+#: src/read.c:1603
+#, c-format
 msgid "extraneous text after '%s' directive"
-msgstr "Overskydende tekst efter '%s'-direktiv"
+msgstr "overskydende tekst efter \"%s\"-direktiv"
 
-#: read.c:1589
-#, fuzzy, c-format
+#: src/read.c:1604
+#, c-format
 msgid "extraneous '%s'"
-msgstr "fremmed '%s'"
+msgstr "overskydende \"%s\""
 
-#: read.c:1617
-#, fuzzy
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
-msgstr "kun én 'else' per betingelse"
+msgstr "kun én \"else\" per betingelse"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Misdannet målspecifik variabeldefinition"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "der kan ikke defineres forudsætninger i kommandoer"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "blandede implicitte og statiske mønsterregler"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "blandede implicitte og normale regler"
 
-#: read.c:2085
-#, fuzzy, c-format
+#: src/read.c:2107
+#, c-format
 msgid "target '%s' doesn't match the target pattern"
-msgstr "mål '%s' passer ikke til målmønstret"
+msgstr "målet \"%s\" passer ikke til målmønstret"
 
-#: read.c:2100 read.c:2146
-#, fuzzy, c-format
+#: src/read.c:2122 src/read.c:2168
+#, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr "målfil '%s' har både :- og ::-angivelser"
+msgstr "målfilen \"%s\" har både :- og ::-angivelser"
 
-#: read.c:2106
-#, fuzzy, c-format
+#: src/read.c:2128
+#, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr "target '%s' optræder mere end én gang i samme regel."
+msgstr "målet \"%s\" optræder mere end én gang i samme regel"
 
-#: read.c:2116
-#, fuzzy, c-format
+#: src/read.c:2138
+#, c-format
 msgid "warning: overriding recipe for target '%s'"
-msgstr "advarsel: tilsidesætter kommandoer for mål '%s'"
+msgstr "advarsel: tilsidesætter opskrift for målet \"%s\""
 
-#: read.c:2119
-#, fuzzy, c-format
+#: src/read.c:2141
+#, c-format
 msgid "warning: ignoring old recipe for target '%s'"
-msgstr "advarsel: ignorerer gamle kommandoer for mål '%s'"
+msgstr "advarsel: ignorerer gammel opskrift for målet \"%s\""
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
-msgstr "blandede implicitte og normale regler"
+msgstr "*** blandede implicitte og normale regler: forældet syntaks"
 
-#: read.c:2542
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "advarsel: tilsidesætter opskrift for målet \"%s\""
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "advarsel: NUL-tegn set; resten af linjen ignoreres"
 
-#: remake.c:226
-#, fuzzy, c-format
+#: src/remake.c:226
+#, c-format
 msgid "Nothing to be done for '%s'."
-msgstr "Ingenting at gøre for '%s'."
+msgstr "Ingenting at gøre for \"%s\"."
 
-#: remake.c:227
-#, fuzzy, c-format
+#: src/remake.c:227
+#, c-format
 msgid "'%s' is up to date."
-msgstr "'%s' er tidssvarende."
+msgstr "\"%s\" er tidssvarende."
 
-#: remake.c:323
-#, fuzzy, c-format
+#: src/remake.c:323
+#, c-format
 msgid "Pruning file '%s'.\n"
-msgstr "Beskærer fil '%s'.\n"
+msgstr "Beskærer fil \"%s\".\n"
 
-#: remake.c:406
-#, fuzzy, c-format
+#: src/remake.c:389
+#, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
-msgstr "%sIngen regel til at skabe mål '%s' som behøves af '%s'%s"
+msgstr "%sIngen regel til at skabe målet \"%s\" som behøves af \"%s\"%s"
 
-#: remake.c:416
-#, fuzzy, c-format
+#: src/remake.c:399
+#, c-format
 msgid "%sNo rule to make target '%s'%s"
-msgstr "%sIngen regel til at skabe mål '%s'%s"
+msgstr "%sIngen regel til at skabe målet \"%s\"%s"
 
-#: remake.c:442
-#, fuzzy, c-format
+#: src/remake.c:425
+#, c-format
 msgid "Considering target file '%s'.\n"
-msgstr "Overvejer målfil '%s'.\n"
+msgstr "Overvejer målfilen \"%s\".\n"
 
-#: remake.c:449
-#, fuzzy, c-format
+#: src/remake.c:432
+#, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
-msgstr "Opdatering af fil '%s' er forgæves prøvet for nylig.\n"
+msgstr "Opdatering af fil \"%s\" er forgæves prøvet for nylig.\n"
 
-#: remake.c:461
-#, fuzzy, c-format
+#: src/remake.c:444
+#, c-format
 msgid "File '%s' was considered already.\n"
-msgstr "Fil '%s' er allerede overvejet.\n"
+msgstr "Filen \"%s\" er allerede overvejet.\n"
 
-#: remake.c:471
-#, fuzzy, c-format
+#: src/remake.c:454
+#, c-format
 msgid "Still updating file '%s'.\n"
-msgstr "Opdaterer stadig fil '%s'.\n"
+msgstr "Opdaterer stadig fil \"%s\".\n"
 
-#: remake.c:474
-#, fuzzy, c-format
+#: src/remake.c:457
+#, c-format
 msgid "Finished updating file '%s'.\n"
-msgstr "Opdatering af fil '%s' afsluttet.\n"
+msgstr "Opdatering af fil \"%s\" afsluttet.\n"
 
-#: remake.c:503
-#, fuzzy, c-format
+#: src/remake.c:486
+#, c-format
 msgid "File '%s' does not exist.\n"
-msgstr "Filen '%s' findes ikke.\n"
+msgstr "Filen \"%s\" findes ikke.\n"
 
-#: remake.c:511
-#, fuzzy, c-format
+#: src/remake.c:494
+#, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
-"*** Advarsel: .LOW_RESOLUTION_TIME-fil '%s' har et tidsstempel med høj "
+"*** Advarsel: .LOW_RESOLUTION_TIME-fil \"%s\" har et tidsstempel med høj "
 "opløsning"
 
-#: remake.c:524 remake.c:1056
-#, fuzzy, c-format
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
 msgid "Found an implicit rule for '%s'.\n"
-msgstr "Fandt en implicit regel for '%s'.\n"
+msgstr "Fandt en implicit regel for \"%s\".\n"
 
-#: remake.c:526 remake.c:1058
-#, fuzzy, c-format
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
 msgid "No implicit rule found for '%s'.\n"
-msgstr "Ingen implicit regel for '%s' fundet.\n"
+msgstr "Ingen implicit regel for \"%s\" fundet.\n"
 
-#: remake.c:532
-#, fuzzy, c-format
+#: src/remake.c:515
+#, c-format
 msgid "Using default recipe for '%s'.\n"
-msgstr "Bruger standardkommandoer for '%s'.\n"
+msgstr "Bruger standardopskrift for \"%s\".\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Cirkulær %s <- %s afhængighed opgivet."
 
-#: remake.c:691
-#, fuzzy, c-format
+#: src/remake.c:674
+#, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
-msgstr "Afsluttet forudsætningerne for målfil '%s'.\n"
+msgstr "Afsluttede forudsætningerne for målfilen \"%s\".\n"
 
-#: remake.c:697
-#, fuzzy, c-format
+#: src/remake.c:680
+#, c-format
 msgid "The prerequisites of '%s' are being made.\n"
-msgstr "Forudsætningerne for '%s' er ved at blive skabt.\n"
+msgstr "Forudsætningerne for \"%s\" er ved at blive skabt.\n"
 
-#: remake.c:711
-#, fuzzy, c-format
+#: src/remake.c:694
+#, c-format
 msgid "Giving up on target file '%s'.\n"
-msgstr "Opgiver målfil '%s'.\n"
+msgstr "Opgiver målfil \"%s\".\n"
 
-#: remake.c:716
-#, fuzzy, c-format
+#: src/remake.c:699
+#, c-format
 msgid "Target '%s' not remade because of errors."
-msgstr "Målet '%s' ikke genskabt på grund af fejl."
+msgstr "Målet \"%s\" ikke genskabt på grund af fejl."
 
-#: remake.c:768
-#, fuzzy, c-format
+#: src/remake.c:751
+#, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
-msgstr "Forudsætningen '%s' angiver kun rækkefølgen ift. målet '%s'.\n"
+msgstr "Forudsætningen \"%s\" angiver kun rækkefølgen ift. målet \"%s\".\n"
 
-#: remake.c:773
-#, fuzzy, c-format
+#: src/remake.c:756
+#, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
-msgstr "Forudsætningen '%s' for målet '%s' findes ikke.\n"
+msgstr "Forudsætningen \"%s\" for målet \"%s\" findes ikke.\n"
 
-#: remake.c:778
-#, fuzzy, c-format
+#: src/remake.c:761
+#, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
-msgstr "Forudsætningen '%s' er nyere end målet '%s'.\n"
+msgstr "Forudsætningen \"%s\" er nyere end målet \"%s\".\n"
 
-#: remake.c:781
-#, fuzzy, c-format
+#: src/remake.c:764
+#, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
-msgstr "Forudsætningen '%s' er ældre end målet '%s'.\n"
+msgstr "Forudsætningen \"%s\" er ældre end målet \"%s\".\n"
 
-#: remake.c:799
-#, fuzzy, c-format
+#: src/remake.c:782
+#, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
-msgstr "Målet '%s' er med dobbelt-kolon og har ingen forudsætninger.\n"
+msgstr "Målet \"%s\" er med dobbelt-kolon og har ingen forudsætninger.\n"
 
-#: remake.c:806
-#, fuzzy, c-format
+#: src/remake.c:789
+#, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
-msgstr "Ingen kommandoer til '%s', og ingen forudsætninger har ændret sig.\n"
+msgstr "Ingen opskrift til \"%s\", og ingen forudsætninger har ændret sig.\n"
 
-#: remake.c:811
-#, fuzzy, c-format
+#: src/remake.c:794
+#, c-format
 msgid "Making '%s' due to always-make flag.\n"
-msgstr "Skaber '%s' pga. \"always-make\"-flag.\n"
+msgstr "Skaber \"%s\" pga. \"always-make\"-flag.\n"
 
-#: remake.c:819
-#, fuzzy, c-format
+#: src/remake.c:802
+#, c-format
 msgid "No need to remake target '%s'"
-msgstr "Ingen grund til at genskabe målet '%s'"
+msgstr "Ingen grund til at genskabe målet \"%s\""
 
-#: remake.c:821
-#, fuzzy, c-format
+#: src/remake.c:804
+#, c-format
 msgid "; using VPATH name '%s'"
-msgstr "; bruger VPATH-navnet '%s'"
+msgstr "; bruger VPATH-navnet \"%s\""
 
-#: remake.c:841
-#, fuzzy, c-format
+#: src/remake.c:824
+#, c-format
 msgid "Must remake target '%s'.\n"
-msgstr "Skal genskabe målet '%s'.\n"
+msgstr "Skal genskabe målet \"%s\".\n"
 
-#: remake.c:847
-#, fuzzy, c-format
+#: src/remake.c:830
+#, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
-msgstr " Ignorerer VPATH-navnet '%s'.\n"
+msgstr " Ignorerer VPATH-navnet \"%s\".\n"
 
-#: remake.c:856
-#, fuzzy, c-format
+#: src/remake.c:839
+#, c-format
 msgid "Recipe of '%s' is being run.\n"
-msgstr "Kommandoerne for '%s' er ved at blive kørt.\n"
+msgstr "Opskriften for \"%s\" er ved at blive kørt.\n"
 
-#: remake.c:863
-#, fuzzy, c-format
+#: src/remake.c:846
+#, c-format
 msgid "Failed to remake target file '%s'.\n"
-msgstr "Genskabelse af målfil '%s' mislykkedes.\n"
+msgstr "Genskabelse af målfilen \"%s\" mislykkedes.\n"
 
-#: remake.c:866
-#, fuzzy, c-format
+#: src/remake.c:849
+#, c-format
 msgid "Successfully remade target file '%s'.\n"
-msgstr "Målfil '%s' genskabt.\n"
+msgstr "Målfilen \"%s\" genskabt.\n"
 
-#: remake.c:869
-#, fuzzy, c-format
+#: src/remake.c:852
+#, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
-msgstr "Med -q trænger målfilen '%s' til at blive genskabt.\n"
+msgstr "Det er nødvendigt at genskabe målfilen \"%s\" med -q.\n"
 
-#: remake.c:1064
-#, fuzzy, c-format
+#: src/remake.c:1047
+#, c-format
 msgid "Using default commands for '%s'.\n"
-msgstr "Bruger standardkommandoer for '%s'.\n"
+msgstr "Bruger standardkommandoer for \"%s\".\n"
 
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Advarsel: Ændringstiden for filen '%s' er i fremtiden"
-
-#: remake.c:1444
-#, fuzzy, c-format
+#: src/remake.c:1422
+#, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
-msgstr "Advarsel: Filen '%s' har ændringstidspunkt %s s i fremtiden"
+msgstr "Advarsel: Filen \"%s\" har modifikationstidspunkt %s s i fremtiden"
 
-#: remake.c:1647
-#, fuzzy, c-format
+#: src/remake.c:1662
+#, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
-msgstr ".LIBPATTERNS-element '%s' er ikke et mønster"
+msgstr ".LIBPATTERNS-elementet \"%s\" er ikke et mønster"
 
 # "remote job exportation interface to the Customs daemon": jeg aner ikke
 # hvad der er tale om. I øvrigt ser remote-cstms.c forældet/ubrugt ud, og
 # koden er ikke understøttet af GNU...
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs kan ikke eksporteres: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
 msgstr ""
 "\n"
-"# Implicitte regler."
+"# Implicitte regler"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1808,274 +1856,274 @@ msgstr ""
 "\n"
 "# Ingen implicitte regler."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u implicitte regler, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminale."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "FEJL: forkert num_pattern_rules!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "ukendt signal"
 
 # De fleste af signalnavnene fra signame.c er kopieret fra libc.da.po,
 # kun ganske enkelte findes ikke der.
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Læg på"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Afbrudt"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Afslut"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Ulovlig instruktion"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Sporings-/stoppunkts-fælde"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Afbrudt"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT_fælde"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Emulatorfælde"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Undtagelsestilfælde ved flydendetals-operation"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Dræbt"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Busfejl"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Lagersegmentfejl"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Ugyldigt systemkald"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
-msgstr "Røret blev brudt"
+msgstr "Pipe blev brudt"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarmen gik"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Termineret"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Brugerdefineret signal 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Brugerdefineret signal 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Barnet afsluttet"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Strømmen gik"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Stoppet"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Stoppet (ville læse fra tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Stoppet (ville skrive til tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Stoppet (signal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Begrænsning af CPU-tid overskredet"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Grænse for filstørrelse overskredet"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtuel tidsgrænse overskredet"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Profileringstiden udløb"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Vinduet blev ændret"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Fortsættes"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Kritisk I/O-tilstand"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O mulig"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Resurse tabt"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Faresignal"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Informationsforespørgsel"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Flydendetalshjælpeprocessor ikke tilgængelig"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
+"\n"
+"%s Ingen strcache-buffere\n"
 
-#: strcache.c:304
-#, fuzzy, c-format
+#: src/strcache.c:304
+#, c-format
 msgid ""
 "\n"
 "%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
 "B\n"
 msgstr ""
-"%s strcache brugt: total = %d (%d) / maks = %d / min = %d / gnmsn = %d\n"
+"\n"
+"%s strcache-buffere: %lu (%lu) / strenge = %lu / lager = %lu B / middel = "
+"%lu B\n"
 
-#: strcache.c:308
-#, c-format
+#: src/strcache.c:308
+#, fuzzy, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
+"%s nuværende buf: størrelse = %hu B / brugt = %hu B / antal = %hu / middel = "
+"%hu B\n"
 
-#: strcache.c:319
-#, fuzzy, c-format
+# Ikke sikker på hvad %s er
+#: src/strcache.c:319
+#, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
-msgstr ""
-"%s strcache brugt: total = %d (%d) / maks = %d / min = %d / gnmsn = %d\n"
+msgstr "%s øvrigt brugt: i alt = %lu B / antal = %lu / middel = %lu B\n"
 
-#: strcache.c:322
-#, fuzzy, c-format
+#: src/strcache.c:322
+#, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
-msgstr "%s strcache fri: total = %d (%d) / maks = %d / min = %d / gnmsn = %d\n"
+msgstr ""
+"%s øvrigt frit: i alt = %lu B / maks = %lu B / min = %lu B / middel = %hu B\n"
 
-#: strcache.c:326
-#, fuzzy, c-format
+#: src/strcache.c:326
+#, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 "\n"
-"%s # strenge i strcache: %d / opslag = %lu / fundne = %lu\n"
+"%s strcache-ydelse: opslag = %lu / træffere = %lu%%\n"
 
-#: strcache.c:328
-#, fuzzy
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
-"\n"
-"# Statistik for fil-hash-spande:\n"
+"# statistik for hashtabel:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatisk"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "forvalgt"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "miljø"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefil"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "miljø med -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "kommandolinje"
 
-#: variable.c:1647
-#, fuzzy
+#: src/variable.c:1671
 msgid "'override' directive"
-msgstr "'override'-direktiv"
+msgstr "\"override\"-direktiv"
 
-#: variable.c:1658
-#, fuzzy, c-format
+#: src/variable.c:1682
+#, c-format
 msgid " (from '%s', line %lu)"
-msgstr " (fra '%s', linje %lu)"
+msgstr " (fra \"%s\", linje %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# Statistik for variabelsæt-hash-spande:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2083,7 +2131,7 @@ msgstr ""
 "\n"
 "# Variabler\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2091,7 +2139,7 @@ msgstr ""
 "\n"
 "# Mønsterspecifikke variabelværdier"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2099,7 +2147,7 @@ msgstr ""
 "\n"
 "# Ingen mønsterspecifikke variabelværdier."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2108,48 +2156,48 @@ msgstr ""
 "\n"
 "# %u mønsterspecifikke variabelværdier"
 
-#: variable.h:224
-#, fuzzy, c-format
+#: src/variable.h:229
+#, c-format
 msgid "warning: undefined variable '%.*s'"
-msgstr "advarsel: udefineret vaiabel '%.*s'"
+msgstr "advarsel: udefineret variabel \"%.*s\""
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() mislykkedes med %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-advarsel, du kan blive nødt til at genetablere CTRL-Y-behandling fra DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BUILTIN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
-msgstr ""
+msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Tilføj uddata til slutningen af %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Tilføj %.*s og ryd op\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Udfører i stedet %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2157,72 +2205,92 @@ msgstr ""
 "\n"
 "# VPATH-søgestier\n"
 
-#: vpath.c:620
-#, fuzzy
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
-msgstr "# Ingen 'vpath'-søgestier."
+msgstr "# Ingen \"vpath\"-søgestier."
 
-#: vpath.c:622
-#, fuzzy, c-format
+#: src/vpath.c:622
+#, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 "\n"
-"# %u 'vpath'-søgestier.\n"
+"# %u \"vpath\"-søgestier.\n"
 
-#: vpath.c:625
-#, fuzzy
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 "\n"
-"# Ingen generel ('VPATH'-variabel) søgesti."
+"# Ingen generel (\"VPATH\"-variabel) søgesti."
 
-#: vpath.c:631
-#, fuzzy
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 "\n"
-"# Generel ('VPATH'-variabel) søgesti:\n"
+"# Generel (\"VPATH\"-variabel) søgesti:\n"
 "# "
 
-# fd = fildeskriptor
-#: w32/w32os.c:46
-#, fuzzy, c-format
+#: src/w32/w32os.c:44
+#, c-format
 msgid "Jobserver slots limited to %d\n"
-msgstr "Jobserverklient (fd'er %d,%d)\n"
+msgstr "Jobserverpladser begrænset til %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
-msgstr ""
+msgstr "opretter jobserver-semafor: (Fejl %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
-msgstr ""
+msgstr "intern fejl: kan ikke åbne jobserver-semafor \"%s\": (Fejl %ld: %s)"
 
-# fd = fildeskriptor
-#: w32/w32os.c:84
-#, fuzzy, c-format
+#: src/w32/w32os.c:82
+#, c-format
 msgid "Jobserver client (semaphore %s)\n"
-msgstr "Jobserverklient (fd'er %d,%d)\n"
+msgstr "Jobserverklient (semafor %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
-msgstr ""
+msgstr "frigiv jobserver-semafor: (Fejl %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
-msgstr ""
+msgstr "ventende på semafor eller underproces: (Fejl %ld: %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Kommando ikke fundet\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Kommando ikke fundet\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s; Skalprogram ikke fundet"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s er standset i 30 sekunder..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "udført sleep(30). Fortsætter.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Ukendt fejl %d"
+
+# "modifikationstid" her fordi ændringstid er 'change time' som er noget andet!
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Advarsel: Modifikationstiden for filen \"%s\" er i fremtiden"
+
+#~ msgid " terminal."
+#~ msgstr " terminale."
 
 #~ msgid "#  Invalid value in `update_status' member!"
 #~ msgstr "#  Ugyldig værdi i 'update_status'-felt!"
index 3ba26cd1d7af3cab9242ed08429b53c8b183b5c5..4d9301bd519c5cd73d71486b9592273152812d3f 100644 (file)
Binary files a/po/de.gmo and b/po/de.gmo differ
index ada4fc38587fbea900cf4beba108778c4f784a75..8359f3b6fe348d5451428dffde23e9093a58a3e8 100644 (file)
--- a/po/de.po
+++ b/po/de.po
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.1.90\n"
+"Project-Id-Version: make 4.2.1\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-04-25 09:47+0200\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2016-06-20 15:03+0200\n"
 "Last-Translator: Philipp Thomas <pth@suse.de>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "Versuch, eine nicht unterstützte Funktionalität zu verwenden: „%s“"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr ""
 "VMS bietet keine Möglichkeit einer Änderung \n"
 "der Zeitmarken von Archiveinträgen"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Archiv „%s“ existiert nicht"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: „%s“ ist kein gültiges Archiv"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Eintrag „%s“ existiert nicht in „%s“"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr ""
 "touch: Ungültiger Rückgabewert beim Zugriff \n"
 "von ar_member_touch auf „%s“"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "„lbr$set_module()“ konnte keine Modulinformation auslesen; Status = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "„lbr$ini_control()“ scheiterte mit Status = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
 "Die Bibliothek „%s“ konnte nicht geöffnet werden um nach Eintragsstatus %d "
 "zu suchen"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr ""
 "Eintrag „%s“ %s: \n"
 "%ld Bytes an Position %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (der Name ist möglicherweise abgeschnitten)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Datum %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  Nutzer-ID = %d, Gruppen-ID = %d, Modus = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Die Regel hat zu viele Zeilen (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Abbruch.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Archiveintrag „%s“ ist möglicherweise falsch; nicht gelöscht"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Archiveintrag „%s“ ist möglicherweise falsch; nicht gelöscht"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Datei „%s“ wird gelöscht"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Datei „%s“ wird gelöscht"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  Auszuführende Regel"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (eingebaut):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (aus „%s“, Zeile %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -146,234 +148,234 @@ msgstr ""
 "\n"
 "# Verzeichnisse\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: Status konnte nicht festgestellt werden.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr ""
-"# %s ( Schlüssel (key) %s,  letzte Änderung (mtime) %d): \n"
+"# %s ( Schlüssel %s,  letzte Änderung %I64u): Öffnen scheiterte.\n"
 "Konnte nicht geöffnet werden.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr ""
 "# %s (Gerät %d, Inode [%d,%d,%d]): \n"
 "Konnte nicht geöffnet werden.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr ""
 "# %s (Gerät %ld, Inode %ld): \n"
 "Konnte nicht geöffnet werden.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (Schlüssel (key) %s,  letzte Änderung (mtime) %d): "
+msgstr "# %s (Schlüssel %s,  letzte Änderung %%I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (Gerät %d, Inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (Gerät %ld, Inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Keine"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " Dateien, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "keine"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " Unmöglichkeiten"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " bisher."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " Unmöglichkeiten in %lu Verzeichnissen.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Rekursive Variable „%s“ referenziert sich (schließlich) selbst"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "Nicht abgeschlossene Variablenreferenz"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Die Regel für die Datei „%s“ wurde in %s angegeben:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
 "Die Regel für die Datei „%s“ wurden aufgrund \n"
 "der Suche nach impliziten Regeln gefunden,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr ""
 "aber „%s“ wird jetzt als dieselbe Datei \n"
 "wie „%s“ betrachtet."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 "Die Regel für „%s“ wird ignoriert, \n"
 "die für „%s“ wird bevorzugt."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 "„%s“ mit einfachem Doppelpunkt kann nicht in \n"
 "„%s“ mit doppeltem Doppelpunkt geändert werden"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 "„%s“ mit doppeltem Doppelpunkt kann nicht in \n"
 "„%s“ mit einfachem Doppelpunkt geändert werden"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Löschen der übergangsweise angelegten Datei „%s“"
 
-#: file.c:412
+#: src/file.c:412
+#, fuzzy, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Die übergangsweise angelegte Datei „%s“ wird gelöscht...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Aktuelle Zeit"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Zeitstempel außerhalb des Gültigkeitsbereichs; %s wird ersetzt"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Dies ist kein Ziel:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Wertvolle Datei (benötigt von .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Vorgetäuschtes Ziel (benötigt von .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Kommandozeilen-Ziel (target)."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Eine standardmässige, MAKEFILES oder -include/sinclude Makedatei."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "# Eingebaute Regel"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Die Suche nach impliziten Regeln wurde durchgeführt."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Die Suche nach impliziten Regeln wurde nicht durchgeführt."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Wurzel impliziter/statischer Muster: „%s“\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Datei ist ein Zwischenschritt in den Abhängigkeiten."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Erzeugt außerdem:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Zeit der letzten Änderung wurde nicht überprüft."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Die Datei existiert nicht."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Datei ist sehr alt."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Zuletzt geändert %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Datei wurde aktualisiert."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Datei wurde nicht aktualisiert."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Derzeit laufende Regel (DAS IST EIN FEHLER)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Derzeit läuft die Regel für Abhängigkeiten (DAS IST EIN FEHLER)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Erfolgreich aktualisiert."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Eine Aktualisierung ist notwendig (-q ist angegeben)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Aktualisierung ist fehlgeschlagen."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Ungültiger Wert im „command_state“-Strukturelement!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -381,7 +383,7 @@ msgstr ""
 "\n"
 "# Dateien"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -391,337 +393,345 @@ msgstr ""
 "# Statistik der Hash-Tabelle für Dateien:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Feld „%s“ wird nicht zwischengespeichert: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "Nicht-numerisches erstes Argument für die „word“-Funktion"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "Das erste Argument für  die „word“-Funktion muss größer als 0 sein"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "Nicht-numerisches erstes Argument für die „wordlist“-Funktion"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "Nicht-numerisches zweites Argument zur „wordlist“-Funktion"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "„windows32_openpipe“: „DuplicateHandle(In)“ schlug fehl (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "„cwindows32_openpipe“: „DuplicateHandle(Err)“ schlug fehl (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "„CreatePipe()“ schlug fehl (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() schlug fehl\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Die temporäre Stapelverarbeitungsdatei %s wird gelöscht\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "Datei: fehlender Dateiname"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "Öffnen: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "Schreiben: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "schließend: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "Datei: zu viele Argumente"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "Lesen: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "Unzulässige Dateioperation: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "Zuwenig Argumente (%d) für die Funktion „%s“"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "Auf dieser Rechnerkonfiguration nicht implementiert: Funktion „%s“"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "Nicht beendeter Aufruf der Funktion „%s“: „%c“ fehlt"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Leerer Funktionsname"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Unzulässiger Funktionsname: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Der Funktionsname ist zu lang: %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "Ungültige minimale Anzahl von Argumenten (%d) für die Funktion „%s“"
+msgstr "Ungültige minimale Anzahl von Argumenten (%u) für die Funktion „%s“"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "Ungülte maximale Anzahl an Argumenten (%d) für die Funktion „%s“"
+msgstr "Ungülte maximale Anzahl an Argumenten (%u) für die Funktion „%s“"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: Option „%s“ ist mehrdeutig\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: Option „--%s“ erlaubt kein Argument\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: Option „%c%s“ erlaubt kein Argument\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: Option „%s“ erfordert ein Argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: unbekannte Option „--%s“\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: unbekannte Option „%c%s“\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: unzulässige Option -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: ungültige Option -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: Option erfordert ein Argument -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: Option „-W %s“ ist mehrdeutig\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: Option „-W %s“ erlaubt kein Argument\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Verarbeite „%s“\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: begutachte „%s“\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 "es können keine %lu Bytes für die Hashtabelle reserviert werden: "
 "Hauptspeicher erschöpft"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Auslastung=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Rehash=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Kollisionen=%ld/%ld%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Es wird nach einer impliziten Regel für „%s“ gesucht.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr ""
 "Es wird nach einer impliziten Regel für Archiveinträge für „%s“ gesucht.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Rekursion in den impliziten Regeln wird vermieden.\n"
 
-#: implicit.c:486
-#, c-format
-msgid "Stem too long: '%.*s'.\n"
+#: src/implicit.c:484
+#, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr "Wurzel zu lang: „%.*s“.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Muster-Regel mit Wurzel „%.*s“ wird probiert.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Unmögliche Voraussetzung „%s“ für eine Regel wird abgelehnt.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Unmögliche implizite Voraussetzung „%s“ wird abgelehnt.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Regel-Voraussetzung „%s“ wird auprobiert.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Implizite Voraussetzung „%s“ wird ausprobiert.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Die Voraussetzung „%s“ wurde als VPATH „%s“ gefunden\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr ""
 "Es wird nach einer Regel mit der übergangsweise verwendeten Datei „%s“ "
 "gesucht.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Eine temporäre Datei kann nicht erzeugt werden\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (Speicherauszug erstellt)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ignoriert)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<eingebaut>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Fehler %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Es wird auf noch nicht beendete Prozesse gewartet...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Aktiver Kindprozess %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (entfernt)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Sammle erfolglosen Kindprozess %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Sammle erfolgreichen Kindprozess %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Sammle erfolglosen Kindprozess %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Lösche temporäre Stapelverarbeitungsdatei „%s“\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Löschen der temporären Stapelverarbeitungsdatei „%s“ scheiterte (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Entferne Kindprozess %p PID %s%s aus der Kette.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Token des Kindprozesses %p PID (%s) freigegeben.\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "„process_easy()“ konnte den Prozess nicht starten (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -730,103 +740,97 @@ msgstr ""
 "\n"
 "%d Argumente gehörten zum fehlgeschlagenen Prozessstart\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Nehme Kindprozess %p (%s) PID %s%s in die Kette auf.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Token für den Kindprozess %p (%s) erhalten.\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: Archiv „%s“ existiert nicht"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: Ziel „%s“ wird aktualisiert wegen: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
 "Auf diesem Betriebssystem kann die Einhaltung\n"
 "der Lastbeschränkung nicht erzwungen werden"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "Lasteinschränkung kann nicht erzwungen werden: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 "Keine weiteren Dateireferenzen verfügbar: die Standardeingabe konnte\n"
 "nicht dupliziert werden\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 "Keine weiteren Dateireferenzen verfügbar: die Standardausgabe konnte\n"
 "nicht dupliziert werden\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 "Keine weiteren Dateireferenzen verfügbar: Standardfehler konnte\n"
 "nicht dupliziert werden\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Die Standardeingabe konnte nicht wieder hergestellt werden\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Die Standardausgabe konnte nicht wieder hergestellt werden\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Standardfehler konnte nicht wieder hergestellt werden\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 "„make“ registrierte die Beendigung des Kindprozesses mit ID %s,\n"
 "wartet jedoch noch auf den Prozess mit ID %s.\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Kommando nicht gefunden\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Befehl nicht gefunden\n"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Shell-Programm wurde nicht gefunden"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: der Platz in der Programmumgebung könnte erschöpft sein"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL gewechselt (war „%s“, ist jetzt „%s“)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Temporäre Stapelverarbeitungsdatei %s wird erstellt\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -834,7 +838,7 @@ msgstr ""
 "Inhalt der Stapelverarbeitungsdatei:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -843,59 +847,55 @@ msgstr ""
 "Inhalt der Stapelverarbeitungsdatei:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (Zeile %d) Falscher Shell-Kontext (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-"-O[TYPE] (--output-sync[=TYPE]) ist für diese Bau-Aufgabe nicht konfiguriert."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Die globale Symboltabelle konnte nicht geöffnet werden: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Ds geladede Objekt %s wurde nicht als GPL-kompatibel deklariert"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Symbol %s konnte nicht aus %s geladen werden: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Zu ladedender Symbolname ist leer: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Symbol %s wird aus %s geladen\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Die Operation „load“ wird auf dieser Plattform nicht unterstützt."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Optionen:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 "  -b, -m                      Wird aus Kompatibilitätsgründen ignoriert\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Alle Ziele ohne Bedingungen erstellen\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -904,19 +904,19 @@ msgstr ""
 "                              In VERZEICHNIS wechseln, bevor etwas getan "
 "wird\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d                          Viele Informationen zur Fehlersuche ausgeben.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=KENNUNGEN]         Verschiedene Arten von Debug-Information "
 "ausgeben\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -925,14 +925,15 @@ msgstr ""
 "                              Umgebungsvariablen überschreiben „make“-"
 "Steuerdateien\n"
 
-#: main.c:353
+#: src/main.c:350
+#, fuzzy
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 "  --eval=ZEIENKETTE           ZEICHENKETTE wie einen Makedatei-Eintrag "
 "auswerten.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -940,15 +941,15 @@ msgstr ""
 "  -f DATEI, --file=DATEI, --makefile=DATEI\n"
 "                              DATEI als Makefile lesen\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Diese Meldung ausgeben und beenden\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Fehler in Regeln werden irgnoriert\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -957,7 +958,7 @@ msgstr ""
 "                              VERZEICHNIS nach eingebundenen\n"
 "                              Makedateien durchsuchen\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -966,14 +967,14 @@ msgstr ""
 "Anzahl \n"
 "                              von Jobs ohne Argument\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Weiterlaufen, auch wenn einige Targets nicht\n"
 "                              erzeugt werden konnten\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -983,7 +984,7 @@ msgstr ""
 "                              Keine Jobs starten bevor die Auslastung nicht "
 "unter N ist.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -992,7 +993,7 @@ msgstr ""
 "                              symbolischer Verküpfung und dem Ziel "
 "verwenden.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -1001,7 +1002,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Keine Regel ausführen, nur ausgeben.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -1011,7 +1012,7 @@ msgstr ""
 "                              DATEI als sehr alt ansehen und nicht neu "
 "erzeugen.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -1020,12 +1021,12 @@ msgstr ""
 "                              Synchronisiert die Ausgabe paralleler Jobs per "
 "TYP.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 "  -p, --print-data-base       Die interne Datenbank von „make“ ausgeben\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -1034,23 +1035,31 @@ msgstr ""
 "an, ob die Dateien\n"
 "                              aktuell sind\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Die eingebauten impliziten Regeln "
 "deaktivieren.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Die eingebauten Variablenbelegungen "
 "deaktivieren.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Regeln nicht ausgeben.\n"
 
-#: main.c:393
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Keine Regel ausführen; der Exit-Status gibt "
+"an, ob die Dateien\n"
+"                              aktuell sind\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1058,30 +1067,30 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              -k abschalten.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Die Ziele werden nur als aktualisiert "
 "markiert,\n"
 "                              nicht tatsächlich erneuert\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 "  --trace                     Viele Informationen zur Fehlersuche ausgeben\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Die Versionsnummer von „make“ ausgeben und "
 "Programm beenden\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Das aktuelle Verzeichnis ausgeben\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1089,7 +1098,7 @@ msgstr ""
 "  --no-print-directory        -w abschalten, selbst wenn es implizit "
 "eingeschaltet wurde.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1097,7 +1106,7 @@ msgstr ""
 "  -W DATEI, --what-if=DATEI, --new-file=DATEI, --assume-new=DATEI\n"
 "                              DATEI als unendlich neu erachten.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1105,27 +1114,28 @@ msgstr ""
 "  --warn-undefined-variables  Eine Warnung ausgeben, wenn eine undefinierte\n"
 "                                     Variable referenziert wird.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "Eine leere Zeichenkette ist als Dateiname ungültig"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "Unbekannte Debug-Level angegeben „%s“"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "unbekannter Typ von Ausgabesynchronisierung „%s“"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 "%s: bekam Unterbrechung/Ausnahme signalisiert (Kode = 0x%lx, Adr = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1141,37 +1151,28 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Zugriffsverletzung: Schreiboperation an Adresse 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Zugriffsverletzung: Leseoperation an Adresse 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell setzt default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell Suche im Pfad setzte default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s setzt für 30 Sekunden aus..."
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "„sleep(30)“ ist abgeschlossen. Es geht weiter.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
@@ -1179,106 +1180,125 @@ msgstr ""
 "Ursprungsregel\n"
 "„+“ hinzu."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
 "Warnung: -jN in „make“-Verarbeitungszweig erzwungen: \n"
 "Jobserver-Modus nicht verfügbar."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Das Makefile wurde zweimal über die Standardeingabe angegeben."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (temporäre Datei)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (temporäre Datei)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"Warnung: -jN in „make“-Verarbeitungszweig erzwungen: \n"
+"Jobserver-Modus nicht verfügbar."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr ""
 "Parallele Abarbeitung (-j) \n"
 "wird auf dieser Plattform nicht unterstützt."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Umstellung auf Einzel-Job-Verarbeitung (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 "Symbolische Verknfungen werdfen nicht unterstützt: -L wird abgeschaltet."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Aktualisiere „make“-Steuerdateien...\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
 "„make“-Steuerdatei „%s“ könnte eine Schleife enthalten; \n"
 "es wird nicht neu erzeugt.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Konnte die „make“-Steuerdatei „%s“ nicht neu erstellen."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Die eingebundene „make“-Steuerdatei „%s“ wurde nicht gefunden."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Die „make“-Steuerdatei „%s“ wurde nicht gefunden"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Konnte nicht in das ursprüngliche Verzeichnis wechseln."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Erneute Ausführung[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (temporäre Datei): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL beinhaltet mehr als ein Ziel"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Keine Ziele"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Es wurden keine Ziele angegeben und keine „make“-Steuerdatei gefunden"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Aktualisieren der Ziele...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "Warnung: Mit der Uhr stimmt etwas nicht. \n"
 "         Der Bauauftrag könnte unvollständig sein."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Aufruf: %s [Optionen] [Ziele] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1287,7 +1307,7 @@ msgstr ""
 "\n"
 "Diese Programm wurde für %s gebaut\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1296,32 +1316,32 @@ msgstr ""
 "\n"
 "Diese Programm wurde für %s (%s) gebaut\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Fehlermeldungen (auf Englisch) an <bug-make@gnu.org> senden.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "Die Option „%s%s“ verlangt eine nicht-leere Zeichenkette als Argument"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "Die Option „-%c“ verlangt eine positive ganze Zahl als Argument"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sGebaut für %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sGebaut für %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1335,7 +1355,7 @@ msgstr ""
 "verteilen.\n"
 "%sSoweit es die Gesetze erlauben gibt es KEINE GARANTIE.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1344,7 +1364,7 @@ msgstr ""
 "\n"
 "# „Make“-Datenbank; erstellt am: %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1353,352 +1373,389 @@ msgstr ""
 "\n"
 "# „Make“-Datenbank beendet am: %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Unbekannter Fehler %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: Nutzer %lu (tatsächlich %lu), Gruppe %lu (tatsächlich %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Initialisierter Zugriff"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Zugriff durch Benutzer"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Zugriff durch „make“"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Kindprozess"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: ein unbekanntes Verzeichnis wird betreten\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: ein unbekanntes Verzeichnis wird verlassen\n"
 
 # !!! Attention: concatenated with the previous messages!!!
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Verzeichnis „%s“ wird betreten\n"
 
 # !!! Attention: concatenated with the previous messages!!!
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Verzeichnis „%s“ wird verlassen\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Ein unbekanntes Verzeichnis wird betreten\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Ein unbekanntes Verzeichnis wird verlassen\n"
 
 # !!! Attention: concatenated with the previous messages!!!
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Verzeichnis „%s“ wird betreten\n"
 
 # !!! Attention: concatenated with the previous messages!!!
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Verzeichnis „%s“ wird verlassen\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "Schreibfehler: Standardausgabe"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Schluss.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"-O[TYPE] (--output-sync[=TYPE]) ist für diese Bau-Aufgabe nicht konfiguriert."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "Öffnen der Pipe für die Jobs"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "Öffnen der Pipe für die Jobs"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "Initialisierung der Pipe für den Jobserver"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "Interner Fehler: ungültige --jobserver-auth Angabe „%s“"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Jobserver-Klient (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "Initialisierung der Pipe für den Jobserver"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "Job-Server wird geschrieben"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect der Jobs-Pipeline"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "Lese Pipe für die Jobs"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "„make“-Steuerdateien werden gelesen...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "„make“-Steuerdatei „%s“ wird gelesen"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (kein Standard-Ziel)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (Suchpfad)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (macht nichts)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (keine ~-Auflösung)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "UTF-8 BOM in makefile „%s“ wird übersprungen\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "UTF-8 BOM im makefile-Puffer wird übersprungen\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "Ungültige Syntax in der Bedingung"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: konnte nicht geladen werden"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "Rezept beginnt vor dem ersten Ziel"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "Es fehlt eine Regel vor der Regel"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "fehlender Trenner (Meinten Sie TAB anstelle von 8 Leerzeichen?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "Fehlender Trenner"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "Es fehlt ein Ziel-Muster"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "Mehrfache Ziel-Muster"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "Ziel-Muster enthält kein „%%“"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "Fehlendes „endif“"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "Leerer Variablenname"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "Überflüssiger Text nach einer „define“-Anweisung"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "Fehlendes „endef“, nicht abgeschlossenes „define“"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "Überflüssiger Text nach einer „endef“-Anweisung"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "Überflüssiger Text nach einer „%s“-Anweisung"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "Überflüssiges „%s“"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "Es ist nur ein „else“ pro Bedingung erlaubt"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Falsche Ziel-bezogene Variablendefinition"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "Voraussetzungen können nicht in Regeln definiert werden"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "Implizite und statische Muster-Regeln wurden vermischt"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "Implizite und normale Regeln wurden vermischt"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "Target „%s“ passt nicht zum Ziel-Muster"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "Das Ziel „%s“ enthält sowohl „:“- als auch „::“-Einträge"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "Das Ziel „%s“ steht mehrfach in derselben Regel."
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "Warnung: Die Befehle für das Ziel „%s“ werden überschrieben"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "Warnung: Alte Befehle für das Ziel „%s“ werden ignoriert"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** Implizite und normale Regeln wurden vermischt"
 
-#: read.c:2542
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "Warnung: Die Befehle für das Ziel „%s“ werden überschrieben"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "Warnung: NULL-Zeichen gelesen; der Rest der Zeile wird ignoriert"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Für das Ziel „%s“ ist nichts zu tun."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "„%s“ ist bereits aktuell."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Die Datei „%s“ wird \"gestutzt\" (der Abhängigkeitsgraph).\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
 "%sKeine Regel vorhanden, um das Ziel „%s“, \n"
 "  benötigt von „%s“, zu erstellen%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sKeine Regel, um „%s“ zu erstellen%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Betrachte Ziel-Datei „%s“.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr ""
 "Es wurde kürzlich versucht, die Datei „%s“ zu aktualisieren,\n"
 "dies schlug aber fehl.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Die Datei „%s“ wurde bereits betrachtet.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Die Datei „%s“ wird immer noch aktualisiert.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Aktualisierung der Datei „%s“ beendet.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Die Datei „%s“ existiert nicht.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1706,153 +1763,153 @@ msgstr ""
 "*** Warnung: mit .LOW_RESOLUTION_TIME gekennzeichnete Datei „%s“ hat einen\n"
 "             hochaufgelösten Zeitstempel"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Eine implizite Regel für „%s“ wurde gefunden.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Keine implizite Regel für „%s“ gefunden.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Die Standard-Regel für „%s“ wird verwendet.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Zirkuläre Abhängigkeit %s <- %s wird nicht verwendet."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Fertig mit den Voraussetzungen für die Ziel-Datei „%s“.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Die Voraussetzungen von „%s“ werden fertiggestellt.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Die Arbeit an der Target-Datei „%s“ wurde aufgegeben.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Das Ziel „%s“ wurde wegen Fehlern nicht aktualisiert."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Die Datei „%s“ ist älter als das davon abhängige Ziel „%s“.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr ""
 "Die Datei „%s“, Voraussetzung für das Ziel „%s“, \n"
 "existiert nicht.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Die Datei „%s“ ist jünger als das davon abhängige Ziel „%s“.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Die Datei „%s“ ist älter als das davon abhängige Ziel „%s“.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 "Das Ziel „%s“ hat einen doppelten Doppelpunkt \n"
 "und keine Voraussetzungen.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 "Kein Kommando für „%s“ und keine Voraussetzung \n"
 "wurde tatsächlich verändert.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "„%s“ wird aufgrund der Keinnzeichnung als always-make erzeugt.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Es ist nicht notwendig, das Ziel „%s“ neu zu erzeugen"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; benutze VPATH-Name „%s“"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Das Target „%s“ muss neu erzeugt werden.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Der VPATH-Name „%s“ wird ignoriert.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Die Regel für „%s“ wird gerade ausgeführt.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Fehler beim Aktualisieren der Ziel-Datei „%s“.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Die Zieldatei „%s“ wurde erfolgreich aktualisiert.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Zieldatei „%s“ muss bei -q aktualisiert werden.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Die Standard-Kommandos für „%s“ werden verwendet.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Warnung: Datei „%s“ hat zukünftige Änderungszeit"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Warnung: Datei „%s“ hat hat in der Zukunft liegende Änderungszeit %s"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS Element „%s“ ist kein Muster"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs wird nicht exportieren: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1860,7 +1917,7 @@ msgstr ""
 "\n"
 "# Implizite Regeln"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1868,181 +1925,177 @@ msgstr ""
 "\n"
 "# Keine impliziten Regeln vorhanden."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u implizite Regeln, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " Terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BUG: „num_pattern_rules“ falsch!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "Unbekanntes Signal"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Aufgelegt"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Abgebrochen (Interrupt)"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Quit"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Illegaler Befehl"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Verfolgen/anhalten abfangen (Trace/breakpoint trap)"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Abgebrochen (Aborted)"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT abfangen (IOT trap)"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT abfangen (EMT trap)"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Gleitkommafehler"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Abgebrochen (Killed)"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Bus-Fehler"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Adressierungsdefekt"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Falscher Systemaufruf"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Zerstörte Pipe"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Wecksignal"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Abgebrochen (Terminated)"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Nutzersignal 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Nutzersignal 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Kindprozess beendet"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Stromausfall"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Angehalten"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Angehalten (tty input)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Angehalten (tty output)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Angehalten (signal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU-Zeitschranke überschritten"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Dateigrößenschranke überschritten"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtueller Timer erloschen"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Profiling Timer erloschen"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Fenster hat sich verändert"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Fortgesetzt"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Dringende I/O-Bedingung"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O möglich"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Ressource verloren gegangen"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Gefahrensignal"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Informationsanforderung"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Es ist kein Koprozessor für Fließkommaoperationen vorhanden"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -2051,7 +2104,7 @@ msgstr ""
 "\n"
 "%s Keine Puffer für strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2062,27 +2115,27 @@ msgstr ""
 "%s Puffer für strcache: %lu (%lu) / Zeichenketten = %lu / Speicher = %lu B / "
 "ø = %lu B\n"
 
-#: strcache.c:308
-#, c-format
+#: src/strcache.c:308
+#, fuzzy, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "%s aktueller Puffer: Größe = %hu B / benutzt = %hu B / Anzahl = %hu / ø = "
 "%hu B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s andere verwendete: Summe = %lu B / Anzahl = %lu / /ø = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s andere freie: Summe = %lu B / Max = %lu B / Min = %lu B / ø = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2091,7 +2144,7 @@ msgstr ""
 "\n"
 "%s Leistung von strcache: Suchen = %lu / Trefferrate = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2099,46 +2152,46 @@ msgstr ""
 "# Statistik für Hashtabelle:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatisch"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "Standard"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "Umgebung"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "Makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "Umgebung per -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "Kommandozeile"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "„override“-Anweisung"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (aus „%s“, Zeile %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr ""
 "# Hashtabellen-Statistik für Variablen:\n"
 "\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2146,7 +2199,7 @@ msgstr ""
 "\n"
 "# Variablen\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2154,7 +2207,7 @@ msgstr ""
 "\n"
 "# Musterspezifische Variablenwerte"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2162,7 +2215,7 @@ msgstr ""
 "\n"
 "# Keine musterspezifischen Variablenwerte."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2171,47 +2224,47 @@ msgstr ""
 "\n"
 "# %u musterspezifische Variablenwerte"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "Warnung: undefinierte Variable „%.*s“"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "„sys$search“ schlug mit %d fehl\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-Warnung: Vielleicht müssen Sie STRG-Y aus DCL wieder ermöglichen.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BUILTIN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Ausgabe nach %s umgeleitet\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "%.*s anhängen und aufräumen\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "%s wird stattdessen ausgeführt\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2219,11 +2272,11 @@ msgstr ""
 "\n"
 "# VPATH-Suchpfade\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Keine „vpath“-Suchpfade."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2232,7 +2285,7 @@ msgstr ""
 "\n"
 "# %u „vpath“-Suchpfade.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2240,7 +2293,7 @@ msgstr ""
 "\n"
 "# Kein allgemeiner Suchpfad (Variable „VPATH“)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2250,17 +2303,17 @@ msgstr ""
 "# Allgemeiner Suchpfad (Variable „VPATH“):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Zeitschlitze der Jobservers auf %d begranzt\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "Jobserver-Semaphore wird erzeugt: (Fehler %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
@@ -2269,21 +2322,45 @@ msgstr ""
 "werden:\n"
 "                 (Fehler %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Jobserver-Klient (Semaphore %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "Freigabe der Jobserver-Semaphore: (Fehler %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "warten auf Semaphore oder Kindprozess: (Fehler %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Kommando nicht gefunden\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Befehl nicht gefunden\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Shell-Programm wurde nicht gefunden"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s setzt für 30 Sekunden aus..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "„sleep(30)“ ist abgeschlossen. Es geht weiter.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Unbekannter Fehler %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Warnung: Datei „%s“ hat zukünftige Änderungszeit"
+
+#~ msgid " terminal."
+#~ msgstr " Terminal."
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: die Regel für Ziel „%s“ scheiterte"
 
index 2e0c36c46a37009f04711a56c4712feb3d2dfe02..9effe87e90a9a0a708005d239cc47192be3f2c29 100644 (file)
Binary files a/po/es.gmo and b/po/es.gmo differ
index 9cdab9d5c976eab0024cc78e5cdecfd726c6fa4e..359648bea344045b59f4f45ba383db4eacc56f3d 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1,23 +1,24 @@
 # Mensajes en español para GNU make.
-# Copyright (C) 1996, 2001, 2011, 2013, 2014 Free Software Foundation, Inc.
+# Copyright (C) 1996, 2001, 2011, 2013, 2014, 2016, 2019, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 # Max de Mendizábal <max.de.mendizabal@gmail.com>, 1996, 2011.
-# Antonio Ceballos <aceballos@gmail.com>, 2013, 2014, 2016
+# Antonio Ceballos <aceballos@gmail.com>, 2013, 2014, 2016, 2019, 2020
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU make 4.1.90\n"
+"Project-Id-Version: GNU make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-04-26 23:05+0200\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 15:38+0100\n"
 "Last-Translator: Antonio Ceballos <aceballos@gmail.com>\n"
 "Language-Team: Spanish <es@tp.org.es>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "Se intentó utilizar una característica no implementada: '%s'"
@@ -34,83 +35,84 @@ msgstr "Se intentó utilizar una característica no implementada: '%s'"
 # Enrique: touch es un programa del sistema operativo y sirve para
 # cambiar la fecha de un programa o archivo. Es decir lo "toca" y
 # modifica sus atributos. Por eso preferí no traducirlo.
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "El programa para hacer un 'touch' no está disponible en VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: El archivo '%s' no existe"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: '%s' no es un archivo válido"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: El miembro '%s' no existe en '%s'"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: Código de retorno erróneo de ar_member_touch en '%s'"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "fallo en lbr$set_module() para extraer la información del módulo, estado = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "fallo en lbr$ini_control() con estado = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
 "error al abrir la biblioteca '%s' para buscar el estado %d del elemento"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Miembro '%s'%s: %ld bytes en %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (el nombre puede estar truncado)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Fecha %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, modo = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Las instrucciones tienen demasiadas líneas (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Interrumpir.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr ""
 "*** [%s] El miembro de archivo '%s' podría estar incorrecto; aunque no se "
 "elimina"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr ""
@@ -118,32 +120,32 @@ msgstr ""
 
 # Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv
 # Ok. mm
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Se borra el archivo '%s'"
 
 # Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv
 # Ok. mm
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Se borra el archivo '%s'"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  las instrucciones para ejecutar"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (integrado):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (de '%s', linea %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -151,7 +153,7 @@ msgstr ""
 "\n"
 "# Directorios\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: podría no estar establecido.\n"
@@ -159,14 +161,13 @@ msgstr "# %s: podría no estar establecido.\n"
 # ¿No sobraría el "posiblemente"?
 # Propongo dejarlo en " no se pudo abrir ". sv
 # Ok. Es consistente con otras traducciones. mm
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (llave %s, mtime %d): no se pudo abrir.\n"
+msgstr "# %s (llave %s, mtime %I64u): no se pudo abrir.\n"
 
 # En el K & R aparece inode traducido como nodo-i. ¿qué te parece? sv
 # Bien. Me gusta con el guioncito. mm
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr ""
@@ -175,49 +176,48 @@ msgstr ""
 # ¿No sobraría el "posiblemente"?
 # Propongo dejarlo en " no se pudo abrir ". sv
 # Ok. Es consistente con otras traducciones. mm
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (dispositivo %ld, nodo-i %ld): no se pudo abrir.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (llave %s, mtime %d): "
+msgstr "# %s (llave %s, mtime %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (dispositivo %d, nodo-i [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (dispositivo %ld, nodo-i %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "No"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " archivos, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "no"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " imposibilidades"
 
 # ¿"So far" no era "hasta ahora"? (no me hagas mucho caso) sv
 # Si tu traducción es mejor. Aceptada. mm
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " hasta ahora."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " imposibilidades en %lu directorios.\n"
@@ -231,7 +231,7 @@ msgstr " imposibilidades en %lu directorios.\n"
 # ejemplo em+
 # Mejor lo eliminamos. Es de alguna forma reiterativo e innecesario.
 # Lo de `al final' puede ser más confuso. mm
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "La variable recursiva '%s' se auto-referencia"
@@ -239,18 +239,19 @@ msgstr "La variable recursiva '%s' se auto-referencia"
 # No me gusta nada ( lo siento )
 # ¿ Qué tal : La referencia a una variable está sin terminar em+
 # Creo que tienes razón la voz pasiva es muy desagradable. mm.
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "la referencia a la variable está sin terminar"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Se especificaron instrucciones para el archivo '%s' en %s:%lu,"
 
 # Buscando en las legras implícitas em+
 # Utilicé por búsqueda en para evitar el gerundio. mm
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
@@ -259,7 +260,7 @@ msgstr ""
 
 # "now" es "ahora". ¿te lo has comido consciente o inconscientemente? sv
 # inconscientemente. mm
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "pero '%s' se considera ahora como el mismo archivo que `%s'."
@@ -268,7 +269,7 @@ msgstr "pero '%s' se considera ahora como el mismo archivo que `%s'."
 # "To ignore" *no* es ignorar. sv
 # Propongo "no serán tenidas en cuenta" a falta de algo mejor.
 # Ok. Mi necedad sobrepasa el milenio. mm
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
@@ -278,46 +279,47 @@ msgstr ""
 # Me suena que eso de colon es algo así como punto, dos puntos o punto y coma.
 # ¿Podrías comprobarlo? sv
 # Es un punto sencillo (.). A ver si te gusta mi propuesta. mm
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "no se puede cambiar un punto (.) '%s' por dos puntos (:) '%s'"
 
 # Lo mismo. sv
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "no se pueden cambiar dos puntos (:) '%s' por un punto (.) '%s'"
 
 # Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv
 # Ok. mm
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Se borra el archivo intermedio '%s'"
 
 # Propongo un cambio en el tiempo verbal: Se borra el archivo temporal. sv
 # Ok. mm
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "*** Se borran los archivos intermedios...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Hora actual"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Fecha fuera de intervalo; sustituyéndola %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# No es un objetivo:"
 
 # Pondría: es una dependencia de em+
 # Si, tienes razón. mm
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Archivo valioso (es una dependencia de .PRECIOUS)."
 
@@ -329,7 +331,7 @@ msgstr "#  Archivo valioso (es una dependencia de .PRECIOUS)."
 # No. Incondicional no es una traducción correcta. Que tal si al rato
 # se les ocurre hacer una nueva instrucción .INCONDITIONAL.
 # Si quieres podríamos pensar en otra traducción como señuelo o algo así. mm
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  objetivo falso (dependencia de .PHONY)."
 
@@ -340,7 +342,7 @@ msgstr "#  objetivo falso (dependencia de .PHONY)."
 # Están traduciendo commands como comandos? Son más bien ordenes o
 # instrucciones. Por mi parte no hay problema, incluso me gusta más
 # comandos, pero es un anglicismo. mm
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Objetivo en línea de instrucciones."
 
@@ -352,11 +354,11 @@ msgstr "#  Objetivo en línea de instrucciones."
 # Así pues tu traducción es completamente equivocada, lo siento.
 # Pondría: Fichero por defecto o definido en la variable MAKEFILE em+
 # Cierto, lo has entendido bien. Arreglo acorde. mm
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Por omisión, MAKEFILES, o -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Regla incorporada"
 
@@ -364,7 +366,7 @@ msgstr "#  Regla incorporada"
 # Ok. Es más literal. mm
 # Atención ! , es la búsqueda 'de'reglas implícitas em+
 # Ok. Ojo, debo pluralizar regla e implícita. Platicarlo con Ulrich. mm
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  La búsqueda de reglas implícitas ha sido efectuada."
 
@@ -372,22 +374,22 @@ msgstr "#  La búsqueda de reglas implícitas ha sido efectuada."
 # Ok. Es más literal. mm
 # Atención ! , es la búsqueda 'de'reglas implícitas em+
 # Ok. Ojo, debo pluralizar regla e implícita. Platicarlo con Ulrich. mm
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  La búsqueda de reglas implícitas ha sido efectuada."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Tema del patrón implícita/estática: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  El archivo es una dependencia intermedia."
 
 # Sugerencia: "crea". sv
 # Ok. Aunque, viendolo bien, que tal "hace"? mm.
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  También hace:"
 
@@ -395,60 +397,60 @@ msgstr "#  También hace:"
 # Ok. Mejora. mm
 # No pondría nunca, sino simplemente 'no se comprobó 'em+
 # Si, es lo mismo pero es más español. mm
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  La fecha de modificación no se comprobó."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  El archivo no existe."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  El archivo es muy viejo."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Última modificación %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  El archivo ha sido actualizado."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  El archivo ha sido actualizado."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Las instrucciones continúan en ejecución (ESTO ES UN BUG)."
 
 # ¿No sería más bien "las instrucciones de las dependencias"? sv
 # Si, que babas soy. Ahora corrijo. mm
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr ""
 "#  Las instrucciones de las dependencias continúan en ejecución (ESTO ES UN "
 "BUG)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Actualizado con éxito."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Necesita ser actualizado (la opción -q está activa)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Fallo al ser actualizado."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  ¡Valor inválido en el miembro 'command_state'!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -456,7 +458,7 @@ msgstr ""
 "\n"
 "# Archivos"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -466,56 +468,59 @@ msgstr ""
 "# estadísticas de la tabla «hash» de los archivos:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: El campo '%s' no está en «cache»: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "el primer argumento de la función 'word' no es numérico"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "el primer argumento de la función 'word' debe ser mayor que 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "el primer argumento de la función 'wordlist' no es numérico"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "el segundo argumento de la función 'wordlist' no es numérico"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: fallo en DuplicateHandle(In), (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: fallo en DuplicateHandle(Err), (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "Fallo en CreatePipe(), (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): fallo en process_init_fd()\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Limpiando el archivo temporal %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "archivo: falta el nombre del archivo"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "abrir: %s: %s"
@@ -529,17 +534,18 @@ msgstr "abrir: %s: %s"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "escribir: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "cerrar: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "archivo: demasiados argumentos"
 
@@ -552,151 +558,152 @@ msgstr "archivo: demasiados argumentos"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "leer: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "archivo: operación de archivo no válida: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "Número de argumentos (%d) insuficientes para la función '%s'"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "No implementado en esta plataforma: función '%s'"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "la llamada a la función '%s' no concluyó: falta '%c'"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Nombre de función vacío"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Nombre de función no válido: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Nombre de función demasiado largo: %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "Número insuficiente de argumentos (%d) para la función %s"
+msgstr "Número insuficiente de argumentos (%u) para la función %s"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "El número máximo de argumentos (%d) no es válido para la función %s"
+msgstr "El número máximo de argumentos (%u) no es válido para la función %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: la opción '%s' es ambigua\n"
 
 # No admite ningún argumento. sv
 # Ok. Y vuelve la burra al trigo. mm
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: la opción '--%s' no admite ningún argumento\n"
 
 # Lo mismo. sv
 # Ok. mm
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: la opción '%c%s' no admite ningún argumento\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: la opción '%s' requiere un argumento\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: opción no reconocida '--%s'\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: opción no reconocida '%c%s'\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: opción inválida -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: opción inválida -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: la opción requiere un argumento -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: la opción '-W %s' es ambigua\n"
 
 # No admite ningún argumento. sv
 # Ok. Y vuelve la burra al trigo. mm
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: la opción '-W %s' no admite ningún argumento\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Expandiendo '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Evaluando '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "no se pueden reservar %lu bytes para la tabla «hash»: memoria agotada"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Carga=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Carga=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Rehash=%d, "
+msgid "Rehash=%u, "
+msgstr "Rehash=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Colisiones=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Colisiones=%lu/%lu=%.0f%%"
 
 # Y no sería mejor "Buscando una regla implícita ..."
 # Ten en cuenta que este mensaje no parece un mensaje de error, sino más
 # de "debug" o de "verbose". sv
 # Cierto. mm
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Buscando una regla implícita para '%s'.\n"
@@ -704,7 +711,7 @@ msgstr "Buscando una regla implícita para '%s'.\n"
 # Lo mismo.
 # Buscando una regla implítita para el miembro del archivo  `%s' em+
 # Se me resbaló. mm
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Buscando una regla implícita para el miembro del archivo '%s'.\n"
@@ -716,14 +723,15 @@ msgstr "Buscando una regla implícita para el miembro del archivo '%s'.\n"
 # Me gusta evade, pero evita es correcto. Acepto tu sugerencia. mm
 # No me gusta se evita, pondría evitando em+
 # Ok. Pero a mi paranoia de evitar gerundios dónde la dejas? mm
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Evitando la recursión en la regla implícita.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Tema demasiado largo: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Tema demasiado largo: '%s%.*s'.\n"
 
 # FUZZY
 # Esto me suena fatal. Se a que se refiere, porque lo
@@ -733,7 +741,7 @@ msgstr "Tema demasiado largo: '%.*s'.\n"
 # De momento cambio la regla patron por una regla de patron , y
 # pondría a toda costa gerundio ( intentando ) em+
 # Ok con el gerundio. Pero también tengo que meditarlo. mm
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Intentando una regla de patrón con el tema '%.*s'.\n"
@@ -745,7 +753,7 @@ msgstr "Intentando una regla de patrón con el tema '%.*s'.\n"
 # aparecer tal y como está ahora (Se rechaza la dependencia imposible
 #  `%s' `%s )'em+
 # Ok. mm
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Se rechaza la regla de dependencia imposible '%s'.\n"
@@ -757,7 +765,7 @@ msgstr "Se rechaza la regla de dependencia imposible '%s'.\n"
 # aparecer tal y como está ahora (Se rechaza la dependencia imposible
 #  `%s' `%s )'em+
 # Ok. mm
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Se rechaza la dependencia implícita imposible '%s'.\n"
@@ -770,7 +778,7 @@ msgstr "Se rechaza la dependencia implícita imposible '%s'.\n"
 # De momento cambio la regla patron por una regla de patron , y
 # pondría a toda costa gerundio ( intentando ) em+
 # Ok con el gerundio. Pero también tengo que meditarlo. mm
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Intentando la regla de dependencia '%s'.\n"
@@ -782,22 +790,22 @@ msgstr "Intentando la regla de dependencia '%s'.\n"
 # Me gusta evade, pero evita es correcto. Acepto tu sugerencia. mm
 # No me gusta se evita, pondría evitando em+
 # Ok. Pero a mi paranoia de evitar gerundios dónde la dejas? mm
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Probando la dependencia implícita '%s'.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Se encontró la dependencia '%s' como la VPATH '%s'.\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Se busca una regla con el archivo intermedio '%s'.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "No se puede crear un archivo temporal\n"
 
@@ -805,21 +813,21 @@ msgstr "No se puede crear un archivo temporal\n"
 # volcado de `core' no significa nada, que te parece si mejor dejamos
 # el core dumped, o bien volcado del núcleo o algo así. Por el momento
 # no cambio nada. mm
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (core dumped) [Núcleo vaciado a un archivo]"
 
 # Preferiría mil veces "sin efecto" o algo parecido. sv
 # Ok. Habíamos quedado en `no tiene efecto'. mm
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (no tiene efecto)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<integrado>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Error %d%s"
@@ -827,69 +835,71 @@ msgstr "%s[%s: %s] Error %d%s"
 # ¿Y job -> trabajos? sv
 # Si, pero no hablas de una computadora multi-trabajos sino multi-tareas.
 # Por eso elegí tareas. Lo platicamos con más calma? mm
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Se espera a que terminen otras tareas...."
 
 # ¿De verdad se dice "vivo"? Si es un proceso, se me ocurre "activo". sv
 # Me gusta lo de activo. mm
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Hijo activo %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (remoto)"
 
 # Lo mismo, pon Proceso hijo, y quita lo que hay
 # entre paréntesis em+
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Se recupera al proceso hijo perdido %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "Se recupera al proceso hijo ganador %p PID %s %s\n"
 
 # Lo mismo, pon Proceso hijo, y quita lo que hay
 # entre paréntesis em+
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
-msgstr "Se recupera al proceso hijo ganador %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Se recupera al proceso hijo perdido %p PID %s %s\n"
 
 # Give up no es enfocar, es abandonar, o desistir em+
 # Si, metí la pata. mm
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Se limpia el archivo temporal %s\n"
 
 # Give up no es enfocar, es abandonar, o desistir em+
 # Si, metí la pata. mm
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Fallo al limpiar el archivo temporal por lotes %s (%d)\n"
 
 # Proceso hijo em+
 # Ok.
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Se elimina al proceso hijo %p PID %s%s de la cadena.\n"
 
 # Lo mismo, pon Proceso hijo, y quita lo que hay
 # entre paréntesis em+
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Se libera el token para el proceso hijo %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "fallo en process_easy() para lanzar al proceso (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -900,109 +910,97 @@ msgstr ""
 
 # Proceso hijo em+
 # Ok.
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Se pone al proceso hijo %p (%s) PID %s%s en la cadena.\n"
 
 # Lo mismo, pon Proceso hijo, y quita lo que hay
 # entre paréntesis em+
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Se obtiene el token para el proceso hijo %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: el objetivo '%s' no existe"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: actualizar el objetivo '%s' a causa de: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "no se pueden forzar los límites de carga en este sistema operativo"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "no se puede forzar la carga límite: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "no hay más manejadores de archivos: no se puede duplicar stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "no hay más manejadores de archivos: no se puede duplicar stdout\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "no hay más manejadores de archivos: no se puede duplicar stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "No se puede restaurar stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "No se puede restaurar stdout\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "No se puede restaurar stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "hacer un hijo descarriado %s, aún se espera por el pid %s\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: No se encontró el programa\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: No se encontró el programa\n"
-
-# ¿Y "el programa Shell"? (a secas) sv
-# Si. Suena mucho mejor. mm
-# Suena, pero no es mejor. Tal y como esta escrito, incluso
-# yo pensaria que me falta un programa en mi sistema que se
-# llame shell. No se ha encontrado el 'shell'em+
-# Es bueno contar con una segunda opinión ... mm
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: No se ha encontrado el `shell'"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: el espacio ambiental podría estar agotado"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL ha cambiado (era '%s' y ahora es '%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Se crea el archivo temporal %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
-"Contenido del archivo de lotes:%s\n"
+"Contenido del archivo de lotes:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -1011,63 +1009,60 @@ msgstr ""
 "Contenido del archivo de lotes:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "%s (linea %d) Contexto de shell erróneo (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[TIPO] (--output-sync[=TIPO]) no está configurado para este «build»."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Fallo al abrir tabla global de símbolos: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 "El objeto %s que se ha cargado no está declarado como compatible con GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Fallo al cargar símbolo %s desde %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Nombre de símbolo vacío en la carga: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Cargando símbolo %s desde %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "La operación 'load' no está implementada en esta plataforma."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opciones:\n"
 
 # Lo mismo de arriba con "ignorar". sv
 # Ok. mm.
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 "  -b, -m                      No se tendrá en cuenta por compatibilidad.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Hace incondicionalmente todos los objetivos.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -1078,7 +1073,7 @@ msgstr ""
 # ¿"depurado" o "depuración"? sv
 # Puse de depurado para evitar la cacofonía información depuración.
 # Sugerencias bienvenidas. mm
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d          Se imprimirán grandes cantidades de información de depurado.\n"
@@ -1086,14 +1081,14 @@ msgstr ""
 # ¿"depurado" o "depuración"? sv
 # Puse de depurado para evitar la cacofonía información depuración.
 # Sugerencias bienvenidas. mm
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=BANDERAS]    Se imprimirán varios tipos de información de "
 "depurado.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -1102,14 +1097,14 @@ msgstr ""
 "                Las variables ambientales se imponen a las de los "
 "makefiles.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"   --eval=CADENA               Evalúla la CADENA como una instrucción de un "
+"   -E CADENA, --eval=CADENA   Evalúa la CADENA como una instrucción de un "
 "makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -1117,7 +1112,7 @@ msgstr ""
 "  -f ARCHIVO, --file=ARCHIVO, --makefile=ARCHIVO\n"
 "                                   Lee al ARCHIVO como un makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Muestra este mensaje y finaliza.\n"
 
@@ -1127,13 +1122,13 @@ msgstr "  -h, --help                  Muestra este mensaje y finaliza.\n"
 # tambien.
 # No me gusta este mensaje, preferiría: Se ignoran los errores obtenidos
 # en la ejecución de las instrucciones  em+
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 "  -i, --ignore-errors         No se toman en cuenta los errores provenientes "
 "de las instrucciones.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -1144,7 +1139,7 @@ msgstr ""
 # Yo traduciría "infinite" por "infinitos", no por "una infinidad", que
 # parece que son muchos menos... sv
 # Ok. mm
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -1155,14 +1150,14 @@ msgstr ""
 
 # No entiendo por qué aquí empleas subjuntivo: "pudieron". sv
 # Es incorrecto. Es una de las opciones `k' que dice... mm
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Sigue avanzando aún cuando no se puedan crear "
 "algunos objetivos.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -1172,7 +1167,7 @@ msgstr ""
 "      No inicia con trabajos múltiples a menos que la carga esté por debajo "
 "de N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -1180,7 +1175,7 @@ msgstr ""
 "  -L, --check-symlink-times   Utiliza el último mtime entre los enlaces "
 "simbólicos y los objetivos.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -1190,7 +1185,7 @@ msgstr ""
 "                              No ejecuta ninguna instrucción; sólo las "
 "muestra.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -1200,7 +1195,7 @@ msgstr ""
 "                           Supone que ARCHIVO es muy viejo y no lo "
 "reconstruye.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -1211,13 +1206,13 @@ msgstr ""
 
 # de 'make' em+
 # ok. mm
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 "  -p, --print-data-base       Se imprime la base de datos interna de "
 "'make'.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -1231,7 +1226,7 @@ msgstr ""
 # ¡ Por favor ! , ¿ pero qué es eso de interconstruidas ?
 # Pon almacenadas internamente, que es exactamente lo que son :) em+
 # Bueno, bajo protesta. mm
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Se deshabilitan las reglas implícitas "
@@ -1242,17 +1237,23 @@ msgstr ""
 # ¡ Por favor ! , ¿ pero qué es eso de interconstruidas ?
 # Pon almacenadas internamente, que es exactamente lo que son :) em+
 # Bueno, bajo protesta. mm
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Se deshabilitan los ajustes a las variables "
 "almacenadas internamente.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
-msgstr "  -s, --silent, --quiet       No muestra las intrucciones.\n"
+msgstr "  -s, --silent, --quiet       No muestra las instrucciones.\n"
+
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Muestra las instrucciones (desactiva el modo --"
+"silent).\n"
 
-#: main.c:393
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1265,7 +1266,7 @@ msgstr ""
 #
 # Pues entonces cámbialo arriba tambien em+
 # En donde? mm
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Se tocan los objetivos en vez de "
@@ -1274,20 +1275,20 @@ msgstr ""
 # ¿"depurado" o "depuración"? sv
 # Puse de depurado para evitar la cacofonía información depuración.
 # Sugerencias bienvenidas. mm
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Muestra trazas.\n"
 
 # Me comería el "Se" inicial. "Muestra la versión..." sv
 # Ok. mm
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Muestra la versión del make y finaliza.\n"
 
 # Lo mismo. sv
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Muestra el directorio actual.\n"
 
@@ -1296,7 +1297,7 @@ msgstr "  -w, --print-directory       Muestra el directorio actual.\n"
 # apaga luz Mari Luz apaga luz ,que yo no puedo vivir con
 # tanta luz ... ( canción tradicional ) ( no lo pude evitar ) em+
 # Juar, Juar, Juar. Coincido, pero el sentido es el mismo. mm
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1304,7 +1305,7 @@ msgstr ""
 "  --no-print-directory        Desactiva -w, aún cuando haya sido activado "
 "implícitamente.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1315,7 +1316,7 @@ msgstr ""
 
 # Lo mismo. sv
 # Todas estas parecen descripciones de opciones.
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1323,27 +1324,28 @@ msgstr ""
 "  --warn-undefined-variables  Advierte cuando se hace una referencia a una "
 "variable no definida.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "no se permite que una cadena vacía sea el nombre de un archivo"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "se especificó un nivel de depuración desconocido '%s'"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "tipo de sincronización de salida desconocido '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 "%s: Se atrapó una interrupción/excepción (código = 0x%lx, dirección = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1358,80 +1360,84 @@ msgstr ""
 "Banderas de la excepción = %lx\n"
 "Dirección de la excepción = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Violación de acceso: operación de escritura en la dirección 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Violación de acceso: operación de lectura en la dirección 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "la función find_and_set_shell() pone el valor del default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 "la función find_and_set_shell() pone el valor de la ruta de búsceda "
 "default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s está suspendida por 30 segundos..."
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "se hizo un sleep(30). Continuando.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "atención: el servidor de tareas no está disponible: se utilizará -j1. Añada "
 "'+' a la regla padre del make."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
-"atención: se fuerza a -jN en el submake: se deshabilita el modo de servidor "
+"atención: se fuerza a -j%d en el submake: se restablece el modo de servidor "
 "de tareas."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr ""
 "El archivo Makefile ha sido especificado dos veces desde la entrada estándard"
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (archivo temporal)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (archivo temporal)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"atención: se fuerza a -j%d en el makefile: se restablece el modo de servidor "
+"de tareas."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr ""
 "Los trabajos en paralelo (-j) no están implementados en esta plataforma."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Reajustando al modo monotarea (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Los enlaces simbólicos no están implementados: se deshabilitan con -L."
 
 # Antes pusiste "makefiles". Coherencia. sv
 # Cierto. mm
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Actualizando archivos makefiles....\n"
 
@@ -1441,62 +1447,68 @@ msgstr "Actualizando archivos makefiles....\n"
 # Pondría ( como en un mensaje anterior ) se autoreferencia ... em+
 # He puesto makefile con minúsculas , par ser coherentes em+
 # Ok. Es más breve. mm.
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
 "El makefile '%s' podría entrar en bucle; por lo tanto, no se reconstruye.\n"
 
 # Lo mismo. sv
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Fallo al reconstruir el makefile '%s'."
 
 # Lo mismo. sv
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "No se encontró el makefile incluído '%s'."
 
 # Lo mismo. sv
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "No se encontró el makefile '%s'"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "No se pudo regresar al directorio original."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Re-ejecutando[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (archivo temporal)"
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL contien más de un objetivo"
 
+#: src/main.c:2579
+#, c-format
+msgid "No targets"
+msgstr "No hay objetivos"
+
 # Sugerencia: "No se especificó ningún objetivo ... " sv
 # Ok. Me gusta. mm
-#: main.c:2548
+#: src/main.c:2581
+#, c-format
 msgid "No targets specified and no makefile found"
 msgstr "No se especificó ningún objetivo y no se encontró ningún makefile"
 
-#: main.c:2550
-msgid "No targets"
-msgstr "No hay objetivos"
-
-#: main.c:2555
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Actualizando los objetivos finales....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "atención: Se ha detectado una desviación en el reloj. La construcción podría "
@@ -1507,12 +1519,12 @@ msgstr ""
 # "target" es "objetivo", no "objetivos". Fíjate que lleva puntos
 # suspensivos, permitiendo así varios objetivos. sv
 # Ok. mm
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Modo de empleo: %s [opciones] [objetivo] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1521,7 +1533,7 @@ msgstr ""
 "\n"
 "Este programa fue construido para %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1530,36 +1542,36 @@ msgstr ""
 "\n"
 "Este programa construido para %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Informe sobre los errores a <bug-make@gnu.org>\n"
 
 # Me comería el "de" de "requiere de" sv
 # Ok. mm
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "la opción '%s%s' requiere un argumento no-vacío de tipo cadena"
 
 # Me comería el "de" de "requiere de" sv
 # Ok. mm
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "la opción '-%c' requiere un argumento positivo y entero"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sEste programa fue construido para %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sEste programa fue construido para %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1574,7 +1586,7 @@ msgstr ""
 "%sNo existe GARANTÍA ALGUNA, hasta los límites permitidos por las leyes "
 "aplicables.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1588,7 +1600,7 @@ msgstr ""
 # Porqué 'del', o pones 'del programa' Make o pones
 # 'de Make' em+
 # Ok. mm
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1597,38 +1609,33 @@ msgstr ""
 "\n"
 "# Se termina la base de datos de Make en %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Error desconocido %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: usuario %lu (real %lu), grupo %lu (real %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Acceso inicializado"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Acceso del usuario"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Acceso del Make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Acceso del hijo"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: se ingresa a un directorio desconocido\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: se sale del directorio desconocido\n"
@@ -1642,7 +1649,7 @@ msgstr "%s: se sale del directorio desconocido\n"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: se entra en el directorio '%s'\n"
@@ -1656,17 +1663,17 @@ msgstr "%s: se entra en el directorio '%s'\n"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: se sale del directorio '%s'\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: se ingresa a un directorio desconocido\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: se sale del directorio desconocido\n"
@@ -1680,7 +1687,7 @@ msgstr "%s[%u]: se sale del directorio desconocido\n"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: se entra en el directorio '%s'\n"
@@ -1694,7 +1701,7 @@ msgstr "%s[%u]: se entra en el directorio '%s'\n"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: se sale del directorio '%s'\n"
@@ -1708,118 +1715,132 @@ msgstr "%s[%u]: se sale del directorio '%s'\n"
 #  else
 #    printf ("%s[%u]: %s ", program, makelevel, message);
 # Como notarás lo del directorio va en otro lado.
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "error al escribir: stdout"
 
 # Interrumpido (?). sv
 # Mmgmh... El mensaje indica que hubo algún error muy grave y que por
 # eso se detiene el make. Probablemente sea mejor dejarlo así. mm
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Alto.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[TIPO] (--output-sync[=TIPO]) no está configurado para este «build»."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "creando una tubería de tareas"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "duplicando una tubería de tareas"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "se inicializa la tubería al servidor de tareas"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "error interno: cadena --jobserver-auth inválida '%s'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Cliente del servidor de tareas (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "tubería al servidor de tareas"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "escribir en el servidor de tareas"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "servidor de tareas detenido"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "tubería de trabajos «pselect»"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "tubería de trabajos leídos"
 
 # Sugerencia: eliminar la palabra "archivo". sv
 # Ok. Mejora. mm
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Leyendo makefiles...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Leyendo makefile '%s'"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (no hay objetivo por defecto)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (ruta de búsqueda)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (no importa)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (no hay expansión del ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "se salta BOM UTF-8 en el makefile '%s'\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "se salta BOM UTF-8 en el «buffer» del makefile\n"
 
 # ## Sintaxis no llevaba tilde.
 # Ok. mm
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "sintaxis no válida en condicional"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: fallo al cargar"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "las instrucciones comenzaron antes del primer objetivo"
 
@@ -1828,100 +1849,120 @@ msgstr "las instrucciones comenzaron antes del primer objetivo"
 # Cierto pareciera que se perdió dentro de algún circuito. mm
 # Falta 'la' regla em+
 # No no es la regla sino una regla pues puede ser cualquiera de ellas. mm
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "falta una regla antes de las instrucciones"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "falta un separador (¿quiso decir TAB en vez de 8 espacios?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "falta un separador"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "falta un patrón de objetivos"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "hay varios patrones de objetivos"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "el patrón de objetivo no contiene '%%'"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "falta un 'endif'"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "nombre de variable vacío"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr ""
 "Hay un texto irrelevante o mal colocado después de la instrucción 'define'"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "falta un 'endef', no se terminó un 'define'"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr ""
 "Hay un texto irrelevante o mal colocado después de la instrucción 'endef'"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "Texto irrelevante o mal colocado después de la instrucción '%s'"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "irrelevante o mal colocado '%s'"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "sólo se admite un 'else' por condicional"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr ""
 "La definición de las variables específicas al blanco está mal construida"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr ""
 "los prerequisitos no pueden ser definidos por los guiones de instrucciones"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "los objetivos agrupados deben proporcionar instrucción"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "las reglas implícitas y las de patrón estático están mezcladas"
 
 # Y 'las' normales  em+
 # Ok. mm
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "las reglas implícitas y las normales están mezcladas"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "el objetivo '%s' no coincide con el patrón de objetivos"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "el archivo de objetivos '%s' tiene líneas con : y ::"
 
 # Cambiaría given por 'proporcionó' o 'indicó' em+
 # Ok. mm
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "el objetivo '%s' se proporcionó más de una vez en la misma regla"
@@ -1930,44 +1971,55 @@ msgstr "el objetivo '%s' se proporcionó más de una vez en la misma regla"
 # si encaja mejor alguna de las dos que se proponen arriba
 # em+
 # Aunque no me acaba de convencer, que te parece ésto? mm
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "atención: se anulan las instrucciones para el objetivo '%s'"
 
 # Ojo con ignora. sv
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "atención: se ignoran las instrucciones viejas para el objetivo '%s'"
 
 # Y 'las' normales  em+
 # Ok. mm
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr ""
 "*** las reglas implícitas y las normales están mezcladas: sintaxis obsoleta"
 
-#: read.c:2542
+# No me gusta esta traducción de override. Mira a ver
+# si encaja mejor alguna de las dos que se proponen arriba
+# em+
+# Aunque no me acaba de convencer, que te parece ésto? mm
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "atención: se anula pertenencia a grupo al objetivo '%s'"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "atención: hay un carácter NUL; se ignora el resto de la línea"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "No se hace nada para '%s'."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "'%s' está actualizado."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Se poda el archivo '%s'.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
@@ -1975,7 +2027,7 @@ msgstr ""
 
 # Sugerencia: No hay ninguna regla... sv
 # Como una no hay ninguna. mm
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sNo hay ninguna regla para construir el objetivo '%s'%s"
@@ -1986,7 +2038,7 @@ msgstr "%sNo hay ninguna regla para construir el objetivo '%s'%s"
 # de las que aparecen al hacer un make con la opción -d ( debug )
 # se refiere a lo que dice Santiago, es decir, 'archivo objetivo'  em+
 # Ok creo que tienen razón. mm
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Se considera el archivo objetivo '%s'.\n"
@@ -1997,32 +2049,32 @@ msgstr "Se considera el archivo objetivo '%s'.\n"
 # o bien "Se intentó sin éxito actualizar ..."
 # ¿Qué te parece? sv
 # Bien y tiene razón. mm
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Se intentó hace poco, sin éxito, actualizar el archivo '%s'.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Ya se ha tenido en cuenta el archivo '%s'.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Se continúa actualizando el archivo '%s'.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Se terminó de actualizar el archivo '%s'.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "El archivo '%s' no existe.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -2030,26 +2082,26 @@ msgstr ""
 "*** Atención: el archivo .LOW_RESOLUTION_TIME '%s' tiene una marca de tiempo "
 "de alta resolución"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Se encontró una regla implícita para '%s'.\n"
 
 # Se ha encontrado em+
 # Ok, pero procuro evitar como a la muerte los gerundios. mm
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "No se ha encontrado ninguna regla implícita para '%s'.\n"
 
 # Por defecto, como haces arriba em+
 # en efecto, mm
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Se utilizan las instrucciones por omisión para '%s'.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Se elimina la dependencia circular %s <- %s."
@@ -2057,73 +2109,73 @@ msgstr "Se elimina la dependencia circular %s <- %s."
 # Lo mismo de antes con "target file". sv
 # Estoy de acuerdo con él ( por una vez ;) ) em+
 # Ok. mm
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Se terminaron las dependencias del archivo objetivo '%s'.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Se están construyendo las dependencias de '%s'.\n"
 
 # Give up no es enfocar, es abandonar, o desistir em+
 # Si, metí la pata. mm
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Se abandona el archivo objetivo '%s'.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Debido a los errores, el objetivo '%s' no se reconstruyó."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "La dependencia '%s' es solo de orden para el objetivo '%s'.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "La dependencia '%s' del objetivo '%s' no existe.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "La dependencia '%s' es más reciente que el objetivo '%s'.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "La dependencia '%s' es anterior al objetivo '%s'.\n"
 
 # Ahorra espacio, y pon '::'  en vez de eso :) em+
 # Bueno, no es mala idea. A ver si te gusta lo que puse. mm
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 "El objetivo '%s' es de tipo dos puntos dos veces (::)\n"
 "y no tiene dependencias.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "No hay instrucciones para '%s' y ninguna dependencia ha cambiado.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Haciendo '%s' debido a la bandera always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "No es necesario reconstruir el objetivo '%s'."
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; se usa el nombre del VPATH '%s'"
@@ -2131,17 +2183,17 @@ msgstr "; se usa el nombre del VPATH '%s'"
 # Revisa todo el po con un search, y mira a ver si decides usar
 # regenerar o reconstruir ( prefiero lo último 10000 veces ) em+
 # Ok, buena propuesta. mm
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Se debe reconstruir el objetivo '%s'.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Se ignora el nombre del VPATH '%s'.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Las instrucciones de '%s' se están ejecutando.\n"
@@ -2149,48 +2201,41 @@ msgstr "Las instrucciones de '%s' se están ejecutando.\n"
 # Target file no es archivo de objetivos, sino el archivo objetivo
 # make no tiene ningún archivo de objetivos em+
 # Ok. mm
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Fallo al reconstruir el archivo objetivo '%s'.\n"
 
 # Lo mismo em+
 # Ok. mm
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Se reconstruyó con éxito el archivo objetivo '%s'.\n"
 
 # Otra vez em+
 # Ok, no te puedes quejar de falta de consistencia en este caso! mm
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Se necesita reconstruir el archivo objetivo '%s' con la opción -q.\n"
 
 # Por defecto, como haces arriba em+
 # en efecto, mm
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Se utilizan las instrucciones por defecto para '%s'.\n"
 
 # Ubicada :)) , que tal futura, a secas ? em+
 # Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Atención: El archivo '%s' tiene una hora de modificación en el futuro"
-
-# Ubicada :)) , que tal futura, a secas ? em+
-# Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr ""
 "Atención: El archivo '%s' tiene una hora de modificación %s s en el futuro"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "El elemento .LIBPATTERNS '%s' no es un patrón"
@@ -2207,12 +2252,17 @@ msgstr "El elemento .LIBPATTERNS '%s' no es un patrón"
 # no se exportarán em+
 # Muchísimo más claro (es más me gusta más en español que en inglés con tu
 # arreglo) mm
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Los valores definidos por el usuario no se exportarán: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -2220,7 +2270,7 @@ msgstr ""
 "\n"
 "# Reglas implícitas."
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -2228,33 +2278,29 @@ msgstr ""
 "\n"
 "# No hay reglas implícitas."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u reglas implícitas, %u"
-
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
+"# %u reglas implícitas, %u (%.1f%%) terminal."
 
 # ## Añado ¡ con tu permiso. sv
 # Gracias. mm
 # ¿ qué tal erróneo ? em+
 # Si, suena mejor. mm
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BUG: ¡num_pattern_rules erróneo!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "señal desconocida"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Colgado"
 
@@ -2262,25 +2308,25 @@ msgstr "Colgado"
 # Porque es una acción. De hecho es un mensaje que se envía a través
 # del sistema en este caso le enviarías un kill -INT num_proceso para
 # interrumpir al programa. Lo revisé contra el fuente. mm
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Interrumpir"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Finalizar"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Instrucción no válida"
 
 # Los trap los hemos dejado como traps, simplemente. em+
 # Ok. mm
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Trace/breakpoint trap"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Abortado"
 
@@ -2288,13 +2334,13 @@ msgstr "Abortado"
 # Enrique tiene esta misma frase en glibc. sv
 # Eso es :) IOT trap em+
 # Ok. mm
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT trap"
 
 # Otra em+
 # Ok. mm
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT trap"
 
@@ -2303,7 +2349,7 @@ msgstr "EMT trap"
 # por eso usamos el punto flotante. Debemos llegar a un acuerdo.
 # Por ahora pongo coma flotante para facilitar las cosas, pero bajo
 # protesta ;-) mm
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Excepción de coma flotante"
 
@@ -2312,23 +2358,23 @@ msgstr "Excepción de coma flotante"
 # Bueno, creo que mi traducción es más exacta, concisa y clara
 # pero si insisten... Además recuerda en que estoy en un país
 # en donde asesinado es palabra de todos los días. mm
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Terminado (killed)"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Error en el bus"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Fallo de segmentación"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Llamada al sistema errónea"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Tubería rota"
 
@@ -2339,36 +2385,36 @@ msgstr "Tubería rota"
 # Bueno, un alarm clock es una alarma del reloj. No tiene pierde.
 # Temporizador es una bonita palabra pero en donde dice que va a
 # sonar una campana para despertarte? mm
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarma del reloj"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Finalizado"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Señal 1 definida por el usuario"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Señal 2 definida por el usuario"
 
 # Proceso hijo terminado em+
 # Ok. mm
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Proceso hijo terminado"
 
 # Fallo. sv
 # Alimentación eléctrico em+
 # Ok. mm
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Falla de alimentación eléctrica"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Detenido"
 
@@ -2379,30 +2425,30 @@ msgstr "Detenido"
 # Requiere 'de';) , como te vea Santiago que le metes
 # otro 'de' otra vez ... em+
 # Ok. mm
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Detenido (se requiere entrada de terminal)"
 
 # lo mismo, se requiere entrada de terminal ,  em+
 # Ok. mm
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Detenido (se requiere salida de terminal)"
 
 # idem em+
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Detenido (se requiere una señal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Se agotó el tiempo de CPU permitido"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Se excedió el tamaño máximo de archivo permitido"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "El contador de tiempo virtual ha expirado"
 
@@ -2414,51 +2460,51 @@ msgstr "El contador de tiempo virtual ha expirado"
 # Esto lo tengo en glibc, lo mirare otro día. Estos mensajes no son
 # importantes em+
 # Agregué unas palabras en aras de claridad (espero) mm
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "El contador de tiempo para la generación del perfil ha expirado"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "La ventana ha cambiado"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Continuado"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Condición urgente de I/O"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "Posible I/O"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Recurso perdido"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Señal de peligro"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Petición de información"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Coprocesador de punto flotante no disponible"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -2467,7 +2513,7 @@ msgstr ""
 "\n"
 "%s No hay «buffers» strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2478,21 +2524,21 @@ msgstr ""
 "%s «buffers» strcache: %lu (%lu) / cadenas = %lu / almacenamiento = %lu B / "
 "promedio = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "%s «buffer» actual: tamaño = %hu B / utilizado = %hu B / número = %hu / "
-"promedio = %hu B\n"
+"promedio = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 "%s otros utilizado: total = %lu B / / número = %lu / promedio = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
@@ -2500,7 +2546,7 @@ msgstr ""
 "%s otros libre: total = %lu B / máx = %lu B / mín = %lu B / promedio = %hu "
 "B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2509,7 +2555,7 @@ msgstr ""
 "\n"
 "%s rendimiento de strcache: búsquedas = %lu / coincidencias = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2519,44 +2565,44 @@ msgstr ""
 
 # Lo he cmabiado em+
 # Ok. Deberíamos platicarlo con Ulrich. mm
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automática/o"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "por defecto"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "entorno"
 
 # Sugerencia: No poner archivo. sv
 # Ok. mm
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
 # 'bajo -e' = 'con -e activo' em+
 # Ok. Esta inversión en los idiomas sajones se pega. mm
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "con -e activo"
 
 # Línea de comandos me parece correcto em+
 # Ver arriba. Estoy de acuerdo si así han traducido en otros lados. mm
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "línea de instrucciones"
 
 # Creo que tendremos un problema con instrucción, comando
 # , programa y directiva . Está claro que aquí es directiva em+
 # Ok, pero no deja de sonar a RoboCop. A ver que te parece como quedó. mm
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "directiva 'override'"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (de '%s', línea %lu):"
@@ -2566,11 +2612,11 @@ msgstr " (de '%s', línea %lu):"
 # Estos mensajes son para debug, no creo que haga falta usar cubetas ;) em+
 # Tienes razón, si el debugueador no lo entiende pues, ... que se
 # dedique a otra cosa. mm
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# estadísticas del conjunto de variables de la tabla «hash»:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2578,7 +2624,7 @@ msgstr ""
 "\n"
 "# Variables\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2586,7 +2632,7 @@ msgstr ""
 "\n"
 "# Valores de variables específicas al patrón"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2594,7 +2640,7 @@ msgstr ""
 "\n"
 "# No hay valores de variables específicas al patrón."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2605,51 +2651,51 @@ msgstr ""
 
 # ¿Qué te parece "atención"? Lo hemos usado mucho en otros programas. sv
 # Pero que bestia soy. Perdón por el desbarre. mm
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "atención: la variable '%.*s' no ha sido definida"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "fallo en sys$search() con %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-atención, deberás rehabilitar el manejo del CTRL-Y desde el DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "CD INTEGRADO %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Salida redirigida a %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Agregada a %.*s y limpieza\n"
 
 # "en sustituto" me suena muy raro. Propongo: "en su lugar" en su lugar :-) sv
 # Ok. mm
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "En su lugar, se ejecuta %s\n"
 
 # ¿Y al revés?: Rutas de búsqueda VPATH. sv
 # Mejora
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2659,13 +2705,13 @@ msgstr ""
 
 # Rutas creo que queda mejor. sv
 # Ok. Es más común. mm
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# No hay rutas de búsqueda 'vpath'."
 
 # ¡Ah! Aquí si que pones el vpath al final, ¿eh? :-) sv
 # You really got me! mm
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2674,7 +2720,7 @@ msgstr ""
 "\n"
 "# %u rutas de búsqueda 'vpath'.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2682,7 +2728,7 @@ msgstr ""
 "\n"
 "# No hay ruta de búsqueda general (variable 'VPATH')."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2692,17 +2738,17 @@ msgstr ""
 "# Ruta de búsqueda general (variable 'VPATH'):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Ranuras del servidor de tareas limitads a %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "creando semáforo del servidor de tareas: (Error %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
@@ -2710,21 +2756,54 @@ msgstr ""
 "error interno: no se pudo abrir el semáforo del servidor de tareas '%s': "
 "(Error %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Cliente del servidor de tareas (semáforo %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "liberar semáforo del servidor de tareas: (Error %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "semáforo o proceso hijo en espera: (Error %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: No se encontró el programa\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: No se encontró el programa\n"
+
+# ¿Y "el programa Shell"? (a secas) sv
+# Si. Suena mucho mejor. mm
+# Suena, pero no es mejor. Tal y como esta escrito, incluso
+# yo pensaria que me falta un programa en mi sistema que se
+# llame shell. No se ha encontrado el 'shell'em+
+# Es bueno contar con una segunda opinión ... mm
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: No se ha encontrado el `shell'"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s está suspendida por 30 segundos..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "se hizo un sleep(30). Continuando.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Error desconocido %d"
+
+# Ubicada :)) , que tal futura, a secas ? em+
+# Bueno, sonaba como StarTrek, muy chido, pero acepto tu sugerencia. mm
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr ""
+#~ "Atención: El archivo '%s' tiene una hora de modificación en el futuro"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
+
 # No me gusta esta traducción de override. Mira a ver
 # si encaja mejor alguna de las dos que se proponen arriba
 # em+
index bc0cd30fbbe56c71cf1cf12a5a04c66b883a3fa7..1c367cdb4c4fd69d67a9d17567e9ec1fdffe0d32 100644 (file)
Binary files a/po/fi.gmo and b/po/fi.gmo differ
index 52757e230f39fbba24bcae28f52b51d7addd1fde..5b820457f0dd767713881cfbf53a1058aaf982bf 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: make 4.2\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2016-05-26 20:40+0300\n"
 "Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
@@ -15,116 +15,118 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-Generator: Poedit 1.8.7\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "yritettiin käyttää ominaisuutta, jolle ei ole tukea: ”%s”"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "arkistojäsenten kosketus ei ole mahdollista VMS:ssä"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Arkistoa ”%s” ei ole olemassa"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: ”%s” ei ole kelvollinen arkisto"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Arkistossa ”%1$s” ei ole jäsentä ”%2$s”"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: ar_member_touch antoi virheellisen paluuarvon kohteesta ”%s”"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() epäonnistui moduulitietojen noutamisessa, tila = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() epäonnistui, tila = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, fuzzy, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "kirjastoa ”%s” ei voi avata jäsenen ”%s” etsimiseksi"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Jäsen ”%s”%s: %ld tavua kohdassa %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (nimi voi olla typistynyt)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Päiväys %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, oikeudet = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Katkaisu.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Arkistojäsen ”%s” voi olla viallinen – ei poisteta"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Arkistojäsen ”%s” voi olla viallinen – ei poisteta"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Poistetaan tiedosto ”%s”"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Poistetaan tiedosto ”%s”"
 
-#: commands.c:683
+#: src/commands.c:684
 #, fuzzy
 msgid "#  recipe to execute"
 msgstr "#  käynnisetttävät komennot"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (sisäänrakennettu):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (tiedosto ”%s”, rivi %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -132,224 +134,226 @@ msgstr ""
 "\n"
 "# Hakemistot\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: tilaa ei voitu lukea.\n"
 
-#: dir.c:1085
+#: src/dir.c:1089
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr "# %s (avain %s, maika %d): ei voitu avata.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): ei voitu avata.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (laite %ld, i-solmu %ld): ei voitu avata.\n"
 
-#: dir.c:1122
+#: src/dir.c:1126
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): "
 msgstr "# %s (avain %s, maika %d: "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (laite %d, i-solmu [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (laite %ld, i-solmu %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Ei"
 
 # Juuri näin, muodostetaan käännöslause yksittäisistä sanoista...
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " tiedostoa, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "ei"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " mahdottomuutta"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " tähän mennessä."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " mahdottomuutta %lu hakemistossa.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Rekursiivinen muuttuja ”%s” viittaa (lopulta) itseensä"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "päättämätön muuttujaviittaus"
 
-#: file.c:278
+#: src/file.c:278
 #, fuzzy, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Tiedostolle ”%s” määriteltiin komentoja paikassa %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, fuzzy, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Tiedostolle ”%s” löytyi komentoja oletussääntöhaussa,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "mutta ”%s”:n katsotaan nyt olevan sama tiedosto kuin ”%s”."
 
-#: file.c:290
+#: src/file.c:290
 #, fuzzy, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 "Tiedoston ”%s” komentoja ei huomioida, vaan käytetään komentoja tiedostosta "
 "”%s”."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Poistetaan aputiedosto ”%s”"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Poistetaan aputiedostot...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Tämänhetkinen aika"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Aikaleima ei ole sallitulla välillä, korvataan %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Ei kohde:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Arvokas tiedosto (ennakkoehto .PRECIOUS:ille)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Valekohde (ennakkoehto .PHONY:lle)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Komentorivikohde."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Oletus-, MAKEFILES- tai -include/sinclude -makefile-tiedosto."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Sisäänrakennettu sääntö"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Oletussääntöhaku on suoritettu."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Oletussääntöhakua ei ole suoritettu."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr ""
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Tiedosto on välitason ennakkoehto."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Tuotetaan myös:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Muutosaikaa ei koskaan tarkastettu."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Tiedosto ei ole olemassa."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Tiedosto on hyvin vanha."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Viimeksi muutettu %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Tiedosto on päivitetty."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Tiedostoa ei ole päivitetty."
 
-#: file.c:1008
+#: src/file.c:1062
 #, fuzzy
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Ajossa olevat komennot (TÄMÄ ON OHJELMISTOVIKA)."
 
-#: file.c:1011
+#: src/file.c:1065
 #, fuzzy
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Ajossa olevat riippuvuuskomennot (TÄMÄ ON OHJELMISTOVIKA)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Päivitetty onnistuneesti."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Vaatii päivitystä (-q on asetettu)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Päivitys epäonnistui."
 
-#: file.c:1032
+#: src/file.c:1086
 #, fuzzy
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Virheellinen arvo ”command_state”-jäsenessä!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -357,7 +361,7 @@ msgstr ""
 "\n"
 "# Tiedostot"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -367,333 +371,340 @@ msgstr ""
 "# tilasto tiedostojen hajautustaulusta:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "ei-numeerinen ensimmäinen argumentti ”word”-funktiolle"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "”word”-funktion ensimmäisen argumentin on oltava suurempi kuin 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "ei-numeerinen ensimmäinen argumentti ”wordlist”-funktiolle"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "ei-numeerinen toinen argumentti ”wordlist”-funktiolle"
 
-#: function.c:1525
+#: src/function.c:1533
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "create_child_process: DuplicateHandle(In) epäonnistui (v=%d)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "create_child_process: DuplicateHandle(Err) epäonnistui (v=%d)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() epäonnistui (v=%ld)\n"
 
-#: function.c:1564
-#, fuzzy
+#: src/function.c:1572
+#, fuzzy, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe (): process_init_fd() epäonnistui\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Siivotaan väliaikainen komentotiedosto %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "tiedosto: tiedostonimi puuttuu"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "tiedosto: liian monta argumenttia"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "Virheellinen tiedostotoiminto: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "liian vähän (%d) argumentteja funktiolle ”%s”"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "ei toteutettu tällä alustalla: funktio ”%s”"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "päättämätön kutsu funktioon ”%s”: puuttuva ”%c”"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Tyhjä funktionimi"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Virheellinen funktionimi: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Funktionimi on liian pitkä: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, fuzzy, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Virheellinen vähimmäisargumenttimäärä (%d) funktiolle %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, fuzzy, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Virheellinen enimmäisargumenttimäärä (%d) funktiolle %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: valitsin ”%s” on moniselitteinen\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: valitsin ”--%s” ei salli argumenttia\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: valitsin ”%c%s” ei salli argumenttia\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: valitsin ”%s” vaatii argumentin\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: tunnistamaton valitsin ”--%s”\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: tunnistamaton valitsin ”%c%s”\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: virheellinen valitsin -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: virheellinen valitsin -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: valitsin vaatii argumentin -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: valitsin ”-W %s” on moniselitteinen\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: valitsin ”-W %s” ei salli argumenttia\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Lavennetaan ”%s”\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, fuzzy, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "ei voida varata %ld tavua hajautustaululle: muisti lopussa"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Kuormitus=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Uudelleenhajautus=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Törmäykset=%ld/%ld=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Etsitään oletussääntöä kohteelle ”%s”.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Etsitään arkistojäsenen oletussääntöä kohteelle ”%s”.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Vältetään oletussääntörekursio.\n"
 
-#: implicit.c:486
-#, c-format
-msgid "Stem too long: '%.*s'.\n"
+#: src/implicit.c:484
+#, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr "Liian pitkä runko: ”%.*s”.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Kokeillaan hahmosääntöä rungolla ”%.*s”.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Hylätään mahdoton säännön ennakkoehto ”%s”.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Hylätään mahdoton oletusennakkoehto ”%s”.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Yritetään käyttää säännön ennakkoehtoa ”%s”.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Yritetään käyttää oletusennakkoehtoa ”%s”.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Löydettiin ennakkoehto ”%s”, joka on VPATH ”%s”\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Etsitään sääntöä aputiedostolla ”%s”.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Väliaikaistiedoston luominen ei onnistu\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (muisti vedostettu)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ei huomioida)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<sisäänrakennettu>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Virhe %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Odotetaan keskeneräisiä töitä...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr ""
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (etä)"
 
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Siivotaan väliaikainen komentotiedosto %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, fuzzy, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Siivotaan väliaikainen komentotiedosto %s\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, fuzzy, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Poistetaan ketjusta lapsiprosessi 0x%08lx PID %ld%s.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, fuzzy, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() epäonnistui prosessin käynnistämisessä (v=%d)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -702,98 +713,92 @@ msgstr ""
 "\n"
 "Laskettiin %d argumenttia epäonnistuneessa käynnistyksessä\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, fuzzy, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Lisätään ketjuun lapsiprosessi 0x%08lx (%s) PID %ld%s.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: kohde ”%s” ei ole olemassa"
 
-#: job.c:1841
+#: src/job.c:1905
 #, fuzzy, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr ""
 "%1$s”%3$s”-kohteen tarvitseman kohteen ”%2$s” tuottamiseen ei ole sääntöä%4$s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "kuormarajoja ei voi ottaa käyttöön tässä käyttöjärjestelmässä"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "kuormarajaa ei voi ottaa käyttöön: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 "tiedostokahvoja ei ole enempää: vakiosyötteen kahdentaminen ei onnistunut\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 "tiedostokahvoja ei ole enempää: vakiotulosteen kahdentaminen epäonnistui\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 "tiedostokahvoja ei ole enempää: vakiovirhetulosteen kahdentaminen ei "
 "onnistunut\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Vakiosyötettä ei voitu palauttaa\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Vakiotulostetta ei voitu palauttaa\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Vakiovirhetulostetta ei voitu palauttaa\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Komentoa ei löytynyt\n"
-
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Komentoa ei löytynyt\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Kuoriohjelmaa ei löytynyt"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: ympäristötila saattaa olla lopussa"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL muuttunut (oli ”%s”, nyt ”%s”)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Luodaan väliaikainen komentotiedosto %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -801,7 +806,7 @@ msgstr ""
 "Komentojonotiedoston sisältö:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -810,59 +815,55 @@ msgstr ""
 "Komentojonotiedoston sisältö:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (rivi %d) Väärä kuoriympäristö (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, fuzzy, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Rinnakkaiset työt (-j) eivät ole tuettuja tällä alustalla."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Valitsimet:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 "  -b, -m                      Yhteensopivuuden vuoksi jätetään huomiotta.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Tuota kaikki kohteet ehdoitta.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -870,16 +871,16 @@ msgstr ""
 "  -C HAKEMISTO, --directory=HAKEMISTO\n"
 "                              Siirry HAKEMISTOon ennen jatkamista.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          Näytä runsaasti vianetsintätietoja.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr "  --debug[=LIPUT]             Näytä monenlaisia vianetsintätietoja.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -888,12 +889,12 @@ msgstr ""
 "                              Ympäristömuuttujat kumoavat makefile-"
 "tiedostot.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -901,18 +902,18 @@ msgstr ""
 "  -f TIEDOSTO, --file=TIEDOSTO, --makefile=TIEDOSTO\n"
 "                              Käytä TIEDOSTOa makefile-tiedostona.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Näytä tämä viesti ja poistu.\n"
 
-#: main.c:360
+#: src/main.c:357
 #, fuzzy
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 "  -i, --ignore-errors         Älä huomioi suoritettujen komentojen "
 "virheitä.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -921,7 +922,7 @@ msgstr ""
 "                              Etsi sisällytettäviä makefile:ja "
 "HAKEMISTOsta.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -929,14 +930,14 @@ msgstr ""
 "  -j [N], --jobs[=N]          Salli N yhtäaikaista työtä; ilman N:ää "
 "ääretön.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Jatka vaikka joidenkin kohteiden tuottaminen\n"
 "                                epäonnistuisi.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -946,7 +947,7 @@ msgstr ""
 "                              Älä aloita useita töitä ellei kuormitus alle "
 "N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -954,7 +955,7 @@ msgstr ""
 "  -L, --check-symlink-times   Käytä uusinta mtime-aikaa symlinkkien ja\n"
 "                                kohteen välillä.\n"
 
-#: main.c:374
+#: src/main.c:371
 #, fuzzy
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
@@ -965,7 +966,7 @@ msgstr ""
 "                              Näytä ajettavat komennot, älä käynnistä "
 "niitä.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -974,17 +975,17 @@ msgstr ""
 "  -o TIEDOSTO, --old-file=TIEDOSTO, --assume-old=TIEDOSTO\n"
 "                              Käsittele TIEDOSTO vanhana, älä tuota sitä.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Näytä make:in sisäinen tietokanta.\n"
 
-#: main.c:385
+#: src/main.c:382
 #, fuzzy
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
@@ -993,22 +994,29 @@ msgstr ""
 "  -q, --question              Älä aja komentoja; paluuarvo kertoo ajan-\n"
 "                                tasaisuuden.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Poista käytöstä sisäiset oletussäännöt.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Poista käytöstä sisäiset muuttuja-asetukset.\n"
 
-#: main.c:391
+#: src/main.c:388
 #, fuzzy
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Älä kaiuta komentoja.\n"
 
-#: main.c:393
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Älä aja komentoja; paluuarvo kertoo ajan-\n"
+"                                tasaisuuden.\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1016,25 +1024,25 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Kumoaa valitsimen -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr "  -t, --touch                 Kosketa kohteita tuottamisen sijaan.\n"
 
-#: main.c:398
+#: src/main.c:397
 #, fuzzy
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  -d                          Näytä runsaasti vianetsintätietoja.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               Näytä make:in versionumero ja poistu.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Näytä nykyinen hakemisto.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1042,7 +1050,7 @@ msgstr ""
 "  --no-print-directory        Kumoa -w, vaikka se olisi käytössä "
 "oletuksena.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1051,7 +1059,7 @@ msgstr ""
 "new=TIEDOSTO\n"
 "                              Käsittele TIEDOSTO aina uutena.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1059,26 +1067,27 @@ msgstr ""
 "  --warn-undefined-variables  Varoita viittauksista määrittelemättömiin\n"
 "                                muuttujiin.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "tyhjä merkkijono ei kelpaa tiedostonimeksi"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "tuntematon vianetsintätason määritys ”%s”"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Keskeytys/poikkeus siepattu (koodi = 0x%lx, osoite = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -1093,139 +1102,146 @@ msgstr ""
 "Poikkeusliput = %x\n"
 "Poikkeusosoite = %x\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Suojausvirhe: kirjoitusoperaatio osoitteeseen 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Suojausvirhe: lukuoperaatio osoitteeseen 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, fuzzy, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell asettaa default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, fuzzy, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell: polkuhaku asetti default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s keskeytyy 30 sekunniksi..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) valmis. Jatketaan.\n"
-
-#: main.c:1627
-#, fuzzy
+#: src/main.c:1609
+#, fuzzy, c-format
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "varoitus: työpalvelin ei käytettävissä: käytetään -j1. Lisää ”+” ylemmän "
 "tason make-sääntöön."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr "varoitus: -jN pakotettu ali-make:ssa: poistetaan työpalvelin käytöstä."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile-tiedosto vakiosyötteestä määritelty kahdesti."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (väliaikaistiedosto)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (väliaikaistiedosto)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "varoitus: -jN pakotettu ali-make:ssa: poistetaan työpalvelin käytöstä."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Rinnakkaiset työt (-j) eivät ole tuettuja tällä alustalla."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Palataan yhden työn (-j1) tilaan."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Ei tukea symbolisille linkeille: poistetaan -L käytöstä."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Päivitetään makefile-tiedostoja....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
 "Ei uudelleentuoteta makefile-tiedostoa ”%s” – vältetään mahdollinen ikuinen "
 "silmukka.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Makefile-tiedoston ”%s” uudelleentuottaminen epäonnistui."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Sisällytettyä makefile-tiedostoa ”%s” ei löytynyt."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Makefile-tiedostoa ”%s” ei löytynyt"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Ei voitu siirtyä takaisin alkuperäiseen hakemistoon."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Uudelleenkäynnistetään[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (väliaikaistiedosto): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL sisältää yli yhden kohteen"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Kohteita ei ole annettu, eikä makefileä löytynyt"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Ei kohteita"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Kohteita ei ole annettu, eikä makefileä löytynyt"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr ""
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "varoitus: Havaittu väärä kellonaika. Käännösversio saattaa olla "
 "epätäydellinen."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Käyttö: %s [valitsimet] [kohde] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1234,7 +1250,7 @@ msgstr ""
 "\n"
 "Tämä ohjelma on käännetty järjestelmälle %s.\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1243,33 +1259,33 @@ msgstr ""
 "\n"
 "Tämä ohjelma on käännetty järjestelmälle %s (%s).\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Ilmoita ohjelmistovioista (englanniksi) osoitteeseen <bug-make@gnu.org>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "valitsin ”%s%s” vaatii ei-tyhjän merkkijonoargumentin"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "valitsin ”-%c” vaatii positiivisen kokonaislukuargumentin"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sTämä ohjelma on käännetty järjestelmälle %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sTämä ohjelma on käännetty järjestelmälle %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1278,7 +1294,7 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1287,7 +1303,7 @@ msgstr ""
 "\n"
 "# Make-tietokanta, tulostettu %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1296,353 +1312,385 @@ msgstr ""
 "\n"
 "# Make-tietokanta saatu valmiiksi %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Tuntematon virhe %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: käyttäjä %lu (todellinen %lu), ryhmä %lu (todellinen %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Alkuperäiset käyttöoikeudet"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Käyttäjän käyttöoikeudet"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Make-prosessin käyttöoikeudet"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Lapsiprosessin käyttöoikeudet"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Siirrytään tuntemattomaan hakemistoon\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Poistutaan tuntemattomasta hakemistosta\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Siirrytään hakemistoon ”%s”\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Poistutaan hakemistosta ”%s”\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Siirrytään tuntemattomaan hakemistoon\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Poistutaan tuntemattomasta hakemistosta\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Siirrytään hakemistoon ”%s”\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Poistutaan hakemistosta ”%s”\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "kirjoitusvirhe: vakiotuloste"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ". Seis.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "luodaan työputki"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 #, fuzzy
 msgid "duping jobs pipe"
 msgstr "luodaan työputki"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "alustetaan työpalvelimen putki"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, fuzzy, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "sisäinen virhe: virheellinen --jobserver-fds -merkkijono ”%s”"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 #, fuzzy
 msgid "jobserver pipeline"
 msgstr "alustetaan työpalvelimen putki"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "työpalvelimen kirjoitus"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 #, fuzzy
 msgid "pselect jobs pipe"
 msgstr "työputken luku"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "työputken luku"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Luetaan makefile-tiedostoja...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Luetaan makefile-tiedosto ”%s”"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr ""
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (hakupolku)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (ei välitetä)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (ei ~-laajennusta)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Ohitetaan UTF-8-BOM makefile-tiedostossa ”%s”\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Ohitetaan UTF-8-BOM makefile-puskurissa\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "virheellinen syntaksi ehtolauseessa"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
-#, fuzzy
+#: src/read.c:986
+#, fuzzy, c-format
 msgid "recipe commences before first target"
 msgstr "komennot alkavat ennen ensimmäistä kohdetta"
 
-#: read.c:1034
-#, fuzzy
+#: src/read.c:1035
+#, fuzzy, c-format
 msgid "missing rule before recipe"
 msgstr "puuttuva sääntö ennen komentoja"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr " (ehkä tarkoitit sarkainta eikä kahdeksaa välilyöntiä?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "puuttuva erotin"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "puuttuva kohdehahmo"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "useita kohdehahmoja"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "kohdehahmo ei sisällä ”%%”-merkkiä"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "puuttuva ”endif”"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "tyhjä muuttujan nimi"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "ylimääräistä tekstiä ”endef”-toimintaohjeen jälkeen"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "puuttuva ”endef”, päättämätön ”define”"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "ylimääräistä tekstiä ”endef”-toimintaohjeen jälkeen"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "ylimääräistä tekstiä ”%s”-toimintaohjeen jälkeen"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "ylimääräinen ”%s”"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "vain yksi ”else” ehtolausetta kohden"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Väärin muotoiltu kohdekohtainen muuttujamäärittely"
 
 # skripti?
-#: read.c:1950
-#, fuzzy
+#: src/read.c:1968
+#, fuzzy, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "ennakkoehtoja ei voi määritellä komentoskripteissä"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr ""
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr ""
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "kohde ”%s” ei täsmää kohdehahmon kanssa"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "kohdetiedostolla ”%s” on sekä :- että ::-merkinnät"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "kohde ”%s” annettu yli yhden kerran samassa säännössä"
 
-#: read.c:2116
+#: src/read.c:2138
 #, fuzzy, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "varoitus: syrjäytetään kohteen ”%s” komennot"
 
-#: read.c:2119
+#: src/read.c:2141
 #, fuzzy, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "varoitus: ei huomioida vanhoja komentoja kohteelle ”%s”"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr ""
 
-#: read.c:2542
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "varoitus: syrjäytetään kohteen ”%s” komennot"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "varoitus: havaittu NUL-merkki, rivin loppuosaa ei huomioida"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Kohteelle ”%s” ei tarvitse tehdä mitään."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "”%s” on ajan tasalla."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Karsitaan tiedosto ”%s”.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
 "%1$s”%3$s”-kohteen tarvitseman kohteen ”%2$s” tuottamiseen ei ole sääntöä%4$s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sKohteen ”%s” tuottamiseen ei ole sääntöä%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Tarkastellaan kohdetiedostoa ”%s”.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Tiedoston ”%s” päivitysyritys epäonnistui äskettäin.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Tiedostoa ”%s” on jo tarkasteltu.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Päivitetään edelleen tiedostoa ”%s”.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Tiedoston ”%s” päivitys valmistui.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Tiedosto ”%s” ei ole olemassa.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1650,147 +1698,147 @@ msgstr ""
 "*** Varoitus: .LOW_RESOLUTION_TIME-tiedostolla ”%s” on korkearesoluutioinen "
 "aikaleima"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Kohteelle ”%s” löytyi oletussääntö.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Kohteelle ”%s” ei löytynyt oletussääntöä.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, fuzzy, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Käytetään oletuskomentoja kohteelle ”%s”.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Kehäriippuvuus %s <- %s hylätty."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Kohdetiedoston ”%s” ennakkoehdot täytetty.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Kohteen ”%s” ennakkoehtoja täytetään.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Luovutaan kohdetiedostosta ”%s”.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Kohdetta ”%s” ei tuotettu uudelleen virheiden vuoksi."
 
-#: remake.c:768
+#: src/remake.c:751
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Ennakkoehto ”%s” on vanhempi kuin kohde ”%s”.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Kohteen ”%2$s” ennakkoehto ”%1$s” ei ole olemassa.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Ennakkoehto ”%s” on uudempi kuin kohde ”%s”.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Ennakkoehto ”%s” on vanhempi kuin kohde ”%s”.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Tuotetaan ”%s”, koska always-make-lippu on käytössä.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Ei tarvetta uudelleentuottaa kohdetta ”%s”"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; käytetään VPATH-nimeä ”%s”"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Kohde ”%s” on tuotettava uudelleen.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Ei huomioida VPATH-nimeä ”%s”.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr ""
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Kohdetiedoston ”%s” uudelleentuottaminen epäonnistui.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Kohdetiedosto ”%s” uudelleentuotettiin onnistuneesti.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr ""
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Käytetään oletuskomentoja kohteelle ”%s”.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Varoitus: Tiedoston ”%s” muutosaika on tulevaisuudessa"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Varoitus: Tiedoston ”%s” muutosaika on %s sekuntia tulevaisuudessa"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS-elementti ”%s” ei ole hahmo"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr ""
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1798,7 +1846,7 @@ msgstr ""
 "\n"
 "# Oletussäännöt"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1806,188 +1854,184 @@ msgstr ""
 "\n"
 "# Ei oletussääntöjä."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u oletussääntöä, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr ""
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "VIKA: num_pattern_rules on väärä! %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "tuntematon signaali"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Linjankatkaisu"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Keskeytys"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Lopetettu"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Virheellinen käsky"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Jäljitys/katkaisupisteansa"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Keskeytetty"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT-ansa"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT-ansa"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Liukulukupoikkeus"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Tapettu"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Väylävirhe"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Muistialueen ylitys"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Virheellinen järjestelmäkutsu"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Katkennut putki"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Herätyskello"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Päätetty"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Käyttäjän määrittelemä signaali 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Käyttäjän määrittelemä signaali 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Lapsi lopetti"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Sähkökatko"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Pysäytetty"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Pysäytetty (päätteen syöte)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Pysäytetty (päätteen tuloste)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Pysäytetty (signaali)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Suoritinaikaraja ylittynyt"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Tiedoston kokoraja ylitetty"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtuaaliajastin vanhentunut"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Profilointiajastin vanhentunut"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Ikkuna vaihtunut"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Jatkettu"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Kiireellinen I/O-tilanne"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O mahdollista"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Resurssi menetetty"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Vaarasignaali"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Tietopyyntö"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Käytettävissä ei ole liukulukusuoritinta"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1995,31 +2039,31 @@ msgid ""
 "B\n"
 msgstr ""
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2027,44 +2071,44 @@ msgstr ""
 "# tilasto tiedostojen hajautustaulusta:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automaattinen"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "oletus"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "ympäristö"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "-e:n alainen ympäristö"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "komentorivi"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "”override”-toimintaohje"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (tiedosto ”%s”, rivi %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# muuttujajoukon hajautustaulutilastot:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2072,7 +2116,7 @@ msgstr ""
 "\n"
 "# Muuttujat\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2080,7 +2124,7 @@ msgstr ""
 "\n"
 "# Hahmokohtaisia muuttujien arvoja"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2088,7 +2132,7 @@ msgstr ""
 "\n"
 "# Ei hahmokohtaisia muuttuja-arvoja."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2097,48 +2141,48 @@ msgstr ""
 "\n"
 "# %u hahmokohtaista muuttuja-arvoa"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "varoitus: määrittelemätön muuttuja ”%.*s”"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, fuzzy, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search epäonnistui, arvo %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-varoitus, Ctrl-Y-käsittely on ehkä otettava uudelleen käyttöön DCL:stä.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "SISÄÄNRAKENNETTU CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, fuzzy, c-format
 msgid "Append output to %s\n"
 msgstr "Tuloste uudelleenohjattu kohteeseen %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Käynnistetään sen sijaan %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2146,11 +2190,11 @@ msgstr ""
 "\n"
 "# VPATH-hakupolut\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Ei ”vpath”-hakupolkuja."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2159,7 +2203,7 @@ msgstr ""
 "\n"
 "# %u ”vpath”-hakupolkua.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2167,7 +2211,7 @@ msgstr ""
 "\n"
 "# Ei yleistä (”VPATH”-muuttuja) hakupolkua."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2177,37 +2221,58 @@ msgstr ""
 "# Yleinen (”VPATH”-muuttuja) hakupolku:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Komentoa ei löytynyt\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Komentoa ei löytynyt\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Kuoriohjelmaa ei löytynyt"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s keskeytyy 30 sekunniksi..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) valmis. Jatketaan.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Tuntematon virhe %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Varoitus: Tiedoston ”%s” muutosaika on tulevaisuudessa"
+
 #~ msgid "%s[%s] Error 0x%x%s"
 #~ msgstr "%s[%s] Virhe 0x%x%s"
 
index 8c4a0f3b16fb674bce1faa567c7a15e8a900b6aa..71682caadcd1a513adfa79f2e35ab86e3eaa9394 100644 (file)
Binary files a/po/fr.gmo and b/po/fr.gmo differ
index c9d5536216b100533fbe4ee61940643b64d98ebe..70d034939db00189706eb502e8a30b104e296133 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
-# Messages français pour make.
-# Copyright © 2010 Free Software Foundation, Inc.
+# Messages français pour make.
+# Copyright Â© 2010 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 #
 # 30-juillet-2001, n'avons plus de nouvelle de Marc depuis 5 janvier 1997
-# Marc Baudoin <babafou@ensta.fr>, Frédéric Liné <line@MicroNet.fr>, 1996.
+# Marc Baudoin <babafou@ensta.fr>, Frédéric Liné <line@MicroNet.fr>, 1996.
 # Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996-2006
 # Christophe Combelles <ccomb@free.fr>, 2009, 2010
-# Kévin Raymond <shaiton@fedoraproject.org>, 2012, 2013, 2015
+# Kévin Raymond <shaiton@fedoraproject.org>, 2012-2016, 2018
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU make 4.1\n"
+"Project-Id-Version: GNU make 4.2.1\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2015-03-11 22:20+0100\n"
-"Last-Translator: Kévin Raymond <shaiton@fedoraproject.org>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2018-08-28 17:59+0200\n"
+"Last-Translator: Kévin Raymond <shaiton@fedoraproject.org>\n"
 "Language-Team: French <traduc@traduc.org>\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 1.5.4\n"
+"X-Generator: Poedit 2.1.1\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
-msgstr "tentative d'utiliser une fonctionnalité non prise en charge : « %s »"
+msgstr "tentative d'utiliser une fonctionnalité non prise en charge : Â«Â %s »"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "impossible de modifier la date d'un membre d'une archive sur VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
-msgstr "touch : l'archive « %s » n'existe pas"
+msgstr "touch : l'archive Â«Â %s » n'existe pas"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
-msgstr "touch : « %s » n'est pas une archive valide"
+msgstr "touch : Â«Â %s » n'est pas une archive valide"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
-msgstr "touch : le membre « %s » n'existe pas dans « %s »"
+msgstr "touch : le membre Â«Â %s » n'existe pas dans Â«Â %s »"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
-msgstr "touch : mauvais code de retour de ar_member_touch pour « %s »"
+msgstr "touch : mauvais code de retour de ar_member_touch pour Â«Â %s »"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() n'a pas pu extraire les infos du module. Code = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
-msgstr "lbr$ini_control() a échoué avec un code = %d"
+msgstr "lbr$ini_control() a échoué avec un code = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
-"impossible d'ouvrir la bibliothèque « %s » pour récupérer le statut du "
-"membre « %d »"
+"impossible d'ouvrir la bibliothèque « %s » pour récupérer le statut du "
+"membre Â«Â %d »"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
-msgstr "Membre `%s'%s : %ld octets à %ld (%ld).\n"
+msgstr "Membre `%s'%s : %ld octets à %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
-msgstr " (le nom peut être tronqué)"
+msgstr " (le nom peut être tronqué)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Date %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "La recette contient trop de lignes (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
-msgstr "*** Break.\n"
+msgstr "*** Arrêt.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr ""
-"*** [%s] le membre « %s » de l'archive peut avoir un problème ; il n'a pas "
-"été supprimé"
+"*** [%s] le membre « %s » de l'archive peut avoir un problème ; il n'a pas "
+"été supprimé"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr ""
-"*** Le membre « %s » de l'archive peut avoir un problème ; il n'a pas été "
-"supprimé"
+"*** Le membre « %s » de l'archive peut avoir un problème ; il n'a pas été "
+"supprimé"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
-msgstr "*** [%s] Suppression du fichier « %s »"
+msgstr "*** [%s] Suppression du fichier Â«Â %s »"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
-msgstr "*** Suppression du fichier « %s »"
+msgstr "*** Suppression du fichier Â«Â %s »"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
-msgstr "#  recette à exécuter"
+msgstr "#  recette à exécuter"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
-msgstr " (commande interne) :"
+msgstr " (commande interne) :"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
-msgstr " (de « %s », ligne %lu) : \n"
+msgstr " (de Â«Â %s », ligne %lu) : \n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
 msgstr ""
 "\n"
-"# Répertoires\n"
+"# Répertoires\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
-msgstr "# %s: « stat » impossible.\n"
+msgstr "# %s: Â«Â stat » impossible.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (clé %s, mtime %d) : ouverture impossible.\n"
+msgstr "# %s (clé %s, mtime %I64u) : ouverture impossible.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
-msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : ouverture impossible.\n"
+msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : ouverture impossible.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
-msgstr "# %s (périphérique %ld, inode %ld) : ouverture impossible.\n"
+msgstr "# %s (périphérique %ld, inode %ld) : ouverture impossible.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (périphérique %s, mtime %d) : "
+msgstr "# %s (clé %s, mtime %I64u) : "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
-msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : "
+msgstr "# %s (périphérique %d, inode [%d,%d,%d]) : "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
-msgstr "# %s (périphérique %ld, inode %ld) : "
+msgstr "# %s (périphérique %ld, inode %ld) : "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Aucun"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " fichier(s), "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "aucune"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
-msgstr " impossibilité(s)"
+msgstr " impossibilité(s)"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " jusqu'ici."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
-msgstr " impossibilités dans %lu répertoires.\n"
+msgstr " impossibilités dans %lu répertoires.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
-msgstr "La variable récursive « %s » se référence elle-même (à la fin)"
+msgstr "La variable récursive « %s » se référence elle-même (à la fin)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
-msgstr "référence incomplète à une variable"
+msgstr "référence incomplète à une variable"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
-msgstr "Une recette a été spécifiée pour le fichier « %s » dans %s : %lu,"
+msgstr "Une recette a Ã©té spécifiée pour le fichier Â«Â %s » dans %s : %lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
-"La recette pour le fichier « %s » a été trouvée par une recherche de règle "
+"La recette pour le fichier « %s » a été trouvée par une recherche de règle "
 "implicite,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr ""
-"mais « %s » est maintenant considéré comme étant le même fichier que « %s »."
+"mais Â«Â %s » est maintenant considéré comme Ã©tant le même fichier que Â«Â %s »."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
-msgstr "La recette pour « %s » sera ignorée en faveur de celle pour « %s »."
+msgstr "La recette pour Â«Â %s » sera ignorée en faveur de celle pour Â«Â %s »."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
-"impossible de renommer le deux-points simple « %s » en deux-points double "
-"« %s »"
+"impossible de renommer le deux-points simple Â«Â %s » en deux-points double "
+"« %s »"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
-"impossible de renommer le deux-points double « %s » en deux-points simple "
-"« %s »"
+"impossible de renommer le deux-points double Â«Â %s » en deux-points simple "
+"« %s »"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
-msgstr "*** Suppression du fichier intermédiaire « %s »"
+msgstr "*** Suppression du fichier intermédiaire Â«Â %s »"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
-msgstr "Suppression des fichiers intermédiaires...\n"
+msgstr "Suppression des fichiers intermédiaires...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Heure actuelle"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s : horodatage hors limite ; remplacement par %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
-msgstr "# Pas une cible :"
+msgstr "# Pas une cible :"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
-msgstr "#  Fichier précieux (dépendance de .PRECIOUS)."
+msgstr "#  Fichier précieux (dépendance de .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
-msgstr "#  Cible factice (dépendance de .PHONY)."
+msgstr "#  Cible factice (dépendance de .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Cible de la ligne de commande."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
-msgstr "#  Une valeur par défaut, MAKEFILES ou -include/sinclude makefile."
+msgstr "#  Une valeur par défaut, MAKEFILES ou -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
-msgstr "# Pas de règle interne"
+msgstr "# Pas de règle interne"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
-msgstr "#  La recherche de règle implicite a été effectuée."
+msgstr "#  La recherche de règle implicite a été effectuée."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
-msgstr "#  La recherche de règle implicite n'a pas été effectuée."
+msgstr "#  La recherche de règle implicite n'a pas été effectuée."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
-msgstr "#  Préfixe de motif implicite ou statique : « %s »\n"
+msgstr "#  Préfixe de motif implicite ou statique : Â«Â %s »\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
-msgstr "#  Le fichier est une dépendance intermédiaire."
+msgstr "#  Le fichier est une dépendance intermédiaire."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
-msgstr "#  Fabrique également :"
+msgstr "#  Fabrique Ã©galement :"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
-msgstr "#  Heure de modification jamais vérifiée."
+msgstr "#  Heure de modification jamais vérifiée."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "# Le fichier n'existe pas."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
-msgstr "#  Le fichier est très ancien."
+msgstr "#  Le fichier est très ancien."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
-msgstr "#  Dernière modification %s\n"
+msgstr "#  Dernière modification %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
-msgstr "#  Le fichier a été mis à jour."
+msgstr "#  Le fichier a été mis à jour."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
-msgstr "#  Le fichier n'a pas été mis à jour."
+msgstr "#  Le fichier n'a pas été mis à jour."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
-msgstr "#  Recette en cours d'exécution (CECI EST UNE ANOMALIE)."
+msgstr "#  Recette en cours d'exécution (CECI EST UNE ANOMALIE)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr ""
-"#  Recette de dépendances en cours d'exécution (CECI EST UNE ANOMALIE)."
+"#  Recette de dépendances en cours d'exécution (CECI EST UNE ANOMALIE)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
-msgstr "#  Mise à jour réussie."
+msgstr "#  Mise à jour réussie."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
-msgstr "#  À besoin d'être mis à jour (l'option -q est activée)."
+msgstr "#  À besoin d'être mis à jour (l'option -q est activée)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
-msgstr "#  N'a pas pu être mis à jour."
+msgstr "#  N'a pas pu être mis à jour."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
-msgstr "#  Valeur non valable dans le membre « command_state » !"
+msgstr "#  Valeur non valable dans le membre Â«Â command_state » !"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -369,537 +371,535 @@ msgstr ""
 "\n"
 "# Fichiers"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
 "# "
 msgstr ""
 "\n"
-"# stats des tables de hachage des fichiers :\n"
+"# stats des tables de hachage des fichiers :\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
-msgstr "%s : le champ « %s » n'est pas en cache : %s"
+msgstr "%s : le champ Â«Â %s » n'est pas en cache : %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
-msgstr "le premier argument de la fonction « word » doit être numérique"
+msgstr "le premier argument de la fonction « word » doit être numérique"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
-msgstr "le premier argument de la fonction « word » doit être supérieur à 0"
+msgstr "le premier argument de la fonction « word » doit être supérieur à 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
-msgstr "le premier argument de la fonction « wordlist » doit être numérique"
+msgstr "le premier argument de la fonction « wordlist » doit être numérique"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
-msgstr "le deuxième argument de la fonction « wordlist » doit être numérique"
+msgstr "le deuxième argument de la fonction « wordlist » doit être numérique"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
-msgstr "windows32_openpipe : DuplicateHandle(In) a échoué (e=%ld)\n"
+msgstr "windows32_openpipe : DuplicateHandle(In) a échoué (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
-msgstr "windows32_openpipe : DuplicateHandle(Err) a échoué (e=%ld)\n"
+msgstr "windows32_openpipe : DuplicateHandle(Err) a échoué (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
-msgstr "CreatePipe() a échoué (e=%ld)\n"
+msgstr "CreatePipe() a échoué (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
-msgstr "windows32_openpipe() : process_init_fd() a échoué\n"
+msgstr "windows32_openpipe() : process_init_fd() a échoué\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Nettoyage du fichier de commandes temporaire %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
-msgstr ""
+msgstr "file : fichier manquant"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
-msgstr "open : %s : %s"
+msgstr "open : %s : %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
-msgstr "write : %s : %s"
+msgstr "write : %s : %s"
 
-#: function.c:2230 function.c:2267
-#, fuzzy, c-format
+#: src/function.c:2245 src/function.c:2282
+#, c-format
 msgid "close: %s: %s"
-msgstr "open : %s : %s"
+msgstr "close : %s : %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
-msgstr ""
+msgstr "file : trop d'arguments"
 
-#: function.c:2262
-#, fuzzy, c-format
+#: src/function.c:2277
+#, c-format
 msgid "read: %s: %s"
-msgstr "write : %s : %s"
+msgstr "read : %s : %s"
 
-#: function.c:2275
-#, fuzzy, c-format
+#: src/function.c:2290
+#, c-format
 msgid "file: invalid file operation: %s"
-msgstr "Fichier d'opérations invalide : %s"
+msgstr "file : opération invalide : %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
-msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »"
+msgstr "nombre d'arguments insuffisant (%d) pour la fonction Â«Â %s »"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
-msgstr "non implémenté sur cette plateforme : fonction « %s »"
+msgstr "non implémenté sur cette plateforme : fonction Â«Â %s »"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
-msgstr "appel à la fonction « %s » non terminé : « %c » manquant"
+msgstr "appel Ã  la fonction Â«Â %s » non terminé : Â«Â %c » manquant"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Nom de fonction absent"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
-msgstr "Nom de fonction invalide : %s"
+msgstr "Nom de fonction invalide : %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
-msgstr "Nom de fonction trop long : %s"
+msgstr "Nom de fonction trop long : %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »"
+msgstr "Nombre d'arguments insuffisant (%u) pour la fonction %s"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "nombre d'arguments insuffisant (%d) pour la fonction « %s »"
+msgstr "Nombre d'arguments excessif (%u) pour la fonction %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
-msgstr "%s : l'option « %s » est ambiguë\n"
+msgstr "%s : l'option « %s » est ambiguë\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
-msgstr "%s : l'option « --%s » ne prend pas d'argument\n"
+msgstr "%s : l'option Â«Â --%s » ne prend pas d'argument\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
-msgstr "%s : l'option « %c%s » ne prend pas d'argument\n"
+msgstr "%s : l'option Â«Â %c%s » ne prend pas d'argument\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
-msgstr "%s : l'option « %s » nécessite un argument\n"
+msgstr "%s : l'option « %s » nécessite un argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
-msgstr "%s : option non reconnue « --%s »\n"
+msgstr "%s : option non reconnue Â«Â --%s »\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
-msgstr "%s : option non reconnue « %c%s »\n"
+msgstr "%s : option non reconnue Â«Â %c%s »\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
-msgstr "%s : option non admise -- %c\n"
+msgstr "%s : option non admise -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
-msgstr "%s : option incorrecte -- %c\n"
+msgstr "%s : option incorrecte -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
-msgstr "%s : l'option nécessite un argument -- %c\n"
+msgstr "%s : l'option nécessite un argument -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
-msgstr "%s : l'option « -W %s » est ambiguë\n"
+msgstr "%s : l'option « -W %s » est ambiguë\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
-msgstr "%s : l'option « -W %s » ne prend pas d'argument\n"
+msgstr "%s : l'option Â«Â -W %s » ne prend pas d'argument\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
-msgstr "guile : expansion de « %s »\n"
+msgstr "guile : expansion de Â«Â %s »\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
-msgstr "guile : évaluation de « %s »\n"
+msgstr "guile : Ã©valuation de Â«Â %s »\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
-"impossible d'allouer %lu octets pour la table de hachage : mémoire épuisée"
+"impossible d'allouer %lu octets pour la table de hachage : mémoire épuisée"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Charge=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Rehash=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Collisions=%ld/%ld=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
-msgstr "Recherche d'une règle implicite pour « %s ».\n"
+msgstr "Recherche d'une règle implicite pour Â«Â %s ».\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
-msgstr "Recherche d'une règle implicite de membre d'archive pour « %s ».\n"
+msgstr "Recherche d'une règle implicite de membre d'archive pour Â«Â %s ».\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
-msgstr "Évitement de récursion dans une règle implicite.\n"
+msgstr "Évitement de récursion dans une règle implicite.\n"
 
-#: implicit.c:486
-#, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Motif trop long : « %.*s ».\n"
+#: src/implicit.c:484
+#, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Motif trop long : Â«Â %.*s ».\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
-msgstr "Essai du motif avec « %.*s » comme radical.\n"
+msgstr "Essai du motif avec Â«Â %.*s » comme radical.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
-msgstr "Rejet d'une dépendance de règle impossible « %s ».\n"
+msgstr "Rejet d'une dépendance de règle impossible Â«Â %s ».\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
-msgstr "Rejet d'une dépendance implicite impossible « %s ».\n"
+msgstr "Rejet d'une dépendance implicite impossible Â«Â %s ».\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
-msgstr "Essai de la dépendance de règle « %s ».\n"
+msgstr "Essai de la dépendance de règle Â«Â %s ».\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
-msgstr "Essai de la dépendance implicite « %s ».\n"
+msgstr "Essai de la dépendance implicite Â«Â %s ».\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
-msgstr "Dépendance trouvée « %s » comme VPATH « %s »\n"
+msgstr "Dépendance trouvée Â«Â %s » comme VPATH Â«Â %s »\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
-msgstr "Recherche d'une règle contenant le fichier intermédaire « %s ».\n"
+msgstr "Recherche d'une règle contenant le fichier intermédaire Â«Â %s ».\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
-msgstr "Impossible de créer un fichier temporaire\n"
+msgstr "Impossible de créer un fichier temporaire\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
-msgstr " (core dump créé)"
+msgstr " (core dump créé)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
-msgstr " (ignorée)"
+msgstr " (ignorée)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<commande interne>"
 
-#: job.c:510
-#, fuzzy, c-format
+#: src/job.c:573
+#, c-format
 msgid "%s[%s: %s] Error %d%s"
-msgstr "%s[%s] Erreur %d%s"
+msgstr "%s[%s : %s] Erreur %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
-msgstr "*** Attente des tâches non terminées...."
+msgstr "*** Attente des tâches non terminées...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Processus fils actif %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (distant)"
 
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Récolte du processus fils perdant %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "Récolte du processus fils gagnant %p PID %s %s\n"
 
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
-msgstr "Récolte du processus fils gagnant %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Récolte du processus fils perdant %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Nettoyage du fichier de commande temporaire %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
-msgstr "Le nettoyage du fichier de commandes temporaire %s a échoué (%d)\n"
+msgstr "Le nettoyage du fichier de commandes temporaire %s a échoué (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
-msgstr "Retrait du processus fils %p PID %s%s de la chaîne.\n"
+msgstr "Retrait du processus fils %p PID %s%s de la chaîne.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
-msgstr "Jeton relâché pour le processus fils %p (%s).\n"
+msgstr "Jeton relâché pour le processus fils %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() n'a pas pu lancer de processus (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 "\n"
-"%d arguments comptés lors du lancement échoué\n"
+"%d arguments comptés lors du lancement échoué\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
-msgstr "Ajout du processus fils %p (%s) PID %s%s à la chaîne.\n"
+msgstr "Ajout du processus fils %p (%s) PID %s%s à la chaîne.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Jeton obtenu pour le processus fils %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
-msgstr "%s : la cible « %s » n'existe pas"
+msgstr "%s : la cible Â«Â %s » n'existe pas"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
-msgstr "%s : mise à jour de la cible « %s » nécessaire pour : %s"
+msgstr "%s : mise Ã  jour de la cible Â«Â %s » causée par : %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
-"impossible d'imposer des limites de charge sur ce système d'exploitation"
+"impossible d'imposer des limites de charge sur ce système d'exploitation"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
-msgstr "impossible d'imposer des limites de charge : "
+msgstr "impossible d'imposer des limites de charge : "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
-"plus d'identificateur de fichier disponible : impossible de dupliquer stdin\n"
+"plus d'identificateur de fichier disponible : impossible de dupliquer stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
-"plus d'identificateur de fichier disponible : impossible de dupliquer "
+"plus d'identificateur de fichier disponible : impossible de dupliquer "
 "stdout\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
-"plus d'identificateurs de fichier disponible : impossible de dupliquer "
+"plus d'identificateurs de fichier disponible : impossible de dupliquer "
 "stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Impossible de restaurer stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Impossible de restaurer stdout\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Impossible de restaurer stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
-"make a récolté le processus fils pid %s, toujours en attente du pid %s\n"
+"make a récolté le processus fils pid %s, toujours en attente du pid %s\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s : commande introuvable"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s : commande introuvable"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s : programme Shell introuvable"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
-msgstr "spawnvpe : l'espace d'environnement est peut-être épuisé"
+msgstr "spawnvpe : l'espace d'environnement est peut-être épuisé"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
-msgstr "$SHELL a été modifié (de « %s » à « %s »)\n"
+msgstr "$SHELL a Ã©té modifié (de Â«Â %s » Ã  Â«Â %s »)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
-msgstr "Création d'un fichier de commande temporaire %s\n"
+msgstr "Création d'un fichier de commande temporaire %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
-"Contenu du fichier de commande :\n"
+"Contenu du fichier de commande :\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
-"Contenu du fichier Batch :%s\n"
+"Contenu du fichier Batch :%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "%s (ligne %d) Mauvais contexte du shell (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-"-O[TYPE] (--output-sync[=TYPE]) n'est pas configuré pour cette construction."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
-msgstr "Echec de l'ouverture de la table des symboles générale : %s"
+msgstr "Echec de l'ouverture de la table des symboles générale : %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
-msgstr "L'objet chargé « %s » n'est pas déclaré compatible avec la GPL"
+msgstr "L'objet chargé « %s » n'est pas déclaré compatible avec la GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
-msgstr "Echec du chargement du symbole %s à partir de %s : %s"
+msgstr "Echec du chargement du symbole %s à partir de %s : %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
-msgstr "Nom du symbole absent pour l'opération « load » : %s"
+msgstr "Nom du symbole absent pour l'opération Â«Â load » : %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
-msgstr "Chargement du symbole %s à partir de %s\n"
+msgstr "Chargement du symbole %s à partir de %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr ""
-"Les opérations « load » ne sont pas prises en charge sur cette plateforme."
+"Les opérations Â«Â load » ne sont pas prises en charge sur cette plateforme."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
-msgstr "Options :\n"
+msgstr "Options :\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
-msgstr "  -b, -m                      Ignoré pour compatibilité.\n"
+msgstr "  -b, -m                      Ignoré pour compatibilité.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Fabriquer toutes les cibles sans condition.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
-"  -C RÉPERTOIRE, --directory=RÉPERTOIRE\n"
-"                              Se placer dans le RÉPERTOIRE avant toute "
+"  -C RÉPERTOIRE, --directory=RÉPERTOIRE\n"
+"                              Se placer dans le RÉPERTOIRE avant toute "
 "action.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
-"  -d                          Afficher beaucoup d'informations de débogage.\n"
+"  -d                          Afficher beaucoup d'informations de débogage.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=FLAGS]             Afficher divers types d'informations de "
-"débogage.\n"
+"débogage.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -908,14 +908,15 @@ msgstr ""
 "                              Les variables d'environment sont prioritaires "
 "sur les makefiles.\n"
 
-#: main.c:353
+#: src/main.c:350
+#, fuzzy
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=CHAINE               Evaluer la CHAINE comme une instruction de "
+"  --eval=CHAINE               Évaluer la CHAÎNE comme une instruction de "
 "makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -923,189 +924,197 @@ msgstr ""
 "  -f FICHIER, --file=FICHIER, --makefile=FICHIER\n"
 "                              Lire le FICHIER comme un makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Afficher ce message et quitter.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 "  -i, --ignore-errors         Ignorer les erreurs venant des recettes.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
-"  -I RÉPERTOIRE, --include-dir=RÉPERTOIRE\n"
-"                              Chercher dans le RÉPERTOIRE les makefiles "
-"traités par inclusion.\n"
+"  -I RÉPERTOIRE, --include-dir=RÉPERTOIRE\n"
+"                              Chercher dans le RÉPERTOIRE les makefiles "
+"traités par inclusion.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
-"  -j [N], --jobs[=N]          Autoriser N tâches simultanées ; nombre infini "
-"si utilisé sans argument.\n"
+"  -j [N], --jobs[=N]          Autoriser N tâches simultanées ; nombre infini "
+"si utilisé sans argument.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
-"  -k, --keep-going            Poursuivre même si certaines cibles n'ont pas "
-"pu être fabriquées.\n"
+"  -k, --keep-going            Poursuivre même si certaines cibles n'ont pas "
+"pu être fabriquées.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
-"                              Ne pas lancer de tâches multiples à moins que "
-"la charge soit inférieure à N.\n"
+"                              Ne pas lancer de tâches multiples à moins que "
+"la charge soit inférieure à N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
-"  -L, --check-symlink-times   Utiliser le « mtime » le plus récent entre les "
+"  -L, --check-symlink-times   Utiliser le « mtime » le plus récent entre les "
 "liens symboliques et la cible.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
-"                              N'exécuter aucune recette ; seulement les "
+"                              N'exécuter aucune recette ; seulement les "
 "afficher.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 "  -o FICHIER, --old-file=FICHIER, --assume-old=FICHIER\n"
-"                              Considérer le FICHIER comme étant très ancien "
+"                              Considérer le FICHIER comme étant très ancien "
 "et ne pas le refabriquer.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
-"                              Synchronise la sortie des tâches parallèles "
+"                              Synchronise la sortie des tâches parallèles "
 "par TYPE.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
-"  -p, --print-data-base       Afficher la base de données interne de make.\n"
+"  -p, --print-data-base       Afficher la base de données interne de make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
-"  -q, --question              Ne pas exécuter de recette ; le code de sortie "
-"indique si la cible est à jour.\n"
+"  -q, --question              Ne pas exécuter de recette ; le code de sortie "
+"indique si la cible est à jour.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
-"  -r, --no-builtin-rules      Désactiver les règles implicites internes.\n"
+"  -r, --no-builtin-rules      Désactiver les règles implicites internes.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
-"  -R, --no-builtin-variables  Désactiver les réglages des variables "
+"  -R, --no-builtin-variables  Désactiver les réglages des variables "
 "internes.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
-msgstr "  -s, --silent, --quiet       Ne pas répéter les recettes.\n"
+msgstr "  -s, --silent, --quiet       Ne pas répéter les recettes.\n"
+
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Ne pas exécuter de recette ; le code de sortie "
+"indique si la cible est à jour.\n"
 
-#: main.c:393
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 "  -S, --no-keep-going, --stop\n"
-"                              Désactiver -k.\n"
+"                              Désactiver -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Assigner l'heure actuelle aux cibles au lieu "
 "de les refabriquer.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
-msgstr "  --trace                     Afficher les traces mémoire.\n"
+msgstr "  --trace                     Afficher les traces mémoire.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
-"  -v, --version               Afficher le numéro de version de make et "
+"  -v, --version               Afficher le numéro de version de make et "
 "quitter.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
-msgstr "  -w, --print-directory       Afficher le répertoire courant.\n"
+msgstr "  -w, --print-directory       Afficher le répertoire courant.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
-"  --no-print-directory        Désactiver l'option -w, même si elle a été "
-"activée implicitement.\n"
+"  --no-print-directory        Désactiver l'option -w, même si elle a été "
+"activée implicitement.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 "  -W FICHIER, --what-if=FICHIER, --new-file=FICHIER, --assume-new=FICHIER\n"
-"                              Considérer le FICHIER comme étant toujours "
+"                              Considérer le FICHIER comme étant toujours "
 "nouveau.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
-"  --warn-undefined-variables  Prévenir lorsqu'une variable non définie est "
-"référencée.\n"
+"  --warn-undefined-variables  Prévenir lorsqu'une variable non définie est "
+"référencée.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
-msgstr "une chaîne vide n'est pas un nom de fichier valable"
+msgstr "une chaîne vide n'est pas un nom de fichier valable"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
-msgstr "niveau de débogage inconnu « %s »"
+msgstr "niveau de débogage inconnu Â«Â %s »"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
-msgstr "type de output-sync « %s » inconnu"
+msgstr "type de output-sync Â«Â %s » inconnu"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 "%s: interception de l'interruption/exception (code = 0x%lx, addr = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1115,147 +1124,157 @@ msgid ""
 "ExceptionAddress = 0x%p\n"
 msgstr ""
 "\n"
-"Filtre d'exception non pris en charge appelé depuis le programme %s\n"
+"Filtre d'exception non pris en charge appelé depuis le programme %s\n"
 "ExceptionCode = %lx\n"
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
-msgstr "Violation d'accès : opération d'écriture à l'adresse 0x%p\n"
+msgstr "Violation d'accès : opération d'écriture à l'adresse 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
-msgstr "Violation d'accès : opération de lecture à l'adresse 0x%p\n"
+msgstr "Violation d'accès : opération de lecture à l'adresse 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
-msgstr "find_and_set_shell() définit default_shell = %s\n"
+msgstr "find_and_set_shell() définit default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
-"La recherche de chemin de find_and_set_shell() a définit default_shell = %s\n"
-
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s s'arrête pendant 30 secondes..."
+"La recherche de chemin de find_and_set_shell() a définit default_shell = %s\n"
 
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) terminé. On continue.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
-"avertissement : jobserver n'est pas disponible : utilisation de -j1. Ajouter "
-"« + » à la règle parent du make."
+"avertissement : jobserver n'est pas disponible : utilisation de -j1. Ajouter "
+"« + » à la règle parent du make."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
-"AVERTISSEMENT : -jN forcé dans un submake : désactivation du mode serveur de "
-"tâches."
+"AVERTISSEMENT : -jN forcé dans un submake : désactivation du mode serveur de "
+"tâches."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
-msgstr "Makefile depuis l'entrée standard spécifié deux fois."
+msgstr "Makefile depuis l'entrée standard spécifié deux fois."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (fichier temporaire)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (fichier temporaire)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"AVERTISSEMENT : -jN forcé dans un submake : désactivation du mode serveur de "
+"tâches."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr ""
-"Les tâches en parallèle (-j) ne sont pas prises en charge sur cette "
+"Les tâches en parallèle (-j) ne sont pas prises en charge sur cette "
 "plateforme."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
-msgstr "On revient en mode monotâche (-j1)."
+msgstr "On revient en mode monotâche (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
-"Les liens symboliques ne sont pas pris en charge : désactivation de -L."
+"Les liens symboliques ne sont pas pris en charge : désactivation de -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
-msgstr "Mise à jour des makefiles....\n"
+msgstr "Mise à jour des makefiles....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
-msgstr "Le makefile « %s » pourrait boucler ; on ne recommence pas.\n"
+msgstr "Le makefile Â«Â %s » pourrait boucler ; on ne recommence pas.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
-msgstr "Échec de refabrication du makefile « %s »."
+msgstr "Ã\89chec de refabrication du makefile Â«Â %s »."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
-msgstr "Le makefile inclus « %s » est introuvable."
+msgstr "Le makefile inclus Â«Â %s » est introuvable."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
-msgstr "Le makefile « %s » est introuvable"
+msgstr "Le makefile Â«Â %s » est introuvable"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
-msgstr "Impossible de revenir dans le répertoire d'origine."
+msgstr "Impossible de revenir dans le répertoire d'origine."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
-msgstr "Réexécution[%u] :"
+msgstr "Réexécution[%u] :"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
-msgstr "unlink (fichier temporaire) :"
+msgstr "unlink (fichier temporaire) :"
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL contient plus d'une cible"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Pas de cible spécifiée et aucun makefile n'a été trouvé"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Pas de cible"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Pas de cible spécifiée et aucun makefile n'a été trouvé"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
-msgstr "Mise à jour des objectifs cibles....\n"
+msgstr "Mise à jour des objectifs cibles....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
-"AVERTISSEMENT : décalage d'horloge détecté. La construction peut être "
-"incomplète."
+"AVERTISSEMENT : décalage d'horloge détecté. La construction peut être "
+"incomplète."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
-msgstr "Utilisation : %s [options] [cible] ...\n"
+msgstr "Utilisation : %s [options] [cible] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1264,7 +1283,7 @@ msgstr ""
 "\n"
 "Ce programme est construit pour %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1273,32 +1292,32 @@ msgstr ""
 "\n"
 "Ce programme est construit pour %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
-msgstr "Signaler les anomalies à <bug-make@gnu.org>.\n"
+msgstr "Signaler les anomalies à <bug-make@gnu.org>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
-msgstr "l'option « %s%s » a besoin d'une chaîne non vide comme argument"
+msgstr "l'option « %s%s » a besoin d'une chaîne non vide comme argument"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
-msgstr "l'option « -%c » prend en argument un entier positif"
+msgstr "l'option Â«Â -%c » prend en argument un entier positif"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sConstruit pour %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sConstruit pour %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1306,714 +1325,743 @@ msgid ""
 "%sThis is free software: you are free to change and redistribute it.\n"
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
-"%sLicence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/"
+"%sLicence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/"
 "gpl.html>\n"
-"%sCeci est un logiciel libre : vous êtes autorisé à le modifier et à la "
+"%sCeci est un logiciel libre : vous êtes autorisé à le modifier et à la "
 "redistribuer.\n"
 "%sIl ne comporte AUCUNE GARANTIE, dans la mesure de ce que permet la loi.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
 "# Make data base, printed on %s"
 msgstr ""
 "\n"
-"# Base de données de Make, imprimée le %s"
+"# Base de données de Make, imprimée le %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
 "# Finished Make data base on %s\n"
 msgstr ""
 "\n"
-"# Base de données de Make terminée le %s\n"
-
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Erreur inconnue %d"
+"# Base de données de Make terminée le %s\n"
 
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
-msgstr "%s : utilisateur %lu (reél %lu), groupe %lu (réel %lu)\n"
+msgstr "%s : utilisateur %lu (reél %lu), groupe %lu (réel %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
-msgstr "Accès initialisé"
+msgstr "Accès initialisé"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
-msgstr "Accès utilisateur"
+msgstr "Accès utilisateur"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
-msgstr "Accès de Make"
+msgstr "Accès de Make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
-msgstr "Accès des fils"
+msgstr "Accès des fils"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
-msgstr "%s : on entre dans un répertoire inconnu\n"
+msgstr "%s : on entre dans un répertoire inconnu\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
-msgstr "%s : on quitte un répertoire inconnu\n"
+msgstr "%s : on quitte un répertoire inconnu\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
-msgstr "%s : on entre dans le répertoire « %s »\n"
+msgstr "%s : on entre dans le répertoire Â«Â %s »\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
-msgstr "%s : on quitte le répertoire « %s »\n"
+msgstr "%s : on quitte le répertoire Â«Â %s »\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
-msgstr "%s[%u] : on entre dans un répertoire inconnu\n"
+msgstr "%s[%u] : on entre dans un répertoire inconnu\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
-msgstr "%s[%u] : on quitte un répertoire inconnu\n"
+msgstr "%s[%u] : on quitte un répertoire inconnu\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
-msgstr "%s[%u] : on entre dans le répertoire « %s »\n"
+msgstr "%s[%u] : on entre dans le répertoire Â«Â %s »\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
-msgstr "%s[%u] : on quitte le répertoire « %s »\n"
+msgstr "%s[%u] : on quitte le répertoire Â«Â %s »\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
-msgstr "erreur d'écriture : stdout"
+msgstr "erreur d'écriture : stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
-msgstr ". Arrêt.\n"
+msgstr ". Arrêt.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s : %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s : %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"-O[TYPE] (--output-sync[=TYPE]) n'est pas configuré pour cette construction."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
-msgstr "création d'un tube pour les tâches"
+msgstr "création d'un tube pour les tâches"
 
-#: posixos.c:72 posixos.c:227
-#, fuzzy
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
-msgstr "création d'un tube pour les tâches"
+msgstr "duplication d'un tube pour les tâches"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
-msgstr "initialisation du tube du serveur de tâches"
+msgstr "initialisation du tube du serveur de tâches"
 
-#: posixos.c:90
-#, fuzzy, c-format
+#: src/posixos.c:119
+#, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
-msgstr "erreur interne : chaîne --jobserver-fds incorrecte « %s »"
+msgstr "erreur interne : chaîne --jobserver-auth incorrecte Â«Â %s »"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "client Jobserver (fds %d,%d)\n"
 
-#: posixos.c:109
-#, fuzzy
+#: src/posixos.c:138
 msgid "jobserver pipeline"
-msgstr "initialisation du tube du serveur de tâches"
+msgstr "pipeline du serveur de tâches"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
-msgstr "écriture vers le serveur de tâches"
+msgstr "écriture vers le serveur de tâches"
 
-#: posixos.c:268
-#, fuzzy
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
-msgstr "lecture du tube des processus"
+msgstr "pselect du tube de tâches"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "lecture du tube des processus"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Lecture des makefiles...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
-msgstr "Lecture du makefile « %s »"
+msgstr "Lecture du makefile Â«Â %s »"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
-msgstr " (pas d'objectif par défaut)"
+msgstr " (pas d'objectif par défaut)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (chemin de recherche)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (peu importe)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (pas de remplacement du ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
-msgstr "On saute les BOM UTF-8 du makefile « %s »\n"
+msgstr "On saute les BOM UTF-8 du makefile Â«Â %s »\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "On saute les BOM UTF-8 du tampon makefile\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "syntaxe incorrecte dans la condition"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
-msgstr "%s : echec du chargement"
+msgstr "%s : echec du chargement"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
-msgstr "La recette commence avant la première cible"
+msgstr "La recette commence avant la première cible"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
-msgstr "règle manquante avant la recette"
+msgstr "règle manquante avant la recette"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
-msgstr "séparateur manquant (vouliez-vous dire TAB au lieu des 8 espaces ?)"
+msgstr "séparateur manquant (vouliez-vous dire TAB au lieu des 8 espaces ?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "séparateur manquant"
+msgstr "séparateur manquant"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "motif de cible manquant"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "motifs de cible multiples"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
-msgstr "le motif de cible ne contient pas « %% »"
+msgstr "le motif de cible ne contient pas Â«Â %% »"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
-msgstr "« endif » manquant"
+msgstr "« endif » manquant"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "nom de variable vide"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
-msgstr "texte superflu après la directive « define »"
+msgstr "texte superflu après la directive Â«Â define »"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
-msgstr "« endef » manquant, « define » non terminé"
+msgstr "« endef » manquant, « define » non terminé"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
-msgstr "texte superflu après la directive « endef »"
+msgstr "texte superflu après la directive Â«Â endef »"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
-msgstr "texte superflu après la directive « %s »"
+msgstr "texte superflu après la directive Â«Â %s »"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
-msgstr "« %s » superflu"
+msgstr "« %s » superflu"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
-msgstr "un seul « else » par condition"
+msgstr "un seul Â«Â else » par condition"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
-msgstr "Définition malformée de variable spécifique à une cible"
+msgstr "Définition malformée de variable spécifique à une cible"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
-msgstr "les prérequis ne peuvent être définis dans des recettes"
+msgstr "les prérequis ne peuvent être définis dans des recettes"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
 
-#: read.c:2009
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
-msgstr "mélange de règles implicites et statiques pour le motif"
+msgstr "mélange de règles implicites et statiques pour le motif"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
-msgstr "mélange de règles implicites et normales"
+msgstr "mélange de règles implicites et normales"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
-msgstr "la cible « %s » ne correspond pas au motif de cible"
+msgstr "la cible Â«Â %s » ne correspond pas au motif de cible"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr "le fichier cible « %s » possède à la fois des entrées : et ::"
+msgstr "le fichier cible Â«Â %s » possède Ã  la fois des entrées : et ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr "la cible « %s » apparaît plus d'une fois dans la même règle."
+msgstr "la cible « %s » apparaît plus d'une fois dans la même règle."
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
-msgstr "avertissement : surchargement de la recette pour la cible « %s »"
+msgstr "avertissement : surchargement de la recette pour la cible Â«Â %s »"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
-msgstr "avertissement : ancienne recette ignorée pour la cible « %s »"
+msgstr "avertissement : ancienne recette ignorée pour la cible Â«Â %s »"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
-msgstr "*** mélange de règles implicites et normales : syntaxe obsolète"
+msgstr "*** mélange de règles implicites et normales : syntaxe obsolète"
+
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "avertissement : surchargement de la recette pour la cible « %s »"
 
-#: read.c:2542
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr ""
-"AVERTISSEMENT : caractère NUL détecté ; le reste de la ligne est ignoré"
+"AVERTISSEMENT : caractère NUL détecté ; le reste de la ligne est ignoré"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
-msgstr "rien à faire pour « %s »."
+msgstr "rien Ã  faire pour Â«Â %s »."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
-msgstr "« %s » est à jour."
+msgstr "« %s » est à jour."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
-msgstr "Élagage du fichier « %s ».\n"
+msgstr "Ã\89lagage du fichier Â«Â %s ».\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
-"%s Aucune règle pour fabriquer la cible « %s », nécessaire pour « %s »%s"
+"%s Aucune règle pour fabriquer la cible Â«Â %s », nécessaire pour Â«Â %s »%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
-msgstr "%sAucune règle pour fabriquer la cible « %s »%s"
+msgstr "%sAucune règle pour fabriquer la cible Â«Â %s »%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
-msgstr "Étude du fichier cible « %s ».\n"
+msgstr "Ã\89tude du fichier cible Â«Â %s ».\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
-msgstr "Tentative récente échouée de mettre à jour le fichier « %s ».\n"
+msgstr "Tentative récente Ã©chouée de mettre Ã  jour le fichier Â«Â %s ».\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
-msgstr "Le fichier « %s » a déjà été étudié.\n"
+msgstr "Le fichier « %s » a déjà été étudié.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
-msgstr "Mise à jour du fichier « %s » en cours.\n"
+msgstr "Mise Ã  jour du fichier Â«Â %s » en cours.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
-msgstr "Fin de la mise à jour du fichier « %s ».\n"
+msgstr "Fin de la mise Ã  jour du fichier Â«Â %s ».\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
-msgstr "Le fichier « %s » n'existe pas.\n"
+msgstr "Le fichier Â«Â %s » n'existe pas.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
-"*** Avertissement : le fichier .LOW_RESOLUTION_TIME « %s » a un horodatage à "
-"haute résolution"
+"*** Avertissement : le fichier .LOW_RESOLUTION_TIME « %s » a un horodatage à "
+"haute résolution"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
-msgstr "Règle implicite trouvée pour « %s ».\n"
+msgstr "Règle implicite trouvée pour Â«Â %s ».\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
-msgstr "Pas de règle implicite trouvée pour « %s ».\n"
+msgstr "Pas de règle implicite trouvée pour Â«Â %s ».\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
-msgstr "Utilisation de la recette par défaut pour « %s ».\n"
+msgstr "Utilisation de la recette par défaut pour Â«Â %s ».\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
-msgstr "Dépendance circulaire %s <- %s abandonnée."
+msgstr "Dépendance circulaire %s <- %s abandonnée."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
-msgstr "Fin des dépendances du fichier cible « %s ».\n"
+msgstr "Fin des dépendances du fichier cible Â«Â %s ».\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
-msgstr "Les dépendances de « %s » sont en cours de fabrication.\n"
+msgstr "Les dépendances de Â«Â %s » sont en cours de fabrication.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
-msgstr "Abandon du fichier cible « %s ».\n"
+msgstr "Abandon du fichier cible Â«Â %s ».\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
-msgstr "La cible « %s » n'a pas été refabriquée à cause d'erreurs."
+msgstr "La cible « %s » n'a pas été refabriquée à cause d'erreurs."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
-msgstr "La dépendance « %s » ne commande que la cible « %s ».\n"
+msgstr "La dépendance Â«Â %s » ne commande que la cible Â«Â %s ».\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
-msgstr "La dépendance « %s » de la cible « %s » n'existe pas.\n"
+msgstr "La dépendance Â«Â %s » de la cible Â«Â %s » n'existe pas.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
-msgstr "La dépendance « %s » est plus récente que la cible « %s ».\n"
+msgstr "La dépendance Â«Â %s » est plus récente que la cible Â«Â %s ».\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
-msgstr "uLa dépendance « %s » est plus ancienne que la cible « %s ».\n"
+msgstr "uLa dépendance Â«Â %s » est plus ancienne que la cible Â«Â %s ».\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
-msgstr "La cible « %s » a un deux-points double et n'a pas de dépendance.\n"
+msgstr "La cible « %s » a un deux-points double et n'a pas de dépendance.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
-msgstr "Pas de recette pour « %s » et aucune dépendance n'a changé.\n"
+msgstr "Pas de recette pour « %s » et aucune dépendance n'a changé.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
-msgstr "Fabrication de « %s » à cause de l'indicateur « always-make ».\n"
+msgstr "Fabrication de Â«Â %s » Ã  cause de l'indicateur Â«Â always-make ».\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
-msgstr "Inutile de refabriquer la cible « %s »"
+msgstr "Inutile de refabriquer la cible Â«Â %s »"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
-msgstr " ; utilisation du nom VPATH « %s »"
+msgstr " ; utilisation du nom VPATH Â«Â %s »"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
-msgstr "Il faut refabriquer la cible « %s ».\n"
+msgstr "Il faut refabriquer la cible Â«Â %s ».\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
-msgstr "  On ignore le nom VPATH « %s ».\n"
+msgstr "  On ignore le nom VPATH Â«Â %s ».\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
-msgstr "La recette de « %s » est en cours d'exécution.\n"
+msgstr "La recette de « %s » est en cours d'exécution.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
-msgstr "Échec de refabrication du fichier cible « %s ».\n"
+msgstr "Ã\89chec de refabrication du fichier cible Â«Â %s ».\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
-msgstr "Refabrication réussie du fichier cible « %s ».\n"
+msgstr "Refabrication réussie du fichier cible Â«Â %s ».\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
-msgstr "Le fichier cible « %s » a besoin d'être refabriqué avec l'option -q.\n"
+msgstr "Le fichier cible « %s » a besoin d'être refabriqué avec l'option -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
-msgstr "Utilisation des commandes par défaut pour « %s ».\n"
-
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr ""
-"Avertissement : le fichier « %s » a une date de modification dans le futur"
+msgstr "Utilisation des commandes par défaut pour « %s ».\n"
 
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr ""
-"Avertissement : le fichier « %s » a une date de modification %s s dans le "
+"Avertissement : le fichier Â«Â %s » a une date de modification %s s dans le "
 "futur"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
-msgstr "l'élément « %s » de .LIBPATTERNS n'est pas un motif"
+msgstr "l'élément Â«Â %s » de .LIBPATTERNS n'est pas un motif"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
-msgstr "« customs » n'exportera pas : %s\n"
+msgstr "« customs » n'exportera pas : %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
 msgstr ""
 "\n"
-"# Règles implicites"
+"# Règles implicites"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
 msgstr ""
 "\n"
-"# Pas de règle implicite."
+"# Pas de règle implicite."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u règles implicites, %u"
+"# %u règles implicites, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
-msgstr "ANOMALIE : num_pattern_rules est faux !  %u != %u"
+msgstr "ANOMALIE : num_pattern_rules est faux !  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "signal inconnu"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Raccroche"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Interrompt"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Quitte"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Instruction non admise"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
-msgstr "Point de trace/arrêt"
+msgstr "Point de trace/arrêt"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
-msgstr "Annulé"
+msgstr "Annulé"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Appel IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Appel EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Exception en virgule flottante"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
-msgstr "Tué"
+msgstr "Tué"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Erreur de bus"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Erreur de segmentation"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
-msgstr "Mauvais appel système"
+msgstr "Mauvais appel système"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
-msgstr "Tube cassé"
+msgstr "Tube cassé"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarme"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
-msgstr "Terminé"
+msgstr "Terminé"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Signal utilisateur 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Signal utilisateur 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
-msgstr "Processus fils terminé"
+msgstr "Processus fils terminé"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Coupure d'alimentation"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
-msgstr "Arrêté"
+msgstr "Arrêté"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
-msgstr "Arrêté (entrée tty)"
+msgstr "Arrêté (entrée tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
-msgstr "Arrêté (sortie tty)"
+msgstr "Arrêté (sortie tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
-msgstr "Arrêté (signal)"
+msgstr "Arrêté (signal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
-msgstr "Limite du temps CPU dépassée"
+msgstr "Limite du temps CPU dépassée"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
-msgstr "Limite de taille de fichier dépassée"
+msgstr "Limite de taille de fichier dépassée"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
-msgstr "Compteur virtuel expiré"
+msgstr "Compteur virtuel expiré"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
-msgstr "Compteur de profiling expiré"
+msgstr "Compteur de profiling expiré"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
-msgstr "Fenêtre modifiée"
+msgstr "Fenêtre modifiée"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Reprise"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Condition d'E/S urgente"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "E/S possible"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Ressource perdue"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Signal de danger"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Demande d'informations"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Coprocesseur en virgule flottante non disponible"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -2022,7 +2070,7 @@ msgstr ""
 "\n"
 "%s pas de tampons strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2030,84 +2078,84 @@ msgid ""
 "B\n"
 msgstr ""
 "\n"
-"%s strcache utilisé : %lu (%lu) / chaînes = %lu / espace = %lu o / moy = %lu "
+"%s strcache utilisé : %lu (%lu) / chaînes = %lu / espace = %lu o / moy = %lu "
 "o\n"
 
-#: strcache.c:308
-#, c-format
+#: src/strcache.c:308
+#, fuzzy, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s tampon courant : taille = %hu o / utilisé = %hu o / nombre = %hu / moy = "
+"%s tampon courant : taille = %hu o / utilisé = %hu o / nombre = %hu / moy = "
 "%hu o\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
-msgstr "%s autre utilisé : total = %lu o / nombre = %lu / moy = %lu o\n"
+msgstr "%s autre utilisé : total = %lu o / nombre = %lu / moy = %lu o\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
-"%s autre libre : total = %lu o / max = %lu o / min = %lu o / moy = %hu o\n"
+"%s autre libre : total = %lu o / max = %lu o / min = %lu o / moy = %hu o\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 "\n"
-"%s performance strcache : lookups = %lu / accès = %lu%%\n"
+"%s performance strcache : lookups = %lu / accès = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
-"# stats des tables de hachage :\n"
+"# stats des tables de hachage :\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatique"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
-msgstr "défaut"
+msgstr "défaut"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "environnement"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "environnement avec l'option -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "ligne de commande"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
-msgstr "directive « override »"
+msgstr "directive Â«Â override »"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
-msgstr " (depuis « %s », ligne %lu)"
+msgstr " (depuis Â«Â %s », ligne %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
-msgstr "# stats des tables de hachage de la variable « set » :\n"
+msgstr "# stats des tables de hachage de la variable Â«Â set » :\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2115,74 +2163,74 @@ msgstr ""
 "\n"
 "# Variables\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 "\n"
-"# Valeurs de variable spécifiques au motif"
+"# Valeurs de variable spécifiques au motif"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 "\n"
-"# pas de valeurs de variable spécifiques au motif"
+"# pas de valeurs de variable spécifiques au motif"
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 "\n"
-"# %u valeurs de variable spécifiques au motif"
+"# %u valeurs de variable spécifiques au motif"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
-msgstr "avertissement : variable « %.*s » indéfinie"
+msgstr "avertissement : variable « %.*s » indéfinie"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
-msgstr "sys$search() a échoué avec %d\n"
+msgstr "sys$search() a échoué avec %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
-"-warning, vous pourriez avoir besoin de réactiver le traitement de CTRL-Y "
+"-attention, vous pourriez avoir besoin de réactiver le traitement de CTRL-Y "
 "par DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "COMMANDE CD INTERNE %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
-msgstr ""
+msgstr "DCL : %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
-msgstr "Sortie ajoutée à %s\n"
+msgstr "Sortie ajoutée à %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Ajoute %.*s et nettoie\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
-msgstr "Exécution de %s à la place\n"
+msgstr "Exécution de %s à la place\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2190,72 +2238,97 @@ msgstr ""
 "\n"
 "# Chemins de recherche VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
-msgstr "# Aucun chemin de recherche « vpath »."
+msgstr "# Aucun chemin de recherche Â«Â vpath »."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 "\n"
-"# %u chemins de recherche « vpath ».\n"
+"# %u chemins de recherche Â«Â vpath ».\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 "\n"
-"# Aucun chemin de recherche général (variable « VPATH »)."
+"# Aucun chemin de recherche général (variable Â«Â VPATH »)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 "\n"
-"# Chemin de recherche général (variable « VPATH ») :\n"
+"# Chemin de recherche général (variable Â«Â VPATH ») :\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
-msgstr "Nombre de clients jobserver limités à %d\n"
+msgstr "Nombre de clients jobserver limités à %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
-msgstr "création de la sémaphore du jobserver : (erreur %ld : %s)"
+msgstr "création de la sémaphore du jobserver : (erreur %ld : %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
-"erreur interne : impossible d'ouvrir la sémaphore « %s » du jobserver : "
-"(erreur %ld : %s) "
+"erreur interne : impossible d'ouvrir la sémaphore Â«Â %s » du jobserver : "
+"(erreur %ld : %s) "
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
-msgstr "client Jobserver (semaphore %s)\n"
+msgstr "client jobserver (semaphore %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
-msgstr "libération de la sémaphore jobserver : erreur (%ld : %s)"
+msgstr "libération de la sémaphore jobserver : erreur (%ld : %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
-msgstr "attente de la sémaphore ou du processus fils : (erreur %ld : %s)"
+msgstr "attente de la sémaphore ou du processus fils : (erreur %ld : %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s : %s : commande introuvable\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u] : %s : commande introuvable\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s : programme Shell introuvable"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s s'arrête pendant 30 secondes..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) terminé. On continue.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Erreur inconnue %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr ""
+#~ "Avertissement : le fichier « %s » a une date de modification dans le futur"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
 
 #~ msgid "%s: recipe for target '%s' failed"
-#~ msgstr "%s : la recette pour la cible « %s » a échoué"
+#~ msgstr "%s : la recette pour la cible « %s » a échoué"
 
 #~ msgid "%s[%s] Error 0x%x%s"
 #~ msgstr "%s[%s] Erreur 0x%x%s"
@@ -2264,13 +2337,13 @@ msgstr "attente de la s
 #~ msgstr "%s[%s] %s%s%s"
 
 #~ msgid "dup jobserver"
-#~ msgstr "duplication du serveur de tâches"
+#~ msgstr "duplication du serveur de tâches"
 
 #~ msgid "Warning: Empty redirection\n"
-#~ msgstr "AVERTISSEMENT : redirection vide\n"
+#~ msgstr "AVERTISSEMENT : redirection vide\n"
 
 #~ msgid "internal error: '%s' command_state"
-#~ msgstr "erreur interne : « %s » command_state"
+#~ msgstr "erreur interne : Â«Â %s » command_state"
 
 #~ msgid "BUILTIN [%s][%s]\n"
 #~ msgstr "COMMANDE INTERNE [%s][%s]\n"
@@ -2279,61 +2352,61 @@ msgstr "attente de la s
 #~ msgstr "COMMANDE ECHO INTERNE  %s->%s\n"
 
 #~ msgid "Unknown builtin command '%s'\n"
-#~ msgstr "Commande interne inconnue « %s »\n"
+#~ msgstr "Commande interne inconnue Â«Â %s »\n"
 
 #~ msgid "Builtin command is unknown or unsupported in .ONESHELL: '%s'\n"
 #~ msgstr ""
-#~ "Commande interne inconnue ou non prise en charge par .ONESHELL : « %s »\n"
+#~ "Commande interne inconnue ou non prise en charge par .ONESHELL : Â«Â %s »\n"
 
 #~ msgid "Error, empty command\n"
 #~ msgstr "Erreur, commande vide\n"
 
 #~ msgid "Redirected input from %s\n"
-#~ msgstr "Entrée redirigée depuis %s\n"
+#~ msgstr "Entrée redirigée depuis %s\n"
 
 #~ msgid "Redirected error to %s\n"
-#~ msgstr "Erreur redirigée vers %s\n"
+#~ msgstr "Erreur redirigée vers %s\n"
 
 #~ msgid "Redirected output to %s\n"
-#~ msgstr "Sortie redirigée vers %s\n"
+#~ msgstr "Sortie redirigée vers %s\n"
 
 #~ msgid "Error spawning, %d\n"
 #~ msgstr "Erreur de lancement, %d\n"
 
 #~ msgid "internal error: multiple --sync-mutex options"
-#~ msgstr "erreur interne : options --sync-mutex multiples"
+#~ msgstr "erreur interne : options --sync-mutex multiples"
 
 #~ msgid "internal error: multiple --jobserver-fds options"
-#~ msgstr "erreur interne : options --jobserver-fds multiples"
+#~ msgstr "erreur interne : options --jobserver-fds multiples"
 
 #~ msgid "virtual memory exhausted"
-#~ msgstr "mémoire virtuelle épuisée"
+#~ msgstr "mémoire virtuelle épuisée"
 
 #~ msgid "write error"
-#~ msgstr "erreur d'écriture"
+#~ msgstr "erreur d'écriture"
 
 #~ msgid "BUILTIN RM %s\n"
 #~ msgstr "COMMANDE RM INTERNE %s\n"
 
 #~ msgid "#  Invalid value in `update_status' member!"
-#~ msgstr "#  Valeur non valable dans le membre « update_status » !"
+#~ msgstr "#  Valeur non valable dans le membre Â«Â update_status » !"
 
 #~ msgid "*** [%s] Error 0x%x (ignored)"
-#~ msgstr "*** [%s] Erreur 0x%x (ignorée)"
+#~ msgstr "*** [%s] Erreur 0x%x (ignorée)"
 
 #~ msgid "[%s] Error %d (ignored)"
-#~ msgstr "[%s] Erreur %d (ignorée)"
+#~ msgstr "[%s] Erreur %d (ignorée)"
 
 #~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n"
 #~ msgstr ""
-#~ "Invocation de recette de %s:%lu pour mettre à jour la cible « %s ».\n"
+#~ "Invocation de recette de %s:%lu pour mettre Ã  jour la cible Â«Â %s ».\n"
 
 #~ msgid "Invoking builtin recipe to update target `%s'.\n"
 #~ msgstr ""
-#~ "Invocation de la recette incorporée pour mettre à jour la cible « %s ».\n"
+#~ "Invocation de la recette incorporée pour mettre Ã  jour la cible Â«Â %s ».\n"
 
 #~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n"
-#~ msgstr "%s nombre de tampons strcache : %d (* %d B/buffer = %d B)\n"
+#~ msgstr "%s nombre de tampons strcache : %d (* %d B/buffer = %d B)\n"
 
 #~ msgid ""
 #~ "\n"
@@ -2341,7 +2414,7 @@ msgstr "attente de la s
 #~ "# "
 #~ msgstr ""
 #~ "\n"
-#~ "# stats des tables de hachage strcache :\n"
+#~ "# stats des tables de hachage strcache :\n"
 #~ "# "
 
 #~ msgid "process_easy() failed failed to launch process (e=%ld)\n"
@@ -2352,42 +2425,42 @@ msgstr "attente de la s
 #~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
 #~ "%sPARTICULAR PURPOSE.\n"
 #~ msgstr ""
-#~ "%sCeci est un logiciel libre ; consultez le code source pour connaître "
+#~ "%sCeci est un logiciel libre ; consultez le code source pour connaître "
 #~ "les conditions de copie.\n"
 #~ "%sIl n'y a PAS de garantie ; ni pour une utilisation COMMERCIALE ni pour\n"
-#~ "%sune ADÉQUATION À UN BESOIN PARTICULIER.\n"
+#~ "%sune ADÉQUATION À UN BESOIN PARTICULIER.\n"
 
 #~ msgid "extraneous `endef'"
-#~ msgstr "« endef » superflu"
+#~ msgstr "« endef » superflu"
 
 #~ msgid "empty `override' directive"
-#~ msgstr "directive « override » vide"
+#~ msgstr "directive Â«Â override » vide"
 
 #~ msgid "invalid `override' directive"
-#~ msgstr "directive « override » incorrecte"
+#~ msgstr "directive Â«Â override » incorrecte"
 
 #~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n"
 #~ msgstr "-warning, CTRL-Y va laisser des sous-processsus dans la nature.\n"
 
 #~ msgid "Do not specify -j or --jobs if sh.exe is not available."
-#~ msgstr "Ne pas spécifier -j ou --jobs si sh.exe n'est pas disponible."
+#~ msgstr "Ne pas spécifier -j ou --jobs si sh.exe n'est pas disponible."
 
 #~ msgid "Resetting make for single job mode."
-#~ msgstr "Réinitialisation de make en mode de traitement simple des tâches."
+#~ msgstr "Réinitialisation de make en mode de traitement simple des tâches."
 
 #~ msgid "Syntax error, still inside '\"'\n"
-#~ msgstr "Erreur de syntaxe, toujours à l'intérieur de « \" »\n"
+#~ msgstr "Erreur de syntaxe, toujours Ã  l'intérieur de Â«Â \" »\n"
 
 #~ msgid "Got a SIGCHLD; %u unreaped children.\n"
 #~ msgstr ""
-#~ "Réception du signal SIGCHLD ; %u processus fils dont le statut de\n"
-#~ "sortie n'a pas été récupé.\n"
+#~ "Réception du signal SIGCHLD ; %u processus fils dont le statut de\n"
+#~ "sortie n'a pas été récupé.\n"
 
 #~ msgid "no file name for `%sinclude'"
-#~ msgstr "pas de nom de fichier pour « %sinclude »"
+#~ msgstr "pas de nom de fichier pour Â«Â %sinclude »"
 
 #~ msgid "target `%s' leaves prerequisite pattern empty"
-#~ msgstr "la cible « %s » a laissé un schéma de dépendance vide"
+#~ msgstr "la cible « %s » a laissé un schéma de dépendance vide"
 
 #~ msgid ""
 #~ "\n"
@@ -2409,20 +2482,20 @@ msgstr "attente de la s
 #~ "table.\n"
 
 #~ msgid "DIRECTORY"
-#~ msgstr "RÉPERTOIRE"
+#~ msgstr "RÉPERTOIRE"
 
 #~ msgid "Change to DIRECTORY before doing anything"
-#~ msgstr "Changer de RÉPERTOIRE avant de faire quoi que ce soit"
+#~ msgstr "Changer de RÉPERTOIRE avant de faire quoi que ce soit"
 
 #~ msgid "FLAGS"
 #~ msgstr "FANIONS"
 
 #~ msgid "Suspend process to allow a debugger to attach"
-#~ msgstr "Suspension de processus pour permettre au déboggeur de se rattacher"
+#~ msgstr "Suspension de processus pour permettre au déboggeur de se rattacher"
 
 #~ msgid "Environment variables override makefiles"
 #~ msgstr ""
-#~ "Les variables d'environnement écrasent celles définies dans les makefiles"
+#~ "Les variables d'environnement écrasent celles définies dans les makefiles"
 
 #~ msgid "FILE"
 #~ msgstr "FICHIER"
@@ -2434,22 +2507,22 @@ msgstr "attente de la s
 #~ msgstr "Recherche les makefiles inclus dans DIRECTORY"
 
 #~ msgid "Don't start multiple jobs unless load is below N"
-#~ msgstr "N'exécute pas de tâches multiples si la charge dépasse N"
+#~ msgstr "N'exécute pas de tâches multiples si la charge dépasse N"
 
 #~ msgid "Don't actually run any commands; just print them"
-#~ msgstr "N'exécute pas les commandes ; elles sont juste affichées"
+#~ msgstr "N'exécute pas les commandes ; elles sont juste affichées"
 
 #~ msgid "Consider FILE to be very old and don't remake it"
-#~ msgstr "Considère FILE comme étant très vieux et ne le refabrique pas"
+#~ msgstr "Considère FILE comme étant très vieux et ne le refabrique pas"
 
 #~ msgid "Don't echo commands"
 #~ msgstr "N'affiche pas les commandes"
 
 #~ msgid "Turns off -k"
-#~ msgstr "Désactive -k"
+#~ msgstr "Désactive -k"
 
 #~ msgid "Consider FILE to be infinitely new"
-#~ msgstr "Considère FILE comme étant infiniment récent"
+#~ msgstr "Considère FILE comme étant infiniment récent"
 
 #~ msgid "Entering"
 #~ msgstr "Entre dans"
@@ -2472,7 +2545,7 @@ msgstr "attente de la s
 #~ msgstr "Erreur dans lbr$ini_control, %d\n"
 
 #~ msgid "Error looking up module %s in library %s, %d\n"
-#~ msgstr "Erreur en recherchant le module %s dans la bibliothèque %s, %d\n"
+#~ msgstr "Erreur en recherchant le module %s dans la bibliothèque %s, %d\n"
 
 #~ msgid "Error getting module info, %d\n"
 #~ msgstr "Erreur lors de l'obtention des informations du module, %d\n"
@@ -2484,46 +2557,46 @@ msgstr "attente de la s
 #~ msgstr " non"
 
 #~ msgid "#  Last modified %.24s (%0lx)\n"
-#~ msgstr "#  Dernière modification %.24s (%0lx)\n"
+#~ msgstr "#  Dernière modification %.24s (%0lx)\n"
 
 #~ msgid "undefined"
-#~ msgstr "indéfini"
+#~ msgstr "indéfini"
 
 #~ msgid "file"
 #~ msgstr "fichier"
 
 #~ msgid "environment override"
-#~ msgstr "écrasement par l'environnement"
+#~ msgstr "écrasement par l'environnement"
 
 #~ msgid "override"
-#~ msgstr "écrasement"
+#~ msgstr "écrasement"
 
 #~ msgid "the `word' function takes a one-origin index argument"
-#~ msgstr "la fonction `word' prend un argument d'index à une seule origine"
+#~ msgstr "la fonction `word' prend un argument d'index à une seule origine"
 
 #~ msgid "implicit"
-#~ msgstr "dépendance implicite"
+#~ msgstr "dépendance implicite"
 
 #~ msgid "rule"
-#~ msgstr "règle de dépendance"
+#~ msgstr "règle de dépendance"
 
 #~ msgid "Trying %s dependency `%s'.\n"
 #~ msgstr "Essai de la %s `%s'.\n"
 
 #~ msgid "Found dependency as `%s'.%s\n"
-#~ msgstr "Dépendance trouvée en tant que `%s'.%s\n"
+#~ msgstr "Dépendance trouvée en tant que `%s'.%s\n"
 
 #~ msgid "intermediate"
-#~ msgstr "intermédiaire"
+#~ msgstr "intermédiaire"
 
 #~ msgid "Unknown%s job %d"
-#~ msgstr "Tâche%s inconnue %d"
+#~ msgstr "Tâche%s inconnue %d"
 
 #~ msgid " remote"
 #~ msgstr " distante"
 
 #~ msgid "%s finished."
-#~ msgstr "%s terminée."
+#~ msgstr "%s terminée."
 
 #~ msgid "losing"
 #~ msgstr "perdant"
@@ -2547,16 +2620,16 @@ msgstr "attente de la s
 #~ msgstr "enfant"
 
 #~ msgid "Dependency `%s' does not exist.\n"
-#~ msgstr "La dépendance `%s' n'existe pas.\n"
+#~ msgstr "La dépendance `%s' n'existe pas.\n"
 
 #~ msgid "newer"
-#~ msgstr "plus récente"
+#~ msgstr "plus récente"
 
 #~ msgid "older"
 #~ msgstr "plus ancienne"
 
 #~ msgid "exporting: Couldn't create return socket."
-#~ msgstr "exportation : N'a pas pu créer la socket de retour."
+#~ msgstr "exportation : N'a pas pu créer la socket de retour."
 
 #~ msgid "exporting: "
 #~ msgstr "exportation : "
@@ -2565,7 +2638,7 @@ msgstr "attente de la s
 #~ msgstr "exportation : %s"
 
 #~ msgid "Job exported to %s ID %u\n"
-#~ msgstr "Tâche exportée vers %s ID %u\n"
+#~ msgstr "Tâche exportée vers %s ID %u\n"
 
 #~ msgid "Error getting load average"
 #~ msgstr "Erreur lors de l'obtention de la charge moyenne"
@@ -2580,7 +2653,7 @@ msgstr "attente de la s
 #~ msgstr "15 minutes : %f  "
 
 #~ msgid "digits occur in two different argv-elements.\n"
-#~ msgstr "des chiffres apparaissent dans deux éléments différents de argv.\n"
+#~ msgstr "des chiffres apparaissent dans deux éléments différents de argv.\n"
 
 #~ msgid "option %c\n"
 #~ msgstr "option %c\n"
@@ -2595,10 +2668,10 @@ msgstr "attente de la s
 #~ msgstr "option c ayant pour valeur `%s'\n"
 
 #~ msgid "?? getopt returned character code 0%o ??\n"
-#~ msgstr "?? getopt a renvoyé le caractère de code 0%o ??\n"
+#~ msgstr "?? getopt a renvoyé le caractère de code 0%o ??\n"
 
 #~ msgid "non-option ARGV-elements: "
-#~ msgstr "éléments de ARGV qui ne sont pas des options : "
+#~ msgstr "éléments de ARGV qui ne sont pas des options : "
 
 #~ msgid "option d with value `%s'\n"
 #~ msgstr "option d ayant pour valeur `%s'\n"
index 69c0096f307bc953cb292c6c8793eb24ab6244b9..c6dbd0f5b6b72db5213cfb90d793ee60dcaf4bfa 100644 (file)
Binary files a/po/ga.gmo and b/po/ga.gmo differ
index 4310213b4d01f936ae21fa8d673a2e9c0de9c452..473b3c3631cfc593cf37581a4ea2c808ccef4f7f 100644 (file)
--- a/po/ga.po
+++ b/po/ga.po
 # Irish translations for make.
 # Copyright (C) 2005 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
-# Kevin Patrick Scannell <scannell@SLU.EDU>, 2005.
+# Kevin Patrick Scannell <kscanne@gmail.com>, 2005, 2017.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 3.81\n"
+"Project-Id-Version: make 4.2.1\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2006-04-22 16:02-0500\n"
-"Last-Translator: Kevin Patrick Scannell <scannell@SLU.EDU>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2017-01-09 16:02-0500\n"
+"Last-Translator: Kevin Patrick Scannell <kscanne@gmail.com>\n"
 "Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>\n"
 "Language: ga\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
-#, fuzzy, c-format
+#: src/ar.c:46
+#, c-format
 msgid "attempt to use unsupported feature: '%s'"
-msgstr "rinneadh iarracht ar ghné gan tacaíocht a úsáid: `%s'"
+msgstr "rinneadh iarracht ar ghné gan tacaíocht a úsáid: '%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
-msgstr "ní féidir ball cartlainne a `touch'áil ar VMS"
+msgstr "ní féidir 'touch' a dhéanamh ar bhall de chartlann ar VMS"
 
-#: ar.c:147
-#, fuzzy, c-format
+#: src/ar.c:147
+#, c-format
 msgid "touch: Archive '%s' does not exist"
-msgstr "touch: Níl an chartlann `%s' ann"
+msgstr "touch: Níl an chartlann '%s' ann"
 
-#: ar.c:150
-#, fuzzy, c-format
+#: src/ar.c:150
+#, c-format
 msgid "touch: '%s' is not a valid archive"
-msgstr "touch: Níl `%s' ina cartlann bhailí"
+msgstr "touch: Níl '%s' ina cartlann bhailí"
 
-#: ar.c:157
-#, fuzzy, c-format
+#: src/ar.c:157
+#, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
-msgstr "touch: Níl a leithéid de bhall `%s' i `%s'"
+msgstr "touch: Níl a leithéid de bhall '%s' i '%s'"
 
-#: ar.c:164
-#, fuzzy, c-format
+#: src/ar.c:164
+#, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
-msgstr "touch: Droch-chód aisfhillidh ó ar_member_touch ar `%s'"
+msgstr "touch: Tháinig droch-chód ar ais ó ar_member_touch ar '%s'"
 
-#: arscan.c:130
-#, fuzzy, c-format
+#: src/arscan.c:130
+#, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
-"níorbh fhéidir le lbr$set_module an t-eolas modúil a bhaint amach, stádas = "
-"%d"
+"níorbh fhéidir le lbr$set_module eolas faoin mhodúl a fháil, stádas = %d"
 
-#: arscan.c:236
-#, fuzzy, c-format
+#: src/arscan.c:236
+#, c-format
 msgid "lbr$ini_control() failed with status = %d"
-msgstr "theip ar lbr$ini_control le stádas = %d"
+msgstr "theip ar lbr$ini_control le stádas = %d"
 
-#: arscan.c:261
-#, fuzzy, c-format
+#: src/arscan.c:261
+#, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
-"ní féidir leabharlann `%s' a oscailt chun cuardach a dhéanamh ar an mball `"
-"%s'"
+"ní féidir leabharlann '%s' a oscailt chun cuardach a dhéanamh ar stádas "
+"baill %d"
 
-#: arscan.c:965
-#, fuzzy, c-format
+#: src/arscan.c:944
+#, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
-msgstr "Ball `%s'%s: %ld beart ag %ld (%ld).\n"
+msgstr "Ball '%s'%s: %ld beart ag %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
-msgstr " (is féidir go bhfuil an t-ainm teasctha)"
+msgstr " (seans go dteascfar an t-ainm)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
-msgstr "  Dáta %s"
+msgstr "  Dáta %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
-msgstr "  uid = %d, gid = %d, mód = 0%o.\n"
+msgstr "  uid = %d, gid = %d, mód = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
-msgstr ""
+msgstr "An iomarca línte san oideas (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Briseadh.\n"
 
-#: commands.c:627
-#, fuzzy, c-format
+#: src/commands.c:628
+#, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
-msgstr "*** [%s] Is féidir gur ball bréige é `%s'; ní scriosadh"
+msgstr "*** [%s] Seans gur ball bréige é '%s'; níor scriosadh é"
 
-#: commands.c:631
-#, fuzzy, c-format
+#: src/commands.c:632
+#, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
-msgstr "*** Is féidir gur ball bréige é `%s'; ní scriosadh"
+msgstr "*** Seans gur ball bréige é '%s'; níor scriosadh é"
 
-#: commands.c:645
-#, fuzzy, c-format
+#: src/commands.c:646
+#, c-format
 msgid "*** [%s] Deleting file '%s'"
-msgstr "*** [%s] Comhad `%s' á scriosadh"
+msgstr "*** [%s] Comhad '%s' á scriosadh"
 
-#: commands.c:647
-#, fuzzy, c-format
+#: src/commands.c:648
+#, c-format
 msgid "*** Deleting file '%s'"
-msgstr "*** Comhad `%s' á scriosadh"
+msgstr "*** Comhad '%s' á scriosadh"
 
-#: commands.c:683
-#, fuzzy
+#: src/commands.c:684
 msgid "#  recipe to execute"
-msgstr "#  orduithe le rith"
+msgstr "#  oideas le rith"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (insuite):"
 
-#: commands.c:688
-#, fuzzy, c-format
+#: src/commands.c:689
+#, c-format
 msgid " (from '%s', line %lu):\n"
-msgstr " (ó `%s', líne %lu):\n"
+msgstr " (ó '%s', líne %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -134,229 +134,221 @@ msgstr ""
 "\n"
 "# Comhadlanna\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
-msgstr "# %s: níorbh fhéidir é a stat.\n"
+msgstr "# %s: níorbh fhéidir é a stat.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (eochair %s, am-m %d): ní féidir é a oscailt.\n"
+msgstr "# %s (eochair %s, mtime %I64u): níorbh fhéidir é a oscailt.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
-msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): ní féidir é a oscailt.\n"
+msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): níorbh fhéidir é a oscailt.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
-msgstr "# %s (gléas %ld, i-nód %ld): níorbh fhéidir é a oscailt.\n"
+msgstr "# %s (gléas %ld, i-nód %ld): níorbh fhéidir é a oscailt.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (eochair %s, am-m %d): "
+msgstr "# %s (eochair %s, mtime %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
-msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): "
+msgstr "# %s (gléas %d, i-nód [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
-msgstr "# %s (gléas %ld, i-nód %ld): "
+msgstr "# %s (gléas %ld, i-nód %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
-msgstr "Ná Déan"
+msgstr "Níl"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " comhad, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
-msgstr "níl"
+msgstr "níl"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
-msgstr " rudaí neamhfhéideartha"
+msgstr " rudaí neamhfhéideartha"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
-msgstr " go dtí seo."
+msgstr " go dtí seo."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
-msgstr " rudaí neamhfhéideartha i %lu comhadlann.\n"
+msgstr " rudaí neamhfhéideartha i %lu comhadlann.\n"
 
-#: expand.c:125
-#, fuzzy, c-format
+#: src/expand.c:125
+#, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
-msgstr "Déanann an athróg athchúrsach `%s' tagairt dó féin (sa deireadh)"
+msgstr "Déanann an athróg athchúrsach '%s' tagairt di féin (ar deireadh)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
-msgstr "tagairt athróige gan chríochnú"
+msgstr "tagairt d'athróg gan chríochnú"
 
-#: file.c:278
-#, fuzzy, c-format
+#: src/file.c:278
+#, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
-msgstr "Sonraíodh orduithe le haghaidh comhaid `%s' ag %s:%lu,"
+msgstr "Sonraíodh oideas le haghaidh comhaid '%s' ag %s:%lu,"
 
-#: file.c:283
-#, fuzzy, c-format
+#: src/file.c:283
+#, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
-msgstr ""
-"Aimsíodh orduithe le haghaidh `%s' trí chuardach ar rialacha intuigthe,"
+msgstr "Aimsíodh oideas le haghaidh '%s' trí chuardach ar rialacha intuigthe,"
 
-#: file.c:287
-#, fuzzy, c-format
+#: src/file.c:287
+#, c-format
 msgid "but '%s' is now considered the same file as '%s'."
-msgstr "ach anois is ionann iad na comhaid `%s' agus `%s'."
+msgstr "ach anois is ionann iad na comhaid '%s' agus '%s'."
 
-#: file.c:290
-#, fuzzy, c-format
+#: src/file.c:290
+#, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
-"Déanfar neamhshuim ar orduithe le haghaidh `%s'; úsáidfear na cinn le "
-"haghaidh `%s' ina n-ionad."
+"Déanfar neamhshuim ar an oideas le haghaidh '%s'; úsáidfear an ceann le "
+"haghaidh '%s' ina ionad."
 
-#: file.c:310
-#, fuzzy, c-format
+#: src/file.c:310
+#, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
-"ní féidir idirstad aonair `%s' a athainmnigh le hidirstad dúbailte `%s'"
+"ní féidir idirstad aonair '%s' a athainmnigh le hidirstad dúbailte '%s'"
 
-#: file.c:316
-#, fuzzy, c-format
+#: src/file.c:316
+#, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
-msgstr "ní féidir idirstad dúbailte `%s' a athainmniú le hidirstad aonair `%s'"
+msgstr "ní féidir idirstad dúbailte '%s' a athainmniú le hidirstad aonair '%s'"
 
-#: file.c:408
-#, fuzzy, c-format
+#: src/file.c:408
+#, c-format
 msgid "*** Deleting intermediate file '%s'"
-msgstr "*** Comhad idirmheánach `%s' á scriosadh"
+msgstr "*** Comhad idirmheánach '%s' á scriosadh"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
-msgstr "Comhaid idirmheánacha á mbaint...\n"
+msgstr "Comhaid idirmheánacha á mbaint...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "An t-am anois"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
-msgstr "%s: Stampa ama as raon; %s á úsáid ina ionad"
+msgstr "%s: Stampa ama as raon; %s á úsáid ina ionad"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
-msgstr "# Ní sprioc é:"
+msgstr "# Ní sprioc é:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
-msgstr "#  Comhad luachmhar (réamhriachtanas de .PRECIOUS)."
+msgstr "#  Comhad luachmhar (réamhriachtanas de .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
-msgstr "#  Sprioc bhréige (réamhriachtanas de .PHONY)."
+msgstr "#  Sprioc bhréige (réamhriachtanas de .PHONY)."
 
-#: file.c:971
-#, fuzzy
+#: src/file.c:1025
 msgid "#  Command line target."
-msgstr "#  Sprioc líne na n-orduithe."
+msgstr "#  Sprioc líne na n-orduithe."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
-msgstr "#  Makefile réamhshocraithe, nó ó MAKEFILES, nó -include/sinclude."
+msgstr "#  Makefile réamhshocraithe, nó ó MAKEFILES, nó -include/sinclude."
 
-#: file.c:975
-#, fuzzy
+#: src/file.c:1029
 msgid "#  Builtin rule"
-msgstr ""
-"\n"
-"# Níl aon riail intuigthe."
+msgstr "#  Riail insuite"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Rinneadh cuardach ar rialacha intuigthe."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
-msgstr "#  Ní dhearna cuardach ar rialacha intuigthe."
+msgstr "#  Ní dhearnadh cuardach ar rialacha intuigthe."
 
-#: file.c:980
-#, fuzzy, c-format
+#: src/file.c:1034
+#, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
-msgstr "#  Stoc patrúin intuigthe/statach: `%s'\n"
+msgstr "#  Stoc patrúin intuigthe/statach: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
-msgstr "#  Tá an comhad ina réamhriachtanas idirmheánach."
+msgstr "#  Tá an comhad ina réamhriachtanas idirmheánach."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
-msgstr "#  Déantar fosta:"
+msgstr "#  Déanann sé freisin:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
-msgstr "#  Níor seiceáladh an t-am mionathraithe riamh."
+msgstr "#  Níor seiceáladh an t-am mionathraithe riamh."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
-msgstr "#  Níl a leithéid de chomhad ann."
+msgstr "#  Níl a leithéid de chomhad ann."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
-msgstr "#  Is cianaosta an comhad seo."
+msgstr "#  Tá an comhad an-aosta."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Athraithe %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
-msgstr "#  Nuashonraíodh an comhad."
+msgstr "#  Nuashonraíodh an comhad."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
-msgstr "#  Níor nuashonraíodh an comhad."
+msgstr "#  Níor nuashonraíodh an comhad."
 
-#: file.c:1008
-#, fuzzy
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
-msgstr "#  Tá orduithe ann atá ag rith faoi láthair (IS FABHT É SEO)."
+msgstr "#  Oideas á rith faoi láthair (IS FABHT É SEO)."
 
-#: file.c:1011
-#, fuzzy
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
-msgstr "#  Tá orduithe spleáchais ag rith (IS FABHT É SEO)."
+msgstr "#  Oideas spleáchais á rith (IS FABHT É SEO)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
-msgstr "#  D'éirigh leis an nuashonrú."
+msgstr "#  D'éirigh leis an nuashonrú."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
-msgstr "#  Tá gá le nuashonrú (-q ceaptha)."
+msgstr "#  Tá gá le nuashonrú (-q sainithe)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
-msgstr "#  Theip ar nuashonrú."
+msgstr "#  Theip ar an nuashonrú."
 
-#: file.c:1032
-#, fuzzy
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
-msgstr "#  Luach neamhbhailí sa bhall `command_state'!"
+msgstr "#  Luach neamhbhailí sa bhall 'command_state'!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -364,564 +356,554 @@ msgstr ""
 "\n"
 "# Comhaid"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
 "# "
 msgstr ""
 "\n"
-"# comhaid hais-tábla stait:\n"
+"# comhaid hais-tábla stait:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
-msgstr ""
+msgstr "%s: Níl réimse '%s' i dtaisce: %s"
 
-#: function.c:790
-#, fuzzy
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
-msgstr "tá an chéad argóint neamhuimhriúil leis an fheidhm `word'"
+msgstr "neamhuimhriúil an chéad argóint le feidhm 'word'"
 
-#: function.c:795
-#, fuzzy
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
-msgstr "caithfidh an chéad argóint leis an fheidhm `word' a bheith deimhneach"
+msgstr "caithfidh an chéad argóint le feidhm 'word' a bheith deimhneach"
 
-#: function.c:815
-#, fuzzy
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
-msgstr "is neamhuimhriúil í an chéad argóint leis an fheidhm `wordlist'"
+msgstr "neamhuimhriúil an chéad argóint le feidhm 'wordlist'"
 
-#: function.c:817
-#, fuzzy
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
-msgstr "is neamhuimhriúil í an dara hargóint leis an fheidhm `wordlist'"
+msgstr "neamhuimhriúil an dara hargóint le feidhm 'wordlist'"
 
-#: function.c:1525
-#, fuzzy, c-format
+#: src/function.c:1533
+#, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
-msgstr "create_child_process: theip ar DuplicateHandle(In) (e=%ld)\n"
+msgstr "windows32_openpipe: theip ar DuplicateHandle(In) (e=%ld)\n"
 
-#: function.c:1549
-#, fuzzy, c-format
+#: src/function.c:1557
+#, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
-msgstr "create_child_process: theip ar DuplicateHandle(Earr) (e=%ld)\n"
+msgstr "windows32_openpipe: theip ar DuplicateHandle(Earr) (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "Theip ar CreatePipe() (e=%ld)\n"
 
-#: function.c:1564
-#, fuzzy
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
-msgstr "windows32_openpipe (): theip ar process_init_fd()\n"
+msgstr "windows32_openpipe(): theip ar process_init_fd()\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
-msgstr "Baisc-chomhad sealadach %s á ghlanadh\n"
+msgstr "Baisc-chomhad sealadach %s á ghlanadh\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
-msgstr ""
+msgstr "comhad: ainm comhaid ar iarraidh"
 
-#: function.c:2219 function.c:2250
-#, fuzzy, c-format
+#: src/function.c:2234 src/function.c:2265
+#, c-format
 msgid "open: %s: %s"
-msgstr "%s: %s"
+msgstr "oscailt: %s: %s"
 
-#: function.c:2227
-#, fuzzy, c-format
+#: src/function.c:2242
+#, c-format
 msgid "write: %s: %s"
-msgstr "earráid sa scríobh: %s"
+msgstr "scríobh: %s: %s"
 
-#: function.c:2230 function.c:2267
-#, fuzzy, c-format
+#: src/function.c:2245 src/function.c:2282
+#, c-format
 msgid "close: %s: %s"
-msgstr "%s%s: %s"
+msgstr "dúnadh: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
-msgstr ""
+msgstr "comhad: an iomarca argóintí"
 
-#: function.c:2262
-#, fuzzy, c-format
+#: src/function.c:2277
+#, c-format
 msgid "read: %s: %s"
-msgstr "%s: %s"
+msgstr "léamh: %s: %s"
 
-#: function.c:2275
-#, fuzzy, c-format
+#: src/function.c:2290
+#, c-format
 msgid "file: invalid file operation: %s"
-msgstr "%s: rogha neamhbhailí -- %c\n"
+msgstr "comhad: oibríocht neamhbhailí ar chomhad: %s"
 
-#: function.c:2390
-#, fuzzy, c-format
+#: src/function.c:2405
+#, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
-msgstr "easpa argóintí (%d) d'fheidhm `%s'"
+msgstr "easpa argóintí (%d) ar fheidhm '%s'"
 
-#: function.c:2402
-#, fuzzy, c-format
+#: src/function.c:2417
+#, c-format
 msgid "unimplemented on this platform: function '%s'"
-msgstr "níl an fheidhm `%s' ar fáil ar an chóras seo"
+msgstr "níl feidhm '%s' ar fáil ar an chóras seo"
 
-#: function.c:2466
-#, fuzzy, c-format
+#: src/function.c:2483
+#, c-format
 msgid "unterminated call to function '%s': missing '%c'"
-msgstr "glao ar fheidhm `%s' gan chríochnú: `%c' ar iarraidh"
+msgstr "glao ar fheidhm '%s' gan chríochnú: '%c' ar iarraidh"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
-msgstr ""
+msgstr "Tá ainm na feidhme folamh"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
-msgstr ""
+msgstr "Tá ainm na feidhme neamhbhailí: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
-msgstr ""
+msgstr "Tá ainm na feidhme rófhada: %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "easpa argóintí (%d) d'fheidhm `%s'"
+msgstr "Íosmhéid argóintí neamhbhailí (%u) d'fheidhm %s"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "easpa argóintí (%d) d'fheidhm `%s'"
+msgstr "Uasmhéid argóintí neamhbhailí (%u) d'fheidhm %s"
 
-#: getopt.c:659
-#, fuzzy, c-format
+#: src/getopt.c:659
+#, c-format
 msgid "%s: option '%s' is ambiguous\n"
-msgstr "%s: Tá an rogha `%s' débhríoch\n"
+msgstr "%s: Tá an rogha '%s' débhríoch\n"
 
-#: getopt.c:683
-#, fuzzy, c-format
+#: src/getopt.c:683
+#, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
-msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `--%s'\n"
+msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha '--%s'\n"
 
-#: getopt.c:688
-#, fuzzy, c-format
+#: src/getopt.c:688
+#, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
-msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `%c%s'\n"
+msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha '%c%s'\n"
 
-#: getopt.c:705 getopt.c:878
-#, fuzzy, c-format
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
 msgid "%s: option '%s' requires an argument\n"
-msgstr "%s: tá argóint de dhíth i ndiaidh na rogha `%s'\n"
+msgstr "%s: tá argóint de dhíth i ndiaidh na rogha '%s'\n"
 
-#: getopt.c:734
-#, fuzzy, c-format
+#: src/getopt.c:734
+#, c-format
 msgid "%s: unrecognized option '--%s'\n"
-msgstr "%s: rogha anaithnid `--%s'\n"
+msgstr "%s: rogha anaithnid '--%s'\n"
 
-#: getopt.c:738
-#, fuzzy, c-format
+#: src/getopt.c:738
+#, c-format
 msgid "%s: unrecognized option '%c%s'\n"
-msgstr "%s: rogha anaithnid `%c%s'\n"
+msgstr "%s: rogha anaithnid '%c%s'\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: rogha neamhcheadaithe -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
-msgstr "%s: rogha neamhbhailí -- %c\n"
+msgstr "%s: rogha neamhbhailí -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
-msgstr "%s: tá argóint de dhíth i ndiaidh na rogha -- %c\n"
+msgstr "%s: tá argóint de dhíth i ndiaidh na rogha -- %c\n"
 
-#: getopt.c:844
-#, fuzzy, c-format
+#: src/getopt.c:844
+#, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
-msgstr "%s: Tá an rogha `-W %s' débhríoch\n"
+msgstr "%s: Tá an rogha '-W %s' débhríoch\n"
 
-#: getopt.c:862
-#, fuzzy, c-format
+#: src/getopt.c:862
+#, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
-msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha `-W %s'\n"
+msgstr "%s: ní cheadaítear argóint i ndiaidh na rogha '-W %s'\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
-msgstr ""
+msgstr "guile: '%s' á leathnú\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
-msgstr ""
+msgstr "guile: '%s' á luacháil\n"
 
-#: hash.c:49
-#, fuzzy, c-format
-msgid "can't allocate %lu bytes for hash table: memory exhausted"
-msgstr "ní féidir %ld beart a dháileadh le haghaidh hais-tábla: cuimhne ídithe"
-
-#: hash.c:280
+#: src/hash.c:50
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Lód=%ld/%ld=%.0f%%, "
+msgid "can't allocate %lu bytes for hash table: memory exhausted"
+msgstr "ní féidir %lu beart a dháileadh le haghaidh hais-tábla: cuimhne ídithe"
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
-msgstr "Ath-haiseáil=%d, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Lód=%ld/%ld=%.0f%%, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Tuairteanna haiseála=%ld/%ld=%.0f%%"
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
+msgstr "Ath-haiseáil=%d, "
 
-#: implicit.c:38
+#: src/hash.c:283
 #, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Tuairteanna haiseála=%ld/%ld=%.0f%%"
+
+#: src/implicit.c:38
+#, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
-msgstr "Ag déanamh cuardach ar riail intuigthe le haghaidh `%s'.\n"
+msgstr "Ag lorg riail intuigthe le haghaidh '%s'.\n"
 
-#: implicit.c:54
-#, fuzzy, c-format
+#: src/implicit.c:54
+#, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
-msgstr ""
-"Ag déanamh cuardach ar riail intuigthe le haghaidh bhall cartlainne `%s'.\n"
-
-#: implicit.c:311
-msgid "Avoiding implicit rule recursion.\n"
-msgstr "Athchúrsáil de bharr rialacha intuigthe á seachaint.\n"
+msgstr "Ag lorg riail intuigthe le haghaidh bhall cartlainne '%s'.\n"
 
-#: implicit.c:486
+#: src/implicit.c:311
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr ""
+msgid "Avoiding implicit rule recursion.\n"
+msgstr "Athchúrsáil de bharr rialacha intuigthe á seachaint.\n"
 
-#: implicit.c:491
+#: src/implicit.c:484
 #, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Stoc rófhada: '%.*s'.\n"
+
+#: src/implicit.c:490
+#, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
-msgstr "Ag baint triail as riail phatrúin le stoc `%.*s'.\n"
+msgstr "Ag baint triail as riail phatrúin le stoc '%.*s'.\n"
 
-#: implicit.c:697
-#, fuzzy, c-format
+#: src/implicit.c:717
+#, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
-msgstr "Réamhriachtanas neamhfhéideartha rialach `%s' á dhiúltú.\n"
+msgstr "Réamhriachtanas neamhfhéideartha rialach '%s' á dhiúltú.\n"
 
-#: implicit.c:698
-#, fuzzy, c-format
+#: src/implicit.c:718
+#, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
-msgstr "Réamhriachtanas intuigthe neamhfhéideartha `%s' á dhiúltú.\n"
+msgstr "Réamhriachtanas intuigthe neamhfhéideartha '%s' á dhiúltú.\n"
 
-#: implicit.c:711
-#, fuzzy, c-format
+#: src/implicit.c:732
+#, c-format
 msgid "Trying rule prerequisite '%s'.\n"
-msgstr "Ag baint triail as an réamhriachtanas rialach `%s'.\n"
+msgstr "Ag baint triail as réamhriachtanas rialach '%s'.\n"
 
-#: implicit.c:712
-#, fuzzy, c-format
+#: src/implicit.c:733
+#, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
-msgstr "Ag baint triail as an réamhriachtanas intuigthe `%s'.\n"
+msgstr "Ag baint triail as réamhriachtanas intuigthe '%s'.\n"
 
-#: implicit.c:751
-#, fuzzy, c-format
+#: src/implicit.c:772
+#, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
-msgstr "Aimsíodh réamhriachtanas `%s' mar VPATH `%s'\n"
+msgstr "Aimsíodh réamhriachtanas '%s' mar VPATH '%s'\n"
 
-#: implicit.c:765
-#, fuzzy, c-format
+#: src/implicit.c:786
+#, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
-msgstr "Ag déanamh cuardach ar riail le comhad idirmheánach `%s'.\n"
+msgstr "Ag lorg riail le comhad idirmheánach '%s'.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
-msgstr "Ní féidir comhad sealadach a chruthú\n"
+msgstr "Ní féidir comhad sealadach a chruthú\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
-msgstr " (córdhumpa)"
+msgstr " (córdhumpa)"
 
-#: job.c:490
-#, fuzzy
+#: src/job.c:553
 msgid " (ignored)"
-msgstr "[%s] Earráid %d (rinneadh neamhshuim)"
+msgstr " (rinneadh neamhshuim air)"
 
-#: job.c:494 job.c:1828
-#, fuzzy
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
-msgstr " (insuite):"
+msgstr "<insuite>"
 
-#: job.c:510
-#, fuzzy, c-format
+#: src/job.c:573
+#, c-format
 msgid "%s[%s: %s] Error %d%s"
-msgstr "*** [%s] Earráid %d"
+msgstr "%s[%s: %s] Earráid %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
-msgstr "*** Ag fanacht le jabanna neamhchríochnaithe..."
+msgstr "*** Ag fanacht le jabanna neamhchríochnaithe..."
 
-#: job.c:629
-#, fuzzy, c-format
+#: src/job.c:704
+#, c-format
 msgid "Live child %p (%s) PID %s %s\n"
-msgstr "Mac beo 0x%08lx (%s) PID %ld %s\n"
+msgstr "Mac beo %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
-msgstr " (cianda)"
+msgstr " (i gcéin)"
 
-#: job.c:831
-#, fuzzy, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Mac caillteach á bhaint: 0x%08lx PID %ld %s\n"
-
-#: job.c:832
-#, fuzzy, c-format
+#: src/job.c:898
+#, c-format
 msgid "Reaping winning child %p PID %s %s\n"
-msgstr "Mac buaiteach á bhaint: 0x%08lx PID %ld %s\n"
+msgstr "Mac a bhuaigh á bhaint: %p PID %s %s\n"
+
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Mac a chaill á bhaint: %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
-msgstr "Baisc-chomhad sealadach %s á ghlanadh\n"
+msgstr "Baisc-chomhad sealadach %s á ghlanadh\n"
 
-#: job.c:845
-#, fuzzy, c-format
+#: src/job.c:956
+#, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
-msgstr "Baisc-chomhad sealadach %s á ghlanadh\n"
+msgstr "Níorbh fhéidir baisc-chomhad sealadach %s a ghlanadh (%d)\n"
 
-#: job.c:951
-#, fuzzy, c-format
+#: src/job.c:1071
+#, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
-msgstr "Mac 0x%08lx PID %ld%s á dhealú ón slabhra.\n"
+msgstr "Mac %p PID %s%s á bhaint ón slabhra.\n"
 
-#: job.c:1006
-#, fuzzy, c-format
+#: src/job.c:1120
+#, c-format
 msgid "Released token for child %p (%s).\n"
-msgstr "Saoradh ceadchomhartha le haghaidh mac 0x%08lx (%s).\n"
+msgstr "Saoradh ceadchomhartha le haghaidh mac %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
-msgstr "theip ar process_easy(); níor tosaíodh próiseas (e=%ld)\n"
+msgstr "theip ar process_easy(); níor tosaíodh próiseas (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 "\n"
-"%d argóint sa tosú theipthe\n"
+"%d argóint sa tosú teipthe\n"
 
-#: job.c:1581
-#, fuzzy, c-format
+#: src/job.c:1642
+#, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
-msgstr "Ag cur mac 0x%08lx (%s) PID %ld%s ar an slabhra.\n"
+msgstr "Mac %p (%s) PID %s%s á chur ar an slabhra.\n"
 
-#: job.c:1811
-#, fuzzy, c-format
+#: src/job.c:1875
+#, c-format
 msgid "Obtained token for child %p (%s).\n"
-msgstr "Fuarthas ceadchomhartha le haghaidh mac 0x%08lx (%s).\n"
+msgstr "Fuarthas ceadchomhartha le haghaidh mac %p (%s).\n"
 
-#: job.c:1838
-#, fuzzy, c-format
+#: src/job.c:1902
+#, c-format
 msgid "%s: target '%s' does not exist"
-msgstr "touch: Níl an chartlann `%s' ann"
+msgstr "%s: níl sprioc '%s' ann"
 
-#: job.c:1841
-#, fuzzy, c-format
+#: src/job.c:1905
+#, c-format
 msgid "%s: update target '%s' due to: %s"
-msgstr ""
-"%sNíl aon riail chun an sprioc `%s' a dhéanamh, riachtanach le haghaidh `"
-"%s'%s"
+msgstr "%s: nuashonrú sprioc '%s' mar gheall ar: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
-msgstr "ní féidir srianta lóid a chur i bhfeidhm ar an chóras oibriúcháin seo"
+msgstr "ní féidir srianta lóid a chur i bhfeidhm ar an chóras oibriúcháin seo"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
-msgstr "ní féidir srian lóid a chur i bhfeidhm: "
+msgstr "ní féidir srian lóid a chur i bhfeidhm: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
-msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdin a chóipeáil\n"
+msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdin a chóipeáil\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
-msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdout a chóipeáil\n"
+msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdout a chóipeáil\n"
 
-#: job.c:2074
-#, fuzzy
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
-msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stdin a chóipeáil\n"
+msgstr "níl aon hanla comhaid le fáil: níorbh fhéidir stderr a chóipeáil\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
-msgstr "Níorbh fhéidir stdin a athchóiriú\n"
+msgstr "Níorbh fhéidir stdin a athchóiriú\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
-msgstr "Níorbh fhéidir stdout a athchóiriú\n"
+msgstr "Níorbh fhéidir stdout a athchóiriú\n"
 
-#: job.c:2105
-#, fuzzy
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
-msgstr "Níorbh fhéidir stdin a athchóiriú\n"
+msgstr "Níorbh fhéidir stderr a athchóiriú\n"
 
-#: job.c:2234
-#, fuzzy, c-format
+#: src/job.c:2520
+#, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
-msgstr "ghin make mac le pid %ld, ag feitheamh le pid %ld fós\n"
-
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Ní bhfuarthas an t-ordú"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Ní bhfuarthas an t-ordú"
+msgstr "bhain make mac le PID %s, ag feitheamh le PID %s fós\n"
 
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Ní bhfuarthas an clár blaoisce"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
-msgstr "spawnvpe: is féidir gur ídithe í cuimhne na timpeallachta"
+msgstr "spawnvpe: seans nach bhfuil aon spás fágtha sa timpeallacht"
 
-#: job.c:2584
-#, fuzzy, c-format
+#: src/job.c:2862
+#, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
-msgstr "Athraíodh $SHELL (ba `%s' é, agus is `%s' é anois)\n"
+msgstr "Athraíodh $SHELL (ba '%s' é, ach is '%s' é anois)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
-msgstr "Baisc-chomhad sealadach %s á chruthú\n"
+msgstr "Baisc-chomhad sealadach %s á chruthú\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
+"Inneachar an bhaisc-chomhaid:\n"
+"\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
+"Inneachar an bhaisc-chomhaid:%s\n"
+"\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
-"%s (líne %d) Droch-chomhthéacs blaoisce (!unixy && !batch_mode_shell)\n"
-
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
+"%s (líne %d) Droch-chomhthéacs blaoisce (!unixy && !batch_mode_shell)\n"
 
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
-msgstr ""
+msgstr "Níorbh fhéidir an tábla siombailí comhchoiteann a oscailt: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
-msgstr ""
+msgstr "Níl an réad lódáilte %s comhoiriúnach leis an GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
-msgstr ""
+msgstr "Níorbh fhéidir siombail %s a lódáil ó %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
-msgstr ""
+msgstr "Tá ainm na siombaile le lódáil folamh: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
-msgstr ""
+msgstr "Siombail %s á lódáil ó %s\n"
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
-msgstr "Níl jabanna parailéalacha (-j) ar fáil ar an gcóras seo."
+msgstr "Níl an oibríocht 'load' ar fáil ar an gcóras seo."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Roghanna:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
-msgstr "  -b, -m                      Déan neamhshuim (comhoiriúnacht)\n"
+msgstr "  -b, -m                      Déan neamhshuim (comhoiriúnacht)\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
-msgstr "  -B, --always-make           Déan gach sprioc, gan choinníollacha.\n"
+msgstr "  -B, --always-make           Déan gach sprioc, gan choinníollacha.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 "  -C COMHADLANN, --directory=COMHADLANN\n"
-"                              Téigh go COMHADLANN roimh dhéanamh aon rud.\n"
+"                              Téigh go COMHADLANN roimh dhéanamh aon rud.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
-msgstr "  -d                          Taispeáin go leor eolas dífhabhtaithe.\n"
+msgstr "  -d                          Taispeáin go leor eolas dífhabhtaithe.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
-"  --debug[=BRATACHA]          Taispeáin eolas fabhtaithe de chineálacha "
-"éagsúla.\n"
+"  --debug[=BRATACHA]          Taispeáin eolas fabhtaithe de chineálacha "
+"éagsúla.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 "  -e, --environment-overrides\n"
-"                              Sáraíonn athróga timpeallachta makefileanna.\n"
+"                              Sáraíonn athróga timpeallachta makefileanna.\n"
 
-#: main.c:353
+#: src/main.c:350
+#, fuzzy
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
+"  --eval=TEAGHRÁN             Luacháil TEAGHRÁN mar ráiteas makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 "  -f COMHAD, --file=COMHAD, --makefile=COMHAD\n"
-"                              Léigh COMHAD mar makefile.\n"
+"                              Léigh COMHAD mar makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
-msgstr "  -h, --help                  Taispeáin an chabhair seo agus scoir.\n"
+msgstr "  -h, --help                  Taispeáin an chabhair seo agus scoir.\n"
 
-#: main.c:360
-#, fuzzy
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
-msgstr ""
-"  -i, --ignore-errors         Déan neamhshuim ar earráidí ó orduithe.\n"
+msgstr "  -i, --ignore-errors         Déan neamhshuim ar earráidí ó oidis.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -930,170 +912,177 @@ msgstr ""
 "                              Cuardaigh i gCOMHADLANN ar makefileanna "
 "breise.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
-"  -j [N], --jobs[=N]          Ceadaigh N jab le chéile; éigríoch mura "
+"  -j [N], --jobs[=N]          Ceadaigh N jab le chéile; éigríoch mura "
 "gceaptar arg.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
-"  -k, --keep-going            Lean ar aghaidh fiú nach féidir sprioc a "
-"dhéanamh.\n"
+"  -k, --keep-going            Lean ar aghaidh fiú nach féidir sprioc a "
+"dhéanamh.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
-"                              Ná tosaigh jabanna iomadúla mura bhfuil an lód "
-"níos lú ná N.\n"
+"                              Ná tosaigh jabanna iomadúla mura bhfuil an lód "
+"níos lú ná N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
-"  -L, --check-symlink-times   Úsáid an t-am modhnaithe is déanaí, ar an "
+"  -L, --check-symlink-times   Úsáid an t-am modhnaithe is déanaí, ar an "
 "nasc\n"
-"                                 siombalach nó ar an sprioc.\n"
+"                                 siombalach nó ar an sprioc.\n"
 
-#: main.c:374
-#, fuzzy
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
-"                              Ná rith aon ordú; taispeáin torthaí mar dhea "
-"amháin.\n"
+"                              Ná rith aon oideas; taispeáin na orduithe "
+"amháin.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 "  -o COMHAD, --old-file=COMHAD, --assume-old=COMHAD\n"
-"                              Caith le COMHAD mar cheann cianaosta; ná "
-"hathdhéan é.\n"
+"                              Caith le COMHAD mar cheann cianaosta; ná "
+"hathdhéan é.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
+"  -O[CINEÁL], --output-sync[=CINEÁL]\n"
+"                              Sioncronaigh aschur ó jabanna comhthreomhara "
+"de réir CINEÁL.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
-"  -p, --print-data-base       Taispeáin an bunachar sonraí inmheánach.\n"
+"  -p, --print-data-base       Taispeáin an bunachar sonraí inmheánach.\n"
 
-#: main.c:385
-#, fuzzy
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
-"  -q, --question              Ná rith aon ordú; stádas scortha = 0 mura gá "
-"le nuashonrú.\n"
+"  -q, --question              Ná rith aon oideas; stádas scortha = 0 má tá "
+"sé cothrom le dáta.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
-"  -r, --no-builtin-rules      Díchumasaigh na rialacha intuigthe insuite.\n"
+"  -r, --no-builtin-rules      Díchumasaigh na rialacha intuigthe insuite.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
-msgstr "  -R, --no-builtin-variables  Díchumasaigh na hathróga insuite.\n"
+msgstr "  -R, --no-builtin-variables  Díchumasaigh na hathróga insuite.\n"
 
-#: main.c:391
-#, fuzzy
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
-msgstr "  -s, --silent, --quiet       Ná déan macalla ar orduithe.\n"
+msgstr "  -s, --silent, --quiet       Ná déan macalla ar orduithe.\n"
+
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Ná rith aon oideas; stádas scortha = 0 má tá "
+"sé cothrom le dáta.\n"
 
-#: main.c:393
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 "  -S, --no-keep-going, --stop\n"
-"                              Múch -k.\n"
+"                              Múch -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Teagmhaigh spriocanna in ionad iad a "
-"athdhéanamh.\n"
+"athdhéanamh.\n"
 
-#: main.c:398
-#, fuzzy
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
-msgstr "  -d                          Taispeáin go leor eolas dífhabhtaithe.\n"
+msgstr "  --trace                       Taispeáin faisnéis dífhabhtaithe.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
-"  -v, --version               Taispeáin eolas faoin leagan agus scoir.\n"
+"  -v, --version               Taispeáin eolas faoin leagan agus scoir.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
-msgstr "  -w, --print-directory       Taispeáin an chomhadlann reatha.\n"
+msgstr "  -w, --print-directory       Taispeáin an chomhadlann reatha.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
-"  --no-print-directory        Múch -w, fiú má tá sé i bhfeidhm go "
+"  --no-print-directory        Múch -w, fiú má tá sé i bhfeidhm go "
 "hintuigthe.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 "  -W COMHAD, --what-if=COMHAD, --new-file=COMHAD, --assume-new=COMHAD\n"
-"                              Caith le COMHAD mar cheann úrnua (go "
-"héigríoch).\n"
+"                              Caith le COMHAD mar cheann úrnua (go "
+"héigríoch).\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
-"  --warn-undefined-variables  Tabhair rabhadh má dhéantar tagairt d'athróg "
-"gan sainmhíniú.\n"
+"  --warn-undefined-variables  Tabhair rabhadh má dhéantar tagairt d'athróg "
+"gan sainmhíniú.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
-msgstr "ní féidir teaghrán folamh a úsáid mar ainm comhaid"
+msgstr "ní féidir teaghrán folamh a úsáid mar ainm comhaid"
 
-#: main.c:766
-#, fuzzy, c-format
+#: src/main.c:754
+#, c-format
 msgid "unknown debug level specification '%s'"
-msgstr "sonrú anaithnid `%s' ar an leibhéal dífhabhtaithe"
+msgstr "leibhéal dífhabhtaithe anaithnid '%s'"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
-msgstr ""
+msgstr "cineál anaithnid '%s' le haghaidh output-sync"
 
-#: main.c:861
-#, fuzzy, c-format
+#: src/main.c:849
+#, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
-msgstr "%s: Fuarthas idirbhriseadh/eisceacht (cód = 0x%lx, seoladh = 0x%lx)\n"
+msgstr "%s: Fuarthas idirbhriseadh/eisceacht (cód = 0x%lx, seoladh = 0x%p)\n"
 
-#: main.c:868
-#, fuzzy, c-format
+#: src/main.c:856
+#, c-format
 msgid ""
 "\n"
 "Unhandled exception filter called from program %s\n"
@@ -1102,187 +1091,190 @@ msgid ""
 "ExceptionAddress = 0x%p\n"
 msgstr ""
 "\n"
-"Glaodh scagaire eisceachta gan láimhseáil ón chlár %s\n"
-"CódEisceachta = %lx\n"
+"Cuireadh glaoch ar scagaire eisceachta gan láimhseáil ón chlár %s\n"
+"CódEisceachta = %lx\n"
 "BratachaEisceachta = %lx\n"
-"SeoladhEisceachta = %lx\n"
+"SeoladhEisceachta = 0x%p\n"
 
-#: main.c:876
-#, fuzzy, c-format
+#: src/main.c:864
+#, c-format
 msgid "Access violation: write operation at address 0x%p\n"
-msgstr "Sárú rochtana: oibríocht scríofa ag seoladh %lx\n"
+msgstr "Sárú cearta rochtana: oibríocht scríofa ag seoladh 0x%p\n"
 
-#: main.c:877
-#, fuzzy, c-format
+#: src/main.c:865
+#, c-format
 msgid "Access violation: read operation at address 0x%p\n"
-msgstr "Sárú rochtana: oibríocht léimh ag seoladh %lx\n"
+msgstr "Sárú cearta rochtana: oibríocht léimh ag seoladh 0x%p\n"
 
-#: main.c:953 main.c:968
-#, fuzzy, c-format
+#: src/main.c:941 src/main.c:956
+#, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
-msgstr "tá find_and_set_shell ag socrú default_shell = %s\n"
-
-#: main.c:1021
-#, fuzzy, c-format
-msgid "find_and_set_shell() path search set default_shell = %s\n"
-msgstr "shocraigh find_and_set_shell conair chuardaigh default_shell = %s\n"
+msgstr "tá find_and_set_shell() ag socrú default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1009
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "cuirfear %s ar fionraí ar feadh tréimhse 30 soicind..."
+msgid "find_and_set_shell() path search set default_shell = %s\n"
+msgstr "shocraigh find_and_set_shell() conair chuardaigh default_shell = %s\n"
 
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) críochnaithe. Ag gabháil ar aghaidh.\n"
-
-#: main.c:1627
-#, fuzzy
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
-"rabhadh: níl jabfhreastalaí ar fáil: ag baint úsáid as -j1.  Cuir `+' leis "
-"an máthair-riail."
+"rabhadh: níl an jabfhreastalaí ar fáil: ag úsáid -j1. Cuir '+' leis an "
+"thair-riail."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "rabhadh: -jN fórsáilte i bhfo-make: mód jabfhreastalaí á dhíchumasú."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "rabhadh: -jN fórsáilte i bhfo-make: mód jabfhreastalaí á dhíchumasú."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
-msgstr "Sonraíodh Makefile ón ionchur caighdeánach faoi dhó."
+msgstr "Sonraíodh Makefile ón ionchur caighdeánach faoi dhó."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (comhad sealadach)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (comhad sealadach)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "rabhadh: -jN fórsáilte i bhfo-make: mód jabfhreastalaí á dhíchumasú."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
-msgstr "Níl jabanna parailéalacha (-j) ar fáil ar an gcóras seo."
+msgstr "Níl jabanna parailéalacha (-j) ar fáil ar an gcóras seo."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
-msgstr "Á athshocrú le haghaidh jabanna aonair (-j1)."
+msgstr "Á athshocrú le haghaidh jabanna aonair (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
-msgstr "ní thacaítear le naisc shiombalacha: -L á dhíchumasú."
+msgstr "ní thacaítear le naisc shiombalacha: -L á dhíchumasú."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
-msgstr "Makefileanna á nuashonrú....\n"
+msgstr "Makefileanna á nuashonrú....\n"
 
-#: main.c:2195
-#, fuzzy, c-format
+#: src/main.c:2226
+#, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
-msgstr "is féidir go lúbfar an Makefile `%s'; ní athdhéanfar é.\n"
+msgstr "Seans go lúbfar an Makefile '%s'; ní athdhéanfar é.\n"
 
-#: main.c:2279
-#, fuzzy, c-format
+#: src/main.c:2303
+#, c-format
 msgid "Failed to remake makefile '%s'."
-msgstr "Theip ar athdhéanamh an makefile `%s'."
+msgstr "Níorbh fhéidir makefile '%s' a athdhéanamh."
 
-#: main.c:2299
-#, fuzzy, c-format
+#: src/main.c:2323
+#, c-format
 msgid "Included makefile '%s' was not found."
-msgstr "Níor aimsíodh an makefile `%s' san áireamh."
+msgstr "Níor aimsíodh makefile '%s' atá san áireamh."
 
-#: main.c:2304
-#, fuzzy, c-format
+#: src/main.c:2328
+#, c-format
 msgid "Makefile '%s' was not found"
-msgstr "Níor aimsíodh an makefile `%s'"
+msgstr "Níor aimsíodh makefile '%s'"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
-msgstr "Níorbh fhéidir an chomhadlann oibre a athrú ar ais."
+msgstr "Níorbh fhéidir filleadh ar an gcomhadlann roimhe seo."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
-msgstr "Á rith arís[%u]:"
+msgstr "Á rith arís[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (comhad sealadach): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
-msgstr "tá níos mó ná aon sprioc amháin i .DEFAULT_GOAL"
+msgstr "tá níos mó ná aon sprioc amháin i .DEFAULT_GOAL"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Níor sonraíodh aon sprioc agus níor aimsíodh aon makefile"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
-msgstr "Níl aon sprioc ann"
+msgstr "Níl aon sprioc ann"
+
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Níor sonraíodh aon sprioc agus níor aimsíodh aon makefile"
 
-#: main.c:2555
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
-msgstr "Cinn sprice á nuashonrú....\n"
+msgstr "Cinn sprice á nuashonrú....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
-msgstr "rabhadh:  Clog ar sceabha.  Is féidir go bhfuil an tógáil neamhiomlán."
+msgstr "rabhadh:  Clog ar sceabha.  Seans nár chríochnaigh an tógáil."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
-msgstr "Úsáid: %s [roghanna] [sprioc] ...\n"
+msgstr "Úsáid: %s [roghanna] [sprioc] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
 "This program built for %s\n"
 msgstr ""
 "\n"
-"Tógadh an clár seo le haghaidh %s\n"
+"Tógadh an clár seo le haghaidh %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
 "This program built for %s (%s)\n"
 msgstr ""
 "\n"
-"Tógadh an clár seo le haghaidh %s (%s)\n"
+"Tógadh an clár seo le haghaidh %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
-msgstr "Seol tuairiscí fabhtanna chuig <bug-make@gnu.org>\n"
+msgstr "Seol tuairiscí fabhtanna chuig <bug-make@gnu.org>\n"
 
-#: main.c:2870
-#, fuzzy, c-format
+#: src/main.c:2901
+#, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
-msgstr "caithfidh tú teaghrán nach folamh a thabhairt mar argóint le `-%c'"
+msgstr "caithfidh tú teaghrán neamhfholamh a thabhairt mar argóint le '%s%s'"
 
-#: main.c:2934
-#, fuzzy, c-format
+#: src/main.c:2965
+#, c-format
 msgid "the '-%c' option requires a positive integer argument"
-msgstr "caithfidh tú slánuimhir dheimhneach a thabhairt mar argóint le `-%c'"
+msgstr "caithfidh tú slánuimhir dheimhneach a thabhairt mar argóint le '-%c'"
 
-#: main.c:3332
-#, fuzzy, c-format
+#: src/main.c:3363
+#, c-format
 msgid "%sBuilt for %s\n"
-msgstr ""
-"\n"
-"%sTógadh an clár seo le haghaidh %s\n"
+msgstr "%sTógadh an clár seo le haghaidh %s\n"
 
-#: main.c:3334
-#, fuzzy, c-format
+#: src/main.c:3365
+#, c-format
 msgid "%sBuilt for %s (%s)\n"
-msgstr ""
-"\n"
-"%sTógadh an clár seo le haghaidh %s (%s)\n"
+msgstr "%sTógadh an clár seo le haghaidh %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1290,534 +1282,556 @@ msgid ""
 "%sThis is free software: you are free to change and redistribute it.\n"
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
+"%sCeadúnas GPLv3+: GNU GPL leagan 3 nó níos déanaí <http://gnu.org/licenses/"
+"gpl.html>\n"
+"%sIs saorbhogearra é seo: ceadaítear duit é a athrú agus a athdháileadh.\n"
+"%sNíl baránta AR BITH ann, an oiread atá ceadaithe de réir dlí.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
 "# Make data base, printed on %s"
 msgstr ""
 "\n"
-"# Bunachar sonraí Make, priontáilte ar %s"
+"# Bunachar sonraí Make, priontáilte ar %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
 "# Finished Make data base on %s\n"
 msgstr ""
 "\n"
-"# Críochnaíodh an bunachar sonraí Make seo ar %s\n"
+"# Críochnaíodh an bunachar sonraí Make seo ar %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Earráid anaithnid %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
-msgstr "%s: úsáideoir %lu (fíor %lu), grúpa %lu (fíor %lu)\n"
+msgstr "%s: úsáideoir %lu (fíor %lu), grúpa %lu (fíor %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
-msgstr "Rochtain túsaithe"
+msgstr "Rochtain túsaithe"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
-msgstr "Rochtain úsáideora"
+msgstr "Rochtain úsáideora"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Rochtain make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Rochtain mic"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Ag dul isteach i gcomhadlann anaithnid\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Ag dul amach as comhadlann anaithnid\n"
 
-#: output.c:109
-#, fuzzy, c-format
+#: src/output.c:102
+#, c-format
 msgid "%s: Entering directory '%s'\n"
-msgstr "%s: Ag dul isteach sa chomhadlann `%s'\n"
+msgstr "%s: Ag dul isteach i gcomhadlann '%s'\n"
 
-#: output.c:111
-#, fuzzy, c-format
+#: src/output.c:104
+#, c-format
 msgid "%s: Leaving directory '%s'\n"
-msgstr "%s: Ag dul amach as an gcomhadlann `%s'\n"
+msgstr "%s: Ag dul amach as comhadlann '%s'\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Ag dul isteach i gcomhadlann anaithnid\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Ag dul amach as comhadlann anaithnid\n"
 
-#: output.c:120
-#, fuzzy, c-format
+#: src/output.c:113
+#, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
-msgstr "%s[%u]: Ag dul isteach sa chomhadlann `%s'\n"
+msgstr "%s[%u]: Ag dul isteach i gcomhadlann '%s'\n"
 
-#: output.c:122
-#, fuzzy, c-format
+#: src/output.c:115
+#, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
-msgstr "%s[%u]: Ag dul amach as an gcomhadlann `%s'\n"
+msgstr "%s[%u]: Ag dul amach as comhadlann '%s'\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
-msgstr "earráid sa scríobh: %s"
+msgstr "earráid scríofa: stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Stop.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "níl -O[CINEÁL] (--output-sync[=CINEÁL]) ar fáil sa leagan seo."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
-msgstr "píopa na jabanna á chruthú"
+msgstr "píopa na jabanna á chruthú"
 
-#: posixos.c:72 posixos.c:227
-#, fuzzy
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
-msgstr "píopa na jabanna á chruthú"
+msgstr "píopa na jabanna á chóipeáil"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
-msgstr "píopa an jabfhreastalaí á thúsú"
+msgstr "píopa an jabfhreastalaí á thúsú"
 
-#: posixos.c:90
-#, fuzzy, c-format
+#: src/posixos.c:119
+#, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
-msgstr "earráid inmheánach: teaghrán neamhbhailí --jobserver-fds `%s'"
+msgstr "earráid inmheánach: teaghrán neamhbhailí --jobserver-auth '%s'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
-msgstr ""
+msgstr "Cliant jabfhreastalaí (fds %d,%d)\n"
 
-#: posixos.c:109
-#, fuzzy
+#: src/posixos.c:138
 msgid "jobserver pipeline"
-msgstr "píopa an jabfhreastalaí á thúsú"
+msgstr "píblíne an jabfhreastalaí"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
-msgstr "scríobh jabfhreastalaí"
+msgstr "scríobh jabfhreastalaí"
 
-#: posixos.c:268
-#, fuzzy
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
-msgstr "léadh píopa na jabanna"
+msgstr "pselect píopa na jabanna"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
-msgstr "léadh píopa na jabanna"
+msgstr "léadh píopa na jabanna"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
-msgstr "Makefileanna á léamh...\n"
+msgstr "Makefile-anna á léamh...\n"
 
-#: read.c:329
-#, fuzzy, c-format
+#: src/read.c:336
+#, c-format
 msgid "Reading makefile '%s'"
-msgstr "Makefile `%s' á léamh"
+msgstr "Makefile '%s' á léamh"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
-msgstr " (gan ceann sprice réamhshocraithe)"
+msgstr " (gan ceann sprice réamhshocraithe)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (conair chuardaigh)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (is cuma)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
-msgstr " (ná fairsing ~)"
+msgstr " (ná leathnaigh ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
-msgstr ""
+msgstr "Ag dul thar BOM UTF-8 i Makefile '%s'\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
-msgstr ""
+msgstr "Ag dul thar BOM UTF-8 i maolán Makefile\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
-msgstr "comhréir neamhbhailí i gcoinníollach"
+msgstr "comhréir neamhbhailí i gcoinníollach"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
-msgstr ""
+msgstr "%s: theip ar lódáil"
 
-#: read.c:985
-#, fuzzy
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
-msgstr "tá orduithe ann roimh an chéad sprioc"
+msgstr "tosaíonn an t-oideas roimh an chéad sprioc"
 
-#: read.c:1034
-#, fuzzy
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
-msgstr "riail ar iarraidh roimh orduithe"
+msgstr "riail ar iarraidh roimh an oideas"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
-msgstr " (Ar mhian leat TÁB in ionad ocht spás?)"
+msgstr "deighilteoir ar iarraidh (ar mhian leat TÁB in ionad ocht spás?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "deighilteoir%s ar iarraidh"
+msgstr "deighilteoir ar iarraidh"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
-msgstr "patrún sprice ar iarraidh"
+msgstr "patrún sprice ar iarraidh"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
-msgstr "patrúin iomadúla sprice"
+msgstr "ilphatrúin sprice"
 
-#: read.c:1268
-#, fuzzy, c-format
+#: src/read.c:1289
+#, c-format
 msgid "target pattern contains no '%%'"
-msgstr "níl aon `%%' sa phatrún sprice"
+msgstr "níl aon '%%' sa phatrún sprice"
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
-msgstr "`endif' ar iarraidh"
+msgstr "'endif' ar iarraidh"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
-msgstr "ainm folamh athróige"
+msgstr "ainm folamh athróige"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
-msgstr "Téacs gan mhaith i ndiaidh treorach `endef'"
+msgstr "téacs breise i ndiaidh treorach 'define'"
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
-msgstr "`endef' ar iarraidh, `define' gan chríochnú"
+msgstr "'endef' ar iarraidh, 'define' gan chríochnú"
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
-msgstr "Téacs gan mhaith i ndiaidh treorach `endef'"
+msgstr "téacs breise i ndiaidh treorach 'endef'"
 
-#: read.c:1588
-#, fuzzy, c-format
+#: src/read.c:1603
+#, c-format
 msgid "extraneous text after '%s' directive"
-msgstr "Téacs gan mhaith i ndiaidh treorach `%s'"
+msgstr "téacs breise i ndiaidh treorach '%s'"
 
-#: read.c:1589
-#, fuzzy, c-format
+#: src/read.c:1604
+#, c-format
 msgid "extraneous '%s'"
-msgstr "`%s' breise"
+msgstr "'%s' breise"
 
-#: read.c:1617
-#, fuzzy
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
-msgstr "ní cheadaítear ach aon `else' amháin le gach coinníollach"
+msgstr "ní cheadaítear ach aon 'else' amháin le gach ráiteas coinníollach"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
-msgstr "Is míchumtha é an sainmhíniú athróige (le haghaidh aon sprioc amháin)"
+msgstr "Is míchumtha é an sainmhíniú athróige (le haghaidh aon sprioc amháin)"
 
-#: read.c:1950
-#, fuzzy
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
-msgstr "ní féidir réamhriachtanais a shonrú i scripteanna ordaithe"
+msgstr "ní féidir réamhriachtanais a shonrú in oidis"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
-msgstr "rialacha intuigthe agus rialacha statacha measctha le chéile"
+msgstr "rialacha intuigthe agus rialacha statacha measctha le chéile"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
-msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile"
+msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile"
 
-#: read.c:2085
-#, fuzzy, c-format
+#: src/read.c:2107
+#, c-format
 msgid "target '%s' doesn't match the target pattern"
-msgstr "níl an sprioc `%s' comhoiriúnach leis an phatrún sprice"
+msgstr "níl sprioc '%s' comhoiriúnach leis an bpatrún sprice"
 
-#: read.c:2100 read.c:2146
-#, fuzzy, c-format
+#: src/read.c:2122 src/read.c:2168
+#, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr "tá iontrálacha : agus :: araon ann don chomhad sprice `%s'"
+msgstr "tá iontrálacha : agus :: sa chomhad sprice '%s'"
 
-#: read.c:2106
-#, fuzzy, c-format
+#: src/read.c:2128
+#, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr "tá an sprioc `%s' i riail amháin níos mó ná uair amháin."
+msgstr "tá an sprioc '%s' ann níos mó ná uair amháin sa riail chéanna"
 
-#: read.c:2116
-#, fuzzy, c-format
+#: src/read.c:2138
+#, c-format
 msgid "warning: overriding recipe for target '%s'"
-msgstr "rabhadh: ag sárú na n-orduithe le haghaidh na sprice `%s'"
+msgstr "rabhadh: oideas le haghaidh sprioc '%s' á shárú"
 
-#: read.c:2119
-#, fuzzy, c-format
+#: src/read.c:2141
+#, c-format
 msgid "warning: ignoring old recipe for target '%s'"
-msgstr ""
-"rabhadh: ag déanamh neamhshuim ar sheanorduithe le haghaidh sprice `%s'"
+msgstr "rabhadh: ag déanamh neamhshuim ar sheanoideas le haghaidh sprioc '%s'"
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
-msgstr "rialacha intuigthe agus gnáthrialacha measctha le chéile"
+msgstr ""
+"*** rialacha intuigthe agus gnáthrialacha measctha le chéile: comhréir dulta "
+"i léig"
+
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "rabhadh: oideas le haghaidh sprioc '%s' á shárú"
 
-#: read.c:2542
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr ""
-"rabhadh: chonacthas carachtar NUL; ag déanamh neamhshuim ar an chuid eile "
-"den líne"
+"rabhadh: chonacthas carachtar NUL; ag déanamh neamhshuim ar an chuid eile "
+"den líne"
 
-#: remake.c:226
-#, fuzzy, c-format
+#: src/remake.c:226
+#, c-format
 msgid "Nothing to be done for '%s'."
-msgstr "Níl faic le déanamh i gcomhair `%s'."
+msgstr "Níl faic le déanamh i gcomhair '%s'."
 
-#: remake.c:227
-#, fuzzy, c-format
+#: src/remake.c:227
+#, c-format
 msgid "'%s' is up to date."
-msgstr "Níl gá le `%s' a nuashonrú."
+msgstr "Tá '%s' cothrom le dáta."
 
-#: remake.c:323
-#, fuzzy, c-format
+#: src/remake.c:323
+#, c-format
 msgid "Pruning file '%s'.\n"
-msgstr "Comhad `%s' á bhearradh.\n"
+msgstr "Comhad '%s' á bhearradh.\n"
 
-#: remake.c:406
-#, fuzzy, c-format
+#: src/remake.c:389
+#, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
-msgstr ""
-"%sNíl aon riail chun an sprioc `%s' a dhéanamh, riachtanach le haghaidh `"
-"%s'%s"
+msgstr "%sNíl aon riail chun sprioc '%s' a dhéanamh, rud a theastaíonn '%s'%s"
 
-#: remake.c:416
-#, fuzzy, c-format
+#: src/remake.c:399
+#, c-format
 msgid "%sNo rule to make target '%s'%s"
-msgstr "%sNíl aon riail chun an sprioc `%s' a dhéanamh%s"
+msgstr "%sNíl aon riail chun sprioc '%s' a dhéanamh%s"
 
-#: remake.c:442
-#, fuzzy, c-format
+#: src/remake.c:425
+#, c-format
 msgid "Considering target file '%s'.\n"
-msgstr "Comhad sprice `%s' idir lámha.\n"
+msgstr "Comhad sprice '%s' á scrúdú.\n"
 
-#: remake.c:449
-#, fuzzy, c-format
+#: src/remake.c:432
+#, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr ""
-"Rinneadh iarracht ar an chomhad `%s' a nuashonrú le déanaí, agus theip air.\n"
+"Rinneadh iarracht comhad '%s' a nuashonrú le déanaí, ach theip ar an "
+"iarracht.\n"
 
-#: remake.c:461
-#, fuzzy, c-format
+#: src/remake.c:444
+#, c-format
 msgid "File '%s' was considered already.\n"
-msgstr "Rinneadh scrúdú ar an chomhad `%s' cheana.\n"
+msgstr "Rinneadh scrúdú ar chomhad '%s' cheana.\n"
 
-#: remake.c:471
-#, fuzzy, c-format
+#: src/remake.c:454
+#, c-format
 msgid "Still updating file '%s'.\n"
-msgstr "Comhad `%s' á nuashonrú fós.\n"
+msgstr "Comhad '%s' á nuashonrú fós.\n"
 
-#: remake.c:474
-#, fuzzy, c-format
+#: src/remake.c:457
+#, c-format
 msgid "Finished updating file '%s'.\n"
-msgstr "Nuashonraíodh an comhad `%s'.\n"
+msgstr "Nuashonraíodh comhad '%s'.\n"
 
-#: remake.c:503
-#, fuzzy, c-format
+#: src/remake.c:486
+#, c-format
 msgid "File '%s' does not exist.\n"
-msgstr "Níl a leithéid de chomhad `%s' ann.\n"
+msgstr "Níl comhad '%s' ann.\n"
 
-#: remake.c:511
-#, fuzzy, c-format
+#: src/remake.c:494
+#, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
-msgstr ""
-"*** Warning: comhad .LOW_RESOLUTION_TIME `%s' le stampa ama ardtaifeach"
+msgstr "*** Rabhadh: Stampa ama ardtaifidh ar comhad .LOW_RESOLUTION_TIME `%s'"
 
-#: remake.c:524 remake.c:1056
-#, fuzzy, c-format
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
 msgid "Found an implicit rule for '%s'.\n"
-msgstr "Aimsíodh riail intuigthe le haghaidh `%s'.\n"
+msgstr "Aimsíodh riail intuigthe le haghaidh '%s'.\n"
 
-#: remake.c:526 remake.c:1058
-#, fuzzy, c-format
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
 msgid "No implicit rule found for '%s'.\n"
-msgstr "Níor aimsíodh aon riail intuigthe le haghaidh `%s'.\n"
+msgstr "Níor aimsíodh aon riail intuigthe le haghaidh '%s'.\n"
 
-#: remake.c:532
-#, fuzzy, c-format
+#: src/remake.c:515
+#, c-format
 msgid "Using default recipe for '%s'.\n"
-msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh `%s'.\n"
+msgstr "Ag baint úsáid as oideas réamhshocraithe le haghaidh '%s'.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
-msgstr "Tréigeadh an spleáchas ciorclach %s <- %s."
+msgstr "Tréigeadh an spleáchas ciorclach %s <- %s."
 
-#: remake.c:691
-#, fuzzy, c-format
+#: src/remake.c:674
+#, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
-msgstr "Críochnaíodh na réamhriachtanais den chomhad sprice `%s'.\n"
+msgstr "Críochnaíodh na réamhriachtanais den chomhad sprice `%s'.\n"
 
-#: remake.c:697
-#, fuzzy, c-format
+#: src/remake.c:680
+#, c-format
 msgid "The prerequisites of '%s' are being made.\n"
-msgstr "Réamhriachtanais de `%s' á ndéanamh anois.\n"
+msgstr "Réamhriachtanais '%s' á ndéanamh anois.\n"
 
-#: remake.c:711
-#, fuzzy, c-format
+#: src/remake.c:694
+#, c-format
 msgid "Giving up on target file '%s'.\n"
-msgstr "Ag tréigean an chomhaid sprice `%s'.\n"
+msgstr "Comhad sprice '%s' á thréigean.\n"
 
-#: remake.c:716
-#, fuzzy, c-format
+#: src/remake.c:699
+#, c-format
 msgid "Target '%s' not remade because of errors."
-msgstr "Ní dhearna an sprioc `%s' arís ós rud é go bhfuil earráidí ann."
+msgstr "Ní dhearna an sprioc '%s' arís mar gheall ar earráidí."
 
-#: remake.c:768
-#, fuzzy, c-format
+#: src/remake.c:751
+#, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
-msgstr ""
-"Sonraíonn an réamhriachtanas `%s' ord rite amháin le haghaidh sprice `%s'.\n"
+msgstr "Is réamhriachtanas ord-amháin é '%s' le haghaidh sprice '%s'.\n"
 
-#: remake.c:773
-#, fuzzy, c-format
+#: src/remake.c:756
+#, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
-msgstr "Níl an réamhriachtanas `%s' den sprioc `%s' ann.\n"
+msgstr "Níl réamhriachtanas '%s' den sprioc '%s' ann.\n"
 
-#: remake.c:778
-#, fuzzy, c-format
+#: src/remake.c:761
+#, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
-msgstr "Tá an réamhriachtanas `%s' níos nuaí ná an sprioc `%s'.\n"
+msgstr "Tá réamhriachtanas '%s' níos nuaí ná sprioc '%s'.\n"
 
-#: remake.c:781
-#, fuzzy, c-format
+#: src/remake.c:764
+#, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
-msgstr "Tá an réamhriachtanas `%s' níos sine ná an sprioc `%s'.\n"
+msgstr "Tá réamhriachtanas '%s' níos sine ná sprioc '%s'.\n"
 
-#: remake.c:799
-#, fuzzy, c-format
+#: src/remake.c:782
+#, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
-msgstr "Tá dhá idirstad ag an sprioc `%s' agus níl aon réamhriachtanas aice.\n"
+msgstr "Is sprioc le dhá idirstad é '%s' agus níl aon réamhriachtanas aice.\n"
 
-#: remake.c:806
-#, fuzzy, c-format
+#: src/remake.c:789
+#, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
-"Níl aon ordú le haghaidh `%s' agus níor athraigh aon réamhriachtanas.\n"
+"Níl aon oideas ann le haghaidh '%s' agus níor athraigh aon réamhriachtanas.\n"
 
-#: remake.c:811
-#, fuzzy, c-format
+#: src/remake.c:794
+#, c-format
 msgid "Making '%s' due to always-make flag.\n"
-msgstr "`%s' á dhéanamh de bharr bratach --always-make.\n"
+msgstr "'%s' á dhéanamh mar gheall ar bhratach --always-make.\n"
 
-#: remake.c:819
-#, fuzzy, c-format
+#: src/remake.c:802
+#, c-format
 msgid "No need to remake target '%s'"
-msgstr "Níl gá leis an sprioc `%s' a athdhéanamh"
+msgstr "Ní gá an sprioc '%s' a athdhéanamh"
 
-#: remake.c:821
-#, fuzzy, c-format
+#: src/remake.c:804
+#, c-format
 msgid "; using VPATH name '%s'"
-msgstr "; ag baint úsáid as ainm VPATH `%s'"
+msgstr "; ag baint úsáid as ainm VPATH '%s'"
 
-#: remake.c:841
-#, fuzzy, c-format
+#: src/remake.c:824
+#, c-format
 msgid "Must remake target '%s'.\n"
-msgstr "Caithfidh an sprioc `%s' a athdhéanamh.\n"
+msgstr "Caithfidh an sprioc '%s' a athdhéanamh.\n"
 
-#: remake.c:847
-#, fuzzy, c-format
+#: src/remake.c:830
+#, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
-msgstr "  Ag déanamh neamhshuim ar ainm VPATH `%s'.\n"
+msgstr "  Ag déanamh neamhshuim ar ainm VPATH '%s'.\n"
 
-#: remake.c:856
-#, fuzzy, c-format
+#: src/remake.c:839
+#, c-format
 msgid "Recipe of '%s' is being run.\n"
-msgstr "Orduithe de `%s' á rith.\n"
+msgstr "Oideas le haghaidh '%s' á rith.\n"
 
-#: remake.c:863
-#, fuzzy, c-format
+#: src/remake.c:846
+#, c-format
 msgid "Failed to remake target file '%s'.\n"
-msgstr "Theip ar athdhéanamh an sprioc-chomhaid `%s'.\n"
+msgstr "Níorbh fhéidir an comhad sprice '%s' a athdhéanamh.\n"
 
-#: remake.c:866
-#, fuzzy, c-format
+#: src/remake.c:849
+#, c-format
 msgid "Successfully remade target file '%s'.\n"
-msgstr "D'éirigh le hathdhéanamh an sprioc-chomhaid `%s'.\n"
+msgstr "D'éirigh linn an comhad sprice '%s' a athdhéanamh.\n"
 
-#: remake.c:869
-#, fuzzy, c-format
+#: src/remake.c:852
+#, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
-msgstr "Tá gá leis an chomhad sprice `%s' a athdhéanamh leis an rogha -q.\n"
+msgstr "Ní mór comhad sprice '%s' a athdhéanamh le rogha -q.\n"
 
-#: remake.c:1064
-#, fuzzy, c-format
+#: src/remake.c:1047
+#, c-format
 msgid "Using default commands for '%s'.\n"
-msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh `%s'.\n"
+msgstr "Ag baint úsáid as orduithe réamhshocraithe le haghaidh '%s'.\n"
 
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Rabhadh: Tá an t-am mionathraithe den chomhad `%s' sa todhchaí"
-
-#: remake.c:1444
-#, fuzzy, c-format
+#: src/remake.c:1422
+#, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
-msgstr ""
-"Rabhadh: Tá an t-am mionathraithe den chomhad `%s' %.2g soicind sa todhchaí"
+msgstr "Rabhadh: Tá am athraithe an chomhaid '%s' %s soicind sa todhchaí"
 
-#: remake.c:1647
-#, fuzzy, c-format
+#: src/remake.c:1662
+#, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
-msgstr "Níl eilimint .LIBPATTERNS `%s' ina patrún"
+msgstr "Ní patrún é eilimint .LIBPATTERNS '%s'"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
-msgstr "Ní easpórtálfar Customs: %s\n"
+msgstr "Ní easpórtálfar Customs: %s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
 
-#: rule.c:496
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1825,455 +1839,481 @@ msgstr ""
 "\n"
 "# Rialacha Intuigthe"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
 msgstr ""
 "\n"
-"# Níl aon riail intuigthe."
+"# Níl aon riail intuigthe."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u riail intuigthe, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " teirminéal."
-
-#: rule.c:531
-#, fuzzy, c-format
+#: src/rule.c:557
+#, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
-msgstr "FABHT: num_pattern_rules mícheart!  %u != %u"
+msgstr "FABHT: num_pattern_rules mícheart!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "comhartha anaithnid"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Croch suas"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Idirbhriseadh"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Scoir"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Treoir Neamhcheadaithe"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Rianaigh/brisphointe"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Tobscortha"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Gaiste IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Gaiste EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
-msgstr "Eisceacht snámhphointe"
+msgstr "Eisceacht snámhphointe"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Maraithe"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
-msgstr "Busearráid"
+msgstr "Busearráid"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Fabht deighilte"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
-msgstr "Drochghlao ar an gcóras"
+msgstr "Drochghlao ar an gcóras"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
-msgstr "Píopa briste"
+msgstr "Píopa briste"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
-msgstr "Clog aláraim"
+msgstr "Clog aláraim"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Scortha"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Comhartha saincheaptha 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Comhartha saincheaptha 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
-msgstr "Scoir an mhacphróiseas"
+msgstr "Scoir an mhacphróiseas"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Cliseadh cumhachta"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Stoptha"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Stoptha (ionchur tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Stoptha (aschur tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Stoptha (comhartha)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
-msgstr "Teorainn ama LAP sáraithe"
+msgstr "Teorainn ama LAP sáraithe"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
-msgstr "Uasmhéid na gcomhad sáraithe"
+msgstr "Uasmhéid na gcomhad sáraithe"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
-msgstr "Am fíorúil caite"
+msgstr "Am fíorúil caite"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
-msgstr "Am próifíle caite"
+msgstr "Am próifíle caite"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
-msgstr "Athraíodh an fhuinneog"
+msgstr "Athraíodh an fhuinneog"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Leanta"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
-msgstr "Staid phráinneach A/I"
+msgstr "Staid phráinneach A/I"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
-msgstr "A/I indéanta"
+msgstr "A/I indéanta"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Acmhainn caillte"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Comhartha guaise"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Iarratas ar eolas"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
-msgstr "Níl comhphróiseálaí snámhphointe ar fáil"
+msgstr "Níl comhphróiseálaí snámhphointe ar fáil"
 
-#: strcache.c:274
-#, fuzzy, c-format
+#: src/strcache.c:274
+#, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
-msgstr "%s líon na maolán strcache: %d\n"
+msgstr ""
+"\n"
+"%s Gan maoláin strcache\n"
 
-#: strcache.c:304
-#, fuzzy, c-format
+#: src/strcache.c:304
+#, c-format
 msgid ""
 "\n"
 "%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
 "B\n"
-msgstr "%s strcache saor: iomlán = %d / uas = %d / íos = %d / meán = %d\n"
+msgstr ""
+"\n"
+"%s maolán strcache: %lu (%lu) / teaghráin = %lu / stóras = %lu B / meán = "
+"%lu B\n"
 
-#: strcache.c:308
-#, c-format
+#: src/strcache.c:308
+#, fuzzy, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
+"%s maolán reatha: méid = %hu B / úsáidte = %hu B / líon = %hu / meán = %hu "
+"B\n"
 
-#: strcache.c:319
-#, fuzzy, c-format
+#: src/strcache.c:319
+#, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
-msgstr "%s méid strcache: iomlán = %d / uas = %d / íos = %d / meán = %d\n"
+msgstr "%s eile úsáidte: iomlán = %lu B / líon = %lu / meán = %lu B\n"
 
-#: strcache.c:322
-#, fuzzy, c-format
+#: src/strcache.c:322
+#, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
-msgstr "%s strcache saor: iomlán = %d / uas = %d / íos = %d / meán = %d\n"
+msgstr ""
+"%s eile saor: iomlán = %lu B / uas = %lu B / íos = %lu B / meán = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
+"\n"
+"%s feidhmíocht strcache: cuardaigh = %lu / ráta aimsithe = %lu%%\n"
 
-#: strcache.c:328
-#, fuzzy
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
-"\n"
-"# comhaid hais-tábla stait:\n"
+"# staitisticí an hais-tábla:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
-msgstr "uathoibríoch"
+msgstr "uathoibríoch"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
-msgstr "réamhshocraithe"
+msgstr "réamhshocraithe"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "timpeallacht"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "timpeallacht le -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
-msgstr "líne na n-orduithe"
+msgstr "líne na n-orduithe"
 
-#: variable.c:1647
-#, fuzzy
+#: src/variable.c:1671
 msgid "'override' directive"
-msgstr "treoir `override'"
+msgstr "treoir 'override'"
 
-#: variable.c:1658
-#, fuzzy, c-format
+#: src/variable.c:1682
+#, c-format
 msgid " (from '%s', line %lu)"
-msgstr " (ó `%s', líne %lu)"
+msgstr " (ó '%s', líne %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
-msgstr "# athróg tacar hais-tábla stait:\n"
+msgstr "# athróg tacar hais-tábla stait:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
 msgstr ""
 "\n"
-"# Athróga\n"
+"# Athróga\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 "\n"
-"# Luachanna Athróige sainiúil don phatrún"
+"# Luachanna Athróige sainiúil don phatrún"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 "\n"
-"# Níl aon luach athróige atá sainiúil don phatrún."
+"# Níl aon luach athróige atá sainiúil don phatrún."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 "\n"
-"# %u luach athróige atá sainiúil don phatrún"
+"# %u luach athróige atá sainiúil don phatrún"
 
-#: variable.h:224
-#, fuzzy, c-format
+#: src/variable.h:229
+#, c-format
 msgid "warning: undefined variable '%.*s'"
-msgstr "rabhadh: athróg gan sainmhíniú: `%.*s'"
+msgstr "rabhadh: athróg gan sainmhíniú '%.*s'"
 
-#: vmsfunctions.c:91
-#, fuzzy, c-format
+#: src/vmsfunctions.c:91
+#, c-format
 msgid "sys$search() failed with %d\n"
-msgstr "Theip ar sys$cuardach le %d\n"
+msgstr "Theip ar sys$search() le stádas %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
-"-rabhadh, is féidir gur gá duit ionramháil CTRL-Y a athchumasú ó DCL.\n"
+"-rabhadh, is féidir gur gá duit ionramháil CTRL-Y a athchumasú ó DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "CD INSUITE %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
-msgstr ""
+msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
-#, fuzzy, c-format
+#: src/vmsjobs.c:1284
+#, c-format
 msgid "Append output to %s\n"
-msgstr "Atreoraíodh aschur go %s\n"
+msgstr "Iarcheangail aschur le %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
-msgstr ""
+msgstr "Iarcheangal %.*s agus glanadh\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
-msgstr "%s á rith ina áit\n"
+msgstr "%s á rith ina áit\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
 msgstr ""
 "\n"
-"# VPATH Conairí Cuardaigh\n"
+"# VPATH Conairí Cuardaigh\n"
 
-#: vpath.c:620
-#, fuzzy
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
-msgstr "# Níl aon chonair chuardaigh `vpath'."
+msgstr "# Níl aon chonair chuardaigh 'vpath' ann."
 
-#: vpath.c:622
-#, fuzzy, c-format
+#: src/vpath.c:622
+#, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 "\n"
-"# %u conair chuardaigh `vpath'.\n"
+"# %u conair chuardaigh 'vpath'.\n"
 
-#: vpath.c:625
-#, fuzzy
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 "\n"
-"# Níl aon chonair ghinearálta cuardaigh (athróg `VPATH')."
+"# Níl aon chonair ghinearálta chuardaigh (athróg 'VPATH') ann."
 
-#: vpath.c:631
-#, fuzzy
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 "\n"
-"# Conair ghinearálta cuardaigh (athróg `VPATH'):\n"
+"# Conair ghinearálta chuardaigh (athróg 'VPATH'):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
-msgstr ""
+msgstr "Sliotáin an jabfhreastalaí teoranta do %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
-msgstr ""
+msgstr "séamafór an jabfhreastalaí á chruthú: (Earráid %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
+"earráid inmheánach: níorbh fhéidir séamafór an jabfhreastalaí '%s' a "
+"oscailt: (Earráid %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
-msgstr ""
+msgstr "Cliant an jabfhreastalaí (séamafór %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
-msgstr ""
+msgstr "séamafór an jabfhreastalaí a fhuascailt: (Earráid %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
-msgstr ""
+msgstr "séamafóir nó feitheamh le macphróiseas: (Earráid %ld: %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Ordú gan aimsiú\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Ordú gan aimsiú\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Clár blaoisce gan aimsiú"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "cuirfear %s ar fionraí ar feadh tréimhse 30 soicind..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) críochnaithe. Ag leanúint ar aghaidh.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Earráid anaithnid %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Rabhadh: Sa todhchaí am athraithe an chomhaid '%s'"
+
+#~ msgid " terminal."
+#~ msgstr " teirminéal."
 
 #~ msgid "#  Invalid value in `update_status' member!"
-#~ msgstr "#  Luach neamhbhailí sa bhall `update_status'!"
+#~ msgstr "#  Luach neamhbhailí sa bhall `update_status'!"
 
 #~ msgid "*** [%s] Error 0x%x (ignored)"
-#~ msgstr "*** [%s] Earráid 0x%x (rinneadh neamhshuim air)"
+#~ msgstr "*** [%s] Earráid 0x%x (rinneadh neamhshuim air)"
 
 #~ msgid "*** [%s] Error 0x%x"
-#~ msgstr "*** [%s] Earráid 0x%x"
+#~ msgstr "*** [%s] Earráid 0x%x"
 
 #~ msgid "process_easy() failed failed to launch process (e=%ld)\n"
-#~ msgstr "theip ar process_easy(); níor tosaíodh próiseas (e=%ld)\n"
+#~ msgstr "theip ar process_easy(); níor tosaíodh próiseas (e=%ld)\n"
 
 #~ msgid "internal error: multiple --jobserver-fds options"
-#~ msgstr "earráid inmheánach: roghanna --jobserver-fds iomadúla"
+#~ msgstr "earráid inmheánach: roghanna --jobserver-fds iomadúla"
 
 #~ msgid "dup jobserver"
-#~ msgstr "jabfhreastalaí dup"
+#~ msgstr "jabfhreastalaí dup"
 
 #~ msgid ""
 #~ "%sThis is free software; see the source for copying conditions.\n"
 #~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
 #~ "%sPARTICULAR PURPOSE.\n"
 #~ msgstr ""
-#~ "%sIs saorbhogearra an ríomhchlár seo; féach ar an bhunchód le haghaidh\n"
-#~ "%scoinníollacha cóipeála.  Níl baránta ar bith ann; go fiú níl baránta "
+#~ "%sIs saorbhogearra an ríomhchlár seo; féach ar an bhunchód le haghaidh\n"
+#~ "%scoinníollacha cóipeála.  Níl baránta ar bith ann; go fiú níl baránta "
 #~ "ann\n"
-#~ "%sd'INDÍOLTACHT nó FEILIÚNACHT D'FHEIDHM AR LEITH.\n"
+#~ "%sd'INDÍOLTACHT nó FEILIÚNACHT D'FHEIDHM AR LEITH.\n"
 
 #~ msgid "virtual memory exhausted"
-#~ msgstr "cuimhne fhíorúil ídithe"
+#~ msgstr "cuimhne fhíorúil ídithe"
 
 #~ msgid "write error"
-#~ msgstr "earráid sa scríobh"
+#~ msgstr "earráid sa scríobh"
 
 #~ msgid "extraneous `endef'"
 #~ msgstr "`endef' breise"
@@ -2282,23 +2322,23 @@ msgstr ""
 #~ msgstr "treoir `override' folamh"
 
 #~ msgid "invalid `override' directive"
-#~ msgstr "treoir neamhbhailí `override'"
+#~ msgstr "treoir neamhbhailí `override'"
 
 #~ msgid ""
 #~ "\n"
 #~ "%s # of strings in strcache: %d\n"
 #~ msgstr ""
 #~ "\n"
-#~ "%s líon na dteaghrán i strcache: %d\n"
+#~ "%s líon na dteaghrán i strcache: %d\n"
 
 #~ msgid "Warning: Empty redirection\n"
-#~ msgstr "Rabhadh: Atreorú folamh\n"
+#~ msgstr "Rabhadh: Atreorú folamh\n"
 
 #~ msgid "internal error: `%s' command_state"
-#~ msgstr "earráid inmheánach: `%s' command_state"
+#~ msgstr "earráid inmheánach: `%s' command_state"
 
 #~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n"
-#~ msgstr "-rabhadh, fágfaidh CTRL-Y fo-phróisis gan ghlanadh.\n"
+#~ msgstr "-rabhadh, fágfaidh CTRL-Y fo-phróisis gan ghlanadh.\n"
 
 #~ msgid "BUILTIN [%s][%s]\n"
 #~ msgstr "INSUITE [%s][%s]\n"
@@ -2307,16 +2347,16 @@ msgstr ""
 #~ msgstr "RM INSUITE %s\n"
 
 #~ msgid "Unknown builtin command '%s'\n"
-#~ msgstr "Ordú anaithnid insuite '%s'\n"
+#~ msgstr "Ordú anaithnid insuite '%s'\n"
 
 #~ msgid "Error, empty command\n"
-#~ msgstr "Earráid, ordú folamh\n"
+#~ msgstr "Earráid, ordú folamh\n"
 
 #~ msgid "Redirected input from %s\n"
-#~ msgstr "Atreoraíodh ionchur ó %s\n"
+#~ msgstr "Atreoraíodh ionchur ó %s\n"
 
 #~ msgid "Redirected error to %s\n"
-#~ msgstr "Atreoraíodh earráidí go %s\n"
+#~ msgstr "Atreoraíodh earráidí go %s\n"
 
 #~ msgid "Error spawning, %d\n"
-#~ msgstr "Earráid le linn sceitheadh, %d\n"
+#~ msgstr "Earráid le linn sceitheadh, %d\n"
index 71567d0e07ed89d39cfe973f53be6786aaeeffbf..5f703eeb19b22fb5bfc7f40336576d2498405102 100644 (file)
Binary files a/po/gl.gmo and b/po/gl.gmo differ
index 04a9d58999f53d3e110b5dd911a207edca2e47c1..52b0ede12865410dede093bb7790513e0846a456 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
@@ -13,7 +13,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: make 3.82\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2012-11-12 16:40+0100\n"
 "Last-Translator: Leandro Regueiro <leandro.regueiro@gmail.com>\n"
 "Language-Team: Galician <proxecto@trasno.net>\n"
@@ -21,116 +21,118 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, fuzzy, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "tentouse usar unha característica non admitida: «%s»"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "a operación de tocar un membro do arquivo non está dispoñíbel en VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, fuzzy, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: O arquivo «%s» non existe"
 
-#: ar.c:150
+#: src/ar.c:150
 #, fuzzy, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: «%s» non é un arquivo válido"
 
-#: ar.c:157
+#: src/ar.c:157
 #, fuzzy, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: O membro «%s» non existe en «%s»"
 
-#: ar.c:164
+#: src/ar.c:164
 #, fuzzy, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: Código de retorno incorrecto de ar_member_touch en «%s»"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "a chamada a lbr$set_module() fallou ao extraer a información do módulo, "
 "estado = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "a chamada a lbr$ini_control() fallou con estado = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, fuzzy, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "non é posíbel abrir a biblioteca «%s» para buscar o membro «%s»"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, fuzzy, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Membro «%s»%s: %ld bytes en %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (o nome pode quedar truncado)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Data %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, modo = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Interrompido.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, fuzzy, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] O membro do arquivo «%s» pode non ser correcto; non eliminado"
 
-#: commands.c:631
+#: src/commands.c:632
 #, fuzzy, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** O membro do arquivo «%s» pode non ser correcto; non eliminado"
 
-#: commands.c:645
+#: src/commands.c:646
 #, fuzzy, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Eliminando o ficheiro «%s»"
 
-#: commands.c:647
+#: src/commands.c:648
 #, fuzzy, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Eliminando o ficheiro «%s»"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr ""
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (incorporadas):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, fuzzy, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (desde «%s», liña %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -138,222 +140,224 @@ msgstr ""
 "\n"
 "# Directorios\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: non foi posíbel facer a operación de stat.\n"
 
-#: dir.c:1085
+#: src/dir.c:1089
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr "# %s (clave %s, mtime %d): non foi posíbel abrir.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (dispositivo %d, inodo [%d,%d,%d]): non foi posíbel abrir.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (dispositivo %ld, inodo %ld): non foi posíbel abrir.\n"
 
-#: dir.c:1122
+#: src/dir.c:1126
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): "
 msgstr "# %s (clave %s, mtime %d): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (dispositivo %d, inodo [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (dispositivo %ld, inodo %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Non"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " ficheiros, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "non"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " imposíbeis"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " ata aquí."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " imposíbeis en %lu directorios.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, fuzzy, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "A variábel recursiva «%s» fai referencia a si mesma (ao final)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "referencia a variábel non rematada"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr ""
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
 
-#: file.c:287
+#: src/file.c:287
 #, fuzzy, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "pero agora considérase que «%s» é o mesmo ficheiro que «%s»."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 
-#: file.c:310
+#: src/file.c:310
 #, fuzzy, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "non é posíbel renomear «%s» con dous puntos a «%s» con catro puntos"
 
-#: file.c:316
+#: src/file.c:316
 #, fuzzy, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "non é posíbel renomear «%s» con catro puntos a «%s» con dous puntos"
 
-#: file.c:408
+#: src/file.c:408
 #, fuzzy, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Eliminando o ficheiro intermedio «%s»"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Retirando os ficheiros intermedios...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Hora actual"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Marca de tempo fóra de rango; substituíndo %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Non é un obxectivo:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Ficheiro precioso (prerrequisito de .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Obxectivo falso (prerrequisito de .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Obxectivo da liña de ordes."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Un ficheiro de make por defecto, MAKEFILES, ou -include/sinclude."
 
-#: file.c:975
+#: src/file.c:1029
 #, fuzzy
 msgid "#  Builtin rule"
 msgstr ""
 "\n"
 "# Non hai regras implícitas."
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Fíxose a busca de regras implícitas."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Non se fixo a busca de regras implícitas."
 
-#: file.c:980
+#: src/file.c:1034
 #, fuzzy, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Raíz do patrón implícito/estático: «%s»\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  O ficheiro é un prerrequisito intermedio."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Tamén se fai:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Nunca se comprobou o tempo de modificación."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  O ficheiro non existe."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  O ficheiro é moi antigo."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Última modificación: %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  O ficheiro foi actualizado."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  O ficheiro non foi actualizado."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr ""
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr ""
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Actualizado con éxito."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Ten que ser actualizado (-q está definido)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Produciuse un erro ao actualizar."
 
-#: file.c:1032
+#: src/file.c:1086
 #, fuzzy
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Valor non válido no membro «command_state»!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -361,7 +365,7 @@ msgstr ""
 "\n"
 "# Ficheiros"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -371,338 +375,345 @@ msgstr ""
 "# estatísticas da táboa hash de ficheiros:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 #, fuzzy
 msgid "non-numeric first argument to 'word' function"
 msgstr "primeiro argumento da función «word» non numérico"
 
-#: function.c:795
-#, fuzzy
+#: src/function.c:799
+#, fuzzy, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "o primeiro argumento da función «word» debe ser maior que 0"
 
-#: function.c:815
+#: src/function.c:819
 #, fuzzy
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "primeiro argumento da función «wordlist» non numérico"
 
-#: function.c:817
+#: src/function.c:821
 #, fuzzy
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "segundo argumento da función «wordlist» non numérico"
 
-#: function.c:1525
+#: src/function.c:1533
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe(): a chamada a DuplicateHandle(In) fallou (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr ""
 "windows32_open_pipe(): a chamada a DuplicateHandle(Err) fallou (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "A chamada a CreatePipe() fallou (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): a chamada a process_init_fd() fallou\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Limpando o ficheiro de lotes temporal %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, fuzzy, c-format
 msgid "open: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, fuzzy, c-format
 msgid "write: %s: %s"
 msgstr "erro de escritura: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, fuzzy, c-format
 msgid "close: %s: %s"
 msgstr "%s%s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, fuzzy, c-format
 msgid "read: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "%s: opción incorrecta -- %c\n"
 
-#: function.c:2390
+#: src/function.c:2405
 #, fuzzy, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "número de argumentos insuficiente (%d) na chamada á función «%s»"
 
-#: function.c:2402
+#: src/function.c:2417
 #, fuzzy, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "non implementada nesta plataforma: función «%s»"
 
-#: function.c:2466
+#: src/function.c:2483
 #, fuzzy, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "chamada á función «%s» non rematada: falta «%c»"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr ""
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr ""
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr ""
 
-#: function.c:2657
+#: src/function.c:2674
 #, fuzzy, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "número de argumentos insuficiente (%d) na chamada á función «%s»"
 
-#: function.c:2660
+#: src/function.c:2677
 #, fuzzy, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "número de argumentos insuficiente (%d) na chamada á función «%s»"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, fuzzy, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: a opción «%s» é ambigua\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, fuzzy, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: a opción «--%s» non permite ningún argumento\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, fuzzy, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: a opción «%c%s» non permite ningún argumento\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, fuzzy, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: a opción «%s» require un argumento\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, fuzzy, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: opción «--%s» non recoñecida\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, fuzzy, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: opción «%c%s» non recoñecida\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: opción inaceptábel -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: opción incorrecta -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: a opción require un argumento -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, fuzzy, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: a opción «-W %s» é ambigua\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, fuzzy, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: a opción «-W %s» non permite ningún argumento\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr ""
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "non se poden reservar %lu bytes para a táboa hash: memoria esgotada"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Carga=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Rehash=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Colisións=%ld/%ld=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, fuzzy, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Buscando unha regra implícita para «%s».\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, fuzzy, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Buscando unha regra implícita membro do arquivo para «%s».\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Evitando a recursión de regras implícitas.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr ""
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, fuzzy, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Probando a regra de patrón con raíz «%.*s».\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, fuzzy, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Rexeitando o prerrequisito imposíbel «%s».\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, fuzzy, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Rexeitando o prerrequisito implícito imposíbel «%s».\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, fuzzy, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Probando o prerrequisito «%s».\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, fuzzy, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Probando o prerrequisito implícito «%s».\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, fuzzy, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Atopouse a o prerrequisito «%s» como VPATH «%s»\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, fuzzy, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Buscando unha regra co ficheiro intermedio «%s».\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Non foi posíbel crear un ficheiro temporal\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (memoria envorcada)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ignorado)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 #, fuzzy
 msgid "<builtin>"
 msgstr " (incorporadas):"
 
-#: job.c:510
+#: src/job.c:573
 #, fuzzy, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "*** [%s] Erro %d"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Agardando por traballos non rematados...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Proceso fillo vivo %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (remoto)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Colleitando o proceso fillo perdedor %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Colleitando o proceso fillo gañador %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Colleitando o proceso fillo perdedor %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Limpando o ficheiro de lotes temporal %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, fuzzy, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Limpando o ficheiro de lotes temporal %s\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Retirando o proceso fillo %p PID %s%s da cadea.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Liberouse un elemento para o proceso fillo %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "produciuse un erro ao iniciar process_easy() o proceso (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -711,161 +722,151 @@ msgstr ""
 "\n"
 "Contáronse %d argumentos no inicio que fallou\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Poñendo o proceso fillo %p (%s) PID %s%s na cadea.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Obtívose un elemento para o proceso fillo %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, fuzzy, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "touch: O arquivo «%s» non existe"
 
-#: job.c:1841
+#: src/job.c:1905
 #, fuzzy, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%sNon hai unha regra para facer o obxectivo «%s», que precisa «%s»%s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "non é posíbel impoñer límites de carga neste sistema operativo"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "non é posíbel impoñer un límite de carga: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr ""
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr ""
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr ""
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 "make colleitou un proceso fillo de pid %s, aínda se agarda polo pid %s\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Orde non atopada"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Orde non atopada"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Programa para o intérprete de ordes non atopado"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr ""
 
-#: job.c:2584
+#: src/job.c:2862
 #, fuzzy, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "O valor de $SHELL cambiou (antes era «%s», agora é «%s»)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Creando un ficheiro por lotes temporal %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "%s (liña %d) Contexto do intérprete de ordes incorrecto (!unixy && !"
 "batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, fuzzy, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Non se admiten os traballos en paralelo (-j) nesta plataforma."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opcións:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ignorado por compatibilidade.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Facer todos os obxectivos incondicionalmente.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -873,19 +874,19 @@ msgstr ""
 "  -C DIRECTORIO, --directory=DIRECTORIO\n"
 "                              Cambiar ao DIRECTORIO antes de facer nada.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d                          Mostrar moita información de depuración.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=MODIFICADORES]     Mostrar varios tipos de información de "
 "depuración.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -894,12 +895,12 @@ msgstr ""
 "                              As variábei de ambiente substitúen aos "
 "makefiles.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -907,15 +908,15 @@ msgstr ""
 "  -f FICHEIRO, --file=FICHEIRO, --makefile=FICHEIRO\n"
 "                              Ler o FICHEIRO como makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Mostrar esta mensaxe e saír.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -924,7 +925,7 @@ msgstr ""
 "                              Buscar os makefiles incluídos\n"
 "                                 no DIRECTORIO.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -932,14 +933,14 @@ msgstr ""
 "  -j [N], --jobs[=N]          Permitir N traballos á vez; infinitos sen\n"
 "                                 un argumento.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Continuar cando no se poidan facer\n"
 "                                 algúns obxectivos.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -949,13 +950,13 @@ msgstr ""
 "                              Non iniciar varios traballos con carga\n"
 "                                superior a N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 
-#: main.c:374
+#: src/main.c:371
 #, fuzzy
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
@@ -965,7 +966,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Non executar ningún comando; só amosalos.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -975,39 +976,43 @@ msgstr ""
 "                              Tratar o FICHEIRO como moi antigo e non "
 "refacelo.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 "  -p, --print-data-base       Mostrar a base de datos interna de make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Desactivar as regras implícitas incorporadas.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Desactivar os valores das variábeis "
 "incorporadas.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr ""
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1015,28 +1020,28 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Desactiva -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Tocar os obxectivos no canto de os refacer.\n"
 
-#: main.c:398
+#: src/main.c:397
 #, fuzzy
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 "  -d                          Mostrar moita información de depuración.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Mostrar o número de versión de make e saír.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Mostrar o directorio actual.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1044,7 +1049,7 @@ msgstr ""
 "  --no-print-directory        Desactivar -w, incluso se se activou\n"
 "                                 implicitamente.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1053,7 +1058,7 @@ msgstr ""
 "new=FICHEIRO\n"
 "                              Tratar o FICHEIRO como infinitamente novo.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1061,27 +1066,28 @@ msgstr ""
 "  --warn-undefined-variables  Avisar cando se faga referencia a\n"
 "                                 unha variábel non definida.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "a cadea baleira non é válida como nome de ficheiro"
 
-#: main.c:766
+#: src/main.c:754
 #, fuzzy, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "especificación de nivel de depuración descoñecido «%s»"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 "%s: Atrapouse unha Interrupción/Excepción (código = 0x%lx, enderezo = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1096,138 +1102,146 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Violación de acceso: operación de escritura no enderezo 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Violación de acceso: operación de lectura no enderezo 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() definindo default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "A busca de rutas de find_and_set_shell() define default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s está suspendido durante 30 segundos..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "rematouse sleep(30). Continuando.\n"
-
-#: main.c:1627
-#, fuzzy
+#: src/main.c:1609
+#, fuzzy, c-format
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "aviso: o servidor de traballos non está dispoñíbel: usando -j1. Engada «+» á "
 "regra do make pai."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
 "aviso: -jN forzado no submake: desactivando o modo de servidor de traballos."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "O ficheiro de make da entrada estándar especificouse dúas veces."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (ficheiro temporal)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (ficheiro temporal)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"aviso: -jN forzado no submake: desactivando o modo de servidor de traballos."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Non se admiten os traballos en paralelo (-j) nesta plataforma."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Reiniciando para entrar no modo de traballo único (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Actualizando os ficheiros de make....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, fuzzy, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "O ficheiro de make «%s» podería causar un bucle; non se refai.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, fuzzy, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Produciuse un erro ao refacer o ficheiro de make «%s»."
 
-#: main.c:2299
+#: src/main.c:2323
 #, fuzzy, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Non se atopou o ficheiro de make incluído «%s»."
 
-#: main.c:2304
+#: src/main.c:2328
 #, fuzzy, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Non se atopou o ficheiro de make «%s»"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Non foi posíbel volver ao directorio orixinal."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Re-executando[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (ficheiro temporal)"
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ""
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Non se especificaron obxectivos e non se atopou un ficheiro de make"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Non hai obxectivos"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Non se especificaron obxectivos e non se atopou un ficheiro de make"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Actualizando os obxectivos meta....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "aviso: Detectáronse inconsistencias de reloxo. A operación pode quedar "
 "incompleta."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Uso: %s [opcións] [obxectivo] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1236,7 +1250,7 @@ msgstr ""
 "\n"
 "Este programa compilou para %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1245,34 +1259,34 @@ msgstr ""
 "\n"
 "Este programa compilou para %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Envíe informes de fallo no programa a <bug-make@gnu.org>.\n"
 "Envíe informes de fallo na tradución a <proxecto@trasno.net>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, fuzzy, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "a opción «%s%s» require un argumento de cadea non baleira"
 
-#: main.c:2934
+#: src/main.c:2965
 #, fuzzy, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "a opción «-%c» require un argumento integral positivo"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sCompilado para %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sCompilado para %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1285,7 +1299,7 @@ msgstr ""
 "%sIsto é software libre: pode modificalo e redistribuílo.\n"
 "%sNon hai NINGUNHA GARANTÍA, ata onde o permita a lei.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1294,7 +1308,7 @@ msgstr ""
 "\n"
 "# Base de datos de Make, imprimida en %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1303,357 +1317,384 @@ msgstr ""
 "\n"
 "# Base de datos de Make rematada en %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Erro %d descoñecido"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: usuario %lu (real %lu), grupo %lu (real %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Acceso inicializado"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Acceso de usuario"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Acceso de make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Acceso de fillo"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Entrando nun directorio descoñecido\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Saíndo dun directorio descoñecido\n"
 
-#: output.c:109
+#: src/output.c:102
 #, fuzzy, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Entrando no directorio «%s»\n"
 
-#: output.c:111
+#: src/output.c:104
 #, fuzzy, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Saíndo do directorio «%s»\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Entrando nun directorio descoñecido\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Saíndo dun directorio descoñecido\n"
 
-#: output.c:120
+#: src/output.c:113
 #, fuzzy, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Entrando no directorio «%s»\n"
 
-#: output.c:122
+#: src/output.c:115
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Saíndo do directorio «%s»\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, fuzzy, c-format
 msgid "write error: stdout"
 msgstr "erro de escritura: %s"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ". Detido.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "creando a canalización de traballos"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 #, fuzzy
 msgid "duping jobs pipe"
 msgstr "creando a canalización de traballos"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "inicializar a canalización do servidor de traballos"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, fuzzy, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "erro interno: cadea --jobserver-fds non válida «%s»"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 #, fuzzy
 msgid "jobserver pipeline"
 msgstr "inicializar a canalización do servidor de traballos"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr ""
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 #, fuzzy
 msgid "pselect jobs pipe"
 msgstr "lectura da canalización de traballos"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "lectura da canalización de traballos"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Lendo os ficheiros de make...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, fuzzy, c-format
 msgid "Reading makefile '%s'"
 msgstr "Lendo o ficheiro de make «%s»"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (non hai unha meta por defecto)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (ruta de busca)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (non importa)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (non hai expansión de ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr ""
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr ""
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "sintaxe non válida no condicional"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr ""
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr ""
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr " (quixo dicir TAB no canto de 8 espazos?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, fuzzy, c-format
 msgid "missing separator"
 msgstr "falta un separador%s"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "falta un patrón obxectivo"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "patróns de obxectivo múltiples"
 
-#: read.c:1268
+#: src/read.c:1289
 #, fuzzy, c-format
 msgid "target pattern contains no '%%'"
 msgstr "o patrón obxectivo non contén «%%»"
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, fuzzy, c-format
 msgid "missing 'endif'"
 msgstr "falta «endif»"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "nome de variábel baleiro"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, fuzzy, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "texto superfluo trala directiva «define»"
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, fuzzy, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "falta «endef», «define» sen rematar"
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, fuzzy, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "Texto superfluo trala directiva «endef»"
 
-#: read.c:1588
+#: src/read.c:1603
 #, fuzzy, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "Texto superfluo trala directiva «%s»"
 
-#: read.c:1589
+#: src/read.c:1604
 #, fuzzy, c-format
 msgid "extraneous '%s'"
 msgstr "«%s» superfluo"
 
-#: read.c:1617
-#, fuzzy
+#: src/read.c:1632
+#, fuzzy, c-format
 msgid "only one 'else' per conditional"
 msgstr "só un «else» por condicional"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Definición dunha variábel por obxectivo mal formada"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr ""
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "regras de patrón implícitas e estáticas mesturadas"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "regras implícitas e normais mesturadas"
 
-#: read.c:2085
+#: src/read.c:2107
 #, fuzzy, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "o obxectivo «%s» non coincide co patrón do obxectivo"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, fuzzy, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "o ficheiro obxectivo «%s» ten entradas : e ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, fuzzy, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "o obxectivo «%s» aparece máis dunha vez na mesma regra."
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr ""
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr ""
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, fuzzy, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "regras implícitas e normais mesturadas"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr ""
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "aviso: viuse un carácter NUL; ignórase o resto da liña"
 
-#: remake.c:226
+#: src/remake.c:226
 #, fuzzy, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Non hai nada que facer para «%s»"
 
-#: remake.c:227
+#: src/remake.c:227
 #, fuzzy, c-format
 msgid "'%s' is up to date."
 msgstr "«%s» está actualizado."
 
-#: remake.c:323
+#: src/remake.c:323
 #, fuzzy, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Podando o ficheiro «%s».\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sNon hai unha regra para facer o obxectivo «%s», que precisa «%s»%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sNon hai unha regra para facer o obxectivo «%s»%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, fuzzy, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Considerando o ficheiro obxectivo «%s».\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, fuzzy, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr ""
 "Hai pouco probouse a actualizar o ficheiro «%s» e non foi posíbel facelo.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, fuzzy, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "O ficheiro «%s» xa fora considerado.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, fuzzy, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Aínda se está actualizando o ficheiro «%s».\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, fuzzy, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Rematouse de actualizar o ficheiro «%s».\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, fuzzy, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "O ficheiro «%s» non existe.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, fuzzy, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1661,147 +1702,147 @@ msgstr ""
 "*** Aviso: o ficheiro «%s» de .LOW_RESOLUTION_TIME ten unha marca de tempo "
 "de alta resolución"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, fuzzy, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Atopouse unha regra implícita de «%s».\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, fuzzy, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Non se atopou unha regra implícita para «%s».\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, fuzzy, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Usando as ordes por defecto para «%s».\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "A dependencia circular %s <- %s foi eliminada."
 
-#: remake.c:691
+#: src/remake.c:674
 #, fuzzy, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Rematáronse os prerrequisitos do ficheiro obxectivo «%s».\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, fuzzy, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Están a se facer os prerrequisitos de «%s».\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, fuzzy, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Abandonando no ficheiro obxectivo «%s».\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, fuzzy, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Non se refai o obxectivo «%s» a causa dos erros."
 
-#: remake.c:768
+#: src/remake.c:751
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "O prerrequisito «%s» é só-orde para o obxectivo «%s».\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, fuzzy, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "O prerrequisito «%s» do obxectivo «%s» non existe.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "O prerrequisito «%s» é máis novo que o obxectivo «%s».\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "O prerrequisito «%s» é máis vello que o obxectivo «%s».\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, fuzzy, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "O obxectivo «%s» ten catro puntos e non ten prerrequisitos.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 
-#: remake.c:811
+#: src/remake.c:794
 #, fuzzy, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Facendo «%s» debido á marca de sempre-facer.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, fuzzy, c-format
 msgid "No need to remake target '%s'"
 msgstr "Non é preciso refacer o obxectivo «%s»"
 
-#: remake.c:821
+#: src/remake.c:804
 #, fuzzy, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; usando o nome de VPATH «%s»"
 
-#: remake.c:841
+#: src/remake.c:824
 #, fuzzy, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Debe refacerse o obxectivo «%s».\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, fuzzy, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Ignorando o nome VPATH «%s».\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr ""
 
-#: remake.c:863
+#: src/remake.c:846
 #, fuzzy, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Produciuse un erro ao refacer o ficheiro obxectivo «%s».\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, fuzzy, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "O ficheiro obxectivo «%s» foi feito de novo con éxito.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, fuzzy, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "O ficheiro obxectivo «%s» precisa refacerse con -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, fuzzy, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Usando as ordes por defecto para «%s».\n"
 
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Aviso: O ficheiro «%s» ten un tempo de modificación no futuro"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, fuzzy, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Aviso: O ficheiro «%s» ten un tempo de modificación %s seg no futuro"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, fuzzy, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "O elemento de .LIBPATTERNS «%s» non é un patrón"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "A Aduana non exporta: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1809,7 +1850,7 @@ msgstr ""
 "\n"
 "# Regras implícitas"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1817,188 +1858,184 @@ msgstr ""
 "\n"
 "# Non hai regras implícitas."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u regras implícitas, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "FALLO: num_pattern_rules é incorrecto! %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "sinal descoñecido"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Colgar"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Interrompido"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Saír"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Instrución inaceptábel"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Trampa de trazado/punto de detención"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Abortado"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Trampa de IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Trampa EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Excepción de coma flotante"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Matado"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Erro do bus"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Fallo de segmento"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Chamada ao sistema incorrecta"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Canalización rota"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Temporizador"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Terminado"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Sinal definido polo usuario 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Sinal definido polo usuario 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "O proceso fillo saíu"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Fallo de subministración eléctrica"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Detido"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Detido (entrada de consola)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Detido (saída de consola)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Detido (sinal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Excedeuse o límite de tempo de CPU"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Excedeuse o límite de tamaño do ficheiro"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Temporizador virtual esgotado"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr ""
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "A xanela cambiou"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Continuado"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Condición de E/S urxente"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "A E/S é posíbel"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Recurso perdido"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Sinal de perigo"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Petición de información"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "O coprocesador de coma flotante non está dispoñíbel"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2006,31 +2043,31 @@ msgid ""
 "B\n"
 msgstr ""
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 #, fuzzy
 msgid ""
 "# hash-table stats:\n"
@@ -2040,45 +2077,45 @@ msgstr ""
 "# estatísticas da táboa hash de ficheiros:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automático"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "por defecto"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "ambiente"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "ficheiro de make"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "ambiente baixo -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "liña de ordes"
 
-#: variable.c:1647
+#: src/variable.c:1671
 #, fuzzy
 msgid "'override' directive"
 msgstr "directiva «override»"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, fuzzy, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (desde «%s», liña %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# estatísticas da táboa hash de conxunto de variábeis:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2086,7 +2123,7 @@ msgstr ""
 "\n"
 "# Variábeis\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2094,7 +2131,7 @@ msgstr ""
 "\n"
 "# Valores de variábeis específicas do patrón"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2102,7 +2139,7 @@ msgstr ""
 "\n"
 "# Non hai valores específicos do patrón."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2111,47 +2148,47 @@ msgstr ""
 "\n"
 "# %u valores de variábeis específicos do patrón"
 
-#: variable.h:224
+#: src/variable.h:229
 #, fuzzy, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "aviso: variábel non definida «%.*s»"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "a chamada a sys$search() fallou con %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-aviso, pode que teña que reactivar o manexo de CTRL-Y desde o DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BUILTIN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr ""
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Executando %s no canto\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2159,12 +2196,12 @@ msgstr ""
 "\n"
 "# Rutas de busca VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 #, fuzzy
 msgid "# No 'vpath' search paths."
 msgstr "# Non hai rutas de busca «vpath»"
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -2173,7 +2210,7 @@ msgstr ""
 "\n"
 "# %u rutas de busca «vpath».\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 #, fuzzy
 msgid ""
 "\n"
@@ -2182,7 +2219,7 @@ msgstr ""
 "\n"
 "# Non hai unha ruta de busca xeral (variábel «VPATH»)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 #, fuzzy
 msgid ""
 "\n"
@@ -2193,33 +2230,33 @@ msgstr ""
 "# Ruta de busca xeral (variábel «VPATH»):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
@@ -2236,18 +2273,39 @@ msgstr ""
 #~ msgid "[%s] Error %d (ignored)"
 #~ msgstr "[%s] Erro %d (ignorado)"
 
+#~ msgid "%s: Command not found"
+#~ msgstr "%s: Orde non atopada"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Programa para o intérprete de ordes non atopado"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s está suspendido durante 30 segundos..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "rematouse sleep(30). Continuando.\n"
+
 #~ msgid "internal error: multiple --jobserver-fds options"
 #~ msgstr "erro interno: opcións --jobserver-fds múltiples"
 
 #~ msgid "dup jobserver"
 #~ msgstr "dup jobserver"
 
+#~ msgid "Unknown error %d"
+#~ msgstr "Erro %d descoñecido"
+
 #~ msgid "virtual memory exhausted"
 #~ msgstr "memoria virtual esgotada"
 
 #~ msgid "write error"
 #~ msgstr "erro de escritura"
 
+#~ msgid "Warning: File `%s' has modification time in the future"
+#~ msgstr "Aviso: O ficheiro «%s» ten un tempo de modificación no futuro"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
+
 #~ msgid ""
 #~ "\n"
 #~ "# strcache hash-table stats:\n"
index 125c7a4ce46a70030d8e74bc725ad81f01ebaa86..2ec63ad57db0fa58fed19389cea92356a6a3cb61 100644 (file)
Binary files a/po/he.gmo and b/po/he.gmo differ
index 6dcc6a0b8b73d2b56f1cc34316d41b3af6cd0363..bee859a124faba8072877f5e83bfd22bfeb9a5ca 100644 (file)
--- a/po/he.po
+++ b/po/he.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: make 3.79.1\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2002-03-30 21:33+0300\n"
 "Last-Translator: Eli Zaretskii <eliz@gnu.org>\n"
 "Language-Team: Hebrew <eliz@gnu.org>\n"
@@ -14,96 +14,98 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, fuzzy, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "úëîúð äððéàù `%s' äðåëúá ùåîéù ïåéñð"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "VMS úëøòîá ïåéëøàá øáà ìù äòù/êéøàú éåðéùá äëéîú ïéà"
 
-#: ar.c:147
+#: src/ar.c:147
 #, fuzzy, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "íéé÷ åðéà `%s' ïåéëøà õáå÷ :touch"
 
-#: ar.c:150
+#: src/ar.c:150
 #, fuzzy, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "ïé÷ú ïåéëøà õáå÷ åðéà `%s' :touch"
 
-#: ar.c:157
+#: src/ar.c:157
 #, fuzzy, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "`%s' øáà ìéëî åðéà `%s' ïåéëøà :touch"
 
-#: ar.c:164
+#: src/ar.c:164
 #, fuzzy, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "`%s' øåáò ïé÷ú-àì ãå÷ äøéæçä ar_member_touch :touch"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, fuzzy, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "%d ñåèèñ ,lib$rset_module é\"ò ìåãåî ìò òãéî úôéìùá ïåìùë"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, fuzzy, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "%d ñåèèñ íò ìùëð lbr$ini_control"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, fuzzy, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "(`%s' äéøôñ) `%s' øáà øåáò äéøôñ úçéúôá äì÷ú"
 
 #  These are not translated, since they belong to a test program.
-#: arscan.c:965
+#: src/arscan.c:944
 #, fuzzy, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Member `%s'%s: %ld bytes at %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (name might be truncated)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Date %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Break. ***\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, fuzzy, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] ÷çîéé àì ;ïé÷ú-éúìá úåéäì ìåìò `%s' ïåéëøà øáà ***"
 
-#: commands.c:631
+#: src/commands.c:632
 #, fuzzy, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** ÷çîéé àì ;ïé÷ú-éúìá úåéäì ìåìò `%s' ïåéëøà øáà ***"
 
-#: commands.c:645
+#: src/commands.c:646
 #, fuzzy, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] `%s' õáå÷ ÷çåî ***"
 
-#: commands.c:647
+#: src/commands.c:648
 #, fuzzy, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** `%s' õáå÷ ÷çåî ***"
@@ -111,21 +113,21 @@ msgstr "*** `%s' 
 #  I decided to retain the English text of what Make prints under -p,
 #  since it is notoriously hard to get right in right-to-left languages,
 #  and because its primary use is for programmers who write Makefiles.
-#: commands.c:683
+#: src/commands.c:684
 #, fuzzy
 msgid "#  recipe to execute"
 msgstr "#  commands to execute"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (built-in):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, fuzzy, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (from `%s', line %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -133,228 +135,229 @@ msgstr ""
 "\n"
 "# Directories\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: could not be stat'd.\n"
 
-#: dir.c:1085
+#: src/dir.c:1089
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr "# %s (key %s, mtime %d): could not be opened.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (device %ld, inode %ld): could not be opened.\n"
 
-#: dir.c:1122
+#: src/dir.c:1126
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): "
 msgstr "# %s (key %s, mtime %d): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (device %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (device %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "No"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " files, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "no"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " impossibilities"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " so far."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, fuzzy, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " impossibilities in %u directories.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, fuzzy, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "(øáã ìù åôåñá) åîöòì äééðôäì íøåâ `%s' éáéñøå÷ø äðúùî"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "äëìäë úîééúñî äðéà äðúùîì äééðôä"
 
-#: file.c:278
+#: src/file.c:278
 #, fuzzy, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr ",`%s' õáå÷ øåáò úåãå÷ô åðúéð %s õáå÷á %lu äøåùá"
 
-#: file.c:283
+#: src/file.c:283
 #, fuzzy, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ",íéùøåôî-éúìá íéììëá ùåôéç é\"ò åàöîð `%s' õáå÷ øåáò úåãå÷ô"
 
-#: file.c:287
+#: src/file.c:287
 #, fuzzy, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr ".õáå÷ åúåàì äúò íéáùçð `%s' ïäå `%s' ïä íìåàå"
 
-#: file.c:290
+#: src/file.c:290
 #, fuzzy, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ".`%s' øåáò åìà ìò úåôéãò `%s' øåáò úåãå÷ô"
 
-#: file.c:310
+#: src/file.c:310
 #, fuzzy, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "`%s' íéããåá íééúåãå÷ðî `%s' íéìåôë íééúåãå÷ðì êåôäì ïúéð àì"
 
-#: file.c:316
+#: src/file.c:316
 #, fuzzy, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "`%s' íéìåôë íééúåãå÷ðî `%s' íéããåá íééúåãå÷ðì êåôäì ïúéð àì"
 
-#: file.c:408
+#: src/file.c:408
 #, fuzzy, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** `%s' íééðéá õáå÷ ÷çåî ***"
 
-#: file.c:412
-#, fuzzy
+#: src/file.c:412
+#, fuzzy, c-format
 msgid "Removing intermediate files...\n"
 msgstr "*** `%s' íééðéá õáå÷ ÷çåî ***"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "úëøòî ïåòù"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "øúåîä íåçúì õåçî äðéäù ,%s ìù ïîæä úîéúç úà %s-á óéìçî"
 
 #  See the comment above about translations of text printed under -p.
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Not a target:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Precious file (prerequisite of .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Phony target (prerequisite of .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 #, fuzzy
 msgid "#  Command line target."
 msgstr "#  Command-line target."
 
-#: file.c:973
+#: src/file.c:1027
 #, fuzzy
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  A default or MAKEFILES makefile."
 
-#: file.c:975
+#: src/file.c:1029
 #, fuzzy
 msgid "#  Builtin rule"
 msgstr ""
 "\n"
 "# No implicit rules."
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Implicit rule search has been done."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Implicit rule search has not been done."
 
-#: file.c:980
+#: src/file.c:1034
 #, fuzzy, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Implicit/static pattern stem: `%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  File is an intermediate prerequisite."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Also makes:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Modification time never checked."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  File does not exist."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  File is very old."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Last modified %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  File has been updated."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  File has not been updated."
 
-#: file.c:1008
+#: src/file.c:1062
 #, fuzzy
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Commands currently running (THIS IS A BUG)."
 
-#: file.c:1011
+#: src/file.c:1065
 #, fuzzy
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Dependencies commands running (THIS IS A BUG)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Successfully updated."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Needs to be updated (-q is set)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Failed to be updated."
 
-#: file.c:1032
+#: src/file.c:1086
 #, fuzzy
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Invalid value in `command_state' member!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -362,347 +365,353 @@ msgstr ""
 "\n"
 "# Files"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
 "# "
 msgstr ""
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 #, fuzzy
 msgid "non-numeric first argument to 'word' function"
 msgstr "øôñî åðéà `word' úééö÷ðåôì ïåùàø èðîåâøà"
 
-#: function.c:795
-#, fuzzy
+#: src/function.c:799
+#, fuzzy, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "éáåéç úåéäì áééç `word' úééö÷ðåôì ïåùàø èðîåâøà"
 
-#: function.c:815
+#: src/function.c:819
 #, fuzzy
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "øôñî åðéà `wordlist' úééö÷ðåôì ïåùàø èðîåâøà"
 
-#: function.c:817
+#: src/function.c:821
 #, fuzzy
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "øôñî åðéà `wordlist' úééö÷ðåôì éðù èðîåâøà"
 
-#: function.c:1525
+#: src/function.c:1533
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "create_child_process: DuplicateHandle(In) failed (e=%d)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "create_child_process: DuplicateHandle(Err) failed (e=%d)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, fuzzy, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() failed (e=%d)\n"
 
-#: function.c:1564
-#, fuzzy
+#: src/function.c:1572
+#, fuzzy, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe (): process_init_fd() failed\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr ""
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr ""
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr ""
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr ""
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "%s úéðëú øåáò éåâù ïééôàî -- %c\n"
 
-#: function.c:2390
+#: src/function.c:2405
 #, fuzzy, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô"
 
-#: function.c:2402
+#: src/function.c:2417
 #, fuzzy, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "åæ úëøòîá úùîåîî äðéà `%s' äéö÷ðåô"
 
-#: function.c:2466
+#: src/function.c:2483
 #, fuzzy, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "`%s' äéö÷ðåôì äàéø÷á `%c' øñç"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr ""
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr ""
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr ""
 
-#: function.c:2657
+#: src/function.c:2674
 #, fuzzy, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô"
 
-#: function.c:2660
+#: src/function.c:2677
 #, fuzzy, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "÷ôñî åðéàù (%d) íéèðîåâøà øôñî íò äàø÷ð `%s' äéö÷ðåô"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, fuzzy, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `%s' ïééôàî\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, fuzzy, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `--%s' ïééôàî\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, fuzzy, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `%c%s' ïééôàî\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, fuzzy, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s úéðëú øåáò èðîåâøà áééçî `%s' ïééôàî\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, fuzzy, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s úéðëú øåáò `--%s' ääåæî-éúìá ïééôàî\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, fuzzy, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s úéðëú øåáò `%c%s' ääåæî-éúìá ïééôàî\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: é÷åç-éúìá ïééôàî -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s úéðëú øåáò éåâù ïééôàî -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: èðîåâøà áééçî ïééôàî -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, fuzzy, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s úéðëú øåáò éòîùî-ãç åðéà `-W %s' ïééôàî\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, fuzzy, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s úéðëú øåáò èðîåâøà ìá÷î åðéà `-W %s' ïééôàî\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr ""
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr ""
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
+msgid "Rehash=%u, "
 msgstr ""
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr ""
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, fuzzy, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr ".`%s' øåáò ùøåôî-éúìá ììë ùôçî\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, fuzzy, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr ".`%s' øåáò ïåéëøà éøáàì ùøåôî-éúìá ììë ùôçî\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr ".úùøåôî-éúìá äéñøå÷øî òðîð\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr ""
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, fuzzy, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr ".`%.*s' ùøåù íò úéðáú ììë äñðî\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, fuzzy, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr ".úéøùôà-éúìá äðéäù íåùî `%s' íã÷ úùéøã äçåã\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, fuzzy, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr ".úéøùôà-éúìá äðéäù íåùî `%s' úùøåôî-éúìá íã÷ úùéøã äçåã\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, fuzzy, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr ".`%s' íã÷ úùéøã ììë äñðî\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, fuzzy, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr ".`%s' úùøåôî-éúìá íã÷ úùéøã äñðî\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, fuzzy, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "`%s' íã÷ úùéøãë VPATH `%s' éúàöî\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, fuzzy, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr ".`%s' éðîæ õáå÷ íò ììë ùôçî\n"
 
-#: job.c:363
+#: src/job.c:370
 #, fuzzy
 msgid "Cannot create a temporary file\n"
 msgstr "fwrite (temporary file)"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (core õáå÷á íùøð ïåøëæä ïëåú)"
 
-#: job.c:490
+#: src/job.c:553
 #, fuzzy
 msgid " (ignored)"
 msgstr "[%s] %d äì÷úî éúîìòúä"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 #, fuzzy
 msgid "<builtin>"
 msgstr " (built-in):"
 
-#: job.c:510
+#: src/job.c:573
 #, fuzzy, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "*** [%s] %d äì÷ú"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** ...åîééúñð íøèù úåãåáòì ïéúîî"
 
-#: job.c:629
+#: src/job.c:704
 #, fuzzy, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "äöø 0x%08lx (%s) PID=%ld %s úá-úéðëú\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr "(ú÷çåøî)"
 
-#: job.c:831
-#, fuzzy, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "äìùëðù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n"
-
-#: job.c:832
+#: src/job.c:898
 #, fuzzy, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "äçéìöäù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n"
 
-#: job.c:839
+#: src/job.c:899
+#, fuzzy, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "äìùëðù 0x%08lx PID=%ld %s úá-úéðëú óñåà\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n"
 
-#: job.c:845
+#: src/job.c:956
 #, fuzzy, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "`%s' éðîæ batch õáå÷ ÷ìñî\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, fuzzy, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr ".úåãåáò úøùøùî 0x%08lx PID=%ld %s úá-úéðëú ÷éçøî\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, fuzzy, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr ".øøçåù 0x%08lx (%s) úá-úéðëú øåáò ïåîéñàä\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, fuzzy, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "(e=%d) úéðëú-úú øåâéùá ìùëð process_easy()\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -711,345 +720,340 @@ msgstr ""
 "\n"
 "ìùëðù øåâéùá åðîð íéèðîåâøà %d\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, fuzzy, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr ".úåãåáò úøùøùì 0x%08lx (%s) PID=%ld %s úá-úéðëú óøöî\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, fuzzy, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr ".0x%08lx (%s) úá-úéðëú øåáò ïåîéñà ìá÷úä\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, fuzzy, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "íéé÷ åðéà `%s' ïåéëøà õáå÷ :touch"
 
-#: job.c:1841
+#: src/job.c:1905
 #, fuzzy, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%säúééðáì íéììë ïéà êà ,`%s' úùøåã `%s'%s äøèî"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "åæ úëøòîá ñîåò úåìáâî úåôëì ïúéð àì"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "cannot enforce load limit: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr ""
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr ""
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr ""
 
-#: job.c:2234
+#: src/job.c:2520
 #, fuzzy, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "äôñàð pid %d úá-úéðëú ,pid %d-ì äëçî ïééãò\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "äàöîð àì åæ äãå÷ô :%s"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "äàöîð àì åæ äãå÷ô :%s"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "äàöîð àì shell úãå÷ô :%s"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr ""
 
-#: job.c:2584
+#: src/job.c:2862
 #, fuzzy, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "(`%s' äéä íãå÷ ,`%s' åéùëò) äðúùä $SHELL ìù åëøò"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "`%s' éðîæ batch õáå÷ øöåé\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "(!unixy && !batch_mode_shell) shell-mode úòéá÷á äì÷ú :%s õáå÷ ìù %d äøåù\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, fuzzy, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr ".åæ úëøòîá êîúð åðéà (-j) éìéá÷î òåöéá"
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "                                             :íéðééôàî\n"
 
-#: main.c:339
+#: src/main.c:336
 #, fuzzy
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "úåîéàú ïòîì èîùåî"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 
-#: main.c:346
+#: src/main.c:343
 #, fuzzy
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "úåàéâù éåôéð úáåèì òãéî ìù òôù âöä"
 
-#: main.c:348
+#: src/main.c:345
 #, fuzzy
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr "úåàéâù éåôéð úáåèì òãéî ìù íéðåù íéâåñ âöä"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 
-#: main.c:358
+#: src/main.c:355
 #, fuzzy
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "úéðëúäî àöå äæ äøæò êñî âöä"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
 
-#: main.c:365
+#: src/main.c:362
 #, fuzzy
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr "äìáâî ïéà èðîåâøà àìì ;úéðîæ-åá úåãåáò N-î øúåé àì"
 
-#: main.c:367
+#: src/main.c:364
 #, fuzzy
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr "äéðáì úåðúéð ïðéà úåøèîäî äîë íà åìéôà êùîä"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 #, fuzzy
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "Make ìù éîéðô íéðåúð ñéñá âöä"
 
-#: main.c:385
+#: src/main.c:382
 #, fuzzy
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr "úðëãåòî äøèî íàá øîåà äàéöé ãå÷ ;úåãå÷ô õéøú ìà"
 
-#: main.c:387
+#: src/main.c:384
 #, fuzzy
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "íéùøåôî-éúìá íéðáåî íéììë ìøèð"
 
-#: main.c:389
+#: src/main.c:386
 #, fuzzy
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "íéðúùî ìù úåðáåî úåøãâä ìøèð"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr ""
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 
-#: main.c:396
+#: src/main.c:395
 #, fuzzy
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr "ïúåðáì íå÷îá úåøèî ìù ïîæ úîéúç ïëãò"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 
-#: main.c:400
+#: src/main.c:399
 #, fuzzy
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "úéðëúäî àöå Make ìù àñøéâ øôñî âöä"
 
-#: main.c:402
+#: src/main.c:401
 #, fuzzy
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "úéçëåð äé÷éú íù âöä"
 
-#: main.c:404
+#: src/main.c:403
 #, fuzzy
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr "ùøåôîá ïéåö àåä íà åìéôà -w ìèá"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 
-#: main.c:409
+#: src/main.c:408
 #, fuzzy
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr "øãâåä àìù äðúùîì äééðôä äø÷îá äøäæà âöä"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "õáå÷ íùë úìá÷úî äðéà ä÷éø úæåøçî"
 
-#: main.c:766
+#: src/main.c:754
 #, fuzzy, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "úåàéâù éåôéðì òãéî ìù `%s' øëåî-éúìá ïééôàî"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, fuzzy, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s úéðëúá (code = 0x%x, addr = 0x%x) äâéøç åà ä÷éñô\n"
 
-#: main.c:868
+#: src/main.c:856
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -1064,177 +1068,182 @@ msgstr ""
 "ExceptionFlags = %x\n"
 "ExceptionAddress = %x\n"
 
-#: main.c:876
+#: src/main.c:864
 #, fuzzy, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "%x úáåúëì äáéúë :ïåøëæì äùéâ úì÷ú\n"
 
-#: main.c:877
+#: src/main.c:865
 #, fuzzy, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "%x úáåúëî äàéø÷ :ïåøëæì äùéâ úì÷ú\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, fuzzy, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell setting default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, fuzzy, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell path search set default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr ".úåéðù 30 ìù %s úééäùä"
-
-#  Pay attention: this is written to the _right_ of the previous string,
-#  but should look like a single sentence together with it.
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr " äîééúñð\n"
-
-#: main.c:1627
-#, fuzzy
+#: src/main.c:1609
+#, fuzzy, c-format
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 ".Make ìù áàä ììëì `+' óñåä .-j1-á ùåîéù äùòéé ;ïéîæ åðéà jobserver :äøäæà"
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr "jobserver ïôåà ìèáî ;-jN áééçî Make-úú :äøäæà"
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr ".úçà íòôî øúåé ïúéð éð÷ú èì÷ õåøòî Makefile"
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (temporary file)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (temporary file)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "jobserver ïôåà ìèáî ;-jN áééçî Make-úú :äøäæà"
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr ".åæ úëøòîá êîúð åðéà (-j) éìéá÷î òåöéá"
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr ".(-j1) éúøãñ ïôåàá åòöåáé úåãå÷ô"
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "...makefile éöá÷ ïëãòî\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, fuzzy, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ".ùãçî åøöééìî òðîð ;úéôåñðéà äàìåì øåöéì ìåìò `%s' Makefile\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, fuzzy, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr ".`%s' makefile ìù ùãçî-äøéöéá äì÷ú"
 
-#: main.c:2299
+#: src/main.c:2323
 #, fuzzy, c-format
 msgid "Included makefile '%s' was not found."
 msgstr ".àöîð àì `%s' ììëåî makefile"
 
-#: main.c:2304
+#: src/main.c:2328
 #, fuzzy, c-format
 msgid "Makefile '%s' was not found"
 msgstr "àöîð àì `%s' Makefile"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr ".úéøå÷îä äé÷éúì øåæçì ïúéð àì"
 
-#: main.c:2380
+#: src/main.c:2402
 #, fuzzy, c-format
 msgid "Re-executing[%u]:"
 msgstr "Re-executing:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (temporary file): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ""
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "makefile éöá÷ åàöîð àìå úåøèî ïåéö ïéà"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "úåøèî ïéà"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "makefile éöá÷ åàöîð àìå úåøèî ïåéö ïéà"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "...ãòé úåøèî ïëãòî\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ".äîìù àì úåéäì äìåìò äéðáä .ïåòù úùéìâ äúìâúð :úåøéäæ"
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "%s [íéðééôàî] [äøèî] ...  :ùåîéù ïôåà\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
 "This program built for %s\n"
 msgstr ""
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
 "This program built for %s (%s)\n"
 msgstr ""
 
-#: main.c:2784
+#: src/main.c:2815
 #, fuzzy, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "\n"
 ".<bug-make@gnu.org>-ì äì÷ú éçååéã çåìùì àð\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, fuzzy, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "éáåéçå íìù èðîåâøà áééçî `-%c' ïééôàî"
 
-#: main.c:2934
+#: src/main.c:2965
 #, fuzzy, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "éáåéçå íìù èðîåâøà áééçî `-%c' ïééôàî"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr ""
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr ""
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1243,7 +1252,7 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1252,7 +1261,7 @@ msgstr ""
 "\n"
 "# Make data base, printed on %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1261,507 +1270,532 @@ msgstr ""
 "\n"
 "# Finished Make data base on %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Unknown error %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, fuzzy, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s access: user %lu (real %lu), group %lu (real %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 #, fuzzy
 msgid "Initialized access"
 msgstr "Initialized"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr ""
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr ""
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr ""
 
-#: output.c:104
+#: src/output.c:97
 #, fuzzy, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "an unknown directory"
 
-#: output.c:106
+#: src/output.c:99
 #, fuzzy, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "an unknown directory"
 
-#: output.c:109
+#: src/output.c:102
 #, fuzzy, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "directory `%s'\n"
 
-#: output.c:111
+#: src/output.c:104
 #, fuzzy, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "directory `%s'\n"
 
-#: output.c:115
+#: src/output.c:108
 #, fuzzy, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "an unknown directory"
 
-#: output.c:117
+#: src/output.c:110
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "an unknown directory"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr ""
 
-#: output.c:122
+#: src/output.c:115
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "directory `%s'\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr ""
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Stop.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr ""
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "creating jobs pipe"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 #, fuzzy
 msgid "duping jobs pipe"
 msgstr "creating jobs pipe"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "init jobserver pipe"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, fuzzy, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "--jobserver-fds ïééôàîá `%s' äéåâù úæåøçî :úéîéðô äðëú úì÷ú"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 #, fuzzy
 msgid "jobserver pipeline"
 msgstr "init jobserver pipe"
 
 #  Here and elsewhere leading strings passed to perror are not translated,
 #  since they will be followed by an error message in English.
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "write jobserver"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 #, fuzzy
 msgid "pselect jobs pipe"
 msgstr "read jobs pipe"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "read jobs pipe"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "...makefile éöá÷ àøå÷\n"
 
-#: read.c:329
+#: src/read.c:336
 #, fuzzy, c-format
 msgid "Reading makefile '%s'"
 msgstr "Reading makefile `%s'"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (no default goal)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (search path)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (don't care)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (no ~ expansion)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr ""
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr ""
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "éàðú ìù éåâù øéáçú"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
-#, fuzzy
+#: src/read.c:986
+#, fuzzy, c-format
 msgid "recipe commences before first target"
 msgstr "äðåùàø äøèî éðôì úåìéçúî úåãå÷ô"
 
-#: read.c:1034
-#, fuzzy
+#: src/read.c:1035
+#, fuzzy, c-format
 msgid "missing rule before recipe"
 msgstr "ïäéðôì ììë àìì úåãå÷ô"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "(?íéçååø 8 íå÷îá TAB-ì úðååëúä íàä) "
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, fuzzy, c-format
 msgid "missing separator"
 msgstr "%sãéøôî øñç"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "äøèî úéðáú ïéà"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "úåáåøî äøèî úåéðáú"
 
-#: read.c:1268
+#: src/read.c:1289
 #, fuzzy, c-format
 msgid "target pattern contains no '%%'"
 msgstr "`%%' àìì äøèî úéðáú"
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, fuzzy, c-format
 msgid "missing 'endif'"
 msgstr "øñç `endif'"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "÷éø äðúùî íù"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, fuzzy, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "`endef' úàøåä éøçà øúåéî èñ÷è"
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, fuzzy, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "íåéñ àìì `define' úàøåä ,øñç `endef'"
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, fuzzy, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "`endef' úàøåä éøçà øúåéî èñ÷è"
 
-#: read.c:1588
+#: src/read.c:1603
 #, fuzzy, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "`%s' úàøåä éøçà øúåéî èñ÷è"
 
-#: read.c:1589
+#: src/read.c:1604
 #, fuzzy, c-format
 msgid "extraneous '%s'"
 msgstr "øúåéî `%s'"
 
-#: read.c:1617
-#, fuzzy
+#: src/read.c:1632
+#, fuzzy, c-format
 msgid "only one 'else' per conditional"
 msgstr "éàðú ìëì ãéçé `else' ÷ø øúåî"
 
-#: read.c:1892
-#, fuzzy
+#: src/read.c:1908
+#, fuzzy, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "äøèîì éôéöôñ äðúùî ìù äéåâù äøãâä"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr ""
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "íéùøåôî-éúìáå íééèèñ úéðáú éììë ìù áåáøò"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "íéùøåôî-éúìáå íéìéâø íéììë ìù áåáøò"
 
-#: read.c:2085
+#: src/read.c:2107
 #, fuzzy, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "ãòéä úéðáú úà úîàåú äðéà `%s' äøèî"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, fuzzy, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr ":: ïäå : âåñî ïä íéììë ùé `%s' äøèî õáå÷ì"
 
-#: read.c:2106
+#: src/read.c:2128
 #, fuzzy, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr ".ììë åúåàá úçà íòôî øúåé äòéôåî `%s' äøèî"
 
-#: read.c:2116
+#: src/read.c:2138
 #, fuzzy, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "`%s' äøèî øåáò úåãå÷ô ñøåã :úåøéäæ"
 
-#: read.c:2119
+#: src/read.c:2141
 #, fuzzy, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "`%s' äøèî øåáò úåîãå÷ úåãå÷ôî íìòúî :úåøéäæ"
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, fuzzy, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "íéùøåôî-éúìáå íéìéâø íéììë ìù áåáøò"
 
-#: read.c:2542
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "`%s' äøèî øåáò úåãå÷ô ñøåã :úåøéäæ"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "äçðæð äøåùä úøúé ;NUL åú éúùâô :äøäæà"
 
-#: remake.c:226
+#: src/remake.c:226
 #, fuzzy, c-format
 msgid "Nothing to be done for '%s'."
 msgstr ".`%s øåáò úåùòì äî ïéà"
 
-#: remake.c:227
+#: src/remake.c:227
 #, fuzzy, c-format
 msgid "'%s' is up to date."
 msgstr ".éðëãò øáë `%s'"
 
-#: remake.c:323
+#: src/remake.c:323
 #, fuzzy, c-format
 msgid "Pruning file '%s'.\n"
 msgstr ".`%s' øåáò úåéåìú óøâ õö÷î\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%säúééðáì íéììë ïéà êà ,`%s' úùøåã `%s'%s äøèî"
 
-#: remake.c:416
+#: src/remake.c:399
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%s`%s'%s äøèî úééðáì íéììë ïéà"
 
-#: remake.c:442
+#: src/remake.c:425
 #, fuzzy, c-format
 msgid "Considering target file '%s'.\n"
 msgstr ".`%s' äøèî õáå÷ ïçåá\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, fuzzy, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr ".`%s' õáå÷ ïåëãòá éúìùëðå éúéñéð ïîæî àì\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, fuzzy, c-format
 msgid "File '%s' was considered already.\n"
 msgstr ".ïë-éðôì ïçáð øáë `%s' õáå÷\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, fuzzy, c-format
 msgid "Still updating file '%s'.\n"
 msgstr ".`%s' õáå÷ ïëãòî ïééãò\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, fuzzy, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr ".`%s' õáå÷ ïëãòì éúîééñ\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, fuzzy, c-format
 msgid "File '%s' does not exist.\n"
 msgstr ".íéé÷ åðéà `%s' õáå÷\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, fuzzy, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr ".`%s' øåáò ùøåôî-éúìá ììë éúàöî\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, fuzzy, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr ".`%s' øåáò íéùøåôî-éúìá íéììë åàöîð àì\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, fuzzy, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr ".`%s' øåáò ìãçî úøéøá úåãå÷ôá ùîúùî\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr ".%s <- %s úéìâòî ìåìú èéîùî"
 
-#: remake.c:691
+#: src/remake.c:674
 #, fuzzy, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr ".`%s' äøèî õáå÷ ìù íã÷-úåùéøã íò éúîééñ\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, fuzzy, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr ".äéðáá `%s' ìù íã÷ä úåùéøã\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, fuzzy, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr ".`%s' äøèî õáå÷ éáâì íééãé éúîøä\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, fuzzy, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr ".úåàéâù á÷ò ùãçî äúðáð àì `%s' äøèî"
 
-#: remake.c:768
+#: src/remake.c:751
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr ".`%s' íã÷ä úùéøãî äùãç `%s' äøèî\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, fuzzy, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr ".íéé÷ åðéàù `%s' éàðúë úùøåã `%s' äøèî\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr ".`%s' íã÷ä úùéøãî äðùé `%s' äøèî\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr ".`%s' íã÷ä úùéøãî äùãç `%s' äøèî\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, fuzzy, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ".íã÷ úåùéøã àììå íéìåôë íééúåãå÷ð íò äðéä `%s' äøèî\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, fuzzy, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ".äùòîì äúðúùä àì íã÷ úùéøã óàå `%s' øåáò úåãå÷ô ïéà\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr ""
 
-#: remake.c:819
+#: src/remake.c:802
 #, fuzzy, c-format
 msgid "No need to remake target '%s'"
 msgstr "`%s' äøèî ùãçî úåðáì êøåö ïéà"
 
-#: remake.c:821
+#: src/remake.c:804
 #, fuzzy, c-format
 msgid "; using VPATH name '%s'"
 msgstr " (`%s' :VPATH õáå÷ íù)"
 
-#: remake.c:841
+#: src/remake.c:824
 #, fuzzy, c-format
 msgid "Must remake target '%s'.\n"
 msgstr ".`%s' äøèî ùãçî úåðáì áééç\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, fuzzy, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  .`%s' VPATH íùî íìòúî\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, fuzzy, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr ".`%s' øåáò úåãå÷ô õéøî\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, fuzzy, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr ".ùãçî `%s' úåðáì ïåéñð ìùëð\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, fuzzy, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr ".`%s' ùãçî úééðáá äçìöä\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, fuzzy, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr ".-q íò úåðáéäì êéøö `%s' äøèî õáå÷\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, fuzzy, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr ".`%s' øåáò ìãçî úøéøá úåãå÷ôá ùîúùî\n"
 
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "*** `%s' õáå÷ øåáò (%s > %s) ãéúòá åðéä ïåøçà éåðéù ïîæ :äøäæà ***"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, fuzzy, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "*** `%s' õáå÷ øåáò (%s > %s) ãéúòá åðéä ïåøçà éåðéù ïîæ :äøäæà ***"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, fuzzy, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "úéðáú åðéà .LIBPATTERNS ìù `%s' èðîìà"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "%s àöééî åðéà Customs\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 #, fuzzy
 msgid ""
 "\n"
@@ -1770,7 +1804,7 @@ msgstr ""
 "\n"
 "# No implicit rules."
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1778,189 +1812,185 @@ msgstr ""
 "\n"
 "# No implicit rules."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u implicit rules, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, fuzzy, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BUG: num_pattern_rules wrong!  %u != %u"
 
 #  It's no use to try to translate the signal names.
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "unknown signal"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Hangup"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Interrupt"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Quit"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Illegal Instruction"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Trace/breakpoint trap"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Aborted"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT trap"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT trap"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Floating point exception"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Killed"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Bus error"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Segmentation fault"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Bad system call"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Broken pipe"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarm clock"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Terminated"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "User defined signal 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "User defined signal 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Child exited"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Power failure"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Stopped"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Stopped (tty input)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Stopped (tty output)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Stopped (signal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU time limit exceeded"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "File size limit exceeded"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtual timer expired"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Profiling timer expired"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Window changed"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Continued"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Urgent I/O condition"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O possible"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Resource lost"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Danger signal"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Information request"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Floating point co-processor not available"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1968,77 +1998,77 @@ msgid ""
 "B\n"
 msgstr ""
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatic"
 
 #  These are printed under -p, so they are left in English.
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "default"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "environment"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "environment under -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "command line"
 
-#: variable.c:1647
+#: src/variable.c:1671
 #, fuzzy
 msgid "'override' directive"
 msgstr "`override' directive"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, fuzzy, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (from `%s', line %lu):\n"
 
-#: variable.c:1721
+#: src/variable.c:1745
 #, fuzzy
 msgid "# variable set hash-table stats:\n"
 msgstr "# %u variables in %u hash buckets.\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2046,7 +2076,7 @@ msgstr ""
 "\n"
 "# Variables\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 #, fuzzy
 msgid ""
 "\n"
@@ -2055,7 +2085,7 @@ msgstr ""
 "\n"
 "# Pattern-specific variable values"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2063,7 +2093,7 @@ msgstr ""
 "\n"
 "# No pattern-specific variable values."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2072,47 +2102,47 @@ msgstr ""
 "\n"
 "# %u pattern-specific variable values"
 
-#: variable.h:224
+#: src/variable.h:229
 #, fuzzy, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "`%.*s' øãâåî-éúìá äðúùî :úåøéäæ"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, fuzzy, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "%d íò ìùëð sys$search\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ".DCL-î CTRL-Y-á ìåôéè øåùôéàá êøåö úåéäì ìåìò :úåøéäæ\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BUILTIN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, fuzzy, c-format
 msgid "Append output to %s\n"
 msgstr "%s-ì èìô úééðôä\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "%s õéøî úàæ íå÷îá\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2120,12 +2150,12 @@ msgstr ""
 "\n"
 "# VPATH Search Paths\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 #, fuzzy
 msgid "# No 'vpath' search paths."
 msgstr "# No `vpath' search paths."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -2134,7 +2164,7 @@ msgstr ""
 "\n"
 "# %u `vpath' search paths.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 #, fuzzy
 msgid ""
 "\n"
@@ -2143,7 +2173,7 @@ msgstr ""
 "\n"
 "# No general (`VPATH' variable) search path."
 
-#: vpath.c:631
+#: src/vpath.c:631
 #, fuzzy
 msgid ""
 "\n"
@@ -2154,33 +2184,33 @@ msgstr ""
 "# General (`VPATH' variable) search path:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
@@ -2247,6 +2277,12 @@ msgstr ""
 #~ msgid "Error spawning, %d\n"
 #~ msgstr "%d :úá-úéðëú úìòôäá äì÷ú\n"
 
+#~ msgid "%s: Command not found"
+#~ msgstr "äàöîð àì åæ äãå÷ô :%s"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "äàöîð àì shell úãå÷ô :%s"
+
 #~ msgid "DIRECTORY"
 #~ msgstr "DIRECTORY"
 
@@ -2292,6 +2328,14 @@ msgstr ""
 #~ msgid "Consider FILE to be infinitely new"
 #~ msgstr "øùôàù ùãç éëä äéä FILE åìéàë âäð"
 
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr ".úåéðù 30 ìù %s úééäùä"
+
+#  Pay attention: this is written to the _right_ of the previous string,
+#  but should look like a single sentence together with it.
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr " äîééúñð\n"
+
 #~ msgid "Do not specify -j or --jobs if sh.exe is not available."
 #~ msgstr ".ïéîæ åðéà sh.exe íà --jobs åà -j-á êåîúì ïúéð àì"
 
@@ -2333,6 +2377,9 @@ msgstr ""
 #~ msgid "Leaving"
 #~ msgstr "Leaving"
 
+#~ msgid "Unknown error %d"
+#~ msgstr "Unknown error %d"
+
 #~ msgid "virtual memory exhausted"
 #~ msgstr "éìàåèøéåä ïåøëæä øîâð"
 
@@ -2351,6 +2398,9 @@ msgstr ""
 #~ msgid "target `%s' leaves prerequisite pattern empty"
 #~ msgstr "ä÷éø íã÷ä úùéøã úéðáú úà äøéàùî `%s' äøèî"
 
+#~ msgid " terminal."
+#~ msgstr " terminal."
+
 #~ msgid "# No variables."
 #~ msgstr "# No variables."
 
index a761ba2f82782443467ce59e79c92651f1d1ee3e..2379f8f603866ef7f9f38e11cc88db773d620d19 100644 (file)
Binary files a/po/hr.gmo and b/po/hr.gmo differ
index 68a082d499d4248dd82098dfb9b8e1a5b5caff67..b43c9d16b7c3b8e9b0c289c627562284d5cec3c2 100644 (file)
--- a/po/hr.po
+++ b/po/hr.po
-# Translation of make to Croatian.
+# Translation of CNU make messages to Croatian.
 # Copyright © 2016 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
-# directive → direktiva (ne prevoditi kao „naredba“)
-# hash → hash (ostaviti engl.)
-# chain → lanac
-# jobserver → poslužitelj poslova, djelitelj zadataka
-# make (verb) → napraviti, praviti, proizvesti
-# make (imenica) → (program „make“ (ne sklanjati)
-# makefile → makefile (ne prevoditi, ali možda sklanjati ili, budući da je  makefile datoteka, uvijek pisati ‘makefile’ datoteka)
-# archive member → pripadnik (arhive), a to je obično datoteka, direktorij..
-# C structure member → član
-# pattern → uzorak
-# prerequisite → preduvjet
-# child (process) → potomak, ptomački proces
-# parent (process) → predak, predački proces
-# reap child → počisti potomka
-# # recipe → recept
-# target → cilj
-# token → token (ne prevoditi)
-# pipe → cijev (možda je bolje „kanal“)
-# pipeline → cjevovod (možda je bolje „kanal“)
+#
 # Hrvoje Niksic <hniksic@xemacs.org>, 2002.
 # Tomislav Krznar <tomislav.krznar@gmail.com>, 2012.
-# Božidar Putanec <bozidarp@yahoo.com>, 2016.
+# Božidar Putanec <bozidarp@yahoo.com>, 2016, 2018, 2019, 2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-22 22:37-0700\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-06 11:39-0800\n"
 "Last-Translator: Božidar Putanec <bozidarp@yahoo.com>\n"
 "Language-Team: Croatian <lokalizacija@linux.hr>\n"
 "Language: hr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-"X-Generator: Lokalize 2.0\n"
+"X-Generator: Lokalize 19.04.3\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
-msgstr "pokušaj upotrebe ne podržane značajke ‘%s’"
+msgstr "pokušaj upotrebe nepodržane značajke „%s“"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr ""
-"U VMS sustavu nije moguće ‘touch’ (ažurirati vrijeme modifikacije i "
-"pristupa\n"
-"datoteci) pripadnika (member) arhive"
+"u VMS sustavu nije moguće „touch“ (promijeniti vrijeme modifikacije)\n"
+"člana arhive"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
-msgstr "‘touch’: Arhiva ‘%s’ ne postoji"
+msgstr "touch: arhiva „%s“ ne postoji"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
-msgstr "‘touch’: ‘%s’ nije valjana arhiva"
+msgstr "touch: „%s“ nije valjana arhiva"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
-msgstr "‘touch’: Pripadnik arhive ‘%s’ ne postoji u arhivi ‘%s’"
+msgstr "touch: član arhive „%s“ ne postoji u arhivi „%s“"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
-msgstr "‘touch’: Loš povratni kȏd iz ‘ar_member_touch’ na ‘%s’"
+msgstr "touch: ar_member_touch() na „%s“ nije uspjela"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
-msgstr "lbr$set_module() neuspjelo izvući obavijesti o modulu, status = %d"
+msgstr "lbr$set_module() nije uspjela izvući obavijesti o modulu, status = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
-msgstr "lbr$ini_control() nije uspio sa statusom = %d"
+msgstr "lbr$ini_control() nije uspjela, status = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
-msgstr ""
-"nemoguće je otvoriti biblioteku ‘%s’ radi uvida u status pripadnika ‘%d’"
+msgstr "nemoguće je otvoriti biblioteku „%s“ radi uvida u status člana %d"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
-msgstr "Pripadnik arhive ‘%s’%s: %ld bajtova na adresi %ld (%ld).\n"
+msgstr "Član arhive „%s“%s: %ld bajtova na adresi %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
-msgstr " (ime je možda podrezano)"
+msgstr " (može biti da je skraćeno)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Datum %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
-msgstr "  uid = %d, gid = %d, mod = 0%o.\n"
+msgstr "  uid = %d, gid = %d, mȏd = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
-msgstr "Recept ima previše redova (%ud)"
+msgstr "Recept ima previše redaka (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Prekid.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
-msgstr "*** [%s] Pripadnik arhive ‘%s’ je možda lažan; nije izbrisan"
+msgstr "*** [%s] Član arhive „%s“ je možda lažan; nije izbrisani"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
-msgstr "*** Pripadnik arhive ‘%s’ je možda lažan; nije izbrisan"
+msgstr "*** Član arhive „%s“ je možda lažan; nije izbrisani"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
-msgstr "*** [%s] Brišem datoteku ‘%s’"
+msgstr "*** [%s] Briše se datoteka „%s“"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
-msgstr "*** Brišem datoteku ‘%s’"
+msgstr "*** Briše se datoteka „%s“"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
-msgstr "#  recept koji treba primijeniti"
+msgstr "#  pokrenuti recept"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (ugrađeno):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
-msgstr " (iz â\80\98%sâ\80\99, redak %lu):\n"
+msgstr " (iz â\80\9e%sâ\80\9c, redak %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -156,225 +138,225 @@ msgstr ""
 "\n"
 "# Direktoriji\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
-msgstr "# %s: nemoguće ga je ‘stat’ (očitati mu status).\n"
+msgstr "# nije bilo moguće dobiti status od %s.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr ""
-"# %s (ključ %s, mtime (vrijeme zadnje izmjene) %ull): nije se mogao "
-"otvoriti.\n"
+"# %s (ključ %s, vrijeme zadnje izmjene %I64u): nije bilo moguće otvoriti.\n"
 
 # inode >  index in a table of contents or an inode in a Unix-like file system > ičvor
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
-msgstr "# %s (uređaj %d, inode [%d,%d,%d]): nije moguće otvoriti.\n"
+msgstr "# %s (uređaj %d, inode [%d,%d,%d]): nije bilo moguće otvoriti.\n"
 
 # An inode is a data structure on a filesystem on Linux and other Unix-like operating systems that stores all the information about a file except its name and its actual data.
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
-msgstr "# %s (uređaj %ld, inode %ld): nije moguće otvoriti.\n"
+msgstr "# %s (uređaj %ld, inode %ld): nije bilo moguće otvoriti.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (ključ %s, mtime (vrijeme zadnje izmjene) %ull): "
+msgstr "# %s (ključ %s, vrijeme zadnje izmjene %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (uređaj %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (uređaj %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Ne"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " datoteke, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "ne"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " nemogućnosti"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " do sada."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " nemogućnosti u %lu direktorija.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
-msgstr "Rekurzivna varijabla â\80\98%sâ\80\99 ukazuje na samu sebe (u konačnici)"
+msgstr "Rekurzivna varijabla â\80\9e%sâ\80\9c ukazuje na samu sebe (u konačnici)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "nedovršena referencija na varijablu"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
-msgstr "Recept za datoteku â\80\98%sâ\80\99 bio je naveden u %s:%lu,"
+msgstr "Recept za datoteku â\80\9e%sâ\80\9c bio je naveden u %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
-msgstr "Recept za datoteku â\80\98%sâ\80\99 bio je naÄ\91en pretragom po implicitnom pravilu,"
+msgstr "Recept za datoteku â\80\9e%sâ\80\9c je pronaÄ\91en u implicitnim pravilima,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
-msgstr "ali â\80\98%sâ\80\99 se sada smatra istom datotekom kao i â\80\98%sâ\80\99."
+msgstr "ali â\80\9e%sâ\80\9c se sada smatra istom datotekom kao i â\80\9e%sâ\80\9c."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
-msgstr "Recept za â\80\98%sâ\80\99 Ä\87e se zanemariti u korist onog za â\80\98%sâ\80\99."
+msgstr "Recept za â\80\9e%sâ\80\9c Ä\87e se ignorirati a koristit Ä\87e se â\80\9e%sâ\80\9c."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
-"‘%s’ s jednom dvotočkom ne može se preimenovati u ‘%s’ s dvije dvotočke"
+"ne može se preimenovati „%s“ s jednom dvotočkom u „%s“ s dvije dvotočke"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
-"‘%s’ s dvije dvotočke ne može se preimenovati u ‘%s’ s jednom dvotočkom"
+"ne može se preimenovati „%s“ s dvije dvotočke u „%s“ s jednom dvotočkom"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
-msgstr "*** Brisanje prijelazne datoteke ‘%s’"
+msgstr "*** Briše se privremena posredna datoteka „%s“"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
-msgstr "Uklanjanje prijelaznih datoteka...\n"
+msgstr "Uklanjanju se privremene posredne datoteke...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Trenutačno vrijeme"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
-msgstr "%s: Vremenska oznaka je izvan granica; zamjenjuje se s %s"
+msgstr "%s: Vremenski žig je izvan granica raspona; zamjenjuje se s %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Nije cilj (target):"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
-msgstr "#  Vrijedna datoteka (preduvjet za .PRECIOUS)."
+msgstr "#  Vrijedna (precious) datoteka (preduvjet za .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
-msgstr "#  Lažni cilj (target) (preduvjet za .PHONY)."
+msgstr "#  Lažni (phony) cilj (preduvjet za .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Cilj naredbenog retka."
 
 # Zadan > standardni
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
-msgstr "#  Standardni MAKEFILES, ili ‘-include/sinclude’ makefile."
+msgstr "#  Zadani Makefile, MAKEFILES, ili include/sinclude-makefile"
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Ugrađeno pravilo"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
-msgstr "#  Pretraživanje po implicitnom pravilu je izvršeno."
+msgstr "#  Provedeno je pretraživanje pomoću implicitnih pravila."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
-msgstr "#  Pretraživanje po implicitnom pravilu nije izvršeno."
+msgstr "#  Nije provedeno pretraživanje pomoću implicitnih pravila."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
-msgstr "#  Korijen implicitnog ili statičkog uzorka: ‘%s’\n"
+msgstr "#  Implicitni ili statički korijen uzorka: „%s“\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
-msgstr "#  Datoteka je prijelazni preduvjet."
+msgstr "#  Datoteka je privremeni posredni preduvjet."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Također napravi:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
-msgstr "#  Vrijeme zadnje izmjene nikad nije provjereno."
+msgstr "#  Nikad nije provjereno vrijeme zadnje izmjene"
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Datoteka ne postoji."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Datoteka je vrlo stara."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
-msgstr "#  Zadnja promjena %s\n"
+msgstr "#  Vrijeme zadnje promjene %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Datoteka je bila ažurirana."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Datoteka nije bila ažurirana."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
-msgstr "#  Recept koji se trenutačno izvršava (OVO JE BUG)."
+msgstr "#  Recept koji se još uvijek izvršava (OVO JE PROGRAMSKA GREŠKA)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
-msgstr "#  Recept o ovisnostima koji se upravo izvršava (OVO JE BUG)."
+msgstr ""
+"#  Recept za ovisnosti koji se još uvijek izvršava (OVO JE PROGRAMSKA GREŠKA)"
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
-msgstr "#  Uspješno ažuriran."
+msgstr "#  Uspješno ažurirano."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
-msgstr "#  Ažuriranje je potrebno (opcija -q je dana)."
+msgstr "#  Ažuriranje je nužno (opcija -q je dana)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Ažuriranje nije uspjelo."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
-msgstr "#  Neispravna vrijednost u ‘command_state’ članu!"
+msgstr "#  Nevaljana vrijednost u command_state članu!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -382,7 +364,7 @@ msgstr ""
 "\n"
 "# Datoteke"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -392,740 +374,735 @@ msgstr ""
 "# status datoteka hash-tablice:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
-msgstr "%s: Polja â\80\98%sâ\80\99 nema u meÄ\91uspremniku (nije â\80\98cachedâ\80\99): %s"
+msgstr "%s: Polja â\80\9e%sâ\80\9c nema u predmemoriji (nije cached): %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
-msgstr "prvi argument funkcije â\80\98wordâ\80\99 nije broj"
+msgstr "prvi argument funkcije â\80\9ewordâ\80\9c nije broj"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
-msgstr "prvi argument funkcije â\80\98wordâ\80\99 mora biti veći od 0"
+msgstr "prvi argument funkcije â\80\9ewordâ\80\9c mora biti veći od 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
-msgstr "prvi argument funkcije â\80\98wordlistâ\80\99 nije broj"
+msgstr "prvi argument funkcije â\80\9ewordlistâ\80\9c nije broj"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
-msgstr "drugi argument funkcije â\80\98wordlistâ\80\99 nije broj"
+msgstr "drugi argument funkcije â\80\9ewordlistâ\80\9c nije broj"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
-msgstr ""
-"windows32_openpipe: DuplicateHandle(In) neuspješna, kȏd greške (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(In) nije uspješna (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
-msgstr ""
-"windows32_open_pipe: DuplicateHandle(Err) neuspješna, kȏd greške (e=%ld)\n"
+msgstr "windows32_open_pipe: DuplicateHandle(Err) nije uspješna (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
-msgstr "CreatePipe() neuspješna, neuspješna, kȏd greške (e=%ld)\n"
+msgstr "CreatePipe() nije uspješna (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
-msgstr "windows32_openpipe(): process_init_fd() neuspješna\n"
+msgstr "windows32_openpipe(): process_init_fd() nije uspješna\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
-msgstr "Čistim privremenu naredbenu (batch) datoteku %s.\n"
+msgstr "Izbrisana je privremena (batch) datoteka %s.\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
-msgstr "datoteka: nedostaje naziv datoteke"
+msgstr "datoteka: nema imena datoteke"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open(): %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write(): %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close(): %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "datoteka: previše argumenata"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read(): %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
-msgstr "datoteka: neispravna datotečna operacija: %s"
+msgstr "datoteka: nevaljana operacija na datoteci: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
-msgstr "nedovoljan broj argumenata (samo %d) za funkciju ‘%s’"
+msgstr "nedovoljan broj argumenata (%d) za funkciju „%s“"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
-msgstr "nije implementirano na ovoj platformi: funkcija ‘%s’"
+msgstr "nije implementirana na ovoj platformi: funkcija „%s“"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
-msgstr "nedovrÅ¡eni poziv funkciji â\80\98%sâ\80\99: nedostaje â\80\98%câ\80\99"
+msgstr "nedovrÅ¡eni poziv funkciji â\80\9e%sâ\80\9c: nedostaje %c"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Prazno ime funkcije"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
-msgstr "Neispravan naziv funkcije: %s"
+msgstr "Nevaljani naziv funkcije: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Naziv funkcije je predugačak: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "Neispravan minimalni broj argumenata (%u) za funkciju %s"
+msgstr "Nevaljani minimalni broj argumenata (%u) za funkciju %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "Neispravan maksimalni broj argumenata (%u) za funkciju %s"
+msgstr "Nevaljani maksimalni broj argumenata (%u) za funkciju %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
-msgstr "%s: opcija â\80\98%sâ\80\99 nije jednoznaÄ\8dna\n"
+msgstr "%s: opcija â\80\9e%sâ\80\9c je dvosmislena\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
-msgstr "%s: opcija â\80\98--%sâ\80\99 ne dopušta argument\n"
+msgstr "%s: opcija â\80\9e--%sâ\80\9c ne dopušta argument\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
-msgstr "%s: opcija â\80\98%c%sâ\80\99 ne dopušta argument\n"
+msgstr "%s: opcija â\80\9e%c%sâ\80\9c ne dopušta argument\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
-msgstr "%s: opcija â\80\98%sâ\80\99 zahtijeva argument\n"
+msgstr "%s: opcija â\80\9e%sâ\80\9c zahtijeva argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
-msgstr "%s: nepoznata opcija ‘--%s’\n"
+msgstr "%s: neprepoznata opcija „--%s“\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
-msgstr "%s: nepoznata opcija ‘%c%s’\n"
+msgstr "%s: neprepoznata opcija „%c%s“\n"
 
 # * 1003.2 specifies the format of this message.  */
 #            fprintf (stderr, _("%s: illegal option -- %c\n"),
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
-msgstr "%s: ilegalna opcija -- %c\n"
+msgstr "%s: nepropisna opcija -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
-msgstr "%s: neispravna opcija -- %c\n"
+msgstr "%s: nevaljana opcija -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: opcija zahtijeva argument -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
-msgstr "%s: opcija â\80\98-W %sâ\80\99 nije jednoznaÄ\8dna\n"
+msgstr "%s: opcija â\80\9e-W %sâ\80\9c je dvosmislena\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
-msgstr "%s: opcija â\80\98-W %sâ\80\99 ne dopušta argument\n"
+msgstr "%s: opcija â\80\9e-W %sâ\80\9c ne dopušta argument\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
-msgstr "‘guile’: Proširuje se '%s'\n"
+msgstr "guile: Proširuje se „%s“\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
-msgstr "‘guile’: Ocjenjuje se '%s'\n"
+msgstr "guile: Procjena „%s“\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
-msgstr "ne mogu dodijeliti %lu bajtova za hash-tablicu: nema dovoljno memorije"
+msgstr "ne može dodijeliti %lu bajtova za hash-tablicu: nema dovoljno memorije"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Opterećenje=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Opterećenje=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "(Preraditi) Rehash=%d, "
+msgid "Rehash=%u, "
+msgstr "Rehash=%u, "
 
 # možda bi bolje bilo > Kontradikcije
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Sudari=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Sudari=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
-msgstr "Potraga za implicitnim pravilom za â\80\98%sâ\80\99.\n"
+msgstr "Potraga za implicitnim pravilom za â\80\9e%sâ\80\9c.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
-msgstr "Traži se implicitno pravilo za pripadnika arhive za ‘%s’\n"
+msgstr "Traži se implicitno pravilo za člana arhive za „%s“\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
-msgstr "Izbjegavanje rekurzije implicitnog pravila.\n"
+msgstr "Sprječavanje  rekurzije implicitnog pravila.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Korijen je predugačak: ‘%.*s’.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Predugi korijen uzorka: „%s%.*s“.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
-msgstr "Pokušaj primijene pravila s korijenom ‘%.*s’.\n"
+msgstr "Isprobava se pravilo s korijenom uzorka „%.*s“.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
-msgstr "Odbacivanje nemogućeg preduvjeta pravila ‘%s’.\n"
+msgstr "Odbija se nemogući preduvjet pravila „%s“.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
-msgstr "Odbacivanje nemogućeg implicitnog preduvjeta ‘%s’.\n"
+msgstr "Odbija se nemogući implicitni preduvjet „%s“.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
-msgstr "Pokušaj primjene pravila preduvjeta ‘%s’.\n"
+msgstr "Isprobava se pravilo preduvjeta „%s“.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
-msgstr "Pokušaj primjene implicitnog preduvjeta ‘%s’.\n"
+msgstr "Isprobava se implicitni preduvjet „%s“.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
-msgstr "Nađen preduvjet ‘%s’ kao VPATH ‘%s’\n"
+msgstr "Nađeni preduvjet „%s“ kao VPATH „%s“\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
-msgstr "Potraga za pravilom s prijelaznom datotekom ‘%s’.\n"
+msgstr "Potraga za pravilom s privremenom posrednom datotekom „%s“.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
-msgstr "Nemoguće je napraviti privremenu datoteku\n"
+msgstr "Ne može se stvoriti privremena datoteka\n"
 
 # A core dump is a file of a computer's documented memory of when a program or computer crashed.
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
-msgstr " (napravljen ispis memorije)"
+msgstr " (**krah**: stanje memorije je dokumentirano!)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
-msgstr " (zanemareno)"
+msgstr " (ignorira se)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<ugrađeno>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Greška %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
-msgstr "*** Čekanje na završetak nedovršenih poslova...."
+msgstr "*** Čeka se na nedovršene poslove...."
 
 # child > dijete > potomak; pridjev potamački
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
-msgstr "Aktivni potomački proces %p (%s) PID %s %s\n"
+msgstr "Živi potomak (nedovršeni dijete-proces) %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
-msgstr " (udaljen)"
+msgstr " (udaljeno)"
+
+#: src/job.c:898
+#, c-format
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "Čišćenje iza uspješnog potomka (dijete-procesa) %p PID %s %s\n"
 
 # reap (in cs) > To terminate a child process that has previously exited, thereby removing it from the process table
 #     Until a child process is reaped, it may be listed in the process table as a zombie or defunct process.
-#: job.c:831
+#: src/job.c:899
 #, c-format
 msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Počišćen je neuspješno završeni potomački proces %p PID %s %s\n"
-
-#: job.c:832
-#, c-format
-msgid "Reaping winning child %p PID %s %s\n"
-msgstr "Počišćen je uspješno završeni potomački proces %p PID %s %s\n"
+msgstr "Čišćenje iza neuspješnoga potomka (dijete-procesa) %p PID %s %s\n"
 
 # batch file > naredbena datoteka sustava (skript datoteka)
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
-msgstr "Čistim privremenu naredbenu (batch) datoteku %s\n"
+msgstr "Čišćenje iza privremene (batch) datoteke %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
-msgstr ""
-"Čišćenje privremene naredbene (batch) datoteke %s nije uspjelo, greška (%d)\n"
+msgstr "Čišćenje iza privremene (batch) datoteke %s nije uspjelo (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
-msgstr "Potomak %p PID %s%s uklonjen je iz lanca.\n"
+msgstr "Potomak (dijete-proces) %p PID %s%s je uklonjen iz lanca.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
-msgstr "Oslobođen je token za potomka %p (%s).\n"
+msgstr "Oslobođen je token za potomka (dijete-procesa) %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
-msgstr "process_easy() nije uspio pokrenuti proces (e=%ld)\n"
+msgstr "process_easy() nije uspjela pokrenuti proces (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 "\n"
-"Prilikom neuspjelog starta izbrojeno je %d argumenata\n"
+"%d argumenata izbrojeno je pri neuspjelom pokretanju\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
-msgstr "Dodavanje potomka %p (%s) PID %s%s u lanac potomaka.\n"
+msgstr "Umetanje potomka (dijete-procesa) %p (%s) PID %s%s u lanac.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
-msgstr "Dobiven token za potomka %p (%s).\n"
+msgstr "Dobiveni je token za potomka (dijete-procesa) %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
-msgstr "%s: cilj '%s' ne postoji"
+msgstr "%s: cilj „%s“ ne postoji"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
-msgstr "%s: ažuriraj cilj '%s' zbog: %s"
+msgstr "%s: ažurira cilj „%s“ za potrebe: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
-msgstr "ovaj operativni sustav ne dopušta ograničenje opterećenja"
+msgstr "ne mogu se nametnuti granice opterećenja na ovom operacijskom sustavu"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
-msgstr "nemoguće je ograničiti opterećenje: "
+msgstr "ne može nametnuti granice opterećenja: "
 
 # In Unix and related computer operating systems, a file descriptor is an abstract indicator (handle) used to access a file
 # stdin > standardni ulaz
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
-"nema više datotečnih deskriptora: ‘stdin’ (standardni ulaz)\n"
-"ne može se duplicirati\n"
+"nema više datotečnih kvačica: nije se mogao duplicirati standardni ulaz\n"
 
 # stdout > standardni izlaz
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
-"nema više datotečnih deskriptora: ‘stdout’ (standardni izlaz)\n"
-"se ne može kopirati\n"
+"nema više datotečnih kvačica: nije se mogao duplicirati standardni izlaz\n"
 
 # stderr > standard error
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
-"nema više datotečnih deskriptora: ‘stderr’ (standardna greška)\n"
-"se ne može kopirati\n"
+"nema više datotečnih kvačica: nije se mogao duplicirati\n"
+"standardni izlaz za greške\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
-msgstr "‘stdin’ (stadardni ulaz) se ne može obnoviti\n"
+msgstr "Nije moguće obnoviti standardni ulaz\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
-msgstr "standardni izlaz ‘stdout’ se ne može obnoviti\n"
+msgstr "Nije moguće obnoviti standardni izlaz\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
-msgstr "‘stderr’ (standardna greška) se ne može obnoviti\n"
+msgstr "Nije moguće obnoviti standardni izlaz greški\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
-"‘make’ je počistio potomački proces pid %s, ali još uvijek čeka na pid %s\n"
-
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Naredba nije pronađena\n"
+"make je počistio potomka (dijete-proces) PID %s, ali još uvijek čeka na PID "
+"%s\n"
 
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Naredba nije pronađena\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Ljuskin (shell) program nije pronađen"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
-msgstr "‘spawnvpe’: u programskom okružju možda nema dovoljno mjesta"
+msgstr "spawnvpe: može biti da u okolini nema dovoljno prostora"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
-msgstr "Varijabla $SHELL se promijenila (prije â\80\98%sâ\80\99, sada â\80\98%sâ\80\99)\n"
+msgstr "Varijabla $SHELL se promijenila (prije â\80\9e%sâ\80\9c, sada â\80\9e%sâ\80\9c)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
-msgstr "Stvaram privremenu naredbenu (batch) datoteku %s\n"
+msgstr "Stvara se privremena (batch) datoteka %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
-"Sadržaj naredbene (batch) datoteke:\n"
+"Sadržaj (batch) datoteke:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
-"Sadržaj naredbene (batch) datoteke:%s\n"
+"Sadržaj (batch) datoteke:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
-msgstr ""
-"%s (redak %d) Loš ljuskin (shell) kontekst (!unixy && !batch_mode_shell)\n"
+msgstr "%s (redak %d) Loši kontekst ljuske (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "Opcija -O[TYPE] (--output-sync[=TYPE]) nije ugrađena u ovaj program."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Otvaranje globalne tablice simbola nije uspjelo: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Učitani objekt %s nema deklaraciju da je kompatibilan s GPL-om"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
-msgstr "Učitavanje simbola %s nije uspjelo iz %s: %s"
+msgstr "Simbol %s iz %s nije uspjelo učitati: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
-msgstr "Ime simbola kojeg treba učitati je prazno: %s"
+msgstr "Prazno ime simbola za učitati: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
-msgstr "Učitavanje simbola %s iz %s\n"
+msgstr "Učitava se simbol %s iz %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
-msgstr "Operacija ‘load’ nije podržana na ovoj platformi."
+msgstr "Operacija load nije podržana na ovoj platformi."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opcije:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
-msgstr "  -b, -m                      Zanemarena zbog kompatibilnosti.\n"
+msgstr "  -b, -m                      ignorira se zbog kompatibilnosti\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
-msgstr ""
-"  -B, --always-make           Bezuvjetno izradi sve ciljeve (targets).\n"
+msgstr "  -B, --always-make           bezuvjetno napravi sve ciljeve\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 "  -C DIREKTORIJ, --directory=DIREKTORIJ\n"
-"                              Prijeđi u DIREKTORIJ prije početka rada.\n"
+"                              prije početka rada prijeđe u DIREKTORIJ\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
-msgstr "  -d                          Ispiši puno podataka za debugiranje.\n"
+msgstr "  -d                          ispisuje puno podataka za debugiranje\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
-"  --debug[=ZASTAVICE]         Ispiši razne vrste informacija za "
-"debugiranje.\n"
+"  --debug[=ZASTAVICE]         ispisuje razne vrste informacija za "
+"debugiranje\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 "  -e, --environment-overrides\n"
-"                              Varijable okružja imaju prednost\n"
-"                                (nadjačavaju ih) nad varijablama\n"
-"                                 iz ‘makefile’ datoteka\n"
+"                              učini da „make“ rabi varijable okoline "
+"umjesto\n"
+"                                tih istih varijabli iz Makefiles\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
-msgstr ""
-"  --eval=NIZ                  NIZ tretiraj kao da je direktiva\n"
-"                               ‘makefile’ datoteke.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E STRING, --eval=STRING    evaluira STRING kao Makefile direktivu\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 "  -f DATOTEKA, --file=DATOTEKA, --makefile=DATOTEKA\n"
-"                              Učitaj DATOTEKU kao ‘makefile’ datoteku.\n"
+"                              čita i koristi DATOTEKU kao Makefile\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
-msgstr "  -h, --help                  prikaži ovu pomoć i iziđi.\n"
+msgstr "  -h, --help                  ova pomoć\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
-msgstr "  -i, --ignore-errors         Zanemari greške u receptima.\n"
+msgstr "  -i, --ignore-errors         ignorira sve greške u receptima\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
 "  -I DIREKTORIJ, --include-dir=DIREKTORIJ\n"
-"                              Traži uključene ‘makefiles’ u DIREKTORIJU.\n"
+"                              traži include-Makefiles u DIREKTORIJU\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
-"  -j [N], --jobs[=N]          Dopusti N istovremenih poslova; bez argumenta\n"
-"                                nema ograničenja.\n"
+"  -j [N], --jobs[=N]          dopušta N istovremenih poslova; ako se "
+"izostavi\n"
+"                                argument N, nema ograničenja broju poslova\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
-"  -k, --keep-going            Nastavi s radom iako se neki ciljevi "
-"(targets)\n"
-"                                ne mogu izraditi.\n"
+"  -k, --keep-going            nastavlja raditi (iako se neki od ciljeva\n"
+"                                ne mogu napraviti).\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
-"                              Ne pokreći više poslova istovremeno, osim ako\n"
-"                                je opterećenje ispod N.\n"
+"                              ne pokreće više poslova istovremeno ako\n"
+"                                je opterećenje veće od N\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
-"  -L, --check-symlink-times   Rabi najnovije vrijeme izmjene ‘mtime’ između\n"
-"                                simboličkih poveznica i cilja (target)\n"
+"  -L, --check-symlink-times   od simboličke veze i njezinoga cilja koristi\n"
+"                                se kasnije vrijeme izmjene (mtime)\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
-"                              Ne izrađuj nijedan recept, samo ih ispiši.\n"
+"                              ne pokreće recepte već ih samo ispiše\n"
 
 # remake > make (something) again or differently.
 # remake > gl. prepraviti, preurediti / im. prepravak, prerada
 # na nov način, drugačije urediti, izmijeniti da na drugi način služi svrsi; preuređenje, preuređen.
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 "  -o DATOTEKA, --old-file=DATOTEKA, --assume-old=DATOTEKA\n"
-"                              Ne prerađuj DATOTEKU, jer je vrlo stara.\n"
+"                              ne obnavlja DATOTEKU jer je vrlo stara\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
-"  -O[TYPE], --output-sync[=TYPE]\n"
-"                              Sinkroniziraj izlaz paralelnih poslova po "
-"TYPE.\n"
+"  -O[TYPE], --output-sync[=TIP]\n"
+"                              TIP sinkronizacije izlaznih paralelnih "
+"poslova\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
-msgstr "  -p, --print-data-base       Ispiši ‘make’ internu bazu podataka.\n"
+msgstr ""
+"  -p, --print-data-base       ispiše internu bazu podataka „make“ programa\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
-"  -q, --question              Ne izrađuj recepte; status izlaza pokazuje\n"
-"                                ako je sve ažurirano.\n"
+"  -q, --question              ne pokreće recepte; izlazni status pokaže\n"
+"                                jesu li aktualni\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
-msgstr "  -r, --no-builtin-rules      Onemogući ugrađena implicitna pravila.\n"
+msgstr "  -r, --no-builtin-rules      onemogući ugrađena implicitna pravila\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
-"  -R, --no-builtin-variables  Onemogući ugrađene vrijednosti varijabli.\n"
+"  -R, --no-builtin-variables  onemogući ugrađene vrijednosti varijabli\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
-msgstr "  -s, --silent, --quiet       Ne ispisuj recepte.\n"
+msgstr "  -s, --silent, --quiet       ne ispisuje recepte\n"
+
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 odjekuje recepte (poništi --silent način)\n"
 
-#: main.c:393
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 "  -S, --no-keep-going, --stop\n"
-"                              Isključi -k.\n"
+"                              ukida opciju -k\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
-"  -t, --touch                 Umjesto prerade ciljeva (targets) samo ih "
-"takni\n"
-"                                (‘touch’: označi ih kao da su "
-"aktualizirani)\n"
+"  -t, --touch                 „touch“ (ažurira vrijeme) ciljeve umjesto\n"
+"                                da ih iznova napravi\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
-msgstr "  -d                          Ispiši puno podataka za debugiranje.\n"
+msgstr ""
+"  -d                          ispisuje informacije praćenja (tracing)\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
-msgstr ""
-"  -v, --version               Ispiši obavijesti o ‘make’ inačici i iziđi.\n"
+msgstr "  -v, --version               informacije o ovoj inačici programa\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
-msgstr "  -w, --print-directory       Ispiši trenutačni direktorij.\n"
+msgstr "  -w, --print-directory       ispiše trenutačni direktorij\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
-"  --no-print-directory        Isključi -w, premda je implicitno uključen.\n"
+"  --no-print-directory        ukida opciju -w (čak i ako je implicirana)\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 "  -W DATOTEKA, --what-if=DATOTEKA, --new-file=DATOTEKA, --assume-"
 "new=DATOTEKA\n"
-"                              Smatraj da je DATOTEKA uvijek nova.\n"
+"                              smatra da je DATOTEKA zauvijek nova\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
-"  --warn-undefined-variables  Upozori ako se spomene nedefinirana "
-"varijabla.\n"
+"  --warn-undefined-variables  upozori na referiranje nedefinirane varijable\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
-msgstr "prazan niz nije ispravan naziv datoteke"
+msgstr "prazni string nije valjano ime datoteke"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
-msgstr "nepoznata specifikacija â\80\98%sâ\80\99 razine debugiranja"
+msgstr "nepoznata specifikacija â\80\9e%sâ\80\9c za razinu dijagnostike"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
-msgstr "nepoznata vrsta ‘%s’ ‘output-sync’"
+msgstr "nepoznati tip sinkronizacije izlaza „%s“"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
-msgstr "%s: Uhvaćen prekid ili iznimka (kȏd  = 0x%lx, adresa = 0x%p)\n"
+msgstr "%s: Prekid/iznimka primljena (kȏd  = 0x%lx, adresa = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1140,184 +1117,189 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
-msgstr "Pristupni prekršaj: pokušaj pisanja na adresi 0x%p\n"
+msgstr "Povreda prava pristupa: operacija pisanja na adresi 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
-msgstr "Pristupni prekršaj: pokušaj čitanja na adresi 0x%p\n"
+msgstr "Povreda prava pristupa: operacija čitanja na adresi 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() postavlja default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
-msgstr "find_and_set_shell() pretragom putanje postavlja default_shell = %s\n"
-
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s zaustavljen na 30 sekundi..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "završeno je 30 sekunda spavanja. Nastavlja se.\n"
+msgstr "find_and_set_shell() pretragom staze postavlja default_shell = %s\n"
 
 # parent > roditelj > predak; pridjev predački
-#: main.c:1627
+#: src/main.c:1609
+#, c-format
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
-"upozorenje: poslužitelj poslova je nedostupan: koristi se -j1.\n"
-"Dodajte â\80\98\80\99 predaÄ\8dkom (parent) â\80\98makeâ\80\99 pravilu."
+"upozorenje: jobserver nije dostupni: koristi se -j1.\n"
+"Dodajte â\80\9e\80\9c make pravilu pretka (parent)"
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr ""
-"upozorenje: -jN je prinudno zadan u ‘submake’:\n"
-"način rada poslužitelja poslova je onemogućen."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "upozorenje: -j%d je forsiran u submake: resetira mȏd jobservera."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
-msgstr "‘Makefile’ je dva puta naveden na standardnom ulazu."
+msgstr "Makefile je dva puta naveden na standardnom ulazu."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (privremena datoteka)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (privremena datoteka)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "upozorenje: -j%d je forsiran u makefile: resetira mȏd jobservera."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Paralelni poslovi (-j) nisu podržani na ovoj platformi."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Povratak na način rada s jednim poslom (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
-msgstr "Simboličke poveznice nisu podržane: onemogućuje se -L."
+msgstr "Simboličke veze nisu podržane: onemogućuje se -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
-msgstr "Ažuriram ‘makefiles’....\n"
+msgstr "Ažuriraju se Makefiles....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
-msgstr "‘Makefile’ ‘%s’ bi mogao ući u petlju; neće se prerađivati.\n"
+msgstr "Makefile „%s“ bi mogao ući u petlju; neće se ponovno napraviti.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
-msgstr "Neuspjeh prerade datoteke ‘makefile’ ‘%s’."
+msgstr "Nije uspjelo ponovno napraviti Makefile „%s“."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
-msgstr "Uključena datoteka ‘makefile’ ‘%s’ nije pronađena."
+msgstr "„%s“ include-Makefile nije bio pronađen."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
-msgstr "Datoteka ‘makefile’ ‘%s’ nije pronađena"
+msgstr "Makefile „%s“ nije pronađen"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
-msgstr "Ne mogu se vratiti u početni direktorij."
+msgstr "Ne bilo moguće vratiti se u izvorni direktorij."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Ponovno izvršavanje[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (privremena datoteka): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
-msgstr ".DEFAULT_GOAL sadrži više od jednog cilja"
-
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Nijedan cilj nije naveden i nijedna ‘makefile’ datoteka nije pronađena"
+msgstr ".DEFAULT_GOAL sadrži više od jednoga cilja"
 
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Nema ciljeva"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Nije navedeni nijedan cilj i nije pronađeni nijedan Makefile"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
-msgstr "Ciljevi (targets) za željeni rezultat (goal) se ažuriraju ....\n"
+msgstr "Ažuriraju se ciljevi....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
-"upozorenje: Otkriven je problem sa satom. Izrada možda nije kompletno "
-"dovršena."
+"upozorenje: Otkriveni je problem sa satom. Kompilacija možda nije kompletna."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Uporaba: %s [opcije] [cilj] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
 "This program built for %s\n"
 msgstr ""
 "\n"
-"Ovaj program je napravljen za %s\n"
+"Ovaj program je proizveden za %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
 "This program built for %s (%s)\n"
 msgstr ""
 "\n"
-"Ovaj program je napravljen za %s (%s)\n"
+"Ovaj program je proizveden za %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Greške (bugs) na engleskom javite na <bug-make@gnu.org>\n"
 "Pogreške u prijevodu i vaše prijedloge javite na <lokalizacija@linux.hr>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
-msgstr "opcija ‘%s%s’ zahtijeva kao argument niz koji nije prazan"
+msgstr "opcija %s%s zahtijeva neprazni string za argument"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
-msgstr "opcija ‘-%c’ zahtijeva za argument pozitivan prirodni broj"
+msgstr "opcija -%c zahtijeva pozitivni cijeli broj za argument"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
-msgstr "%sNapravljen za %s\n"
+msgstr "%sProizvedeno za %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
-msgstr "%sNapravljen za %s (%s)\n"
+msgstr "%sProizvedeno za %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1326,541 +1308,573 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 "%sLicencija GPLv3+: GNU GPL inačica 3 ili kasnija\n"
-"  <http://gnu.org/licenses/gpl.html>\n"
-"%sOvo je slobodan softver: slobodno ga mijenjajte i dijelite.\n"
-"%sNEMA JAMSTVA, do granica dopuštenih zakonom.\n"
+"v.  <http://gnu.org/licenses/gpl.html>\n"
+"%sOvo je slobodan softver: slobodno ga mijenjajte i distribuirajte.\n"
+"%sNEMA JAMSTVA do granica dopuštenih zakonom.\n"
 "Pogreške u prijevodu i vaše prijedloge javite na <lokalizacija@linux.hr>\n"
 "\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
 "# Make data base, printed on %s"
 msgstr ""
 "\n"
-"# â\80\98Makeâ\80\99 baza podataka, ispisana na %s"
+"# â\80\9eMakeâ\80\9c baza podataka, ispisana na %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
 "# Finished Make data base on %s\n"
 msgstr ""
 "\n"
-"# ‘Make’ baza podataka zgotovljena na %s\n"
-
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Nepoznata greška %d"
+"# Gotova „Make“ baza podataka je spremna na %s\n"
 
 # Da prevedem ovo?
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
-msgstr "%s: korisnik %lu (zapravo %lu), grupa %lu (zapravo %lu)\n"
+msgstr "%s: korisnik %lu (stvarni %lu), grupa %lu (stvarna %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
-msgstr "Inicijaliziran pristup"
+msgstr "Pristup je iniciran"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
-msgstr "Korisnički pristup"
+msgstr "Pristup korisnikom"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
-msgstr "‘Make’ pristup"
+msgstr "Pristup make-om"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
-msgstr "Potomački proces"
+msgstr "Pristup potomkom (dijete-proces)"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
-msgstr "%s: Ulazak u nepoznat direktorij\n"
+msgstr "%s: Unos nepoznatoga direktorija\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
-msgstr "%s: Izlazak iz nepoznatog direktorija\n"
+msgstr "%s: Nema nepoznatoga direktorija\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
-msgstr "%s: Ulazak u direktorij ‘%s’\n"
+msgstr "%s: Ulazi se u direktorij „%s“\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
-msgstr "%s: Izlazak iz direktorija ‘%s’\n"
+msgstr "%s: Izlazi se iz direktorija „%s“\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
-msgstr "%s[%u]: Ulazak u nepoznat direktorij\n"
+msgstr "%s[%u]: Unos nepoznatoga direktorija\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
-msgstr "%s[%u]: Izlazak iz nepoznatog direktorija\n"
+msgstr "%s[%u]: Nema nepoznatoga direktorija\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
-msgstr "%s[%u]: Ulazak u direktorij ‘%s’\n"
+msgstr "%s[%u]: Ulazi se u direktorij „%s“\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
-msgstr "%s[%u]: Izlazak iz direktorija ‘%s’\n"
+msgstr "%s[%u]: Izlazi se iz direktorija „%s“\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
-msgstr "greška pisanja: stdout (standardni izlaz)"
+msgstr "greška pisanja: standardni izlaz (stdout)"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
-msgstr ".  Svršetak.\n"
+msgstr ".  Zaustavljeno.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"Opcija -O[TYPE] (--output-sync[=TYPE]) nije ugrađena u ovu kompilaciju."
+
 # In computer science, an anonymous pipe is a simplex FIFO communication channel that may be used for one-way interprocess communication (IPC). An implementation is often integrated into the operating system's file IO subsystem.
-#: posixos.c:69
+#: src/posixos.c:90
 msgid "creating jobs pipe"
-msgstr "kreiranje cijevi za poslove (jobs pipe)"
+msgstr "stvaranje cijevi za poslove"
 
 # http://make.mad-scientist.net/papers/jobserver-implementation/
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
-msgstr "dupliciranje cijevi za poslove (jobs pipe)"
+msgstr "stvaranje kopije cijevi za poslove"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
-msgstr "inicijalizacija cijevi poslužitelja poslova (jobserver pipe)"
+msgstr "inicijalizacija cijevi jobservera"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
-msgstr "interna greška: neispravan niz ‘%s’ za --jobserver-auth"
+msgstr "**interna greška**: nevaljani string „%s“ za --jobserver-auth"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
-msgstr "Klijent poslužitelja poslova (fds %d,%d)\n"
+msgstr "Klijent jobservera (fds %d,%d)\n"
 
 # In computing, a pipeline is a set of data processing elements connected in series, where the output of one element is the input of the next one.
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
-msgstr "cjevovod (pipeline) poslužitelja poslova"
+msgstr "cjevovod (pipeline) jobservera"
 
 # Što bi ovdje trebalo ići?
-# bp: iz izvornog koda, možda ovo.
-#: posixos.c:154
+# bp: iz izvornog kȏda, možda ovo.
+#: src/posixos.c:186
 msgid "write jobserver"
-msgstr "zapis poslužitelja poslova"
+msgstr "zapis jobservera"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "jobserver isključen"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
-msgstr "‘pselect’ cijevi poslova (jobs pipe)"
+msgstr "pselect() cijevi poslova"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
-msgstr "čitanje poslova s cijevi (jobs pipe)"
+msgstr "čitanje iz cijevi poslova"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
-msgstr "Čitanje ‘makefiles’ datoteka...\n"
+msgstr "Čitaju se Makefiles...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
-msgstr "Čitanje ‘makefile’ datoteke ‘%s’"
+msgstr "Čita se Makefile „%s“"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
-msgstr " (nema standardnog cilja)"
+msgstr " (nema zadanog cilja)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
-msgstr " (putanja pretraživanja)"
+msgstr " (staza pretraživanja)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (nije važno)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (bez proširivanja znaka ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
-msgstr "UTF-8 BOM u ‘makefile’ datoteci '%s' se preskače\n"
+msgstr "Preskače se UTF-8 BOM u Makefile „%s“\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
-msgstr "UTF-8 BOM u ‘makefile’ međumemoriji se preskače\n"
+msgstr "Preskače se UTF-8 BOM u Makefile međuspremniku\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
-msgstr "neispravna sintaksa u uvjetu"
+msgstr "nevaljana sintaksa u uvjetnom izrazu"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: učitavanje nije uspjelo"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
-msgstr "recept počinje ispred prvog cilja"
+msgstr "recept započinje prije prvog cilja"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
-msgstr "nedostaje pravilo ispred recepta"
+msgstr "nema pravila prije recepta"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
-msgstr "nedostaje separator (Mislili ste TAB umjesto 8 razmaka?)"
+msgstr "nema separatora (Mislili ste TAB umjesto 8 razmaka?)"
 
 # Grr, živjela engleska množina!  I što sad da radim s onim %s-om?
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "nedostaje separator"
+msgstr "nema separatora"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
-msgstr "nedostaje uzorak za cilj"
+msgstr "nema uzorka za cilj"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
-msgstr "višestruki uzorci za cilj"
+msgstr "nekoliko uzoraka za cilj"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
-msgstr "uzorak cilja ne sadrži â\80\98%%â\80\99"
+msgstr "uzorak cilja ne sadrži â\80\9e%%â\80\9c"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
-msgstr "nedostaje ‘endif’"
+msgstr "nema „endif“"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "prazno ime varijable"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
-msgstr "suvišan tekst nakon direktive ‘define’"
+msgstr "suvišni tekst nakon „define“ direktive"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
-msgstr "nedostaje ‘endef’, nedovršen ‘define’"
+msgstr "nema „endef“, nedovršeni „define“"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
-msgstr "suvišan tekst nakon direktive ‘endef’"
+msgstr "suvišni tekst nakon „endef“ direktive"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
-msgstr "suvišan tekst nakon direktive ‘%s’"
+msgstr "suvišni tekst nakon „%s“ direktive"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
-msgstr "suvišan ‘%s’"
+msgstr "suvišni „%s“"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
-msgstr "samo jedan â\80\98elseâ\80\99 po uvjetu"
+msgstr "samo jedan â\80\9eelseâ\80\9c po uvjetnom izrazu"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
-msgstr "Nepravilno formirana definicija varijable specifične za cilj"
+msgstr "Deformirana definicija varijable specifične za cilj"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
-msgstr "preduvjeti ne mogu biti definirani u receptima"
+msgstr "preduvjeti se ne mogu definirani u receptima"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "grupirani ciljevi moraju predati recept"
 
-#: read.c:2009
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
-msgstr "pomiješana su implicitna pravila i pravila sa statičkim uzorcima"
+msgstr "pomiješana su implicitna i statička uzorak-pravila"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "pomiješana su implicitna i normalna pravila"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
-msgstr "cilj â\80\98%sâ\80\99 se ne podudara s uzorkom cilja"
+msgstr "cilj â\80\9e%sâ\80\9c se ne podudara s uzorkom cilja"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr ""
-"u ciljnu datoteku ‘%s’ uneseni su  (dvotočka) ‘:’ i  (dvije dvotočke) ‘::’"
+msgstr "ciljna datoteka „%s“ sadrži „:“ i  „::“"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr "cilj â\80\98%sâ\80\99 je naveden viÅ¡e od jedanput u istom pravilu."
+msgstr "cilj â\80\9e%sâ\80\9c je naveden viÅ¡e od jedanput u istom pravilu"
 
 # prebrisati> brišući ukloniti, brišući poništiti, prebrisati dio teksta, odbaciti
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
-msgstr "upozorenje: recept za cilj ‘%s’ se poništava i preformira"
+msgstr "upozorenje: ignorira se recept za cilj „%s“"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
-msgstr "upozorenje: stari recept za cilj ‘%s’ se zanemaruje"
+msgstr "upozorenje: ignorira se stari recept za cilj „%s“"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr ""
 "*** pomiješana su implicitna i normalna pravila: to je zastarjela sintaksa"
 
-#: read.c:2542
+# prebrisati> brišući ukloniti, brišući poništiti, prebrisati dio teksta, odbaciti
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "upozorenje: ignorira se članstvo grupe za cilj „%s“"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
-msgstr "upozorenje: pročitan je NUL znak; ostatak retka se zanemaruje"
+msgstr "upozorenje: pročitani je NUL znak; ostatak retka se ignorira"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
-msgstr "Ništa za napraviti za ‘%s’."
+msgstr "Nema ništa za napraviti za „%s“."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
-msgstr "â\80\98%sâ\80\99 je ažuriran."
+msgstr "â\80\9e%sâ\80\9c je ažurirani."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
-msgstr "Pročišćavanje datoteke ‘%s’.\n"
+msgstr "Čišćenje datoteke „%s“.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
-msgstr "%sNema pravila za izradu cilja â\80\98%sâ\80\99, potrebnog za â\80\98%sâ\80\99%s"
+msgstr "%sNema pravila za izradu cilja â\80\9e%sâ\80\9c koji je potrebni za â\80\9e%sâ\80\9c%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
-msgstr "%sNema pravila za izradu cilja â\80\98%sâ\80\99%s"
+msgstr "%sNema pravila za izradu cilja â\80\9e%sâ\80\9c%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
-msgstr "Razmatranje ciljne datoteke ‘%s’.\n"
+msgstr "Razmatra se ciljna datoteka „%s“.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
-msgstr "Nedavni pokuÅ¡aj ažuriranja datoteke â\80\98%sâ\80\99 nije uspio.\n"
+msgstr "Nedavni pokuÅ¡aj ažuriranja datoteke â\80\9e%sâ\80\9c nije uspio.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
-msgstr "Datoteka â\80\98%sâ\80\99 je već bila razmatrana.\n"
+msgstr "Datoteka â\80\9e%sâ\80\9c je već bila razmatrana.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
-msgstr "Datoteka â\80\98%sâ\80\99 se još uvijek ažurira.\n"
+msgstr "Datoteka â\80\9e%sâ\80\9c se još uvijek ažurira.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
-msgstr "Ažuriranje datoteke â\80\98%sâ\80\99 je završeno.\n"
+msgstr "Ažuriranje datoteke â\80\9e%sâ\80\9c je završeno.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
-msgstr "Datoteka â\80\98%sâ\80\99 ne postoji.\n"
+msgstr "Datoteka â\80\9e%sâ\80\9c ne postoji.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
-"*** Upozorenje: .LOW_RESOLUTION_TIME datoteka â\80\98%sâ\80\99 ima vremensku oznaku "
-"visoke točnosti"
+"*** Upozorenje: .LOW_RESOLUTION_TIME datoteka â\80\9e%sâ\80\9c ima\n"
+"                vremensku oznaku visoke rezolucije"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
-msgstr "PronaÄ\91eno je implicitno pravilo za â\80\98%sâ\80\99.\n"
+msgstr "PronaÄ\91eno je implicitno pravilo za â\80\9e%sâ\80\9c.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
-msgstr "Nijedno implicitno pravilo nije pronaÄ\91eno za â\80\98%sâ\80\99.\n"
+msgstr "Nijedno implicitno pravilo nije pronaÄ\91eno za â\80\9e%sâ\80\9c.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
-msgstr "Rabi se standardni recept za ‘%s’.\n"
+msgstr "Rabi se zadani recept za „%s“.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Kružna ovisnost %s <- %s je odbačena."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
-msgstr "Završeni su preduvjeti za ciljnu datoteku ‘%s’.\n"
+msgstr "Preduvjeti za ciljnu datoteku „%s“ su gotovi.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
-msgstr "Preduvjeti za â\80\98%sâ\80\99 se izrađuju.\n"
+msgstr "Preduvjeti za â\80\9e%sâ\80\9c se izrađuju.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
-msgstr "Odustajem od ciljne datoteke ‘%s’.\n"
+msgstr "Odustaje se od izrade ciljne datoteke „%s“.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
-msgstr "Cilj â\80\98%sâ\80\99 nije preraÄ\91en (ponovno izraÄ\91en) zbog greÅ¡aka."
+msgstr "Cilj â\80\9e%sâ\80\9c nije bio zbog greÅ¡aka ponovno izraÄ\91en."
 
 # Nisam siguran da sam ovo ispravno shvatio.
 # bp:  impose a specific ordering on the rules to be invoked without forcing the target to be updated if one of those rules is executed
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr ""
-"Preduvjet ‘%s’ je ‘order-only’ za cilj ‘%s’.\n"
-"  ‘order-only’: ‘make’ neće preraditi (remake) „normalne“ recepte ako se "
-"izmjeni\n"
-" vremenska oznaka na ‘order-only’ cilju (target) (normalno, ‘make’ uvijek "
-"preradi\n"
-" (remake) recepte, kad god se izmjeni vremenska oznaka na bilo kojem "
-"objektu).\n"
+"Preduvjet „%s“ je order-only za cilj „%s“.\n"
+"order-only: make neće preraditi (remake) „normalne“ recepte ako se izmjeni\n"
+"vremenska oznaka na order-only cilju (normalno, make uvijek preradi\n"
+"recepte kad god se izmjeni vremenska oznaka na bilo kojem objektu).\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
-msgstr "Preduvjet â\80\98%sâ\80\99 za cilj â\80\98%sâ\80\99 ne postoji.\n"
+msgstr "Preduvjet â\80\9e%sâ\80\9c za cilj â\80\9e%sâ\80\9c ne postoji.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
-msgstr "Preduvjet â\80\98%sâ\80\99 je noviji (mlaÄ\91i) nego od od njega ovisan cilj â\80\98%sâ\80\99.\n"
+msgstr "Preduvjet â\80\9e%sâ\80\9c je noviji nego od od njega ovisni cilj â\80\9e%sâ\80\9c.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
-msgstr "Preduvjet â\80\98%sâ\80\99 je stariji nego od od njega ovisan cilj â\80\98%sâ\80\99.\n"
+msgstr "Preduvjet â\80\9e%sâ\80\9c je stariji nego od od njega ovisni cilj â\80\9e%sâ\80\9c.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
-msgstr "Cilj â\80\98%sâ\80\99 je s dvotoÄ\8dkom i nema preduvjeta.\n"
+msgstr "Cilj â\80\9e%sâ\80\9c je s dvije dvotoÄ\8dke i nema preduvjeta.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
-"Nema recepta za â\80\98%sâ\80\99 i nijedan od preduvjeta zapravo nije promijenjen.\n"
+"Nema recepta za â\80\9e%sâ\80\9c i zapravo nijedan od preduvjeta nije promijenjen.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
-msgstr "â\80\98%sâ\80\99 se zbog zastavice â\80\98always-makeâ\80\99 ponovno izrađuje.\n"
+msgstr "â\80\9e%sâ\80\9c se zbog zastavice always-make ponovno izrađuje.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
-msgstr "Nema potrebe preraditi cilj â\80\98%sâ\80\99"
+msgstr "Nema potrebe preraditi cilj â\80\9e%sâ\80\9c"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
-msgstr "; rabi se naziv â\80\98%sâ\80\99 za VPATH"
+msgstr "; rabi se naziv â\80\9e%sâ\80\9c za VPATH"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
-msgstr "Cilj â\80\98%sâ\80\99 se mora preraditi.\n"
+msgstr "Cilj â\80\9e%sâ\80\9c se mora preraditi.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
-msgstr "  Zanemaruje se naziv â\80\98%sâ\80\99 za VPATH.\n"
+msgstr "  Zanemaruje se naziv â\80\9e%sâ\80\9c za VPATH.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
-msgstr "Recept za â\80\98%sâ\80\99 se upravo primjenjuje.\n"
+msgstr "Recept za â\80\9e%sâ\80\9c se upravo izvrÅ¡ava.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
-msgstr "Prerada (remake) ciljne datoteke ‘%s’ nije uspjela.\n"
+msgstr "Prerada ciljne datoteke „%s“ nije uspjela.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
-msgstr "Ciljna datoteka â\80\98%sâ\80\99 je uspjeÅ¡no preraÄ\91ena .\n"
+msgstr "Ciljna datoteka â\80\9e%sâ\80\9c je uspjeÅ¡no preraÄ\91ena.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
-msgstr ""
-"Ciljnu datoteku ‘%s’ treba ponovno preraditi (remake) s opcijom ‘-q’.\n"
+msgstr "Ciljnu datoteku „%s“ treba ponovno preraditi s opcijom -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
-msgstr "Rabe se standardne naredbe za ‘%s’.\n"
+msgstr "Rabe se zadane naredbe za „%s“.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr ""
-"Upozorenje: Vremenska oznaka modifikacije datoteke ‘%s’ je u budućnosti"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr ""
-"Upozorenje: Vremenska oznaka modifikacije datoteke â\80\98%sâ\80\99 je za %s s u "
-"budućnosti"
+"Upozorenje: Vremenska oznaka modifikacije datoteke â\80\9e%sâ\80\9c je za\n"
+"            %s sekunda u budućnosti"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
-msgstr ".LIBPATTERNS Ä\8dlan â\80\98%sâ\80\99 nije uzorak"
+msgstr ".LIBPATTERNS Ä\8dlan â\80\9e%sâ\80\9c nije uzorak"
 
 # Customs' is literal (a library name). See README.customs.
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
-msgstr "‘Customs’ nije eksportiran: %s\n"
+msgstr "Customs nije moguće eksportirati: %s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
 
-#: rule.c:496
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1868,7 +1882,7 @@ msgstr ""
 "\n"
 "# Implicitna pravila"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1876,197 +1890,193 @@ msgstr ""
 "\n"
 "# Nema implicitnih pravila."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u implicitnih pravila, %u"
+"# %u implicitnih pravila, %u (%.1f%%) terminal"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
-msgstr "BUG: pogrešan ‘num_pattern_rules’!  %u != %u"
+msgstr "BUG: pogrešna num_pattern_rules!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
-msgstr "nepoznat signal"
+msgstr "nepoznati signal"
 
 # Keep signal names in sync with GNU libc translations.
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
-msgstr "Završetak (SIGHUP)"
+msgstr "Terminal zatvoren (SIGHUP)"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
-msgstr "Prekid (SIGINT)"
+msgstr "Prekini (SIGINT)"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
-msgstr "Kraj (SIGQUIT)"
+msgstr "Završi"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
-msgstr "Nedopuštena instrukcija (SIGILL)"
+msgstr "Nepropisna instrukcija"
 
 # Breakpoint trap just means the processor has hit a breakpoint.Your process is running more than one thread.
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
-msgstr "Prekid na kontrolnoj točki (SIGTRAP)"
+msgstr "Trace/breakpoint (SIGTRAP)"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Prekid (SIGABRT)"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT zamka (SIGIOT)"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT zamka (SIGEMT)"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
-msgstr "Iznimka (operacije) s pomičnim zarezom/točkom (SIGFPE)"
+msgstr "Iznimka (broja) pomičnog zareza (SIGFPE)"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
-msgstr "Uklonjen (SIGKILL)"
+msgstr "Ubijen (SIGKILL)"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Sabirnička greška (SIGBUS)"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Segmentacijska greška (SIGSEGV)"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
-msgstr "Nepravilan poziv sustavu (SIGSYS)"
+msgstr "Loši sustavski poziv (SIGSYS)"
 
 # a condition in programming (also known in POSIX as EPIPE error code and SIGPIPE signal), when a process requests an output to pipe or socket, which was closed by peer
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
-msgstr "Prekinuta cijev (pipe) (SIGPIPE)"
+msgstr "Prekinuta cijev (SIGPIPE)"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Budilica (SIGALRM)"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
-msgstr "Završen (SIGTERM)"
+msgstr "Završeno (SIGTERM)"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Korisnikom definiran signal 1 (SIGUSR1)"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Korisnikom definiran signal 2 (SIGUSR2)"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
-msgstr "Potomak je gotov (SIGCHLD)"
+msgstr "Potomak (child process) je završio (SIGCHLD)"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
-msgstr "Prekid napajanja (SIGPWR)"
+msgstr "Prekinuto napajanje (SIGPWR)"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
-msgstr "Zaustavljen (SIGTSTP)"
+msgstr "Zaustavljeno"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
-msgstr "Zaustavljen (tty ulaz) (SIGTTIN)"
+msgstr "Zaustavljeno (tty ulaz) (SIGTTIN)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
-msgstr "Zaustavljen (tty izlaz) (SIGTTOU)"
+msgstr "Zaustavljeno (tty izlaz) (SIGTTOU)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
-msgstr "Zaustavljen (signal) (SIGSTOP)"
+msgstr "Zaustavljeno (signal) (SIGSTOP)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
-msgstr "Premašeno ograničenje procesorskog vremena (SIGXCPU)"
+msgstr "Prekoračeno je vremensko ograničenje procesora (SIGXCPU)"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
-msgstr "Prekoračena je dopuštena veličina datoteke (SIGXFS2)"
+msgstr "Prekoračeno ograničenje veličine datoteke (SIGXFS2)"
 
 # Kako prevesti "virtual timer"?
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
-msgstr "Virtualno vrijeme (odbrojavanje vremena) je isteklo (SIGVTALRM)"
+msgstr "Virtualni tajmer je istekao (SIGVTALRM)"
 
 # Kako prevesti "profiling timer"?
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
-msgstr "Vrijeme (odbrojavanje vremena) za profiliranje je isteklo (SIGPROF)"
+msgstr "Isteklo je vrijeme za profiliranj (SIGPROF)"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
-msgstr "Prozor promijenjen (SIGWINCH)"
+msgstr "Promjena veličine prozora (SIGWINCH)"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
-msgstr "Nastavljen (SIGCONT)"
+msgstr "Nastavlja se (SIGCONT)"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
-msgstr "Hitna U/I situacija"
+msgstr "Hitno U/I stanje"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
-msgstr "U/I moguć (SIGURG)"
+msgstr "U/I je sada moguć"
 
 # Jesu li ova dva signala vic ili što?  U svakom slučaju, ovo su samo
 # descriptioni.  Za svaki slučaj, nisam ih dirao.
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
-msgstr "(SIGWIND) Prozor je izmijenjen"
+msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
-msgstr "(SIGPHONE) Promjena statusa tel. linije"
+msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
-msgstr "Resurs izgubljen (SIGLOST)"
+msgstr "Resurs je izgubljen (SIGLOST)"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Signal za opasnost (SIGDANGER)"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
-msgstr "Zahtjev za obavijestima (SIGINFO)"
+msgstr "Zahtjev za informacijom (SIGINFO)"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Koprocesor za rad s pomičnim zarezom/točkom nije dostupan (SIGNOFP)"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 "\n"
-"%s Nema međumemorija za ‘strcache’\n"
+"%s Nema međuspremnika za strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2074,40 +2084,40 @@ msgid ""
 "B\n"
 msgstr ""
 "\n"
-"%s ‘strcache’ međumemorije: %lu (%lu) / nizova = %lu\n"
-" / pohrana = %lu B / prosjek = %lu B\n"
+"%s strcache međuspremnici: %lu (%lu) / stringova = %lu\n"
+"  pohrana = %lu B / prosjek = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s trenutačna međumemorija: veličina = %hu B / upotreba = %hu B\n"
-" / broj = %hu / prosjek = %hu B\n"
+"%s trenutačni međuspremnik: veličina = %hu B / korišteno = %hu B\n"
+"  broj = %hu / prosjek = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
-msgstr "%s ostala upotreba: ukupno = %lu B / broj = %lu / prosjek = %lu B\n"
+msgstr "%s ostalo korišteno: ukupno = %lu B / broj = %lu / prosjek = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
-"%s ostalo slobodno: ukupno = %lu B / max = %lu B / min = %lu B / prosjek = "
-"%hu B\n"
+"%s ostalo slobodno: ukupno = %lu B / max = %lu B / min = %lu B\n"
+"  prosjek = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 "\n"
-"%s ‘strcache’ učinkovitost: pretrage = %lu / postotak pogodaka = %lu%%\n"
+"%s strcache učinkovitost: pretraga = %lu / pogodaka = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2115,45 +2125,45 @@ msgstr ""
 "# statistika hash-tablice:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatsko"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
-msgstr "standardno"
+msgstr "zadano"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
-msgstr "okružje"
+msgstr "okolina"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
-msgstr "makefile"
+msgstr "Makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
-msgstr "okružje pod -e"
+msgstr "okolina pod -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "naredbeni redak"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
-msgstr "â\80\98overrideâ\80\99 direktiva"
+msgstr "â\80\9eoverrideâ\80\9c direktiva"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
-msgstr " (iz â\80\98%sâ\80\99, redak %lu)"
+msgstr " (iz â\80\9e%sâ\80\9c, redak %lu)"
 
 # https://en.wikipedia.org/wiki/Hash_table
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# statistika varijabli u hash-tablici:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2161,7 +2171,7 @@ msgstr ""
 "\n"
 "# Varijable\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2169,7 +2179,7 @@ msgstr ""
 "\n"
 "# Vrijednosti varijabli specifične za uzorke"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2177,132 +2187,157 @@ msgstr ""
 "\n"
 "# Nema vrijednosti varijabli specifične za uzorke."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 "\n"
-"# %u uzorcima specifične vrijednosti varijabli"
+"# %u vrijednosti varijabli specifične za uzorke"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
-msgstr "upozorenje: nedefinirana varijabla ‘%.*s’"
+msgstr "upozorenje: nedefinirana varijabla %.*s"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
-msgstr "neuspješan sys$search() s greškom %d\n"
+msgstr "neuspješna sys$search() s greškom %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-upozorenje, možda ćete morati ponovno omogućiti obrađivanje CTRL-Y iz DCL-"
 "a.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
-msgstr "UGRAĐEN CD %s\n"
+msgstr "UGRAĐENI CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Izlaz pripojen na kraj %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "%.*s pripojiti i počistiti\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
-msgstr "Izvršava se %s radije\n"
+msgstr "Umjesto toga izvršava se %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
 msgstr ""
 "\n"
-"# VPATH putanje za pretraživanje\n"
+"# VPATH staza za pretraživanje\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
-msgstr "# Nema â\80\98vpathâ\80\99 putanja za pretraživanje."
+msgstr "# Nema â\80\9evpathâ\80\9c staze za pretraživanje."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 "\n"
-"# %u â\80\98vpathâ\80\99 putanje za pretraživanje.\n"
+"# %u â\80\9evpathâ\80\9c staza za pretraživanje.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 "\n"
-"# Nema općenite putanje za pretraživanje (varijabla ‘VPATH’)."
+"# Nema općenite („VPATH“ varijable) staze za pretraživanje."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 "\n"
-"# Općenita putanja za pretraživanje (varijabla ‘VPATH’):\n"
+"# Općenita („VPATH“ varijabla) staza za pretraživanje:\n"
 "# "
 
-#: w32/w32os.c:46
+# If the ‘-j’ option is followed by an integer, this is the number of recipes to execute at once; this is called the number of job slots. If there is nothing looking like an integer after the ‘-j’ option, there is no limit on the number of job slots. The default number of job slots is one, which means serial execution (one thing at a time).
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
-msgstr ""
-"Broj vremenskih odsječaka (slots) poslužitelja poslova je ograničen na %d\n"
+msgstr "Jobserver broj mjesta je ograničen na %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
-msgstr "kreiranje semafora poslužitelja poslova: (Greška %ld: %s)"
+msgstr "kreiranje semafora jobservera: (Greška %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
-"interna greška: semafor ‘%s’ poslužitelja poslova je nemoguće otvoriti:\n"
-"(Greska%ld: %s)"
+"**interna greška**: nije moguće otvoriti semafor\n"
+"  jobservera „%s“: (Greška %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
-msgstr "Klijent poslužitelja poslova (semafor %s)\n"
+msgstr "Klijent jobservera (semafor %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
-msgstr "oslobađanje semafora poslužitelja poslova: (Greška %ld: %s)"
+msgstr "oslobađanje semafora jobservera: (Greška %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
-msgstr "čekanje na semafor ili potomački proces (Greška %ld: %s)"
+msgstr "čekanje na semafor ili na potomka (dijete-procesa): (Greška %ld: %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Naredba nije pronađena\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Naredba nije pronađena\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Shell program (ljuska: interpreter komandi) nije pronađen"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s će spavati 30 sekundi..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "prošlo je 30 sekunda spavanja. Nastavlja se.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Nepoznata greška %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr ""
+#~ "Upozorenje: Vremenska oznaka modifikacije datoteke „%s“ je u budućnosti"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
 
 #~ msgid "#  Invalid value in `update_status' member!"
-#~ msgstr "#  Neispravna vrijednost u elementu „update_status”!"
+#~ msgstr "#  Nevaljana vrijednost u elementu „update_status”!"
 
 #~ msgid "*** [%s] Error 0x%x (ignored)"
 #~ msgstr "*** [%s] Greška 0x%x (zanemarena)"
@@ -2386,7 +2421,7 @@ msgstr "čekanje na semafor ili potomački proces (Greška %ld: %s)"
 #~ msgstr "Nemojte koristiti -j ili --jobs ako sh.exe nije dostupan."
 
 #~ msgid "Resetting make for single job mode."
-#~ msgstr "Resetiram make u mod jednog posla."
+#~ msgstr "Resetiram make u mȏd jednog posla."
 
 #~ msgid ""
 #~ "%sThis is free software; see the source for copying conditions.\n"
index eb153a1bef3e5e9a9cc7d9b6127bf478e487e710..c66e93170b3fe079c8746d4dd5afb938d246bb9d 100644 (file)
Binary files a/po/id.gmo and b/po/id.gmo differ
index f8c2cb18fef59b16aaf6d90cd538e6cbc379b5fb..f2d870220ccf7e6a3bf668e3cb78582a4ad77788 100644 (file)
--- a/po/id.po
+++ b/po/id.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: GNU make 4.0\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2014-07-30 18:30+0700\n"
 "Last-Translator: Arif E. Nugroho <arif_endro@yahoo.com>\n"
 "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
@@ -15,113 +15,115 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=ISO-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "usaha untuk menggunakan layanan yang tidak didukung: '%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "touch anggota archive tidak tersedia di VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Archive '%s' tidak ada"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: '%s' bukan archive yang valid"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Anggota '%s' tidak terdapat dalam '%s'"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: Kode kembali tidak baik dari ar_member_touch pada '%s'"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() gagal untuk mengekstrak info module, status = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() gagal dengan status = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, fuzzy, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "tidak dapat membuka perpustakaan '%s' untuk melihat anggota '%s'"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Anggota '%s'%s: %ld bytes pada %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (nama mungkin akan di potong)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr " Tanggal %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr " uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Recipe has too many lines (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Berhenti.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Anggota archive '%s' mungkin palsu: tidak dihapus"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Anggota archive '%s' mungkin palsu; tidak dihapus"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Menghapus berkas '%s'"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Menghapus berkas '%s'"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  perintah untuk dijalankan"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (bawaan):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (dari '%s', baris %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -129,219 +131,221 @@ msgstr ""
 "\n"
 "# Direktori\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: tidak dapat melihat statistik.\n"
 
-#: dir.c:1085
+#: src/dir.c:1089
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr "# %s (kunci %s, mtime %d): tidak dapat dibuka.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (perangkat %d, inode [%d,%d,%d]): tidak dapat dibuka.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (perangkat %ld, inode %ld): tidak dapat dibuka.\n"
 
-#: dir.c:1122
+#: src/dir.c:1126
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): "
 msgstr "# %s (kunci %s, mtime %d): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (perangkat %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (perangkat %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Tidak"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " berkas, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "tidak"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " tidak mungkin"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " sejauh ini."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " tidak mungkin dalam direktori %lu.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Variabel rekursif '%s' menunjuk pada dirinya sendiri"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "referensi variabel tidak diselesaikan"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Perintah di spesifikasikan untuk berkas '%s' di %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Perintah untuk berkas '%s' ditemukan dalam pencarian aturan implisit,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr ""
 "tetapi '%s' sekarang dipertimbangkan sebagai berkas yang sama dengan '%s'."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "Perintah untuk '%s' akan diabaikan untuk menghargai '%s'."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "tidak dapat mengubah nama dari kolon-tunggal '%s' ke kolon-ganda '%s'"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "tidak dapat mengubah nama kolon-ganda '%s' menjadi kolon-tunggal '%s'"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Menghapus berkas sementara '%s'"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Menghapus berkas sementara...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Waktu saat ini"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Timestamp diluar jangkauan; digantikan dengan %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Bukan sebuah target:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Berkas sebelumnya (dibutuhkan oleh .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Phony target (dibutuhkan oleh .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Baris perintah target."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Merupakan baku, MAKEFILES atau -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "# Tidak ada aturan implisit."
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Pencarian aturan implisit sudah selesai."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Pencarian aturan implisit belum selesai."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Pola/implisit atau statis stem: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Berkas merupakan dibutuhkan untuk sementara."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Juga membuat:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Waktu ubah sudah diperiksa."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Berkas tidak ada."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Berkas sudah sangat tua."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Terakhir dimodifikasi %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Berkas sudah diperbarui."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Berkas belum diperbarui."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Perintah sedang berjalan (INI MERUPAKAN SEBUAH BUG)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Perintah ketergantungan sedang berjalan (INI MERUPAKAN SEBUAH BUG)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Sukses memperbarui."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Perlu untuk diupdate (-q diset)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Gagal untuk mengupdate."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Nilai yang salah dalam anggota 'command_state' !"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -349,7 +353,7 @@ msgstr ""
 "\n"
 "# Berksa"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -359,334 +363,341 @@ msgstr ""
 "# berkas statistik hash-table:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Field '%s' not cached: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "argumen pertama untuk fungsi 'word' bukan numerik"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "argumen pertama untuk fungsi 'word' harus lebih besar dari 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "argumen pertama untuk fungsi 'wordlist' bukan numerik"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "argumen kedua dari fungsi 'wordlist' bukan numerik"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) gagal (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) gagal (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() gagal (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() gagal\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Membersihkan berkas batch sementara %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "menulis: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, fuzzy, c-format
 msgid "close: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, fuzzy, c-format
 msgid "read: %s: %s"
 msgstr "menulis: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "Invalid file operation: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "Jumlah dari argumen (%d) untuk fungsi '%s' tidak mencukupi"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "Tidak terimplementasi dalam platform ini: fungsi '%s'"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "fungsi '%s' tidak diselesaikan: hilang '%c'"
 
-#: function.c:2650
-#, fuzzy
+#: src/function.c:2667
+#, fuzzy, c-format
 msgid "Empty function name"
 msgstr "Empty function name\n"
 
-#: function.c:2652
+#: src/function.c:2669
 #, fuzzy, c-format
 msgid "Invalid function name: %s"
 msgstr "Invalid function name: %s\n"
 
-#: function.c:2654
+#: src/function.c:2671
 #, fuzzy, c-format
 msgid "Function name too long: %s"
 msgstr "Function name too long: %s\n"
 
-#: function.c:2657
+#: src/function.c:2674
 #, fuzzy, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Jumlah dari argumen (%d) untuk fungsi %s tidak mencukupi\n"
 
-#: function.c:2660
+#: src/function.c:2677
 #, fuzzy, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Jumlah dari argumen (%d) untuk fungsi %s tidak mencukupi\n"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: opsi '%s' merupakan ambigu\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: opsi '--%s' tidak memperbolehkan argumen\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: opsi '%c%s' tidak memperbolehkan argumen\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: opsi '%s' membutuhkan sebuah argumen\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: opsi tidak dikenali '--%s'\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: opsi tidak dikenali '%c%s'\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: opsi tidak legal -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: opsi tidak valid -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: opsi membutuhkan sebuah argumen -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: opsi '-W %s' merupakan opsi ambigu\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: opsi '-W %s' tidak memperbolehkan sebuah argumen\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Expanding '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Evaluating '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 "tidak dapat mengalokasikan %lu bytes untuk tabel hash; kehabisan memory"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Beban=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Rehash=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Tabrakan=%ld/%ld=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Mencari aturan implisit untuk '%s'.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Mencari aturan implisit untuk anggota-archive pada '%s'.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Menghindari aturan implisit rekursi.\n"
 
-#: implicit.c:486
-#, c-format
-msgid "Stem too long: '%.*s'.\n"
+#: src/implicit.c:484
+#, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr "Stem too long: '%.*s'.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Mencoba aturan pola dengan stem '%.*s'.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Menolak persyaratan aturan yang tidak mungkin '%s'.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Menolak persyaratan implisit yang tidak mungkin '%s'.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Mencoba persyaratan dari aturan '%s'.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Mencoba persyaratan implisit '%s'.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Menemukan persyaratan '%s' sebagai VPATH '%s'\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Mencari aturan dengan berkas sementara '%s'.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Tidak dapat membuat berkas sementara\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (core di-dump)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (diabaikan)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<bawaan>"
 
-#: job.c:510
+#: src/job.c:573
 #, fuzzy, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s] Error %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Menunggu pekerjaan yang belum selesai...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Proses anak yang masih berjalan %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (remote)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Reaping anak hilang %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Reaping winning child %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Reaping anak hilang %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Membersihkan berkas batch sementara %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Membersihkan berkas batch sementara %s failed (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Menghilangkan proses anak %p PID %s%s dari rantai.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Melepaskan token dari proses anak %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() gagal untuk menjalankan proses (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -695,94 +706,88 @@ msgstr ""
 "\n"
 "Terhitung %d argumen gagal untuk dijalankan\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Meletakkan proses anak %p (%s) PID %s%s pada rantai proses.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Memperoleh token untuk proses anak %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: archive '%s' tidak ada"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr ""
 "%s: tidak terdapat aturan untuk membuat target '%s', dibutuhkan oleh %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "tidak dapat memaksa mencapai batas beban pada sistem operasi ini"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "tidak dapat memaksa mencapai batas beban: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "tidak ada lagi file handles: tidak dapat menggandakan stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "tidak ada lagi file handles: tidak dapat menggandakan stdout\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "tidak ada lagi file handles: tidak dapat menggandakan stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Tidak dapat mengembalikan stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Tidak dapat mengembalikan stdout\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Tidak dapat mengembalikan stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make reaped child pid %s, tetap menunggu untuk pid %s\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Perintah tidak ada"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Perintah tidak ada"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Shell program tidak ditemukan"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: mungkin kehabisan ruang environment"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL berubah (sebelumnya '%s', sekarang '%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Membuat berkas batch sementara %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -790,7 +795,7 @@ msgstr ""
 "Batch file contents:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -799,59 +804,56 @@ msgstr ""
 "Batch file contents:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (baris %d) shell context tidak baik (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Failed to open global symbol table: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Loaded object %s is not declared to be GPL compatible"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Failed to load symbol %s from %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Empty symbol name for load: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Loading symbol %s from %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Parallel jobs '-j' tidak didukung dalam platform ini."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opsi:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Diabaikan untuk kompatibilitas.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Membuat semua target secara tidak "
 "kondisional.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -859,17 +861,17 @@ msgstr ""
 "  -C DIRECTORI, --directory=DIREKTORI\n"
 "                              Pindah ke DIREKTORI sebelum melakukan apapun.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          Menampilkan banyak informasi debug.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=FLAGS]             Menampilkan berbagai tipe informasi debug.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -877,13 +879,14 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              Variabel lingkungan memaksa makefiles.\n"
 
-#: main.c:353
+#: src/main.c:350
+#, fuzzy
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 "  --eval=STRING               Evaluate STRING as a makefile statement.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -891,17 +894,17 @@ msgstr ""
 "  -f BERKAS, --file=BERKAS, --makefile=BERKAS\n"
 "                              Baca BERKAS sebagai sebuah makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Tampilkan pesan ini dan keluar.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 "  -i, --ignore-errors         Abaikan kesalahan dari perintah yang "
 "dijalankan.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -910,7 +913,7 @@ msgstr ""
 "                              Cari di DIREKTORI untuk makefile yang "
 "disertakan.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -918,13 +921,13 @@ msgstr ""
 "  -j [N], --jobs[=N]          Ijinkan N kerja secara bersamaan. Kerja tidak "
 "terhingga jika tidak diberikan argumen.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Tetap jalan ketika target tidak dapat dibuat.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -934,7 +937,7 @@ msgstr ""
 "                              Jangan menjalankan multiple pekerjaan kecuali "
 "beban dibawah N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -942,7 +945,7 @@ msgstr ""
 "  -L, --check-symlink-times   Gunakan waktu mtime terbaru diantara symlinks "
 "dan target.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -952,7 +955,7 @@ msgstr ""
 "                               Jangan menjalankan perintah apapun; tampilkan "
 "saja apa yang akan dikerjakan.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -962,7 +965,7 @@ msgstr ""
 "                              Pertimbangkan BERKAS sudah sangat tua dan "
 "jangan membuatnya lagi.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -970,11 +973,11 @@ msgstr ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Tampilkan basis data internal make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -982,21 +985,28 @@ msgstr ""
 "  -q, --question              Tidak menjalankan perintah. Mengeluarkan "
 "status saja dan mengatakan up to date.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Aturan implisit bawaan tidak digunakan.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Non-aktifkan konfigurasi variabel bawaan.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Jangan menampilkan perintah.\n"
 
-#: main.c:393
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Tidak menjalankan perintah. Mengeluarkan "
+"status saja dan mengatakan up to date.\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1004,26 +1014,26 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Matikan opsi -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Sentuh target dari pada membuat kembali.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 "  --trace                          Menampilkan banyak informasi debug.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               Tampilkan versi dari make dan keluar.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Tampilkan directory saat ini.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1031,7 +1041,7 @@ msgstr ""
 "  --no-print-directory        Matikan opsi -w, walaupun opsi ini diaktifkan "
 "secara implisit.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1040,7 +1050,7 @@ msgstr ""
 "                              Pertimbangkan BERKAS sebagai sebuah berkas "
 "baru.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1048,26 +1058,27 @@ msgstr ""
 "  --warn-undefined-variables  Peringatkan akan adanya variabel yang tidak "
 "terdefinisi yang direferensikan.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "`string' kosong tidak valid sebagai nama file"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "spesifikasi tingkat debug tidak diketahui '%s'"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "unknown output-sync type '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Interupsi/Exception diterima (kode = 0x%lx, alamat = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1082,136 +1093,145 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Akses dilanggar: operasi tulis pada alamat 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Akses dilanggar: operasi baca pada alamat 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() diset pada default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell() jalur pencarian di set pada default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s dihentikan selama 30 detik..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "selesai tidur(30). Melanjutkan.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "Peringatan: server pekerja tidak ada: menggunakan -j1. Tambahkan '+' pada "
 "aturan make paling atas."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
 "Peringatan: -jN dipaksakan dalam submake: non-aktifkan mode server pekerja."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile dari standard input dispesifikasikan dua kali."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (berkas sementara)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (berkas sementara)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"Peringatan: -jN dipaksakan dalam submake: non-aktifkan mode server pekerja."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Parallel jobs (-j) tidak didukung dalam platform ini."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Mereset kembali ke mode satu job (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Symbolic links tidak didukung: menonaktifkan opsi -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Memperbarui makefiles....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Makefile '%s' mungkin berupa loop; tidak membuat lagi.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Gagal membuat lagi makefile '%s'."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Makefile yang dimasukan '%s' tidak ditemukan."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Makefile '%s' tidak ditemukan"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Tidak dapat kembali ke direktori asal."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Menjalankan kembali[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (berkas sementara): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL berisi lebih dari satu target"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Target tidak dispesifikasikan dan tidak ditemukan makefile"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Tidak ada targets"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Target tidak dispesifikasikan dan tidak ditemukan makefile"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Memperbarui tujuan target....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "Peringatan: Clock skew terdeteksi. Pembuatan anda mungkin tidak sempurna"
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Penggunaan: %s [opsi] [target] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1220,7 +1240,7 @@ msgstr ""
 "\n"
 "Program ini dibuat untuk %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1229,32 +1249,32 @@ msgstr ""
 "\n"
 "Program ini dibuat untuk %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Laporkan bugs kepada <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "opsi '%s%s' membutuhkan sebuah argument string yang tidak kosong"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "opsi '-%c' membutuhkan sebuah argument `string' yang tidak kosong"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sAplikasi ini dibuat untuk %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sAplikasi ini dibuat untuk %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1267,7 +1287,7 @@ msgstr ""
 "%sIni adalah aplikasi gratis: anda bebas untuk mengubah dan menyebarkannya.\n"
 "%sTidak ada JAMINAN, sepanjang diperbolehkan oleh hukum.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1276,7 +1296,7 @@ msgstr ""
 "\n"
 "# Membuat basis data, ditampilkan %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1285,352 +1305,384 @@ msgstr ""
 "\n"
 "# Selesai membuat basis data %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Kesalahan tidak diketahui %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: pengguna %lu (ril %lu), grup %lu (ril %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Akses terinisialisasi"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Akses pengguna"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Buat akses"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Akses anak"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Memasuki sebuah direktori yang tidak diketahui\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Meninggalkan sebuah direktori yang tidak diketahui\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Memasuki direktori '%s'\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Meninggalkan direktori '%s'\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Memasuki sebuah direktori yang tidak diketahui\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Meninggalkan sebuah direktori yang tidak diketahui\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Memasuki direktori '%s'\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Meninggalkan direktori '%s'\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, fuzzy, c-format
 msgid "write error: stdout"
 msgstr "error menulis: %s"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ". Berhenti.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "membuat pipa pekerjaan"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 #, fuzzy
 msgid "duping jobs pipe"
 msgstr "membuat pipa pekerjaan"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "inisiasi pipa server pekerja"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, fuzzy, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "internal error: tidak valid --jobserver-fds string '%s'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Jobserver client (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 #, fuzzy
 msgid "jobserver pipeline"
 msgstr "inisiasi pipa server pekerja"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "menulis jobserver"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 #, fuzzy
 msgid "pselect jobs pipe"
 msgstr "membaca pipa pekerjaan"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "membaca pipa pekerjaan"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Membaca makefiles...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Membaca makefile '%s'"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (tidak terdapat tujuan baku)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (jalur pencarian)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (tidak peduli)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (tidak terdapat ekspansi tilde ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Skipping UTF-8 BOM in makefile '%s'\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Skipping UTF-8 BOM in makefile buffer\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "sintak salah dalam kondisional"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: failed to load"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "perintah dijalankan sebelum target pertama"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "hilang aturan sebelum menjalankan perintah"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr " (apakah yang anda maksud TAB dari pada 8 buah spasi?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, fuzzy, c-format
 msgid "missing separator"
 msgstr "pemisah %s hilang"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "pola target hilang"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "pola target banyak"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "pola target tidak memiliki '%%'"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "hilang 'endif'"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "nama variabel kosong"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "Kelebihan text sesudah 'endef' directive"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "hilang 'endef', tidak diselesaikan 'define'"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "kelebihan text sesudah 'endef' directive"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "kelebihan text sesudah '%s' directive"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "kelebihan '%s'"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "hanya satu 'else' dalam setiap kondisi"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Definisi variable target-specific memiliki format yang salah"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "persyaratan tidak dapat didefinisikan dalam script perintah"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "aturan pola implisit dan static tercampur"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "aturan implisit dan aturan normal tercampur"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "target '%s' tidak cocok dengan pola target"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "target berkas '%s' keduanya memiliki masukan : dan ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "target '%s' memberikan lebih dari sekali dalam aturan sama."
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "peringatan: memaksa perintah untuk target '%s'"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "peringatan: menghiraukan perintah lama untuk target '%s'"
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, fuzzy, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "aturan implisit dan aturan normal tercampur"
 
-#: read.c:2542
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "peringatan: memaksa perintah untuk target '%s'"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "peringatan: karakter NUL terlihat; baris selanjutnya dihiraukan"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Tidak ada yang harus dilakukan untuk '%s'."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "'%s' sudah baru."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Pruning file '%s'.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
 "%sTidak terdapat aturan untuk membuat target '%s', dibutuhkan oleh '%s'%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sTidak terdapat aturan untuk membuat target '%s'%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Mempertimbangkan berkas target '%s'.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Baru saja dicoba dan gagal untuk memperbarui berkas '%s'.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Berkas '%s' baru saja dipertimbangkan.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Sedang memperbarui berkas '%s'.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Selesai memperbarui berkas '%s'.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Berkas '%s' tidak ada.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1638,147 +1690,147 @@ msgstr ""
 "*** Peringatan: .LOW_RESOLUTION_TIME berkas '%s' memiliki sebuah penanda "
 "waktu dengan resolusi tinggi"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Ditemukan sebuah aturan implisit untuk '%s'.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Tidak terdapat aturan implisit untuk membuat '%s'.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Menggunakan perintah baku untuk '%s'.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Ketergantungan %s <- %s melingkar dijatuhkan."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Selesai melakukan semua persyaratan untuk berkas target '%s'.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Persyaratan untuk membuat '%s' sedang dibuat.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Menyerah untuk membuat target berkas '%s'.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Target '%s' tidak dibuat lagi karena ada errors."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Persyaratan untuk '%s' adalah order-only untuk target '%s'.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Persyaratan untuk '%s' untuk target '%s' tidak ada.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Persyaratan untuk '%s' lebih baru dari pada target '%s'.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Persyaratan untuk '%s' lebih tua dari pada target '%s'.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Target '%s' merupakan kolon-ganda dan tidak memiliki syarat.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Tidak ada perintah untuk '%s' dan persyaratan tidak berubah.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Membuat '%s' karena adanya tanda always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Tidak perlu membuat lagi target '%s'"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; menggunakan nama VPATH '%s'"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Harus membuat lagi target '%s'.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr " Mengabaikan nama VPATH '%s'.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Perintah dari '%s' sedang dijalankan.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Gagal membuat lagi target berkas '%s'.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Sukses membuat kembali target berkas '%s'.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Target berkas '%s' dibutuhkan untuk membuat kembali dengan opsi -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Menggunakan perintah baku untuk '%s'.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Peringatan: Berkas '%s' memiliki waktu modifikasi dimasa depan"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Peringatan: Berkas '%s' memiliki waktu modifikasi %s s kedepan"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS elemen '%s' bukan merupakan sebuah pattern"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Custom tidak akan men-export: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1786,7 +1838,7 @@ msgstr ""
 "\n"
 "# Aturan implisit."
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1794,181 +1846,177 @@ msgstr ""
 "\n"
 "# Tidak ada aturan implisit."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u aturan implisit, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BUG: num_pattern_rules salah! %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "sinyal tidak diketahui"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Hangup"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Interupsi"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Berhenti"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Instruksi Tidak Legal"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Penangkap trace/breakpoint"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Dibatalkan"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Penangkap IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Penangkap EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Eksepsi titik pecahan"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Terbunuh"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Bus error"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Kesalahan segmentasi"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Panggilan sistem buruk"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Pipa rusak"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarm"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Dimatikan"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Sinyal definisi pengguna 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Sinyal definisi pengguna 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Proses anak berakhir"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Listrik bermasalah"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Dihentikkan"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Dihentikan (masukkan tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Dihentikan (keluaran tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Dihentikan (sinyal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Batas waktu CPU telah terlampaui"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Batas maksimal ukuran berkas terlampaui"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Pewaktu maya habis"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Pewaktu profiling habis"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Jendela berubah"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Dilanjutkan"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Kondisi I/O penting"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O mungkin"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Resource hilang"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Sinyal bahaya"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Permintaan informasi"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "co-processor titik pecahan tidak tersedia"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1977,7 +2025,7 @@ msgstr ""
 "\n"
 "%s # dari buffer strcache: \n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1988,26 +2036,26 @@ msgstr ""
 "%s strcache free: %lu total = (%lu) / mak = %lu / min = %lu / rata-rata = "
 "%lu\n"
 
-#: strcache.c:308
-#, c-format
+#: src/strcache.c:308
+#, fuzzy, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "besar %s strcache: total = %lu / count = %lu / rata-rata = %lu\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s strcache free: total = %lu / mak = %lu / min = %lu / rata-rata = %hu\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2016,7 +2064,7 @@ msgstr ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2024,44 +2072,44 @@ msgstr ""
 "# berkas statistik hash-table:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "otomatis"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "baku"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "lingkungan"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "lingkungan dibawah opsi -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "baris perintah"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "'override' direktif"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (dari '%s', baris %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# statistik variable set hash-table:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2069,7 +2117,7 @@ msgstr ""
 "\n"
 "# Variabel\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2077,7 +2125,7 @@ msgstr ""
 "\n"
 "# Nilai Variabel Pola-Spesifik"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2085,7 +2133,7 @@ msgstr ""
 "\n"
 "# Tidak terdapat nilai variabel pola-spesifik"
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2094,48 +2142,48 @@ msgstr ""
 "\n"
 "# %u nilai variabel pola-spesifik"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "peringatan: variabel '%.*s' tidak terdefinisi"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() gagal dengan kode %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-warning, kamu mungkin telah mengaktifkan pengontrolan CTRL-Y dari DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BAWAAN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Meneruskan output ke %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Append %.*s and cleanup\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Menjalankan perintah %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2143,11 +2191,11 @@ msgstr ""
 "\n"
 "# VPATH Jalur Pencarian\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Tidak ada 'vpath' dalam jalur pencarian."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2156,7 +2204,7 @@ msgstr ""
 "\n"
 "# %u 'vpath' jalur pencarian.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2164,7 +2212,7 @@ msgstr ""
 "\n"
 "# Tidak ada ('VPATH' variabel) umum dalam jalur pencarian."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2174,34 +2222,34 @@ msgstr ""
 "# Jalur pencarian umum untuk variabel 'VPATH':\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Jobserver slots limited to %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "creating jobserver semaphore: (Error %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Jobserver client (semaphore %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "release jobserver semaphore: (Error %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "semaphore or child process wait: (Error %ld: %s)"
@@ -2215,21 +2263,42 @@ msgstr "semaphore or child process wait: (Error %ld: %s)"
 #~ msgid "%s[%s] %s%s%s"
 #~ msgstr "%s[%s] %s%s%s"
 
+#~ msgid "%s: Command not found"
+#~ msgstr "%s: Perintah tidak ada"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Shell program tidak ditemukan"
+
 #~ msgid "internal error: multiple --sync-mutex options"
 #~ msgstr "internal error: opsi --sync-mutex lebih dari satu"
 
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s dihentikan selama 30 detik..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "selesai tidur(30). Melanjutkan.\n"
+
 #~ msgid "internal error: multiple --jobserver-fds options"
 #~ msgstr "internal error: opsi --jobserver-fds lebih dari satu"
 
 #~ msgid "dup jobserver"
 #~ msgstr "dup server pekerja"
 
+#~ msgid "Unknown error %d"
+#~ msgstr "Kesalahan tidak diketahui %d"
+
 #~ msgid "virtual memory exhausted"
 #~ msgstr "Kehabisan memori maya"
 
 #~ msgid "write error"
 #~ msgstr "error menulis"
 
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Peringatan: Berkas '%s' memiliki waktu modifikasi dimasa depan"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
+
 #~ msgid "Warning: Empty redirection\n"
 #~ msgstr "Peringatan: redirection kosong\n"
 
index b7e9a2d2af90ba9dd9b37e0a76ffbd0c65814147..7da528b59fdff637b2c8b410aae6a29a2c8456ff 100644 (file)
Binary files a/po/it.gmo and b/po/it.gmo differ
index 9a262a2234c7ee5d81e43c3a2ff3c472e4761c6e..8b98395d1f3f415242da50500ede24187fcb02cf 100644 (file)
--- a/po/it.po
+++ b/po/it.po
 # Italian messages for GNU make.
 # Copyright (C) 2009 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
-# Francesco Groccia <frgroccia@gmail.com>, 2010-2013.
+# Francesco Groccia <grocf@protonmail.ch>, 2010.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.0\n"
+"Project-Id-Version: make 4.2.91\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2013-10-11 14:58+0200\n"
-"Last-Translator: Francesco Groccia <frgroccia@gmail.com>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2019-11-13 10:20+0100\n"
+"Last-Translator: Francesco Groccia <grocf@protonmail.ch>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Editor: Vim with po plugin\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
-msgstr "tentativo di usare una funzionalità non supportata: \"%s\""
+msgstr "tentativo di usare una funzionalità non supportata: «%s»"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "touch del membro di archivio non disponibile su VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
-msgstr "touch: l'archivio \"%s\" non esiste"
+msgstr "touch: l'archivio «%s» non esiste"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
-msgstr "touch: \"%s\" non è un archivio valido"
+msgstr "touch: «%s» non è un archivio valido"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
-msgstr "touch: il membro \"%s\" non esiste in \"%s\""
+msgstr "touch: il membro «%s» non esiste in «%s»"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
-msgstr "touch: codice di uscita errato da ar_member_touch su \"%s\""
+msgstr "touch: codice di uscita errato da ar_member_touch su «%s»"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "lbr$set_module() non è riuscita a estrarre informazioni sul modulo, stato = "
 "%d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() non riuscita con lo stato = %d"
 
-#: arscan.c:261
-#, fuzzy, c-format
+#: src/arscan.c:261
+#, c-format
 msgid "unable to open library '%s' to lookup member status %d"
-msgstr "impossibile aprire la libreria \"%s\" per cercare il membro \"%s\""
+msgstr ""
+"impossibile aprire la libreria «%s» per cercare lo stato del membro «%d»"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
-msgstr "Membro \"%s\"%s: %ld byte a %ld (%ld).\n"
+msgstr "Membro «%s»%s: %ld byte a %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (il nome potrebbe essere troncato)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Data %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, modo = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Il set di istruzioni ha troppe righe (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Interruzione.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr ""
-"*** [%s] Il membro di archivio \"%s\" potrebbe essere inesistente; non "
+"*** [%s] Il membro di archivio «%s» potrebbe essere inesistente; non "
 "eliminato"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr ""
-"*** Il membro di archivio \"%s\" potrebbe essere inesistente; non eliminato"
+"*** Il membro di archivio «%s» potrebbe essere inesistente; non eliminato"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
-msgstr "*** [%s] Eliminazione del file \"%s\""
+msgstr "*** [%s] Eliminazione del file «%s»"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
-msgstr "*** Eliminazione del file \"%s\""
+msgstr "*** Eliminazione del file «%s»"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  set di istruzioni da eseguire"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (comando interno):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
-msgstr " (da \"%s\", riga %lu):\n"
+msgstr " (da «%s» riga %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -134,226 +138,225 @@ msgstr ""
 "\n"
 "# Directory\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: impossibile eseguire stat.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (key %s, mtime %d) non può essere aperto.\n"
+msgstr "# %s (key %s, mtime %I64u) non può essere aperto.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (device %d, inode [%d,%d,%d]) non può essere aperto.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (device %ld, inode %ld) non può essere aperto.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (key %s, mtime %d): "
+msgstr "# %s (key %s, mtime %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (device %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (device %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "No"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " file, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "no"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " impossibilità"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " finora."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " impossibilità nelle directory %lu.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
-msgstr "La variabile ricorsiva \"%s\" si autoreferenzia (alla fine)"
+msgstr "La variabile ricorsiva «%s» si autoreferenzia (alla fine)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "riferimento alla variabile non terminato"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
-msgstr "È stato specificato un set di istruzioni per il file \"%s\" a %s:%lu,"
+msgstr "È stato specificato un set di istruzioni per il file «%s» a %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
-"È stato trovato un set di istruzioni per il file \"%s\" mediante una regola "
-"di ricerca implicita,"
+"È stato trovato un set di istruzioni per il file «%s» mediante una regola di "
+"ricerca implicita,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
-msgstr "ma ora \"%s\" viene considerato lo stesso file di \"%s\"."
+msgstr "ma ora «%s» viene considerato lo stesso file di «%s»."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
-"Il set di istruzioni per \"%s\" verrà ignorato in favore di quello per \"%s"
-"\"."
+"Il set di istruzioni per «%s» verrà ignorato in favore di quello per «%s»."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
-"impossibile rinominare la regola \"due punti\" \"%s\" con la regola \"doppio "
-"due punti\" \"%s\""
+"impossibile rinominare la regola \"due punti\" «%s» con la regola \"doppio "
+"due punti\" «%s»"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
-"impossibile rinominare la regola \"doppio due punti\" \"%s\" con la regola "
-"\"due punti\" \"%s\""
+"impossibile rinominare la regola \"doppio due punti\" «%s» con la regola "
+"\"due punti\" «%s»"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
-msgstr "*** Eliminazione del file intermedio \"%s\""
+msgstr "*** Eliminazione del file intermedio «%s»"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Rimozione dei file intermedi...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Ora corrente"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: intervallo errato per la marcatura temporale; sostituzione di %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Non è un obiettivo:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  File \"precious\" (prerequisito di .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Obiettivo \"phony\" (prerequisito di .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Obiettivo a riga di comando."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "# Un makefile predefinito, da MAKEFILES, o da -include/sinclude."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Regola incorporata"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Regola di ricerca implicita completata."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Regola di ricerca implicita non completata."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
-msgstr "#  Stem implicito/statico del modello: \"%s\"\n"
+msgstr "#  Stem implicito/statico del modello: «%s»\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Il file è un prerequisito intermedio."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Inoltre, genera:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Ora di modifica mai controllata."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Il file non esiste."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Il file è molto vecchio."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Ultima modifica %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Il file è stato aggiornato."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Il file non è stato aggiornato."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Set di istruzioni attualmente in esecuzione (QUESTO È UN BUG)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Dipendenze del set di istruzioni in esecuzione (QUESTO È UN BUG)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Aggiornato con successo."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Richiede di essere aggiornato (-q è impostato)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Aggiornamento non riuscito."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Valore illecito nel membro \"command_state\"!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -361,7 +364,7 @@ msgstr ""
 "\n"
 "# File"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -371,335 +374,341 @@ msgstr ""
 "# statistiche tabella hash dei file:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
-msgstr "%s: Campo \"%s\" non memorizzato: %s"
+msgstr "%s: Campo «%s» non memorizzato: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "primo argomento non numerico per la funzione \"word\""
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "il primo argomento per la funzione \"word\" deve essere maggiore di 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "primo argomento non numerico per la funzione \"wordlist\""
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "secondo argomento non numerico per la funzione \"wordlist\""
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) non riuscita (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_open_pipe: DuplicateHandle(Err) non riuscita (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() non riuscita (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() non riuscita\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Pulitura del file batch temporaneo %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
-msgstr ""
+msgstr "file: file mancante"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "apertura: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "scrittura: %s: %s"
 
-#: function.c:2230 function.c:2267
-#, fuzzy, c-format
+#: src/function.c:2245 src/function.c:2282
+#, c-format
 msgid "close: %s: %s"
-msgstr "apertura: %s: %s"
+msgstr "chiusura: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
-msgstr ""
+msgstr "file: troppi argomenti"
 
-#: function.c:2262
-#, fuzzy, c-format
+#: src/function.c:2277
+#, c-format
 msgid "read: %s: %s"
-msgstr "scrittura: %s: %s"
+msgstr "lettura: %s: %s"
 
-#: function.c:2275
-#, fuzzy, c-format
+#: src/function.c:2290
+#, c-format
 msgid "file: invalid file operation: %s"
-msgstr "Operazione sui file non valida: %s"
+msgstr "file: operazione sui file non valida: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
-msgstr "numero di argomenti non sufficienti (%d) per la funzione \"%s\""
+msgstr "numero di argomenti non sufficienti (%d) per la funzione «%s»"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
-msgstr "non implementata su questa piattaforma: funzione \"%s\""
+msgstr "non implementata su questa piattaforma: funzione «%s»"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
-msgstr "chiamata non terminata alla funzione \"%s\": \"%c\" mancante"
+msgstr "chiamata non terminata alla funzione «%s»: «%c» mancante"
 
-#: function.c:2650
-#, fuzzy
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
-msgstr "Nome della funzione vuoto\n"
+msgstr "Nome della funzione vuoto"
 
-#: function.c:2652
-#, fuzzy, c-format
+#: src/function.c:2669
+#, c-format
 msgid "Invalid function name: %s"
-msgstr "Nome della funzione non valido: %s\n"
+msgstr "Nome della funzione non valido: %s"
 
-#: function.c:2654
-#, fuzzy, c-format
+#: src/function.c:2671
+#, c-format
 msgid "Function name too long: %s"
-msgstr "Nome della funzione troppo lungo: %s\n"
+msgstr "Nome della funzione troppo lungo: %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "numero di argomenti non sufficienti (%d) per la funzione \"%s\"\n"
+msgstr "Numero di argomenti non sufficienti (%u) per la funzione %s"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "numero di argomenti non sufficienti (%d) per la funzione \"%s\"\n"
+msgstr "Numero massimo di argomenti non sufficienti (%u) per la funzione %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
-msgstr "%s: l'opzione \"%s\" è ambigua\n"
+msgstr "%s: l'opzione «%s» è ambigua\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
-msgstr "%s: l'opzione \"--%s\" non ammette argomenti\n"
+msgstr "%s: l'opzione «--%s» non ammette argomenti\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
-msgstr "%s: l'opzione \"%c%s\" non ammette argomenti\n"
+msgstr "%s: l'opzione «%c%s» non ammette argomenti\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
-msgstr "%s: l'opzione \"%s\" richiede un argomento\n"
+msgstr "%s: l'opzione «%s» richiede un argomento\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
-msgstr "%s: opzione \"--%s\" sconosciuta\n"
+msgstr "%s: opzione «--%s» sconosciuta\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
-msgstr "%s: opzione \"%c%s\" sconosciuta\n"
+msgstr "%s: opzione «%c%s» sconosciuta\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: opzione illecita -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: opzione illecita -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: l'opzione richiede un argomento -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
-msgstr "%s: l'opzione \"-W %s\" è ambigua\n"
+msgstr "%s: l'opzione «-W %s» è ambigua\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
-msgstr "%s: l'opzione \"-W %s\" non ammette argomenti\n"
+msgstr "%s: l'opzione «-W %s» non ammette argomenti\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
-msgstr "guile: Espansione di \"%s\"\n"
+msgstr "guile: Espansione di «%s»\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
-msgstr "guile: Valutazione di \"%s\"\n"
+msgstr "guile: Valutazione di «%s»\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "impossibile allocare %lu byte per la tabella hash: memoria esaurita"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Carico=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Carico=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Rehash=%d, "
+msgid "Rehash=%u, "
+msgstr "Rehash=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Collisioni=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Collisioni=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
-msgstr "Ricerca di una regola implicita per \"%s\".\n"
+msgstr "Ricerca di una regola implicita per «%s».\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
-msgstr ""
-"Ricerca di una regola implicita per il membro di archivio per \"%s\".\n"
+msgstr "Ricerca di una regola implicita per il membro di archivio per «%s».\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Evitata la ricorsione della regola implicita.\n"
 
-#: implicit.c:486
-#, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Stem troppo lungo: \"%.*s\".\n"
+#: src/implicit.c:484
+#, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Stem troppo lungo: «%.*s».\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
-msgstr "Tentativo di usare la regola del modello con stem \"%.*s\".\n"
+msgstr "Tentativo di usare la regola del modello con stem «%.*s».\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
-msgstr "Prerequisito impossibile \"%s\" della regola rifiutato.\n"
+msgstr "Prerequisito impossibile «%s» della regola rifiutato.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
-msgstr "Prerequisito implicito impossibile \"%s\" rifiutato.\n"
+msgstr "Prerequisito implicito impossibile «%s» rifiutato.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
-msgstr "Tentativo di usare il prerequisito della regola \"%s\".\n"
+msgstr "Tentativo di usare il prerequisito della regola «%s».\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
-msgstr "Tentativo di usare il prerequisito implicito \"%s\".\n"
+msgstr "Tentativo di usare il prerequisito implicito «%s».\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
-msgstr "Trovato il prerequisito \"%s\" come VPATH \"%s\"\n"
+msgstr "Trovato il prerequisito «%s» come VPATH «%s»\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
-msgstr "Ricerca di una regola con il file intermedio \"%s\".\n"
+msgstr "Ricerca di una regola con il file intermedio «%s».\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Impossibile creare un file temporaneo\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (creato dump del core)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ignorato)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<incorporato>"
 
-#: job.c:510
-#, fuzzy, c-format
+#: src/job.c:573
+#, c-format
 msgid "%s[%s: %s] Error %d%s"
-msgstr "%s[%s] Errore %d%s"
+msgstr "%s[%s: %s] Errore %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Attesa per i processi non terminati...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Processo figlio vivo %p (%s) con PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (remoto)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Interruzione del processo figlio perdente %p con PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Interruzione del processo figlio vincente %p con PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Interruzione del processo figlio perdente %p con PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Pulitura del file batch temporaneo %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Pulitura del file batch temporaneo %s non riuscita (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr ""
 "Rimozione del processo figlio %p con PID %s%s dalla catena di esecuzione.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Token rilasciato per il processo figlio %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() non riuscita all'avvio del processo (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -708,101 +717,95 @@ msgstr ""
 "\n"
 "Contati %d argomenti nell'avvio fallito\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr ""
 "Inserimento del processo figlio %p (%s) con PID %s%s nella catena di "
 "esecuzione.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Token ottenuto per il processo figlio %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
-msgstr "%s: l'obbiettivo \"%s\" non esiste"
+msgstr "%s: l'obbiettivo «%s» non esiste"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
-msgstr "%s: aggiorna l'obbiettivo \"%s\" a causa di: %s"
+msgstr "%s: aggiorna l'obbiettivo «%s» a causa di: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
 "impossibile far rispettare i limiti di carico su questo sistema operativo"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "impossibile far rispettare il limite di carico: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 "nessun'altra gestione del file: impossibile duplicare lo standard input\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 "nessun'altra gestione del file: impossibile duplicare lo standard output\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 "nessun'altra gestione del file: impossibile duplicare lo standard error\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Impossibile ripristinare lo standard input\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Impossibile ripristinare lo standard output\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Impossibile ripristinare lo standard error\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 "make ha interrotto il processo figlio con pid %s, è ancora in attesa del "
 "processo con pid %s\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: comando non trovato"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: comando non trovato"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: shell non trovata"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: lo spazio dell'ambiente potrebbe essere esaurito"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
-msgstr "$SHELL cambiata (era \"%s\", adesso è \"%s\")\n"
+msgstr "$SHELL cambiata (era «%s», adesso è «%s»)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Creazione del file batch temporaneo %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -810,7 +813,7 @@ msgstr ""
 "Contenuti del file batch:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -819,60 +822,57 @@ msgstr ""
 "Contenuti del file batch:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "%s (riga %d) contesto della shell errato (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[TIPO] (--output-sync[=TIPO]) non è configurato per questa versione."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Apertura della tabella dei simboli globale non riuscita: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "L'oggetto caricato %s non è dichiarato compatibile con la licenza GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Caricamento del simbolo %s da %s non riuscito: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Nome del simbolo vuoto per il caricamento: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Caricamento del simbolo %s da %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
-msgstr "L'operazione \"load\" non è supportata su questa piattaforma."
+msgstr "L'operazione «load» non è supportata su questa piattaforma."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opzioni:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ignorato per compatibilità.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Genera tutti gli obiettivi "
 "incondizionatamente.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -881,17 +881,17 @@ msgstr ""
 "                              Cambia DIRECTORY prima di fare qualunque "
 "cosa.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          Mostra molte informazioni di debug.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=FLAGS]             Mostra diversi tipi di informazioni di debug.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -900,13 +900,14 @@ msgstr ""
 "                              Le variabili ambiente sovrascrivono i "
 "makefile.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=TESTO               Analizza STRINGA come estratta dal makefile.\n"
+" -E STRINGA, --eval=TESTO               Analizza STRINGA come estratta dal "
+"makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -914,16 +915,16 @@ msgstr ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Legge FILE come un makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Mostra questo messaggio ed esce.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 "  -i, --ignore-errors         Ignora gli errori dai set di istruzioni.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -931,7 +932,7 @@ msgstr ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Cerca nella DIRECTORY per i makefile inclusi.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -939,14 +940,14 @@ msgstr ""
 "  -j [N], --jobs[=N]          Permette N processi alla volta; infiniti se "
 "non viene specificato l'argomento.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Continua l'esecuzione quando non è possibile "
 "creare alcuni obiettivi.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -956,7 +957,7 @@ msgstr ""
 "                              Non avvia processi multipli a meno che il "
 "carico di lavoro non sia sotto N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -964,7 +965,7 @@ msgstr ""
 "  -L, --check-symlink-times   Usa il più recente mtime tra i collegamenti "
 "simbolici e l'obiettivo.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -974,7 +975,7 @@ msgstr ""
 "                              Non esegue alcun set di istruzioni; lo stampa "
 "solamente.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -984,7 +985,7 @@ msgstr ""
 "                              Considera il FILE come molto vecchio e non "
 "riesegue make.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -993,11 +994,11 @@ msgstr ""
 "                              Sincronizza l'output dei processi paralleli "
 "dal TIPO.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Stampa il database interno di make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -1005,22 +1006,28 @@ msgstr ""
 "  -q, --question              Non avvia alcun set di istruzioni; lo stato di "
 "uscita indica se è aggiornato.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Disabilita le regole implicite interne.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Disabilita le impostazioni delle variabili "
 "interne.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Non visualizza i set di istruzioni.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Visualizza il set di istruzioni (Disabilita la "
+"modalità --silent).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1029,27 +1036,27 @@ msgstr ""
 "                            Disattiva l'opzione -k.\n"
 
 # ## touch = in questo contesto è simile alla funzione del comando 'touch'
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Esegue il touch degli obiettivi invece di "
 "ricrearli.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Stampa informazioni di tracciamento.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Stampa il numero di versione di make ed esce.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Stampa la directory corrente.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1057,7 +1064,7 @@ msgstr ""
 "  --no-print-directory        Disattiva l'opzione -w, anche se era stata "
 "attivata implicitamente.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1065,7 +1072,7 @@ msgstr ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Considera il FILE come nuovo di zecca.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1073,27 +1080,28 @@ msgstr ""
 "  --warn-undefined-variables  Avvisa quando viene referenziata una variabile "
 "non definita.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "una stringa vuota non è valida come nome di file"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
-msgstr "livello di debug specificato sconosciuto \"%s\""
+msgstr "livello di debug specificato sconosciuto «%s»"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
-msgstr "tipo di output-sync (sincronizzazione dell'output) sconosciuto \"%s\""
+msgstr "tipo di output-sync (sincronizzazione dell'output) sconosciuto «%s»"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 "%s: catturata una interruzione/eccezione (codice = 0x%lx, indirizzo = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1108,141 +1116,152 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Violazione accesso: operazione di scrittura all'indirizzo 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Violazione accesso: operazione di lettura all'indirizzo 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() impostazione default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 "find_and_set_shell() impostazione del percorso di ricerca default_shell = "
 "%s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s viene sospeso per 30 secondi..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) eseguito. Continuazione.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
-"attenzione: jobserver non disponibile, viene usato -j1. Aggiungere \"+\" "
-"alla regola make superiore."
+"attenzione: jobserver non disponibile, viene usato -j1. Aggiungere «+» alla "
+"regola make superiore."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
-"attenzione: -jN forzata nel submake: disattivazione della modalità jobserver."
+"attenzione: -j%d forzata nel submake: disattivazione della modalità "
+"jobserver."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Il Makefile dallo standard input è stato specificato due volte."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (file temporaneo)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (file temporaneo)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"attenzione: -j%d forzata nel submake: disattivazione della modalità "
+"jobserver."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "I processi paralleli (-j) non sono supportati su questa piattaforma."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Reimpostazione alla modalità a singolo processo (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Collegamenti simbolici non supportati: opzione -L disabilitata."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Aggiornamento dei makefile....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
-"Il makefile \"%s\" potrebbe entrare in un ciclo all'infinito; make non "
+"Il makefile «%s» potrebbe entrare in un ciclo all'infinito; make non "
 "rieseguito.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
-msgstr "Riesecuzione del makefile \"%s\" non riuscita."
+msgstr "Riesecuzione del makefile «%s» non riuscita."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
-msgstr "Il makefile \"%s\" incluso non è stato trovato."
+msgstr "Il makefile «%s» incluso non è stato trovato."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
-msgstr "Il makefile \"%s\" non è stato trovato"
+msgstr "Il makefile «%s» non è stato trovato"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Impossibile ritornare alla directory originale."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Riesecuzione[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (file temporaneo): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL contiene più di un obiettivo"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Nessun obiettivo specificato e nessun makefile trovato"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Nessun obiettivo"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Nessun obiettivo specificato e nessun makefile trovato"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Aggiornamento degli obiettivi....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "attenzione: rilevato un tempo alterato. La creazione potrebbe essere "
 "incompleta."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Uso: %s [opzioni] [obiettivo] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1251,7 +1270,7 @@ msgstr ""
 "\n"
 "Questo programma è stato compilato per %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1260,32 +1279,32 @@ msgstr ""
 "\n"
 "Questo programma è stato compilato per %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Segnalare i bug a <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
-msgstr "l'opzione \"%s%s\" richiede un argomento stringa non vuoto"
+msgstr "l'opzione «%s%s» richiede un argomento stringa non vuoto"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
-msgstr "l'opzione \"-%c\" richiede un argomento intero positivo"
+msgstr "l'opzione «-%c» richiede un argomento intero positivo"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sCompilato per %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sCompilato per %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1299,7 +1318,7 @@ msgstr ""
 "ridistribuirlo.\n"
 "%s Non c'è ALCUNA GARANZIA, per quanto consentito dalle vigenti normative.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1308,7 +1327,7 @@ msgstr ""
 "\n"
 "# Generazione del database delle informazioni, creato il %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1317,511 +1336,536 @@ msgstr ""
 "\n"
 "# Generazione del database completata il %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Errore %d sconosciuto"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: utente %lu (reale %lu), gruppo %lu (reale %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Accesso inizializzato"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Accesso utente"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Accesso make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Accesso processo figlio"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: ingresso in una directory sconosciuta\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: uscita dalla directory sconosciuta\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
-msgstr "%s: ingresso nella directory \"%s\"\n"
+msgstr "%s: ingresso nella directory «%s»\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
-msgstr "%s: uscita dalla directory \"%s\"\n"
+msgstr "%s: uscita dalla directory «%s»\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: ingresso in una directory sconosciuta\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: uscita dalla directory sconosciuta\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
-msgstr "%s[%u]: ingresso nella directory \"%s\"\n"
+msgstr "%s[%u]: ingresso nella directory «%s»\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
-msgstr "%s[%u]: uscita dalla directory \"%s\"\n"
+msgstr "%s[%u]: uscita dalla directory «%s»\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
-msgstr "errore in scrittura: %s"
+msgstr "errore in scrittura: stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Arresto.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[TIPO] (--output-sync[=TIPO]) non è configurato per questa versione."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "creazione della pipe dei processi"
 
-#: posixos.c:72 posixos.c:227
-#, fuzzy
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
-msgstr "creazione della pipe dei processi"
+msgstr "beffa della pipe dei processi"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "inizializzazione nella pipe della modalità jobserver"
 
-#: posixos.c:90
-#, fuzzy, c-format
+#: src/posixos.c:119
+#, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
-msgstr "errore interno: stringa illecita per --jobserver-fds \"%s\""
+msgstr "errore interno: stringa illecita per --jobserver-auth «%s»"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Client del jobserver (fds %d,%d)\n"
 
-#: posixos.c:109
-#, fuzzy
+#: src/posixos.c:138
 msgid "jobserver pipeline"
-msgstr "inizializzazione nella pipe della modalità jobserver"
+msgstr "jobserver pipeline"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "scrittura del jobserver"
 
-#: posixos.c:268
-#, fuzzy
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "job server spento"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
-msgstr "lettura della pipe dei processi"
+msgstr "pselect della pipe dei processi"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "lettura della pipe dei processi"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Lettura dei makefile...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
-msgstr "Lettura del makefile \"%s\""
+msgstr "Lettura del makefile «%s»"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (nessun obiettivo predefinito)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (percorso di ricerca)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (ignora)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
-msgstr " (nessuna espansione per \"~\")"
+msgstr " (nessuna espansione per «~»)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
-msgstr "UTF-8 BOM nel makefile \"%s\" saltato\n"
+msgstr "UTF-8 BOM nel makefile «%s» saltato\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "UTF-8 BOM nel makefile buffer saltato\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "sintassi illecita nel condizionale"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: caricamento non riuscito"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "il set di istruzioni inizia prima del primo obiettivo"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "regola mancante prima del set di istruzioni"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
-msgstr " (si intendeva TAB invece di 8 spazi?)"
+msgstr "separatore mancante (si intendeva TAB invece di 8 spazi?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "separatore %s mancante"
+msgstr "separatore mancante"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "modello mancante per l'obiettivo"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "modelli multipli per l'obiettivo"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
-msgstr "il modello dell'obiettivo non contiene alcun \"%%\""
+msgstr "il modello dell'obiettivo non contiene alcun «%%»"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
-msgstr "\"endif\" mancante"
+msgstr "«endif» mancante"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "nome vuoto della variabile"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
-msgstr "testo non pertinente dopo la direttiva \"define\""
+msgstr "testo non pertinente dopo la direttiva «define»"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
-msgstr "\"endef\" mancante, \"define\" non terminato"
+msgstr "«endef» mancante, «define» non terminato"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
-msgstr "testo non pertinente dopo la direttiva \"endef\""
+msgstr "testo non pertinente dopo la direttiva «endef»"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
-msgstr "testo non pertinente dopo la direttiva \"%s\""
+msgstr "testo non pertinente dopo la direttiva «%s»"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
-msgstr "\"%s\" non pertinente"
+msgstr "«%s» non pertinente"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
-msgstr "un solo \"else\" per condizionale"
+msgstr "un solo «else» per condizionale"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Definizione malformata della variabile specifica per l'obiettivo"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "i prerequisiti non possono essere definiti nei set di istruzioni"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "gli obbiettivi raggruppati devono fornire un set di istruzioni"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "regole del modello implicite e statiche miste"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "regole implicite e normali miste"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr ""
-"il \"%s\" dell'obiettivo non corrisponde al modello dell'obiettivo stesso"
+"il «%s» dell'obiettivo non corrisponde al modello dell'obiettivo stesso"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr "Il file dell'obiettivo \"%s\" contiene sia : che ::"
+msgstr "il file dell'obiettivo «%s» contiene sia : che ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr ""
-"l'obiettivo \"%s\" è stato fornito più di una volta nella stessa regola"
+msgstr "l'obiettivo «%s» è stato fornito più di una volta nella stessa regola"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
-msgstr ""
-"attenzione: sovrascrittura del set di istruzioni per l'obiettivo \"%s\""
+msgstr "attenzione: sovrascrittura del set di istruzioni per l'obiettivo «%s»"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr ""
-"attenzione: ignorato il set di istruzioni obsoleto per l'obiettivo \"%s\""
+"attenzione: ignorato il set di istruzioni obsoleto per l'obiettivo «%s»"
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
-msgstr "regole implicite e normali miste"
+msgstr "*** regole implicite e normali miste: sintassi deprecata"
+
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr ""
+"attenzione: sovrascrittura dell'appartenente al gruppo per l'obiettivo «%s»"
 
-#: read.c:2542
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr ""
 "attenzione: è stato rilevato il carattere NUL; il resto della riga viene "
 "ignorato"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
-msgstr "Nessuna operazione da eseguire per \"%s\"."
+msgstr "Nessuna operazione da eseguire per «%s»."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
-msgstr "\"%s\" è aggiornato."
+msgstr "«%s» è aggiornato."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
-msgstr "Pulizia del file \"%s\".\n"
+msgstr "Pulizia del file «%s».\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
-msgstr ""
-"%s Nessuna regola per generare l'obiettivo \"%s\", necessario per \"%s\"%s"
+msgstr "%s Nessuna regola per generare l'obiettivo «%s», necessario per «%s»%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
-msgstr "%s Nessuna regola per generare l'obiettivo \"%s\"%s"
+msgstr "%s Nessuna regola per generare l'obiettivo «%s»%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
-msgstr "Considerato il file obiettivo \"%s\".\n"
+msgstr "Considerato il file obiettivo «%s».\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
-msgstr "Tentativo recente di aggiornamento del file \"%s\" non riuscito.\n"
+msgstr "Tentativo recente di aggiornamento del file «%s» non riuscito.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
-msgstr "Il file \"%s\" è già stato esaminato.\n"
+msgstr "Il file «%s» è già stato esaminato.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
-msgstr "L'aggiornamento del file \"%s\" è ancora in corso.\n"
+msgstr "L'aggiornamento del file «%s» è ancora in corso.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
-msgstr "Aggiornamento del file \"%s\" terminato.\n"
+msgstr "Aggiornamento del file «%s» terminato.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
-msgstr "Il file \"%s\" non esiste.\n"
+msgstr "Il file «%s» non esiste.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
-"*** Attenzione: il file .LOW_RESOLUTION_TIME \"%s\" ha una marcatura "
-"temporale ad alta risoluzione"
+"*** Attenzione: il file .LOW_RESOLUTION_TIME «%s» ha una marcatura temporale "
+"ad alta risoluzione"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
-msgstr "Trovata una regola implicita per \"%s\".\n"
+msgstr "Trovata una regola implicita per «%s».\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
-msgstr "Nessuna regola implicita trovata per \"%s\".\n"
+msgstr "Nessuna regola implicita trovata per «%s».\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
-msgstr "Uso del set di istruzioni predefinito per \"%s\".\n"
+msgstr "Uso del set di istruzioni predefinito per «%s».\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Dipendenza circolare %s <- %s scartata."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
-msgstr "Prerequisiti del file obiettivo \"%s\" terminati.\n"
+msgstr "Prerequisiti del file obiettivo «%s» terminati.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
-msgstr "Generazione dei prerequisiti di \"%s\" in corso.\n"
+msgstr "Generazione dei prerequisiti di «%s» in corso.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
-msgstr "Abbandono sul file obiettivo \"%s\".\n"
+msgstr "Abbandono sul file obiettivo «%s».\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
-msgstr "L'obiettivo \"%s\" non è stato rigenerato a causa di errori."
+msgstr "L'obiettivo «%s» non è stato rigenerato a causa di errori."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
-msgstr "Il prerequisito \"%s\" è solo per l'obiettivo \"%s\".\n"
+msgstr "Il prerequisito «%s» è solo per l'obiettivo «%s».\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
-msgstr "Il prerequisito \"%s\" dell'obiettivo \"%s\" non esiste.\n"
+msgstr "Il prerequisito «%s» dell'obiettivo «%s» non esiste.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
-msgstr "Il prerequisito \"%s\" è più nuovo di quello dell'obiettivo \"%s\".\n"
+msgstr "Il prerequisito «%s» è più nuovo di quello dell'obiettivo «%s».\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
-msgstr ""
-"Il prerequisito \"%s\" è più vecchio di quello dell'obiettivo \"%s\".\n"
+msgstr "Il prerequisito «%s» è più vecchio di quello dell'obiettivo «%s».\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
-msgstr ""
-"L'obiettivo \"%s\" è \"doppio due punti\" e non ha alcun prerequisito.\n"
+msgstr "L'obiettivo «%s» è \"doppio due punti\" e non ha alcun prerequisito.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
-"Nessun set di istruzioni per \"%s\" e nessun prerequisito effettivamente "
+"Nessun set di istruzioni per «%s» e nessun prerequisito effettivamente "
 "cambiato.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
-msgstr "Generazione di \"%s\" a causa del flag \"always-make\".\n"
+msgstr "Generazione di «%s» a causa del flag \"always-make\".\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
-msgstr "Non è necessario rigenerare l'obiettivo \"%s\""
+msgstr "Non è necessario rigenerare l'obiettivo «%s»"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
-msgstr "; uso del nome VPATH \"%s\""
+msgstr "; uso del nome VPATH «%s»"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
-msgstr "L'obiettivo \"%s\" deve essere rigenerato.\n"
+msgstr "L'obiettivo «%s» deve essere rigenerato.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
-msgstr "  nome VPATH \"%s\" ignorato.\n"
+msgstr "  Nome VPATH «%s» ignorato.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
-msgstr "Esecuzione del set di istruzioni per \"%s\" in corso.\n"
+msgstr "Esecuzione del set di istruzioni per «%s» in corso.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
-msgstr "Rigenerazione del file obiettivo \"%s\" non riuscita.\n"
+msgstr "Rigenerazione del file obiettivo «%s» non riuscita.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
-msgstr "File obiettivo \"%s\" rigenerato correttamente.\n"
+msgstr "File obiettivo «%s» rigenerato correttamente.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr ""
-"Il file obiettivo \"%s\" necessita di essere rigenerato con l'opzione -q.\n"
+"Il file obiettivo «%s» necessita di essere rigenerato con l'opzione -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
-msgstr "Uso dei comandi predefiniti per \"%s\".\n"
-
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Attenzione: il file \"%s\" ha un orario di modifica nel futuro"
+msgstr "Uso dei comandi predefiniti per «%s».\n"
 
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
-msgstr "Attenzione: il file \"%s\" ha un orario di modifica %s nel futuro"
+msgstr "Attenzione: il file «%s» ha un orario di modifica %s nel futuro"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
-msgstr "l'elemento .LIBPATTERNS \"%s\" non è un modello"
+msgstr "l'elemento .LIBPATTERNS «%s» non è un modello"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Le personalizzazioni non verranno esportate: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1829,7 +1873,7 @@ msgstr ""
 "\n"
 "# Regole implicite"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1837,181 +1881,177 @@ msgstr ""
 "\n"
 "# Regole non implicite."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u regole implicite, %u"
+"# %u regole implicite, %u (%.1f%%) terminale."
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminale."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BUG: num_pattern_rules è errato!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "segnale sconosciuto"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Chiusura"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Interruzione"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Uscita (con core dump)"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Istruzione illecita"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Rilevato trace/breakpoint"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Annullato"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Rilevato IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Rilevato EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Eccezione in virgola mobile"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Ucciso"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Errore di bus"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Errore di segmentazione"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Chiamata di sistema errata"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Pipe interrotta"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Sveglia"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Terminato"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Segnale 1 definito dall'utente"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Segnale 2 definito dall'utente"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Processo figlio uscito"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Mancanza di alimentazione elettrica"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Fermato (da terminale)"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Fermato (input tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Fermato (output tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Fermato"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Limite di tempo CPU superato"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Superato il limite di dimensione file"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Timer virtuale terminato"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Timer di profiling terminato"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Finestra modificata"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Continuato"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Condizioni di I/O urgente"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O consentito"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Risorsa persa"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Segnale di pericolo"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Richiesta informazioni"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Co-processore a virgola mobile non disponibile"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -2020,7 +2060,7 @@ msgstr ""
 "\n"
 "%s buffer strcache assenti\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2031,27 +2071,27 @@ msgstr ""
 "%s buffer strcache: %lu (%lu) / stringhe = %lu / memorizzazione = %lu B / "
 "media = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s buffer corrente: dimensione = %hu B / usato = %hu B / count = %hu / media "
-"= %hu B\n"
+"%s buffer corrente: dimensione = %hu B / usato = %hu B / numero = %hu / "
+"media = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s altra usata: totale = %lu B / count = %lu / media = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s altra libera: totale = %lu B / max = %lu B / min = %lu B / media = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2060,7 +2100,7 @@ msgstr ""
 "\n"
 "%s prestazioni strcache: lookups = %lu / hit rate = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2068,44 +2108,44 @@ msgstr ""
 "# statistiche della tabella hash:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatico"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "predefinito"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "ambiente"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "ambiente con l'opzione -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "riga di comando"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "direttiva \"override\""
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
-msgstr " (da \"%s\", riga %lu)"
+msgstr " (da «%s», riga %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# statistiche tabella di hash del set di variabili:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2113,15 +2153,15 @@ msgstr ""
 "\n"
 "# Variabili\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 "\n"
-"# Valori di variabile non specifici per il modello."
+"# Valori di variabile non specifici per il modello"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2129,58 +2169,58 @@ msgstr ""
 "\n"
 "# Nessun valore per la variabile \"pattern-specific\"."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 "\n"
-"# %u valori di variabile specifici per il modello."
+"# %u valori di variabile specifici per il modello"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
-msgstr "attenzione: variabile \"%.*s\" non definita"
+msgstr "attenzione: variabile «%.*s» non definita"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() non riuscita con %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-attenzione, potrebbe essere necessario riabilitare la gestione di CTRL+Y da "
 "DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "CD INTERNO %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
-msgstr ""
+msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Accoda output a %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Accoda %.*s e pulisce\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Verrà invece eseguito %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2188,151 +2228,66 @@ msgstr ""
 "\n"
 "# Percorsi di ricerca VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
-msgstr "# Percorsi di ricerca \"vpath\" assenti."
+msgstr "# Non ci sono percorsi di ricerca 'vpath'."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 "\n"
-"# %u 'vpath' percorsi di ricerca.\n"
+"# percorsi di ricerca 'vpath' %u.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 "\n"
-"# Percorso di ricerca non generale (variabile \"VPATH\")."
+"# Percorso di ricerca non generale (variabile «VPATH»)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 "\n"
-"# Percorso di ricerca generale (variabile \"VPATH\"):\n"
+"# Percorso di ricerca generale (variabile «VPATH»):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Slot del jobserver limitati a %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
-msgstr "Creazione del semaforo del jobserver: (Errore %ld: %s)"
+msgstr "creazione del semaforo del jobserver: (Errore %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
-"errore interno: impossibile aprire il semaforo del jobserver \"%s\": (Errore "
+"errore interno: impossibile aprire il semaforo del jobserver «%s»: (Errore "
 "%ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Client del jobserver (semaforo %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "rilascio del semaforo del jobserver: (Errore %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "attendere semaforo o processo figlio (Errore %ld: %s)"
-
-#~ msgid "%s: recipe for target '%s' failed"
-#~ msgstr "%s: set di istruzioni per l'obiettivo \"%s\" non riuscito"
-
-#~ msgid "%s[%s] Error 0x%x%s"
-#~ msgstr "%s[%s] Errore 0x%x%s"
-
-#~ msgid "%s[%s] %s%s%s"
-#~ msgstr "%s[%s] %s%s%s"
-
-#~ msgid "internal error: multiple --sync-mutex options"
-#~ msgstr "errore interno: opzioni multiple per --sync-mutex"
-
-#~ msgid "internal error: multiple --jobserver-fds options"
-#~ msgstr "errore interno: opzioni multiple per --jobserver-fds"
-
-#~ msgid "dup jobserver"
-#~ msgstr "jobserver duplicato"
-
-#~ msgid "virtual memory exhausted"
-#~ msgstr "memoria virtuale esaurita"
-
-#~ msgid "write error"
-#~ msgstr "errore in scrittura"
-
-#~ msgid "Warning: Empty redirection\n"
-#~ msgstr "Attenzione: redirezione vuota\n"
-
-#~ msgid "internal error: '%s' command_state"
-#~ msgstr "errore interno: command_state \"%s\""
-
-#~ msgid "BUILTIN [%s][%s]\n"
-#~ msgstr "[%s] INTERNO [%s]\n"
-
-#~ msgid "BUILTIN RM %s\n"
-#~ msgstr "RM INTERNO %s\n"
-
-#~ msgid "Unknown builtin command '%s'\n"
-#~ msgstr "Comando interno \"%s\" sconosciuto\n"
-
-#~ msgid "Error, empty command\n"
-#~ msgstr "Errore, comando vuoto\n"
-
-#~ msgid "Redirected input from %s\n"
-#~ msgstr "Input rediretto da %s\n"
-
-#~ msgid "Redirected error to %s\n"
-#~ msgstr "Errore rediretto a %s\n"
-
-#~ msgid "Redirected output to %s\n"
-#~ msgstr "Output rediretto a %s\n"
-
-#~ msgid "Error spawning, %d\n"
-#~ msgstr "Errore nella generazione, %d\n"
-
-#~ msgid "#  Invalid value in 'update_status' member!"
-#~ msgstr "#  Valore illecito nel membro \"update_status\"!"
-
-#~ msgid "unknown trace mode '%s'"
-#~ msgstr "modo di tracciamento \"%s\" sconosciuto"
-
-#~ msgid "*** [%s] Error 0x%x (ignored)"
-#~ msgstr "*** [%s] Errore 0x%x (ignorato)"
-
-#~ msgid "Invoking recipe from %s:%lu to update target `%s'.\n"
-#~ msgstr ""
-#~ "Chiamata del set di istruzioni da %s:%lu per aggiornare l'obiettivo \"%s"
-#~ "\".\n"
-
-#~ msgid "Invoking builtin recipe to update target `%s'.\n"
-#~ msgstr ""
-#~ "Chiamata del set di istruzioni interno per aggiornare l'obiettivo \"%s"
-#~ "\".\n"
-
-#~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n"
-#~ msgstr "%s # di buffer strcache: %d (* %d B/buffer = %d B)\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "# strcache hash-table stats:\n"
-#~ "# "
-#~ msgstr ""
-#~ "\n"
-#~ "# statistiche tabella hash di strcache:\n"
-#~ "# "
index a14961c9286c075980d612b99feab0abe630e73f..a9264d80a897859b987b1b572e5943fbc7557787 100644 (file)
Binary files a/po/ja.gmo and b/po/ja.gmo differ
index 1089c3f8420c79ae3589d1a6c9577a3adef4de46..8889d154374ae0ae97dbb8da1132ac173a38bf46 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
-# Japanese message catalog for make 4.2
+# Japanese message catalog for make
 # Copyright (C) 2001 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 # Daisuke Yamashita <yamad@mb.infoweb.ne.jp>, 2001.
 #             Thanks to NISHIJIMA Takanori
 # GOTO Masanori <gotom@debian.or.jp>, 2003-2004.
-# Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>, 2011, 2014, 2016.
+# Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>, 2011, 2014, 2016, 2019, 2020.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-24 22:45+0900\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 21:11+0900\n"
 "Last-Translator: Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
 "Language: ja\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Basepath: /factory/ja-po/make/make-4.1.90\n"
-"X-Generator: Poedit 1.8.7.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 2.2.1\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "サポートされていない機能を使おうとしています: '%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "VMS では書庫のメンバを touch する機能がありません"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: 書庫 '%s' がありません"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "'%s' は有効な書庫ではありません"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: メンバ '%s' は '%s' 内に存在しません"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: '%s' への ar_member_touch から異常な値が返りました"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() がモジュール情報の抽出に失敗しました. 状態 = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() が失敗しました. 状態 = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "ライブラリ '%s' を開けないため, メンバのステータス %d が検索できません"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "メンバ '%s'%s: %ld バイト at %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (名前が切り詰められたかも)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  日付 %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "レシピの行数が多すぎます (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** 中断.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] 書庫のメンバ '%s' は多分偽物です ― 削除しませんでした"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** 書庫のメンバ '%s' は多分偽物です ― 削除しませんでした"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] ファイル '%s' を削除します"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** ファイル '%s' を削除します"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  実行するレシピ"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (ビルトイン):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (ファイル '%s', %lu 行目):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -134,218 +135,218 @@ msgstr ""
 "\n"
 "# ディレクトリ\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: 状態を調べられませんでした.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (key %s, mtime %ull): 開けませんでした.\n"
+msgstr "# %s (key %s, mtime %I64u): 開けませんでした.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (device %d, inode [%d,%d,%d]): 開けませんでした.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (device %ld, inode %ld): 開けませんでした.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (key %s, mtime %ull): "
+msgstr "# %s (key %s, mtime %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (device %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (device %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "0"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " 個のファイル, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "0"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " 個の適用不能ファイル名"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " (ここまでに)."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " 個の適用不能ファイル名 (%lu 個のディレクトリ内).\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "再帰的変数 '%s' が(最終的に)それ自身を参照しています"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "終端のない変数参照"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "ファイル '%s' のためののレシピが %s:%lu で指定されました,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "ファイル '%s' のためのレシピが暗黙ルールの探索で見つかりました,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "しかし今は '%s' と '%s' は同じファイルと見なされます."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "'%s' のためのレシピは, '%s' のためのものを優先するため無視されます."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "シングルコロン '%s' からダブルコロン '%s' に名前を変えられません"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "ダブルコロン '%s' からシングルコロン '%s' に名前を変えられません"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** 中間ファイル '%s' を削除します"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "中間ファイルを削除しています...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "現在時刻"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: タイムスタンプが範囲外です -- 代りに %s とします"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# ターゲットではありません:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  特別扱いのファイル (.PRECIOUS の必要条件)"
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  疑似ターゲット (.PHONY の必要条件)"
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  コマンドラインターゲット."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  デフォルトまたは MAKEFILES, -include/sinclude Makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "# ビルトインルール"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  暗黙ルールの探索が行われました."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  暗黙ルールの探索は行われませんでした."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  暗黙/静的パターン語幹: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  ファイルは中間必要条件です."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  さらに make:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  修正時刻がチェックされることはありません."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  ファイルが存在しません."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  ファイルが非常に古いです."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  最終修正 %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  ファイルは更新されています."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  ファイルは更新されていません."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  レシピを現在実行中です (*これはバグです*)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  依存関係レシピを実行中です (*これはバグです*)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  更新に成功しました."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  更新が必要です (-q がセットされています)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  更新に失敗しました."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  'command_state' メンバに無効な値です!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -353,7 +354,7 @@ msgstr ""
 "\n"
 "# ファイル"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -363,334 +364,342 @@ msgstr ""
 "# ファイルハッシュテーブルの状態:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: フィールド '%s' はキャッシュされていません: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "非数値の第1引数が 'word' 関数に与えられました"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "'word' 関数への第1引数は 0 より大きくなければなりません"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "非数値の第1引数が 'wordlist' 関数に与えられました"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "非数値の第2引数が 'wordlist' 関数に与えられました"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) が失敗 (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) が失敗 (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() が失敗 (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe (): process_init_fd() が失敗\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "一時的なバッチファイル %s を消去します\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file: ファイル名が指定されていません"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file: 引数が多すぎます"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "file: 無効なファイル操作: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "引数の数(%d)が関数 '%s' にとって不十分です"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "このプラットフォームでは実装されていません: 関数 '%s'"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "終端がない関数呼び出し '%s': '%c' がありません"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "空の関数名"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "無効な関数名: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "関数名が長すぎます: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "引数個数指定(最小値;%u)が無効です: 関数 %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "引数個数指定(最大値;%u)が無効です: 関数 %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: オプション '%s' は短すぎて正しく判別できません\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: オプション '--%s' は引数を取ることができません\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: オプション '%c%s' は引数を取ることができません\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: オプション '%s' には引数が1つ必要です\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: オプション '--%s' を認識できません\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: オプション '%c%s' を認識できません\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: 不正なオプション ― %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: 無効なオプション ― %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: オプションには引数が必要です ― %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: オプション '-W %s' は短すぎて正しく判別できません\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: オプション '-W %s' は引数を取ることができません\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: 展開中 '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: 評価中 '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 "ハッシュテーブル用 %lu バイトの割り当てに失敗しました: メモリを使い果たしまし"
 "た"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Load=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "負荷=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Rehash=%d, "
+msgid "Rehash=%u, "
+msgstr "再ハッシュ=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Collisions=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "衝突=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "'%s' のための暗黙ルールを探します.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "'%s' のための書庫メンバ暗黙ルールを探します.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "暗黙ルールの再帰を回避します.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "語幹が長すぎます: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "語幹が長すぎます: '%s%.*s'.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "語幹 '%.*s' とのパターンルールを試します.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "適用不能なルールの必要条件 '%s' を却下します.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "適用不能な暗黙の必要条件 '%s' を却下します.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "ルールの必要条件 '%s' を試します.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "暗黙の必要条件 '%s' を試します.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "VPATH '%2$s' として必要条件 '%1$s' を見つけました\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "中間ファイル '%s' のルールを探します.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "一時ファイルを作成できません\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (コアダンプしました)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (無視されました)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<ビルトイン>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] エラー %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** 未完了のジョブを待っています...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "生存子プロセス %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (リモート)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "失敗した子プロセス %p PID %s %s を回収します\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "成功した子プロセス %p PID %s %s を回収します\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "失敗した子プロセス %p PID %s %s を回収します\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "一時的なバッチファイル %s を消去します\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "一時的なバッチファイル %s の消去に失敗しました(%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "チェインから子プロセス %p PID %s%s を削除します.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "子プロセス %p (%s) の印を解放しました.\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() が失敗しプロセスが起動できませんでした (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -699,93 +708,87 @@ msgstr ""
 "\n"
 "起動の失敗で %d 個の引数がカウントされました\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "チェインに子プロセス %p (%s) PID %s%s を取り込みました.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "子プロセス %p (%s) に印をつけました.\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: ターゲット '%s' が存在しません"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: ターゲット '%s' を %s のために更新します"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "このオペレーティングシステムではシステム負荷制限を加えられません"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "システム負荷制限を課すことができませんでした: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "ファイルハンドルを使い尽くしました: 標準入力を複製できません\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "ファイルハンドルを使い尽くしました: 標準出力を複製できません\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "ファイルハンドルを使い尽くしました: 標準エラー出力を複製できません\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "標準入力を復元できませんでした\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "標準出力を復元できませんでした\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "標準エラー出力を復元できませんでした\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make は pid %s の子プロセスを回収し, pid %s を待ち続けます\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: コマンドが見つかりませんでした\n"
-
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: コマンドが見つかりませんでした\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: シェルプログラムが見つかりませんでした"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe:環境設定のためのメモリを使い尽くすかもしれません"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL が変更されました (前は '%s', 今は '%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "一時的なバッチファイル %s を作成します\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -793,7 +796,7 @@ msgstr ""
 "バッチファイルの内容:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -802,57 +805,54 @@ msgstr ""
 "バッチファイルの内容 :%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (%d 行目) 不正なシェルコンテキスト (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "このビルドでは -O[TYPE] (--output-sync[=TYPE]) が設定されていません."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "グローバルシンボルテーブルを開くことができません: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "読み込んだオブジェクト %s は GPL互換の宣言がなされていません"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "シンボル %s を %s から読み込むのに失敗しました: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "空のシンボル名を読み込もうとしています: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "シンボル %s を %s から読み込んでいます\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "'load' 命令はこのプラットフォームでサポートされません."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "オプション:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      互換性のためのもので, 無視される.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           無条件に全ターゲットを make する.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -861,16 +861,16 @@ msgstr ""
 "                              make 開始前にディレクトリ DIRECTORY へ移動す"
 "る.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          デバッグ情報を大量に表示する.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr "  --debug[=FLAGS]             様々なタイプのデバッグ情報を表示する.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -878,12 +878,12 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              環境変数が makefile 中の記述に優先する\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
-msgstr "  --eval=STRING               STRING を makefile の文として評価する.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E STRING, --eval=STRING    STRING を makefile の文として評価する.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -891,15 +891,15 @@ msgstr ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              FILE を makefile として読み込む\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  このメッセージを表示して終了する.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         レシピから返ったエラーを無視する.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -909,7 +909,7 @@ msgstr ""
 "                              インクルードする makefile を探索する "
 "DIRECTORY.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -917,14 +917,14 @@ msgstr ""
 "  -j [N], --jobs[=N]          一度に N 個までのジョブを許可; 無引数だとジョブ"
 "数制限なし.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            あるターゲットが make できなくても実行を続け"
 "る.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -934,7 +934,7 @@ msgstr ""
 "                              負荷 が N 未満でない限り複数のジョブを開始しな"
 "い.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -942,7 +942,7 @@ msgstr ""
 "  -L, --check-symlink-times   シンボリックリンクとターゲットの中で一番新しい "
 "mtime を使う.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -951,7 +951,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              レシピを実際に実行しない; 表示するのみ.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -961,7 +961,7 @@ msgstr ""
 "                              FILE をとても古いものと見なして, 再 make しな"
 "い.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -969,11 +969,11 @@ msgstr ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              並列ジョブの出力を TYPE で揃える.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       make の内部データベースを表示する.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -981,19 +981,25 @@ msgstr ""
 "  -q, --question              レシピを実行しない; 更新済であるかどうかを終了"
 "ステータスで通知.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      ビルトインの暗黙ルールを無効にする.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  ビルトインの変数設定を無効にする.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       レシピを表示しない.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 レシピをエコーする ( --silent mode は無効にな"
+"る).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1001,26 +1007,26 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              -k オプションをオフにする.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 ターゲットを再 make する代わりにタッチする.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     トレース情報を表示する.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               make のバージョン番号を表示して終了する.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       カレントディレクトリを表示する.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1028,7 +1034,7 @@ msgstr ""
 "  --no-print-directory        -w をオフにする. 暗黙に有効な場合でもオフにす"
 "る.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1036,33 +1042,34 @@ msgstr ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              FILE をいつでも最新として見なす.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 "  --warn-undefined-variables  未定義の変数が参照されたときに警告を発する.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "空の文字列はファイル名としては無効です"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "不明なデバッグレベル指定 '%s'"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "未知の出力同期型 '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: 割り込み/例外を捕捉しました (code = 0x%lx, addr = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1077,135 +1084,144 @@ msgstr ""
 "例外フラグ = %lx\n"
 "例外アドレス = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "アクセス保護違反: アドレス 0x%p での書き込み操作\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "アクセス保護違反: アドレス 0x%p での読み込み操作\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() は default_shell = %s に設定します\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell() パス探索で default_shell = %s にセットしました\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s は 30 秒間停止します..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) が終わりました. 続けます.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "警告: jobserver が利用不可: 今回は -j1 を使います. 親 make ルールに `+' を追"
 "加しましょう."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
-"警告: 副次 make で -jN を強制指定しました: jobserver モードを無効にします."
+"警告: 副次 make で -j%d を強制指定しました: jobserver モードをリセットします."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "標準入力からの makefile が二回指定されました."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (一時ファイル)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (一時ファイル)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"警告: makefile で -j%d を強制指定しました: jobserver モードをリセットします."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "並列ジョブ (-j) はこのプラットフォームでサポートされません."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "単一ジョブ (-j1) モードにリセットします."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "シンボリックリンクはサポートされていません: -L は無効です."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "makefile の更新中....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "makefile '%s' 自己再帰のおそれあり ― 再make しません.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "makefile '%s' の再makeに失敗しました."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "インクルードされる makefile '%s' が見つかりませんでした."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "makefile '%s' が見つかりませんでした"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "元のディレクトリに戻れませんでした."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "再実行します[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (一時ファイル): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL が二つ以上のターゲットを含んでいます"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "ターゲットが指定されておらず, makefile も見つかりません"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "ターゲットがありません"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "ターゲットが指定されておらず, makefile も見つかりません"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "最終ターゲットを更新中....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr "警告:  時刻のずれを検出. 不完全なビルド結果になるかもしれません."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "使い方: %s [オプション] [ターゲット] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1214,7 +1230,7 @@ msgstr ""
 "\n"
 "このプログラムは %s 用にビルドされました\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1223,32 +1239,32 @@ msgstr ""
 "\n"
 "このプログラムは %s (%s) 用にビルドされました\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "バグレポートは <bug-make@gnu.org> まで.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "'%s%s' オプションは空でない文字列引数を要求します"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "'-%c' オプションは正の整数引数を要求します"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sこのプログラムは %s 用にビルドされました\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sこのプログラムは %s (%s) 用にビルドされました\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1261,7 +1277,7 @@ msgstr ""
 "%sこれはフリーソフトウェアです: 自由に変更および配布できます.\n"
 "%s法律の許す限り、 無保証 です.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1270,7 +1286,7 @@ msgstr ""
 "\n"
 "# Make データベース出力 %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1279,345 +1295,381 @@ msgstr ""
 "\n"
 "# Make データベース終了 %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "未知のエラー %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: ユーザ %lu (実効 %lu), グループ %lu (実効 %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "アクセス権限を初期化"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "ユーザアクセス"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "make アクセス"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "子プロセスアクセス"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: ディレクトリ(ディレクトリ名不明)に入ります\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: ディレクトリ(ディレクトリ名不明)から出ます\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: ディレクトリ '%s' に入ります\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: ディレクトリ '%s' から出ます\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: ディレクトリ(ディレクトリ名不明)に入ります\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: ディレクトリ(ディレクトリ名不明)から出ます\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: ディレクトリ '%s' に入ります\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: ディレクトリ '%s' から出ます\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "書き込みエラー: 標準出力"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  中止.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "このビルドでは -O[TYPE] (--output-sync[=TYPE]) が設定されていません."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "ジョブパイプ作成中"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "ジョブパイプ複製中"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "jobserver パイプの初期化"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "内部エラー: 無効な --jobserver-auth 文字列 '%s'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "jobserver クライアント (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "jobserver パイプライン"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "ジョブサーバへの write"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "ジョブサーバーがシャットダウンしました"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "ジョブのパイプの pselect"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "ジョブのパイプの read"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "makefile を読み込みます...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "makefile '%s' の読み込み中"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (デフォルトの最終ターゲットがありません)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (探索パス)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (気にしなくてよい)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (~ の展開なし)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "makefile '%s' の中の UTF-8 BOM をスキップします\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "makefile バッファの中の UTF-8 BOM をスキップします\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "条件部の文法が無効です"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: 読み込みに失敗しました"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "最初のターゲットより前にレシピがあります"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "レシピの前のルールが不足しています"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "分離記号を欠いています (8 個の空白でしたが, TAB のつもりでしたか?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "分離記号を欠いています"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "ターゲットパターンを欠いています"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "複数のターゲットパターンです"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "ターゲットパターンが '%%' を含んでいません"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "'endif' が欠落しています"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "空の変数名"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "'define' 疑似命令の後ろに無関係な文字列があります"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "'endef' を欠いており, 'define' が終了していません"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "'endef' 疑似命令の後ろに無関係な文字列があります"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "'%s' 疑似命令の後ろに無関係な文字列があります"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "無関係な '%s'"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "一つの条件部につき一つしか 'else' を使えません"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "ターゲット特有の変数定義が異常です"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "必要条件をレシピ内で定義できません"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "グループ化したターゲットはレシピを供給する必要があります"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "暗黙ルールと静的パターンルールが混ざりました"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "暗黙ルールと通常ルールが混ざりました"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "ターゲット '%s' はターゲットパターンと一致しません"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "ターゲットファイル '%s' が : と :: 項目の両方を持っています"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "ターゲット '%s' が同一ルール内で複数回与えられました"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "警告: ターゲット '%s' のためのレシピを置き換えます"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "警告: ターゲット '%s' のための古いレシピは無視されます"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** 暗黙ルールと通常ルールが混ざりました: 推奨されない文法"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "警告: ターゲット '%s' のグループメンバーシップを上書きします"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "警告: NUL 文字があります; 行の残りは無視されます"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "'%s' に対して行うべき事はありません."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "'%s' は更新済みです."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "ファイル '%s' の依存関係を整理しています.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
 "%1$s'%3$s' に必要なターゲット '%2$s' を make するルールがありません%4$s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sターゲット '%s' を make するルールがありません%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "ファイル '%s' を検討しています.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "最近ファイル '%s' の更新を試して失敗しています.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "ファイル '%s' は検討済みです.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "ファイル '%s' の更新をしています.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "ファイル '%s' の更新が終了しました.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "ファイル '%s' が存在しません.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1625,147 +1677,147 @@ msgstr ""
 "*** 警告: .LOW_RESOLUTION_TIME ファイル '%s' が高解像度タイムスタンプを持って"
 "います"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "'%s' のための暗黙ルールを見つけました.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "'%s' のための暗黙ルールがありません.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "'%s' 用のデフォルトレシピを使用します.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "循環 %s <- %s 依存関係が破棄されました."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "ターゲットファイル '%s' の必要条件を満たしました.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "'%s' の必要条件を make します.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "ターゲットファイル '%s' を諦めます.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "ターゲット '%s' はエラーにより 再make できませんでした."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "必要条件 '%s' はターゲット '%s' の order-only(順序決定条件)です.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "ターゲット '%2$s' の必要条件 '%1$s' が存在しません.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "必要条件 '%s' はターゲット '%s' よりも新しい.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "必要条件 '%s' はターゲット '%s' よりも古い.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "ターゲット '%s' はダブルコロンで, かつ必要条件を持たない.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "'%s' のためのレシピが無く, 必要条件は実際には変更されませんでした.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "always-make フラグが立っているので '%s' を make します.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "ターゲット '%s' を再make する必要はありません"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; VPATH 名 '%s' を使用します"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "ターゲット '%s' を再make する必要があります.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  VPATH 名 '%s' を無視します.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "'%s' のレシピを実行中です.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "ターゲットファイル '%s' の再make に失敗しました.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "ターゲットファイル '%s' の再 make に成功しました.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "ターゲットファイル '%s' は -q オプションを付けての再make が必要です.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "'%s' のためのデフォルトのコマンドを使います.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "警告: ファイル '%s' の修正時刻は未来のものです"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "警告: ファイル '%s' の修正時刻 %s は未来の時刻です"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS 要素 '%s' がパターンではありません"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs がエクスポートしてくれません: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1773,7 +1825,7 @@ msgstr ""
 "\n"
 "# 暗黙ルール"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1781,181 +1833,177 @@ msgstr ""
 "\n"
 "# 暗黙ルールなし."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u 個の暗黙ルール, %u"
+"# %u 個の暗黙ルール, %u (%.1f%%) 端末。"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " 以上."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "バグ: num_pattern_rules が間違っている!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "未知のシグナル"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "ハングアップ"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "割り込み"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "終了"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "不正なハードウェア命令"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "トレース/ブレイクポイントトラップ"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Abort しました"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT トラップ"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT トラップ"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "浮動小数点例外"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Kill されました"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "バスエラー"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "メモリ違反"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "不正なシステムコール"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "読み手のないパイプへの書き込み"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "アラームクロック"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "強制終了"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "ユーザ定義シグナル 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "ユーザ定義シグナル 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "子プロセス終了"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "電源障害"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "一時停止"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "一時停止 (tty 入力)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "一時停止 (tty 出力)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "一時停止 (シグナル)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU 時間が制限を越えました"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "ファイルサイズ制限を越えました"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "仮想タイマ満了"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "プロファイルタイマ満了"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "ウィンドウサイズ変更"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "再開されました"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "緊急 I/O 条件"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "入出力可能"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "リソースが失われました"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "危険シグナル"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "情報要求"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "浮動小数点コプロセッサが利用不能"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1964,7 +2012,7 @@ msgstr ""
 "\n"
 "%s strcache バッファはありません\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1975,27 +2023,27 @@ msgstr ""
 "%s strcache バッファ: %lu (%lu) / 文字列 = %lu / 格納 = %lu B / 平均 = %lu "
 "B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s 現在のバッファ: サイズ = %hu B / 使用中 = %hu B / 個数 = %hu / 平均 = %hu "
+"%s 現在のバッファ: サイズ = %hu B / 使用中 = %hu B / 個数 = %hu / 平均 = %u "
 "B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s その他 使用中: 合計 = %lu B / 個数 = %lu / 平均 = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s その他 未使用: 合計 = %lu B / 最大 = %lu B / 最小 = %lu B / 平均 = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2004,7 +2052,7 @@ msgstr ""
 "\n"
 "%s strcache の稼働: 探索 = %lu / ヒット率 = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2012,44 +2060,44 @@ msgstr ""
 "# ハッシュテーブルの状態:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "自動変数"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "デフォルト"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "環境変数"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile 変数"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "-e オプションで指定した環境変数"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "コマンドライン変数"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "'override' 疑似命令"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (ファイル '%s', %lu 行目)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# 変数セットのハッシュテーブルの状態:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2057,7 +2105,7 @@ msgstr ""
 "\n"
 "# 変数\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2065,7 +2113,7 @@ msgstr ""
 "\n"
 "# パターン指定 変数 値"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2073,7 +2121,7 @@ msgstr ""
 "\n"
 "# パターン指定変数の値なし."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2082,48 +2130,48 @@ msgstr ""
 "\n"
 "# %u 個のパターン指定変数の値"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "警告: 未定義の変数 '%.*s'"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() が %d で失敗しました\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-警告, DCL からの CTRL-Y 操作を再び有効にする必要があるかも知れません.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "ビルトイン CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "出力を %s へ追加\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "追加 %.*s と後片付け\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "代わりに %s を実行します\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2131,11 +2179,11 @@ msgstr ""
 "\n"
 "# VPATH 探索パス\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# 'vpath' 探索パスはありません."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2144,7 +2192,7 @@ msgstr ""
 "\n"
 "# %u つの 'vpath' 探索パス.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2152,7 +2200,7 @@ msgstr ""
 "\n"
 "# 一般の ('VPATH' 変数) 探索パスなし."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2162,37 +2210,61 @@ msgstr ""
 "# 一般の ('VPATH' 変数) 探索パス:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "jobserver のスロットは %d までです\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "ジョブサーバ セマフォを作成しています: (エラー %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr "内部エラー: ジョブサーバ セマフォを開けません '%s': (エラー %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "jobserver クライアント (セマフォ %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "ジョブサーバのセマフォを解放します: (エラー %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "セマフォ または 子プロセスを待っています: (エラー %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: コマンドが見つかりませんでした\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: コマンドが見つかりませんでした\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: シェルプログラムが見つかりませんでした"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s は 30 秒間停止します..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) が終わりました. 続けます.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "未知のエラー %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "警告: ファイル '%s' の修正時刻は未来のものです"
+
+#~ msgid " terminal."
+#~ msgstr " 以上."
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: ターゲット '%s' のレシピで失敗しました"
 
index e71932c509c6bd8986ab79024eed56ad4bda7f99..258d32aa114bab7472904031400657901bc30cd0 100644 (file)
Binary files a/po/ko.gmo and b/po/ko.gmo differ
index 0e0a7f01cc7868e054bcdabe88bde5e4b604437e..c0481ac4db57b6b03890cf214b56a20bae4687f3 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -3,7 +3,7 @@
 # This file is distributed under the same license as the make package.
 #
 # Bang Jun-Young <bangjy@nownuri.net>, 1996.
-# Changwoo Ryu <cwryu@debian.org>, 2001, 2006, 2013-2014, 2016.
+# Changwoo Ryu <cwryu@debian.org>, 2001, 2006, 2013-2014, 2016, 2019-2020.
 #
 # 용어
 # - recipe - 명령 (make의 action으로 실행할 명령어를 말함)
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU make 4.2\n"
+"Project-Id-Version: GNU make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-29 19:05+0900\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 23:07+0900\n"
 "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
 "Language-Team: Korean <translation-team-ko@googlegroups.com>\n"
 "Language: ko\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8-bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "지원되지 않는 기능을 사용하려고 함: '%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "아카이브 멤버 touch는 VMS에서 사용할 수 없습니다"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: '%s' 아카이브가 없습니다"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: '%s'은(는) 올바른 아카이브가 아닙니다"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: '%s' 멤버가 '%s' 안에 없습니다"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: '%s'에 대하여 ar_member_touch에서 실패 리턴 코드"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module()이 모듈정보를 추출하는 데 실패, 상태 = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control()이 실패, 상태 = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "멤버 상태 %2$d번을 참조하려고 '%1$s' 라이브러리를 열 수 없습니다"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "멤버 '%s'%s: %ld바이트, 위치 %ld (%ld).\n"
 
 # 이미 잘려진 이름을 표시하면서 이름이 잘려졌을 수도 있으니 유의하라는 뜻
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (이름이 잘려나갔을 수도 있습니다)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  날짜 %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, 모드 = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "명령어에 줄이 너무 많습니다(%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** 중지.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] 아카이브 '%s' 멤버는 가짜일 수 있으므로 삭제하지 않습니다"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** 아카이브 '%s' 멤버는 가짜일 수 있으므로 삭제하지 않습니다"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] '%s' 파일을 삭제합니다"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** '%s' 파일을 삭제합니다"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  실행할 명령어"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (내장):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " ('%s'에서, %lu번째 줄):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -140,221 +142,221 @@ msgstr ""
 "\n"
 "# 디렉터리\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: stat을 할 수 없었습니다.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (키 %s, 변경시각 %ull): 열 수 없습니다.\n"
+msgstr "# %s (키 %s, 변경시각  %I64u): 열 수 없습니다.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (장치 %d, 아이노드 [%d,%d,%d]): 열 수 없습니다.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (장치 %ld, 아이노드 %ld): 열 수 없습니다.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (키 %s, 변경시각 %ull): "
+msgstr "# %s (키 %s, 변경시각 %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (장치 %d, 아이노드 [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (장치 %ld, 아이노드 %ld): "
 
 # 여기서 No는 "No files"라고 쓰인다.  궁극적으로 msgid가 고쳐져야 함
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "0개"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " 파일, "
 
 # 여기서 no는 "no impossibilities"라고 쓰인다.  궁극적으로 msgid가 고쳐져야 함
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "0개"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " 불가능"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " 지금까지."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " 디렉토리 %lu개에서 불가능.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "재귀하는 '%s' 변수는 (결국) 자기 자신을 참조하고 있습니다"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "변수 참조에 끝마침이 없습니다"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "파일 '%s'의 %s:%lu에서 명령을 지정했습니다."
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "파일 '%s'에 대한 명령을 묵시적 규칙 탐색으로 찾았습니다."
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "하지만 '%s' 파일은 이제 '%s'과(와) 같은 파일로 간주합니다."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "'%s'에 대한 명령은 '%s'에 대한 명령이 우선하므로 무시합니다."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "단일 콜론 '%s'을(를) 이중 콜론 '%s'(으)로 이름을 바꿀 수 없습니다"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "이중 콜론 '%s'을(를) 단일 콜론 '%s'(으)로 이름을 바꿀 수 없습니다"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** 중간 파일 '%s'을(를) 삭제합니다"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "중간 파일을 제거합니다...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "현재 시각"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: 타임스탬프가 범위를 벗어나므로, %s을(를) 대체합니다"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# 타겟이 아님:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  프레시어스 파일 (.PRECIOUS의 선행조건)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  포니 타겟 (.PHONY의 선행조건)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  명령행 타겟."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr ""
 "#  기본 메이크파일, MAKEFILES 메이크파일, 또는 -include/sinclude 메이크파일."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  내장 규칙"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  묵시적 규칙 탐색이 완료되었습니다."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  묵시적 규칙 탐색이 완료되지 않았습니다."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  묵시적/고정 패턴 스템: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  파일이 중간단계의 선행조건입니다."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  다음도 만듭니다:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  변경 시각이 결코 검사되지 않았음."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  파일이 없습니다."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  파일이 매우 오래되었습니다."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  마지막 변경 %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  파일을 업데이트했습니다."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  파일을 업데이트하지 않았습니다."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  현재 실행중인 명령(이것은 버그입니다)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  현재 실행중인 의존성(이것은 버그입니다)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  성공적으로 업데이트."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  업데이트 필요(-q 설정됨)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  업데이트 실패."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  'command_status' 멤버에 값이 잘못되었습니다!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -362,7 +364,7 @@ msgstr ""
 "\n"
 "# 파일"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -372,336 +374,344 @@ msgstr ""
 "# 파일 해시 테이블 통계:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: '%s' 필드가 캐시에 없음: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "'word' 함수의 첫번째 인자가 숫자가 아닙니다"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "'word' 함수의 첫번째 인자는 0보다 커야 합니다"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "'wordlist' 함수의 첫번째 인자가 숫자가 아닙니다"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "'wordlist' 함수의 두번째 인자가 숫자가 아닙니다"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) 실패(e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) 실패(e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() 실패(e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() 실패\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "임시 배치 파일 %s을(를) 지웁니다\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file: 파일 이름이 없습니다"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file: 인자가 너무 많습니다"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "file: 올바르지 않은 파일 동작: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "함수 '%2$s'에 인자 갯수(%1$d)가 부족합니다"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "이 플랫폼에서는 구현되지 않았습니다: '%s' 함수"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "함수 '%s'에 대해 종료되지 않은 호출: '%c' 문자가 빠졌음"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "빈 함수 이름"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "잘못된 함수 이름: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "함수 이름이 너무 깁니다: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "함수 `%2$s'에 최소 인자 갯수(%1$u)가 잘못되었습니다"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "함수 `%2$s'에 최대 인자 갯수(%1$u)가 잘못되었습니다"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: '%s' 옵션은 애매한 옵션입니다\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: '--%s' 옵션은 인수를 허용하지 않습니다\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: '%c%s' 옵션은 인수를 허용하지 않습니다\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: '%s' 옵션은 인수가 필요합니다\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: 인식할 수 없는 옵션 '--%s'\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: 인식할 수 없는 옵션 '%c%s'\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: 잘못된 옵션 -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: 부적절한 옵션 -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: 이 옵션은 인수가 필요합니다 -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: '-W %s' 옵션은 애매한 옵션입니다\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: '-W %s' 옵션은 인수를 허용하지 않습니다\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: '%s' 확장\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: '%s' 해석\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "해시 테이블에 %lu 바이트를 할당할 수 없습니다: 메모리 바닥남"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "로드=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "로드=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "다시 해시=%d, "
+msgid "Rehash=%u, "
+msgstr "다시 해시=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "충돌=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "충돌=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "'%s'에 대한 묵시적 규칙을 찾고 있습니다.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "'%s'에 대한 아카이브멤버 묵시적 규칙을 찾고 있습니다.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "묵시적 규칙의 재귀를 피함.\n"
 
 # 스템(stem)이란 패턴 룰에서 prefix/suffix를 제외한 나머지를 말한다.
 # 예를 들어 `%.c'라는 패턴에 `hello.c'가 들어 맞았을 경우 stem은 `hello'이다.
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "스템이 너무 깁니다: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "스템이 너무 깁니다: '%s%.*s'.\n"
 
 # 스템(stem)이란 패턴 룰에서 prefix/suffix를 제외한 나머지를 말한다.
 # 예를 들어 `%.c'라는 패턴에 `hello.c'가 들어 맞았을 경우 stem은 `hello'이다.
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "'%.*s' 스템에서 패턴 규칙 시도.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "불가능한 규칙 선행조건 '%s'은(는) 거부됩니다.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "불가능한 묵시적 선행조건 '%s'은(는) 거부됩니다.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "규칙 선행조건 '%s'을(를) 시도합니다.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "묵시적 선행조건 '%s'을(를) 시도합니다.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "VPATH '%2$s'에서 선행조건 '%1$s'을(를) 찾았습니다\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "중간 파일 '%s'에 대한 묵시적 규칙을 찾고 있습니다.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "임시 파일을 만들 수 없습니다\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (메모리 덤프됨)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (무시됨)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<내장>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] 오류 %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** 끝나지 않은 작업을 기다리고 있습니다...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "살아있는 하위 프로세스 %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (원격)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "실패한 하위 프로세스 %p PID %s %s을(를) 거둬들입니다\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "성공한 하위 프로세스 %p PID %s %s을(를) 거둬들입니다\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "실패한 하위 프로세스 %p PID %s %s을(를) 거둬들입니다\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "임시 배치 파일 %s을(를) 지웁니다\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "임시 배치 파일 %s 지우기가 실패했습니다(%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "하위 프로세스 %p PID %s%s을(를) 체인에서 지웁니다.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "하위 프로세스 %p(%s)에 토큰을 내어 줍니다.\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy()가 프로세스를 시작하는 데 실패했습니다(e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -710,94 +720,88 @@ msgstr ""
 "\n"
 "실행 실패에서 인수 %d개\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "하위 프로세스 %p(%s) PID %s%s을(를) 체인에 넣습니다.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "하위 프로세스 %p(%s)에서 토큰을 받았습니다.\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: '%s' 타겟이 없습니다"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: '%s' 타겟 업데이트, 이유: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "이 운영 체제에서는 부하 제한을 강제할 수 없습니다"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "부하 제한을 강제할 수 없습니다: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "파일 핸들이 없음: 표준 입력을 복사할 수 없습니다\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "파일 핸들이 없음: 표준 출력을 복사할 수 없습니다\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "파일 핸들이 없음: 표준 오류를 복사할 수 없습니다\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "표준 입력을 복구할 수 없습니다\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "표준 출력을 복구할 수 없습니다\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "표준 오류를 복구할 수 없습니다\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 "하위 프로세스 PID %s을(를) 거둬들이고, 아직 PID %s을(를) 기다리고 있습니다\n"
 
-#: job.c:2275
+#: src/job.c:2623
 #, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: 명령을 찾지 못했습니다\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: 명령을 찾지 못했습니다\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: 셸 프로그램을 찾지 못했습니다"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: 환경 변수 공간이 바닥났을 수 있습니다"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL이 바뀌었습니다(과거 '%s', 현재 '%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "임시 배치 파일 %s을(를) 만듭니다\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -805,7 +809,7 @@ msgstr ""
 "배치 파일 내용:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -815,57 +819,54 @@ msgstr ""
 "\t%s\n"
 
 # ???  디버깅 메세지
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (%d번째 줄) 잘못된 쉘 컨텍스트 (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[방식] (--output-sync[=방식]) 옵션은 이 빌드에서 사용하지 않습니다."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "전역 심볼 테이블을 여는데 실패했습니다: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "읽어들인 %s 오브젝트는 GPL 호환이라고 선언하지 않았습니다"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "%s 심볼을 %s에서 읽어들이는데 실패: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "읽어들일 심볼 이름이 비었음: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "%s 심볼을 %s에서 읽어들임\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "'load' 작업은 이 플랫폼에서 지원되지 않습니다."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "옵션:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      무시됩니다, 호환을 위해 유지.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           조건에 관계 없이 모든 타겟을 만듭니다.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -873,17 +874,17 @@ msgstr ""
 "  -C <디렉터리>, --directory=<디렉터리>\n"
 "                              뭔가 하기 전에 <디렉터리>로 이동합니다.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          여러 가지 디버깅 정보를 출력합니다.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=플래그]            여러 가지 종류의 디버깅 정보를 출력합니다.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -891,13 +892,14 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              환경변수가 메이크파일 내용에 우선합니다.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=<문자열>             <문자열>을 메이크파일 내용으로 해석합니다.\n"
+"  -E <문자열>, --eval=<문자열>\n"
+"                              <문자열>을 메이크파일 내용으로 해석합니다.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -905,15 +907,15 @@ msgstr ""
 "  -f <파일>, --file=<파일>, --makefile=<파일>\n"
 "                              <파일>을 메이크파일로 읽습니다.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  이 메시지를 출력하고 끝냅니다.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         명령에서 발생하는 오류를 무시합니다.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -921,7 +923,7 @@ msgstr ""
 "  -I <디렉터리>, --include-dir=<디렉터리>\n"
 "                              포함할 메이크파일을 <디렉터리>에서 찾습니다.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -929,13 +931,13 @@ msgstr ""
 "  -j [N], --jobs[=N]          동시에 N개의 작업 허용, 인자 없으면 무한대로 허"
 "용.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            일부 타겟을 만들 수 없더라도 계속 진행합니다.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -945,7 +947,7 @@ msgstr ""
 "                              로드가 N 아래로 내려가야 동시 작업 시작합니"
 "다.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -953,7 +955,7 @@ msgstr ""
 "  -L, --check-symlink-times   심볼릭 링크와 실제 중 더 최근 수정 시각을\n"
 "                               사용합니다.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -963,7 +965,7 @@ msgstr ""
 "                              실제로는 아무 명령도 실행하지 않고 표시만 합니"
 "다.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -974,7 +976,7 @@ msgstr ""
 "지\n"
 "                              않습니다.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -982,11 +984,11 @@ msgstr ""
 "  -O[방식], --output-sync[=방식]\n"
 "                              병렬 작업의 출력을 <방식>에 따라 맞춥니다.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       make의 내부 데이터베이스를 출력합니다.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -994,19 +996,24 @@ msgstr ""
 "  -q, --question              명령을 실행하지 않음. 종료 상태로 업데이트\n"
 "                              여부를 알 수 있습니다.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      내장 묵시적 규칙을 사용하지 않습니다.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  내장 변수를 지정하지 못하게 합니다.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       명령어를 출력하지 않습니다.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 명령어를 출력합니다. (--silent 모드 끄기)\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1014,31 +1021,31 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              -k 옵션을 끕니다.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 타겟을 다시 만들지 않고 touch만 합니다.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     추적 정보를 표시합니다.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               make의 버전 번호를 출력하고 끝냅니다.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       현재 디렉터리를 출력합니다.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr "  --no-print-directory        묵시적으로 켜져 있더라도 -w를 끕니다.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1047,33 +1054,34 @@ msgstr ""
 "                              <파일>을 무한히 계속 새로운 것으로 취급합니"
 "다.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 "  --warn-undefined-variables  정의되지 않은 변수를 참조할 때 경고를 냅니다.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "빈 문자열은 파일 이름으로 부적절합니다"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "디버깅 단계 지정 '%s'이(가) 잘못되었습니다"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "알 수 없는 output-sync 방식 '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: 인터럽트/예외가 발견되었습니다(코드 = 0x%lx, 주소 = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1088,135 +1096,147 @@ msgstr ""
 "예외플래그 = %lx\n"
 "예외주소 = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "접근 권한 위반: 주소 0x%p에 쓰기\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "접근 권한 위반: 주소 0x%p에서 읽기\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() 설정 default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell() 경로 탐색 설정 default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s이(가) 30초동안 일시 중지됩니다..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "완료 sleep(30). 계속.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "경고: 작업서버를 사용할 수 없습니다: -j1을 사용합니다.  상위 메이크 규칙에 "
 "'+'를 추가합니다."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "경고: 파생된 메이크에서 -jN이 강제되었습니다: 작업서버 모드를 끕니다."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr ""
+"경고: 파생된 메이크에서 -j%d 옵션이 강제되었습니다: 작업서버 모드를 초기화합"
+"니다."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "표준입력에서 받아들이는 메이크파일이 두 번 이상 지정되었습니다."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen(임시 파일)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite(임시 파일)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"경고: 메이크파일에서 -j%d 옵션이 강제되었습니다: 작업서버 모드를 초기화합니"
+"다."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "병렬 작업(-j)은 이 플랫폼에서 지원하지 않습니다."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "단일 작업 (-j1) 모드로 돌아갑니다."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "심볼릭 링크를 지원하지 않습니다: -L 옵션을 끕니다."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "메이크파일을 업데이트하고 있습니다....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "메이크파일 '%s'은(는) 반복할 수 있으므로, 다시 만들지 않습니다.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "'%s' 메이크파일을 다시 만드는데 실패."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "포함된 메이크파일 '%s'을(를) 찾지 못했습니다."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "메이크파일 '%s'을(를) 찾지 못했습니다"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "원래 디렉터리로 돌아갈 수 없습니다."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "재실행[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (임시 파일): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL 안에 타겟이 여러 개 들어 있습니다"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "타겟이 지정되지 않았고 메이크파일이 없습니다"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "타겟 없음"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "타겟이 지정되지 않았고 메이크파일이 없습니다"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "최종 타겟을 갱신합니다....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "경고:  시계가 잘못되었음이 발견되었습니다.  빌드가 불완전할 수 있습니다."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "사용법: %s [옵션] [타겟] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1225,7 +1245,7 @@ msgstr ""
 "\n"
 "이 프로그램은 %s에서 사용하도록 빌드되었습니다\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1234,32 +1254,32 @@ msgstr ""
 "\n"
 "이 프로그램은 %s(%s)에서 사용하도록 빌드되었습니다\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "문제점을 <bug-make@gnu.org>로 알려 주십시오.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "'%s%s' 옵션은 비어 있지 않은 문자열 인수가 필요합니다"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "'-%c' 옵션은 0보다 큰 정수 인수가 필요합니다"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%s%s 빌드\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%s%s(%s) 빌드\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1272,7 +1292,7 @@ msgstr ""
 "%sThis is free software: you are free to change and redistribute it.\n"
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1281,7 +1301,7 @@ msgstr ""
 "\n"
 "# 메이크 데이터베이스, %s에 표시"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1290,347 +1310,383 @@ msgstr ""
 "\n"
 "# 메이크 데이터베이스 마침, %s에서\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "알 수 없는 오류 %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: 사용자 %lu (실제 %lu), 그룹 %lu (실제 %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "접근 권한 초기화"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "사용자 접근"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "메이크 접근"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "하위 접근"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: 알 수 없는 디렉터리 들어감\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: 알 수 없는 디렉터리 나감\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: 디렉터리 '%s' 들어감\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: 디렉터리 '%s' 나감\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: 알 수 없는 디렉터리 들어감\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: 알 수 없는 디렉터리 나감\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: 디렉터리 '%s' 들어감\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: 디렉터리 '%s' 나감\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "쓰기 오류: 표준 출력"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  멈춤.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[방식] (--output-sync[=방식]) 옵션은 이 빌드에서 사용하지 않습니다."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "작업 파이프 생성"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "작업 파이프 dup() 수행"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "작업서버 파이프 초기화"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "내부 오류: 잘못된 --jobserver-auth 문자열 '%s'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "작업 서버 클라이언트(파일 디스크립터 %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "작업서버 파이프라인"
 
 # ??? 디버깅 메세지
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "작업서버 쓰기"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "작업 서버가 꺼졌습니다"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect 작업 파이프"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "작업 파이프 읽기"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "메이크파일을 읽고 있습니다...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "'%s' 메이크파일을 읽고 있습니다"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (최종 타겟이 없음)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (탐색 경로)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (상관 안함)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (~ 확장 없음)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "메이크파일 '%s'에서 UTF-8 BOM 무시\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "메이크파일 버퍼에서 UTF-8 BOM 무시\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "조건문에 부적절한 문법이 쓰임"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: 읽어들이는데 실패"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "첫번째 타겟보다 앞에서 명령어가 시작되었습니다"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "명령 앞에 규칙이 빠졌음"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr ""
 "분리 기호가 없습니다 (빈 칸 8개가 아니라 탭을 쓰려고 한 것 아니었습니까?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "분리 기호가 빠졌음"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "타겟 패턴이 빠졌음"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "다중 타겟 패턴"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "타겟 패턴에 '%%'가 없습니다."
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "'endif'가 빠졌음"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "빈 변수 이름"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "'define' 지시자 뒤에 필요 없는 텍스트 있음"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "'endef'가 빠졌음. 'define'을 마치지 않았습니다"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "'endef' 지시자 뒤에 필요 없는 텍스트가 있음"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "'%s' 지시자 뒤에 필요 없는 텍스트가 있음"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "필요 없는 '%s'"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "한 개의 조건에는 한 개의 'else'만 있어야 합니다"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "타겟별 변수 정의 형식이 틀렸습니다"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "명령어에서 선행조건을 정의할 수 없습니다"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "그룹 타겟은 명령어를 제공해야 합니다"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "묵시적 패턴 룰과 고정된 패턴룰이 섞였습니다"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "혼합된 묵시적 규칙과 일반적 규칙"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "타겟 '%s'은(는) 타겟 패턴에 맞지 않습니다"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "타겟 파일 '%s'은(는) :와 :: 항목을 동시에 갖고 있습니다"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "타겟 '%s'이(가) 같은 규칙에서 여러 번 주어졌습니다"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "경고: 타겟 '%s'에 대한 명령보다 우선합니다"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "경고: 타겟 '%s'에 대한 과거 명령을 무시합니다"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** 혼합된 묵시적 규칙과 일반적 규칙: 추천하지 않는 문법입니다"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "경고: 타겟 '%s'의 그룹 소속보다 우선합니다"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "경고: NUL 문자가 발견되었습니다. 줄의 나머지는 무시됩니다"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "'%s'을(를) 위해 할 일이 없습니다."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "'%s'은(는) 이미 업데이트되었습니다."
 
 # prune이 truncate의 의미인가 지운다는 의미인가??
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "'%s' 파일을 잘라냅니다.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%1$s'%3$s'에서 필요한 '%2$s' 타겟을 만들 규칙이 없습니다%4$s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%s타겟 '%s'을(를) 만들 규칙이 없습니다%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "'%s' 타겟 파일을 고려합니다.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "최근에 '%s' 파일 업데이트를 시도해 실패했습니다.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "'%s' 파일은 이미 검토했습니다.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "아직 '%s' 파일을 업데이트하고 있습니다.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "'%s' 파일의 업데이트를 마쳤습니다.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "'%s' 파일이 없습니다.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1638,148 +1694,148 @@ msgstr ""
 "*** Warning: .LOW_RESOLUTION_TIME 파일 '%s'에 고해상도 타임 스탬프가 들어 있"
 "습니다"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "'%s'에 대한 묵시적 규칙을 찾았습니다.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "'%s'에 대한 묵시적 규칙이 없습니다.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "'%s'에 대해 기본 명령 사용.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "%s <- %s 상호 의존성은 무시됩니다."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "타겟 파일 '%s'의 선행조건을 마쳤습니다.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "'%s'의 선행조건이 만들어지고 있습니다.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "타겟 파일 '%s'을(를) 포기합니다.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "오류로 '%s' 타겟을 다시 만들지 못했습니다."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "'%s' 선행 조건은 '%s' 타겟에 대해 순서만 선행 조건입니다.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "타겟 '%2$s'의 선행조건 %1$s이(가) 없습니다.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "'%s' 선행 조건이 '%s' 타겟보다 나중에 만들어졌습니다.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "'%s' 선행 조건이 '%s' 타겟보다 먼저 만들어졌습니다.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "'%s' 타겟은 콜론 두 개가 붙었고 선행조건이 없습니다.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "'%s'에 대한 명령어가 없고 어떤 선행조건도 실제로 바뀌지 않았습니다.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "always-make 옵션 때문에 '%s' 타겟을 만듭니다.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "'%s' 타겟을 다시 만들 필요가 없습니다"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; VPATH 이름 '%s'을(를) 사용합니다"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "'%s' 타겟을 다시 만들어야 합니다.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  VPATH 이름 '%s'을(를) 무시합니다.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "'%s'의 명령이 실행 중입니다.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "'%s' 타겟 파일을 다시 만드는데 실패했습니다.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "'%s' 타겟 파일을 성공적으로 다시 만들었습니다.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "'%s' 타겟 파일을 -q 옵션으로 다시 만들어야 합니다.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "'%s'에 대해 기본 명령을 사용.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "경고: '%s' 파일의 변경 시각이 미래입니다"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "경고: '%s' 파일의 변경 시각(%s)이 미래입니다"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS의 원소 '%s'이(가) 패턴이 아닙니다"
 
 # ???  디버깅 메세지 -- 뭔지 알기 어려움
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs은 export되지 않습니다: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1787,7 +1843,7 @@ msgstr ""
 "\n"
 "# 묵시적 규칙"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1795,181 +1851,177 @@ msgstr ""
 "\n"
 "# 묵시적 규칙 없음."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# 묵시적 규칙 %u개, %u"
-
-#: rule.c:523
-msgid " terminal."
-msgstr " 터미널."
+"# 묵시적 규칙 %u개, %u (%.1f%%) 터미널."
 
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "버그: num_pattern_rules 틀렸습니다!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "알 수 없는 신호"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "끊어짐"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "인터럽트"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "끝내기"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "잘못된 명령"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "추적/중단점 트랩"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "중단됨"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT 트랩"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT 트랩"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "부동 소수점 예외"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "죽었음"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "버스 오류"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "세그멘테이션 오류"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "잘못된 시스템 호출"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "깨어진 파이프"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "자명종 시계"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "종료됨"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "사용자 정의 신호 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "사용자 정의 신호 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "하위 프로세스 끝남"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "전력 중단"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "중지됨"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "중지됨(tty 입력)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "중지됨(tty 출력)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "중지됨(시그널)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU 시간 제한 초과됨"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "파일 크기 제한 초과됨"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "가상 타이머 시간 초과됨"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "프로파일링 타이머 시간 초과됨"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "창이 바뀌었음"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "계속됨"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "긴급한 입출력 상황"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "입출력 가능"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "자원 손실"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "위험 신호"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "정보 요청"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "부동소수점 연산 보조프로세서가 없습니다"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1978,7 +2030,7 @@ msgstr ""
 "\n"
 "%s strcache 버퍼 없음\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1989,26 +2041,25 @@ msgstr ""
 "%s strcache 버퍼: %lu (%lu) / 문자열 = %lu / 저장 공간 = %lu B / 평균 = %lu "
 "B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
-msgstr ""
-"%s 현재 버퍼: 크기 = %hu B / 사용 = %hu B / 개수 = %hu / 평균 = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr "%s 현재 버퍼: 크기 = %hu B / 사용 = %hu B / 개수 = %hu / 평균 = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s 기타 사용: 전체 = %lu B / 개수 = %lu / 평균 = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s 기타 빈 공간: 전체 = %lu B / 최대 = %lu B / 최소 = %lu B / 평균 = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2017,7 +2068,7 @@ msgstr ""
 "\n"
 "%s strcache 효율: 검색 = %lu / 히트 비율 = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2025,44 +2076,44 @@ msgstr ""
 "# 해시 테이블 통계:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "자동"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "기본값"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "환경"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "메이크파일"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "-e 하의 환경"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "명령행"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "'override' 지시자"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " ('%s'에서, %lu번째 줄)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# 변수 모음 해시 테이블 통계:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2070,7 +2121,7 @@ msgstr ""
 "\n"
 "# 변수\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2078,7 +2129,7 @@ msgstr ""
 "\n"
 "# 패턴을 위한 변수 값"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2086,7 +2137,7 @@ msgstr ""
 "\n"
 "# 패턴을 위한 변수 값이 없습니다."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2095,48 +2146,48 @@ msgstr ""
 "\n"
 "# 특정 패턴을 위한 변수 값 %u개"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "경고: 정의되지 않은 변수 '%.*s'"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search()가 %d번을 리턴하며 실패했습니다\n"
 
 # DCL - Digital Command Language, VMS에서만 존재하는 shell language의 일종
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-경고, DCL에서 CTRL-Y를 다시 사용가능하도록 해야 할 것입니다.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "내장 CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "출력을 %s에 붙입니다\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "%.*s을(를) 붙이고 지웁니다\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "대신 %s을(를) 실행\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2144,11 +2195,11 @@ msgstr ""
 "\n"
 "# VPATH 탐색 경로\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# 'vpath' 탐색 경로가 없음."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2157,7 +2208,7 @@ msgstr ""
 "\n"
 "# 'vpath' 탐색 경로 %u개.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2165,7 +2216,7 @@ msgstr ""
 "\n"
 "# 일반적인 ('VPATH' 변수) 탐색 경로가 없음."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2175,33 +2226,33 @@ msgstr ""
 "# 일반적인 ('VPATH' 변수) 탐색 경로:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "작업서버 슬롯은 %d개로 제한됩니다\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "작업서버 세마포어 만들기: (오류 %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr "내부 오류: 작업 서버 세마포어('%s')를 열 수 없습니다: (오류 %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "작업 서버 클라이언트(세마포어 %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "작업 서버 세마포어 해제: (오류 %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "세마포어 또는 하위 프로세스 대기: (오류 %ld: %s)"
index a3136eb9a182071407ccfedd86062fb1008f0854..baab5047acc86f1942a9ec8555869dbb63c2965c 100644 (file)
Binary files a/po/lt.gmo and b/po/lt.gmo differ
index b836e2b80a34435ff3aed4db4cb3456804ed08f7..c47ea36fa73a1975c12ab8c2786992d206bd3ab6 100644 (file)
--- a/po/lt.po
+++ b/po/lt.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: make-3.81\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2008-05-17 21:42+0300\n"
 "Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
 "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
@@ -15,117 +15,119 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
 "%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, fuzzy, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "bandymas naudoti nepalaikomą funkcionalumą: „%s“"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr ""
 
-#: ar.c:147
+#: src/ar.c:147
 #, fuzzy, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Archyvas „%s“ neegzistuoja"
 
-#: ar.c:150
+#: src/ar.c:150
 #, fuzzy, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: „%s“ nėra taisyklingas archyvas"
 
-#: ar.c:157
+#: src/ar.c:157
 #, fuzzy, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Archyvas „%s“ neegzistuoja"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr ""
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr ""
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, fuzzy, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "nepavyko atverti bibliotekos „%s“ bandant surasti narį „%s“"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, fuzzy, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Narys „%s“%s: %ld baitų pozicijoje %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (pavadinimas gali būti sutrumpintas)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Data %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr ""
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr ""
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr ""
 
-#: commands.c:645
+#: src/commands.c:646
 #, fuzzy, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Trinamas failas „%s“"
 
-#: commands.c:647
+#: src/commands.c:648
 #, fuzzy, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Trinamas failas „%s“"
 
-#: commands.c:683
+#: src/commands.c:684
 #, fuzzy
 msgid "#  recipe to execute"
 msgstr "#  vykdytinos komandos"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr "  (integruota)"
 
-#: commands.c:688
+#: src/commands.c:689
 #, fuzzy, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (nuo „%s“, %lu eilutė):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -133,228 +135,230 @@ msgstr ""
 "\n"
 "# Aplankai\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: negalėjo būti stat'intas.\n"
 
-#: dir.c:1085
+#: src/dir.c:1089
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr "# %s (key %s, mtime %d): nepavyko atverti.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1122
+#: src/dir.c:1126
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): "
 msgstr "# %s (key %s, mtime %d): nepavyko atverti.\n"
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr ""
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr ""
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Ne"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " failai, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "ne"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " negalimybės"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " kol kas."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " negalimybės %lu aplankuose.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, fuzzy, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Rekursyvus kintamasis „%s“ nukreipia į save (anksčiau ar vėliau)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "neterminuota nuoroda į kintamąjį"
 
-#: file.c:278
+#: src/file.c:278
 #, fuzzy, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Komandos nurodytos failui „%s“ %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, fuzzy, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Komandos failui „%s“ rastos pagal neišreikštinę taisyklių paiešką"
 
-#: file.c:287
+#: src/file.c:287
 #, fuzzy, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "bet „%s“ dabar laikomas tuo pačiu failu kaip „%s“."
 
-#: file.c:290
+#: src/file.c:290
 #, fuzzy, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "Komandos „%s“ bus ignoruojamos „%s“ komandų naudai."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 
-#: file.c:408
+#: src/file.c:408
 #, fuzzy, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Trinamas tarpinis failas „%s“"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Šalinami tarpiniai failai...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Dabartinis laikas"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Laiko žymė už rėžių; keičiama į %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Ne tikslas:"
 
-#: file.c:967
+#: src/file.c:1021
 #, fuzzy
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Brangus failas (reikalingas .PRECIOUS)"
 
-#: file.c:969
+#: src/file.c:1023
 #, fuzzy
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Keistas tikslas (reikalingas .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 #, fuzzy
 msgid "#  Command line target."
 msgstr "#  Komandinės eilutės tikslas"
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Numatytoji reikšmė, MAKEFILES, arba -include/sinclude „make“ failas"
 
-#: file.c:975
+#: src/file.c:1029
 #, fuzzy
 msgid "#  Builtin rule"
 msgstr ""
 "\n"
 "# Nėra neišreikštinių taisyklių."
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Neišreikštinių taisyklių paieška atlikta."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Neišreikštinių taisyklių paieška neatlikta."
 
-#: file.c:980
+#: src/file.c:1034
 #, fuzzy, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Išreikštinis/statinis šablono kamienas: „%s“\n"
 
-#: file.c:982
+#: src/file.c:1036
 #, fuzzy
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Failas yra tarpinė sąlyga"
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Taip pat sukuria:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Modifikacijos laikas niekada netikrintas."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Failas neegzistuoja."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Failas labai senas."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Paskutinį kartą pakeista %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Failas atnaujintas."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Failas nebuvo atnaujintas."
 
-#: file.c:1008
+#: src/file.c:1062
 #, fuzzy
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Dabar vykdomos komandos (TAI KLAIDA)."
 
-#: file.c:1011
+#: src/file.c:1065
 #, fuzzy
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Vykdomos priklausomybių komandos (TAI KLAIDA)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Sėkmingai atnaujinta."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Turi būti atnaujinta (-q nustatyta)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Nepavyko atnaujinti."
 
-#: file.c:1032
+#: src/file.c:1086
 #, fuzzy
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Netaisyklinga reikšmė „command_state“ naryje!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -362,7 +366,7 @@ msgstr ""
 "\n"
 "# Failai"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -372,662 +376,666 @@ msgstr ""
 "# failų maišos lentelės statistika:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr ""
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr ""
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr ""
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr ""
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr ""
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr ""
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr ""
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr ""
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr ""
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, fuzzy, c-format
 msgid "open: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, fuzzy, c-format
 msgid "write: %s: %s"
 msgstr "rašymo klaida: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, fuzzy, c-format
 msgid "close: %s: %s"
 msgstr "%s%s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, fuzzy, c-format
 msgid "read: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "%s: netaisyklingas argumentas -- %c\n"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr ""
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr ""
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr ""
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr ""
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr ""
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr ""
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr ""
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr ""
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, fuzzy, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: parametras `%s' dviprasmis\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, fuzzy, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: argumentas „--%s“ neleidžia parametro\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, fuzzy, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: argumentas „%c%s“ neleidžia parametro\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, fuzzy, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: parametrui „%s“ reikia argumento\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, fuzzy, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: neatpažintas argumentas „--%s“\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, fuzzy, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: neatpažintas argumentas „%c%s“\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: neleistinas parametras -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: netaisyklingas argumentas -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: parametrui reikia argumento -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, fuzzy, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: parametras „-W %s“ dviprasmis\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, fuzzy, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: parametras „-W %s“ neleidžia argumento\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr ""
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr ""
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
+msgid "Rehash=%u, "
 msgstr ""
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr ""
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, fuzzy, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Rasta neišreikštinė taisyklė tikslui „%s“.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, fuzzy, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Rasta neišreikštinė taisyklė tikslui „%s“.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr ""
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr ""
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr ""
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr ""
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, fuzzy, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Šalinami tarpiniai failai...\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr ""
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr ""
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr ""
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 #, fuzzy
 msgid "<builtin>"
 msgstr "  (integruota)"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr ""
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr ""
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr ""
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr ""
 
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:839
+#: src/job.c:950
 #, fuzzy, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "%s: nepavyko atverti laikinojo failo: %s"
 
-#: job.c:845
+#: src/job.c:956
 #, fuzzy, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "%s: nepavyko atverti laikinojo failo: %s"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr ""
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr ""
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr ""
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1838
+#: src/job.c:1902
 #, fuzzy, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "touch: Archyvas „%s“ neegzistuoja"
 
-#: job.c:1841
+#: src/job.c:1905
 #, fuzzy, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%sNėra taisyklės pasiekti tikslui „%s“, kurio reikia „%s“%s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
 
-#: job.c:1958
+#: src/job.c:2110
 #, fuzzy
 msgid "cannot enforce load limit: "
 msgstr "%s: nepayko pakeisti limito: %s"
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr ""
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr ""
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr ""
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Komanda nerasta"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Komanda nerasta"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Kevalo programa nerasta"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr ""
 
-#: job.c:2584
+#: src/job.c:2862
 #, fuzzy, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL pakeistas (buvo „%s“, dabar „%s“)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr ""
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr ""
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr ""
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr ""
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr ""
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr ""
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "negalimas tuščias failo pavadinimas"
 
-#: main.c:766
+#: src/main.c:754
 #, fuzzy, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "nežinomas debug lygio specifikacija „%s“"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1037,132 +1045,140 @@ msgid ""
 "ExceptionAddress = 0x%p\n"
 msgstr ""
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr ""
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr ""
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr ""
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr ""
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr ""
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr ""
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr ""
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr ""
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr ""
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr ""
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Atnaujinami „make“ failai....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
 
-#: main.c:2279
+#: src/main.c:2303
 #, fuzzy, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Nereikia atnaujinti taikinio „%s“"
 
-#: main.c:2299
+#: src/main.c:2323
 #, fuzzy, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "„Make“ failas „%s“ nerastas"
 
-#: main.c:2304
+#: src/main.c:2328
 #, fuzzy, c-format
 msgid "Makefile '%s' was not found"
 msgstr "„Make“ failas „%s“ nerastas"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Nepavyko grįžti į pirminį aplanką."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr ""
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr ""
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ""
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Nenurodyta tikslų ir nerasta „make“ failų"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Nėra tikslų"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Nenurodyta tikslų ir nerasta „make“ failų"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Atnaujinami tikslai...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Naudojimas: %s [argumentai] [tikslas] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1171,7 +1187,7 @@ msgstr ""
 "\n"
 "Ši programa sukompiliuota %s sistemai\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1180,36 +1196,36 @@ msgstr ""
 "\n"
 "Ši programa sukompiliuota %s (%s) sistemai\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Praneškite apie klaidas adresu <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, fuzzy, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "parametrui „-%c“ reikia netuščio argumento"
 
-#: main.c:2934
+#: src/main.c:2965
 #, fuzzy, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "parametrui „-%c“ reikia teigiamo sveiko argumento"
 
-#: main.c:3332
+#: src/main.c:3363
 #, fuzzy, c-format
 msgid "%sBuilt for %s\n"
 msgstr ""
 "\n"
 "%sŠi programa sukompiliuota %s sistemai\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, fuzzy, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr ""
 "\n"
 "%sŠi programa sukompiliuota %s (%s) sistemai\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1218,514 +1234,541 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
 "# Make data base, printed on %s"
 msgstr ""
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
 "# Finished Make data base on %s\n"
 msgstr ""
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Nežinoma klaida %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: user %lu (real %lu), group %lu (real %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr ""
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr ""
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr ""
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr ""
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Įeinama į nežinomą aplanką\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Išeinama iš nežinomo aplanko\n"
 
-#: output.c:109
+#: src/output.c:102
 #, fuzzy, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Įeinama į aplanką „%s“\n"
 
-#: output.c:111
+#: src/output.c:104
 #, fuzzy, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Išeinama iš aplanko „%s“\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Įeinama į nežinomą aplanką\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Išeinama iš nežinomo aplanko\n"
 
-#: output.c:120
+#: src/output.c:113
 #, fuzzy, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Įeinama į aplanką „%s“\n"
 
-#: output.c:122
+#: src/output.c:115
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Išeinama iš aplanko „%s“\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, fuzzy, c-format
 msgid "write error: stdout"
 msgstr "rašymo klaida: %s"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Pabaiga.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr ""
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr ""
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr ""
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr ""
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr ""
 
-#: posixos.c:154
+#: src/posixos.c:186
 #, fuzzy
 msgid "write jobserver"
 msgstr "rašymo klaida: %s"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr ""
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr ""
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Skaitomi „make“ failai...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, fuzzy, c-format
 msgid "Reading makefile '%s'"
 msgstr "Skaitomas „make“ failas „%s“"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (nėra numatytojo tikslo)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (paieškos kelias)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (nesvarbu)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (nėra ~ išplėtimo)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr ""
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr ""
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "netaisyklinga sąlygos sintaksė"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
-#, fuzzy
+#: src/read.c:986
+#, fuzzy, c-format
 msgid "recipe commences before first target"
 msgstr "komandos prasideda prieš pirmąjį tikslą"
 
-#: read.c:1034
-#, fuzzy
+#: src/read.c:1035
+#, fuzzy, c-format
 msgid "missing rule before recipe"
 msgstr "trūksta taisyklės prieš komandas"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr " (ar norėjote padėti TAB simbolį vietoje 8 tarpų?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, fuzzy, c-format
 msgid "missing separator"
 msgstr "trūksta skirtuko%s"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "trūksta tikslo šablono"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "keli tikslo šablonai"
 
-#: read.c:1268
+#: src/read.c:1289
 #, fuzzy, c-format
 msgid "target pattern contains no '%%'"
 msgstr "tikslo šablone nėra „%%“"
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, fuzzy, c-format
 msgid "missing 'endif'"
 msgstr "trūksta „endif“"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "tuščias kintamojo pavadinimas"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, fuzzy, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "Perteklinis tekstas po „endef“ direktyvos"
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, fuzzy, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "trūksta „endef“, nebaigtas „define“"
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, fuzzy, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "Perteklinis tekstas po „endef“ direktyvos"
 
-#: read.c:1588
+#: src/read.c:1603
 #, fuzzy, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "Perteklinis tekstas po „%s“ direktyvos"
 
-#: read.c:1589
+#: src/read.c:1604
 #, fuzzy, c-format
 msgid "extraneous '%s'"
 msgstr "perteklinis „%s“"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr ""
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr ""
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr ""
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr ""
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr ""
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr ""
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr ""
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr ""
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr ""
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr ""
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr ""
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr ""
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr ""
 
-#: remake.c:226
+#: src/remake.c:226
 #, fuzzy, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Nėra ką daryti su „%s“."
 
-#: remake.c:227
+#: src/remake.c:227
 #, fuzzy, c-format
 msgid "'%s' is up to date."
 msgstr "„%s“ atnaujinti nereikia."
 
-#: remake.c:323
+#: src/remake.c:323
 #, fuzzy, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Vis dar atnaujinamas failas „%s“.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sNėra taisyklės pasiekti tikslui „%s“, kurio reikia „%s“%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sNėra taisyklės pasiekti tikslui „%s“%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, fuzzy, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Svarstomas tikslo failas „%s“.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, fuzzy, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Neseniai bandyta ir nepavyko atnaujinti failo „%s“.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, fuzzy, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Failas „%s“ jau apsvarstytas.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, fuzzy, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Vis dar atnaujinamas failas „%s“.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, fuzzy, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Baigtas atnaujinti failas „%s“.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, fuzzy, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Failas „%s“ neegzistuoja.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, fuzzy, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Rasta neišreikštinė taisyklė tikslui „%s“.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, fuzzy, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Nerasta neišreikštinių taisyklių tikslui „%s“.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr ""
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr ""
 
-#: remake.c:691
+#: src/remake.c:674
 #, fuzzy, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Svarstomas tikslo failas „%s“.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr ""
 
-#: remake.c:711
+#: src/remake.c:694
 #, fuzzy, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Svarstomas tikslo failas „%s“.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, fuzzy, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Tikslas „%s“ neatnaujintas dėl klaidų."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr ""
 
-#: remake.c:773
+#: src/remake.c:756
 #, fuzzy, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Failas „%s“ neegzistuoja.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr ""
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr ""
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr ""
 
-#: remake.c:819
+#: src/remake.c:802
 #, fuzzy, c-format
 msgid "No need to remake target '%s'"
 msgstr "Nereikia atnaujinti taikinio „%s“"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr ""
 
-#: remake.c:841
+#: src/remake.c:824
 #, fuzzy, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Būtina atnaujinti taikinį „%s“.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr ""
 
-#: remake.c:856
+#: src/remake.c:839
 #, fuzzy, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Vykdomos „%s“ komandos.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, fuzzy, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Nereikia atnaujinti taikinio „%s“"
 
-#: remake.c:866
+#: src/remake.c:849
 #, fuzzy, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Būtina atnaujinti taikinį „%s“.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr ""
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, fuzzy, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "paskutinė komanda: %s\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr ""
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr ""
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ""
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr ""
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1733,7 +1776,7 @@ msgstr ""
 "\n"
 "# Neišreikštinės taisyklės"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1741,193 +1784,189 @@ msgstr ""
 "\n"
 "# Nėra neišreikštinių taisyklių."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u neišreikštinių taisyklių, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr ""
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr ""
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "nežinomas signalas"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr ""
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Pertraukimas"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Išeita"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Neleistina instrukcija"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr ""
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr ""
 
-#: signame.c:112
+#: src/signame.c:112
 #, fuzzy
 msgid "IOT trap"
 msgstr "EMT gaudyklė"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT gaudyklė"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Slankaus kablelio klaida"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Nutraukta"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Magistralės klaida"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Segmentacijos klaida"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Blogas sisteminis kvietimas"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr ""
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Žadintuvas"
 
-#: signame.c:139
+#: src/signame.c:139
 #, fuzzy
 msgid "Terminated"
 msgstr "apribota"
 
-#: signame.c:142
+#: src/signame.c:142
 #, fuzzy
 msgid "User defined signal 1"
 msgstr "%s: nutrauktas signalo %d"
 
-#: signame.c:145
+#: src/signame.c:145
 #, fuzzy
 msgid "User defined signal 2"
 msgstr "%s: nutrauktas signalo %d"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 #, fuzzy
 msgid "Child exited"
 msgstr "Failas jau egzistuoja"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Elektros maitinimo sutrikimas"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Sustabdyta"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Sustabdyta (tty įvedimas)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Sustabdyta (tty išvedimas)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Sustabdyta (signalas)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Viršytas CPU laiko limitas"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Viršytas failo dydžio limitas"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr ""
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr ""
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Langas pakeistas"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Pratęsta"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr ""
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "Galimas įvedimas/išvedimas"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Išteklius prarastas"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Pavojaus signalas"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Informacijos užklausa"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Slankaus kablelio koprocesorius neprieinamas"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1935,31 +1974,31 @@ msgid ""
 "B\n"
 msgstr ""
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 #, fuzzy
 msgid ""
 "# hash-table stats:\n"
@@ -1969,168 +2008,168 @@ msgstr ""
 "# failų maišos lentelės statistika:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr ""
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr ""
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr ""
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr ""
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr ""
 
-#: variable.c:1644
+#: src/variable.c:1668
 #, fuzzy
 msgid "command line"
 msgstr "%s: komanda nerasta"
 
-#: variable.c:1647
+#: src/variable.c:1671
 #, fuzzy
 msgid "'override' directive"
 msgstr "tuščia „override“ direktyva"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, fuzzy, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (nuo „%s“, %lu eilutė):\n"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr ""
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
 msgstr ""
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 
-#: variable.h:224
+#: src/variable.h:229
 #, fuzzy, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "%s: neatpažintas argumentas „%c%s“\n"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr ""
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr ""
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr ""
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr ""
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
 msgstr ""
 
-#: vpath.c:620
+#: src/vpath.c:620
 #, fuzzy
 msgid "# No 'vpath' search paths."
 msgstr " (paieškos kelias)"
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
@@ -2138,6 +2177,15 @@ msgstr ""
 #~ msgid "#  Invalid value in `update_status' member!"
 #~ msgstr "#  Netaisyklinga reikšmė „update_status“ naryje!"
 
+#~ msgid "%s: Command not found"
+#~ msgstr "%s: Komanda nerasta"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Kevalo programa nerasta"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Nežinoma klaida %d"
+
 #~ msgid "virtual memory exhausted"
 #~ msgstr "baigėsi virtuali atmintis"
 
index b9586212efcb29eb9fd6057df3069b1442f005ec..73f64ae714143a11530f7e78d8866c6c2f61bbef 100644 (file)
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU make 4.2.1\n"
+"Project-Id-Version: GNU make 4.3\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,993 +17,1000 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr ""
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr ""
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr ""
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr ""
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr ""
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr ""
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr ""
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr ""
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr ""
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr ""
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr ""
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr ""
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr ""
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr ""
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr ""
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr ""
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr ""
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr ""
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr ""
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
 msgstr ""
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr ""
 
-#: dir.c:1085
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr ""
 
-#: dir.c:1122
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
 msgstr ""
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr ""
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr ""
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr ""
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr ""
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr ""
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr ""
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr ""
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr ""
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr ""
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr ""
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr ""
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr ""
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr ""
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr ""
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr ""
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr ""
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr ""
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr ""
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr ""
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr ""
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr ""
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr ""
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr ""
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr ""
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr ""
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr ""
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr ""
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr ""
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr ""
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr ""
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr ""
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr ""
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr ""
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr ""
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr ""
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr ""
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr ""
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr ""
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr ""
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
 msgstr ""
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
 "# "
 msgstr ""
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr ""
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr ""
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr ""
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr ""
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr ""
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr ""
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr ""
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr ""
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr ""
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr ""
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr ""
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr ""
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr ""
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr ""
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr ""
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr ""
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr ""
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr ""
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr ""
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr ""
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr ""
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr ""
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr ""
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr ""
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr ""
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr ""
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr ""
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr ""
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr ""
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr ""
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr ""
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr ""
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr ""
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr ""
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr ""
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
+msgid "Rehash=%u, "
 msgstr ""
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr ""
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr ""
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr ""
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr ""
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr ""
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr ""
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr ""
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr ""
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr ""
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr ""
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr ""
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr ""
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr ""
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr ""
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr ""
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr ""
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr ""
 
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
 msgstr ""
 
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr ""
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr ""
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr ""
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr ""
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr ""
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr ""
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr ""
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr ""
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr ""
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr ""
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr ""
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr ""
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr ""
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr ""
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr ""
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr ""
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr ""
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr ""
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr ""
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr ""
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr ""
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr ""
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr ""
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr ""
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
 msgstr ""
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr ""
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr ""
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr ""
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1013,171 +1020,179 @@ msgid ""
 "ExceptionAddress = 0x%p\n"
 msgstr ""
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr ""
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr ""
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr ""
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr ""
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr ""
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr ""
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr ""
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr ""
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr ""
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr ""
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr ""
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr ""
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr ""
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr ""
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr ""
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr ""
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr ""
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr ""
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ""
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
+#: src/main.c:2579
+#, c-format
+msgid "No targets"
 msgstr ""
 
-#: main.c:2550
-msgid "No targets"
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
 msgstr ""
 
-#: main.c:2555
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr ""
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr ""
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
 "This program built for %s\n"
 msgstr ""
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
 "This program built for %s (%s)\n"
 msgstr ""
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr ""
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr ""
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr ""
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr ""
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1186,695 +1201,727 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
 "# Make data base, printed on %s"
 msgstr ""
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
 "# Finished Make data base on %s\n"
 msgstr ""
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr ""
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr ""
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr ""
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr ""
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr ""
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr ""
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr ""
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr ""
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr ""
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr ""
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr ""
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr ""
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr ""
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr ""
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr ""
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ""
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr ""
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr ""
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr ""
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr ""
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr ""
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr ""
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr ""
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr ""
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr ""
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr ""
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr ""
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr ""
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr ""
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr ""
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr ""
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr ""
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr ""
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr ""
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr ""
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr ""
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr ""
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr ""
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr ""
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr ""
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr ""
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr ""
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr ""
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr ""
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr ""
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr ""
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr ""
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr ""
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr ""
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr ""
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr ""
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr ""
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr ""
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr ""
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr ""
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr ""
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr ""
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr ""
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr ""
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr ""
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr ""
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr ""
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr ""
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr ""
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr ""
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr ""
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr ""
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr ""
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr ""
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr ""
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr ""
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr ""
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr ""
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr ""
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr ""
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr ""
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr ""
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr ""
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr ""
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr ""
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr ""
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr ""
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr ""
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr ""
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr ""
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr ""
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr ""
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr ""
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr ""
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr ""
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr ""
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr ""
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr ""
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr ""
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr ""
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr ""
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ""
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr ""
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
 msgstr ""
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
 msgstr ""
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
-msgstr ""
-
-#: rule.c:523
-msgid " terminal."
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr ""
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr ""
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr ""
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr ""
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr ""
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr ""
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr ""
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr ""
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr ""
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr ""
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr ""
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr ""
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr ""
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr ""
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr ""
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr ""
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr ""
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr ""
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr ""
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr ""
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr ""
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr ""
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr ""
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr ""
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr ""
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr ""
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr ""
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr ""
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr ""
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr ""
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr ""
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr ""
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr ""
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr ""
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr ""
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr ""
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr ""
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr ""
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr ""
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr ""
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1882,195 +1929,195 @@ msgid ""
 "B\n"
 msgstr ""
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr ""
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr ""
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr ""
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr ""
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr ""
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr ""
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr ""
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr ""
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr ""
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
 msgstr ""
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr ""
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr ""
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr ""
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr ""
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr ""
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
 msgstr ""
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr ""
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
index 3c1fa766b4dc9435de553f267291c7676316d159..12c2d969b6670eedc1a61d530bfd70cb6532f747 100644 (file)
Binary files a/po/nl.gmo and b/po/nl.gmo differ
index b30b84d459ee52daa1ffaa4968a8848814cfac63..9b0027825456d6def4da3b511eb8ad8e469555b1 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
 # Dutch translations for GNU make.
-# Copyright (C) 2016 Free Software Foundation, Inc.
+# Copyright (C) 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 #
 # "On the plus side, Miss Vernon was outstandingly good-looking."
 #
 # Taco Witte <tcwitte@cs.uu.nl>, 2004.
-# Benno Schulenberg <benno@vertaalt.nl>, 2005, 2006, 2007, 2010, 2013, 2014, 2016.
+# Benno Schulenberg <benno@vertaalt.nl>, 2005, 2006, 2007, 2010.
+# Benno Schulenberg <benno@vertaalt.nl>, 2013, 2014, 2016, 2019, 2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: make-4.2\n"
+"Project-Id-Version: make-4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-27 10:23+0200\n"
-"Last-Translator: Benno Schulenberg <benno@vertaalt.nl>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 16:48+0100\n"
+"Last-Translator: Benno Schulenberg <vertaling@coevern.nl>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.0\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "poging tot gebruik van niet-ondersteunde functie: '%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "het 'touchen' van een archiefonderdeel is niet mogelijk op VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: archief '%s' bestaat niet"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: '%s' is geen geldig archief"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: onderdeel '%s' bestaat niet in '%s'"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: ar_member_touch() van '%s' is mislukt"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "uitpakken van module-info door lbr$set_module() is mislukt, afsluitwaarde= %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() is mislukt, afsluitwaarde = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
 "kan bibliotheek '%s' niet openen om status van onderdeel %d op te zoeken"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Onderdeel '%s'%s: %ld bytes bij %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (naam kan afgekapt zijn)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Datum %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, modus = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Recept bevat te veel regels (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Afgebroken.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Archiefonderdeel '%s' kan onecht zijn; niet verwijderd"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Archiefonderdeel '%s' kan onecht zijn; niet verwijderd"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Verwijderen van bestand '%s'"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Verwijderen van bestand '%s'"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  uit te voeren recept"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (ingebouwd):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (uit '%s', regel %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -136,219 +138,219 @@ msgstr ""
 "\n"
 "# Mappen\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# kan status van %s niet opvragen.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (sleutel %s, wijzigingstijd %ull): kan niet worden geopend.\n"
+msgstr "# %s (sleutel %s, wijzigingstijd %I64u): kan niet worden geopend.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (apparaat %d, inode [%d,%d,%d]): kan niet worden geopend.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (apparaat %ld, inode %ld): kan niet worden geopend.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (sleutel %s, wijzigingstijd %ull): "
+msgstr "# %s (sleutel %s, wijzigingstijd %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (apparaat %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (apparaat %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Geen"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " bestanden, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "geen"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " onmogelijkheden"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " tot nu toe."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " onmogelijkheden in %lu mappen.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Recursieve variabele '%s' verwijst naar zichzelf (uiteindelijk)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "onafgemaakte verwijzing naar variabele"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Recept voor bestand '%s' is opgegeven in %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Recept voor bestand '%s' werd gevonden via impliciet zoeken,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "maar '%s' wordt nu als hetzelfde bestand beschouwd als '%s'."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "Recept voor '%s' zal worden genegeerd ten gunste van die voor '%s'."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "kan enkeldubbelpunts '%s' niet hernoemen tot dubbeldubbelpunts '%s'"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "kan dubbeldubbelpunts '%s' niet hernoemen tot enkeldubbelpunts '%s'"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Verwijderen van tussentijds bestand '%s'"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Verwijderen van tussentijdse bestanden...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Huidige tijd"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Tijdsstempel ligt buiten bereik; wordt vervangen door %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Is geen doel:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Waardevol bestand (vereiste van .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Nepdoel (vereiste van .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Doel afkomstig van opdrachtregel."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr ""
 "#  Een standaard Makefile, of eentje via MAKEFILES of '-include/sinclude'."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Ingebouwde regel"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Impliciete regel-zoekopdracht is uitgevoerd."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Impliciete regel-zoekopdracht is niet uitgevoerd."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Impliciete/statische patroonstam: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Bestand is een tussentijds vereiste."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Maakt ook:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Wijzigingstijd is nooit gecontroleerd."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Bestand bestaat niet."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Bestand is erg oud."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Laatst gewijzigd %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Bestand is bijgewerkt."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Bestand is niet bijgewerkt."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Nog lopend recept (DIT IS EEN PROGRAMMAFOUT)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Nog lopende receptafhankelijkheden (DIT IS EEN PROGRAMMAFOUT)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Met succes bijgewerkt."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Moet worden bijgewerkt ('-q' is ingesteld)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Bijwerken is mislukt."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Ongeldige waarde in 'command_state'-onderdeel!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -356,7 +358,7 @@ msgstr ""
 "\n"
 "# Bestanden"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -366,334 +368,342 @@ msgstr ""
 "# hashtabel-statistieken van bestanden:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Veld '%s' is niet gecached: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "niet-numeriek eerste argument van 'word'-functie"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "eerste argument van 'word'-functie moet groter zijn dan 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "niet-numeriek eerste argument van 'wordlist'-functie"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "niet-numeriek tweede argument van 'wordlist'-functie"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe(): DuplicateHandle(In) is mislukt (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe(): DuplicateHandle(Err) is mislukt (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() is mislukt (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() is mislukt\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Opschonen van tijdelijk batch-bestand %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file: ontbrekende bestandsnaam"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open(): %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write(): %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close(): %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file: te veel argumenten"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read(): %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "file: ongeldige bestandsbewerking: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "onvoldoende aantal argumenten (%d) voor functie '%s'"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "niet-geïmplementeerd op dit platform: functie '%s'"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "onafgemaakte aanroep van functie '%s': '%c' ontbreekt"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Lege functienaam"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Ongeldige functienaam: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Functienaam is te lang: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Ongeldig minimumaantal argumenten (%u) voor functie %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Ongeldig maximumaantal argumenten (%u) voor functie %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: optie '%s' is niet eenduidig\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: optie '--%s' staat geen argument toe\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: optie '%c%s' staat geen argument toe\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: optie '%s' vereist een argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: onbekende optie '--%s'\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: onbekende optie '%c%s'\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: ongeldige optie -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: ongeldige optie -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: optie vereist een argument -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: optie '-W %s' is niet eenduidig\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: optie '-W %s' staat geen argument toe\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Expanderen van '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Evalueren van '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 "kan %lu bytes voor hashtabel niet reserveren: onvoldoende geheugen "
 "beschikbaar"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Belasting=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Belasting=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Herhash=%d, "
+msgid "Rehash=%u, "
+msgstr "Herhash=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Botsingen=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Botsingen=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Zoeken naar impliciete regel voor '%s'.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Zoeken naar archiefonderdeel-impliciete regel voor '%s'.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Impliciete regelrecursie wordt ontweken.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Stam is te lang: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Stam is te lang: '%s%.*s'.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Patroonregel wordt geprobeerd met stam '%.*s'.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Onmogelijke regelvereiste '%s' wordt verworpen.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Onmogelijke impliciete vereiste '%s' wordt verworpen.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Proberen van regelvereiste '%s'.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Proberen van impliciete vereiste '%s'.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Vereiste '%s' gevonden als VPATH '%s'.\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Zoeken naar een regel met tussentijds bestand '%s'.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Kan geen tijdelijk bestand aanmaken\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (geheugendump gemaakt)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (genegeerd)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<ingebouwd>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Fout %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Wachten op onvoltooide taken..."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Levend dochterproces %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (ginds)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Beëindigen van verliezend dochterproces %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Beëindigen van winnend dochterproces %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Beëindigen van verliezend dochterproces %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Opschonen van tijdelijk batch-bestand %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Opschonen van tijdelijk batch-bestand %s is mislukt (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Verwijderen van dochterproces %p PID %s%s uit de ketting.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Token vrijgegeven voor dochterproces %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() kan geen proces starten (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -702,100 +712,94 @@ msgstr ""
 "\n"
 "%d argumenten geteld bij mislukte start\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Opname van dochterproces %p (%s) PID %s%s in de ketting.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Token verkregen voor dochterproces %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: doel '%s' bestaat niet"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: bijwerken van doel '%s' vanwege: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "kan belastingsgrenzen niet afdwingen op dit besturingssysteem"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "kan belastingsgrens niet afdwingen: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 "geen bestandshandvatten meer beschikbaar: kan standaardinvoer niet "
 "dupliceren\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 "geen bestandshandvatten meer beschikbaar: kan standaarduitvoer niet "
 "dupliceren\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 "geen bestandshandvatten meer beschikbaar: kan standaardfoutuitvoer niet "
 "dupliceren\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Kan standaardinvoer niet herstellen\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Kan standaarduitvoer niet herstellen\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Kan standaardfoutuitvoer niet herstellen\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 "'make' heeft dochterproces met PID %s verwerkt, maar wacht nog op PID %s\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Opdracht niet gevonden\n"
-
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Opdracht niet gevonden\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Shell-programma niet gevonden"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: mogelijk geen omgevingsruimte meer beschikbaar"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL is gewijzigd (was '%s', is nu '%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Maken van tijdelijk batch-bestand %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -803,7 +807,7 @@ msgstr ""
 "Inhoud van batch-bestand:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -812,93 +816,88 @@ msgstr ""
 "Inhoud van batch-bestand:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (regel %d) Onjuiste shell-context (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-"Optie '-O[TYPE]' (--output-sync[=TYPE]) is niet meegecompileerd in dit "
-"programma."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Openen van globale symbolentabel is mislukt: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Geladen object %s is niet gedeclareerd als GPL-compatibel"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Laden van symbool %s uit %s is mislukt: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Lege symboolnaam om te laden: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Laden van symbool %s uit %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "De 'load'-operatie wordt op dit platform niet ondersteund."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opties:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr ""
 "  -b, -m                       (genegeerd, maar herkend wegens "
 "compatibiliteit)\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make            onvoorwaardelijk alle doelen maken\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
 "  -C MAP, --directory=MAP      naar deze map gaan alvorens iets te doen\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d                           veel informatie weergeven voor het debuggen\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=VLAGGEN]            verschillende soorten debuginformatie "
 "weergeven\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 "  -e, --environment-overrides  omgevingsvariabelen gaan boven Makefiles\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=TEKST                 deze TEKST als Makefile-statement evalueren\n"
+"  -E TEKST, --eval=TEKST       deze TEKST als Makefile-statement evalueren\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -907,15 +906,15 @@ msgstr ""
 "                               het gegeven bestand als Makefile gebruiken\n"
 "\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                   deze hulptekst tonen en stoppen\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors          alle fouten in recepten negeren\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -923,7 +922,7 @@ msgstr ""
 "  -I MAP, --include-dir=MAP    deze map doorzoeken naar ingesloten "
 "Makefiles\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -931,14 +930,14 @@ msgstr ""
 "  -j [N], --jobs[=N]           het uitvoeren van N taken tegelijk toestaan;\n"
 "                               zonder N is het aantal onbeperkt\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going             doorgaan als een doel niet gemaakt kan "
 "worden\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -948,7 +947,7 @@ msgstr ""
 "                               alleen extra taken starten als de\n"
 "                               systeembelasting lager is dan N\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -957,7 +956,7 @@ msgstr ""
 "                               de laatste wijzigingstijd gebruiken\n"
 "\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -966,7 +965,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                               recepten niet uitvoeren, alleen weergeven\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -976,7 +975,7 @@ msgstr ""
 "                               BESTAND als oud beschouwen, niet opnieuw "
 "maken\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -985,12 +984,12 @@ msgstr ""
 "                               uitvoer van parallelle taken synchroniseren "
 "op TYPE\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 "  -p, --print-data-base        interne gegevensbank van 'make' weergeven\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -998,47 +997,53 @@ msgstr ""
 "  -q, --question               geen recepten uitvoeren; de afsluitwaarde\n"
 "                               geeft aan of alles bijgewerkt is\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules       ingebouwde impliciete regels uitzetten\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables   ingebouwde instellingen van variabelen "
 "uitzetten\n"
 "\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet        recepten niet weergeven\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                  recepten weergeven (--silent-modus "
+"uitschakelen)\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr "  -S, --no-keep-going, --stop  optie '-k' uitzetten\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                  doelen aanraken in plaats van opnieuw maken\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                      tracing-informatie weergeven\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version                programmaversie tonen en stoppen\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory        de huidige map weergeven\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1046,7 +1051,7 @@ msgstr ""
 "  --no-print-directory         optie '-w' uitzetten, ook als deze impliciet\n"
 "                               was aangezet\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1054,7 +1059,7 @@ msgstr ""
 "  -W BESTAND, --what-if=BESTAND, --new-file=BESTAND, --assume-new=BESTAND\n"
 "                               BESTAND als oneindig nieuw beschouwen\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1062,26 +1067,27 @@ msgstr ""
 "  --warn-undefined-variables   waarschuwen als naar een ongedefinieerde\n"
 "                               variabele wordt verwezen\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "lege tekenreeks is ongeldig als bestandsnaam"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "onbekende aanduiding '%s' voor debug-niveau"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "onbekend uitvoersynchronisatie-type: '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Onderbreking/uitzondering gekregen (code = 0x%lx, adres = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1096,140 +1102,149 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Toegangsrechtenovertreding: schrijfopdracht op adres 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Toegangsrechtenovertreding: leesopdracht op adres 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() stelt default_shell = %s in\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 "find_and_set_shell() stelt na doorzoeken van pad default_shell = %s in\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s slaapt gedurende 30 seconden..."
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "klaar met 30 seconden slapen.  Make gaat verder.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "Waarschuwing: taakserver is onbeschikbaar: '-j1' wordt gebruikt.  Voeg '+' "
 "toe aan de ouderregel."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
-"Waarschuwing: '-jN' is afgedwongen in een deelproces: taakserver-modus "
+"Waarschuwing: '-j%d' is afgedwongen in een deelproces: taakserver-modus "
 "uitgezet."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile op standaardinvoer is dubbel opgegeven."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (tijdelijk bestand)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (tijdelijk bestand)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"Waarschuwing: '-j%d' is afgedwongen in makefile: taakserver-modus uitgezet."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Parallelle taken (-j) worden op dit platform niet ondersteund."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Opnieuw instellen op enkele-taakmodus (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr ""
 "Symbolische koppelingen worden niet ondersteund: '-L' wordt uitgeschakeld."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Bijwerken van Makefiles...\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Makefile '%s' bevat mogelijk een lus; wordt niet opnieuw gemaakt.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Opnieuw maken van Makefile '%s' is mislukt."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Ingesloten Makefile '%s' is niet gevonden."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Makefile '%s' is niet gevonden."
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Kan niet terugkeren naar oorspronkelijke map."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Opnieuw uitvoeren[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "verwijderen (van tijdelijk bestand): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL bevat meer dan één doel"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Geen doelen opgegeven en geen Makefile gevonden"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Geen doelen"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Geen doelen opgegeven en geen Makefile gevonden"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Bijwerken van doelen...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "Waarschuwing:  Klokafwijking geconstateerd.  Het maken is mogelijk "
 "onvolledig gebeurd."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Gebruik:  %s [OPTIES] [DOEL]...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1238,7 +1253,7 @@ msgstr ""
 "\n"
 "Dit programma is gecompileerd voor %s.\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1247,34 +1262,34 @@ msgstr ""
 "\n"
 "Dit programma is gecompileerd voor %s (%s).\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
-"Rapporteer programmafouten aan <bug-make@gnu.org>,\n"
+"Rapporteer programmafouten aan <bug-make@gnu.org>;\n"
 "meld gebreken in de vertaling aan <vertaling@vrijschrift.org>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "de optie '%s%sc' vereist een niet-lege tekenreeks als argument"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "de optie '-%c' vereist een positief geheel getal als argument"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sDit programma is gecompileerd voor %s.\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sDit programma is gecompileerd voor %s (%s).\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1288,7 +1303,7 @@ msgstr ""
 "verspreiden.\n"
 "%sEr is GEEN GARANTIE, voor zover de wet dit toestaat.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1297,7 +1312,7 @@ msgstr ""
 "\n"
 "# Make-gegevensbank, weergegeven op %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1306,345 +1321,384 @@ msgstr ""
 "\n"
 "# Make-gegevensbank voltooid op %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Onbekende fout %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: gebruiker %lu (echt %lu), groep %lu (echt %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Toegang geïnitialiseerd"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Gebruikerstoegang"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Make-toegang"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Dochterprocestoegang"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Een onbekende map wordt binnengegaan\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Een onbekende map wordt verlaten\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Map '%s' wordt binnengegaan\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Map '%s' wordt verlaten\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Een onbekende map wordt binnengegaan\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Een onbekende map wordt verlaten\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Map '%s' wordt binnengegaan\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Map '%s' wordt verlaten\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "schrijffout: standaarduitvoer"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Gestopt.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"Optie '-O[TYPE]' (--output-sync[=TYPE]) is niet meegecompileerd in dit "
+"programma."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "aanmaken van takenpijp"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "dupliceren van takenpijp"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "initialiseren van taakserverpijp"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "*interne fout*: ongeldige tekenreeks '%s' voor '--jobserver-auth'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Taakservercliënt (bestandsdescriptor %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "taakserverpijplijn"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "schrijven naar taakserver"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "taakserver is gestopt"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect() van takenpijp"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "lezen van takenpijp"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Lezen van Makefiles...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Lezen van Makefile '%s'"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (geen standaarddoel)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (zoekpad)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (maakt niet uit)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (geen expansie van ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "UTF-8 BOM in Makefile '%s' wordt overgeslagen\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "UTF-8 BOM in Makefile-buffer wordt overgeslagen\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "ongeldige syntax in voorwaardelijk deel"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: laden is mislukt"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "recept begint voor eerste doel"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "ontbrekende regel vóór recept"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr ""
 "ontbrekend scheidingsteken (bedoelde u een TAB in plaats van 8 spaties?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "ontbrekend scheidingsteken"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "ontbrekend doelpatroon"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "meerdere doelpatronen"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "doelpatroon bevat geen '%%'"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "ontbrekende 'endif'"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "lege naam van variabele"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "extra tekst na 'define'-opdracht"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "ontbrekende 'endef', onafgemaakte 'define'"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "extra tekst na 'endef'-opdracht"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "extra tekst na '%s'-opdracht"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "extra '%s'"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "slechts één 'else' per voorwaardelijk deel"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Onjuiste doelspecifieke variabele-definitie"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "vereisten kunnen niet in recepten gedefinieerd worden"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "gegroepeerde doelen moeten een recept geven"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "gemengde impliciete en statische patroonregels"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "gemengde impliciete en normale regels"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "doel '%s' komt niet overeen met doelpatroon"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "doelbestand '%s' heeft zowel ':'- als '::'-items"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "doel '%s' is meerdere keren gegeven in dezelfde regel"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "Waarschuwing: er wordt voorbijgegaan aan recept voor doel '%s'"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "Waarschuwing: oud recept voor doel '%s' wordt genegeerd"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** gemengde impliciete en normale regels: verouderde syntax"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr ""
+"Waarschuwing: er wordt voorbijgegaan aan groepslidmaatschap voor doel '%s'"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "Waarschuwing: NUL-teken gezien; de rest van de regel wordt genegeerd"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Er hoeft niets gedaan te worden voor '%s'."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "'%s' is up-to-date."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Snoeien van bestand '%s'.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sEr is geen regel om doel '%s' te maken, nodig voor '%s'%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sEr is geen regel om doel '%s' te maken%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Doelbestand '%s' wordt overwogen.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Bijwerken van bestand '%s' is recent geprobeerd en mislukt.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Bestand '%s' was al overwogen.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Bestand '%s' wordt nog bijgewerkt.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Bijwerken van bestand '%s' is voltooid.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Bestand '%s' bestaat niet.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1652,149 +1706,149 @@ msgstr ""
 "*** Waarschuwing: .LOW_RESOLUTION_TIME-bestand '%s' heeft een hoge-resolutie "
 "tijdsstempel"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Impliciete regel voor '%s' gevonden.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Geen impliciete regel voor '%s' gevonden.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Standaardrecept wordt gebruikt voor '%s'.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Circulaire afhankelijkheid %s <- %s is verworpen."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Vereisten van doelbestand '%s' zijn voltooid.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "De vereisten van '%s' worden nu gemaakt.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Pogingen voor doelbestand '%s' worden gestaakt.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Doel '%s' is niet opnieuw gemaakt vanwege fouten."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Vereiste '%s' is alleen-ordenen voor doel '%s'.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Vereiste '%s' van doel '%s' bestaat niet.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Vereiste '%s' is nieuwer dan doel '%s'.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Vereiste '%s' is ouder dan doel '%s'.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Doel '%s' is dubbeldubbelpunts en heeft geen vereisten.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Er is geen recept voor '%s', en geen van de vereisten is veranderd.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Maken van '%s' vanwege 'always-make'-vlag.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Doel '%s' hoeft niet opnieuw gemaakt te worden"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; VPATH-naam '%s' wordt gebruikt"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Doel '%s' moet opnieuw gemaakt worden.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  VPATH-naam '%s' wordt genegeerd.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Recept van '%s' wordt nu uitgevoerd.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Opnieuw maken van doelbestand '%s' is mislukt.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Doelbestand '%s' is met succes opnieuw gemaakt.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Doelbestand '%s' moet opnieuw worden gemaakt onder '-q'.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Standaardopdrachten worden gebruikt voor '%s'.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Waarschuwing: bestand '%s' heeft een wijzigingstijd in de toekomst"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr ""
 "Waarschuwing: bestand '%s' heeft een wijzigingstijd %s seconden in de "
 "toekomst"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS-element '%s' is geen patroon"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs kan niet exporteren: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1802,7 +1856,7 @@ msgstr ""
 "\n"
 "# Impliciete regels"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1810,184 +1864,180 @@ msgstr ""
 "\n"
 "# Geen impliciete regels."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u impliciete regels, %u"
+"# %u impliciete regels, %u (%.1f%%) eindpunten."
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "PROGRAMMAFOUT: num_pattern_rules() is verkeerd!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "onbekend signaal"
 
 # Vroeger ging dit over het afsluiten van een modemverbinding,
 # tegenwoordig over het afsluiten van een pseudoterminal.
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Opgehangen"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Onderbroken"
 
 # Verleden tijd, "Afgesloten", net als de andere actiesignaalnamen.
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Afgesloten"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Ongeldige instructie"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Traceer/breekpunt-instructie"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Afgebroken"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT-instructie"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT-instructie"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Drijvendekomma-berekeningsfout"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Geëlimineerd"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Busfout"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Segmentatiefout"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Onjuiste systeemaanroep"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Gebroken pijp"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Wekker"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Beëindigd"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Gebruikergedefinieerd signaal 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Gebruikergedefinieerd signaal 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Dochterproces is afgesloten"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Stroomstoring"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Gepauzeerd"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Gepauzeerd (terminalinvoer)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Gepauzeerd (terminaluitvoer)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Gepauzeerd (signaal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Limiet op processortijd is overschreden"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Limiet op bestandsgrootte is overschreden"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtuele timer is afgelopen"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Timer voor profilering is afgelopen"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Venster is veranderd"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Doorgegaan"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Urgente in-/uitvoertoestand"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "In-/uitvoer is mogelijk"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Hulpbron verloren"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Gevaarsignaal"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Verzoek om informatie"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Drijvendekomma-coprocessor is niet beschikbaar"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1996,7 +2046,7 @@ msgstr ""
 "\n"
 "%s Geen 'strcache'-buffers\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -2007,21 +2057,21 @@ msgstr ""
 "%s 'strcache'-buffers: %lu (%lu) / strings = %lu / opslag = %lu B / "
 "gemiddeld = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "%s huidig buffer: grootte = %hu B / gebruikt = %hu B / aantal = %hu / "
-"gemiddeld = %hu B\n"
+"gemiddeld = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 "%s andere gebruikte: totaal = %lu B / aantal = %lu / gemiddeld = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
@@ -2029,7 +2079,7 @@ msgstr ""
 "%s andere vrij: totaal = %lu B / max = %lu B / min = %lu B / gemiddeld = %hu "
 "B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2038,7 +2088,7 @@ msgstr ""
 "\n"
 "%s 'strcache'-prestatie: lookups = %lu / treffersverhouding = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2046,44 +2096,44 @@ msgstr ""
 "# hashtabel-statistieken van bestanden:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatisch"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "standaard"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "omgeving"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "Makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "omgeving onder -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "opdrachtregel"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "'override'-opdracht"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (uit '%s', regel %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# Statistieken van hashtabel van variabelenverzameling:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2091,7 +2141,7 @@ msgstr ""
 "\n"
 "# Variabelen\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2099,7 +2149,7 @@ msgstr ""
 "\n"
 "# Patroonspecifieke variabelewaarden"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2107,7 +2157,7 @@ msgstr ""
 "\n"
 "# Geen patroonspecifieke variabelewaarden"
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2116,49 +2166,49 @@ msgstr ""
 "\n"
 "# %u patroonspecifieke variabelewaarden"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "Waarschuwing: ongedefinieerde variabele '%.*s'"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() is mislukt met afsluitwaarde %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-waarschuwing: mogelijk dient u CTRL-Y-afhandeling opnieuw aan te zetten "
 "vanuit DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "INGEBOUWDE CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Uitvoer wordt toegevoegd aan %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Toevoegen van %.*s en opschoning\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "In plaats daarvan wordt %s uitgevoerd\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2166,11 +2216,11 @@ msgstr ""
 "\n"
 "# VPATH-zoekpaden\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Geen 'vpath'-zoekpaden."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2179,7 +2229,7 @@ msgstr ""
 "\n"
 "# %u 'vpath'-zoekpaden.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2187,7 +2237,7 @@ msgstr ""
 "\n"
 "# Geen algemeen zoekpad ('VPATH'-variabele)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2197,38 +2247,56 @@ msgstr ""
 "# Algemeen zoekpad ('VPATH'-variabele):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Taakserver-plaatsen zijn beperkt tot %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "aanmaken van taakserver-semafoor: (Fout %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 "*interne fout*: kan taakserver-semafoor '%s' niet openen: (Fout %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Taakservercliënt (semafoor %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "vrijgeven van taakserver-semafoor: (Fout %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "wachten op semafoor of dochterproces: (Fout %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Opdracht niet gevonden\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Shell-programma niet gevonden"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s slaapt gedurende 30 seconden..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "klaar met 30 seconden slapen.  Make gaat verder.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Onbekende fout %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Waarschuwing: bestand '%s' heeft een wijzigingstijd in de toekomst"
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: recept voor doel '%s' is mislukt"
 
@@ -2241,12 +2309,6 @@ msgstr "wachten op semafoor of dochterproces: (Fout %ld: %s)"
 #~ msgid "internal error: '%s' command_state"
 #~ msgstr "*interne fout*: '%s' command_state"
 
-#~ msgid "BUILTIN [%s][%s]\n"
-#~ msgstr "INGEBOUWD [%s][%s]\n"
-
-#~ msgid "BUILTIN ECHO %s->%s\n"
-#~ msgstr "INGEBOUWDE ECHO %s->%s\n"
-
 #~ msgid "Unknown builtin command '%s'\n"
 #~ msgstr "Onbekende ingebouwde opdracht '%s'\n"
 
@@ -2273,18 +2335,12 @@ msgstr "wachten op semafoor of dochterproces: (Fout %ld: %s)"
 #~ msgid "internal error: multiple --sync-mutex options"
 #~ msgstr "*interne fout*: meerdere opties '--sync-mutex'"
 
-#~ msgid "internal error: multiple --jobserver-fds options"
-#~ msgstr "*interne fout*: meerdere opties '--jobserver-fds'"
-
 #~ msgid "virtual memory exhausted"
 #~ msgstr "onvoldoende geheugen beschikbaar"
 
 #~ msgid "write error"
 #~ msgstr "schrijffout"
 
-#~ msgid "BUILTIN RM %s\n"
-#~ msgstr "INGEBOUWDE RM %s\n"
-
 #~ msgid "#  Invalid value in 'update_status' member!"
 #~ msgstr "#  Ongeldige waarde in 'update_status'-onderdeel!"
 
@@ -2303,28 +2359,9 @@ msgstr "wachten op semafoor of dochterproces: (Fout %ld: %s)"
 #~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n"
 #~ msgstr "%s Aantal strcache-buffers: %d (* %d bytes/buffer = %d bytes)\n"
 
-#~ msgid ""
-#~ "\n"
-#~ "# strcache hash-table stats:\n"
-#~ "# "
-#~ msgstr ""
-#~ "\n"
-#~ "# strcache-hashtabel-statistieken:\n"
-#~ "# "
-
 #~ msgid "process_easy() failed failed to launch process (e=%ld)\n"
 #~ msgstr "process_easy() kan geen proces starten (e=%ld)\n"
 
-#~ msgid ""
-#~ "%sThis is free software; see the source for copying conditions.\n"
-#~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
-#~ "%sPARTICULAR PURPOSE.\n"
-#~ msgstr ""
-#~ "%sDit is vrije programmatuur; zie de brontekst voor de "
-#~ "kopieervoorwaarden.\n"
-#~ "%sEr is GEEN garantie; zelfs niet voor VERHANDELBAARHEID of\n"
-#~ "%sGESCHIKTHEID VOOR EEN BEPAALD DOEL.\n"
-
 #~ msgid "empty `override' directive"
 #~ msgstr "lege 'override'-opdracht"
 
index 92319a5a8cf5f9390d1c3edbd141d77ff915ec59..da819d0ca0079157f8066edb767b9a81fba13189 100644 (file)
Binary files a/po/pl.gmo and b/po/pl.gmo differ
index e6d701a59f8b1f49fc9184abff1a8471c623259c..34d33fb169d02306cb01545414f6ae7147d64c33 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
 # Polish translation for GNU make.
-# Copyright (C) 1996, 2002, 2005, 2006, 2010, 2013, 2014, 2016 Free Software Foundation, Inc.
+# Copyright (C) 1996, 2002, 2005, 2006, 2010, 2013, 2014, 2016, 2019, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 # Paweł Krawczyk <kravietz@ceti.pl>, 1996.
-# Jakub Bogusz <qboosh@pld-linux.org>, 2002-2016.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2002-2020.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-22 21:47+0200\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 20:30+0100\n"
 "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
 "Language: pl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "próba użycia nieistniejącej funkcji: '%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "element biblioteki `touch' jest niedostępny pod VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Archiwum '%s' nie istnieje"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: '%s' nie jest poprawnym archiwum"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Brak elementu '%s' w '%s'"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: Błędny kod powrotu z ar_member_touch w '%s'"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "Uzyskanie informacji o module przez lnr$set_module() nie udało się, status = "
 "%d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() nie powiodło się, status = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "błąd otwarcia biblioteki '%s' podczas szukania stanu elementu %d"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Element '%s'%s: %ld bajtów pod %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (nazwa może zostać okrojona)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Data %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Polecenia mają za dużo linii (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Przerwano.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Element archiwum '%s' może być fałszywy; nie usunięty"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Element archiwum '%s' może być fałszywy; nie usunięty"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Kasuję plik '%s'"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Kasuję plik '%s'"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  polecenia do wykonania"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (wbudowane):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (z '%s', linia %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -132,221 +134,221 @@ msgstr ""
 "\n"
 "# Katalogi\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: stat() zwraca błąd.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (klucz %s, czas modyfikacji %ull): otwarcie było niemożliwe.\n"
+msgstr "# %s (klucz %s, czas modyfikacji %I64u): otwarcie było niemożliwe.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (urządzenie %d, i-węzeł [%d,%d,%d]): otwarcie było niemożliwe.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (urządzenie %ld, i-węzeł %ld): otwarcie było niemożliwe.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (klucz %s, czas modyfikacji %ull): "
+msgstr "# %s (klucz %s, czas modyfikacji %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (urządzenie %d, i-węzeł [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (urządzenie %ld, i-węzeł %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Nie"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " pliki, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "nie"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " niemożliwości"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " jak dotąd."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " niemożliwości w %lu katalogach.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Rekurencyjna zmienna '%s' wskazuje na samą siebie"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "niezakończone odwołanie do zmiennej"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Polecenia dla pliku '%s' podano w %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
 "Polecenia dla pliku '%s' zostały wyznaczone na podstawie reguł standardowych,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "ale '%s' jest teraz uznawany za ten sam plik co '%s'."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "Polecenia dla '%s' zostaną zignorowane na rzecz poleceń dla '%s'."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 "nie można przemianować '%s' z pojedynczym dwukropkiem na '%s' z podwójnym"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 "nie można przemianować '%s' z podwójnym dwukropkiem na '%s' z pojedynczym"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Kasowanie pliku pośredniego '%s'"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Kasowanie plików pośrednich...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Aktualny czas"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Oznaczenie czasu spoza zakresu; zastąpiono %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# To nie jest obiekt:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Cenny plik (zależność .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Obiekt niejawny (zależność .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Obiekt podany w linii poleceń."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Makefile domyślny, wymieniony w MAKEFILES lub -include/sinclude."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Reguła wbudowana"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Szukanie reguł domyślnych zostało wykonane."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Szukanie reguł domyślnych nie zostało wykonane."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Gałąź wzorców domyślnych/statycznych: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Plik jest zależnością przejściową."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Robi również:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Czas modyfikacji nie był sprawdzany."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Plik nie istnieje."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Plik jest bardzo stary."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Ostatnio modyfikowany %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Plik został uaktualniony."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Plik nie został uaktualniony."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Aktualnie uruchamiane polecenia (TO JEST BŁĄD)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Aktualnie uruchamiane polecenia zależności (TO JEST BŁĄD)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Uaktualnienie powiodło się."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Powinien być uaktualniony (-q jest włączone)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Uaktualnianie nie powiodło się."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Błędna wartość w elemencie 'command_state'!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -354,7 +356,7 @@ msgstr ""
 "\n"
 "# Pliki"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -364,333 +366,341 @@ msgstr ""
 "# statystyki tablic haszujących plików:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Pole '%s' nie zapamiętane w pamięci podręcznej: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "pierwszy argument funkcji 'word' nie jest liczbowy"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "pierwszy argument funkcji 'word' musi być większy od 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "pierwszy argument funkcji 'wordlist' nie jest liczbowy"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "drugi argument funkcji 'wordlist' nie jest liczbowy"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) nie powiodło się (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) nie powiodło się (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() nie powiodło się (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() nie powiodło się\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Czyszczę tymczasowy plik wsadowy %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "plik: brak nazwy"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "otwarcie: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "zapis: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "zamknięcie: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "plik: zbyt dużo argumentów"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "odczyt: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "plik: błędna operacja na pliku: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "niewystarczająca liczba argumentów (%d) dla funkcji '%s'"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "funkcja '%s' nie jest zaimplementowana na tej platformie"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "nie dokończone wywołanie funkcji '%s': brak '%c'"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Pusta nazwa funkcji"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Błędna nazwa funkcji: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Zbyt długa nazwa funkcji: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Błędna minimalna liczba argumentów (%u) dla funkcji %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Błędna maksymalna liczba argumentów (%u) dla funkcji %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: opcja '%s' jest niejednoznaczna\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: opcja '--%s' nie przyjmuje argumentów\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: opcja '%c%s' nie może mieć argumentów\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: opcja '%s' musi mieć argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: nieznana opcja '--%s'\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: nieznana opcja '%c%s'\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: niedozwolona opcja -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: błędna opcja -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: opcja musi mieć argument -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: opcja '-W %s' jest niejednoznaczna\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: opcja '-W %s' nie może mieć argumentów\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Rozwijanie '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Wyliczanie '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr ""
 "nie można przydzielić %lu bajtów na tablicę haszującą: pamięć wyczerpana"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Wypełnienie=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Wypełnienie=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Przehaszowania=%d, "
+msgid "Rehash=%u, "
+msgstr "Przehaszowania=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Kolizje=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Kolizje=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Szukanie standardowej reguły dla '%s'.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Szukanie standardowej reguły typu archive-member dla '%s'.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Pomijanie rekurencyjnego wywołania reguły standardowej.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Gałąź zbyt długa: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Gałąź zbyt długa: '%s%.*s'.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Próbowanie reguły wzorcowej z gałęzią '%.*s'.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Odrzucenie niemożliwej zależności reguły '%s'.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Odrzucenie niemożliwej zależności domyślnej '%s'.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Próbowanie zależności reguły '%s'.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Próbowanie zależności domyślnej '%s'.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Znaleziono zależność '%s' jako VPATH '%s'\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Szukanie reguły zawierającej plik przejściowy '%s'.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Nie można utworzyć pliku tymczasowego\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (zrzut pamięci)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (zignorowano)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<wbudowane>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Błąd %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Oczekiwanie na niezakończone zadania...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Żyjący potomek %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (zdalne)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Zbieranie przegrywającego potomka %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Zbieranie wygrywającego potomka %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Zbieranie przegrywającego potomka %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Czyszczenie tymczasowego pliku wsadowego %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Czyszczenie tymczasowego pliku wsadowego %s nie powiodło się (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Usuwanie potomka %p PID %s%s z kolejki.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Zwolniony token dla potomka %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() nie mógł uruchomić procesu (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -699,93 +709,87 @@ msgstr ""
 "\n"
 "Naliczono %d parametrów nieudanego uruchomienia\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Wstawianie potomka %p (%s) PID %s%s do kolejki.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Otrzymano token dla potomka %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: obiekt '%s' nie istnieje"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: uaktualnianie obiektu '%s' z powodu: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "niemożliwe wymuszenie limitów obciążenia w tym systemie"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "niemożliwe wymuszenie limitu obciążenia: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "nie ma więcej uchwytów plików: nie można powielić stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "nie ma więcej uchwytów plików: nie można powielić stdout\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "nie ma więcej uchwytów plików: nie można powielić stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Nie można odtworzyć stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Nie można odtworzyć stdout\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Nie można odtworzyć stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make usunął potomka pid %s, nadal czeka na pid %s\n"
 
-#: job.c:2275
+#: src/job.c:2623
 #, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Polecenie nie znalezione\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Polecenie nie znalezione\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Nie znaleziono programu powłoki"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: mogło zabraknąć miejsca na środowisko"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL się zmienił (był '%s', jest '%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Tworzenie tymczasowego pliku wsadowego %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -793,7 +797,7 @@ msgstr ""
 "Zawartość pliku wsadowego:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -802,59 +806,55 @@ msgstr ""
 "Zawartość pliku wsadowego:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (linia %d) Zły kontekst powłoki (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-"-O[TYP] (--output-sync[=TYP]) nie zostało skonfigurowane przy tym budowaniu."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Nie udało się otworzyć tablicy symboli globalnych: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Wczytany obiekt %s nie jest zadeklarowany jako kompatybilny z GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Nie udało się wczytać symbolu %s z %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Pusta nazwa symbolu do wczytania: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Wczytywanie symbolu %s z %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Operacja 'load' nie jest obsługiwana na tej platformie"
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Opcje:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ignorowane dla kompatybilności.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Bezwarunkowe utworzenie wszystkich obiektów.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -863,19 +863,19 @@ msgstr ""
 "                              Przejście do KATALOGu przed robieniem\n"
 "                              czegokolwiek.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d                          Wyświetla dużo informacji diagnostycznych.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=FLAGI]             Wyświetla różne rodzaje informacji\n"
 "                              diagnostycznych.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -883,14 +883,14 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              Zmienne środowiska przykrywają makefile.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=ŁAŃCUCH              Wyznacza ŁAŃCUCH jako instrukcję pliku "
+"  -E ŁAŃCUCH, --eval=ŁAŃCUCH  Wyznacza ŁAŃCUCH jako instrukcję pliku "
 "makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -898,16 +898,16 @@ msgstr ""
 "  -f PLIK, --file=PLIK, --makefile=PLIK\n"
 "                              Czyta PLIK jako makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr ""
 "  -h, --help                  Wyświetla ten komunikat i kończy działanie.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Ignoruje błędy poleceń.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -915,7 +915,7 @@ msgstr ""
 "  -I KATALOG, --include-dir=KATALOG\n"
 "                              Szuka dołączanych makefile w KATALOGu.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -923,14 +923,14 @@ msgstr ""
 "  -j [N], --jobs[=N]          Dopuszcza N zadań naraz; brak N oznacza brak\n"
 "                              ograniczeń.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Kontynuuj jeśli nie da się zrobić jakichś\n"
 "                              obiektów.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -941,7 +941,7 @@ msgstr ""
 "jest\n"
 "                              poniżej N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -949,7 +949,7 @@ msgstr ""
 "  -L, --check-symlink-times   Używanie ostatniego mtime między dowiązaniem a "
 "celem.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -958,7 +958,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Nie wykonuje poleceń; jedynie je wyświetla.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -969,7 +969,7 @@ msgstr ""
 "go\n"
 "                              ponownie.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -978,11 +978,11 @@ msgstr ""
 "                              Sposób synchronizacji wyjścia zadań "
 "równoległych.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Wyświetla wewnętrzną bazę danych make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -990,20 +990,25 @@ msgstr ""
 "  -q, --question              Nie uruchamia żadnych poleceń; status powrotu\n"
 "                              wskazuje aktualność.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      Wyłącza wbudowane reguły standardowe.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Wyłącza ustawianie wbudowanych zmiennych.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Nie wypisuje poleceń.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Wypisuje polecenia (wyłącza tryb --silent).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1011,25 +1016,25 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Wyłącza -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr "  -t, --touch                 Uaktualnia obiekty zamiast je robić.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Wypisywanie informacji ze śledzenia.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Wyświetla wersję make i kończy działanie.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Wyświetla aktualny katalog.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1037,7 +1042,7 @@ msgstr ""
 "  --no-print-directory        Wyłącza -w, nawet jeśli było ono włączone\n"
 "                              domyślnie.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1045,7 +1050,7 @@ msgstr ""
 "  -W PLIK, --what-if=PLIK, --new-file=PLIK, --assume-new=PLIK\n"
 "                              Uznaje PLIK za nieskończenie nowy.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1054,26 +1059,27 @@ msgstr ""
 "niezdefiniowanych\n"
 "                              zmiennych.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "pusty łańcuch nie może być nazwą pliku"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "nieznany poziom diagnostyki '%s'"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "nieznany sposób synchronizacji wyjścia '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: złapano przerwanie/wyjątek (kod = 0x%lx, adres = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1088,134 +1094,142 @@ msgstr ""
 "ExceptionFlags = %lx\n"
 "ExceptionAddress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Naruszenie praw dostępu: zapis pod adresem 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Naruszenie praw dostępu: odczyt spod adresu 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() ustawia default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell() ustawia ścieżkę wyszukiwania default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s jest zawieszony na 30 sekund..."
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "zakończono sleep(30). Kontynuacja.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "uwaga: serwer zadań niedostępny: użycie -j1. Należy dodać `+' do nadrzędnej "
 "reguły make."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "uwaga: -jN wymuszone w podzadaniu: wyłączanie trybu serwera zadań."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "uwaga: -j%d wymuszone w podzadaniu: wyłączanie trybu serwera zadań."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile ze standardowego wejścia podano dwukrotnie."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (plik tymczasowy)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (plik tymczasowy)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "uwaga: -j%d wymuszone w podzadaniu: wyłączanie trybu serwera zadań."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Równoległe zadania (-j) nie są obsługiwane na tej platformie"
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Przełączanie w tryb jednozadaniowy (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Dowiązania symboliczne nie są obsługiwane: wyłączono -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Uaktualnianie plików makefile....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Plik makefile '%s' może się zapętlić; bez ponownego przetwarzania.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Nie udało się ponownie przetworzyć pliku makefile '%s'."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Nie znaleziono włączanego pliku makefile '%s'."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Nie znaleziono pliku makefile '%s'"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Niemożliwy powrót do katalogu startowego."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Ponowne uruchamianie[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (plik tymczasowy): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL zawiera więcej niż jeden cel"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Nie podano obiektów i nie znaleziono makefile"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Brak obiektów"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Nie podano obiektów i nie znaleziono makefile"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Uaktualnianie obiektów docelowych....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr "uwaga:  Wykryto przestawienie zegara. Budowanie może być niekompletne."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Składnia: %s [opcje] [obiekt] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1224,7 +1238,7 @@ msgstr ""
 "\n"
 "Ten program został zbudowany dla %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1233,32 +1247,32 @@ msgstr ""
 "\n"
 "Ten program został zbudowany dla %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Błędy proszę zgłaszać na adres <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "opcja '%s%s' wymaga niepustego łańcucha jako argumentu"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "opcja '-%c' wymaga argumentu będącego liczbą całkowitą dodatnią"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sTen program został zbudowany dla systemu %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sTen program został zbudowany dla systemu %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1272,7 +1286,7 @@ msgstr ""
 "rozpowszechniać.\n"
 "%sNie ma ŻADNEJ GWARANCJI w zakresie dopuszczalnym przez prawo.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1281,7 +1295,7 @@ msgstr ""
 "\n"
 "# Baza danych Make, wyświetlana na %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1290,344 +1304,381 @@ msgstr ""
 "\n"
 "# Zakończono tworzenie bazy danych Make na %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Nieznany błąd %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: użytkownik %lu (rzeczywisty %lu), grupa %lu (rzeczywista %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Zainicjalizowany dostęp"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Dostęp użytkownika"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Dostęp make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Dostęp potomka"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Wejście do nieznanego katalogu\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Opuszczenie nieznanego katalogu\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Wejście do katalogu '%s'\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Opuszczenie katalogu '%s'\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Wejście do nieznanego katalogu\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Opuszczenie nieznanego katalogu\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Wejście do katalogu '%s'\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Opuszczenie katalogu '%s'\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "błąd zapisu: standardowe wyjście"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ". Stop.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"-O[TYP] (--output-sync[=TYP]) nie zostało skonfigurowane przy tym budowaniu."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "tworzenie potoku zadań"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "duplikowanie potoku zadań"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "inicjowanie potoku serwera zadań"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "błąd wewnętrzny: błędny łańcuch --jobserver-auth '%s'"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Klient serwera zadań (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "potok serwera zadań"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "zapis do serwera zadań"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "serwer zadań zamknięty"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect potoku zadań"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "odczyt potoku zadań"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Czytanie makefile...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Czytanie pliku makefile '%s'"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (brak celu domyślnego)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (przeszukiwana ścieżka)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (nieważne)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (brak rozszerzenia ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Pominięto BOM UTF-8 w pliku makefile '%s'\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Pominięto BOM UTF-8 w buforze pliku makefile\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "błędna składnia wyrażenia warunkowego"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: nie udało się załadować"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "polecenia zaczynają się przed pierwszym obiektem"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "brakuje reguły przed poleceniami"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "brakujący separator (czyżby miał być TAB zamiast 8 spacji?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "brakujący separator"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "brakujący wzorzec obiektu"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "wielokrotne wzorce obiektu"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "wzorzec obiektu nie zawiera '%%'"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "brakujący 'endif'"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "pusta nazwa zmiennej"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "nadmiarowy tekst po dyrektywie 'define'"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "brakujący 'endef', niezakończone 'define'"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "nadmiarowy tekst po dyrektywie 'endef'"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "niezwiązany tekst po dyrektywie '%s'"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "nadmiarowy '%s'"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "tylko jedno 'else' w wyrażeniu warunkowym"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Źle sformułowana definicja zmiennej dla celu"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "wymagania nie mogą być definiowane w opisach poleceń"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "pogrupowane obiekty muszą dostarczać opis polecenia"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "pomieszane standardowe i statyczne reguły wzorców"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "pomieszane standardowe i normalne reguły"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "obiekt '%s' nie pasuje do wzorca obiektu"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "plik obiektu '%s' ma pozycje i : i ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "obiekt '%s' podany wielokrotnie w tej samej regule"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "uwaga: polecenia zakrywające dla obiektu '%s'"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "uwaga: ignoruję stare polecenia dla obiektu '%s'"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** pomieszane reguły standardowe i normalne: przestarzała składnia"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "uwaga: zakrycie członkowstwa w grupie dla obiektu '%s'"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "uwaga: napotkałem na znak NUL; reszta linii zignorowana"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Nie ma nic do zrobienia w '%s'."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "'%s' jest aktualne."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Czyszczenie pliku '%s'.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sBrak reguł do zrobienia obiektu '%s', wymaganego przez '%s'%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sBrak reguł do wykonania obiektu '%s'%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Przetwarzanie pliku obiektowego '%s'.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Już bez powodzenia próbowałem uaktualnić plik '%s'.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Plik '%s' był już przetwarzany.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Wciąż uaktualniam plik '%s'.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Skończyłem uaktualniać plik '%s'.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Plik '%s' nie istnieje.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1635,148 +1686,148 @@ msgstr ""
 "*** Uwaga: plik .LOW_RESOLUTION_TIME '%s' ma dużą rozdzielczość znacznika "
 "czasu"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Znaleziono standardową regułę dla '%s'.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Brak standardowych reguł dla '%s'.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Stosowanie standardowych poleceń dla '%s'.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Okrężna dyrektywa %s <- %s porzucona."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Zakończono zależności pliku obiektu '%s'.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Zależności '%s' są wykonywane.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Zaniechany plik obiektowy '%s'.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Obiekt '%s' nie został ponownie wykonany z powodu błędów."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Zależność '%s' dotyczy tylko kolejności dla obiektu '%s'.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Zależność '%s' obiektu '%s' nie istnieje.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Zależność '%s' jest nowsza od obiektu '%s'.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Zależność '%s' jest starsza od obiektu '%s'.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr ""
 "Obiekt '%s' jest z podwójnym dwukropkiem i nie ma żadnych zależności.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Brak poleceń dla '%s' i brak zmienionych zależności.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Tworzenie '%s' z powodu flagi always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Nie ma potrzeby ponownego robienia obiektu '%s'"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; użyto nazwy VPATH '%s'"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Konieczne ponowne wykonanie obiektu '%s'.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Zignorowano nazwę VPATH '%s'.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Uruchomiono polecenia dla '%s'.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Ponowne tworzenie pliku obiektu '%s' nie powiodło się.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Ponowne tworzenie pliku obiektu '%s' powiodło się.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Plik obiektu '%s' powinien być ponownie tworzony z opcją -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Stosowanie standardowych poleceń dla '%s'.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Uwaga: Plik '%s' ma czas modyfikacji z przyszłości"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Uwaga: Plik '%s' ma czas modyfikacji %s s w przyszłości"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "Element .LIBPATTERNS '%s' nie jest wzorcem"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Zasady nie eksportowane: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1784,7 +1835,7 @@ msgstr ""
 "\n"
 "# Reguły stadardowe"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1792,181 +1843,177 @@ msgstr ""
 "\n"
 "# Brak standardowych reguł."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u standardowych reguł, %u"
-
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
+"# %u standardowych reguł, %u (%.1f%%) końcowych."
 
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BŁĄD: złe num_pattern_rules! %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "nieznany sygnał"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Rozłączenie"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Przerwanie"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Wyjście"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Błędna instrukcja"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Pułapka śledzenia"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Przerwany"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Pułapka IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Pułapka EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Wyjątek zmiennoprzecinkowy"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Zabity"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Błąd szyny"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Naruszenie ochrony pamięci"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Błędne wywołanie systemowe"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Przerwany potok"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Budzik"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Zakończony"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Sygnał użytkownika 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Sygnał użytkownika 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Potomek powrócił"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Przerwa w zasilaniu"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Zatrzymany"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Zatrzymany (wejście z tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Zatrzymany (wyjście na tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Zatrzymany (sygnał)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Przekroczony czas CPU"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Przekroczony limit wielkości pliku"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Wyczerpany stoper wirtualny"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Wyczerpany stoper profilujący"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Zmienione okno"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Kontynuowany"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Nagła sytuacja I/O"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O możliwe"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Zaginione zasoby"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Sygnał niebezpieczeństwa"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Żądanie informacji"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Koprocesor obliczeń zmiennoprzecinkowych niedostępny"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1975,7 +2022,7 @@ msgstr ""
 "\n"
 "%s Brak buforów strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1986,26 +2033,26 @@ msgstr ""
 "%s bufory strcache: %lu (%lu) / łańcuchów = %lu / miejsce = %lu B / śr = %lu "
 "B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s bieżący buf: rozmiar = %hu B / użyty = %hu B / liczba = %hu / śr = %hu B\n"
+"%s bieżący buf: rozmiar = %hu B / użyty = %hu B / liczba = %hu / śr = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s pozostałe użyte: razem = %lu B / liczba = %lu / śr = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s pozostałe wolne: razem = %lu B / maks = %lu B / min = %lu B / śr = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2014,7 +2061,7 @@ msgstr ""
 "\n"
 "%s wydajność strcache: wyszukiwań = %lu / wsp. trafień = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2022,44 +2069,44 @@ msgstr ""
 "# statystyki tablic haszujących:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatyczna"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "domyślna"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "środowiskowa"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "środowisko pod -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "z linii poleceń"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "dyrektywa 'override'"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (z '%s', linia %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# statystyki tablic haszujących ustawionych zmiennych:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2067,7 +2114,7 @@ msgstr ""
 "\n"
 "# Zmienne\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2075,7 +2122,7 @@ msgstr ""
 "\n"
 "# Wartości zmiennych dla wzorca"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2083,7 +2130,7 @@ msgstr ""
 "\n"
 "# Brak wartości zmiennych dla wzorca."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2092,47 +2139,47 @@ msgstr ""
 "\n"
 "# %u wartości zmiennych dla wzorca"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "uwaga: niezdefiniowana zmienna '%.*s'"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() nie powiodło się - %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-uwaga, będzie trzeba ponownie umożliwić obsługę CTRL-Y z DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "WBUDOWANE CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Dołączanie wyjścia do %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Dołączanie %.*s i czyszczenie\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Zamiast tego wykonywanie %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2140,11 +2187,11 @@ msgstr ""
 "\n"
 "# Ścieżki przeszukiwania VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Brak ścieżek przeszukiwania 'vpath'"
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2153,7 +2200,7 @@ msgstr ""
 "\n"
 "# %u ścieżek przeszukiwania 'vpath'.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2161,7 +2208,7 @@ msgstr ""
 "\n"
 "# Brak ogólnej (zmienna 'VPATH') ścieżki przeszukiwania."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2171,17 +2218,17 @@ msgstr ""
 "# Ogólna (zmienna 'VPATH') ścieżka przeszukiwania:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Pojemność serwera zadań ograniczona do %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "tworzenie semafora serwera zadań: (Błąd %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
@@ -2189,17 +2236,17 @@ msgstr ""
 "błąd wewnętrzny: nie udało się otworzyć semafora serwera zadań '%s': (Błąd "
 "%ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Klient serwera zadań (semafor %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "zwalnianie semafora serwera zadań: (Błąd %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "oczekiwanie na semafor lub proces potomny: (Błąd %ld: %s)"
diff --git a/po/pt.gmo b/po/pt.gmo
new file mode 100644 (file)
index 0000000..c0c750e
Binary files /dev/null and b/po/pt.gmo differ
diff --git a/po/pt.po b/po/pt.po
new file mode 100644 (file)
index 0000000..ab04c11
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,2266 @@
+# Portuguese (Portugal) translation for the "make" package.
+# Copyright (C) 2018 Free Software Foundation, Inc.
+# This file is distributed under the same license as the make package.
+# Pedro Albuquerque <pmra@protonmail.com>, 2018, 2019, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU make 4.2.93\n"
+"Report-Msgid-Bugs-To: bug-make@gnu.org\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-04 07:21+0000\n"
+"Last-Translator: Pedro Albuquerque <pmra@protonmail.com>\n"
+"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 2.91.7\n"
+
+#: src/ar.c:46
+#, c-format
+msgid "attempt to use unsupported feature: '%s'"
+msgstr "tentativa de usar funcionalidade não suportada: \"%s\""
+
+#: src/ar.c:123
+#, c-format
+msgid "touch archive member is not available on VMS"
+msgstr "membro de touch arquivo indisponível em VMS"
+
+#: src/ar.c:147
+#, c-format
+msgid "touch: Archive '%s' does not exist"
+msgstr "touch: arquivo \"%s\" não existe"
+
+#: src/ar.c:150
+#, c-format
+msgid "touch: '%s' is not a valid archive"
+msgstr "touch: \"%s\" não é um arquivo válido"
+
+#: src/ar.c:157
+#, c-format
+msgid "touch: Member '%s' does not exist in '%s'"
+msgstr "touch: membro \"%s\" não existe em \"%s\""
+
+#: src/ar.c:164
+#, c-format
+msgid "touch: Bad return code from ar_member_touch on '%s'"
+msgstr "touch: mau código de retorno de ar_member_touch em \"%s\""
+
+#: src/arscan.c:130
+#, c-format
+msgid "lbr$set_module() failed to extract module info, status = %d"
+msgstr "lbr$set_module() falhou ao extrair informação do módulo, estado = %d"
+
+#: src/arscan.c:236
+#, c-format
+msgid "lbr$ini_control() failed with status = %d"
+msgstr "lbr$ini_control() falhou com estado = %d"
+
+#: src/arscan.c:261
+#, c-format
+msgid "unable to open library '%s' to lookup member status %d"
+msgstr ""
+"impossível abrir biblioteca \"%s\" para procurar estado do membro \"%d\""
+
+#: src/arscan.c:944
+#, c-format
+msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
+msgstr "Membro \"%s\"%s: %ld bytes em %ld (%ld).\n"
+
+#: src/arscan.c:945
+msgid " (name might be truncated)"
+msgstr " (nome pode estar truncado)"
+
+#: src/arscan.c:947
+#, c-format
+msgid "  Date %s"
+msgstr "  Data %s"
+
+#: src/arscan.c:948
+#, c-format
+msgid "  uid = %d, gid = %d, mode = 0%o.\n"
+msgstr "  uid = %d, gid = %d, modo = 0%o.\n"
+
+#: src/commands.c:403
+#, c-format
+msgid "Recipe has too many lines (%ud)"
+msgstr "Receita com demasiadas linhas (%ud)"
+
+#: src/commands.c:504
+msgid "*** Break.\n"
+msgstr "*** Break.\n"
+
+#: src/commands.c:628
+#, c-format
+msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
+msgstr "*** [%s] membro do arquivo \"%s\" pode ser fictício; não eliminado"
+
+#: src/commands.c:632
+#, c-format
+msgid "*** Archive member '%s' may be bogus; not deleted"
+msgstr "*** membro do arquivo \"%s\" pode ser fictício; não eliminado"
+
+#: src/commands.c:646
+#, c-format
+msgid "*** [%s] Deleting file '%s'"
+msgstr "*** [%s] a eliminar ficheiro \"%s\""
+
+#: src/commands.c:648
+#, c-format
+msgid "*** Deleting file '%s'"
+msgstr "*** a eliminar ficheiro \"%s\""
+
+#: src/commands.c:684
+msgid "#  recipe to execute"
+msgstr "#  receita a executar"
+
+#: src/commands.c:687
+msgid " (built-in):"
+msgstr " (interno):"
+
+#: src/commands.c:689
+#, c-format
+msgid " (from '%s', line %lu):\n"
+msgstr " (de \"%s\", linha %lu):\n"
+
+#: src/dir.c:1073
+msgid ""
+"\n"
+"# Directories\n"
+msgstr ""
+"\n"
+"# Pastas\n"
+
+#: src/dir.c:1085
+#, c-format
+msgid "# %s: could not be stat'd.\n"
+msgstr "# %s: impossível obter estatísticas.\n"
+
+#: src/dir.c:1089
+msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
+msgstr "# %s (chave %s, mtime %I64u): impossível abrir.\n"
+
+#: src/dir.c:1094
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
+msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): impossível abrir.\n"
+
+#: src/dir.c:1099
+#, c-format
+msgid "# %s (device %ld, inode %ld): could not be opened.\n"
+msgstr "# %s (dispositivo %ld, inode %ld): impossível abrir.\n"
+
+#: src/dir.c:1126
+msgid "# %s (key %s, mtime %I64u): "
+msgstr "# %s (chave %s, mtime %I64u): "
+
+#: src/dir.c:1131
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): "
+msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): "
+
+#: src/dir.c:1136
+#, c-format
+msgid "# %s (device %ld, inode %ld): "
+msgstr "# %s (dispositivo %ld, inode %ld): "
+
+#: src/dir.c:1142 src/dir.c:1163
+msgid "No"
+msgstr "Não"
+
+#: src/dir.c:1145 src/dir.c:1166
+msgid " files, "
+msgstr " ficheiros, "
+
+#: src/dir.c:1147 src/dir.c:1168
+msgid "no"
+msgstr "não"
+
+#: src/dir.c:1150
+msgid " impossibilities"
+msgstr " impossibilidades"
+
+#: src/dir.c:1154
+msgid " so far."
+msgstr " até agora."
+
+#: src/dir.c:1171
+#, c-format
+msgid " impossibilities in %lu directories.\n"
+msgstr " impossibilidades em %lu pastas.\n"
+
+#: src/expand.c:125
+#, c-format
+msgid "Recursive variable '%s' references itself (eventually)"
+msgstr "Variável recursiva \"%s\" referencia-se a si própria (eventualmente)"
+
+#: src/expand.c:271
+#, c-format
+msgid "unterminated variable reference"
+msgstr "referencia de variável não terminada"
+
+#: src/file.c:278
+#, c-format
+msgid "Recipe was specified for file '%s' at %s:%lu,"
+msgstr "Receita especificada para ficheiro \"%s\" em %s:%lu,"
+
+#: src/file.c:283
+#, c-format
+msgid "Recipe for file '%s' was found by implicit rule search,"
+msgstr ""
+"Receita para ficheiro \"%s\" foi encontrada por procura com regra implícita,"
+
+#: src/file.c:287
+#, c-format
+msgid "but '%s' is now considered the same file as '%s'."
+msgstr "mas \"%s\" é agora considerado o mesmo ficheiro que \"%s\"."
+
+#: src/file.c:290
+#, c-format
+msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
+msgstr "Receita para \"%s\" será ignorada em favor da receita para \"%s\"."
+
+#: src/file.c:310
+#, c-format
+msgid "can't rename single-colon '%s' to double-colon '%s'"
+msgstr "impossível renomear dois-pontos \"%s\" para dois-pontos duplos \"%s\""
+
+#: src/file.c:316
+#, c-format
+msgid "can't rename double-colon '%s' to single-colon '%s'"
+msgstr "impossível renomear dois-pontos duplos \"%s\" para dois-pontos \"%s\""
+
+#: src/file.c:408
+#, c-format
+msgid "*** Deleting intermediate file '%s'"
+msgstr "*** A eliminar ficheiro intermédio \"%s\""
+
+#: src/file.c:412
+#, c-format
+msgid "Removing intermediate files...\n"
+msgstr "A remover ficheiros intermédios...\n"
+
+#: src/file.c:872
+msgid "Current time"
+msgstr "Hora actual"
+
+#: src/file.c:876
+#, c-format
+msgid "%s: Timestamp out of range; substituting %s"
+msgstr "%s: datação fora do intervalo; a substituir %s"
+
+#: src/file.c:1016
+msgid "# Not a target:"
+msgstr "# Não é um alvo:"
+
+#: src/file.c:1021
+msgid "#  Precious file (prerequisite of .PRECIOUS)."
+msgstr "#  Ficheiro precioso (pré-requisito de .PRECIOUS)."
+
+#: src/file.c:1023
+msgid "#  Phony target (prerequisite of .PHONY)."
+msgstr "#  Alvo falso (pré-requisito de .PHONY)."
+
+#: src/file.c:1025
+msgid "#  Command line target."
+msgstr "#  Alvo da linha de comandos."
+
+#: src/file.c:1027
+msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
+msgstr "#  A predefinição, MAKEFILES, ou -include/sinclude makefile."
+
+#: src/file.c:1029
+msgid "#  Builtin rule"
+msgstr "#  Regra interna"
+
+#: src/file.c:1031
+msgid "#  Implicit rule search has been done."
+msgstr "#  Foi feita uma procura com regra implícita."
+
+#: src/file.c:1032
+msgid "#  Implicit rule search has not been done."
+msgstr "#  Não foi feita uma procura com regra implícita."
+
+#: src/file.c:1034
+#, c-format
+msgid "#  Implicit/static pattern stem: '%s'\n"
+msgstr "#  Haste de padrão implícito/estático: \"%s\"\n"
+
+#: src/file.c:1036
+msgid "#  File is an intermediate prerequisite."
+msgstr "#  O ficheiro é um pré-requisito imediato."
+
+#: src/file.c:1040
+msgid "#  Also makes:"
+msgstr "#  Também faz:"
+
+#: src/file.c:1046
+msgid "#  Modification time never checked."
+msgstr "#  Hora de modificação nunca verificada."
+
+#: src/file.c:1048
+msgid "#  File does not exist."
+msgstr "#  O ficheiro não existe."
+
+#: src/file.c:1050
+msgid "#  File is very old."
+msgstr "#  O ficheiro é muito antigo."
+
+#: src/file.c:1055
+#, c-format
+msgid "#  Last modified %s\n"
+msgstr "#  Última modificação %s\n"
+
+#: src/file.c:1058
+msgid "#  File has been updated."
+msgstr "#  O ficheiro foi actualizado."
+
+#: src/file.c:1058
+msgid "#  File has not been updated."
+msgstr "#  O ficheiro não foi actualizado."
+
+#: src/file.c:1062
+msgid "#  Recipe currently running (THIS IS A BUG)."
+msgstr "#  Receita actualmente em execução (ISTO É UM ERRO)."
+
+#: src/file.c:1065
+msgid "#  Dependencies recipe running (THIS IS A BUG)."
+msgstr "#  Receita de dependências em execução (ISTO É UM ERRO)."
+
+#: src/file.c:1074
+msgid "#  Successfully updated."
+msgstr "#  Actualizado com sucesso."
+
+#: src/file.c:1078
+msgid "#  Needs to be updated (-q is set)."
+msgstr "#  Precisa de actualização (-q está definido)."
+
+#: src/file.c:1081
+msgid "#  Failed to be updated."
+msgstr "#  Falha ao actualizar."
+
+#: src/file.c:1086
+msgid "#  Invalid value in 'command_state' member!"
+msgstr "#  Valor inválido no membro \"command_state\"!"
+
+#: src/file.c:1105
+msgid ""
+"\n"
+"# Files"
+msgstr ""
+"\n"
+"# Ficheiros"
+
+#: src/file.c:1109
+msgid ""
+"\n"
+"# files hash-table stats:\n"
+"# "
+msgstr ""
+"\n"
+"# estatísticas da hash-table dos ficheiros:\n"
+"# "
+
+#: src/file.c:1119
+#, c-format
+msgid "%s: Field '%s' not cached: %s"
+msgstr "%s: campo \"%s\" não armazenado em cache: %s"
+
+#: src/function.c:794
+msgid "non-numeric first argument to 'word' function"
+msgstr "primeiro argumento de função \"word\" não-numérico"
+
+#: src/function.c:799
+#, c-format
+msgid "first argument to 'word' function must be greater than 0"
+msgstr "o primeiro argumento de função \"word\" tem de ser maior que 0"
+
+#: src/function.c:819
+msgid "non-numeric first argument to 'wordlist' function"
+msgstr "primeiro argumento de função \"wordlist\" não-numérico"
+
+#: src/function.c:821
+msgid "non-numeric second argument to 'wordlist' function"
+msgstr "segundo argumento de função \"wordlist\" não-numérico"
+
+#: src/function.c:1533
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(In) falhou (e=%ld)\n"
+
+#: src/function.c:1557
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(Err) falhou (e=%ld)\n"
+
+#: src/function.c:1564
+#, c-format
+msgid "CreatePipe() failed (e=%ld)\n"
+msgstr "CreatePipe() falhou (e=%ld)\n"
+
+#: src/function.c:1572
+#, c-format
+msgid "windows32_openpipe(): process_init_fd() failed\n"
+msgstr "windows32_openpipe(): process_init_fd() falhou\n"
+
+#: src/function.c:1857
+#, c-format
+msgid "Cleaning up temporary batch file %s\n"
+msgstr "A limpar ficheiro batch temporário %s\n"
+
+#: src/function.c:2230 src/function.c:2255
+#, c-format
+msgid "file: missing filename"
+msgstr "ficheiro: nome em falta"
+
+#: src/function.c:2234 src/function.c:2265
+#, c-format
+msgid "open: %s: %s"
+msgstr "abrir: %s: %s"
+
+#: src/function.c:2242
+#, c-format
+msgid "write: %s: %s"
+msgstr "escrever: %s: %s"
+
+#: src/function.c:2245 src/function.c:2282
+#, c-format
+msgid "close: %s: %s"
+msgstr "fechar: %s: %s"
+
+#: src/function.c:2258
+#, c-format
+msgid "file: too many arguments"
+msgstr "ficheiro: demasiados argumentos"
+
+#: src/function.c:2277
+#, c-format
+msgid "read: %s: %s"
+msgstr "ler: %s: %s"
+
+#: src/function.c:2290
+#, c-format
+msgid "file: invalid file operation: %s"
+msgstr "ficheiro: operação inválida: %s"
+
+#: src/function.c:2405
+#, c-format
+msgid "insufficient number of arguments (%d) to function '%s'"
+msgstr "número insuficiente de argumentos (%d) para a função \"%s\""
+
+#: src/function.c:2417
+#, c-format
+msgid "unimplemented on this platform: function '%s'"
+msgstr "não implementada nesta plataforma: função \"%s\""
+
+#: src/function.c:2483
+#, c-format
+msgid "unterminated call to function '%s': missing '%c'"
+msgstr "chamada não terminada à função \"%s\": \"%c\" em falta"
+
+#: src/function.c:2667
+#, c-format
+msgid "Empty function name"
+msgstr "Nome de função vazio"
+
+#: src/function.c:2669
+#, c-format
+msgid "Invalid function name: %s"
+msgstr "Nome de função inválido: %s"
+
+#: src/function.c:2671
+#, c-format
+msgid "Function name too long: %s"
+msgstr "Nome de função muito longo: %s"
+
+#: src/function.c:2674
+#, c-format
+msgid "Invalid minimum argument count (%u) for function %s"
+msgstr "Número mínimo de argumentos (%u) inválido para a função %s"
+
+#: src/function.c:2677
+#, c-format
+msgid "Invalid maximum argument count (%u) for function %s"
+msgstr "Número máximo de argumentos (%u) inválido para a função %s"
+
+#: src/getopt.c:659
+#, c-format
+msgid "%s: option '%s' is ambiguous\n"
+msgstr "%s: a opção \"%s\" é ambígua\n"
+
+#: src/getopt.c:683
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"--%s\" não permite um argumento\n"
+
+#: src/getopt.c:688
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"%c%s\" não permite um argumento\n"
+
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
+msgid "%s: option '%s' requires an argument\n"
+msgstr "%s: a opção \"%s\" requer um argumento\n"
+
+#: src/getopt.c:734
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: opção não reconhecida \"--%s\"\n"
+
+#: src/getopt.c:738
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: opção não reconhecida \"%c%s\"\n"
+
+#: src/getopt.c:764
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: opção ilegal -- %c\n"
+
+#: src/getopt.c:767
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: opção inválida -- %c\n"
+
+#: src/getopt.c:797 src/getopt.c:927
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: a opção requer um argumento -- %c\n"
+
+#: src/getopt.c:844
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: a opção \"-W %s\" é ambígua\n"
+
+#: src/getopt.c:862
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: a opção \"-W %s\" não permite argumentos\n"
+
+#: src/guile.c:58
+#, c-format
+msgid "guile: Expanding '%s'\n"
+msgstr "guile: a expandir \"%s\"\n"
+
+#: src/guile.c:74
+#, c-format
+msgid "guile: Evaluating '%s'\n"
+msgstr "guile: a avaliar \"%s\"\n"
+
+#: src/hash.c:50
+#, c-format
+msgid "can't allocate %lu bytes for hash table: memory exhausted"
+msgstr "impossível alocar %lu bytes para a tabela de hash: memória esgotada"
+
+#: src/hash.c:280
+#, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Load=%lu/%lu=%.0f%%, "
+
+#: src/hash.c:282
+#, c-format
+msgid "Rehash=%u, "
+msgstr "Rehash=%u, "
+
+#: src/hash.c:283
+#, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Collisions=%lu/%lu=%.0f%%"
+
+#: src/implicit.c:38
+#, c-format
+msgid "Looking for an implicit rule for '%s'.\n"
+msgstr "A procurar regra implícita para \"%s\".\n"
+
+#: src/implicit.c:54
+#, c-format
+msgid "Looking for archive-member implicit rule for '%s'.\n"
+msgstr "A procurar regra implícita de membro de arquivo para \"%s\".\n"
+
+#: src/implicit.c:311
+#, c-format
+msgid "Avoiding implicit rule recursion.\n"
+msgstr "A evitar recursividade de regra implícita.\n"
+
+#: src/implicit.c:484
+#, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Haste muito longa: \"%s%.*s\".\n"
+
+#: src/implicit.c:490
+#, c-format
+msgid "Trying pattern rule with stem '%.*s'.\n"
+msgstr "A tentar regra padrão com haste \"%.*s\".\n"
+
+#: src/implicit.c:717
+#, c-format
+msgid "Rejecting impossible rule prerequisite '%s'.\n"
+msgstr "A rejeitar pré-requisito de regra \"%s\" impossível.\n"
+
+#: src/implicit.c:718
+#, c-format
+msgid "Rejecting impossible implicit prerequisite '%s'.\n"
+msgstr "A rejeitar pré-requisito implícito \"%s\" impossível.\n"
+
+#: src/implicit.c:732
+#, c-format
+msgid "Trying rule prerequisite '%s'.\n"
+msgstr "A tentar pré-requisito de regra \"%s\".\n"
+
+#: src/implicit.c:733
+#, c-format
+msgid "Trying implicit prerequisite '%s'.\n"
+msgstr "A tentar pré-requisito implícito \"%s\".\n"
+
+#: src/implicit.c:772
+#, c-format
+msgid "Found prerequisite '%s' as VPATH '%s'\n"
+msgstr "Encontrado pré-requisito \"%s\" como VPATH \"%s\"\n"
+
+#: src/implicit.c:786
+#, c-format
+msgid "Looking for a rule with intermediate file '%s'.\n"
+msgstr "A procurar regra com ficheiro intermédio \"%s\".\n"
+
+#: src/job.c:370
+msgid "Cannot create a temporary file\n"
+msgstr "Impossível criar ficheiro temporário\n"
+
+#: src/job.c:548
+msgid " (core dumped)"
+msgstr " (núcleo despejado)"
+
+#: src/job.c:553
+msgid " (ignored)"
+msgstr " (ignorado)"
+
+#: src/job.c:557 src/job.c:1892
+msgid "<builtin>"
+msgstr "<interno>"
+
+#: src/job.c:573
+#, c-format
+msgid "%s[%s: %s] Error %d%s"
+msgstr "%s[%s: %s] Erro %d%s"
+
+#: src/job.c:662
+#, c-format
+msgid "*** Waiting for unfinished jobs...."
+msgstr "*** A aguardar por trabalhos não terminados...."
+
+#: src/job.c:704
+#, c-format
+msgid "Live child %p (%s) PID %s %s\n"
+msgstr "Filho vivo %p (%s) PID %s %s\n"
+
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
+msgid " (remote)"
+msgstr " (remoto)"
+
+#: src/job.c:898
+#, c-format
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "A recolher filho ganhador %p PID %s %s\n"
+
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "A recolher filho perdedor %p PID %s %s\n"
+
+#: src/job.c:950
+#, c-format
+msgid "Cleaning up temp batch file %s\n"
+msgstr "A limpar ficheiro batch temporário %s\n"
+
+#: src/job.c:956
+#, c-format
+msgid "Cleaning up temp batch file %s failed (%d)\n"
+msgstr "A limpar ficheiro batch temporário %s falhou (%d)\n"
+
+#: src/job.c:1071
+#, c-format
+msgid "Removing child %p PID %s%s from chain.\n"
+msgstr "A remover filho %p PID %s%s da cadeia.\n"
+
+#: src/job.c:1120
+#, c-format
+msgid "Released token for child %p (%s).\n"
+msgstr "Símbolo lançado para filho %p (%s).\n"
+
+#: src/job.c:1575 src/job.c:2487
+#, c-format
+msgid "process_easy() failed to launch process (e=%ld)\n"
+msgstr "process_easy() falhou ao lançar processo (e=%ld)\n"
+
+#: src/job.c:1579 src/job.c:2491
+#, c-format
+msgid ""
+"\n"
+"Counted %d args in failed launch\n"
+msgstr ""
+"\n"
+"Contados %d argumentos no lançamento falhado\n"
+
+#: src/job.c:1642
+#, c-format
+msgid "Putting child %p (%s) PID %s%s on the chain.\n"
+msgstr "A pôr filho %p (%s) PID %s%s na cadeia.\n"
+
+#: src/job.c:1875
+#, c-format
+msgid "Obtained token for child %p (%s).\n"
+msgstr "Obtido símbolo para filho %p (%s).\n"
+
+#: src/job.c:1902
+#, c-format
+msgid "%s: target '%s' does not exist"
+msgstr "%s: alvo \"%s\" não existe"
+
+#: src/job.c:1905
+#, c-format
+msgid "%s: update target '%s' due to: %s"
+msgstr "%s: alvo actualizado \"%s\" devido a: %s"
+
+#: src/job.c:2108
+#, c-format
+msgid "cannot enforce load limits on this operating system"
+msgstr "Impossível forçar limites de carga neste sistema operativo"
+
+#: src/job.c:2110
+msgid "cannot enforce load limit: "
+msgstr "Impossível forçar limite de carga: "
+
+#: src/job.c:2200
+#, c-format
+msgid "no more file handles: could not duplicate stdin\n"
+msgstr "não há mais gestão de ficheiros: impossível duplicar stdin\n"
+
+#: src/job.c:2212
+#, c-format
+msgid "no more file handles: could not duplicate stdout\n"
+msgstr "não há mais gestão de ficheiros: impossível duplicar stdout\n"
+
+#: src/job.c:2226
+#, c-format
+msgid "no more file handles: could not duplicate stderr\n"
+msgstr "não há mais gestão de ficheiros: impossível duplicar stderr\n"
+
+#: src/job.c:2241
+#, c-format
+msgid "Could not restore stdin\n"
+msgstr "impossível restaurar stdin\n"
+
+#: src/job.c:2249
+#, c-format
+msgid "Could not restore stdout\n"
+msgstr "impossível restaurar stdout\n"
+
+#: src/job.c:2257
+#, c-format
+msgid "Could not restore stderr\n"
+msgstr "impossível restaurar stderr\n"
+
+#: src/job.c:2520
+#, c-format
+msgid "make reaped child pid %s, still waiting for pid %s\n"
+msgstr "fazer pid %s de filho recolhido, ainda à espera por pid %s\n"
+
+#: src/job.c:2623
+#, c-format
+msgid "spawnvpe: environment space might be exhausted"
+msgstr "spawnvpe: o espaço de ambiente pode estar esgotado"
+
+#: src/job.c:2862
+#, c-format
+msgid "$SHELL changed (was '%s', now '%s')\n"
+msgstr "$SHELL alterada (era \"%s\", é agora \"%s\")\n"
+
+#: src/job.c:3300 src/job.c:3485
+#, c-format
+msgid "Creating temporary batch file %s\n"
+msgstr "A criar ficheiro batch temporaŕio %s\n"
+
+#: src/job.c:3308
+#, c-format
+msgid ""
+"Batch file contents:\n"
+"\t@echo off\n"
+msgstr ""
+"Conteúdo do ficheiro batch:\n"
+"\t@echo off\n"
+
+#: src/job.c:3497
+#, c-format
+msgid ""
+"Batch file contents:%s\n"
+"\t%s\n"
+msgstr ""
+"Conteúdo do ficheiro batch:%s\n"
+"\t%s\n"
+
+#: src/job.c:3605
+#, c-format
+msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
+msgstr "%s (linha %d) Mau contexto de shell (!unixy && !batch_mode_shell)\n"
+
+#: src/load.c:60
+#, c-format
+msgid "Failed to open global symbol table: %s"
+msgstr "Falha ao abrir a tabela global de símbolos: %s"
+
+#: src/load.c:97
+#, c-format
+msgid "Loaded object %s is not declared to be GPL compatible"
+msgstr "Objecto carregado %s não está declarado como compatível GPL"
+
+#: src/load.c:104
+#, c-format
+msgid "Failed to load symbol %s from %s: %s"
+msgstr "Falha ao carregar símbolo %s de %s: %s"
+
+#: src/load.c:149
+#, c-format
+msgid "Empty symbol name for load: %s"
+msgstr "Nome de símbolo vazio para carga: %s"
+
+#: src/load.c:204
+#, c-format
+msgid "Loading symbol %s from %s\n"
+msgstr "A carregar símbolo %s de %s\n"
+
+#: src/load.c:256
+#, c-format
+msgid "The 'load' operation is not supported on this platform."
+msgstr "A operação \"load\" não é suportada nesta plataforma."
+
+#: src/main.c:335
+msgid "Options:\n"
+msgstr "Opções:\n"
+
+#: src/main.c:336
+msgid "  -b, -m                      Ignored for compatibility.\n"
+msgstr "  -b, -m                      ignora para compatibilidade.\n"
+
+#: src/main.c:338
+msgid "  -B, --always-make           Unconditionally make all targets.\n"
+msgstr "  -B, --always-make           faz todos os alvos incondicionalmente.\n"
+
+#: src/main.c:340
+msgid ""
+"  -C DIRECTORY, --directory=DIRECTORY\n"
+"                              Change to DIRECTORY before doing anything.\n"
+msgstr ""
+"  -C PASTA, --directory=PASTA\n"
+"                              muda para PASTA antes de qualquer outra "
+"coisa.\n"
+
+#: src/main.c:343
+msgid "  -d                          Print lots of debugging information.\n"
+msgstr "  -d                          imprime muita informação de depuração.\n"
+
+#: src/main.c:345
+msgid ""
+"  --debug[=FLAGS]             Print various types of debugging information.\n"
+msgstr ""
+"  --debug[=BANDEIRAS]         imprime vários tipos de informação de "
+"depuração.\n"
+
+#: src/main.c:347
+msgid ""
+"  -e, --environment-overrides\n"
+"                              Environment variables override makefiles.\n"
+msgstr ""
+"  -e, --environment-overrides\n"
+"                              substitui as variáveis de ambiente com os "
+"makefiles.\n"
+
+#: src/main.c:350
+msgid ""
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr ""
+"  -E CADEIA, --eval=CADEIA    Avalia CADEIA como declaração makefile.\n"
+
+#: src/main.c:352
+msgid ""
+"  -f FILE, --file=FILE, --makefile=FILE\n"
+"                              Read FILE as a makefile.\n"
+msgstr ""
+"  -f FICHEIRO, --file=FICHEIRO, --makefile=FICHEIRO\n"
+"                              lê FICHEIRO como makefile.\n"
+
+#: src/main.c:355
+msgid "  -h, --help                  Print this message and exit.\n"
+msgstr "  -h, --help                  mostra esta mensagem e sai.\n"
+
+#: src/main.c:357
+msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
+msgstr "  -i, --ignore-errors         ignora erros das receitas.\n"
+
+#: src/main.c:359
+msgid ""
+"  -I DIRECTORY, --include-dir=DIRECTORY\n"
+"                              Search DIRECTORY for included makefiles.\n"
+msgstr ""
+"  -I PASTA, --include-dir=PASTA\n"
+"                              procura em PASTA por makefiles incluídos.\n"
+
+#: src/main.c:362
+msgid ""
+"  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
+"arg.\n"
+msgstr ""
+"  -j [N], --jobs[=N]          permite N tarefas de uma só vez; tarefas "
+"infinitas sem argumento.\n"
+
+#: src/main.c:364
+msgid ""
+"  -k, --keep-going            Keep going when some targets can't be made.\n"
+msgstr ""
+"  -k, --keep-going            continua quando alguns alvos não podem ser "
+"feitos.\n"
+
+#: src/main.c:366
+msgid ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              Don't start multiple jobs unless load is below "
+"N.\n"
+msgstr ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              não começa múltiplas tarefas a não ser que a "
+"carga seja menor que N.\n"
+
+#: src/main.c:369
+msgid ""
+"  -L, --check-symlink-times   Use the latest mtime between symlinks and "
+"target.\n"
+msgstr ""
+"  -L, --check-symlink-times   usa a última mtime entre ligações simbólicas e "
+"alvo.\n"
+
+#: src/main.c:371
+msgid ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              Don't actually run any recipe; just print "
+"them.\n"
+msgstr ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              não executa realmente nenhuma receita; só as "
+"imprime.\n"
+
+#: src/main.c:374
+msgid ""
+"  -o FILE, --old-file=FILE, --assume-old=FILE\n"
+"                              Consider FILE to be very old and don't remake "
+"it.\n"
+msgstr ""
+"  -o FICHEIRO, --old-file=FICHEIRO, --assume-old=FICHEIRO\n"
+"                              Considera FICHEIRO muito antigo e não o "
+"refaz.\n"
+
+#: src/main.c:377
+msgid ""
+"  -O[TYPE], --output-sync[=TYPE]\n"
+"                              Synchronize output of parallel jobs by TYPE.\n"
+msgstr ""
+"  -O[TIPO], --output-sync[=TIPO]\n"
+"                              sincroniza saída de tarefas paralelas por "
+"TIPO.\n"
+
+#: src/main.c:380
+msgid "  -p, --print-data-base       Print make's internal database.\n"
+msgstr ""
+"  -p, --print-data-base       imprime a base de dados interna do make.\n"
+
+#: src/main.c:382
+msgid ""
+"  -q, --question              Run no recipe; exit status says if up to "
+"date.\n"
+msgstr ""
+"  -q, --question              não executa receitas; estado de saída mostra "
+"actualização.\n"
+
+#: src/main.c:384
+msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
+msgstr ""
+"  -r, --no-builtin-rules      desactiva as regras implícitas internas.\n"
+
+#: src/main.c:386
+msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
+msgstr ""
+"  -R, --no-builtin-variables  desactiva as definições de variáveis "
+"internas.\n"
+
+#: src/main.c:388
+msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
+msgstr "  -s, --silent, --quiet       não fazer eco das receitas.\n"
+
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Ecoa receitas (desactiva o modo --silent).\n"
+
+#: src/main.c:392
+msgid ""
+"  -S, --no-keep-going, --stop\n"
+"                              Turns off -k.\n"
+msgstr ""
+"  -S, --no-keep-going, --stop\n"
+"                              desliga -k.\n"
+
+#: src/main.c:395
+msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
+msgstr "  -t, --touch                 tocar nos alvos em vez de os refazer.\n"
+
+#: src/main.c:397
+msgid "  --trace                     Print tracing information.\n"
+msgstr "  --trace                     imprime informação de rastreio.\n"
+
+#: src/main.c:399
+msgid ""
+"  -v, --version               Print the version number of make and exit.\n"
+msgstr "  -v, --version               mostra informação da versão e sai.\n"
+
+#: src/main.c:401
+msgid "  -w, --print-directory       Print the current directory.\n"
+msgstr "  -w, --print-directory       imprime a pasta actual.\n"
+
+#: src/main.c:403
+msgid ""
+"  --no-print-directory        Turn off -w, even if it was turned on "
+"implicitly.\n"
+msgstr ""
+"  --no-print-directory        desliga -w, mesmo que estivesse implicitamente "
+"ligado.\n"
+
+#: src/main.c:405
+msgid ""
+"  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
+"                              Consider FILE to be infinitely new.\n"
+msgstr ""
+"  -W FICHEIRO, --what-if=FICHEIRO, --new-file=FICHEIRO, --assume-"
+"new=FICHEIRO\n"
+"                              considea FICHEIRO infinitamente novo.\n"
+
+#: src/main.c:408
+msgid ""
+"  --warn-undefined-variables  Warn when an undefined variable is "
+"referenced.\n"
+msgstr ""
+"  --warn-undefined-variables  avisa quando uma variável indefinida é "
+"referenciada.\n"
+
+#: src/main.c:671
+#, c-format
+msgid "empty string invalid as file name"
+msgstr "cadeia vazia inválida como nome de ficheiro"
+
+#: src/main.c:754
+#, c-format
+msgid "unknown debug level specification '%s'"
+msgstr "especificação de nível de depuração \"%s\" desconhecida"
+
+#: src/main.c:794
+#, c-format
+msgid "unknown output-sync type '%s'"
+msgstr "tipo de output-sync \"%s\" desconhecido"
+
+#: src/main.c:849
+#, c-format
+msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
+msgstr "%s: apanhado Interrupção/Excepção (código = 0x%lx, endereço = 0x%p)\n"
+
+#: src/main.c:856
+#, c-format
+msgid ""
+"\n"
+"Unhandled exception filter called from program %s\n"
+"ExceptionCode = %lx\n"
+"ExceptionFlags = %lx\n"
+"ExceptionAddress = 0x%p\n"
+msgstr ""
+"\n"
+"Filtro de excepção não gerido chamado do programa %s\n"
+"ExceptionCode = %lx\n"
+"ExceptionFlags = %lx\n"
+"ExceptionAddress = 0x%p\n"
+
+#: src/main.c:864
+#, c-format
+msgid "Access violation: write operation at address 0x%p\n"
+msgstr "Violação de acesso: operação de escrita no endereço 0x%p\n"
+
+#: src/main.c:865
+#, c-format
+msgid "Access violation: read operation at address 0x%p\n"
+msgstr "Violação de acesso: operação de leitura no endereço 0x%p\n"
+
+#: src/main.c:941 src/main.c:956
+#, c-format
+msgid "find_and_set_shell() setting default_shell = %s\n"
+msgstr "find_and_set_shell() a definir default_shell = %s\n"
+
+#: src/main.c:1009
+#, c-format
+msgid "find_and_set_shell() path search set default_shell = %s\n"
+msgstr "caminho de procura find_and_set_shell() define default_shell = %s\n"
+
+#: src/main.c:1609
+#, c-format
+msgid ""
+"warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
+msgstr ""
+"aviso: jobserver indisponível: a usar -j1.  Adicionar \"+\" à regra-mãe make."
+
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "aviso: -j%d forçado em submake: a repor modo jobserver."
+
+#: src/main.c:1781
+#, c-format
+msgid "Makefile from standard input specified twice."
+msgstr "Makefile da entrada padrão especificado duas vezes."
+
+#: src/main.c:1819 src/vmsjobs.c:1248
+msgid "fopen (temporary file)"
+msgstr "fopen (ficheiro temporário)"
+
+#: src/main.c:1825
+msgid "fwrite (temporary file)"
+msgstr "fwrite (ficheiro temporário)"
+
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "aviso: -j%d forçado em makefile: a repor modo jobserver."
+
+#: src/main.c:2068
+#, c-format
+msgid "Parallel jobs (-j) are not supported on this platform."
+msgstr "Não são suportadas tarefas paralelas (-j) nesta platforma."
+
+#: src/main.c:2069
+#, c-format
+msgid "Resetting to single job (-j1) mode."
+msgstr "A repor modo de tarefa única (-j1)."
+
+#: src/main.c:2109
+#, c-format
+msgid "Symbolic links not supported: disabling -L."
+msgstr "Não são suportadas ligações simbólicas: a desactivar -L"
+
+#: src/main.c:2190
+#, c-format
+msgid "Updating makefiles....\n"
+msgstr "A actualizar makefiles....\n"
+
+#: src/main.c:2226
+#, c-format
+msgid "Makefile '%s' might loop; not remaking it.\n"
+msgstr "Makefile \"%s\" pode entrar em ciclo; não será refeito.\n"
+
+#: src/main.c:2303
+#, c-format
+msgid "Failed to remake makefile '%s'."
+msgstr "Falha ao refazer makefile \"%s\"."
+
+#: src/main.c:2323
+#, c-format
+msgid "Included makefile '%s' was not found."
+msgstr "makefile \"%s\" incluído não encontrado."
+
+#: src/main.c:2328
+#, c-format
+msgid "Makefile '%s' was not found"
+msgstr "Makefile \"%s\" não encontrado"
+
+#: src/main.c:2394
+#, c-format
+msgid "Couldn't change back to original directory."
+msgstr "Impossível voltar à pasta original."
+
+#: src/main.c:2402
+#, c-format
+msgid "Re-executing[%u]:"
+msgstr "A re-executar[%u]:"
+
+#: src/main.c:2522
+msgid "unlink (temporary file): "
+msgstr "desligar (ficheiro temporário): "
+
+#: src/main.c:2555
+#, c-format
+msgid ".DEFAULT_GOAL contains more than one target"
+msgstr ".DEFAULT_GOAL contém mais de um alvo"
+
+#: src/main.c:2579
+#, c-format
+msgid "No targets"
+msgstr "Sem alvos"
+
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Sem alvos especificados e sem makefile"
+
+#: src/main.c:2586
+#, c-format
+msgid "Updating goal targets....\n"
+msgstr "A actualizar alvos objectivo...\n"
+
+#: src/main.c:2610
+#, c-format
+msgid "warning:  Clock skew detected.  Your build may be incomplete."
+msgstr "aviso: detectado desvio do relógio. A build pode estar incompleta."
+
+#: src/main.c:2804
+#, c-format
+msgid "Usage: %s [options] [target] ...\n"
+msgstr "Uso: %s [OPÇÕES] [ALVO] ...\n"
+
+#: src/main.c:2810
+#, c-format
+msgid ""
+"\n"
+"This program built for %s\n"
+msgstr ""
+"\n"
+"Este programa construído para %s\n"
+
+#: src/main.c:2812
+#, c-format
+msgid ""
+"\n"
+"This program built for %s (%s)\n"
+msgstr ""
+"\n"
+"Este programa construído para %s (%s)\n"
+
+#: src/main.c:2815
+#, c-format
+msgid "Report bugs to <bug-make@gnu.org>\n"
+msgstr "Reportar erros em <bug-make@gnu.org>\n"
+
+#: src/main.c:2901
+#, c-format
+msgid "the '%s%s' option requires a non-empty string argument"
+msgstr "a opção \"%s%s\" requer um argumento de cadeia não-vazia"
+
+#: src/main.c:2965
+#, c-format
+msgid "the '-%c' option requires a positive integer argument"
+msgstr "a opção \"-%c\" requer um argumento inteiro positivo"
+
+#: src/main.c:3363
+#, c-format
+msgid "%sBuilt for %s\n"
+msgstr "%sConstruído para %s\n"
+
+#: src/main.c:3365
+#, c-format
+msgid "%sBuilt for %s (%s)\n"
+msgstr "%sConstruído para %s (%s)\n"
+
+#: src/main.c:3376
+#, c-format
+msgid ""
+"%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+"html>\n"
+"%sThis is free software: you are free to change and redistribute it.\n"
+"%sThere is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"%sLicença GPLv3+: GNU GPL versão 3 ou posterior <http://gnu.org/licenses/gpl."
+"html>\n"
+"%sIsto é um programa grátis: pode alterá-lo e redistribuí-lo.\n"
+"%sNÃO HÁ QUALQUER GARANTIA, até ao limite da Lei.\n"
+
+#: src/main.c:3397
+#, c-format
+msgid ""
+"\n"
+"# Make data base, printed on %s"
+msgstr ""
+"\n"
+"# Base de dados make, impressa em %s"
+
+#: src/main.c:3407
+#, c-format
+msgid ""
+"\n"
+"# Finished Make data base on %s\n"
+msgstr ""
+"\n"
+"# Base de dados make terminada em %s\n"
+
+#: src/misc.c:643
+#, c-format
+msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
+msgstr "%s: utilizador %lu (real %lu), grupo %lu (real %lu)\n"
+
+#: src/misc.c:664
+msgid "Initialized access"
+msgstr "Acesso inicializado"
+
+#: src/misc.c:743
+msgid "User access"
+msgstr "Acesso de utilizador"
+
+#: src/misc.c:791
+msgid "Make access"
+msgstr "Acesso make"
+
+#: src/misc.c:825
+msgid "Child access"
+msgstr "Acesso filho"
+
+#: src/output.c:97
+#, c-format
+msgid "%s: Entering an unknown directory\n"
+msgstr "%s: a entrar em pasta desconhecida\n"
+
+#: src/output.c:99
+#, c-format
+msgid "%s: Leaving an unknown directory\n"
+msgstr "%s: a sair duma pasta desconhecida\n"
+
+#: src/output.c:102
+#, c-format
+msgid "%s: Entering directory '%s'\n"
+msgstr "%s: a entrar na pasta \"%s\"\n"
+
+#: src/output.c:104
+#, c-format
+msgid "%s: Leaving directory '%s'\n"
+msgstr "%s: a sair da pasta \"%s\"\n"
+
+#: src/output.c:108
+#, c-format
+msgid "%s[%u]: Entering an unknown directory\n"
+msgstr "%s[%u]: a entrar em pasta desconhecida\n"
+
+#: src/output.c:110
+#, c-format
+msgid "%s[%u]: Leaving an unknown directory\n"
+msgstr "%s[%u]: a sair duma pasta desconhecida\n"
+
+#: src/output.c:113
+#, c-format
+msgid "%s[%u]: Entering directory '%s'\n"
+msgstr "%s[%u]: a entrar na pasta \"%s\"\n"
+
+#: src/output.c:115
+#, c-format
+msgid "%s[%u]: Leaving directory '%s'\n"
+msgstr "%s[%u]: a sair da pasta \"%s\"\n"
+
+#: src/output.c:442 src/output.c:444
+#, c-format
+msgid "write error: stdout"
+msgstr "erro de escrita: stdout"
+
+#: src/output.c:624
+msgid ".  Stop.\n"
+msgstr ".  Parar.\n"
+
+#: src/output.c:658
+#, c-format
+msgid "%s%s: %s"
+msgstr "%s%s: %s"
+
+#: src/output.c:667
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[TIPO] (--output-sync[=TIPO]) não está configurado para esta versão."
+
+#: src/posixos.c:90
+msgid "creating jobs pipe"
+msgstr "a criar túnel de tarefas"
+
+#: src/posixos.c:98 src/posixos.c:251
+msgid "duping jobs pipe"
+msgstr "a enganar túnel de tarefas"
+
+#: src/posixos.c:104
+msgid "init jobserver pipe"
+msgstr "a iniciar túnel de jobserver"
+
+#: src/posixos.c:119
+#, c-format
+msgid "internal error: invalid --jobserver-auth string '%s'"
+msgstr "erro interno: cadeia --jobserver-auth \"%s\" inválida"
+
+#: src/posixos.c:122
+#, c-format
+msgid "Jobserver client (fds %d,%d)\n"
+msgstr "Cliente jobserver (fds %d,%d)\n"
+
+#: src/posixos.c:138
+msgid "jobserver pipeline"
+msgstr "Túnel jobserver"
+
+#: src/posixos.c:186
+msgid "write jobserver"
+msgstr "escrever jobserver"
+
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "encerramento de jobserver"
+
+#: src/posixos.c:303
+msgid "pselect jobs pipe"
+msgstr "pselect túnel de tarefas"
+
+#: src/posixos.c:319 src/posixos.c:433
+msgid "read jobs pipe"
+msgstr "ler túnel de tarefas"
+
+#: src/read.c:181
+#, c-format
+msgid "Reading makefiles...\n"
+msgstr "A ler makefiles...\n"
+
+#: src/read.c:336
+#, c-format
+msgid "Reading makefile '%s'"
+msgstr "A ler makefile \"%s\""
+
+#: src/read.c:338
+#, c-format
+msgid " (no default goal)"
+msgstr " (sem objectivo predefinido)"
+
+#: src/read.c:340
+#, c-format
+msgid " (search path)"
+msgstr " (caminho de procura)"
+
+#: src/read.c:342
+#, c-format
+msgid " (don't care)"
+msgstr " (não importa)"
+
+#: src/read.c:344
+#, c-format
+msgid " (no ~ expansion)"
+msgstr " (sem expansão ~)"
+
+#: src/read.c:655
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile '%s'\n"
+msgstr "A slatar UTF-8 BOM em makefile \"%s\"\n"
+
+#: src/read.c:658
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile buffer\n"
+msgstr "A saltar UTF-8 BOM no buffer makefile\n"
+
+#: src/read.c:787
+#, c-format
+msgid "invalid syntax in conditional"
+msgstr "sintaxe inválida em condicional"
+
+#: src/read.c:960
+#, c-format
+msgid "%s: failed to load"
+msgstr "%s: falha ao carregar"
+
+#: src/read.c:986
+#, c-format
+msgid "recipe commences before first target"
+msgstr "a receita começa antes do primeiro alvo"
+
+#: src/read.c:1035
+#, c-format
+msgid "missing rule before recipe"
+msgstr "regra em falta antes da receita"
+
+#: src/read.c:1136
+#, c-format
+msgid "missing separator (did you mean TAB instead of 8 spaces?)"
+msgstr "separador em falta (queria usar TAB em vez de 8 espaços?)"
+
+#: src/read.c:1138
+#, c-format
+msgid "missing separator"
+msgstr "separador em falta"
+
+#: src/read.c:1283
+#, c-format
+msgid "missing target pattern"
+msgstr "padrão de alvo em falta"
+
+#: src/read.c:1285
+#, c-format
+msgid "multiple target patterns"
+msgstr "múltiplos padrões de alvo"
+
+#: src/read.c:1289
+#, c-format
+msgid "target pattern contains no '%%'"
+msgstr "o padrão de alvo não contém \"%%\""
+
+#: src/read.c:1404
+#, c-format
+msgid "missing 'endif'"
+msgstr "\"endif\" em falta"
+
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
+msgid "empty variable name"
+msgstr "nome de variável vazio"
+
+#: src/read.c:1478
+#, c-format
+msgid "extraneous text after 'define' directive"
+msgstr "texto estranho após directiva \"define\""
+
+#: src/read.c:1503
+#, c-format
+msgid "missing 'endef', unterminated 'define'"
+msgstr "\"endef\" em falta, \"define\" não terminado"
+
+#: src/read.c:1531
+#, c-format
+msgid "extraneous text after 'endef' directive"
+msgstr "texto estranho após directiva \"endef\""
+
+#: src/read.c:1603
+#, c-format
+msgid "extraneous text after '%s' directive"
+msgstr "texto estranho após directiva \"%s\""
+
+#: src/read.c:1604
+#, c-format
+msgid "extraneous '%s'"
+msgstr "\"%s\" estranho"
+
+#: src/read.c:1632
+#, c-format
+msgid "only one 'else' per conditional"
+msgstr "só um \"else\" por condicional"
+
+#: src/read.c:1908
+#, c-format
+msgid "Malformed target-specific variable definition"
+msgstr "Definição de variável específica do alvo mal formada"
+
+#: src/read.c:1968
+#, c-format
+msgid "prerequisites cannot be defined in recipes"
+msgstr "os pré-requisitos não podem ser definidos em receitas"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "alvos agrupados têm de fornecer uma receita"
+
+#: src/read.c:2029
+#, c-format
+msgid "mixed implicit and static pattern rules"
+msgstr "regras de padrão implícitas e estáticas misturadas"
+
+#: src/read.c:2052
+#, c-format
+msgid "mixed implicit and normal rules"
+msgstr "regras de padrão implícitas e normais misturadas"
+
+#: src/read.c:2107
+#, c-format
+msgid "target '%s' doesn't match the target pattern"
+msgstr "alvo \"%s\" não corresponde ao alvo padrão"
+
+#: src/read.c:2122 src/read.c:2168
+#, c-format
+msgid "target file '%s' has both : and :: entries"
+msgstr "ficheiro alvo \"%s\" tem ambas as entradas : e ::"
+
+#: src/read.c:2128
+#, c-format
+msgid "target '%s' given more than once in the same rule"
+msgstr "alvo \"%s\" dado mais de uma vez na mesma regra"
+
+#: src/read.c:2138
+#, c-format
+msgid "warning: overriding recipe for target '%s'"
+msgstr "aviso: a sobrepor receita para o alvo \"%s\""
+
+#: src/read.c:2141
+#, c-format
+msgid "warning: ignoring old recipe for target '%s'"
+msgstr "aviso: a ignorar receita antiga para o alvo \"%s\""
+
+#: src/read.c:2254
+#, c-format
+msgid "*** mixed implicit and normal rules: deprecated syntax"
+msgstr "*** regras implícitas e normais misturadas: sintaxe obsoleta"
+
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "aviso: a sobrepor participação no grupo para o alvo \"%s\""
+
+#: src/read.c:2636
+#, c-format
+msgid "warning: NUL character seen; rest of line ignored"
+msgstr "aviso: visto carácter NUL; resto da linha ignorado"
+
+#: src/remake.c:226
+#, c-format
+msgid "Nothing to be done for '%s'."
+msgstr "Nada a fazer para \"%s\"."
+
+#: src/remake.c:227
+#, c-format
+msgid "'%s' is up to date."
+msgstr "\"%s\" está actualizado."
+
+#: src/remake.c:323
+#, c-format
+msgid "Pruning file '%s'.\n"
+msgstr "A podar ficheiro \"%s\".\n"
+
+#: src/remake.c:389
+#, c-format
+msgid "%sNo rule to make target '%s', needed by '%s'%s"
+msgstr "%sSem regra para fazer o alvo \"%s\", necessária a \"%s\"%s"
+
+#: src/remake.c:399
+#, c-format
+msgid "%sNo rule to make target '%s'%s"
+msgstr "%sSem regra para fazer o alvo \"%s\"%s"
+
+#: src/remake.c:425
+#, c-format
+msgid "Considering target file '%s'.\n"
+msgstr "A considerar o ficheiro alvo \"%s\"\n"
+
+#: src/remake.c:432
+#, c-format
+msgid "Recently tried and failed to update file '%s'.\n"
+msgstr "Tentativa recente falhada de actualizar o ficheiro \"%s\".\n"
+
+#: src/remake.c:444
+#, c-format
+msgid "File '%s' was considered already.\n"
+msgstr "Ficheiro \"%s\" já considerado.\n"
+
+#: src/remake.c:454
+#, c-format
+msgid "Still updating file '%s'.\n"
+msgstr "Ainda a actualizar o ficheiro \"%s\".\n"
+
+#: src/remake.c:457
+#, c-format
+msgid "Finished updating file '%s'.\n"
+msgstr "Terminou a actualização do ficheiro \"%s\".\n"
+
+#: src/remake.c:486
+#, c-format
+msgid "File '%s' does not exist.\n"
+msgstr "O ficheiro \"%s\" não existe.\n"
+
+#: src/remake.c:494
+#, c-format
+msgid ""
+"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
+msgstr ""
+"*** Aviso: o ficheiro \"%s\" .LOW_RESOLUTION_TIME tem um carimbo de alta "
+"resolução"
+
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
+msgid "Found an implicit rule for '%s'.\n"
+msgstr "Encontrada uma regra implícita para \"%s\".\n"
+
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
+msgid "No implicit rule found for '%s'.\n"
+msgstr "Sem regra implícita para \"%s\".\n"
+
+#: src/remake.c:515
+#, c-format
+msgid "Using default recipe for '%s'.\n"
+msgstr "A usar receita predefinida para \"%s\".\n"
+
+#: src/remake.c:549 src/remake.c:1088
+#, c-format
+msgid "Circular %s <- %s dependency dropped."
+msgstr "Dependência %s <- %s circular abandonada."
+
+#: src/remake.c:674
+#, c-format
+msgid "Finished prerequisites of target file '%s'.\n"
+msgstr "Terminados os pré-requisitos do ficheiro alvo \"%s\",\n"
+
+#: src/remake.c:680
+#, c-format
+msgid "The prerequisites of '%s' are being made.\n"
+msgstr "Estão-se a fazer os pré-requisitos de \"%s\".\n"
+
+#: src/remake.c:694
+#, c-format
+msgid "Giving up on target file '%s'.\n"
+msgstr "A desistir do ficheiro alvo \"%s\".\n"
+
+#: src/remake.c:699
+#, c-format
+msgid "Target '%s' not remade because of errors."
+msgstr "Alvo \"%s\" não refeito devido a erros."
+
+#: src/remake.c:751
+#, c-format
+msgid "Prerequisite '%s' is order-only for target '%s'.\n"
+msgstr "Pré-requisito \"%s\" é order-only para o alvo \"%s\".\n"
+
+#: src/remake.c:756
+#, c-format
+msgid "Prerequisite '%s' of target '%s' does not exist.\n"
+msgstr "Pré-requisito \"%s\" do alvo \"%s\" não existe.\n"
+
+#: src/remake.c:761
+#, c-format
+msgid "Prerequisite '%s' is newer than target '%s'.\n"
+msgstr "Pré-requisito \"%s\" é mais novo que o alvo \"%s\".\n"
+
+#: src/remake.c:764
+#, c-format
+msgid "Prerequisite '%s' is older than target '%s'.\n"
+msgstr "Pré-requisito \"%s\" é mais velho que o alvo \"%s\".\n"
+
+#: src/remake.c:782
+#, c-format
+msgid "Target '%s' is double-colon and has no prerequisites.\n"
+msgstr "O alvo \"%s\" é dois-pontos duplo e não tem pré-requisitos.\n"
+
+#: src/remake.c:789
+#, c-format
+msgid "No recipe for '%s' and no prerequisites actually changed.\n"
+msgstr "Sem receita para \"%s\" e sem pré-requisitos realmente alterados.\n"
+
+#: src/remake.c:794
+#, c-format
+msgid "Making '%s' due to always-make flag.\n"
+msgstr "A fazer \"%s\" devido a bandeira always-make.\n"
+
+#: src/remake.c:802
+#, c-format
+msgid "No need to remake target '%s'"
+msgstr "Sem necessidade de refazer o alvo \"%s\""
+
+#: src/remake.c:804
+#, c-format
+msgid "; using VPATH name '%s'"
+msgstr "; a usar nome VPATH \"%s\""
+
+#: src/remake.c:824
+#, c-format
+msgid "Must remake target '%s'.\n"
+msgstr "Necessário refazer o alvo \"%s\".\n"
+
+#: src/remake.c:830
+#, c-format
+msgid "  Ignoring VPATH name '%s'.\n"
+msgstr "  A ignorar nome VPATH \"%s\".\n"
+
+#: src/remake.c:839
+#, c-format
+msgid "Recipe of '%s' is being run.\n"
+msgstr "Receita de \"%s\" em execução.\n"
+
+#: src/remake.c:846
+#, c-format
+msgid "Failed to remake target file '%s'.\n"
+msgstr "Falha ao refazer ficheiro alvo \"%s\".\n"
+
+#: src/remake.c:849
+#, c-format
+msgid "Successfully remade target file '%s'.\n"
+msgstr "Ficheiro alvo \"%s\" refeito com sucesso.\n"
+
+#: src/remake.c:852
+#, c-format
+msgid "Target file '%s' needs to be remade under -q.\n"
+msgstr "O ficheiro alvo \"%s\" tem de ser refeito sob -q.\n"
+
+#: src/remake.c:1047
+#, c-format
+msgid "Using default commands for '%s'.\n"
+msgstr "A usar comandos predefinidos para \"%s\".\n"
+
+#: src/remake.c:1422
+#, c-format
+msgid "Warning: File '%s' has modification time %s s in the future"
+msgstr "Aviso: o ficheiro \"%s\" tem a hora de modificação %s s no futuro"
+
+#: src/remake.c:1662
+#, c-format
+msgid ".LIBPATTERNS element '%s' is not a pattern"
+msgstr "elemento .LIBPATTERNS \"%s\" não é um padrão"
+
+#: src/remote-cstms.c:122
+#, c-format
+msgid "Customs won't export: %s\n"
+msgstr "A alfândega não exportará: %s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
+msgid ""
+"\n"
+"# Implicit Rules"
+msgstr ""
+"\n"
+"# Regras implícitas"
+
+#: src/rule.c:545
+msgid ""
+"\n"
+"# No implicit rules."
+msgstr ""
+"\n"
+"# Sem regras implícitas."
+
+#: src/rule.c:548
+#, c-format
+msgid ""
+"\n"
+"# %u implicit rules, %u (%.1f%%) terminal."
+msgstr ""
+"\n"
+"# %u regras implícitas, %u (%.1f%%) terminal."
+
+#: src/rule.c:557
+#, c-format
+msgid "BUG: num_pattern_rules is wrong!  %u != %u"
+msgstr "ERRO: num_pattern_rules está errado!  %u != %u"
+
+#: src/signame.c:84
+msgid "unknown signal"
+msgstr "sinal desconhecido"
+
+#: src/signame.c:92
+msgid "Hangup"
+msgstr "Desligar"
+
+#: src/signame.c:95
+msgid "Interrupt"
+msgstr "Interromper"
+
+#: src/signame.c:98
+msgid "Quit"
+msgstr "Sair"
+
+#: src/signame.c:101
+msgid "Illegal Instruction"
+msgstr "Instrução ilegal"
+
+#: src/signame.c:104
+msgid "Trace/breakpoint trap"
+msgstr "Armadilha de rastreio/ponto de quebra"
+
+#: src/signame.c:109
+msgid "Aborted"
+msgstr "Abortado"
+
+#: src/signame.c:112
+msgid "IOT trap"
+msgstr "Armadilha IOT"
+
+#: src/signame.c:115
+msgid "EMT trap"
+msgstr "Armadilha EMT"
+
+#: src/signame.c:118
+msgid "Floating point exception"
+msgstr "Excepção de vírgula flutuante"
+
+#: src/signame.c:121
+msgid "Killed"
+msgstr "Morto"
+
+#: src/signame.c:124
+msgid "Bus error"
+msgstr "Erro de bus"
+
+#: src/signame.c:127
+msgid "Segmentation fault"
+msgstr "Falta de segmentação"
+
+#: src/signame.c:130
+msgid "Bad system call"
+msgstr "Má chamada de sistema"
+
+#: src/signame.c:133
+msgid "Broken pipe"
+msgstr "Túnel quebrado"
+
+#: src/signame.c:136
+msgid "Alarm clock"
+msgstr "Alarme"
+
+#: src/signame.c:139
+msgid "Terminated"
+msgstr "Terminado"
+
+#: src/signame.c:142
+msgid "User defined signal 1"
+msgstr "Sinal 1 definido pelo utilizador"
+
+#: src/signame.c:145
+msgid "User defined signal 2"
+msgstr "Sinal 2 definido pelo utilizador"
+
+#: src/signame.c:150 src/signame.c:153
+msgid "Child exited"
+msgstr "Filho saiu"
+
+#: src/signame.c:156
+msgid "Power failure"
+msgstr "Falha de energia"
+
+#: src/signame.c:159
+msgid "Stopped"
+msgstr "Parado"
+
+#: src/signame.c:162
+msgid "Stopped (tty input)"
+msgstr "Parado (entrada tty)"
+
+#: src/signame.c:165
+msgid "Stopped (tty output)"
+msgstr "Parado (saída tty)"
+
+#: src/signame.c:168
+msgid "Stopped (signal)"
+msgstr "Parado (sinal)"
+
+#: src/signame.c:171
+msgid "CPU time limit exceeded"
+msgstr "Excedido limite de tempo da CPU"
+
+#: src/signame.c:174
+msgid "File size limit exceeded"
+msgstr "Excedido limite de tamanho do ficheiro"
+
+#: src/signame.c:177
+msgid "Virtual timer expired"
+msgstr "Temporizador virtual expirado"
+
+#: src/signame.c:180
+msgid "Profiling timer expired"
+msgstr "Temporizador de perfil expirado"
+
+#: src/signame.c:186
+msgid "Window changed"
+msgstr "Janela alterada"
+
+#: src/signame.c:189
+msgid "Continued"
+msgstr "Continuado"
+
+#: src/signame.c:192
+msgid "Urgent I/O condition"
+msgstr "Condição I/O urgente"
+
+#: src/signame.c:199 src/signame.c:208
+msgid "I/O possible"
+msgstr "Possível I/O"
+
+#: src/signame.c:202
+msgid "SIGWIND"
+msgstr "SIGWIND"
+
+#: src/signame.c:205
+msgid "SIGPHONE"
+msgstr "SIGPHONE"
+
+#: src/signame.c:211
+msgid "Resource lost"
+msgstr "Recurso perdido"
+
+#: src/signame.c:214
+msgid "Danger signal"
+msgstr "Sinal de perigo"
+
+#: src/signame.c:217
+msgid "Information request"
+msgstr "Pedido de informação"
+
+#: src/signame.c:220
+msgid "Floating point co-processor not available"
+msgstr "Co-processador de vírgula flutuante não disponível"
+
+#: src/strcache.c:274
+#, c-format
+msgid ""
+"\n"
+"%s No strcache buffers\n"
+msgstr ""
+"\n"
+"%s Sem buffers strcache\n"
+
+#: src/strcache.c:304
+#, c-format
+msgid ""
+"\n"
+"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
+"B\n"
+msgstr ""
+"\n"
+"%s buffers strcache: %lu (%lu) / cadeias = %lu / capacidade = %lu B / média "
+"= %lu B\n"
+
+#: src/strcache.c:308
+#, c-format
+msgid ""
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr ""
+"%s buffer actual: tamanho = %hu B / usado = %hu B / total = %hu / média = %u "
+"B\n"
+
+#: src/strcache.c:319
+#, c-format
+msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
+msgstr "%s outro usado: tamanho = %lu B / total = %lu / média = %lu B\n"
+
+#: src/strcache.c:322
+#, c-format
+msgid ""
+"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
+msgstr ""
+"%s outro livre: tamanho = %lu B / máximo = %lu B / mínimo = %lu B / média = "
+"%hu B\n"
+
+#: src/strcache.c:326
+#, c-format
+msgid ""
+"\n"
+"%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
+msgstr ""
+"\n"
+"%s desempenho strcache: procuras = %lu / taxa de sucesso = %lu%%\n"
+
+#: src/strcache.c:328
+msgid ""
+"# hash-table stats:\n"
+"# "
+msgstr ""
+"# estatísticas da hash-table:\n"
+"# "
+
+#: src/variable.c:1653
+msgid "automatic"
+msgstr "automático"
+
+#: src/variable.c:1656
+msgid "default"
+msgstr "predefinido"
+
+#: src/variable.c:1659
+msgid "environment"
+msgstr "ambiente"
+
+#: src/variable.c:1662
+msgid "makefile"
+msgstr "makefile"
+
+#: src/variable.c:1665
+msgid "environment under -e"
+msgstr "ambiente sob -e"
+
+#: src/variable.c:1668
+msgid "command line"
+msgstr "linha de comandos"
+
+#: src/variable.c:1671
+msgid "'override' directive"
+msgstr "directiva \"override\""
+
+#: src/variable.c:1682
+#, c-format
+msgid " (from '%s', line %lu)"
+msgstr " (de \"%s\", linha %lu)"
+
+#: src/variable.c:1745
+msgid "# variable set hash-table stats:\n"
+msgstr "# conjunto de variáveis de estatísticas hash-table:\n"
+
+#: src/variable.c:1756
+msgid ""
+"\n"
+"# Variables\n"
+msgstr ""
+"\n"
+"# Variáveis\n"
+
+#: src/variable.c:1760
+msgid ""
+"\n"
+"# Pattern-specific Variable Values"
+msgstr ""
+"\n"
+"# Valores de variáveis específicas de padrão"
+
+#: src/variable.c:1774
+msgid ""
+"\n"
+"# No pattern-specific variable values."
+msgstr ""
+"\n"
+"# Sem valores de variáveis específicas de padrão"
+
+#: src/variable.c:1776
+#, c-format
+msgid ""
+"\n"
+"# %u pattern-specific variable values"
+msgstr ""
+"\n"
+"# %u valores de variáveis específicas de padrão"
+
+#: src/variable.h:229
+#, c-format
+msgid "warning: undefined variable '%.*s'"
+msgstr "aviso: variável \"%.*s\" indefinida"
+
+#: src/vmsfunctions.c:91
+#, c-format
+msgid "sys$search() failed with %d\n"
+msgstr "sys$search() falhou com %d\n"
+
+#: src/vmsjobs.c:244
+#, c-format
+msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
+msgstr "-aviso, poderá ter de reactivar a gestão CTRL-Y a partir de DCL.\n"
+
+#: src/vmsjobs.c:681
+#, c-format
+msgid "BUILTIN CD %s\n"
+msgstr "CD INTERNO %s\n"
+
+#: src/vmsjobs.c:1224
+#, c-format
+msgid "DCL: %s\n"
+msgstr "DCL: %s\n"
+
+#: src/vmsjobs.c:1284
+#, c-format
+msgid "Append output to %s\n"
+msgstr "Anexar saída a %s\n"
+
+#: src/vmsjobs.c:1309
+#, c-format
+msgid "Append %.*s and cleanup\n"
+msgstr "Anexar %.*s e limpar\n"
+
+#: src/vmsjobs.c:1322
+#, c-format
+msgid "Executing %s instead\n"
+msgstr "A executar antes %s\n"
+
+#: src/vpath.c:603
+msgid ""
+"\n"
+"# VPATH Search Paths\n"
+msgstr ""
+"\n"
+"# Caminhos de procura VPATH\n"
+
+#: src/vpath.c:620
+msgid "# No 'vpath' search paths."
+msgstr "# Sem caminhos de procura \"vpath\"."
+
+#: src/vpath.c:622
+#, c-format
+msgid ""
+"\n"
+"# %u 'vpath' search paths.\n"
+msgstr ""
+"\n"
+"# Caminhos de procura %u \"vpath\".\n"
+
+#: src/vpath.c:625
+msgid ""
+"\n"
+"# No general ('VPATH' variable) search path."
+msgstr ""
+"\n"
+"# Sem caminho de procura geral (variável \"VPATH\")."
+
+#: src/vpath.c:631
+msgid ""
+"\n"
+"# General ('VPATH' variable) search path:\n"
+"# "
+msgstr ""
+"\n"
+"# Caminho de procura geral (variável \"VPATH\")."
+
+#: src/w32/w32os.c:44
+#, c-format
+msgid "Jobserver slots limited to %d\n"
+msgstr "Ranhuras jobserver limitadas a %d\n"
+
+#: src/w32/w32os.c:60
+#, c-format
+msgid "creating jobserver semaphore: (Error %ld: %s)"
+msgstr "a criar semáforo jobserver: (erro %ld: %s)"
+
+#: src/w32/w32os.c:79
+#, c-format
+msgid ""
+"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
+msgstr "erro interno: impossível abrir semáforo jobserver '%s': (erro %ld: %s)"
+
+#: src/w32/w32os.c:82
+#, c-format
+msgid "Jobserver client (semaphore %s)\n"
+msgstr "Cliente jobserver (semáforo %s)\n"
+
+#: src/w32/w32os.c:123
+#, c-format
+msgid "release jobserver semaphore: (Error %ld: %s)"
+msgstr "libertar semáforo jobserver: (erro %ld: %s)"
+
+#: src/w32/w32os.c:194
+#, c-format
+msgid "semaphore or child process wait: (Error %ld: %s)"
+msgstr "espera de semáforo ou processo filho: (erro %ld: %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: comando não encontrado\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: comando não encontrado\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: programa de shell não encontrado"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s vai suspender por 30 segundos..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "feito sleep(30). A continuar.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Erro desconhecido %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Aviso: o ficheiro \"%s\" tem a hora de modificação no futuro"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
index dbfc309184dfad250e8581011e56c9f934b0993e..82195dab9b5724b7dfd43022874ca2f2f00fa829 100644 (file)
Binary files a/po/pt_BR.gmo and b/po/pt_BR.gmo differ
index be0651c17f892c9161b124e2b47bd6d4e08d053e..fcc62a460d7ea71a0d2d42a8861a4e387ba5532d 100644 (file)
-# Mensagem do GNU make em Português (Brasil)
+# Mensagem do GNU make em Português (Brasil)
 # Copyright (C) 2000 Free Software Foundation, Inc.
 #
 # This file is distributed under the same license as the make package.
-# Fábio Henrique F. Silva <fabiohfs@mail.com>, 2000.
-# Fábio Henrique F. Silva <fabiohfs@netscape.net>, 2008, 2009, 2010, 2011, 2012, 2013.
+# Fábio Henrique F. Silva <fabiohfs@mail.com>, 2000.
+# Fábio Henrique F. Silva <fabiohfs@netscape.net>, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016
+# Fábio Henrique F. Silva <fabiohfs@netscape.net>, 2017, 2018, 2019
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: GNU make 3.82\n"
+"Project-Id-Version: GNU make 4.2.91\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2013-01-09 23:04-0300\n"
-"Last-Translator: Fábio Henrique F. Silva <fabiohfs@netscape.net>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2019-10-04 22:31-0300\n"
+"Last-Translator: Fábio Henrique F. Silva <fabiohfs@netscape.net>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
 "net>\n"
 "Language: pt_BR\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.5.4\n"
-"X-Poedit-SourceCharset: iso-8859-1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 2.0.6\n"
 
-# Caso você encontre alguma mensagem que não está bem traduzida, por
-# favor me informe dando sua sugestão.
-#: ar.c:46
-#, fuzzy, c-format
+# Caso você encontre alguma mensagem que não está bem traduzida, por
+# favor me informe dando sua sugestão.
+#: src/ar.c:46
+#, c-format
 msgid "attempt to use unsupported feature: '%s'"
-msgstr "característica não suportada: `%s'"
+msgstr "característica não suportada: '%s' "
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
-msgstr "o touch não está disponível no VMS"
+msgstr "o touch não está disponível no VMS"
 
-#: ar.c:147
-#, fuzzy, c-format
+#: src/ar.c:147
+#, c-format
 msgid "touch: Archive '%s' does not exist"
-msgstr "touch: Arquivo `%s' não existe"
+msgstr "touch: Arquivo '%s' não existe"
 
-#: ar.c:150
-#, fuzzy, c-format
+#: src/ar.c:150
+#, c-format
 msgid "touch: '%s' is not a valid archive"
-msgstr "touch: `%s' não é um arquivo válido"
+msgstr "touch: '%s' não é um arquivo válido"
 
-#: ar.c:157
-#, fuzzy, c-format
+#: src/ar.c:157
+#, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
-msgstr "touch: O membro `%s' não existe em `%s'"
+msgstr "touch: O membro '%s' não existe em '%s'"
 
-#: ar.c:164
-#, fuzzy, c-format
+#: src/ar.c:164
+#, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
-msgstr "touch: O ar_member_touch retornou um código de erro inválido em `%s'"
+msgstr "touch: O ar_member_touch retornou um código de erro inválido em '%s'"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
-msgstr "o lbr$set_module() falhou ao obter informações do módulo, estado = %d"
+msgstr "o lbr$set_module() falhou ao obter informações do módulo, estado = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() falhou com estado = %d"
 
-#: arscan.c:261
-#, fuzzy, c-format
+#: src/arscan.c:261
+#, c-format
 msgid "unable to open library '%s' to lookup member status %d"
-msgstr "erro na abertura da biblioteca `%s' para localizar o membro `%s'"
+msgstr ""
+"erro na abertura da biblioteca '%s' para localizar o status do membro %d"
 
-#: arscan.c:965
-#, fuzzy, c-format
+#: src/arscan.c:944
+#, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
-msgstr "Membro `%s'%s: %ld bytes de %ld (%ld).\n"
+msgstr "Membro '%s'%s: %ld bytes de %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (o nome pode estar truncado)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Data %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, modo = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
-msgstr ""
+msgstr "O comando tem muitas linhas (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Quebra.\n"
 
-#: commands.c:627
-#, fuzzy, c-format
+#: src/commands.c:628
+#, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
-msgstr "** [%s] O arquivo membro `%s' pode ser falso. Não foi apagado."
+msgstr "** [%s] O arquivo membro '%s' pode ser falso. Não foi apagado."
 
-#: commands.c:631
-#, fuzzy, c-format
+#: src/commands.c:632
+#, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
-msgstr "** O arquivo membro `%s' pode ser falso. Não foi apagado."
+msgstr "** O arquivo membro '%s' pode ser falso. Não foi apagado."
 
-#: commands.c:645
-#, fuzzy, c-format
+#: src/commands.c:646
+#, c-format
 msgid "*** [%s] Deleting file '%s'"
-msgstr "** [%s] Apagando arquivo `%s'"
+msgstr "** [%s] Apagando arquivo '%s'"
 
-#: commands.c:647
-#, fuzzy, c-format
+#: src/commands.c:648
+#, c-format
 msgid "*** Deleting file '%s'"
-msgstr "** Apagando arquivo `%s'"
+msgstr "** Apagando arquivo '%s'"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "# comandos a executar"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (embutido):"
 
-#: commands.c:688
-#, fuzzy, c-format
+#: src/commands.c:689
+#, c-format
 msgid " (from '%s', line %lu):\n"
-msgstr " (de `%s', linha %lu):\n"
+msgstr " (de '%s', linha %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
 msgstr ""
 "\n"
-"# Diretórios\n"
+"# Diretórios\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
-msgstr "# %s: não pôde ser estabelecido.\n"
+msgstr "# %s: não pôde ser estabelecido.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (chave %s, mtime %d): não pôde ser aberto.\n"
+msgstr "# %s (chave %s, mtime %d): não pôde ser aberto.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
-msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): não pôde ser aberto.\n"
+msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): não pôde ser aberto.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
-msgstr "# %s (dispositivo %ld, inode %ld): não pôde ser aberto.\n"
+msgstr "# %s (dispositivo %ld, inode %ld): não pôde ser aberto.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (chave %s, mtime %d): "
+msgstr "# %s (chave %s, mtime %ull): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (dispositivo %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (dispositivo %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
-msgstr "Não"
+msgstr "Não"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " arquivos, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
-msgstr "não"
+msgstr "não"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " impossibilidades"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
-msgstr " até agora."
+msgstr " até agora."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
-msgstr " impossibilidades em %lu diretórios.\n"
+msgstr " impossibilidades em %lu diretórios.\n"
 
-#: expand.c:125
-#, fuzzy, c-format
+#: src/expand.c:125
+#, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
-msgstr "Variável recursiva `%s' faz referência a ela mesma (eventualmente)"
+msgstr "Variável recursiva '%s' faz referência a ela mesma (eventualmente)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
-msgstr "referência a variável não finalizada"
+msgstr "referência a variável não finalizada"
 
-#: file.c:278
-#, fuzzy, c-format
+#: src/file.c:278
+#, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
-msgstr "Os comandos especificados para o arquivo `%s' em %s:%lu,"
+msgstr "Os comandos especificados para o arquivo '%s' em %s:%lu,"
 
-#: file.c:283
-#, fuzzy, c-format
+#: src/file.c:283
+#, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
-"Os comandos para o arquivo `%s' foram encontrados por uma regra implícita,"
+"Os comandos para o arquivo '%s' foram encontrados por uma regra implícita,"
 
-#: file.c:287
-#, fuzzy, c-format
+#: src/file.c:287
+#, c-format
 msgid "but '%s' is now considered the same file as '%s'."
-msgstr "mas `%s' é considerado o mesmo arquivo que `%s'."
+msgstr "mas '%s' é considerado o mesmo arquivo que '%s'."
 
-#: file.c:290
-#, fuzzy, c-format
+#: src/file.c:290
+#, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
-msgstr "Os comandos para `%s' serão ignorados em favor daqueles para `%s'."
+msgstr "Os comandos para '%s' serão ignorados em favor daqueles para '%s'."
 
-#: file.c:310
-#, fuzzy, c-format
+#: src/file.c:310
+#, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
-msgstr "não pôde renomear de dois-pontos `%s' para dois-pontos duplos `%s'"
+msgstr "não pôde renomear de dois-pontos '%s' para dois-pontos duplos '%s'"
 
-#: file.c:316
-#, fuzzy, c-format
+#: src/file.c:316
+#, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
-msgstr "não pôde renomer de dois-pontos duplos `%s' para dois-pontos `%s'"
+msgstr "não pôde renomer de dois-pontos duplos '%s' para dois-pontos '%s'"
 
-#: file.c:408
-#, fuzzy, c-format
+#: src/file.c:408
+#, c-format
 msgid "*** Deleting intermediate file '%s'"
-msgstr "** Apagando arquivo intermediário `%s'"
+msgstr "** Apagando arquivo intermediário '%s'"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
-msgstr "Apagando arquivo intermediário...\n"
+msgstr "Apagando arquivo intermediário...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Hora atual"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Data/Hora fora de faixa; substituindo %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
-msgstr "# Não é um alvo:"
+msgstr "# Não é um alvo:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "# Arquivo importante (prerequisito de .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "# Alvo Falso (prerequisito de .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "# Linha de Comando do Alvo."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
-msgstr "# Um Padrão, arquivo MAKEFILES ou -include/sinclude makefile."
+msgstr "# Um Padrão, arquivo MAKEFILES ou -include/sinclude makefile."
 
-#: file.c:975
-#, fuzzy
+#: src/file.c:1029
 msgid "#  Builtin rule"
-msgstr ""
-"\n"
-"# Faltam as regras implícitas."
+msgstr "# Regra implícita"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
-msgstr "# Pesquisa por regra implícita concluida."
+msgstr "# Pesquisa por regra implícita concluida."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
-msgstr "# Pesquisa por regra implícita não concluida."
+msgstr "# Pesquisa por regra implícita não concluida."
 
-#: file.c:980
-#, fuzzy, c-format
+#: src/file.c:1034
+#, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
-msgstr "# Derivação padrão implícita/estática: `%s'\n"
+msgstr "# Derivação padrão implícita/estática: '%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
-msgstr "# O arquivo é um pré-requisito intermediário."
+msgstr "# O arquivo é um pré-requisito intermediário."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
-msgstr "# Também faz:"
+msgstr "# Também faz:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
-msgstr "# O Período da modificação nunca foi verificado."
+msgstr "# O Período da modificação nunca foi verificado."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
-msgstr "# O Arquivo não existe."
+msgstr "# O Arquivo não existe."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
-msgstr "# O Arquivo está desatualizado."
+msgstr "# O Arquivo está desatualizado."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
-msgstr "# Última modificação %s\n"
+msgstr "# Última modificação %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "# O Arquivo foi atualizado."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
-msgstr "# O Arquivo não foi atualizado."
+msgstr "# O Arquivo não foi atualizado."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
-msgstr "# Comandos em execução (ISTO É UMA FALHA)."
+msgstr "# Comandos em execução (ISTO É UMA FALHA)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
-msgstr "# Comandos de dependências em execução (ISTO É UMA FALHA)."
+msgstr "# Comandos de dependências em execução (ISTO É UMA FALHA)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "# Atualizado com sucesso."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
-msgstr "# Precisa ser atualizado (-q está definido)."
+msgstr "# Precisa ser atualizado (-q está definido)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
-msgstr "# Problemas com a atualização."
+msgstr "# Problemas com a atualização."
 
-#: file.c:1032
-#, fuzzy
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
-msgstr "# Valor inválido no membro `command_state' !"
+msgstr "# Valor inválido no membro 'command_state' !"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -361,7 +360,7 @@ msgstr ""
 "\n"
 "# Arquivos"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -371,564 +370,591 @@ msgstr ""
 "# tabela hash de arquivos:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
-msgstr ""
+msgstr "%s: Campo '%s' não memorizado: %s"
 
-#: function.c:790
-#, fuzzy
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
-msgstr "primeiro argumento não numérico para a função `word'"
+msgstr "primeiro argumento não numérico para a função 'word'"
 
-#: function.c:795
-#, fuzzy
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
-msgstr "o primeiro argumento para a função `word' deve ser maior que 0"
+msgstr "o primeiro argumento para a função 'word' deve ser maior que 0"
 
-#: function.c:815
-#, fuzzy
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
-msgstr "primeiro argumento não numérico para a função `wordlist'"
+msgstr "primeiro argumento não numérico para a função 'wordlist' "
 
-#: function.c:817
-#, fuzzy
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
-msgstr "segundo argumento não numérico para a função `wordlist'"
+msgstr "segundo argumento não numérico para a função 'wordlist' "
 
-#: function.c:1525
-#, fuzzy, c-format
+#: src/function.c:1533
+#, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
-msgstr "windows32_openpipe(): DuplicateHandle(In) falhou (e=%ld)\n"
+msgstr ""
+"windows32_openpipe(): DuplicateHandle(In) falhou (e=%ld)\n"
+" \n"
 
-#: function.c:1549
-#, fuzzy, c-format
+#: src/function.c:1557
+#, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
-msgstr "windows32_open_pipe(): DuplicateHandle(Err) falhou (e=%ld)\n"
+msgstr ""
+"windows32_openpipe(): DuplicateHandle(Err) falhou (e=%ld)\n"
+"\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() falhou (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() falhou\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
-msgstr "Apagando o arquivo de lote temporário %s\n"
+msgstr "Apagando o arquivo de lote temporário %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
-msgstr ""
+msgstr "arquivo: faltando o nome do arquivo"
 
-#: function.c:2219 function.c:2250
-#, fuzzy, c-format
+#: src/function.c:2234 src/function.c:2265
+#, c-format
 msgid "open: %s: %s"
-msgstr "%s: %s"
+msgstr "aberto: %s: %s"
 
-#: function.c:2227
-#, fuzzy, c-format
+#: src/function.c:2242
+#, c-format
 msgid "write: %s: %s"
-msgstr "Erro de gravação: %s"
+msgstr "gravação: %s: %s"
 
-#: function.c:2230 function.c:2267
-#, fuzzy, c-format
+#: src/function.c:2245 src/function.c:2282
+#, c-format
 msgid "close: %s: %s"
-msgstr "%s%s: %s"
+msgstr "fechado: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
-msgstr ""
+msgstr "arquivo: muitos argumentos"
 
-#: function.c:2262
-#, fuzzy, c-format
+#: src/function.c:2277
+#, c-format
 msgid "read: %s: %s"
-msgstr "%s: %s"
+msgstr "lido: %s: %s"
 
-#: function.c:2275
-#, fuzzy, c-format
+#: src/function.c:2290
+#, c-format
 msgid "file: invalid file operation: %s"
-msgstr "%s: a opção é inválida -- %c\n"
+msgstr "arquivo: operação de arquivo inválida: %s"
 
-#: function.c:2390
-#, fuzzy, c-format
+#: src/function.c:2405
+#, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
-msgstr "O número de argumentos é insuficiente (%d) para a função `%s' "
+msgstr "O número de argumentos é insuficiente (%d) para a função '%s'  "
 
-#: function.c:2402
-#, fuzzy, c-format
+#: src/function.c:2417
+#, c-format
 msgid "unimplemented on this platform: function '%s'"
-msgstr "A função `%s' não foi implementada nesta plataforma "
+msgstr "A função '%s' não foi implementada nesta plataforma  "
 
-#: function.c:2466
-#, fuzzy, c-format
+#: src/function.c:2483
+#, c-format
 msgid "unterminated call to function '%s': missing '%c'"
-msgstr "Chamada não terminada para a função `%s': faltando `%c'"
+msgstr "Chamada não terminada para a função '%s': faltando '%c' "
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
-msgstr ""
+msgstr "Nome da função vazio"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
-msgstr ""
+msgstr "Nome da função inválido: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
-msgstr ""
+msgstr "Nome da função muito longo: %s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "O número de argumentos é insuficiente (%d) para a função `%s' "
+msgstr "O número mínimo de argumentos é inválido (%u) para a função %s"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "O número de argumentos é insuficiente (%d) para a função `%s' "
+msgstr "O número máximo de argumentos é inválido (%u) para a função %s"
 
-#: getopt.c:659
-#, fuzzy, c-format
+#: src/getopt.c:659
+#, c-format
 msgid "%s: option '%s' is ambiguous\n"
-msgstr "%s: a opção `%s' é ambigua\n"
+msgstr ""
+"%s: a opção '%s' é ambigua\n"
+"\n"
 
-#: getopt.c:683
-#, fuzzy, c-format
+#: src/getopt.c:683
+#, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
-msgstr "%s: a opção `--%s' não permite um argumento\n"
+msgstr ""
+"%s: a opção '--%s' não permite um argumento\n"
+"\n"
 
-#: getopt.c:688
-#, fuzzy, c-format
+#: src/getopt.c:688
+#, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
-msgstr "%s: a opção `%c%s' não permite um argumento\n"
+msgstr "%s: a opção '%c%s' não permite um argumento\n"
 
-#: getopt.c:705 getopt.c:878
-#, fuzzy, c-format
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
 msgid "%s: option '%s' requires an argument\n"
-msgstr "%s: a opção `%s' requer um argumento\n"
+msgstr ""
+"%s: a opção '%s' requer um argumento\n"
+"\n"
 
-#: getopt.c:734
-#, fuzzy, c-format
+#: src/getopt.c:734
+#, c-format
 msgid "%s: unrecognized option '--%s'\n"
-msgstr "%s: a opção é desconhecida `--%s'\n"
+msgstr ""
+"%s: a opção é desconhecida '--%s'\n"
+"\n"
 
-#: getopt.c:738
-#, fuzzy, c-format
+#: src/getopt.c:738
+#, c-format
 msgid "%s: unrecognized option '%c%s'\n"
-msgstr "%s: a opção é desconhecida `%c%s'\n"
+msgstr ""
+"%s: a opção é desconhecida '%c%s'\n"
+"\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
-msgstr "%s: a opção é ilegal -- %c\n"
+msgstr "%s: a opção é ilegal -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
-msgstr "%s: a opção é inválida -- %c\n"
+msgstr "%s: a opção é inválida -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
-msgstr "%s: a opção requer um argumento -- %c\n"
+msgstr "%s: a opção requer um argumento -- %c\n"
 
-#: getopt.c:844
-#, fuzzy, c-format
+#: src/getopt.c:844
+#, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
-msgstr "%s: a opção `-W %s' é ambigua\n"
+msgstr ""
+"%s: a opção '-W %s' é ambigua\n"
+"\n"
 
-#: getopt.c:862
-#, fuzzy, c-format
+#: src/getopt.c:862
+#, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
-msgstr "%s: a opção `-W %s' não permite um argumento\n"
+msgstr ""
+"%s: a opção '-W %s' não permite um argumento\n"
+"\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
-msgstr ""
+msgstr "guile: Expandindo '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
-msgstr ""
+msgstr "guile: Avaliando '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
-msgstr "não foi possível alocar %lu bytes para a tabela hash: memória cheia"
+msgstr "não foi possível alocar %lu bytes para a tabela hash: memória cheia"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Carga=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Carga=%lu/%lu=%.0f%%,"
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Rehash=%d, "
+msgid "Rehash=%u, "
+msgstr "Rehash=%u,"
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Colisões=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Colisões=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
-#, fuzzy, c-format
+#: src/implicit.c:38
+#, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
-msgstr "Procurando por uma regra implícita para `%s'.\n"
+msgstr ""
+"Procurando por uma regra implícita para '%s'.\n"
+" \n"
 
-#: implicit.c:54
-#, fuzzy, c-format
+#: src/implicit.c:54
+#, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
-msgstr "Procurando por uma regra implícita de arquivo-membro para `%s'.\n"
-
-#: implicit.c:311
-msgid "Avoiding implicit rule recursion.\n"
-msgstr "Evitando recursão em regra implícita.\n"
+msgstr ""
+"Procurando por uma regra implícita de arquivo-membro para '%s'.\n"
+" \n"
 
-#: implicit.c:486
+#: src/implicit.c:311
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr ""
+msgid "Avoiding implicit rule recursion.\n"
+msgstr "Evitando recursão em regra implícita.\n"
 
-#: implicit.c:491
+#: src/implicit.c:484
 #, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Desvio muito longo: '%.*s'.\n"
+
+#: src/implicit.c:490
+#, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
-msgstr "Tentando padrão para regra com `%.*s'.\n"
+msgstr ""
+"Tentando padrão para regra com '%.*s'.\n"
+"\n"
 
-#: implicit.c:697
-#, fuzzy, c-format
+#: src/implicit.c:717
+#, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
-msgstr "Rejeitando pré-requisito para regra `%s'.\n"
+msgstr ""
+"Rejeitando pré-requisito para regra '%s'.\n"
+"\n"
 
-#: implicit.c:698
-#, fuzzy, c-format
+#: src/implicit.c:718
+#, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
-msgstr "Rejeitando pré-requisitos implícitos `%s'.\n"
+msgstr ""
+"Rejeitando pré-requisitos implícitos '%s'.\n"
+"\n"
 
-#: implicit.c:711
-#, fuzzy, c-format
+#: src/implicit.c:732
+#, c-format
 msgid "Trying rule prerequisite '%s'.\n"
-msgstr "Tentanto pré-requisito para a regra `%s'.\n"
+msgstr ""
+"Tentanto pré-requisito para a regra '%s'.\n"
+"\n"
 
-#: implicit.c:712
-#, fuzzy, c-format
+#: src/implicit.c:733
+#, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
-msgstr "Tentando pré-requisito implícito `%s'.\n"
+msgstr ""
+"Tentando pré-requisito implícito '%s'.\n"
+"\n"
 
-#: implicit.c:751
-#, fuzzy, c-format
+#: src/implicit.c:772
+#, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
-msgstr "Pré-requisito `%s' encontrado como VPATH `%s'\n"
+msgstr ""
+"Pré-requisito '%s' encontrado como VPATH '%s'\n"
+"\n"
 
-#: implicit.c:765
-#, fuzzy, c-format
+#: src/implicit.c:786
+#, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
-msgstr "Procurando uma regra com o arquivo intermediário `%s'.\n"
+msgstr ""
+"Procurando uma regra com o arquivo intermediário '%s'.\n"
+"\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
-msgstr "Não foi possível criar um arquivos temporário\n"
+msgstr "Não foi possível criar um arquivos temporário\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (arquivo core criado)"
 
-#: job.c:490
-#, fuzzy
+#: src/job.c:553
 msgid " (ignored)"
-msgstr "[%s] Erro %d (ignorado)"
+msgstr "(ignorado)"
 
-#: job.c:494 job.c:1828
-#, fuzzy
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
-msgstr " (embutido):"
+msgstr "<embutido>"
 
-#: job.c:510
-#, fuzzy, c-format
+#: src/job.c:573
+#, c-format
 msgid "%s[%s: %s] Error %d%s"
-msgstr "** [%s] Erro %d"
+msgstr "%s[%s: %s] Erro %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "** Esperando que outros processos terminem."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Filho ativo %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (remoto)"
 
-#: job.c:831
+#: src/job.c:898
 #, c-format
-msgid "Reaping losing child %p PID %s %s\n"
+msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Descarregando processo filho %p PID %s %s\n"
 
-#: job.c:832
+#: src/job.c:899
 #, c-format
-msgid "Reaping winning child %p PID %s %s\n"
+msgid "Reaping losing child %p PID %s %s\n"
 msgstr "Descarregando processo filho %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
-msgstr "Apagando o arquivo de lote temporário: %s\n"
+msgstr "Apagando o arquivo de lote temporário: %s\n"
 
-#: job.c:845
-#, fuzzy, c-format
+#: src/job.c:956
+#, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
-msgstr "Apagando o arquivo de lote temporário: %s\n"
+msgstr "Ao apagar o arquivo de lote temporário %s houve uma falha (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Removendo o processo filho %p PID %s%s da cadeia.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Liberado sinalizador para o processo filho %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() falhou ao executar o processo (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
 "Counted %d args in failed launch\n"
 msgstr ""
 "\n"
-"Contados %d args na falha de execução\n"
+"Contados %d args na falha de execução\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Colocando o processo filho %p (%s) PID %s%s na cadeia.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Obtido o sinalizador para o processo filho %p (%s).\n"
 
-#: job.c:1838
-#, fuzzy, c-format
+#: src/job.c:1902
+#, c-format
 msgid "%s: target '%s' does not exist"
-msgstr "touch: Arquivo `%s' não existe"
+msgstr "%s Alvo '%s' não existe"
 
-#: job.c:1841
-#, fuzzy, c-format
+#: src/job.c:1905
+#, c-format
 msgid "%s: update target '%s' due to: %s"
-msgstr "%sSem regra para processar o alvo `%s', necessário por `%s'%s"
+msgstr "%s: alvo atualizado '%s'devido a: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
-msgstr "não pôde forçar os limites de carga neste sistema operacional"
+msgstr "não pôde forçar os limites de carga neste sistema operacional"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
-msgstr "não pôde forçar a carga limite:"
+msgstr "não pôde forçar a carga limite:"
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
-msgstr "sem manipuladores de arquivos: não é possível duplicar stdin\n"
+msgstr "sem manipuladores de arquivos: não é possível duplicar stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
-msgstr "sem manipuladores de arquivos: não é possível duplicar stdout\n"
+msgstr "sem manipuladores de arquivos: não é possível duplicar stdout\n"
 
-#: job.c:2074
-#, fuzzy
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
-msgstr "sem manipuladores de arquivos: não é possível duplicar stdin\n"
+msgstr "sem manipuladores de arquivos: não é possível duplicar stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
-msgstr "Não é possível restaurar stdin\n"
+msgstr "Não é possível restaurar stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
-msgstr "Não é possível restaurar stdout\n"
+msgstr "Não é possível restaurar stdout\n"
 
-#: job.c:2105
-#, fuzzy
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
-msgstr "Não é possível restaurar stdin\n"
+msgstr "Não é possível restaurar stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "processo filho descarregado: pid %s, aguardando pelo pid %s\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Comando não encontrado"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Comando não encontrado"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Interpretador de comandos não encontrado"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
-msgstr "spawnvpe: o espaço de ambiente pode estar cheio"
+msgstr "spawnvpe: o espaço de ambiente pode estar cheio"
 
-#: job.c:2584
-#, fuzzy, c-format
+#: src/job.c:2862
+#, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
-msgstr "$SHELL alterado (era `%s' e agora é `%s')\n"
+msgstr ""
+"$SHELL alterado (era '%s' e agora é '%s')\n"
+"\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
-msgstr "Criando arquivo de lote temporário %s\n"
+msgstr "Criando arquivo de lote temporário %s\n"
 
-#: job.c:3030
-#, fuzzy
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
-"Conteúdo do arquivo de lote:%s\n"
-"\t%s\n"
+"Conteúdo do arquivo de lote:\n"
+"\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
-"Conteúdo do arquivo de lote:%s\n"
+"Conteúdo do arquivo de lote:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
-msgstr "%s (linha %d) contexto inválido (!unixy && !batch_mode_shell)\n"
-
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
+msgstr "%s (linha %d) contexto inválido (!unixy && !batch_mode_shell)\n"
 
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
-msgstr ""
+msgstr "Falha ao abrir a tabela de símbolos globais: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
-msgstr ""
+msgstr "O objeto carregado %s não foi declarado compatível com a GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
-msgstr ""
+msgstr "Falhou ao carragar o símbolo %s de %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
-msgstr ""
+msgstr "Nome do símbolo vazio: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
-msgstr ""
+msgstr "Carregando símbolo %s de %s\n"
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
-msgstr "Tarefas paralelas (-j) não são suportadas nesta plataforma."
+msgstr "A operação 'load' não é suportada nesta plataforma."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
-msgstr "Opções:\n"
+msgstr "Opções:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr " -b, -m                      Ignorado para compatibilidade.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 " -B, --always-make           Processa todos os alvos incondicionalmente.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr ""
-" -C DIRETÓRIO, --directory=DIRETÓRIO\n"
-"                              Muda para o DIRETÓRIO antes de fazer algo.\n"
+" -C DIRETÓRIO, --directory=DIRETÓRIO\n"
+"                              Muda para o DIRETÓRIO antes de fazer algo.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
-msgstr " -d                          Imprime muita informação de depuração.\n"
+msgstr " -d                          Imprime muita informação de depuração.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
-" --debug[=OPÇÕES]            Imprime vários tipos de informações de "
-"depuração.\n"
+" --debug[=OPÇÕES]            Imprime vários tipos de informações de "
+"depuração.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 " -e, --environment-overrides\n"
-"                              Assume os valores das variáveis de ambiente.\n"
+"                              Assume os valores das variáveis de ambiente.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=STRING               Avalia a STRING como uma declaração para um "
+"-E STRING,  --eval=STRING    Avalia a STRING como uma declaração para um "
 "makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
 msgstr ""
 " -f ARQUIVO, --file=ARQUIVO, --makefile=ARQUIVO\n"
-"                              Lê o ARQUIVO como se fosse um arquivo make.\n"
+"                              Lê o ARQUIVO como se fosse um arquivo make.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr " -h, --help                   Imprime esta mensagem e sai.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr " -i, --ignore-errors         Ignora os erros dos comandos.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr ""
-" -I DIRETÓRIO, --include-dir=DIRETÓRIO\n"
-"                              Pesquisa o DIRETÒRIO por arquivos make a "
+" -I DIRETÓRIO, --include-dir=DIRETÓRIO\n"
+"                              Pesquisa o DIRETÒRIO por arquivos make a "
 "incluir.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -936,122 +962,130 @@ msgstr ""
 " -j [N], --jobs[=N]          Permite N tarefas de uma vez; tarefas infinitas "
 "sem argumentos.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
-" -k, --keep-going            Continua mesmo que alguns alvos não possam ser "
+" -k, --keep-going            Continua mesmo que alguns alvos não possam ser "
 "processados.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
 "N.\n"
 msgstr ""
 " -l [N], --load-average[=N], --max-load[=N]\n"
-"                              Não inicia múltiplas tarefas a menos que a "
+"                              Não inicia múltiplas tarefas a menos que a "
 "carga seja menor que N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
-"-L, --check-symlink-times  Usa o tempo mais antigo entre o vínculo simbólico "
+"-L, --check-symlink-times  Usa o tempo mais antigo entre o vínculo simbólico "
 "e o alvo.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
 "them.\n"
 msgstr ""
 " -n, --just-print, --dry-run, --recon\n"
-"                              Não executa quaisquer comandos; apenas imprime-"
+"                              Não executa quaisquer comandos; apenas imprime-"
 "os.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
 "it.\n"
 msgstr ""
 " -o ARQUIVO, --old-file=ARQUIVO, --assume-old=ARQUIVO\n"
-"                              Considera o ARQUIVO como muito antigo e não "
-"reprocessá-o.\n"
+"                              Considera o ARQUIVO como muito antigo e não "
+"reprocessá-o.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
+"  -O[TYPE], --output-sync[=TYPE]\n"
+"                              Sincroniza a saída de tarefas paralelas pelo "
+"TIPO.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 " -p, --print-data-base       Imprime o banco de dados interno do make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
-" -q, --question              Não executa os comandos; O código de saida "
-"indica se está atualizado.\n"
+" -q, --question              Não executa os comandos; O código de saida "
+"indica se está atualizado.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
-msgstr " -r, --no-builtin-rules      Desabilita as regras implícitas.\n"
+msgstr " -r, --no-builtin-rules      Desabilita as regras implícitas.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
-" -R, --no-builtin-variables  Desabilita a configuração das variáveis "
+" -R, --no-builtin-variables  Desabilita a configuração das variáveis "
 "embutidas.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
-msgstr " -s, --silent, --quiet       Não ecoa os comandos.\n"
+msgstr " -s, --silent, --quiet       Não ecoa os comandos.\n"
+
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Ecoa as instruções (desabilita o modo --"
+"silent).\n"
 
-#: main.c:393
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 "  -S, --no-keep-going, --stop\n"
-"                              Desativa a opção -k.\n"
+"                              Desativa a opção -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
-" -t, --touch                 Executa um `touch' nos alvos ao invés de "
-"reprocessá-los.\n"
+" -t, --touch                 Executa um `touch' nos alvos ao invés de "
+"reprocessá-los.\n"
 
-#: main.c:398
-#, fuzzy
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
-msgstr " -d                          Imprime muita informação de depuração.\n"
+msgstr "   -trace                       Imprime informação de depuração.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
-" -v, --version               Imprime o número de versão do make e sai.\n"
+" -v, --version               Imprime o número de versão do make e sai.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
-msgstr " -w, --print-directory       Imprime o diretório atual.\n"
+msgstr " -w, --print-directory       Imprime o diretório atual.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr ""
-" --no-print-directory        Desativa a opção -w, mesmo que ela esteja "
+" --no-print-directory        Desativa a opção -w, mesmo que ela esteja "
 "implicitamente ativada.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1059,34 +1093,35 @@ msgstr ""
 " -W ARQUIVO, --what-if=ARQUIVO, --new-file=ARQUIVO, --assume-new=ARQUIVO\n"
 "                              Considera o ARQUIVO infinitamente novo.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
-" --warn-undefined-variables  Avisa quando um variável não definida for "
+" --warn-undefined-variables  Avisa quando um variável não definida for "
 "referenciada.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
-msgstr "Cadeia de caracteres vazia não é válida como nome de arquivo"
+msgstr "Cadeia de caracteres vazia não é válida como nome de arquivo"
 
-#: main.c:766
-#, fuzzy, c-format
+#: src/main.c:754
+#, c-format
 msgid "unknown debug level specification '%s'"
-msgstr "nível de depuração desconhecido: `%s'"
+msgstr "nível de depuração desconhecido: '%s' "
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
-msgstr ""
+msgstr "tipo output-sync desconhecido '%s'"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
-msgstr "%s: Interrupção/Exceção capturada (código = 0x%lx, endereço = 0x%p)\n"
+msgstr "%s: Interrupção/Exceção capturada (código = 0x%lx, endereço = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1096,138 +1131,147 @@ msgid ""
 "ExceptionAddress = 0x%p\n"
 msgstr ""
 "\n"
-"Não pôde tratar o filtro de exceção chamado por %s\n"
-"CódigoExceção = %lx\n"
-"SinalExceção = %lx\n"
-"EndereçoExceção = 0x%p\n"
+"Não pôde tratar o filtro de exceção chamado por %s\n"
+"CódigoExceção = %lx\n"
+"SinalExceção = %lx\n"
+"EndereçoExceção = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
-msgstr "Violação de acesso: operação de escrita no endereço 0x%p\n"
+msgstr "Violação de acesso: operação de escrita no endereço 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
-msgstr "Violação de acesso: operação de leitura no endereço 0x%p\n"
+msgstr "Violação de acesso: operação de leitura no endereço 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() definiu o default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell(), caminho de pesquisa do default_shell = %s\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s está suspenso por 30 segundos..."
-
-#: main.c:1540
+#: src/main.c:1609
 #, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) concluido. Continuando.\n"
-
-#: main.c:1627
-#, fuzzy
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
-msgstr "aviso: jobserver indisponível: usando -j1. Inclua `+' na regra pai."
+msgstr "aviso: jobserver indisponível: usando -j1. Inclua '+' na regra pai. "
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "aviso: -jN forçado no submake: desabilitando o modo jobserver."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "aviso: -j%d  forçado no submake: reiniciando o modo jobserver."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
-msgstr "Makefile na entrada padrão especificado duas vezes."
+msgstr "Makefile na entrada padrão especificado duas vezes."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
-msgstr "fopen (arquivo temporário)"
+msgstr "fopen (arquivo temporário)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
-msgstr "fwrite (arquivo temporário)"
+msgstr "fwrite (arquivo temporário)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "aviso: -j%d forçado no submake: reiniciando o modo jobserver."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
-msgstr "Tarefas paralelas (-j) não são suportadas nesta plataforma."
+msgstr "Tarefas paralelas (-j) não são suportadas nesta plataforma."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
-msgstr "Reiniciando no modo de tarefa única (-j1)."
+msgstr "Reiniciando no modo de tarefa única (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
-msgstr "Vínculos simbólicos não são suportados: desabilite -L."
+msgstr "Vínculos simbólicos não são suportados: desabilite -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Atualizando os arquivos makefiles ...\n"
 
-#: main.c:2195
-#, fuzzy, c-format
+#: src/main.c:2226
+#, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
-msgstr "O arquivo `%s' pode estar em loop; não reprocessá-lo.\n"
+msgstr ""
+"O arquivo '%s' pode estar em loop; não reprocessá-lo.\n"
+"\n"
 
-#: main.c:2279
-#, fuzzy, c-format
+#: src/main.c:2303
+#, c-format
 msgid "Failed to remake makefile '%s'."
-msgstr "Problemas ao reprocessar o arquivo `%s'."
+msgstr "Problemas ao reprocessar o arquivo '%s'. "
 
-#: main.c:2299
-#, fuzzy, c-format
+#: src/main.c:2323
+#, c-format
 msgid "Included makefile '%s' was not found."
-msgstr "Arquivo `%s' incluido não foi encontrado."
+msgstr "Arquivo '%s' incluido não foi encontrado. "
 
-#: main.c:2304
-#, fuzzy, c-format
+#: src/main.c:2328
+#, c-format
 msgid "Makefile '%s' was not found"
-msgstr "O arquivo `%s' não foi encontrado."
+msgstr "O arquivo '%s' não foi encontrado. "
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
-msgstr "Não foi possível voltar ao diretório original."
+msgstr "Não foi possível voltar ao diretório original."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Re-executando[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
-msgstr "desvinculado (arquivos temporário): "
+msgstr "desvinculado (arquivos temporário): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
-msgstr ". DEFAULT_GOAL contém mais do que um alvo"
-
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Nenhum alvo indicado e nenhum arquivo make encontrado"
+msgstr ". DEFAULT_GOAL contém mais do que um alvo"
 
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Sem alvo"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Nenhum alvo indicado e nenhum arquivo make encontrado"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Atualizando os objetivos finais...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
-msgstr "aviso: O relógio está errado. Sua compilação pode ficar incompleta."
+msgstr "aviso: O relógio está errado. Sua compilação pode ficar incompleta."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
-msgstr "Uso: %s [opções] [alvo] ...\n"
+msgstr "Uso: %s [opções] [alvo] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1236,7 +1280,7 @@ msgstr ""
 "\n"
 "Este programa foi compilado para %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1245,32 +1289,32 @@ msgstr ""
 "\n"
 "Este programa foi compilado para %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Informe os problemas para <bug-make@gnu.org>.\n"
 
-#: main.c:2870
-#, fuzzy, c-format
+#: src/main.c:2901
+#, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
-msgstr "a opção `%s%s' requer um argumento não vazio"
+msgstr "a opção '%s%s' requer um argumento não vazio "
 
-#: main.c:2934
-#, fuzzy, c-format
+#: src/main.c:2965
+#, c-format
 msgid "the '-%c' option requires a positive integer argument"
-msgstr "a opção `-%c' requer um argumento inteiro positivo"
+msgstr "a opção '-%c' requer um argumento inteiro positivo "
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sCompilado para %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sCompilado para %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1278,13 +1322,13 @@ msgid ""
 "%sThis is free software: you are free to change and redistribute it.\n"
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
-"%sLicença GPLv3+: GNU GPL versão 3 ou posterior <http://gnu.org/licenses/gpl."
+"%sLicença GPLv3+: GNU GPL versão 3 ou posterior <http://gnu.org/licenses/gpl."
 "html>\n"
-"%sIsto é um aplicativo livre: você pode alterá-lo e redistribui-lo "
+"%sIsto é um aplicativo livre: você pode alterá-lo e redistribui-lo "
 "livremente.\n"
-"%sNÃO HÁ GARANTIAS, exceto o que for permitido por lei.\n"
+"%sNÃ\83O HÃ\81 GARANTIAS, exceto o que for permitido por lei.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1293,7 +1337,7 @@ msgstr ""
 "\n"
 "# Banco de dados do Make, impresso em %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1302,856 +1346,941 @@ msgstr ""
 "\n"
 "# Banco de dados do Make finalizado em %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Erro desconhecido %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
-msgstr "%s: usuário %lu (real %lu), grupo %lu (real %lu)\n"
+msgstr "%s: usuário %lu (real %lu), grupo %lu (real %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Acesso inicializado"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
-msgstr "Acesso do usuário"
+msgstr "Acesso do usuário"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Acesso do make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Acesso filho"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
-msgstr "%s: Entrando em um diretório desconhecido\n"
+msgstr "%s: Entrando em um diretório desconhecido\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
-msgstr "%s: Saindo de um diretório desconhecido\n"
+msgstr "%s: Saindo de um diretório desconhecido\n"
 
-#: output.c:109
-#, fuzzy, c-format
+#: src/output.c:102
+#, c-format
 msgid "%s: Entering directory '%s'\n"
-msgstr "%s: Entrando no diretório `%s'\n"
+msgstr ""
+"%s: Entrando no diretório '%s'\n"
+"\n"
 
-#: output.c:111
-#, fuzzy, c-format
+#: src/output.c:104
+#, c-format
 msgid "%s: Leaving directory '%s'\n"
-msgstr "%s: Saindo do diretório `%s'\n"
+msgstr ""
+"%s: Saindo do diretório '%s'\n"
+"\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
-msgstr "%s[%u]: Entrando em um diretório desconhecido\n"
+msgstr "%s[%u]: Entrando em um diretório desconhecido\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
-msgstr "%s[%u]: Saindo de um diretório desconhecido\n"
+msgstr "%s[%u]: Saindo de um diretório desconhecido\n"
 
-#: output.c:120
-#, fuzzy, c-format
+#: src/output.c:113
+#, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
-msgstr "%s[%u]: Entrando no diretório `%s'\n"
+msgstr ""
+"%s[%u]: Entrando no diretório '%s'\n"
+"\n"
 
-#: output.c:122
-#, fuzzy, c-format
+#: src/output.c:115
+#, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
-msgstr "%s[%u]: Saindo do diretório `%s'\n"
+msgstr ""
+"%s[%u]: Saindo do diretório '%s'\n"
+"\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
-msgstr "Erro de gravação: %s"
+msgstr "Erro de gravação: stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Pare.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"-O[TYPE] (--output-sync[=TYPE]) não está configurado para esta compilação."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
-msgstr "criando canalização de tarefas"
+msgstr "criando canalização de tarefas"
 
-#: posixos.c:72 posixos.c:227
-#, fuzzy
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
-msgstr "criando canalização de tarefas"
+msgstr "duplicando canalização de tarefas"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
-msgstr "inicializando a canalização do jobserver"
+msgstr "inicializando a canalização do jobserver"
 
-#: posixos.c:90
-#, fuzzy, c-format
+#: src/posixos.c:119
+#, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
-msgstr "erro interno: valor `%s' inválido para --jobserver-fds"
+msgstr "erro interno: valor '%s' inválido para --jobserver-auth"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Cliente Jobserver (fds %d,%d)\n"
 
-#: posixos.c:109
-#, fuzzy
+#: src/posixos.c:138
 msgid "jobserver pipeline"
-msgstr "inicializando a canalização do jobserver"
+msgstr "canalização do jobserver"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "gravar jobserver"
 
-#: posixos.c:268
-#, fuzzy
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "servidor de job desligado"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
-msgstr "tarefas canalizadas lidas"
+msgstr "tarefas canalizadas pselect"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "tarefas canalizadas lidas"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Lendo arquivos makefile ...\n"
 
-#: read.c:329
-#, fuzzy, c-format
+#: src/read.c:336
+#, c-format
 msgid "Reading makefile '%s'"
-msgstr "Lendo arquivos makefile `%s'"
+msgstr "Lendo arquivos makefile '%s' "
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
-msgstr " (não há objetivo padrão)"
+msgstr " (não há objetivo padrão)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (caminho de pesquisa)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
-msgstr " (sem importância)"
+msgstr " (sem importância)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
-msgstr " (sem expansão ~)"
+msgstr " (sem expansão ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
-msgstr ""
+msgstr "Ignorando UTF-8 BOM no makefile '%s'\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
-msgstr ""
+msgstr "Ignorando UTF-8 BOM no makefile buffer\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
-msgstr "síntaxe inválida na condicional"
+msgstr "síntaxe inválida na condicional"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
-msgstr ""
+msgstr "%s: falhou ao carregar"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
-msgstr "comandos começam antes do primeiro alvo"
+msgstr "comandos começam antes do primeiro alvo"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "falta uma regra antes dos comandos"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
-msgstr " (você pensou em TAB ao invés de 8 espaços?)"
+msgstr "faltando separador  (você pensou em TAB ao invés de 8 espaços?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "faltando o separador%s"
+msgstr "faltando o separador"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
-msgstr "faltando o padrão dos alvos"
+msgstr "faltando o padrão dos alvos"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
-msgstr "múltiplos padrões para o alvo"
+msgstr "múltiplos padrões para o alvo"
 
-#: read.c:1268
-#, fuzzy, c-format
+#: src/read.c:1289
+#, c-format
 msgid "target pattern contains no '%%'"
-msgstr "padrão para o alvo não contém `%%'"
+msgstr "padrão para o alvo não contém '%%' "
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
-msgstr "faltando `endif'"
+msgstr "faltando 'endif' "
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
-msgstr "nome de variável vazio"
+msgstr "nome de variável vazio"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
-msgstr "Texto estranho depois da diretiva `define'"
+msgstr "Texto estranho depois da diretiva 'define' "
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
-msgstr "faltando `endef', `define' não terminado"
+msgstr "faltando 'endef', 'define' não terminado "
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
-msgstr "Texto estranho depois da diretiva `endef"
+msgstr "Texto estranho depois da diretiva 'endef'"
 
-#: read.c:1588
-#, fuzzy, c-format
+#: src/read.c:1603
+#, c-format
 msgid "extraneous text after '%s' directive"
-msgstr "Texto estranho depois da diretiva `%s'"
+msgstr "Texto estranho depois da diretiva '%s' "
 
-#: read.c:1589
-#, fuzzy, c-format
+#: src/read.c:1604
+#, c-format
 msgid "extraneous '%s'"
-msgstr "`%s' estranho"
+msgstr "'%s' estranho "
 
-#: read.c:1617
-#, fuzzy
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
-msgstr "use apenas um `else' por condicional"
+msgstr "use apenas um 'else' por condicional "
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
-msgstr "Definição de variável para o alvo mau formada"
+msgstr "Definição de variável para o alvo mau formada"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
-msgstr "os pré-requisitos não podem ser definidos no comando"
+msgstr "os pré-requisitos não podem ser definidos no comando"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "alvos agrupados devem fornecer uma instrução"
 
-#: read.c:2009
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
-msgstr "As regras implícitas e de padrão estático misturadas"
+msgstr "As regras implícitas e de padrão estático misturadas"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
-msgstr "As regras implícitas e normais misturadas"
+msgstr "As regras implícitas e normais misturadas"
 
-#: read.c:2085
-#, fuzzy, c-format
+#: src/read.c:2107
+#, c-format
 msgid "target '%s' doesn't match the target pattern"
-msgstr "O alvo `%s' não coincide com o padrão"
+msgstr "O alvo '%s' não coincide com o padrão "
 
-#: read.c:2100 read.c:2146
-#, fuzzy, c-format
+#: src/read.c:2122 src/read.c:2168
+#, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr "O arquivo alvo `%s' tem entradas : e ::"
+msgstr "O arquivo alvo '%s' tem entradas : e :: "
 
-#: read.c:2106
-#, fuzzy, c-format
+#: src/read.c:2128
+#, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr "O alvo `%s' foi informado mais do que um vez na mesma regra."
+msgstr "O alvo '%s' foi informado mais do que um vez na mesma regra. "
 
-#: read.c:2116
-#, fuzzy, c-format
+#: src/read.c:2138
+#, c-format
 msgid "warning: overriding recipe for target '%s'"
-msgstr "aviso: sobreescrevendo os comandos para o alvo `%s'"
+msgstr "aviso: sobrescrevendo os comandos para o alvo '%s'"
 
-#: read.c:2119
-#, fuzzy, c-format
+#: src/read.c:2141
+#, c-format
 msgid "warning: ignoring old recipe for target '%s'"
-msgstr "aviso: ignorando comandos antigos para o alvo `%s'"
+msgstr "aviso: ignorando comandos antigos para o alvo '%s' "
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
-msgstr "As regras implícitas e normais misturadas"
+msgstr "As regras implícitas e normais misturadas: síntaxe obsoleta"
+
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "aviso: sobrescrevendo o grupo para o alvo '%s'"
 
-#: read.c:2542
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "aviso: caracter NUL detetado; o resto da linha foi ignorado"
 
-#: remake.c:226
-#, fuzzy, c-format
+#: src/remake.c:226
+#, c-format
 msgid "Nothing to be done for '%s'."
-msgstr "Nada a ser feito para `%s'."
+msgstr "Nada a ser feito para '%s'. "
 
-#: remake.c:227
-#, fuzzy, c-format
+#: src/remake.c:227
+#, c-format
 msgid "'%s' is up to date."
-msgstr "`%s' está atualizado."
+msgstr "'%s' está atualizado. "
 
-#: remake.c:323
-#, fuzzy, c-format
+#: src/remake.c:323
+#, c-format
 msgid "Pruning file '%s'.\n"
-msgstr "Atualizando o arquivo `%s'.\n"
+msgstr ""
+"Atualizando o arquivo '%s'.\n"
+"\n"
 
-#: remake.c:406
-#, fuzzy, c-format
+#: src/remake.c:389
+#, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
-msgstr "%sSem regra para processar o alvo `%s', necessário por `%s'%s"
+msgstr "%sSem regra para processar o alvo '%s', necessário por '%s'%s "
 
-#: remake.c:416
-#, fuzzy, c-format
+#: src/remake.c:399
+#, c-format
 msgid "%sNo rule to make target '%s'%s"
-msgstr "%sSem regra para processar o alvo `%s'%s"
+msgstr "%sSem regra para processar o alvo '%s'%s "
 
-#: remake.c:442
-#, fuzzy, c-format
+#: src/remake.c:425
+#, c-format
 msgid "Considering target file '%s'.\n"
-msgstr "Considerando o arquivo alvo `%s'.\n"
+msgstr ""
+"Considerando o arquivo alvo '%s'.\n"
+"\n"
 
-#: remake.c:449
-#, fuzzy, c-format
+#: src/remake.c:432
+#, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
-msgstr "Tentativa de atualizar o arquivo `%s' falhou.\n"
+msgstr ""
+"Tentativa de atualizar o arquivo '%s' falhou.\n"
+"\n"
 
-#: remake.c:461
-#, fuzzy, c-format
+#: src/remake.c:444
+#, c-format
 msgid "File '%s' was considered already.\n"
-msgstr "O arquivo `%s' já foi considerado.\n"
+msgstr ""
+"O arquivo '%s' já foi considerado.\n"
+"\n"
 
-#: remake.c:471
-#, fuzzy, c-format
+#: src/remake.c:454
+#, c-format
 msgid "Still updating file '%s'.\n"
-msgstr "Ainda está atualizando o arquivo `%s'.\n"
+msgstr ""
+"Ainda está atualizando o arquivo '%s'.\n"
+"\n"
 
-#: remake.c:474
-#, fuzzy, c-format
+#: src/remake.c:457
+#, c-format
 msgid "Finished updating file '%s'.\n"
-msgstr "Atualização do arquivo `%s' concluida.\n"
+msgstr ""
+"Atualização do arquivo '%s' concluida.\n"
+"\n"
 
-#: remake.c:503
-#, fuzzy, c-format
+#: src/remake.c:486
+#, c-format
 msgid "File '%s' does not exist.\n"
-msgstr "O arquivo `%s' não existe.\n"
+msgstr ""
+"O arquivo '%s' não existe.\n"
+"\n"
 
-#: remake.c:511
-#, fuzzy, c-format
+#: src/remake.c:494
+#, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
-"*** Aviso: arquivo .LOW_RESOLUTION_TIME `%s' tem uma etiqueta de tempo de "
-"alta resolução"
+"*** Aviso: arquivo .LOW_RESOLUTION_TIME '%s' tem uma etiqueta de tempo de "
+"alta resolução "
 
-#: remake.c:524 remake.c:1056
-#, fuzzy, c-format
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
 msgid "Found an implicit rule for '%s'.\n"
-msgstr "Regra implícita encontrada para `%s'.\n"
+msgstr ""
+"Regra implícita encontrada para '%s'.\n"
+"\n"
 
-#: remake.c:526 remake.c:1058
-#, fuzzy, c-format
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
 msgid "No implicit rule found for '%s'.\n"
-msgstr "Nenhuma regra implícita encontrada para `%s'.\n"
+msgstr ""
+"Nenhuma regra implícita encontrada para '%s'.\n"
+"\n"
 
-#: remake.c:532
-#, fuzzy, c-format
+#: src/remake.c:515
+#, c-format
 msgid "Using default recipe for '%s'.\n"
-msgstr "Usando os comandos padrões para `%s'.\n"
+msgstr ""
+"Usando os comandos padrões para '%s'.\n"
+"\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
-msgstr "Dependência circular %s <- %s abandonada."
+msgstr "Dependência circular %s <- %s abandonada."
 
-#: remake.c:691
-#, fuzzy, c-format
+#: src/remake.c:674
+#, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
-msgstr "Pré-requisitos do alvo `%s' concluido.\n"
+msgstr ""
+"Pré-requisitos do alvo '%s' concluido.\n"
+"\n"
 
-#: remake.c:697
-#, fuzzy, c-format
+#: src/remake.c:680
+#, c-format
 msgid "The prerequisites of '%s' are being made.\n"
-msgstr "Pré-requisitos do `%s' estão sendo criados.\n"
+msgstr ""
+"Pré-requisitos do '%s' estão sendo criados.\n"
+"\n"
 
-#: remake.c:711
-#, fuzzy, c-format
+#: src/remake.c:694
+#, c-format
 msgid "Giving up on target file '%s'.\n"
-msgstr "Desistindo do arquivo `%s'.\n"
+msgstr ""
+"Desistindo do arquivo '%s'.\n"
+"\n"
 
-#: remake.c:716
-#, fuzzy, c-format
+#: src/remake.c:699
+#, c-format
 msgid "Target '%s' not remade because of errors."
-msgstr "O alvo `%s' não foi reprocessado por causa de erros."
+msgstr "O alvo '%s' não foi reprocessado por causa de erros. "
 
-#: remake.c:768
-#, fuzzy, c-format
+#: src/remake.c:751
+#, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
-msgstr "Pré-requisito `%s' está ordenado para o alvo `%s'.\n"
+msgstr ""
+"Pré-requisito '%s' está ordenado para o alvo '%s'.\n"
+"\n"
 
-#: remake.c:773
-#, fuzzy, c-format
+#: src/remake.c:756
+#, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
-msgstr "Pré-requisitos `%s' do alvo `%s' não existem.\n"
+msgstr ""
+"Pré-requisitos '%s' do alvo '%s' não existem.\n"
+"\n"
 
-#: remake.c:778
-#, fuzzy, c-format
+#: src/remake.c:761
+#, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
-msgstr "Pré-requisito `%s' é mais novo do que o alvo `%s'.\n"
+msgstr ""
+"Pré-requisito '%s' é mais novo do que o alvo '%s'.\n"
+"\n"
 
-#: remake.c:781
-#, fuzzy, c-format
+#: src/remake.c:764
+#, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
-msgstr "Pré-requisito `%s' é mais antigo do que o alvo `%s'.\n"
+msgstr ""
+"Pré-requisito '%s' é mais antigo do que o alvo '%s'.\n"
+"\n"
 
-#: remake.c:799
-#, fuzzy, c-format
+#: src/remake.c:782
+#, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
-msgstr "O alvo `%s' é dois-pontos duplos e não tem pré-requisitos.\n"
+msgstr "O alvo '%s' são dois-pontos duplos e não tem pré-requisitos.\n"
 
-#: remake.c:806
-#, fuzzy, c-format
+#: src/remake.c:789
+#, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
-msgstr "Nenhum comando para `%s' e nenhum pré-requisito foi alterado.\n"
+msgstr ""
+"Nenhum comando para '%s' e nenhum pré-requisito foi alterado.\n"
+"\n"
 
-#: remake.c:811
-#, fuzzy, c-format
+#: src/remake.c:794
+#, c-format
 msgid "Making '%s' due to always-make flag.\n"
-msgstr "Processando `%s' devido a opção always-make.\n"
+msgstr ""
+"Processando '%s' devido a opção always-make.\n"
+"\n"
 
-#: remake.c:819
-#, fuzzy, c-format
+#: src/remake.c:802
+#, c-format
 msgid "No need to remake target '%s'"
-msgstr "Não é necessário reprocessar o alvo `%s'"
+msgstr "Não é necessário reprocessar o alvo '%s' "
 
-#: remake.c:821
-#, fuzzy, c-format
+#: src/remake.c:804
+#, c-format
 msgid "; using VPATH name '%s'"
-msgstr "; usando o nome VPATH `%s'"
+msgstr "; usando o nome VPATH '%s' "
 
-#: remake.c:841
-#, fuzzy, c-format
+#: src/remake.c:824
+#, c-format
 msgid "Must remake target '%s'.\n"
-msgstr "O alvo `%s' deve ser reprocessado.\n"
+msgstr ""
+"O alvo '%s' deve ser reprocessado.\n"
+"\n"
 
-#: remake.c:847
-#, fuzzy, c-format
+#: src/remake.c:830
+#, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
-msgstr "  Ignorando o nome VPATH `%s'.\n"
+msgstr ""
+"  Ignorando o nome VPATH '%s'.\n"
+"\n"
 
-#: remake.c:856
-#, fuzzy, c-format
+#: src/remake.c:839
+#, c-format
 msgid "Recipe of '%s' is being run.\n"
-msgstr "Os comandos de `%s' estão rodando.\n"
+msgstr ""
+"Os comandos de '%s' estão rodando.\n"
+"\n"
 
-#: remake.c:863
-#, fuzzy, c-format
+#: src/remake.c:846
+#, c-format
 msgid "Failed to remake target file '%s'.\n"
-msgstr "Falha ao reprocessar o alvo `%s'.\n"
+msgstr ""
+"Falha ao reprocessar o alvo '%s'.\n"
+"\n"
 
-#: remake.c:866
-#, fuzzy, c-format
+#: src/remake.c:849
+#, c-format
 msgid "Successfully remade target file '%s'.\n"
-msgstr "Alvo `%s' reprocessado com sucesso.\n"
+msgstr ""
+"Alvo '%s' reprocessado com sucesso.\n"
+"\n"
 
-#: remake.c:869
-#, fuzzy, c-format
+#: src/remake.c:852
+#, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
-msgstr "O alvo `%s' precisa ser reprocessado sob -q.\n"
+msgstr ""
+"O alvo '%s' precisa ser reprocessado sob -q.\n"
+"\n"
 
-#: remake.c:1064
-#, fuzzy, c-format
+#: src/remake.c:1047
+#, c-format
 msgid "Using default commands for '%s'.\n"
-msgstr "Usando os comandos padrões para `%s'.\n"
-
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "** Aviso: O arquivo `%s' está com a hora adiantada"
+msgstr ""
+"Usando os comandos padrões para '%s'.\n"
+"\n"
 
-#: remake.c:1444
-#, fuzzy, c-format
+#: src/remake.c:1422
+#, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
-msgstr "** Aviso: O arquivo `%s' está com a hora %s s adiantada"
+msgstr "** Aviso: O arquivo '%s' está com a hora %s s adiantada "
 
-#: remake.c:1647
-#, fuzzy, c-format
+#: src/remake.c:1662
+#, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
-msgstr "O elemento .LIBPATTERNS `%s' não é um padrão"
+msgstr "O elemento .LIBPATTERNS '%s' não é um padrão "
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
-msgstr "Customizações não exportadas: %s\n"
+msgstr "Customizações não exportadas: %s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
 
-#: rule.c:496
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
 msgstr ""
 "\n"
-"# Regras implícitas."
+"# Regras implícitas."
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
 msgstr ""
 "\n"
-"# Faltam as regras implícitas."
+"# Faltam as regras implícitas."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u regras implícitas, %u"
+"# %u regras implícitas, %u  (%.1f%%) terminal."
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "ERRO: num_pattern_rules errada!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "sinal desconhecido"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Desconectar"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
-msgstr "Interrupção"
+msgstr "Interrupção"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Sair"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
-msgstr "Instrução ilegal"
+msgstr "Instrução ilegal"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Aviso Trace/breakpoint"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Abortado"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Aviso IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Aviso EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
-msgstr "Exceção de ponto flutuante"
+msgstr "Exceção de ponto flutuante"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Finalizado"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Erro de barramento"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
-msgstr "Falha de segmentação"
+msgstr "Falha de segmentação"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
-msgstr "Chamada de sistema inválida"
+msgstr "Chamada de sistema inválida"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
-msgstr "Canalização interrompida"
+msgstr "Canalização interrompida"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Despertador"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Terminado"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
-msgstr "Sinal 1 definido pelo usuário"
+msgstr "Sinal 1 definido pelo usuário"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
-msgstr "Sinal 2 definido pelo usuário"
+msgstr "Sinal 2 definido pelo usuário"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "O Filho saiu"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
-msgstr "Falha na Energia Elétrica"
+msgstr "Falha na Energia Elétrica"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Parado"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Parado (entrada tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Parado (saida tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Parado (sinal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Tempo de CPU excedido"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Tamanho do arquivo excedido"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Temporizador virtual expirou"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Temporizador de perfil expirou"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Janela alterada"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
-msgstr "Continuação"
+msgstr "Continuação"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
-msgstr "Condição de E/S urgente"
+msgstr "Condição de E/S urgente"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
-msgstr "Possível E/S"
+msgstr "Possível E/S"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Recurso perdido"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Sinal perigoso"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
-msgstr "Solicitação de informação"
+msgstr "Solicitação de informação"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
-msgstr "Co-processador aritmético indisponível"
+msgstr "Co-processador aritmético indisponível"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr ""
+"\n"
+"%s Não há strcache buffers\n"
 
-#: strcache.c:304
-#, fuzzy, c-format
+#: src/strcache.c:304
+#, c-format
 msgid ""
 "\n"
 "%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
 "B\n"
-msgstr "%s strcache usado: total = %d (%d) / max = %d / min = %d / med = %d\n"
+msgstr ""
+"\n"
+"%s strcache buffers: %lu (%lu) / strings = %lu / armazenamento = %lu / med = "
+"%lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
+"%s buf atual: tamanho = %hu B / usado = %hu B / contado = %hu / med = %u B\n"
 
-#: strcache.c:319
-#, fuzzy, c-format
+#: src/strcache.c:319
+#, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
-msgstr "%s strcache usado: total = %d (%d) / max = %d / min = %d / med = %d\n"
+msgstr "%s outro usado: total = %lu B / contado = %lu /  med = %lu B\n"
 
-#: strcache.c:322
-#, fuzzy, c-format
+#: src/strcache.c:322
+#, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
-msgstr "%s strcache livres: total = %d (%d) / max = %d / min = %d / med = %d\n"
+msgstr ""
+"%s outro livre: total = %lu B / max = %lu B / min = %lu B / med = %hu B\n"
 
-#: strcache.c:326
-#, fuzzy, c-format
+#: src/strcache.c:326
+#, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 "\n"
-"%s # de cadeias em strcache: %d / pesquisados = %lu / encontrados = %lu\n"
+"%s desempenho strcache: pesquisados = %lu / encontrados = %lu%%\n"
 
-#: strcache.c:328
-#, fuzzy
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
 msgstr ""
-"\n"
 "# tabela hash de arquivos:\n"
-"# "
+"#"
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
-msgstr "automático"
+msgstr "automático"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
-msgstr "padrão"
+msgstr "padrão"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "ambiente"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "ambiente sob -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "linha de comando"
 
-#: variable.c:1647
-#, fuzzy
+#: src/variable.c:1671
 msgid "'override' directive"
-msgstr "diretiva `override'"
+msgstr "diretiva 'override' "
 
-#: variable.c:1658
-#, fuzzy, c-format
+#: src/variable.c:1682
+#, c-format
 msgid " (from '%s', line %lu)"
-msgstr " (de `%s', linha %lu)"
+msgstr " (de '%s', linha %lu) "
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
-msgstr "# tabela hash do conjunto de variávies:\n"
+msgstr "# tabela hash do conjunto de variávies:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
 msgstr ""
 "\n"
-"# Variáveis\n"
+"# Variáveis\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
 msgstr ""
 "\n"
-"# Valores da variável de padrões específicos"
+"# Valores da variável de padrões específicos"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 "\n"
-"# Faltam valores para variável de padrões específicos"
+"# Faltam valores para variável de padrões específicos"
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
 "# %u pattern-specific variable values"
 msgstr ""
 "\n"
-"# %u valores para variável de padrões específicos"
+"# %u valores para variável de padrões específicos"
 
-#: variable.h:224
-#, fuzzy, c-format
+#: src/variable.h:229
+#, c-format
 msgid "warning: undefined variable '%.*s'"
-msgstr "aviso: variável indefinida `%.*s'"
+msgstr "aviso: variável indefinida '%.*s' "
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() falhou com %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-warning, pode ser preciso reativar o CTRL-Y no DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "CD EMBUTIDO %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
-msgstr ""
+msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Saida redirecionada para %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Acrescentado %.*s e limpo\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
-msgstr "Executando %s ao invés de\n"
+msgstr "Executando %s ao invés de\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2159,73 +2288,95 @@ msgstr ""
 "\n"
 "# Caminho VPATH\n"
 
-#: vpath.c:620
-#, fuzzy
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
-msgstr "# Sem caminho `vpath'."
+msgstr "# Sem caminho 'vpath'. "
 
-#: vpath.c:622
-#, fuzzy, c-format
+#: src/vpath.c:622
+#, c-format
 msgid ""
 "\n"
 "# %u 'vpath' search paths.\n"
 msgstr ""
 "\n"
-"# %u caminhos `vpath'.\n"
+"# %u caminhos 'vpath'.\n"
+"\n"
 
-#: vpath.c:625
-#, fuzzy
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
 msgstr ""
 "\n"
-"# Sem caminho genérico (variável `VPATH')."
+"# Sem caminho genérico (variável 'VPATH')."
 
-#: vpath.c:631
-#, fuzzy
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
 "# "
 msgstr ""
 "\n"
-"# Caminho genérico (variável `VPATH'):\n"
+"# Caminho genérico (variável 'VPATH'):\n"
 "# "
 
-#: w32/w32os.c:46
-#, fuzzy, c-format
+#: src/w32/w32os.c:44
+#, c-format
 msgid "Jobserver slots limited to %d\n"
-msgstr "Cliente Jobserver (fds %d,%d)\n"
+msgstr "Slots Jobserver limitados a %d)\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
-msgstr ""
+msgstr "criando semáforos jobserver: (Erro %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
-msgstr ""
+msgstr "erro interno: falha ao abrir o semáforo jobserver '%s': (Erro %ld: %s)"
 
-#: w32/w32os.c:84
-#, fuzzy, c-format
+#: src/w32/w32os.c:82
+#, c-format
 msgid "Jobserver client (semaphore %s)\n"
-msgstr "Cliente Jobserver (fds %d,%d)\n"
+msgstr "Cliente Jobserver (semáforo %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
-msgstr ""
+msgstr "liberar semáforos do jobserver: (Erro %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
-msgstr ""
+msgstr "semáforo ou processo filho espera: (Erro %ld: %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s %s: Comando não encontrado\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Comando não encontrado\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Interpretador de comandos não encontrado"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s está suspenso por 30 segundos..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) concluido. Continuando.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Erro desconhecido %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "** Aviso: O arquivo '%s' está com a hora adiantada "
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
 
 #~ msgid "#  Invalid value in `update_status' member!"
-#~ msgstr "# Valor inválido no membro `update_status' !"
+#~ msgstr "# Valor inválido no membro `update_status' !"
 
 #~ msgid "*** [%s] Error 0x%x (ignored)"
 #~ msgstr "*** [%s] Erro 0x%x (ignorado)"
@@ -2240,16 +2391,16 @@ msgstr ""
 #~ msgstr "Chamando comandos internos para atualizar o alvo `%s'.\n"
 
 #~ msgid "internal error: multiple --jobserver-fds options"
-#~ msgstr "erro interno: múltiplas opções --jobserver-fds"
+#~ msgstr "erro interno: múltiplas opções --jobserver-fds"
 
 #~ msgid "dup jobserver"
 #~ msgstr "dup jobserver"
 
 #~ msgid "virtual memory exhausted"
-#~ msgstr "A memória virtual encheu"
+#~ msgstr "A memória virtual encheu"
 
 #~ msgid "write error"
-#~ msgstr "erro de gravação"
+#~ msgstr "erro de gravação"
 
 #~ msgid "%s # of strcache buffers: %d (* %d B/buffer = %d B)\n"
 #~ msgstr "%s # de buffers strcache: %d (* %d B/buffer = %d B)\n"
@@ -2264,7 +2415,7 @@ msgstr ""
 #~ "#"
 
 #~ msgid "Warning: Empty redirection\n"
-#~ msgstr "Aviso: Redireção vazia\n"
+#~ msgstr "Aviso: Redireção vazia\n"
 
 #~ msgid "internal error: `%s' command_state"
 #~ msgstr "erro interno: `%s' command_state"
@@ -2291,7 +2442,7 @@ msgstr ""
 #~ msgstr "Saida redirecionada para %s\n"
 
 #~ msgid "Error spawning, %d\n"
-#~ msgstr "Erro de execução, %d\n"
+#~ msgstr "Erro de execução, %d\n"
 
 #~ msgid "process_easy() failed failed to launch process (e=%ld)\n"
 #~ msgstr "process_easy() falhou ao executar o processo (e=%ld)\n"
@@ -2301,9 +2452,9 @@ msgstr ""
 #~ "%sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n"
 #~ "%sPARTICULAR PURPOSE.\n"
 #~ msgstr ""
-#~ "%sEste é um programa livre; veja o fonte para as condições de cópia.\n"
-#~ "%sNão há garantias; nem mesmo de COMERCIALIZAÇÃO OU ATENDIMENTO A UMA\n"
-#~ "%sFUNÇÃO EM PARTICULAR.\n"
+#~ "%sEste é um programa livre; veja o fonte para as condições de cópia.\n"
+#~ "%sNão há garantias; nem mesmo de COMERCIALIZAÇÃO OU ATENDIMENTO A UMA\n"
+#~ "%sFUNÇÃO EM PARTICULAR.\n"
 
 #~ msgid "extraneous `endef'"
 #~ msgstr "`endef' extranho"
@@ -2312,10 +2463,10 @@ msgstr ""
 #~ msgstr "diretiva `override' vazia"
 
 #~ msgid "invalid `override' directive"
-#~ msgstr "diretiva `override' inválida"
+#~ msgstr "diretiva `override' inválida"
 
 #~ msgid "-warning, CTRL-Y will leave sub-process(es) around.\n"
-#~ msgstr "-warning, CTRL-Y sairá do(s) subprocesso(s).\n"
+#~ msgstr "-warning, CTRL-Y sairá do(s) subprocesso(s).\n"
 
 #~ msgid "Syntax error, still inside '\"'\n"
 #~ msgstr "Erro de sintaxe dentro de '\"'\n"
@@ -2324,16 +2475,16 @@ msgstr ""
 #~ msgstr "Recebido um SIGSHLD; %u processos filhos descarregados.\n"
 
 #~ msgid "Do not specify -j or --jobs if sh.exe is not available."
-#~ msgstr "Não especifique -j ou --jobs se o sh.exe não estiver disponível."
+#~ msgstr "Não especifique -j ou --jobs se o sh.exe não estiver disponível."
 
 #~ msgid "Resetting make for single job mode."
-#~ msgstr "Reiniciando o make para o modo de trabalho único."
+#~ msgstr "Reiniciando o make para o modo de trabalho único."
 
 #~ msgid "no file name for `%sinclude'"
 #~ msgstr "sem nome de arquivo para `%sinclude'"
 
 #~ msgid "target `%s' leaves prerequisite pattern empty"
-#~ msgstr "O alvo `%s' deixou pre-requisito padrão vazio"
+#~ msgstr "O alvo `%s' deixou pre-requisito padrão vazio"
 
 #~ msgid ""
 #~ "\n"
index b13e248023e1dce69fe07c3d198c9016e8af494c..8bfdf7e2e58ba90344f7bf82a8229efaae463de0 100644 (file)
Binary files a/po/ru.gmo and b/po/ru.gmo differ
index 0e5ec72daa99886798160eef986f8ecec8585f1f..c2ccf94738af7dcf634c774acbfd3b365942aead 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
 # Alexey Mahotkin <alexm@hsys.msk.ru>, 2001.
 # Denis Perchine <dyp@perchine.com>, 2001, 2002.
 # Pavel Maryanov <acid_jack@ukr.net>, 2009.
-# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2013, 2014, 2016.
+# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2013, 2014, 2016, 2019, 2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-23 20:04+0300\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 22:09+0300\n"
 "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
 "Language-Team: Russian <gnu@d07.ru>\n"
 "Language: ru\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Lokalize 2.0\n"
 "Plural-Forms:  nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "попытка использования неподдерживаемого средства: «%s»"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "обновление времени изменения члена архива невозможно в системе VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "обновление времени изменения: Архив «%s» не существует"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "обновление времени изменения: Неверный архив: «%s»"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "обновление времени изменения: Элемент «%s» не содержится в «%s»"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr ""
 "обновление времени изменения: Функция ar_member_touch вернула\n"
 "ошибочное значение для «%s»"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() не смогла извлечь информацию о модуле, статус = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$init_control() вернула код ошибки %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr ""
 "невозможно открыть библиотеку «%s» для определения состояния элемента %d"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Элемент «%s»%s: %ld байт по адресу %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (имя может быть усечено)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Дата %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, mode = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "В способе слишком много строк (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Останов.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Элемент архива «%s», кажется, недействителен; не удалён"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Элемент архива «%s», кажется, недействителен; не удалён"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Удаляется файл «%s»"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Удаляется файл «%s»"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  способ, который следует применить"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (встроенные):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr "  (из «%s», строка %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -139,222 +141,222 @@ msgstr ""
 "\n"
 "# Каталоги\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: невозможно получить сведения вызовом stat.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (ключ %s, mtime %ull): невозможно открыть.\n"
+msgstr "# %s (ключ %s, mtime %l64u): невозможно открыть.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (устройство %d, inode [%d,%d,%d]): невозможно открыть.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (устройство %ld, inode %ld): невозможно открыть.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (ключ %s, mtime %ull): "
+msgstr "# %s (ключ %s, mtime %l64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (устройство %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (устройство %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Нет"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " файлов,"
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "нет"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " недостижимых целей"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " на текущий момент."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " недостижимых целей в %lu каталогах.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Рекурсивная переменная «%s» ссылается сама на себя (в результате)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "незавершённая ссылка на переменную"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Способ для файла «%s» был задан в %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Способ для файла «%s» был найден из неявного правила,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "но «%s» и «%s» теперь считаются одним и тем же файлом."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 "Способ для «%s» игнорируется, вместо него будет использован способ для «%s»."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 "невозможно переименовать «%s» с одним двоеточием в «%s» с двумя двоеточиями"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 "невозможно переименовать «%s» с двумя двоеточиями в «%s» с одним двоеточием"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Удаление промежуточного файла «%s»"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Удаление промежуточных файлов...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Текущее время"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Временной штамп выходит за пределы диапазона; подставляем %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Не является целью:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Ценный файл (зависимость .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Псевдоцель (зависимость от .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Цель, вызываемая из командной строки."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  По умолчанию, MAKEFILES, или -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "# Встроенное правило"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Производился поиск неявных правил."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Поиск неявных правил не производился."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Основа неявного или статического образца: «%s»\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Файл — промежуточная зависимость."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Собирает также:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Время изменения ни разу не проверялось."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Файл не существует."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Файл очень старый."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Время последнего изменения %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Файл был обновлён."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Файл не был обновлён."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  В данный момент уже применяется некий способ (ЭТО ОШИБКА)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr ""
 "#  В данный момент уже применяется некий способ по зависимостям (ЭТО ОШИБКА)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Успешно обновлено."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Должно быть обновлено (задан ключ -q)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Попытка обновления безуспешна."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Неверное значение члена «command_state»!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -362,7 +364,7 @@ msgstr ""
 "\n"
 "# Файлы"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -372,334 +374,342 @@ msgstr ""
 "# состояние файлов хеш-таблицы:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Поле «%s» не кешировано: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "нечисловой первый аргумент функции «word»"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "первый аргумент функции «word» должен быть больше нуля"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "нечисловой первый аргумент функции «wordlist»"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "нечисловой второй аргумент функции «wordlist»"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) вернула код ошибки (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) вернула код ошибки (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() вернула код ошибки (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() завершилась неудачно\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Очищаю временный пакетный файл %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "файл: отсутствует имя файла"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "открытие: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "запись: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "закрытие: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "файл: слишком много аргументов"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "чтение: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "файл: некорректная операция с файлом: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "недостаточно аргументов (всего %d) функции «%s»"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "не реализовано на этой платформе: функция «%s»"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "незавершённый вызов функции «%s»: пропущено «%c»"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Пустое имя функции"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Некорректное имя функции: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Слишком длинное имя функции: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Некорректное минимальное число аргументов (всего %u) функции %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Некорректное максимальное число аргументов (всего %u) функции %s"
 
 # Сообщения getopt исключены, т.к. они относятся к уже
 # устаревшей версии этой библиотеки, и исчезнут в следующей версии make
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: ключ «%s» не однозначен\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: ключ «--%s» должен использоваться без аргумента\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: ключ «%c%s» должен использоваться без аргумента\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: ключу «%s» требуется аргумент\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: неизвестный ключ «--%s»\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: неизвестный ключ «%c%s»\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: недопустимый ключ -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: неверный ключ -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: ключ требует аргумент -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: ключ «-W %s» неоднозначен\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: ключ «-W %s» должен использоваться без аргумента\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: расширяется «%s»\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: вычисляется «%s»\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "не удалось выделить %lu байт для хеш-таблицы: закончилась память"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Загружено=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Загружено=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Переформулировано=%d, "
+msgid "Rehash=%u, "
+msgstr "Переформулировано=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Противоречий=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Противоречий=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Поиск неявного правила для «%s».\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Поиск неявного правила для элемента архива «%s».\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Избежание рекурсивного вызова неявного правила.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Слишком длинный образец: «%.*s».\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Слишком длинный образец: «%s%.*s».\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Попытка применения правила с образцом «%.*s».\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Отвержение невозможной зависимости правила «%s».\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Отвержение невозможной неявной зависимости «%s».\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Попытка применения правила зависимости «%s».\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Попытка применения неявной зависимости «%s».\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Обнаружена зависимость «%s» в виде VPATH «%s»\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Поиск правила с промежуточным файлом «%s».\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Не удалось создать временный файл\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (сделан дамп памяти)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (игнорирование)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<встроенное>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Ошибка %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Ожидание завершения заданий…"
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Незавершённый потомок %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (удалённый)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Подбирается неудачно завершившийся  потомок %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Подбирается удачно завершившийся потомок %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Подбирается неудачно завершившийся  потомок %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Подчищаю временный пакетный файл %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Очистка временного пакетного файла %s завершилась с ошибкой (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Удаляется потомок %p PID %s%s из цепочки.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Освобождён токен для потомка %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() не смогла запустить процесс (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -708,93 +718,87 @@ msgstr ""
 "\n"
 "При неудачном запуске сосчитано %d аргументов\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Помещение потомка %p (%s) PID %s%s в цепочку потомков.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Получен токен для потомка %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: цель «%s» не существует"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: обновление цели «%s» из-за: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "эта операционная система не позволяет устанавливать пределы загрузки"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "невозможно установить пределы загрузки: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "закончились файловые дескрипторы: не удалось сделать копию stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "закончились файловые дескрипторы: не удалось сделать копию stdout\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "закончились файловые дескрипторы: не удалось сделать копию stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Не удалось восстановить stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Не удалось восстановить stdout\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Не удалось восстановить stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make нашла завершившегося потомка pid %s, всё ещё ожидает pid %s\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Команда не найдена\n"
-
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Команда не найдена\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Командный процессор не найден"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: вероятно, закончилось место под окружение"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "Переменная $SHELL изменилась (было «%s», теперь «%s»)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Создаётся временный пакетный файл %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -802,7 +806,7 @@ msgstr ""
 "Содержимое файла пакетных заданий:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -811,59 +815,56 @@ msgstr ""
 "Содержимое файла пакетных заданий:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "%s (строка %d) Плохой контекст командного процессора (!unixy && !"
 "batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[ТИП] (--output-sync[=ТИП]) не настроен в данной сборке."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Не удалось открыть глобальную таблицу символов: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Загруженный объект %s не объявлено как совместимый с GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Не удалось загрузить символ %s из %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Пустое имя символа для загрузки: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Загружается символ %s из %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Операция «load» не поддерживается на этой платформе."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Ключи:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Игнорируется для совместимости.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Без условий отрабатывать все цели.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -871,18 +872,18 @@ msgstr ""
 "  -C КАТАЛОГ, --directory=КАТАЛОГ\n"
 "                              Перейти в КАТАЛОГ перед выполнением действий.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          Выводить массу отладочных сообщений.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=ФЛАГИ]             Выводить различные типы отладочной "
 "информации.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -891,13 +892,13 @@ msgstr ""
 "                              Переменные окружения заменяют значения "
 "makefile.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=СТРОКА               Вычислить СТРОКУ как предложение makefile.\n"
+"  -E СТРОКА, --eval=СТРОКА    Вычислить СТРОКУ как предложение makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -905,15 +906,15 @@ msgstr ""
 "  -f ФАЙЛ, --file=ФАЙЛ, --makefile=ФАЙЛ\n"
 "                              Использовать ФАЙЛ в качестве makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Показать эту справку и выйти.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Игнорировать ошибки способов.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -921,7 +922,7 @@ msgstr ""
 "  -I КАТАЛОГ, --include-dir=КАТАЛОГ\n"
 "                              Искать включаемые make-файлы в КАТАЛОГЕ.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -930,14 +931,14 @@ msgstr ""
 "                              если N не указано, число заданий "
 "неограничено.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Продолжать работу, даже если некоторые цели\n"
 "                              не могут быть достигнуты.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -946,7 +947,7 @@ msgstr ""
 "  -l [N], --load-average[=N], --max-load[=N]         Не запускать\n"
 "                               несколько заданий, если загрузка больше N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -954,7 +955,7 @@ msgstr ""
 "  -L, --check-symlink-times   Использовать последнее mtime при выборе между\n"
 "                              символическими ссылками и целью.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -964,7 +965,7 @@ msgstr ""
 "                              Не применять способ на самом деле; просто\n"
 "                              напечатать его.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -974,7 +975,7 @@ msgstr ""
 "                              Считать ФАЙЛ очень старым и не переделывать "
 "его.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -983,12 +984,12 @@ msgstr ""
 "                              Синхронизировать вывод параллельных\n"
 "                              заданий с типом ТИП.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr ""
 "  -p, --print-data-base       Напечатать внутреннюю базу данных make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -997,23 +998,29 @@ msgstr ""
 "                              код завершения показывает, всё ли уже "
 "сделано.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Не использовать встроенные неявные правила.\n"
 
 # Что такое "variable settings"?
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables   Выключить установку встроенных\n"
 "                              значений переменных.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet        Не показывать сами способы.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Показывать способы (отключает режим --"
+"silent).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1021,26 +1028,26 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Отменить ключ -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Установить время доступа целей в текущее,\n"
 "                              а не пересобирать их.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Выводить трассировочную информацию.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               Показать информацию о версии и выйти.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Напечатать текущий каталог.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1048,7 +1055,7 @@ msgstr ""
 "  --no-print-directory        Отменить ключ -w, даже если он был явно "
 "указан.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1056,7 +1063,7 @@ msgstr ""
 "  -W ФАЙЛ, --what-if=ФАЙЛ, --new-file=ФАЙЛ, --assume-new=ФАЙЛ\n"
 "                              Считать ФАЙЛ всегда новым.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1064,26 +1071,27 @@ msgstr ""
 "  --warn-undefined-variables  Выдавать предупреждение при ссылке\n"
 "                              на неопределённую переменную.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "пустая строка недопустима в качестве имени файла"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "задан неизвестный уровень отладки «%s»"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "неизвестный тип output-sync «%s»"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: поймано прерывание или исключение (код = 0x%lx, адрес = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1098,136 +1106,146 @@ msgstr ""
 "Флаги исключения = %lx\n"
 "Адрес исключения = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Нарушение доступа: операция записи по адресу 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Нарушение доступа: операция чтения адреса 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() устанавливает default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell(): поиск в путях устанавливает default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s приостанавливается на 30 секунд..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) завершён. Продолжаем.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "предупреждение: сервер заданий недоступен: используется -j1. Добавьте «+» к "
 "правилу в родительском make."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr ""
-"предупреждение: в суб-Makefile принудительно задан -jN; режим сервера "
-"заданий запрещён"
+"предупреждение: в суб-Makefile принудительно задан -j%d; сброс режима "
+"сервера заданий"
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile из стандартного ввода указан дважды."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (временный файл)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (временный файл)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"предупреждение: в makefile принудительно задан -j%d; сброс режима сервера "
+"заданий"
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Параллельные задания (-j) не поддерживаются на этой платформе."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Возвращается режим одиночного задания (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Символические ссылки не поддерживаются: отменяется ключ -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Обновление make-файлов....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Make-файл «%s», возможно, зациклен, он не будет пересобираться.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Попытка пересобрать make-файл «%s» завершилась неудачно."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Включаемый make-файл «%s» не найден."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Make-файл «%s» не найден"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Невозможно перейти в первоначальный каталог."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Повторное выполнение[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (временный файл)"
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL содержит более одной цели"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Не заданы цели и не найден make-файл"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Нет целей"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Не заданы цели и не найден make-файл"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Обновление целей результата...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr "предупреждение: Неправильный ход часов.  Сборка может быть неполной."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Использование: %s [КЛЮЧ]... [ЦЕЛЬ]...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1236,7 +1254,7 @@ msgstr ""
 "\n"
 "Эта программа собрана для %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1245,32 +1263,32 @@ msgstr ""
 "\n"
 "Эта программа собрана для %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Сообщайте об ошибках по адресу <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "для ключа «%s%s» нужно указать аргументом непустую строку"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "ключ «-%c» должен использоваться с целым положительным аргументом"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sЭта программа собрана для %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sЭта программа собрана для %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1283,7 +1301,7 @@ msgstr ""
 "%sЭто свободное программное обеспечение: вы можете свободно изменять его и\n"
 "%sраспространять. НЕТ НИКАКИХ ГАРАНТИЙ вне пределов, допустимых законом.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1292,7 +1310,7 @@ msgstr ""
 "\n"
 "# База данных Make, напечатана %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1301,346 +1319,382 @@ msgstr ""
 "\n"
 "# Печать базы данных Make завершена %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Неизвестная ошибка %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr ""
 "%s: пользователь %lu (действительный %lu),\n"
 "группа %lu (действительная %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Доступ инициализации"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Доступ пользователя"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Доступ make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Доступ потомка"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Вход в неизвестный каталог\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Выход из неизвестного каталога\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: вход в каталог «%s»\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: выход из каталога «%s»\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: вход в неизвестный каталог\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: выход из неизвестного каталога\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: вход в каталог «%s»\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: выход из каталога «%s»\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "ошибка записи: stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Останов.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[ТИП] (--output-sync[=ТИП]) не настроен в данной сборке."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "создаётся канал заданий"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "делается копия канала заданий"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "инициализация канала сервера заданий"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "внутренняя ошибка: неправильная строка --jobserver-auth «%s»"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Клиент сервера заданий (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "конвейер сервера заданий"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "запись сервера заданий"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "сервер заданий выключен"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect из канала заданий"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "чтение канала заданий"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Чтение make-файлов...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Чтение make-файла «%s»"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (нет цели по умолчанию)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (путь поиска)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (игнорировать ошибки)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (не раскрывать символ `~') "
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Пропуск UTF-8 BOM в make-файле «%s»\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Пропуск UTF-8 BOM в буфере make-файла\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "неверный синтаксис в условном выражении"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: не удалось загрузить"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "обнаружен способ до первого определения цели"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "перед способом отсутствует правило"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "пропущен разделитель (возможно нужен TAB вместо восьми пробелов?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "пропущен разделитель"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "пропущен образец цели"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "несколько образцов цели"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "образец цели не содержит «%%»"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "отсутствует «endif»"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "пустое имя переменной"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "излишний текст после директивы «define»"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "отсутствует «endif», незавершённая «define»"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "излишний текст после директивы «endef»"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "Излишний текст после директивы «%s»"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "излишняя «%s»"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "в условном выражении возможна только одна «else»"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Неправильный формат задания переменной цели"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "в способах не могут задаваться зависимости"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "для групповых целей должен предоставляться способ"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "смешаны неявные правила и правила со статическими образцами"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "смешаны неявные и обычные правила"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "цель «%s» не соответствует образцу целей"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "целевой файл «%s» имеет вхождения и с :, и с ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "цель «%s» указана несколько раз в одном правиле"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "предупреждение: переопределение способа для цели «%s»"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "предупреждение: старый способ для цели «%s» игнорируются"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** смешаны неявные и обычные правила: устаревший синтаксис"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "предупреждение: переопределение членства группы для цели «%s»"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "предупреждение: встречен символ NUL; игнорируется до конца строки"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Цель «%s» не требует выполнения команд."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "«%s» не требует обновления."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Обрезается файл «%s».\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sНет правила для сборки цели «%s», требуемой для «%s»%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sНет правила для сборки цели «%s»%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Обработка целевого файла «%s».\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Предыдущая попытка обновить файл «%s» завершилась неудачно.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Файл «%s» уже был обработан.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Файл «%s» обновляется в данный момент.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Обновление файла «%s» завершено.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Файл «%s» не существует.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1648,147 +1702,147 @@ msgstr ""
 "*** Предупреждение: у файла «%s» параметр LOW_RESOLUTION_TIME содержит метку "
 "времени с высокой точностью"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Найдено неявное правило для «%s».\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Не найдено неявного правила для «%s».\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Использование способа по умолчанию для «%s».\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Циклическая зависимость %s <- %s пропущена."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Обновление целей, от которых зависит целевой файл «%s», завершено.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Цели, от которых зависит «%s», в настоящий момент собираются.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Аварийный останов на целевом файле «%s».\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Цель «%s» не была пересобрана из-за ошибок."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Зависимость «%s» для цели «%s» зависит от порядка.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Зависимость «%s» цели «%s» не существует.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Зависимость «%s» новее, чем цель «%s».\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Зависимость «%s» старее, чем цель «%s».\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Цель «%s» объявлена с двумя двоеточиями и не имеет зависимостей.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Способ для «%s» не задан, и начальные условия не изменены.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Пересборка «%s» из-за установленного флага always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Нет необходимости пересобирать цель «%s»"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; используется VPATH-имя «%s»"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Необходимо пересобрать цель «%s».\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Игнорируется VPATH-имя «%s».\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "В настоящее время применяется способ «%s».\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Не удалось пересоздать файл цели «%s».\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Целевой файл «%s» успешно пересоздан.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Целевой файл «%s» требует пересоздания с ключом -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Использование команд по умолчанию для «%s».\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Предупреждение: время изменения файла «%s» находится в будущем"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Предупреждение: время изменения файла «%s» находится в будущем (%s)"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "Элемент .LIBPATTERNS «%s» не является образцом"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Не экспортируемые настройки: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1796,7 +1850,7 @@ msgstr ""
 "\n"
 "# Неявные правила"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1804,181 +1858,177 @@ msgstr ""
 "\n"
 "# Неявных правил нет."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# Неявных правил: %u, терминальных: %u"
+"# Неявных правил: %u, терминальных: %u (%.1f%%)"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " терминал."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "ОШИБКА: неверное значение num_pattern_rules! %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "неизвестный сигнал"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Обрыв терминальной линии"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Прерывание"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Аварийное прерывание"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Недопустимая инструкция"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Прерывание на контрольной точке"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Прервано"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Ошибка IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Ошибка эмуляции"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Ошибка операции с плавающей точкой"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Уничтожение"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Неверное обращение к памяти"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Нарушение прав доступа к памяти"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Неправильный системный вызов"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Обрыв канала"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Сигнал по таймеру"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Завершение"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Определяемый пользователем сигнал 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Определяемый пользователем сигнал 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Потомок завершил работу"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Отказ питания"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Останов"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Останов (ввод с терминала) "
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Останов (вывод на терминал)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Останов (сигнал)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Превышен предел процессорного времени"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Превышен предел размера файла"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Виртуальное время истекло"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Время профилирования истекло"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Окно изменено"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Возобновление"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Условия экстренного ввода/вывода"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "Возможен ввод/вывод"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Ресурс потерян"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Сигнал опасности"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Запрос информации"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Сопроцессор с плавающей точкой недоступен"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1987,7 +2037,7 @@ msgstr ""
 "\n"
 "%s без буферов strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1998,21 +2048,21 @@ msgstr ""
 "%s буферы strcache: %lu (%lu) / строк = %lu / хранилище = %lu Б / сред = %lu "
 "Б\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "%s текущий buf: размер = %hu Б / используется = %hu Б / кол-во = %hu / сред "
-"= %hu Б\n"
+"= %u Б\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr ""
 "%s для другого используется: всего = %lu Б / кол-во = %lu / сред = %lu Б\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
@@ -2020,7 +2070,7 @@ msgstr ""
 "%s для другого свободно: всего = %lu Б / макс. = %lu Б / мин. = %lu Б / "
 "сред. = %hu Б\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2029,7 +2079,7 @@ msgstr ""
 "\n"
 "%s производительность strcache: поисков = %lu / найдено = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2037,44 +2087,44 @@ msgstr ""
 "# состояние хеш-таблицы:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "автоматическая"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "по умолчанию"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "определена в среде"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "make-файл"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "окружение с -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "определена в командной строке"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "Директива «override»"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (из «%s», строка %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# состояние переменных в хеш-таблице:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2082,7 +2132,7 @@ msgstr ""
 "\n"
 "# Переменные\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2090,7 +2140,7 @@ msgstr ""
 "\n"
 "# Значения переменных особенные для маски"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2098,7 +2148,7 @@ msgstr ""
 "\n"
 "# Нет значений переменных особенных для маски."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2107,49 +2157,49 @@ msgstr ""
 "\n"
 "# %u значений переменных особенных для маски"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "предупреждение: неопределённая переменная «%.*s»"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() вернула код ошибки %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-предупреждение, возможно вам потребуется повторно разрешить\n"
 "обработку CTRL-Y из DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "ВСТРОЕННЫЙ CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Стандартный вывод добавлен в %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Добавить %.*s и очистить\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Вместо заданного выполняется %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2157,11 +2207,11 @@ msgstr ""
 "\n"
 "# Пути поиска VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Не определён путь поиска «vpath»."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2170,7 +2220,7 @@ msgstr ""
 "\n"
 "# %u путей поиска по «vpath»\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2178,7 +2228,7 @@ msgstr ""
 "\n"
 "# Не определён общий (переменная «VPATH») путь поиска."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2188,17 +2238,17 @@ msgstr ""
 "# Общий (переменная «VPATH») путь поиска:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Количество слотов сервера заданий ограничено %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "создание семафора сервера заданий: (ошибка %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
@@ -2206,21 +2256,45 @@ msgstr ""
 "внутренняя ошибка: не удалось открыть семафор сервера заданий «%s»: (ошибка "
 "%ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Клиент сервера заданий (семафор %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "освобождение семафора сервера заданий: (ошибка %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "ожидание семафора или процесса-потомка: (ошибка %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Команда не найдена\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Команда не найдена\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Командный процессор не найден"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s приостанавливается на 30 секунд..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) завершён. Продолжаем.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Неизвестная ошибка %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Предупреждение: время изменения файла «%s» находится в будущем"
+
+#~ msgid " terminal."
+#~ msgstr " терминал."
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: ошибка выполнения рецепта для цели «%s»"
 
diff --git a/po/sr.gmo b/po/sr.gmo
new file mode 100644 (file)
index 0000000..42ba5ef
Binary files /dev/null and b/po/sr.gmo differ
diff --git a/po/sr.po b/po/sr.po
new file mode 100644 (file)
index 0000000..2ec9769
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,2274 @@
+# Serbian translation for make.
+# Copyright (C) 2016 Free Software Foundation, Inc.
+# This file is distributed under the same license as the make package.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: make-4.2.1\n"
+"Report-Msgid-Bugs-To: bug-make@gnu.org\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2016-12-17 12:09+0200\n"
+"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
+"Language-Team: Serbian <(nothing)>\n"
+"Language: sr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: src/ar.c:46
+#, c-format
+msgid "attempt to use unsupported feature: '%s'"
+msgstr "покушавам да користим неподржану функцију: „%s“"
+
+#: src/ar.c:123
+#, c-format
+msgid "touch archive member is not available on VMS"
+msgstr "члан архиве додирника није доступан на ВМС-у"
+
+#: src/ar.c:147
+#, c-format
+msgid "touch: Archive '%s' does not exist"
+msgstr "touch: Архива „%s“ не постоји"
+
+#: src/ar.c:150
+#, c-format
+msgid "touch: '%s' is not a valid archive"
+msgstr "touch: „%s“ није исправна архива"
+
+#: src/ar.c:157
+#, c-format
+msgid "touch: Member '%s' does not exist in '%s'"
+msgstr "touch: Члан „%s“ не постоји у „%s“"
+
+#: src/ar.c:164
+#, c-format
+msgid "touch: Bad return code from ar_member_touch on '%s'"
+msgstr "touch: Лош повратни код из „ar_member_touch“ на „%s“"
+
+#: src/arscan.c:130
+#, c-format
+msgid "lbr$set_module() failed to extract module info, status = %d"
+msgstr ""
+"Функција „lbr$set_module()“ није успела да извуче податке модула, стање = %d"
+
+#: src/arscan.c:236
+#, c-format
+msgid "lbr$ini_control() failed with status = %d"
+msgstr "Функција „lbr$ini_control()“ није успела са стањем = %d"
+
+#: src/arscan.c:261
+#, c-format
+msgid "unable to open library '%s' to lookup member status %d"
+msgstr "не могу да отворим библиотеку „%s“ да потражим стање члана %d"
+
+#: src/arscan.c:944
+#, c-format
+msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
+msgstr "Члан „%s“%s: %ld бајта при %ld (%ld).\n"
+
+#: src/arscan.c:945
+msgid " (name might be truncated)"
+msgstr " (назив је можда скраћен)"
+
+#: src/arscan.c:947
+#, c-format
+msgid "  Date %s"
+msgstr "  Датум %s"
+
+#: src/arscan.c:948
+#, c-format
+msgid "  uid = %d, gid = %d, mode = 0%o.\n"
+msgstr "  уид = %d, гид = %d, режим = 0%o.\n"
+
+#: src/commands.c:403
+#, c-format
+msgid "Recipe has too many lines (%ud)"
+msgstr "Рецепт има превише редова (%ud)"
+
+#: src/commands.c:504
+msgid "*** Break.\n"
+msgstr "*** Прекид.\n"
+
+#: src/commands.c:628
+#, c-format
+msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
+msgstr "*** [%s] Члан архиве „%s“ је можда лажан; није обрисан"
+
+#: src/commands.c:632
+#, c-format
+msgid "*** Archive member '%s' may be bogus; not deleted"
+msgstr "*** Члан архиве „%s“ је можда лажан; није обрисан"
+
+#: src/commands.c:646
+#, c-format
+msgid "*** [%s] Deleting file '%s'"
+msgstr "*** [%s] Бришем датотеку „%s“"
+
+#: src/commands.c:648
+#, c-format
+msgid "*** Deleting file '%s'"
+msgstr "*** Бришем датотеку „%s“"
+
+#: src/commands.c:684
+msgid "#  recipe to execute"
+msgstr "#  рецепт за извршавање"
+
+#: src/commands.c:687
+msgid " (built-in):"
+msgstr " (уграђено):"
+
+#: src/commands.c:689
+#, c-format
+msgid " (from '%s', line %lu):\n"
+msgstr " (од „%s“, %lu. ред):\n"
+
+#: src/dir.c:1073
+msgid ""
+"\n"
+"# Directories\n"
+msgstr ""
+"\n"
+"# Директоријуми\n"
+
+#: src/dir.c:1085
+#, c-format
+msgid "# %s: could not be stat'd.\n"
+msgstr "# %s: не могу да добавим податке.\n"
+
+#: src/dir.c:1089
+msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
+msgstr "# %s (кључ „%s“, м-време %I64u): не могу да отворим.\n"
+
+#: src/dir.c:1094
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
+msgstr "# %s (уређај %d, и-чвор [%d,%d,%d]): не могу да отворим.\n"
+
+#: src/dir.c:1099
+#, c-format
+msgid "# %s (device %ld, inode %ld): could not be opened.\n"
+msgstr "# %s (уређај %ld, и-чвор %ld): не могу да отворим.\n"
+
+#: src/dir.c:1126
+msgid "# %s (key %s, mtime %I64u): "
+msgstr "# %s (кључ „%s“, м-време %I64u): "
+
+#: src/dir.c:1131
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): "
+msgstr "# %s (уређај %d, и-чвор [%d,%d,%d]): "
+
+#: src/dir.c:1136
+#, c-format
+msgid "# %s (device %ld, inode %ld): "
+msgstr "# %s (уређај %ld, и-чвор %ld): "
+
+#: src/dir.c:1142 src/dir.c:1163
+msgid "No"
+msgstr "Не"
+
+#: src/dir.c:1145 src/dir.c:1166
+msgid " files, "
+msgstr " датотеке, "
+
+#: src/dir.c:1147 src/dir.c:1168
+msgid "no"
+msgstr "не"
+
+#: src/dir.c:1150
+msgid " impossibilities"
+msgstr " немогућности"
+
+#: src/dir.c:1154
+msgid " so far."
+msgstr " за сада."
+
+#: src/dir.c:1171
+#, c-format
+msgid " impossibilities in %lu directories.\n"
+msgstr " немогућности у %lu директоријума.\n"
+
+#: src/expand.c:125
+#, c-format
+msgid "Recursive variable '%s' references itself (eventually)"
+msgstr "Дубинска променљива „%s“ упућује на себе (евентуално)"
+
+#: src/expand.c:271
+#, c-format
+msgid "unterminated variable reference"
+msgstr "недовршена упута променљиве"
+
+#: src/file.c:278
+#, c-format
+msgid "Recipe was specified for file '%s' at %s:%lu,"
+msgstr "Рецепт је наведен за датотеку „%s“ у %s:%lu,"
+
+#: src/file.c:283
+#, c-format
+msgid "Recipe for file '%s' was found by implicit rule search,"
+msgstr "Нашао сам рецепт за датотеку „%s“ изричитом претрагом правила,"
+
+#: src/file.c:287
+#, c-format
+msgid "but '%s' is now considered the same file as '%s'."
+msgstr "али се „%s“ сада сматра истом датотеком као „%s“."
+
+#: src/file.c:290
+#, c-format
+msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
+msgstr "Рецепат за „%s“ биће замењен у корист једног за „%s“."
+
+#: src/file.c:310
+#, c-format
+msgid "can't rename single-colon '%s' to double-colon '%s'"
+msgstr "не могу да преименујем једну двотачку „%s“ у две двотачке „%s“"
+
+#: src/file.c:316
+#, c-format
+msgid "can't rename double-colon '%s' to single-colon '%s'"
+msgstr "не могу да преименујем две двотачке „%s“ у једну двотачку „%s“"
+
+#: src/file.c:408
+#, c-format
+msgid "*** Deleting intermediate file '%s'"
+msgstr "*** Бришем посредничку датотеку „%s“"
+
+#: src/file.c:412
+#, c-format
+msgid "Removing intermediate files...\n"
+msgstr "Уклањам посредничке датотеке...\n"
+
+#: src/file.c:872
+msgid "Current time"
+msgstr "Тренутно време"
+
+#: src/file.c:876
+#, c-format
+msgid "%s: Timestamp out of range; substituting %s"
+msgstr "%s: Временска ознака је ван опсега; замењујем „%s“"
+
+#: src/file.c:1016
+msgid "# Not a target:"
+msgstr "# Није мета:"
+
+#: src/file.c:1021
+msgid "#  Precious file (prerequisite of .PRECIOUS)."
+msgstr "#  Драгоцена датотека (предуслов од „.PRECIOUS“)."
+
+#: src/file.c:1023
+msgid "#  Phony target (prerequisite of .PHONY)."
+msgstr "#  Лажна мета (предуслов од „.PHONY“)."
+
+#: src/file.c:1025
+msgid "#  Command line target."
+msgstr "#  Мета линије наредби."
+
+#: src/file.c:1027
+msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
+msgstr "#  Основно, „MAKEFILES“, или „-include/sinclude makefile“."
+
+#: src/file.c:1029
+msgid "#  Builtin rule"
+msgstr "#  Правило изградње"
+
+#: src/file.c:1031
+msgid "#  Implicit rule search has been done."
+msgstr "#  Претрага по изричитом правилу је обављена."
+
+#: src/file.c:1032
+msgid "#  Implicit rule search has not been done."
+msgstr "#  Претрага по изричитом правилу није обављена."
+
+#: src/file.c:1034
+#, c-format
+msgid "#  Implicit/static pattern stem: '%s'\n"
+msgstr "#  Изричити/статички корен шаблона: '%s'\n"
+
+#: src/file.c:1036
+msgid "#  File is an intermediate prerequisite."
+msgstr "#  Датотека је прелазни предуслов."
+
+#: src/file.c:1040
+msgid "#  Also makes:"
+msgstr "#  Такође твори:"
+
+#: src/file.c:1046
+msgid "#  Modification time never checked."
+msgstr "#  Време измене није никада проверено."
+
+#: src/file.c:1048
+msgid "#  File does not exist."
+msgstr "#  Датотека не постоји."
+
+#: src/file.c:1050
+msgid "#  File is very old."
+msgstr "#  Датотека је превише стара."
+
+#: src/file.c:1055
+#, c-format
+msgid "#  Last modified %s\n"
+msgstr "#  Последња измена „%s“\n"
+
+#: src/file.c:1058
+msgid "#  File has been updated."
+msgstr "#  Датотека је освежена."
+
+#: src/file.c:1058
+msgid "#  File has not been updated."
+msgstr "#  Датотека није освежена."
+
+#: src/file.c:1062
+msgid "#  Recipe currently running (THIS IS A BUG)."
+msgstr "#  Рецепт тренутно ради (ОВО ЈЕ ГРЕШКА)."
+
+#: src/file.c:1065
+msgid "#  Dependencies recipe running (THIS IS A BUG)."
+msgstr "#  Рецепт зависности ради (ОВО ЈЕ ГРЕШКА)."
+
+#: src/file.c:1074
+msgid "#  Successfully updated."
+msgstr "#  Успешно је освежена."
+
+#: src/file.c:1078
+msgid "#  Needs to be updated (-q is set)."
+msgstr "#  Треба да се освежи („-q“ је подешено)."
+
+#: src/file.c:1081
+msgid "#  Failed to be updated."
+msgstr "#  Није успела да се освежи."
+
+#: src/file.c:1086
+msgid "#  Invalid value in 'command_state' member!"
+msgstr "#  Неисправна вередност у члану „command_state“!"
+
+#: src/file.c:1105
+msgid ""
+"\n"
+"# Files"
+msgstr ""
+"\n"
+"# Датотеке"
+
+#: src/file.c:1109
+msgid ""
+"\n"
+"# files hash-table stats:\n"
+"# "
+msgstr ""
+"\n"
+"# статистика хеш-табеле датотека:\n"
+"# "
+
+#: src/file.c:1119
+#, c-format
+msgid "%s: Field '%s' not cached: %s"
+msgstr "%s: Поље „%s“ није у остави: %s"
+
+#: src/function.c:794
+msgid "non-numeric first argument to 'word' function"
+msgstr "не-бројевни први аргумент за функцију „word“"
+
+#: src/function.c:799
+#, c-format
+msgid "first argument to 'word' function must be greater than 0"
+msgstr "први аргумент за функцију „word“ мора бити број већи од 0"
+
+#: src/function.c:819
+msgid "non-numeric first argument to 'wordlist' function"
+msgstr "не-бројевни први аргумент за функцију „wordlist“"
+
+#: src/function.c:821
+msgid "non-numeric second argument to 'wordlist' function"
+msgstr "не-бројевни други аргумент за функцију „wordlist“"
+
+#: src/function.c:1533
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
+msgstr "windows32_openpipe: „DuplicateHandle(In)“ није успело (e=%ld)\n"
+
+#: src/function.c:1557
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
+msgstr "windows32_openpipe: „DuplicateHandle(Err)“ није успело (e=%ld)\n"
+
+#: src/function.c:1564
+#, c-format
+msgid "CreatePipe() failed (e=%ld)\n"
+msgstr "„CreatePipe()“ није успело (e=%ld)\n"
+
+#: src/function.c:1572
+#, c-format
+msgid "windows32_openpipe(): process_init_fd() failed\n"
+msgstr "windows32_openpipe(): „process_init_fd()“ није успело\n"
+
+#: src/function.c:1857
+#, c-format
+msgid "Cleaning up temporary batch file %s\n"
+msgstr "Бришем привремену датотеку групе „%s“\n"
+
+#: src/function.c:2230 src/function.c:2255
+#, c-format
+msgid "file: missing filename"
+msgstr "file: недостаје назив датотеке"
+
+#: src/function.c:2234 src/function.c:2265
+#, c-format
+msgid "open: %s: %s"
+msgstr "open: %s: %s"
+
+#: src/function.c:2242
+#, c-format
+msgid "write: %s: %s"
+msgstr "write: %s: %s"
+
+#: src/function.c:2245 src/function.c:2282
+#, c-format
+msgid "close: %s: %s"
+msgstr "close: %s: %s"
+
+#: src/function.c:2258
+#, c-format
+msgid "file: too many arguments"
+msgstr "file: превише аргумената"
+
+#
+#: src/function.c:2277
+#, c-format
+msgid "read: %s: %s"
+msgstr "read: %s: %s"
+
+#: src/function.c:2290
+#, c-format
+msgid "file: invalid file operation: %s"
+msgstr "file: неисправна радња датотеке: %s"
+
+#: src/function.c:2405
+#, c-format
+msgid "insufficient number of arguments (%d) to function '%s'"
+msgstr "недовољан број аргумената (%d) за функцију „%s“"
+
+#: src/function.c:2417
+#, c-format
+msgid "unimplemented on this platform: function '%s'"
+msgstr "није примењено на овој платформи: функција „%s“"
+
+#: src/function.c:2483
+#, c-format
+msgid "unterminated call to function '%s': missing '%c'"
+msgstr "недовршен позив за функцију „%s“: недостаје „%c“"
+
+#: src/function.c:2667
+#, c-format
+msgid "Empty function name"
+msgstr "Празан назив функције"
+
+#: src/function.c:2669
+#, c-format
+msgid "Invalid function name: %s"
+msgstr "Неисправан назив функције: %s"
+
+#: src/function.c:2671
+#, c-format
+msgid "Function name too long: %s"
+msgstr "Назив функције је предуг: %s"
+
+#: src/function.c:2674
+#, c-format
+msgid "Invalid minimum argument count (%u) for function %s"
+msgstr "Неисправан најмањи број аргумената (%u) за функцију „%s“"
+
+#: src/function.c:2677
+#, c-format
+msgid "Invalid maximum argument count (%u) for function %s"
+msgstr "Неисправан највећи број аргумената (%u) за функцију „%s“"
+
+#: src/getopt.c:659
+#, c-format
+msgid "%s: option '%s' is ambiguous\n"
+msgstr "%s: опција „%s“ је нејасна\n"
+
+#: src/getopt.c:683
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: опција „--%s“ не дозвољава аргумент\n"
+
+#: src/getopt.c:688
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: опција „%c%s“ не дозвољава аргумент\n"
+
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
+msgid "%s: option '%s' requires an argument\n"
+msgstr "%s: опција „%s“ захтева аргумент\n"
+
+#: src/getopt.c:734
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: непозната опција „--%s“\n"
+
+#: src/getopt.c:738
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: непозната опција „%c%s“\n"
+
+#: src/getopt.c:764
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: неисправна опција -- %c\n"
+
+#: src/getopt.c:767
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s: неисправна опција -- %c\n"
+
+#: src/getopt.c:797 src/getopt.c:927
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: опција захтева аргумент -- %c\n"
+
+#: src/getopt.c:844
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: опција „-W %s“ је нејасна\n"
+
+#: src/getopt.c:862
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: опција „-W %s“ не дозвољава аргумент\n"
+
+#: src/guile.c:58
+#, c-format
+msgid "guile: Expanding '%s'\n"
+msgstr "guile: Проширујем „%s“\n"
+
+#: src/guile.c:74
+#, c-format
+msgid "guile: Evaluating '%s'\n"
+msgstr "guile: Процењујем „%s“\n"
+
+#: src/hash.c:50
+#, c-format
+msgid "can't allocate %lu bytes for hash table: memory exhausted"
+msgstr "не могу да доделим %lu бајта за хеш табелу: меморија је потрошена"
+
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Учитавам=%ld/%ld=%.0f%%, "
+
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
+msgstr "Поново хеширам=%d, "
+
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Сукоби=%ld/%ld=%.0f%%"
+
+#: src/implicit.c:38
+#, c-format
+msgid "Looking for an implicit rule for '%s'.\n"
+msgstr "Тражим изричито правило за „%s“.\n"
+
+#: src/implicit.c:54
+#, c-format
+msgid "Looking for archive-member implicit rule for '%s'.\n"
+msgstr "Тражим изричито правило члана архиве за „%s“.\n"
+
+#: src/implicit.c:311
+#, c-format
+msgid "Avoiding implicit rule recursion.\n"
+msgstr "Избегавам дубачење изричитог правила.\n"
+
+#: src/implicit.c:484
+#, fuzzy, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Корен је предуг: „%.*s“.\n"
+
+#: src/implicit.c:490
+#, c-format
+msgid "Trying pattern rule with stem '%.*s'.\n"
+msgstr "Пробам правило шаблона са кореном „%.*s“.\n"
+
+#: src/implicit.c:717
+#, c-format
+msgid "Rejecting impossible rule prerequisite '%s'.\n"
+msgstr "Одбацујем немогућ предуслов правила „%s“.\n"
+
+#: src/implicit.c:718
+#, c-format
+msgid "Rejecting impossible implicit prerequisite '%s'.\n"
+msgstr "Одбацујем немогућ изричити предуслов „%s“.\n"
+
+#: src/implicit.c:732
+#, c-format
+msgid "Trying rule prerequisite '%s'.\n"
+msgstr "Покушавам са предусловом правила „%s“.\n"
+
+#: src/implicit.c:733
+#, c-format
+msgid "Trying implicit prerequisite '%s'.\n"
+msgstr "Покушавам изричити предуслов „%s“.\n"
+
+#: src/implicit.c:772
+#, c-format
+msgid "Found prerequisite '%s' as VPATH '%s'\n"
+msgstr "Нађох предуслов „%s“ као „VPATH“ „%s“\n"
+
+#: src/implicit.c:786
+#, c-format
+msgid "Looking for a rule with intermediate file '%s'.\n"
+msgstr "Тражим правило са средњом датотеком „%s“.\n"
+
+#: src/job.c:370
+msgid "Cannot create a temporary file\n"
+msgstr "Не могу да направим привремену датотеку\n"
+
+#: src/job.c:548
+msgid " (core dumped)"
+msgstr " (језгрени избачај)"
+
+#: src/job.c:553
+msgid " (ignored)"
+msgstr " (занемарено)"
+
+#: src/job.c:557 src/job.c:1892
+msgid "<builtin>"
+msgstr "<уграђено>"
+
+#: src/job.c:573
+#, c-format
+msgid "%s[%s: %s] Error %d%s"
+msgstr "%s[%s: %s] грешка %d%s"
+
+#: src/job.c:662
+#, c-format
+msgid "*** Waiting for unfinished jobs...."
+msgstr "*** Чекам на недовршене послове...."
+
+#: src/job.c:704
+#, c-format
+msgid "Live child %p (%s) PID %s %s\n"
+msgstr "Активан подпроцес „%p“ (%s) ПИД %s %s\n"
+
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
+msgid " (remote)"
+msgstr " (удаљено)"
+
+#: src/job.c:898
+#, c-format
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "Почистио сам успели подпроцес „%p“ ПИД %s %s\n"
+
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Почистио сам неуспели подпроцес „%p“ ПИД %s %s\n"
+
+#: src/job.c:950
+#, c-format
+msgid "Cleaning up temp batch file %s\n"
+msgstr "Бришем привремену датотеку групе „%s“\n"
+
+#: src/job.c:956
+#, c-format
+msgid "Cleaning up temp batch file %s failed (%d)\n"
+msgstr "Нисам успео да обришем привремену датотеку групе „%s“ (%d)\n"
+
+#: src/job.c:1071
+#, c-format
+msgid "Removing child %p PID %s%s from chain.\n"
+msgstr "Уклањам подпроцес „%p“ ПИД %s%s из ланца.\n"
+
+#: src/job.c:1120
+#, c-format
+msgid "Released token for child %p (%s).\n"
+msgstr "Отпуштен прстен за подпроцес „%p“ (%s).\n"
+
+#: src/job.c:1575 src/job.c:2487
+#, c-format
+msgid "process_easy() failed to launch process (e=%ld)\n"
+msgstr "Функција „process_easy()“ није успела да покрене процес (e=%ld)\n"
+
+#: src/job.c:1579 src/job.c:2491
+#, c-format
+msgid ""
+"\n"
+"Counted %d args in failed launch\n"
+msgstr ""
+"\n"
+"Избројах %d аргумента у неуспелом покретању\n"
+
+#: src/job.c:1642
+#, c-format
+msgid "Putting child %p (%s) PID %s%s on the chain.\n"
+msgstr "Стављам подпроцес „%p“ (%s) ПИД %s%s у ланац.\n"
+
+#: src/job.c:1875
+#, c-format
+msgid "Obtained token for child %p (%s).\n"
+msgstr "Добијен прстен за подпроцес „%p“ (%s).\n"
+
+#: src/job.c:1902
+#, c-format
+msgid "%s: target '%s' does not exist"
+msgstr "%s: мета „%s“ не постоји"
+
+#: src/job.c:1905
+#, c-format
+msgid "%s: update target '%s' due to: %s"
+msgstr "%s: освежавам мету „%s“ услед: %s"
+
+#: src/job.c:2108
+#, c-format
+msgid "cannot enforce load limits on this operating system"
+msgstr "не могу да спроведем ограничења оптерећења на овом оперативном систему"
+
+#: src/job.c:2110
+msgid "cannot enforce load limit: "
+msgstr "не могу да спроведем ограничење оптерећења: "
+
+#: src/job.c:2200
+#, c-format
+msgid "no more file handles: could not duplicate stdin\n"
+msgstr "нема више ручки датотеке: не могу да удвостручим стандардни улаз\n"
+
+#: src/job.c:2212
+#, c-format
+msgid "no more file handles: could not duplicate stdout\n"
+msgstr "нема више ручки датотеке: не могу да удвостручим стандардни излаз\n"
+
+#: src/job.c:2226
+#, c-format
+msgid "no more file handles: could not duplicate stderr\n"
+msgstr "нема више ручки датотеке: не могу да удвостручим стандардну грешку\n"
+
+#: src/job.c:2241
+#, c-format
+msgid "Could not restore stdin\n"
+msgstr "Не могу да повратим стандардни улаз\n"
+
+#: src/job.c:2249
+#, c-format
+msgid "Could not restore stdout\n"
+msgstr "Не могу да повратим стандардни излаз\n"
+
+#: src/job.c:2257
+#, c-format
+msgid "Could not restore stderr\n"
+msgstr "Не могу да повратим стандардну грешку\n"
+
+#: src/job.c:2520
+#, c-format
+msgid "make reaped child pid %s, still waiting for pid %s\n"
+msgstr "мејк је почистио подпроцес са пид-ом %s, још увек чекам на пид %s\n"
+
+#: src/job.c:2623
+#, c-format
+msgid "spawnvpe: environment space might be exhausted"
+msgstr "spawnvpe: можда је потрошен простор окружења"
+
+#: src/job.c:2862
+#, c-format
+msgid "$SHELL changed (was '%s', now '%s')\n"
+msgstr "„$SHELL“ је промењена (беше „%s“, сада је „%s“)\n"
+
+#: src/job.c:3300 src/job.c:3485
+#, c-format
+msgid "Creating temporary batch file %s\n"
+msgstr "Правим привремену датотеку групе „%s“\n"
+
+#: src/job.c:3308
+#, c-format
+msgid ""
+"Batch file contents:\n"
+"\t@echo off\n"
+msgstr ""
+"Садржај датотеке групе:\n"
+"\t@echo off\n"
+
+#: src/job.c:3497
+#, c-format
+msgid ""
+"Batch file contents:%s\n"
+"\t%s\n"
+msgstr ""
+"Садржај датотеке групе:%s\n"
+"\t%s\n"
+
+#: src/job.c:3605
+#, c-format
+msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
+msgstr "%s (%d. ред) Лош контекст шкољке (!unixy && !batch_mode_shell)\n"
+
+#: src/load.c:60
+#, c-format
+msgid "Failed to open global symbol table: %s"
+msgstr "Нисам успео да отворим општу табелу симбола: %s"
+
+#: src/load.c:97
+#, c-format
+msgid "Loaded object %s is not declared to be GPL compatible"
+msgstr "Учитани објекат „%s“ није проглашен да је сагласан са ОЈЛ-ом"
+
+#: src/load.c:104
+#, c-format
+msgid "Failed to load symbol %s from %s: %s"
+msgstr "Нисам успео да учитам симбол „%s“ из „%s“: %s"
+
+#: src/load.c:149
+#, c-format
+msgid "Empty symbol name for load: %s"
+msgstr "Празан назив симбола за учитано: „%s“"
+
+#: src/load.c:204
+#, c-format
+msgid "Loading symbol %s from %s\n"
+msgstr "Учитавам симбол „%s“ из „%s“\n"
+
+#: src/load.c:256
+#, c-format
+msgid "The 'load' operation is not supported on this platform."
+msgstr "Радња „load“ није подржана на овој платформи."
+
+#: src/main.c:335
+msgid "Options:\n"
+msgstr "Опције:\n"
+
+#: src/main.c:336
+msgid "  -b, -m                      Ignored for compatibility.\n"
+msgstr "  -b, -m                      Занемарено зарад сагласности.\n"
+
+#: src/main.c:338
+msgid "  -B, --always-make           Unconditionally make all targets.\n"
+msgstr "  -B, --always-make           Безусловно одрађује све мете.\n"
+
+#: src/main.c:340
+msgid ""
+"  -C DIRECTORY, --directory=DIRECTORY\n"
+"                              Change to DIRECTORY before doing anything.\n"
+msgstr ""
+"  -C ДИР, --directory=ДИР\n"
+"                              Прелази у ДИРЕКТОРИЈУМ пре него што било шта "
+"уради.\n"
+
+#: src/main.c:343
+msgid "  -d                          Print lots of debugging information.\n"
+msgstr ""
+"  -d                          Исписује доста података за уклањање грешака.\n"
+
+#: src/main.c:345
+msgid ""
+"  --debug[=FLAGS]             Print various types of debugging information.\n"
+msgstr ""
+"  --debug[=ЗАСТАВИЦЕ]         Исписује разне врсте података за уклањање "
+"грешака.\n"
+
+#: src/main.c:347
+msgid ""
+"  -e, --environment-overrides\n"
+"                              Environment variables override makefiles.\n"
+msgstr ""
+"  -e, --environment-overrides\n"
+"                              Променљиве окружења превазилазе "
+"мејк_датотеке.\n"
+
+#: src/main.c:350
+#, fuzzy
+msgid ""
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr ""
+"  --eval=НИСКА                Процењује НИСКУ као изјаву мејк_датотеке.\n"
+
+#: src/main.c:352
+msgid ""
+"  -f FILE, --file=FILE, --makefile=FILE\n"
+"                              Read FILE as a makefile.\n"
+msgstr ""
+"  -f ДТТКА, --file=ДТТКА, --makefile=ДТТКА\n"
+"                              Чита ДАТОТЕКУ као мејк_датотеку.\n"
+
+#: src/main.c:355
+msgid "  -h, --help                  Print this message and exit.\n"
+msgstr "  -h, --help                  Приказује ову помоћ и излази.\n"
+
+#: src/main.c:357
+msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
+msgstr "  -i, --ignore-errors         Занемарује грешке из рецепата.\n"
+
+#: src/main.c:359
+msgid ""
+"  -I DIRECTORY, --include-dir=DIRECTORY\n"
+"                              Search DIRECTORY for included makefiles.\n"
+msgstr ""
+"  -I ДИР, --include-dir=ДИР\n"
+"                              Тражи у ДИРЕКТОРИЈУМУ укључене мејк_датотеке.\n"
+
+#: src/main.c:362
+msgid ""
+"  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
+"arg.\n"
+msgstr ""
+"  -j [Бр.], --jobs[=Бр.]      Допушта БРОЈ посла одједном; бесконачан број "
+"послова без аргумената.\n"
+
+#: src/main.c:364
+msgid ""
+"  -k, --keep-going            Keep going when some targets can't be made.\n"
+msgstr ""
+"  -k, --keep-going            Наставља и даље када неке мете не могу бити "
+"одрађене.\n"
+
+#: src/main.c:366
+msgid ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              Don't start multiple jobs unless load is below "
+"N.\n"
+msgstr ""
+"  -l [Бр.], --load-average[=Бр.], --max-load[=Бр.]\n"
+"                              Не започиње више послова осим ако оптерећење "
+"није испод БРОЈА.\n"
+
+#: src/main.c:369
+msgid ""
+"  -L, --check-symlink-times   Use the latest mtime between symlinks and "
+"target.\n"
+msgstr ""
+"  -L, --check-symlink-times   Користи последње м-време између симболичких "
+"веза и мете.\n"
+
+#: src/main.c:371
+msgid ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              Don't actually run any recipe; just print "
+"them.\n"
+msgstr ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              Не покреће никакав рецепт; само их исписује.\n"
+
+#: src/main.c:374
+msgid ""
+"  -o FILE, --old-file=FILE, --assume-old=FILE\n"
+"                              Consider FILE to be very old and don't remake "
+"it.\n"
+msgstr ""
+"  -o ДТТКА, --old-file=ДТТКА, --assume-old=ДТТКА\n"
+"                              Сматра да је ДАТОТЕКА врло стара и не одрађује "
+"је.\n"
+
+#: src/main.c:377
+msgid ""
+"  -O[TYPE], --output-sync[=TYPE]\n"
+"                              Synchronize output of parallel jobs by TYPE.\n"
+msgstr ""
+"  -O[ВРСТА], --output-sync[=ВРСТА]\n"
+"                              Усаглашава излаз паралелних послова ВРСТОМ.\n"
+
+#: src/main.c:380
+msgid "  -p, --print-data-base       Print make's internal database.\n"
+msgstr ""
+"  -p, --print-data-base       Исписује унутрашњу базу података мејка.\n"
+
+#: src/main.c:382
+msgid ""
+"  -q, --question              Run no recipe; exit status says if up to "
+"date.\n"
+msgstr ""
+"  -q, --question              Не покреће ниједан рецепт; излазно стање "
+"говори да ли је освежен.\n"
+
+#: src/main.c:384
+msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
+msgstr "  -r, --no-builtin-rules      Искључује уграђена изричита правила.\n"
+
+#: src/main.c:386
+msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
+msgstr ""
+"  -R, --no-builtin-variables  Искључује уграђена подешавања променљиве.\n"
+
+#: src/main.c:388
+msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
+msgstr "  -s, --silent, --quiet       Не приказује рецепте.\n"
+
+#: src/main.c:390
+#, fuzzy
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  -q, --question              Не покреће ниједан рецепт; излазно стање "
+"говори да ли је освежен.\n"
+
+#: src/main.c:392
+msgid ""
+"  -S, --no-keep-going, --stop\n"
+"                              Turns off -k.\n"
+msgstr ""
+"  -S, --no-keep-going, --stop\n"
+"                              Искључује „-k“.\n"
+
+#: src/main.c:395
+msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
+msgstr ""
+"  -t, --touch                 Додирује мете уместо да их поново одрађује.\n"
+
+#: src/main.c:397
+msgid "  --trace                     Print tracing information.\n"
+msgstr "  --trace                     Исписује податке о праћењу.\n"
+
+#: src/main.c:399
+msgid ""
+"  -v, --version               Print the version number of make and exit.\n"
+msgstr "  -v, --version               Исписује издање програма и излази.\n"
+
+#: src/main.c:401
+msgid "  -w, --print-directory       Print the current directory.\n"
+msgstr "  -w, --print-directory       Исписује тренутни директоријум.\n"
+
+#: src/main.c:403
+msgid ""
+"  --no-print-directory        Turn off -w, even if it was turned on "
+"implicitly.\n"
+msgstr ""
+"  --no-print-directory        Искључује „-w“, чак и ако је изричито "
+"укључена.\n"
+
+#: src/main.c:405
+msgid ""
+"  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
+"                              Consider FILE to be infinitely new.\n"
+msgstr ""
+"  -W ДТТКА, --what-if=ДТТКА, --new-file=ДТТКА, --assume-new=ДТТКА\n"
+"                              Сматра да је ДАТОТЕКА бесконачно нова.\n"
+
+#: src/main.c:408
+msgid ""
+"  --warn-undefined-variables  Warn when an undefined variable is "
+"referenced.\n"
+msgstr ""
+"  --warn-undefined-variables  Упозорава када се упућује на неодређену "
+"променљиву.\n"
+
+#: src/main.c:671
+#, c-format
+msgid "empty string invalid as file name"
+msgstr "празна ниска је неисправна као назив датотеке"
+
+#: src/main.c:754
+#, c-format
+msgid "unknown debug level specification '%s'"
+msgstr "непозната одредба нивоа прочишћавања „%s“"
+
+#: src/main.c:794
+#, c-format
+msgid "unknown output-sync type '%s'"
+msgstr "непозната врста усклађивања излаза „%s“"
+
+#: src/main.c:849
+#, c-format
+msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
+msgstr "%s: Добих прекид/изузетак (код = 0x%lx, адреса = 0x%p)\n"
+
+#: src/main.c:856
+#, c-format
+msgid ""
+"\n"
+"Unhandled exception filter called from program %s\n"
+"ExceptionCode = %lx\n"
+"ExceptionFlags = %lx\n"
+"ExceptionAddress = 0x%p\n"
+msgstr ""
+"\n"
+"Необрадив филтер изузеткаје позван из програма „%s“\n"
+"Код изузетка = %lx\n"
+"Заставице изузетка = %lx\n"
+"Адреса изузетка = 0x%p\n"
+
+#: src/main.c:864
+#, c-format
+msgid "Access violation: write operation at address 0x%p\n"
+msgstr "Повреда приступа: радња писања на адреси 0x%p\n"
+
+#: src/main.c:865
+#, c-format
+msgid "Access violation: read operation at address 0x%p\n"
+msgstr "Повреда приступа: радња читања на адреси 0x%p\n"
+
+#: src/main.c:941 src/main.c:956
+#, c-format
+msgid "find_and_set_shell() setting default_shell = %s\n"
+msgstr "Функција „нађи_и_подеси_шкољку()“ подешава „основну_шкољку“ = %s\n"
+
+#: src/main.c:1009
+#, c-format
+msgid "find_and_set_shell() path search set default_shell = %s\n"
+msgstr ""
+"Претрага путање „нађи_и_подеси_шкољку()“ подешава „основну_шкољку“ = %s\n"
+
+#: src/main.c:1609
+#, c-format
+msgid ""
+"warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
+msgstr ""
+"упозорење: послужитељ посла није доступан: користим „-j1“.  Додајте + да "
+"родитељ одреди правило."
+
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr ""
+"упозорење: „-jN“ је присиљено у субмејку: искључујем режим послужитеља посла."
+
+#: src/main.c:1781
+#, c-format
+msgid "Makefile from standard input specified twice."
+msgstr "Мејк_датотека са стандардног улаза је наведена два пута."
+
+#: src/main.c:1819 src/vmsjobs.c:1248
+msgid "fopen (temporary file)"
+msgstr "отвори датотеку (привремена датотека)"
+
+#: src/main.c:1825
+msgid "fwrite (temporary file)"
+msgstr "запиши датотеку (привремена датотека)"
+
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"упозорење: „-jN“ је присиљено у субмејку: искључујем режим послужитеља посла."
+
+#: src/main.c:2068
+#, c-format
+msgid "Parallel jobs (-j) are not supported on this platform."
+msgstr "Паралелни послови (-j) нису подржани на овој платформи."
+
+#: src/main.c:2069
+#, c-format
+msgid "Resetting to single job (-j1) mode."
+msgstr "Враћам на режим једног посла (-j1) mode."
+
+#: src/main.c:2109
+#, c-format
+msgid "Symbolic links not supported: disabling -L."
+msgstr "Симболичке везе нису подржане: искључујем „-L“."
+
+#: src/main.c:2190
+#, c-format
+msgid "Updating makefiles....\n"
+msgstr "Освежавам мејк_датотеке...\n"
+
+#: src/main.c:2226
+#, c-format
+msgid "Makefile '%s' might loop; not remaking it.\n"
+msgstr "Мејк_датотека „%s“ се можда понавља; неђу је поново одрадити.\n"
+
+#: src/main.c:2303
+#, c-format
+msgid "Failed to remake makefile '%s'."
+msgstr "Нисам успео поново да одрадим мејк_датотеку „%s“."
+
+#: src/main.c:2323
+#, c-format
+msgid "Included makefile '%s' was not found."
+msgstr "Нисам нашао укључену мејк_датотеку „%s“."
+
+#: src/main.c:2328
+#, c-format
+msgid "Makefile '%s' was not found"
+msgstr "Нисам нашао мејк_датотеку „%s“"
+
+#: src/main.c:2394
+#, c-format
+msgid "Couldn't change back to original directory."
+msgstr "Не могу да се вратим у изворни директоријум."
+
+#: src/main.c:2402
+#, c-format
+msgid "Re-executing[%u]:"
+msgstr "Поново-извршавам[%u]:"
+
+#: src/main.c:2522
+msgid "unlink (temporary file): "
+msgstr "поништавам везу (привремена датотека): "
+
+#: src/main.c:2555
+#, c-format
+msgid ".DEFAULT_GOAL contains more than one target"
+msgstr "„.DEFAULT_GOAL“ садржи више од једне мете"
+
+#: src/main.c:2579
+#, c-format
+msgid "No targets"
+msgstr "Нема мета"
+
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Нису наведене мете и нисам нашао мејк_датотеку"
+
+#: src/main.c:2586
+#, c-format
+msgid "Updating goal targets....\n"
+msgstr "Освежавам циљне мете...\n"
+
+#: src/main.c:2610
+#, c-format
+msgid "warning:  Clock skew detected.  Your build may be incomplete."
+msgstr ""
+"упозорење:  Откривен је проблем са часовником.  Ваша изградња може бити "
+"недовршена."
+
+#: src/main.c:2804
+#, c-format
+msgid "Usage: %s [options] [target] ...\n"
+msgstr "Употреба: %s [опције] [мета] ...\n"
+
+#: src/main.c:2810
+#, c-format
+msgid ""
+"\n"
+"This program built for %s\n"
+msgstr ""
+"\n"
+"Овај програм је изграђен за „%s“\n"
+
+#: src/main.c:2812
+#, c-format
+msgid ""
+"\n"
+"This program built for %s (%s)\n"
+msgstr ""
+"\n"
+"Овај програм је изграђен за „%s“ (%s)\n"
+
+#: src/main.c:2815
+#, c-format
+msgid "Report bugs to <bug-make@gnu.org>\n"
+msgstr "Грешке пријавите на <bug-make@gnu.org>\n"
+
+#: src/main.c:2901
+#, c-format
+msgid "the '%s%s' option requires a non-empty string argument"
+msgstr "Опција „%s%s“ захтева аргумент не-празне ниске"
+
+#: src/main.c:2965
+#, c-format
+msgid "the '-%c' option requires a positive integer argument"
+msgstr "Опција „-%c“ захтева аргумент позитивног целог броја"
+
+#: src/main.c:3363
+#, c-format
+msgid "%sBuilt for %s\n"
+msgstr "%sИзградња за „%s“\n"
+
+#: src/main.c:3365
+#, c-format
+msgid "%sBuilt for %s (%s)\n"
+msgstr "%sИзградња за „%s“(%s)\n"
+
+#: src/main.c:3376
+#, c-format
+msgid ""
+"%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+"html>\n"
+"%sThis is free software: you are free to change and redistribute it.\n"
+"%sThere is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"%sДозвола ОЈЛи3+: Гнуова ОЈЛ 3. издање или новије <http://gnu.org/licenses/"
+"gpl.html>\n"
+"%sОво је слободан софтвер: можете слободно да га мењате и расподељујете.\n"
+"%sНема НИКАКВЕ ГАРАНЦИЈЕ, у скалду са законом.\n"
+
+#: src/main.c:3397
+#, c-format
+msgid ""
+"\n"
+"# Make data base, printed on %s"
+msgstr ""
+"\n"
+"# База података мејка, штампана %s"
+
+#: src/main.c:3407
+#, c-format
+msgid ""
+"\n"
+"# Finished Make data base on %s\n"
+msgstr ""
+"\n"
+"# База података мејка је завршена %s\n"
+
+#: src/misc.c:643
+#, c-format
+msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
+msgstr "%s: корисник „%lu“ (стварни „%lu“), група „%lu“ (стварна „%lu“)\n"
+
+#: src/misc.c:664
+msgid "Initialized access"
+msgstr "Покренут приступ"
+
+#: src/misc.c:743
+msgid "User access"
+msgstr "Приступ корисника"
+
+#: src/misc.c:791
+msgid "Make access"
+msgstr "Приступ мејка"
+
+#: src/misc.c:825
+msgid "Child access"
+msgstr "Приступ подпроцеса"
+
+#: src/output.c:97
+#, c-format
+msgid "%s: Entering an unknown directory\n"
+msgstr "%s: Улазим у непознат директоријум\n"
+
+#: src/output.c:99
+#, c-format
+msgid "%s: Leaving an unknown directory\n"
+msgstr "%s: Напуштам непознат директоријум\n"
+
+#: src/output.c:102
+#, c-format
+msgid "%s: Entering directory '%s'\n"
+msgstr "%s: Улазим у директоријум „%s“\n"
+
+#: src/output.c:104
+#, c-format
+msgid "%s: Leaving directory '%s'\n"
+msgstr "%s: Напуштам директоријум „%s“\n"
+
+#: src/output.c:108
+#, c-format
+msgid "%s[%u]: Entering an unknown directory\n"
+msgstr "%s[%u]: Улазим у непознат директоријум\n"
+
+#: src/output.c:110
+#, c-format
+msgid "%s[%u]: Leaving an unknown directory\n"
+msgstr "%s[%u]: Напуштам непознат директоријум\n"
+
+#: src/output.c:113
+#, c-format
+msgid "%s[%u]: Entering directory '%s'\n"
+msgstr "%s[%u]: Улазим у директоријум „%s“\n"
+
+#: src/output.c:115
+#, c-format
+msgid "%s[%u]: Leaving directory '%s'\n"
+msgstr "%s[%u]: Напуштам директоријум „%s“\n"
+
+#: src/output.c:442 src/output.c:444
+#, c-format
+msgid "write error: stdout"
+msgstr "грешка писања: стандардни излаз"
+
+#: src/output.c:624
+msgid ".  Stop.\n"
+msgstr ".  Стајем.\n"
+
+#: src/output.c:658
+#, c-format
+msgid "%s%s: %s"
+msgstr "%s%s: %s"
+
+#: src/output.c:667
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "„-O[ВРСТА]“ (--output-sync[=ВРСТА]) није подешено за ову изградњу."
+
+#: src/posixos.c:90
+msgid "creating jobs pipe"
+msgstr "стварам спојку посла"
+
+#: src/posixos.c:98 src/posixos.c:251
+msgid "duping jobs pipe"
+msgstr "удвостручавам спојку послова"
+
+#: src/posixos.c:104
+msgid "init jobserver pipe"
+msgstr "почетна спојка послужитеља посла"
+
+#: src/posixos.c:119
+#, c-format
+msgid "internal error: invalid --jobserver-auth string '%s'"
+msgstr "унутрашња грешка: неисправна „--jobserver-auth“ ниска „%s“"
+
+#: src/posixos.c:122
+#, c-format
+msgid "Jobserver client (fds %d,%d)\n"
+msgstr "Клијент послужитеља посла (описници датотека %d,%d)\n"
+
+#: src/posixos.c:138
+msgid "jobserver pipeline"
+msgstr "спојни ред послужитеља посла"
+
+#: src/posixos.c:186
+msgid "write jobserver"
+msgstr "пишем послужитеља посла"
+
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
+msgid "pselect jobs pipe"
+msgstr "п-бира спојку послова"
+
+#: src/posixos.c:319 src/posixos.c:433
+msgid "read jobs pipe"
+msgstr "читам спојку посла"
+
+#: src/read.c:181
+#, c-format
+msgid "Reading makefiles...\n"
+msgstr "Читам мејк_датотеке...\n"
+
+#: src/read.c:336
+#, c-format
+msgid "Reading makefile '%s'"
+msgstr "Читам мејк_датотеку „%s“"
+
+#: src/read.c:338
+#, c-format
+msgid " (no default goal)"
+msgstr " (нема основног циља)"
+
+#: src/read.c:340
+#, c-format
+msgid " (search path)"
+msgstr " (претражујем путању)"
+
+#: src/read.c:342
+#, c-format
+msgid " (don't care)"
+msgstr " (не марим)"
+
+#: src/read.c:344
+#, c-format
+msgid " (no ~ expansion)"
+msgstr " (нема ~ проширења)"
+
+#: src/read.c:655
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile '%s'\n"
+msgstr "Прескачем УТФ-8 БОМ у мејк_датотеци „%s“\n"
+
+#: src/read.c:658
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile buffer\n"
+msgstr "Прескачем УТФ-8 БОМ у међумеморији мејк_датотеке\n"
+
+#: src/read.c:787
+#, c-format
+msgid "invalid syntax in conditional"
+msgstr "неисправна синтакса у услову"
+
+#: src/read.c:960
+#, c-format
+msgid "%s: failed to load"
+msgstr "%s: нисам успео да учитам"
+
+#: src/read.c:986
+#, c-format
+msgid "recipe commences before first target"
+msgstr "рецепт долази пре прве мете"
+
+#: src/read.c:1035
+#, c-format
+msgid "missing rule before recipe"
+msgstr "недостаје правило пре рецепта"
+
+#: src/read.c:1136
+#, c-format
+msgid "missing separator (did you mean TAB instead of 8 spaces?)"
+msgstr "недостаје раздвајач (да ли сте мислили ТАБУЛАТОР уместо 8 размака?)"
+
+#: src/read.c:1138
+#, c-format
+msgid "missing separator"
+msgstr "недостаје раздвојник"
+
+#: src/read.c:1283
+#, c-format
+msgid "missing target pattern"
+msgstr "недостаје шаблон мете"
+
+#: src/read.c:1285
+#, c-format
+msgid "multiple target patterns"
+msgstr "више шаблона мете"
+
+#: src/read.c:1289
+#, c-format
+msgid "target pattern contains no '%%'"
+msgstr "шаблон мете не садржи „%%“"
+
+#: src/read.c:1404
+#, c-format
+msgid "missing 'endif'"
+msgstr "недостаје „endif“"
+
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
+msgid "empty variable name"
+msgstr "празан назив променљиве"
+
+#: src/read.c:1478
+#, c-format
+msgid "extraneous text after 'define' directive"
+msgstr "сувишан текст након директиве „define“"
+
+#: src/read.c:1503
+#, c-format
+msgid "missing 'endef', unterminated 'define'"
+msgstr "недостаје „endef“, неокончано „define“"
+
+#: src/read.c:1531
+#, c-format
+msgid "extraneous text after 'endef' directive"
+msgstr "сувишан текст након директиве „endef“"
+
+#: src/read.c:1603
+#, c-format
+msgid "extraneous text after '%s' directive"
+msgstr "сувишан текст након директиве „%s“"
+
+#: src/read.c:1604
+#, c-format
+msgid "extraneous '%s'"
+msgstr "сувишно „%s“"
+
+#: src/read.c:1632
+#, c-format
+msgid "only one 'else' per conditional"
+msgstr "само једно „else“ по услову"
+
+#: src/read.c:1908
+#, c-format
+msgid "Malformed target-specific variable definition"
+msgstr "Лоша одредница променљиве специфичне мети"
+
+#: src/read.c:1968
+#, c-format
+msgid "prerequisites cannot be defined in recipes"
+msgstr "предуслови се не могу одредити у рецептима"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
+msgid "mixed implicit and static pattern rules"
+msgstr "помешана правила изричитог и статичког шаблона"
+
+#: src/read.c:2052
+#, c-format
+msgid "mixed implicit and normal rules"
+msgstr "помешана изричита и обична правила"
+
+#: src/read.c:2107
+#, c-format
+msgid "target '%s' doesn't match the target pattern"
+msgstr "мета „%s“ не одговара шаблону мете"
+
+#: src/read.c:2122 src/read.c:2168
+#, c-format
+msgid "target file '%s' has both : and :: entries"
+msgstr "датотека мете „%s“ има и : и :: уносе"
+
+#: src/read.c:2128
+#, c-format
+msgid "target '%s' given more than once in the same rule"
+msgstr "мета „%s“ је дата више од једном у истом правилу"
+
+#: src/read.c:2138
+#, c-format
+msgid "warning: overriding recipe for target '%s'"
+msgstr "упозорење: преписујем рецепт за мету „%s“"
+
+#: src/read.c:2141
+#, c-format
+msgid "warning: ignoring old recipe for target '%s'"
+msgstr "упозорење: занемарујем стари рецепт за мету „%s“"
+
+#: src/read.c:2254
+#, c-format
+msgid "*** mixed implicit and normal rules: deprecated syntax"
+msgstr "*** помешана изричита и обична правила: застарела синтакса"
+
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "упозорење: преписујем рецепт за мету „%s“"
+
+#: src/read.c:2636
+#, c-format
+msgid "warning: NUL character seen; rest of line ignored"
+msgstr "упозорење: видех НИШТАВАН знак; остатак реда је занемарен"
+
+#: src/remake.c:226
+#, c-format
+msgid "Nothing to be done for '%s'."
+msgstr "Ништа неће бити урађено за „%s“."
+
+#: src/remake.c:227
+#, c-format
+msgid "'%s' is up to date."
+msgstr "„%s“ је освежено."
+
+#: src/remake.c:323
+#, c-format
+msgid "Pruning file '%s'.\n"
+msgstr "Чистим датотеку „%s“.\n"
+
+#: src/remake.c:389
+#, c-format
+msgid "%sNo rule to make target '%s', needed by '%s'%s"
+msgstr "%sНема правила за одрађивање мете „%s“, треба га „%s“%s"
+
+#: src/remake.c:399
+#, c-format
+msgid "%sNo rule to make target '%s'%s"
+msgstr "%sНема правила за одрађивање мете „%s“%s"
+
+#: src/remake.c:425
+#, c-format
+msgid "Considering target file '%s'.\n"
+msgstr "Разматрам датотеку мете „%s“.\n"
+
+#: src/remake.c:432
+#, c-format
+msgid "Recently tried and failed to update file '%s'.\n"
+msgstr "Недавно сам покушао и нисам успео да освежим датотеку „%s“.\n"
+
+#: src/remake.c:444
+#, c-format
+msgid "File '%s' was considered already.\n"
+msgstr "Датотека „%s“ је већ разматрана.\n"
+
+#: src/remake.c:454
+#, c-format
+msgid "Still updating file '%s'.\n"
+msgstr "Још увек освежавам датотеку „%s“.\n"
+
+#: src/remake.c:457
+#, c-format
+msgid "Finished updating file '%s'.\n"
+msgstr "Завршио сам освежавање датотеке „%s“.\n"
+
+#: src/remake.c:486
+#, c-format
+msgid "File '%s' does not exist.\n"
+msgstr "Датотека „%s“ не постоји.\n"
+
+#: src/remake.c:494
+#, c-format
+msgid ""
+"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
+msgstr ""
+"*** Упозорење: „.LOW_RESOLUTION_TIME“ датотека „%s“ има високу резолуцију "
+"временске ознаке"
+
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
+msgid "Found an implicit rule for '%s'.\n"
+msgstr "Нађох изричито правило за „%s“.\n"
+
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
+msgid "No implicit rule found for '%s'.\n"
+msgstr "Нисам нашао изричито правило за „%s“.\n"
+
+#: src/remake.c:515
+#, c-format
+msgid "Using default recipe for '%s'.\n"
+msgstr "Користим основни рецепт за „%s“.\n"
+
+#: src/remake.c:549 src/remake.c:1088
+#, c-format
+msgid "Circular %s <- %s dependency dropped."
+msgstr "Кружна „%s <— %s“ зависност је одбачена."
+
+#: src/remake.c:674
+#, c-format
+msgid "Finished prerequisites of target file '%s'.\n"
+msgstr "Завршио сам предуслове датотеке мете „%s“.\n"
+
+#: src/remake.c:680
+#, c-format
+msgid "The prerequisites of '%s' are being made.\n"
+msgstr "Преудслови од „%s“ су одрађени.\n"
+
+#: src/remake.c:694
+#, c-format
+msgid "Giving up on target file '%s'.\n"
+msgstr "Одустајем над датотеком мете „%s“.\n"
+
+#: src/remake.c:699
+#, c-format
+msgid "Target '%s' not remade because of errors."
+msgstr "Мета „%s“ није поново одрађена због грешака."
+
+#: src/remake.c:751
+#, c-format
+msgid "Prerequisite '%s' is order-only for target '%s'.\n"
+msgstr "Предуслов „%s“ је само по поретку за мету „%s“.\n"
+
+#: src/remake.c:756
+#, c-format
+msgid "Prerequisite '%s' of target '%s' does not exist.\n"
+msgstr "Преудслов „%s“ мете „%s“ не постоји.\n"
+
+#: src/remake.c:761
+#, c-format
+msgid "Prerequisite '%s' is newer than target '%s'.\n"
+msgstr "Предуслов „%s“ је новији од мете „%s“.\n"
+
+#: src/remake.c:764
+#, c-format
+msgid "Prerequisite '%s' is older than target '%s'.\n"
+msgstr "Предуслов „%s“ је старији од мете „%s“.\n"
+
+#: src/remake.c:782
+#, c-format
+msgid "Target '%s' is double-colon and has no prerequisites.\n"
+msgstr "Мета „%s“ је двострука двотачка и нема предуслове.\n"
+
+#: src/remake.c:789
+#, c-format
+msgid "No recipe for '%s' and no prerequisites actually changed.\n"
+msgstr "Нема рецепта за „%s“ и никакви предуслови заправо нису мењани.\n"
+
+#: src/remake.c:794
+#, c-format
+msgid "Making '%s' due to always-make flag.\n"
+msgstr "Одрађујем „%s“ због заставице увек-одради.\n"
+
+#: src/remake.c:802
+#, c-format
+msgid "No need to remake target '%s'"
+msgstr "Нема потребе за поновнм одрађивањем мете „%s“"
+
+#: src/remake.c:804
+#, c-format
+msgid "; using VPATH name '%s'"
+msgstr "; користим „VPATH“ назив „%s“"
+
+#: src/remake.c:824
+#, c-format
+msgid "Must remake target '%s'.\n"
+msgstr "Морам поново да одрадим мету „%s“.\n"
+
+#: src/remake.c:830
+#, c-format
+msgid "  Ignoring VPATH name '%s'.\n"
+msgstr "  Занемарујем „VPATH“ назив „%s“.\n"
+
+#: src/remake.c:839
+#, c-format
+msgid "Recipe of '%s' is being run.\n"
+msgstr "Рецепт од „%s“ је покренут.\n"
+
+#: src/remake.c:846
+#, c-format
+msgid "Failed to remake target file '%s'.\n"
+msgstr "Нисам успео поново да одрадим датотеку мете „%s“.\n"
+
+#: src/remake.c:849
+#, c-format
+msgid "Successfully remade target file '%s'.\n"
+msgstr "Успешно сам одрадио датотеку мете „%s“.\n"
+
+#: src/remake.c:852
+#, c-format
+msgid "Target file '%s' needs to be remade under -q.\n"
+msgstr "Датотека мете „%s“ треба поново да се одради под „-q“.\n"
+
+#: src/remake.c:1047
+#, c-format
+msgid "Using default commands for '%s'.\n"
+msgstr "Користим основне наредбе за „%s“.\n"
+
+#: src/remake.c:1422
+#, c-format
+msgid "Warning: File '%s' has modification time %s s in the future"
+msgstr "Упозорење: Датотека „%s“ има време измене %s сек. у будућности"
+
+#: src/remake.c:1662
+#, c-format
+msgid ".LIBPATTERNS element '%s' is not a pattern"
+msgstr "„.LIBPATTERNS“ елемент „%s“ није шаблон"
+
+#: src/remote-cstms.c:122
+#, c-format
+msgid "Customs won't export: %s\n"
+msgstr "Прилагођени неће извести: %s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
+msgid ""
+"\n"
+"# Implicit Rules"
+msgstr ""
+"\n"
+"# Изричита правила"
+
+#: src/rule.c:545
+msgid ""
+"\n"
+"# No implicit rules."
+msgstr ""
+"\n"
+"# Нема изричитих правила."
+
+#: src/rule.c:548
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# %u implicit rules, %u (%.1f%%) terminal."
+msgstr ""
+"\n"
+"# %u изричита правила, %u"
+
+#: src/rule.c:557
+#, c-format
+msgid "BUG: num_pattern_rules is wrong!  %u != %u"
+msgstr "ГРЕШКА: број_правила_шаблона је погрешан!  %u != %u"
+
+#: src/signame.c:84
+msgid "unknown signal"
+msgstr "непознати сигнал"
+
+#: src/signame.c:92
+msgid "Hangup"
+msgstr "Обустави"
+
+#: src/signame.c:95
+msgid "Interrupt"
+msgstr "Прекини"
+
+#: src/signame.c:98
+msgid "Quit"
+msgstr "Изађи"
+
+#: src/signame.c:101
+msgid "Illegal Instruction"
+msgstr "Неисправна инструкција"
+
+#: src/signame.c:104
+msgid "Trace/breakpoint trap"
+msgstr "Замка праћења/тачке прекида"
+
+#: src/signame.c:109
+msgid "Aborted"
+msgstr "Прекинуто"
+
+#: src/signame.c:112
+msgid "IOT trap"
+msgstr "ИОТ замка"
+
+#: src/signame.c:115
+msgid "EMT trap"
+msgstr "ЕМТ замка"
+
+#: src/signame.c:118
+msgid "Floating point exception"
+msgstr "Изузетак покретног зареза"
+
+#: src/signame.c:121
+msgid "Killed"
+msgstr "Убијен"
+
+#: src/signame.c:124
+msgid "Bus error"
+msgstr "Грешка сабирнице"
+
+#: src/signame.c:127
+msgid "Segmentation fault"
+msgstr "Грешка сегментације"
+
+#: src/signame.c:130
+msgid "Bad system call"
+msgstr "Лош системски позив"
+
+#: src/signame.c:133
+msgid "Broken pipe"
+msgstr "Оштећена спојка"
+
+#: src/signame.c:136
+msgid "Alarm clock"
+msgstr "Будилник"
+
+#: src/signame.c:139
+msgid "Terminated"
+msgstr "Окончан"
+
+#: src/signame.c:142
+msgid "User defined signal 1"
+msgstr "Кориснички одређени сигнал 1"
+
+#: src/signame.c:145
+msgid "User defined signal 2"
+msgstr "Кориснички одређени сигнал 2"
+
+#: src/signame.c:150 src/signame.c:153
+msgid "Child exited"
+msgstr "Потпроцес је напуштен"
+
+#: src/signame.c:156
+msgid "Power failure"
+msgstr "Неуспех напајања"
+
+#: src/signame.c:159
+msgid "Stopped"
+msgstr "Заустављен"
+
+#: src/signame.c:162
+msgid "Stopped (tty input)"
+msgstr "Заустављен (улаз конзоле)"
+
+#: src/signame.c:165
+msgid "Stopped (tty output)"
+msgstr "Заустављен (излаз конзоле)"
+
+#: src/signame.c:168
+msgid "Stopped (signal)"
+msgstr "Заустављен (сигнал)"
+
+#: src/signame.c:171
+msgid "CPU time limit exceeded"
+msgstr "Прекорачено је временско ограничење процесора"
+
+#: src/signame.c:174
+msgid "File size limit exceeded"
+msgstr "Прекорачено је ограничење величине датотеке"
+
+#: src/signame.c:177
+msgid "Virtual timer expired"
+msgstr "Виртуелни одбројавач је истекао"
+
+#: src/signame.c:180
+msgid "Profiling timer expired"
+msgstr "Одбројавач профилисања је истекао"
+
+#: src/signame.c:186
+msgid "Window changed"
+msgstr "Прозор је измењен"
+
+#: src/signame.c:189
+msgid "Continued"
+msgstr "Настављен"
+
+#: src/signame.c:192
+msgid "Urgent I/O condition"
+msgstr "Хитни У/И услов"
+
+#: src/signame.c:199 src/signame.c:208
+msgid "I/O possible"
+msgstr "I/O је могућ"
+
+#: src/signame.c:202
+msgid "SIGWIND"
+msgstr "СИГВИНД"
+
+#: src/signame.c:205
+msgid "SIGPHONE"
+msgstr "СИГФОН"
+
+#: src/signame.c:211
+msgid "Resource lost"
+msgstr "Губитак изворишта"
+
+#: src/signame.c:214
+msgid "Danger signal"
+msgstr "Опасан сигнал"
+
+#: src/signame.c:217
+msgid "Information request"
+msgstr "Захтев за информацијама"
+
+#: src/signame.c:220
+msgid "Floating point co-processor not available"
+msgstr "Ко-процесор покретног зареза није доступан"
+
+#: src/strcache.c:274
+#, c-format
+msgid ""
+"\n"
+"%s No strcache buffers\n"
+msgstr ""
+"\n"
+"%s Нема међумеморија причуваних ниски\n"
+
+#: src/strcache.c:304
+#, c-format
+msgid ""
+"\n"
+"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
+"B\n"
+msgstr ""
+"\n"
+"%s међумеморије причуваних ниски: %lu (%lu) / ниске = %lu / смештај = %lu "
+"B / просек = %lu B\n"
+
+#: src/strcache.c:308
+#, fuzzy, c-format
+msgid ""
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr ""
+"%s текућа међумеморија: величина = %hu B / коришћено = %hu B / број = %hu / "
+"просек = %hu B\n"
+
+#: src/strcache.c:319
+#, c-format
+msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
+msgstr "%s осталих коришћених: укупно = %lu B / број = %lu / просек = %lu B\n"
+
+#: src/strcache.c:322
+#, c-format
+msgid ""
+"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
+msgstr ""
+"%s осталих слободних: укупно = %lu B / највише = %lu B / најмање = %lu B / "
+"просек = %hu B\n"
+
+#: src/strcache.c:326
+#, c-format
+msgid ""
+"\n"
+"%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
+msgstr ""
+"\n"
+"%s учинковитост причуваних ниски: тражења = %lu / просек погодака = %lu%%\n"
+
+#: src/strcache.c:328
+msgid ""
+"# hash-table stats:\n"
+"# "
+msgstr ""
+"# статистика хеш-табеле:\n"
+"# "
+
+#: src/variable.c:1653
+msgid "automatic"
+msgstr "аутоматски"
+
+#: src/variable.c:1656
+msgid "default"
+msgstr "основно"
+
+#: src/variable.c:1659
+msgid "environment"
+msgstr "окружење"
+
+#: src/variable.c:1662
+msgid "makefile"
+msgstr "мејк_датотека"
+
+#: src/variable.c:1665
+msgid "environment under -e"
+msgstr "окружење под „-e“"
+
+#: src/variable.c:1668
+msgid "command line"
+msgstr "линија наредби"
+
+#: src/variable.c:1671
+msgid "'override' directive"
+msgstr "директива „override“"
+
+#: src/variable.c:1682
+#, c-format
+msgid " (from '%s', line %lu)"
+msgstr " (од „%s“, %lu. ред)"
+
+#: src/variable.c:1745
+msgid "# variable set hash-table stats:\n"
+msgstr "# променљива подешава статистику хеш табеле:\n"
+
+#: src/variable.c:1756
+msgid ""
+"\n"
+"# Variables\n"
+msgstr ""
+"\n"
+"# Променљиве\n"
+
+#: src/variable.c:1760
+msgid ""
+"\n"
+"# Pattern-specific Variable Values"
+msgstr ""
+"\n"
+"# Вредности променљиве према шаблону"
+
+#: src/variable.c:1774
+msgid ""
+"\n"
+"# No pattern-specific variable values."
+msgstr ""
+"\n"
+"# Нема вредности променљиве према шаблону."
+
+#: src/variable.c:1776
+#, c-format
+msgid ""
+"\n"
+"# %u pattern-specific variable values"
+msgstr ""
+"\n"
+"# %u вредности променљиве према шаблону"
+
+#: src/variable.h:229
+#, c-format
+msgid "warning: undefined variable '%.*s'"
+msgstr "упозорење: неодређена променљива „%.*s“"
+
+#: src/vmsfunctions.c:91
+#, c-format
+msgid "sys$search() failed with %d\n"
+msgstr "Функција „sys$search()“ није успела са %d\n"
+
+#: src/vmsjobs.c:244
+#, c-format
+msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
+msgstr "-упозорење, мораћете поново да укључите „КТРЛ-Y“ руковање из ДЦЛ-а.\n"
+
+#: src/vmsjobs.c:681
+#, c-format
+msgid "BUILTIN CD %s\n"
+msgstr "ЦД ИЗГРАДЊЕ „%s“\n"
+
+#: src/vmsjobs.c:1224
+#, c-format
+msgid "DCL: %s\n"
+msgstr "ДЦЛ: %s\n"
+
+#: src/vmsjobs.c:1284
+#, c-format
+msgid "Append output to %s\n"
+msgstr "Придодајем излаз на „%s“\n"
+
+#: src/vmsjobs.c:1309
+#, c-format
+msgid "Append %.*s and cleanup\n"
+msgstr "Придодајем „%.*s“ и чистим\n"
+
+#: src/vmsjobs.c:1322
+#, c-format
+msgid "Executing %s instead\n"
+msgstr "Уместо тога извршавам „%s“\n"
+
+#: src/vpath.c:603
+msgid ""
+"\n"
+"# VPATH Search Paths\n"
+msgstr ""
+"\n"
+"# „VPATH“ путање претраге\n"
+
+#: src/vpath.c:620
+msgid "# No 'vpath' search paths."
+msgstr "# Нема „vpath“ путања претраге."
+
+#: src/vpath.c:622
+#, c-format
+msgid ""
+"\n"
+"# %u 'vpath' search paths.\n"
+msgstr ""
+"\n"
+"# %u „vpath“ путање претраге.\n"
+
+#: src/vpath.c:625
+msgid ""
+"\n"
+"# No general ('VPATH' variable) search path."
+msgstr ""
+"\n"
+"# Нема опште (променљиве „VPATH“) путање претраге."
+
+#: src/vpath.c:631
+msgid ""
+"\n"
+"# General ('VPATH' variable) search path:\n"
+"# "
+msgstr ""
+"\n"
+"# Општа (променљиве „VPATH“) путања претраге:\n"
+"# "
+
+#: src/w32/w32os.c:44
+#, c-format
+msgid "Jobserver slots limited to %d\n"
+msgstr "Подножја послужитеља посла су ограничена на %d\n"
+
+#: src/w32/w32os.c:60
+#, c-format
+msgid "creating jobserver semaphore: (Error %ld: %s)"
+msgstr "правим семафор послужитеља посла: (грешка %ld: %s)"
+
+#: src/w32/w32os.c:79
+#, c-format
+msgid ""
+"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
+msgstr ""
+"унутрашња грешка: не могу да отворим семафор послужитеља посла „%s“: (грешка "
+"%ld: %s)"
+
+#: src/w32/w32os.c:82
+#, c-format
+msgid "Jobserver client (semaphore %s)\n"
+msgstr "Клијент послужитеља посла (семафор „%s“)\n"
+
+#: src/w32/w32os.c:123
+#, c-format
+msgid "release jobserver semaphore: (Error %ld: %s)"
+msgstr "отпуштам семафор послужитеља посла: (грешка %ld: %s)"
+
+#: src/w32/w32os.c:194
+#, c-format
+msgid "semaphore or child process wait: (Error %ld: %s)"
+msgstr "семафор или процес подпроцеса чека: (грешка %ld: %s)"
+
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Нема такве наредбе\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Нема такве наредбе\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Нисам нашао програм шкољке"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "„%s“ је обустављен за 30 секунде..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "обављено је „спавај(30)“. Настављам.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Непозната грешка %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Упозорење: Датотека „%s“ има време измене у будућности"
+
+#~ msgid " terminal."
+#~ msgstr " терминал."
index 883a38e0e492528cb35b1bc78d4a174b9c6d288c..c85b0685b49f848b0d167c847c7a935c50a2e973 100644 (file)
Binary files a/po/sv.gmo and b/po/sv.gmo differ
index 0ef7fe2df0486986229c53a26718b403d9b17680..a08eb491240797a71ba30c0d6cc0b50b7988a8d3 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
 # Swedish messages translation of make
-# Copyright © 2002, 2007, 2011, 2013, 2014, 2016 Free Software Foundation, Inc.
+# Copyright © 2002, 2007, 2011, 2013, 2014, 2016, 2019, 2020 Free Software Foundation, Inc.
 # This file is distributed under the same license as the make package.
 #
 # Tomas Gradin <tg@df.lth.se>, 1996-2002.
 # Christer Andersson <klamm@comhem.se>, 2007.
-# Göran Uddeborg <goeran@uddeborg.se>, 2011, 2013, 2014, 2016.
+# Göran Uddeborg <goeran@uddeborg.se>, 2011, 2013, 2014, 2016, 2019, 2020.
 #
-# $Id: make.po,v 1.21 2016-05-22 22:46:49+02 göran Exp $
+# $Id: make.po,v 1.27 2020-01-06 16:22:49+01 göran Exp $
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-22 22:45+0200\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-06 16:19+0100\n"
 "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "försök att använda en funktion som inte stöds: ”%s”"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "att nudda en arkivmedlem är inte tillgängligt i VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "nudda: Arkivet ”%s” finns inte"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "nudda: ”%s” är inte något giltigt arkiv"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "nudda: medlemmen ”%s” finns inte i ”%s”"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "nudda: Felaktig returkod från ar_member_touch på ”%s”"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "lbr$set_module() misslyckades med att extrahera modulinformation, status = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() misslyckades och gav status = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "kan inte öppna biblioteket ”%s” för att slå upp medlemsstatus %d"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Medlem ”%s”%s: %ld byte vid %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (namnet kan vara avkortat)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Datum %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, flaggor = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Receptet har för många rader (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Avbrott.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Arkivmedlemmen ”%s” kan vara felaktig; ej borttagen"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Arkivmedlemmen ”%s” kan vara felaktig; ej borttagen"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Tar bort filen ”%s”"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Tar bort filen ”%s”"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  recept att utföra"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (inbyggd):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (från ”%s”, rad %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -134,221 +136,221 @@ msgstr ""
 "\n"
 "# Kataloger\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: kunde inte ta status.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (nyckel %s, mtid %ull): kunde inte öppnas.\n"
+msgstr "# %s (nyckel %s, mtid %I64u): kunde inte öppnas.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (enhet %d, inod [%d,%d,%d]): kunde inte öppnas.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (enhet %ld, inod %ld): kunde inte öppnas.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (nyckel %s, mtid %ull): "
+msgstr "# %s (nyckel %s, mtid %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (enhet %d, inod [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (enhet %ld, inod %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Inga"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " filer, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "inga"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " omöjligheter"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " hittills."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " omöjligheter i %lu kataloger.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Den rekursiva variabeln ”%s” hänvisar till sig själv (så småningom)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "oavslutad variabelreferens"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Recept angavs för filen ”%s” på %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Recept för filen ”%s” hittades genom sökning efter implicit regel,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "men ”%s” anses nu vara samma fil som ”%s”."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 "Kommer att bortse från recept för ”%s” till förmån för det som gäller ”%s”."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "kan inte ändra namn från enkelkolon ”%s” till dubbelkolon ”%s”"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "kan inte ändra namn från dubbelkolon ”%s” till enkelkolon ”%s”"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Tar bort mellanfilen ”%s”"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Tar bort mellanfiler …\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Nuvarande tid"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Tidsvärde utanför gränser; ersätter med %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Inte ett mål:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Värdefull fil (nödvändig för .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Låtsasmål (nödvändig för .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Kommandoradsmål."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr ""
 "#  En standardmakefil, eller enligt MAKEFILES, eller en -include/sinclude-"
 "makefil."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Inbyggd regel"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Implicit regelsökning har genomförts."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Implicit regelsökning har inte genomförts."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Implicit/statisk mönsterstam: ”%s”\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Filen är ett övergående beroende."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Skapar också:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Ändringstiden har inte kontrollerats."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Filen finns inte."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Filen är mycket gammal."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Senast ändrad %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Filen har uppdaterats."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Filen har inte uppdaterats."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Recept körs just nu (DETTA ÄR ETT FEL)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Beroenderecept körs (DETTA ÄR ETT FEL)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Uppdateringen lyckades."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Behöver uppdateras (-q har angivits)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Uppdateringen misslyckades."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Ogiltigt värde i medlemmen ”command_state”!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -356,7 +358,7 @@ msgstr ""
 "\n"
 "# Filer"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -366,332 +368,340 @@ msgstr ""
 "# statistik för filhashtabell:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Fältet ”%s” cachas inte: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "icke-numeriskt första argument till funktionen ”word”"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "det första argumentet till funktionen ”word” måste vara större än 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "icke-numeriskt första argument till funktionen ”wordlist”"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "icke-numeriskt andra argument till funktionen ”wordlist”"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) misslyckades (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Fel) misslyckades (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() misslyckades (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() misslyckades\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Städar bort tillfällig satsfil %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file: filnamn saknas"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "öppna: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "skriv: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "stäng: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file: för många argument"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "läs: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "file: felaktig filåtgärd: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "otillräckligt antal argument (%d) till funktionen ”%s”"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "ej implementerat på denna plattform: funktionen ”%s”"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "oavslutat funktionsanrop ”%s”: ”%c” saknas"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Tomt funktionsnamn"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Felaktigt funktionsnamn: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Funktionsnamnet är för långt: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Felaktigt minsta antal argument (%u) till funktionen ”%s”"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Felaktigt största antal argument (%u) till funktionen ”%s”"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: flaggan ”%s” är tvetydig\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: flaggan ”--%s” tar inget argument\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: flaggan ”%c%s” tar inget argument\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: flaggan ”%s” kräver ett argument\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: okänd flagga ”--%s”\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: okänd flagga ”%c%s”\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: otillåten flagga -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: ogiltig flagga -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: flaggan kräver ett argument -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: flaggan ”-W %s” är tvetydig\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: flaggan ”-W %s” tar inget argument\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Expanderar ”%s”\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Evaluerar ”%s”\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "kan inte allokera %lu byte för hashtabell: minnet slut"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Fyllnadsgrad=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Fyllnadsgrad=%lu/%lu=%.0f %%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Omhash=%d, "
+msgid "Rehash=%u, "
+msgstr "Omhash=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Kollisioner=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Kollisioner=%lu/%lu=%.0f %%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Letar efter en implicit regel för ”%s”.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Letar efter en implicit regel för arkivmedlemmen ”%s”.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Undviker rekursion orsakad av implicit regel.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Stammen är för lång: ”%.*s”.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Stammen är för lång: ”%s%.*s”.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Prövar mönsterregel med stammen ”%.*s”.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Avvisar den omöjliga regelförutsättningen ”%s”.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Avvisar den omöjliga implicita förutsättningen ”%s”.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Prövar det regelförutsättningen ”%s”.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Prövar den implicita förutsättningen ”%s”.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Hittade förutsättningen ”%s” som VPATH ”%s”\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Letar efter en regel med mellanfilen ”%s”.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Kan inte skapa en temporärfil\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (minnesdump)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ignoreras)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<inbyggd>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Fel %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Inväntar oavslutade jobb..."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Levande barnprocess %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (fjärr)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Inhöstar misslyckad barnprocess: %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Inhöstar lyckad barnprocess: %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Inhöstar misslyckad barnprocess: %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Städar bort tillfällig satsfil %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Bortstädning av tillfällig satsfil %s misslyckades (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Tar bort barnprocessen %p PID %s%s från kedjan.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Frigjorde symbol för barnprocessen %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() misslyckades med processtart (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -700,93 +710,87 @@ msgstr ""
 "\n"
 "Räknade till %d argument vid misslyckad start\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "För upp barnprocessen %p (%s) PID %s%s på kedjan.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Erhöll symbol för barnprocessen %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: målet ”%s” finns inte"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: uppdatera målet ”%s” på grund av: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "kan inte upprätthålla lastbegränsningar i detta operativsystem"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "kan inte upprätthålla lastbegränsning: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "inga fler filhandtag: kunde inte duplicera standard in\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "inga fler filhandtag: kunde inte duplicera standard ut\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "inga fler filhandtag: kunde inte duplicera standard fel\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Kunde inte återställa standard in\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Kunde inte återställa standard ut\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Kunde inte återställa standard fel\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make inhöstade barn-pid %s, inväntar fortfarande pid %s\n"
 
-#: job.c:2275
+#: src/job.c:2623
 #, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Kommandot hittades inte\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Kommandot hittades inte\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Skalprogrammet hittades inte"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: miljöutrymmet kanske är slut"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL ändrades (var ”%s”, är nu ”%s”)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Skapar tillfällig satsfil %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -794,7 +798,7 @@ msgstr ""
 "Satsfilinnehåll:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -803,57 +807,54 @@ msgstr ""
 "Satsfilinnehåll:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (rad %d) Felaktigt skalsammanhang (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[TYP] (--output-sync[=TYP]) är inte konfigurerat för detta bygge."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Misslyckades att öppna den globala symboltabellen: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Laddat objekt %s är inte deklarerat att vara GPL-kompatibelt"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Misslyckades att ladda symbolen %s från %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Tomt symbolnamn för laddning: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Laddar symbol %s från %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Operationen ”load” stödjs inte på denna plattform."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Flaggor:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ignoreras av kompatibilitetsskäl.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Bygg ovillkorligen alla mål.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -861,19 +862,19 @@ msgstr ""
 "  -C KATALOG, --directory=KATALOG\n"
 "                              Byt katalog till KATALOG innan något görs.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr ""
 "  -d                          Skriv ut massor av felsökningsinformation.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=FLAGGOR]           Skriv ut olika sorters "
 "felsökningsinformation.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -881,12 +882,12 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              Miljövariabler åsidosätter makefiler.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
-msgstr "  --eval=STRÄNG               Evaluera STRÄNG som en makefile-sats.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E STRÄNG, --eval=STRÄNG    Evaluera STRÄNG som en makefile-sats.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -894,15 +895,15 @@ msgstr ""
 "  -f FIL, --file=FIL, --makefile=FIL\n"
 "                              Använd FIL som makefil.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Skriv ut detta meddelande och avsluta.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Ignorera fel från recept.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -910,7 +911,7 @@ msgstr ""
 "  -I KATALOG, --include-dir=KATALOG\n"
 "                              Genomsök KATALOG efter inkluderade makefiler.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -918,13 +919,13 @@ msgstr ""
 "  -j [N], --jobs[=N]          Tillåt N samtidiga jobb; oändligt många om "
 "inget antal anges.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Fortsätt även om vissa mål inte kan skapas.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -934,7 +935,7 @@ msgstr ""
 "                              Påbörja fler jobb endast om lasten understiger "
 "N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -942,7 +943,7 @@ msgstr ""
 "  -L, --check-symlink-times   Använd den senaste av mtiderna för symboliska "
 "länkar eller mål.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -951,7 +952,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Kör inte något recept, skriv bara ut dem.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -961,7 +962,7 @@ msgstr ""
 "                              Betrakta FIL som mycket gammal och återskapa "
 "den inte.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -970,11 +971,11 @@ msgstr ""
 "                              Synkronisera utmatningen av parallella jobb\n"
 "                              enligt TYP.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Skriv ut makes interna databas.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -982,22 +983,27 @@ msgstr ""
 "  -q, --question              Kör inga recept; slutstatus visar om det är "
 "aktuellt.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Inaktivera de inbyggda implicita reglerna.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Inaktivera de inbyggda "
 "variabelinställningarna.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Återge inte recept.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Skriv recept (avaktivera --silent-läge).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1005,26 +1011,26 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Stäng av -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Nydatera mål i stället för att återskapa dem.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Skriv spårningsinformation.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr ""
 "  -v, --version               Skriv ut makes versionsnummer och avsluta.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Skriv ut aktuell katalog.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1032,7 +1038,7 @@ msgstr ""
 "  --no-print-directory        Stäng av -w, även om det är implicit "
 "påslaget.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1040,7 +1046,7 @@ msgstr ""
 "  -W FIL, --what-if=FIL, --new-file=FIL, --assume-new=FIL\n"
 "                              Betrakta FIL som hur ny som helst.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1048,26 +1054,27 @@ msgstr ""
 "  --warn-undefined-variables  Varna vid användning av en odefinierad "
 "variabel.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "en tom sträng är ett ogiltigt filnamn"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "okänd felsökningsnivå ”%s” angiven"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "okänd typ av utmatningssynkronisering ”%s”"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Avbrott/Undantag fångat (kod = 0x%lx, adress = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1082,135 +1089,143 @@ msgstr ""
 "Undantagsflaggor = %lx\n"
 "Undantagsadress = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Åtkomstförseelse: skrivinstruktion på adressen 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Åtkomstförseelse: läsinstruktion på adressen 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() ger default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "sökvägen för find_and_set_shell() gav default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s suspenderas i 30 sekunder..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "färdig med sleep(30). Fortsätter.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "varning: jobbserver otillgänglig: använder -j1. Lägg till ”+” i "
 "föräldraregeln."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "varning: -jN framtvingat i del-make: inaktiverar jobbserverläge."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "varning: -j%d framtvingat i del-make: återställer jobbserverläge."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefil från standard in angavs dubbelt."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (temporärfil)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (temporärfil)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "varning: -j%d framtvingat i makefile: återställer jobbserverläge."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Parallella jobb (-j) stöds inte på denna plattform."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Återställer till enkeljobbsläge (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Symboliska länkar stöds inte: inaktiverar -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Uppdaterar makefiler...\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Makefilen ”%s” kan loopa; återskapas inte.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Misslyckades med att återskapa makefilen ”%s”."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Den inkluderade makefilen ”%s” fanns inte."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Makefilen ”%s” fanns inte"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Kunde inte återgå till ursprungskatalogen."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Utför på nytt[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "avlänka (temporärfil): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL innehåller fler än ett mål"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Inga mål angavs och ingen makefil hittades"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Inga mål"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Inga mål angavs och ingen makefil hittades"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Uppdaterar slutmål...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "varning:  Klockförskjutning upptäckt.  Bygget kan ha blivit ofullständigt."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Användning: %s [flaggor] [mål] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1219,7 +1234,7 @@ msgstr ""
 "\n"
 "Detta program byggdes för %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1228,34 +1243,34 @@ msgstr ""
 "\n"
 "Detta program byggdes för %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Anmäl fel till <bug-make@gnu.org>.\n"
 "Skicka synpunkter på översättningen till <tp-sv@listor.tp-sv.se>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "flaggan ”%s%s” kräver ett strängargument som inte är tomt"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "flaggan ”-%c” kräver ett positivt heltal som argument"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sByggt för %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sByggt för %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1268,7 +1283,7 @@ msgstr ""
 "%sDetta är fri programvara. du får lov att ändra och vidaredistribuera den.\n"
 "%sDet finns INGEN GARANTI, så långt lagen tillåter.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1277,7 +1292,7 @@ msgstr ""
 "\n"
 "# Make-databas, utskriven %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1286,491 +1301,527 @@ msgstr ""
 "\n"
 "# Färdigställde Make-databas %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Okänt fel %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: användare %lu (verklig %lu), grupp %lu (verklig %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Åtkomst inledd"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Användaråtkomst"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Make-åtkomst"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Barnåtkomst"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Går till en okänd katalog\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Lämnar en okänd katalog\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Går till katalogen ”%s”\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Lämnar katalogen ”%s”\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Går till en okänd katalog\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Lämnar en okänd katalog\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Går till katalogen ”%s”\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Lämnar katalogen ”%s”\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "skrivfel: standard ut"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Stannar.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[TYP] (--output-sync[=TYP]) är inte konfigurerat för detta bygge."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "skapar jobbrör"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "duplicerar jobbrör"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "iordningställer rör till jobbserver"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "internt fel: ogiltig sträng --jobserver-auth ”%s”"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Jobbserverklient (fb %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "rör till jobbserver"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "skriver till jobbserver"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "jobbservern stängdes ner"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect jobbrör"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "läser från jobbledning"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Läser makefiler...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Läser makefilen ”%s”"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (inget standardmål)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (sökväg)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (oviktigt)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (ingen ~-expansion)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Hoppar över UTF-8-BOM i makefilen ”%s”\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Hoppar över UTF-8-BOM i makefile-buffert\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "ogiltig syntax i villkorssats"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: misslyckades att ladda"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "recept inleds före första målet"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "regel saknas före recept"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "separator saknas (var avsikten TAB i stället för 8 mellanslag?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "separator saknas"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "målmönster saknas"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "flera målmönster"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "målmönstret innehåller inget ”%%”"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "”endif” saknas"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "tomt variabelnamn"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "överflödig text efter direktivet ”define”"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "”endef” saknas, oavslutad ”define”"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "överflödig text efter direktivet ”endef”"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "överflödig text efter direktivet ”%s”"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "överflödigt ”%s”"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "endast ett ”else” per villkor"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Felformad målberoende variabeldefinition"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "beroenden kan inte definieras i recept"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "grupperade mål måste tillhandahålla ett recept"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "blandade implicita regler och statiska mönsterregler"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "blandade implicita regler och normala regler"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "målet ”%s” motsvarar inte målmönstret"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "målfilen ”%s” har både poster med : och ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "målet ”%s” anges flera gånger i samma regel"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "varning: åsidosätter recept för målet ”%s”"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "varning: ignorerar gammalt recept för målet ”%s”"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** blandade implicita regler och normala regler: föråldrad syntax"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "varning: åsidosätter gruppmedlemskap för målet ”%s”"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "varning: NUL-tecken upptäckt, bortser från resten av raden"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Inget behöver göras för ”%s”."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "”%s” är aktuell."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Beskär filen ”%s”.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sIngen regel för att skapa målet ”%s”, som behövs av ”%s”%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sIngen regel för att skapa målet ”%s”%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Överväger målfilen ”%s”.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Misslyckades nyligen med att uppdatera filen ”%s”.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Filen ”%s” har redan övervägts.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Uppdaterar fortfarande filen ”%s”.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Slutförde uppdaterandet av filen ”%s”.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Filen ”%s” finns inte.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr ""
 "*** Varning: .LOW_RESOLUTION_TIME-filen ”%s” har en högupplöst tidsstämpel"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Hittade en implicit regel för ”%s”.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Hittade ingen implicit regel för ”%s”.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Använder standardrecept för ”%s”.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Det cirkulära beroendet %s <- %s släpptes."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Avslutade förutsättningarna för målfilen ”%s”.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Förutsättningarna för ”%s” skapas.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Ger upp med målfilen ”%s”.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Målet ”%s” återskapades inte på grund av fel."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Förutsättningen ”%s” för målet ”%s” är endast ordning.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Förutsättningen ”%s” för målet ”%s” finns inte.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Förutsättningen ”%s” är nyare än målet ”%s”.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Förutsättningen ”%s” är äldre än målet ”%s”.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Målet ”%s” är dubbelkolon och har inga förutsättningar.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Inget recept för ”%s” och inga förutsättningar har förändrats.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Skapar ”%s” på grund av flaggan always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Inget behov att återskapa målet ”%s”"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; använder VPATH-namnet ”%s”"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Måste återskapa målet ”%s”.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Bortser från VPATH-namnet ”%s”.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Receptet för ”%s” körs.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Misslyckades med att återskapa målfilen ”%s”.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Återskapade målfilen ”%s”.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Målfilen ”%s” behöver återskapas med -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Använder standardkommandon för ”%s”.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Varning: Filen ”%s” har en ändringstid i framtiden"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Varning: Filen ”%s” har en ändringstid %s s i framtiden"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS-elementet ”%s” är inte ett mönster"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Customs kommer inte att exportera %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1778,7 +1829,7 @@ msgstr ""
 "\n"
 "# Implicita regler"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1786,181 +1837,177 @@ msgstr ""
 "\n"
 "# Inga implicita regler."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u implicita regler, %u"
-
-#: rule.c:523
-msgid " terminal."
-msgstr " slutregler."
+"# %u implicita regler, %u (%.1f %%) slutliga."
 
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "FEL: num_pattern_rules är felaktigt!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "okänd signal"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Avringd"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Avbrott"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Avslutad"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Otillåten instruktion"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Spårningsfälla"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Avbruten"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IO-fälla"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Emulatorfälla"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Flyttalsundantag"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Dödad"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Bussfel"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Segmenteringsfel"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Felaktigt systemanrop"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Ledningsbrott"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarmklocka"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Avslutad"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Användarsignal 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Användarsignal 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Barn avslutades"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Strömavbrott"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Stoppades"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Stoppades (tty-läsning)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Stoppades (tty-utskrift)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Stoppades (signal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU-tidsgräns överskreds"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Filstorleksgräns överskreds"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Virtuellt tidur löpte ut"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Profileringstidur löpte ut"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Fönster ändrat"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Fortsatte"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Brådskande I/O-läge"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O-tillfälle"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Miste resurs"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Farosignal"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Informationsbegäran"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Flyttalsprocessor inte tillgänglig"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1969,7 +2016,7 @@ msgstr ""
 "\n"
 "%s Inga strcache-buffertar\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1980,27 +2027,27 @@ msgstr ""
 "%s strcache-buffertar: totalt = %lu (%lu) / strängar = %lu / lagring = %lu "
 "B / snitt = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s aktuell buf: storlek = %hu B / använt = %hu B / antal = %hu / snitt = %hu "
+"%s aktuell buf: storlek = %hu B / använt = %hu B / antal = %hu / snitt = %u "
 "B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s annat använt: totalt = %lu B / antal = %lu / snitt = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s annat ledigt: totalt = %lu B / max = %lu B / min = %lu B / snitt = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2009,7 +2056,7 @@ msgstr ""
 "\n"
 "%s strcache-prestanda: uppslagningar = %lu / träffsäkerhet = %lu %%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2017,44 +2064,44 @@ msgstr ""
 "# statistik för hashtabell:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "automatisk"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "normal"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "miljö"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefil"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "miljö enligt -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "kommandorad"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "”override”-direktiv"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (från ”%s”, rad %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# statistik för variabelmängd-hashtabell:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2062,7 +2109,7 @@ msgstr ""
 "\n"
 "# Variabler\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2070,7 +2117,7 @@ msgstr ""
 "\n"
 "# Mönsterspecifika variabelvärden"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2078,7 +2125,7 @@ msgstr ""
 "\n"
 "# Inga mönsterspecifika variabelvärden."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2087,47 +2134,47 @@ msgstr ""
 "\n"
 "# %u mönsterspecifika variabelvärden"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "varning: odefinierad variabel ”%.*s”"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() misslyckades med %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-varning, CTRL-Y-hantering kanske behöver återställas från DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "INBYGGT CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Lägg till utdata till %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Lägg till %.*s och rensa upp\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Utför %s i stället\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2135,11 +2182,11 @@ msgstr ""
 "\n"
 "# VPATH-sökvägar\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Inga ”vpath”-sökvägar."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2148,7 +2195,7 @@ msgstr ""
 "\n"
 "# %u ”vpath”-sökvägar.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2156,7 +2203,7 @@ msgstr ""
 "\n"
 "# Ingen allmän sökväg (enligt ”VPATH”-variabeln)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2166,33 +2213,33 @@ msgstr ""
 "# Allmän sökväg (enligt ”VPATH”-variabeln):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Jobbserverfack begränsat till %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "skapar jobbserversemafor: (Fel %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr "Internt fel: kan inte öppna jobbserversemaforen ”%s”: (Fel %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Jobbserverklient (semafor %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "släpp jobbserversemafor: (Fel %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "väntan på semafor eller barnprocess: (Fel %ld: %s)"
index 9fa6b2d6f0ebb378f0ae68b0cbd2527b2b6198db..b795bb1e91606449b7c58c8a1f0ead1171bf5d91 100644 (file)
Binary files a/po/tr.gmo and b/po/tr.gmo differ
index 5c648bb859a2a00693277b6edbd6e21769274c1f..648b59b91c32a36ca98c6cc832cfce927e820d07 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: make 3.81\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
 "PO-Revision-Date: 2006-04-23 08:45+0300\n"
 "Last-Translator: Nilgün Belma Bugüner <nilgun@buguner.name.tr>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -14,116 +14,118 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "X-Generator: KBabel 1.9.1\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, fuzzy, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "desteklenmeyen özelliği kullanmaya çalışıyor: `%s'"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "VMS'de işe yaramayan arşiv üyesine dokunup geçiyor"
 
-#: ar.c:147
+#: src/ar.c:147
 #, fuzzy, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "Dokunulup geçildi: Arşiv `%s' yok"
 
-#: ar.c:150
+#: src/ar.c:150
 #, fuzzy, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "Dokunulup geçildi: `%s' geçerli bir arşiv değil"
 
-#: ar.c:157
+#: src/ar.c:157
 #, fuzzy, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "Dokunulup geçildi: Üye `%s', `%s' içinde yok"
 
-#: ar.c:164
+#: src/ar.c:164
 #, fuzzy, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "Dokunulup geçildi: `%s' deki ar_member_touch'dan dönen kod hatalı"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, fuzzy, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module modül bilgisini çıkarırken başarısız oldu, durum = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, fuzzy, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control durum =%d ile başarısız oldu"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, fuzzy, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "`%s' kaynakçası `%s' üyesine bakmak için açılamadı"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, fuzzy, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Üye `%s'%s: %ld bayt  %ld 'de (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr "(isim kırpılmış olmalı)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Tarih %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  Kull-kim = %d, Grup-kim = %d, kip = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr ""
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Bırakıldı.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, fuzzy, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Arşiv üyesi `%s' sahte olabilir; silinmedi"
 
-#: commands.c:631
+#: src/commands.c:632
 #, fuzzy, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Arşiv üyesi `%s' sahte olabilir; silinmedi"
 
-#: commands.c:645
+#: src/commands.c:646
 #, fuzzy, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] `%s' dosyası siliniyor"
 
-#: commands.c:647
+#: src/commands.c:648
 #, fuzzy, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** `%s' dosyası siliniyor"
 
-#: commands.c:683
+#: src/commands.c:684
 #, fuzzy
 msgid "#  recipe to execute"
 msgstr "#  çalıştırma komutları"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (paket içinde):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, fuzzy, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (`%s'den, satır %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -131,228 +133,230 @@ msgstr ""
 "\n"
 "# Dizin\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: durumlanamadı.\n"
 
-#: dir.c:1085
+#: src/dir.c:1089
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
 msgstr "# %s (anahtar (key) %s, değişiklik tarihi (mtime) %d): açılamadı.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (aygıt %d, i-düğüm [%d,%d,%d]): açılamadı.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (aygıt %ld, i-düğüm %ld): açılamadı.\n"
 
-#: dir.c:1122
+#: src/dir.c:1126
 #, fuzzy
 msgid "# %s (key %s, mtime %I64u): "
 msgstr "# %s (anahtar (key) %s, değişiklik tarihi (mtime) %d):"
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (aygıt %d, i-düğüm [%d,%d,%d]):"
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (aygıt %ld, i-düğüm %ld):"
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Hayır"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " dosyaları,"
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "hayır"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr "olanaksızlıklar"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " çok uzak."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " %lu dizinde olanaksızlıklar.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, fuzzy, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Çevrimsel değişken `%s' tekrar kendine bağıntılı (sonuçta)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "sonlandırılmamış değişken bağıntısı"
 
-#: file.c:278
+#: src/file.c:278
 #, fuzzy, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "`%s' dosyası için komutlar %s:%lu de belirtildi,"
 
-#: file.c:283
+#: src/file.c:283
 #, fuzzy, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "`%s' dosyası için komutlar örtük kural aramasında bulundu,"
 
-#: file.c:287
+#: src/file.c:287
 #, fuzzy, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "fakat `%s' şimdi `%s' dosyası ile aynı dosya olarak düşünülmeli."
 
-#: file.c:290
+#: src/file.c:290
 #, fuzzy, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "`%s' dosyası için komutlar `%s' lehine yoksayılmış olacak."
 
-#: file.c:310
+#: src/file.c:310
 #, fuzzy, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "tek-sütun `%s', çift-sütun `%s' olarak yeniden adlandırılamaz"
 
-#: file.c:316
+#: src/file.c:316
 #, fuzzy, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "çift-sütun `%s', tek-sütun `%s' olarak yeniden adlandırılamaz"
 
-#: file.c:408
+#: src/file.c:408
 #, fuzzy, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Aracı dosya `%s' siliniyor"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Aracı dosyalar siliniyor...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Şu an"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Tarih damgası kapsamdışı; yerine %s kullanılıyor"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Bir hedef değil:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Kıymetli dosya (.PRECIOUS  önceden gerekliliği)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Sahte hedef (.PHONY önceden gerekliliği)."
 
-#: file.c:971
+#: src/file.c:1025
 #, fuzzy
 msgid "#  Command line target."
 msgstr "#  Komut-satırı hedefi."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Bir öntanımlı,MAKEFILES veya -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 #, fuzzy
 msgid "#  Builtin rule"
 msgstr ""
 "\n"
 "# Örtük kural yok."
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Örtük kural araştırması yapılmıştı."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Örtük kural araştırması yapılmamıştı."
 
-#: file.c:980
+#: src/file.c:1034
 #, fuzzy, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Örtük/değişmeyen kalıp kökü: `%s'\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr ""
 "#  Orta seviyede önceden gerekli bir dosya (öncelikle gerekli dosyalara "
 "aracılık eden dosya)"
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Oluştursa da:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Değişiklik zamanı hiç kontrol edilmedi."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Dosya yok."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Dosya çok eski."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Son değişiklik tarihi %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Dosya güncelleştirilmişti."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Dosya güncelleştirilmemişti."
 
-#: file.c:1008
+#: src/file.c:1062
 #, fuzzy
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Komutlar şu an işlemlerini sürdürüyor (BU BİR YAZILIM HATASI)."
 
-#: file.c:1011
+#: src/file.c:1065
 #, fuzzy
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr ""
 "#  Bağımlılıkların komutları işlemlerini sürdürüyor (BU BİR YAZILIM HATASI)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#   Tamamen güncellendi."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#   Güncellenmiş olması gerekir (-q verildi)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Güncellenmiş olamadı."
 
-#: file.c:1032
+#: src/file.c:1086
 #, fuzzy
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  `command_state' üyesinde geçersiz değer!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -360,7 +364,7 @@ msgstr ""
 "\n"
 "# Dosyalar"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -370,339 +374,345 @@ msgstr ""
 "# dosyaların hash tablosu durumları:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr ""
 
-#: function.c:790
+#: src/function.c:794
 #, fuzzy
 msgid "non-numeric first argument to 'word' function"
 msgstr "`word' işlevinde sayısal olmayan ilk argüman"
 
-#: function.c:795
-#, fuzzy
+#: src/function.c:799
+#, fuzzy, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "`word' işlevinin ilk argümanı sıfırdan büyük olmalı"
 
-#: function.c:815
+#: src/function.c:819
 #, fuzzy
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "`wordlist' işlevinde sayısal olmayan ilk argüman"
 
-#: function.c:817
+#: src/function.c:821
 #, fuzzy
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "`wordlist' işlevinde sayısal olmayan ikinci argüman"
 
-#: function.c:1525
+#: src/function.c:1533
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "create_child_process: DuplicateHandle(In) başarısız (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, fuzzy, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "create_child_process: DuplicateHandle(Err) başarısız (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() başarısız (e=%ld)\n"
 
-#: function.c:1564
-#, fuzzy
+#: src/function.c:1572
+#, fuzzy, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe (): process_init_fd() başarısız\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Geçici komut-listesi (batch) dosyası %s temizleniyor\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr ""
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, fuzzy, c-format
 msgid "open: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, fuzzy, c-format
 msgid "write: %s: %s"
 msgstr "yazma hatası: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, fuzzy, c-format
 msgid "close: %s: %s"
 msgstr "%s%s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr ""
 
-#: function.c:2262
+#: src/function.c:2277
 #, fuzzy, c-format
 msgid "read: %s: %s"
 msgstr "%s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, fuzzy, c-format
 msgid "file: invalid file operation: %s"
 msgstr "%s: geçersiz seçenek -- %c\n"
 
-#: function.c:2390
+#: src/function.c:2405
 #, fuzzy, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "argüman sayısı (%d) `%s' işlevinde yetersiz"
 
-#: function.c:2402
+#: src/function.c:2417
 #, fuzzy, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "bu platformda gerçekleştirilmemiş: işlev `%s'"
 
-#: function.c:2466
+#: src/function.c:2483
 #, fuzzy, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "`%s' işlemine çağrı sonlandırılmamış: `%c' kayıp"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr ""
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr ""
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr ""
 
-#: function.c:2657
+#: src/function.c:2674
 #, fuzzy, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "argüman sayısı (%d) `%s' işlevinde yetersiz"
 
-#: function.c:2660
+#: src/function.c:2677
 #, fuzzy, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "argüman sayısı (%d) `%s' işlevinde yetersiz"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, fuzzy, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: `%s' seçeneği belirsiz\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, fuzzy, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: `--%s' seçeneği argümansız kullanılır\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, fuzzy, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: seçenek `%c%s' argümansız kullanılır\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, fuzzy, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: `%s' seçeneği bir argümanla kullanılır\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, fuzzy, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: `--%s' seçeneği bilinmiyor\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, fuzzy, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: `%c%s' seçeneği bilinmiyor\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: kuraldışı seçenek -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: geçersiz seçenek -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: seçenek bir argümanla kullanılır -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, fuzzy, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: `-W %s' seçeneği belirsiz\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, fuzzy, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: `-W %s' seçeneği argümansız kullanılır\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr ""
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr ""
 
-#: hash.c:49
+#: src/hash.c:50
 #, fuzzy, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "hash tablosu için %ld bayt ayrılamıyor: bellek tükendi"
 
-#: hash.c:280
-#, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
+#: src/hash.c:280
+#, fuzzy, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
 msgstr "Yük=%ld/%ld=%.0f%%, "
 
-#: hash.c:282
-#, c-format
-msgid "Rehash=%d, "
+#: src/hash.c:282
+#, fuzzy, c-format
+msgid "Rehash=%u, "
 msgstr "Rehash=%d, "
 
-#: hash.c:283
-#, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
+#: src/hash.c:283
+#, fuzzy, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
 msgstr "Çakışmalar=%ld/%ld=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, fuzzy, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "`%s' için bir örtük kural arıyor.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, fuzzy, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "`%s' için arşiv-üyesi örtük kural arıyor.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Örtük kural çevrimi görmezden geliniyor.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
 msgstr ""
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, fuzzy, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "`%.*s' köküyle kalıp kuralı deneniyor.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, fuzzy, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Kural önceden gerekliliği `%s' olanaksız olduğundan reddediliyor.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, fuzzy, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Örtük önceden gereklilik `%s' olanaksız olduğundan reddediliyor.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, fuzzy, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Kural önceden gerekliliği `%s' deneniyor.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, fuzzy, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Örtük önceden gereklilik `%s' deneniyor.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, fuzzy, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Önceden gereklilik `%s' VPATH `%s' olarak bulundu.\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, fuzzy, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Aracı dosya `%s' ile bir kural arıyor.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Bir geçici dosya oluşturulamıyor\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (bellek kopyası - core dosyası - diske yazıldı)"
 
-#: job.c:490
+#: src/job.c:553
 #, fuzzy
 msgid " (ignored)"
 msgstr "[%s] Hata %d (yoksayıldı)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 #, fuzzy
 msgid "<builtin>"
 msgstr " (paket içinde):"
 
-#: job.c:510
+#: src/job.c:573
 #, fuzzy, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "*** [%s] Hata %d"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Bitmemiş işler için bekliyor...."
 
-#: job.c:629
+#: src/job.c:704
 #, fuzzy, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Ast dosya işini sürdürüyor: 0x%08lx (%s) PID %ld %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (karşıdan)"
 
-#: job.c:831
-#, fuzzy, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Kaybeden ast dosya sağlanıyor: 0x%08lx PID %ld %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, fuzzy, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Kazanan ast dosya sağlanıyor: 0x%08lx PID %ld %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, fuzzy, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Kaybeden ast dosya sağlanıyor: 0x%08lx PID %ld %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Geçici komut-listesi dosyası %s temizleniyor\n"
 
-#: job.c:845
+#: src/job.c:956
 #, fuzzy, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Geçici komut-listesi dosyası %s temizleniyor\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, fuzzy, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Ast 0x%08lx PID %ld%s zincirden kaldırılıyor\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, fuzzy, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Ast 0x%08lx (%s) için simge (token) kullanıma sunuldu.\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "Süreci başlatacak process_easy() başarısız oldu (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -711,190 +721,178 @@ msgstr ""
 "\n"
 "Sayılan %d argüman ile başarısız oldu\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, fuzzy, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Ast 0x%08lx (%s) PID %ld%s zincire konuluyor.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, fuzzy, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Ast 0x%08lx (%s) için simge (token) sağlandı.\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, fuzzy, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "Dokunulup geçildi: Arşiv `%s' yok"
 
-#: job.c:1841
+#: src/job.c:1905
 #, fuzzy, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr ""
 "%sHedef `%s' i derlemek için  hiçbir kural yok, `%s' tarafından gereksinim "
 "duyuluyor%s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "işletim sisteminde yük sınırlarına ulaşılamadı "
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "ulaşılamayan yük sınırı: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "başka dosya tutucu yok: standart girdi kopyalanamadı\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "başka dosya tutucu yok: standart çıktı kopyalanamadı\n"
 
-#: job.c:2074
-#, fuzzy
+#: src/job.c:2226
+#, fuzzy, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "başka dosya tutucu yok: standart girdi kopyalanamadı\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Standart girdi eski haline getirilemedi\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Standart çıktı eski haline getirilemedi\n"
 
-#: job.c:2105
-#, fuzzy
+#: src/job.c:2257
+#, fuzzy, c-format
 msgid "Could not restore stderr\n"
 msgstr "Standart girdi eski haline getirilemedi\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, fuzzy, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make %ld pid'li ast süreci kaldırdı ama hala pid %ld için bekliyor\n"
 
-#: job.c:2275
-#, fuzzy, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: Komut bulunamadı"
-
-#: job.c:2277
-#, fuzzy, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s: Komut bulunamadı"
-
-#: job.c:2337
+#: src/job.c:2623
 #, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Kabuk uygulaması bulunamadı"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: ortam alanı tükenmiş olabilir"
 
-#: job.c:2584
+#: src/job.c:2862
 #, fuzzy, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL değişti (`%s' idi, şimdi `%s')\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "%s geçici komut-liste dosyasını oluşturuyor\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
 msgstr ""
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
 "\t%s\n"
 msgstr ""
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (satır %d) kabuk bağlamı hatalı (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr ""
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr ""
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr ""
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr ""
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr ""
 
-#: load.c:256
-#, fuzzy
+#: src/load.c:256
+#, fuzzy, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "Bu platformda paralel işler (-j) desteklenmiyor."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Seçenekler:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Uyumluluk için yoksayıldı.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr ""
 "  -B, --always-make           Tüm hedefler koşulsuz olarak oluşturulur.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr "  -C DİZİN, --directory=DIZIN Birşey yapmadan önce DİZİNe geçilir.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -b, -m                      Bir sürü hata ayıklama bilgisi basar.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=SEÇENEKLER]        Çeşitli türde hata ayıklama bilgileri basar.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
 msgstr ""
 "  -e, --environment-overrides Ortam değişkenleri makefile'ları değiştirir.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -902,16 +900,16 @@ msgstr ""
 "  -f DOSYA, --file=DOSYA, --makefile=DOSYA\n"
 "                              DOSYAyı bir makefile olarak okur.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Bu iletiyi basar ve çıkar.\n"
 
-#: main.c:360
+#: src/main.c:357
 #, fuzzy
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Komutların ürettiği hataları yoksayar.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -919,7 +917,7 @@ msgstr ""
 "  -I DİZİN, --include-dir=DİZİN\n"
 "                              Eklenecek makefile'ları DİZİNde arar.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -927,13 +925,13 @@ msgstr ""
 "  -j [N], --jobs[=N]          Bir defada N işe izin verir; argumansız iş\n"
 "                              sayısı sınırsızdır.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Bazı hedefler yapılmadığında devam eder.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -943,7 +941,7 @@ msgstr ""
 "                              Yük N'den az olmadıkça çoklu işler "
 "başlatılmaz.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -951,7 +949,7 @@ msgstr ""
 "  -L, --check-symlink-times   sembolik bağlarla hedef arasında en son mtime\n"
 "                              kullanılır\n"
 
-#: main.c:374
+#: src/main.c:371
 #, fuzzy
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
@@ -961,7 +959,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Gerçekte komutlar çalıştırılmaz, gösterilir.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -971,17 +969,17 @@ msgstr ""
 "                              DOSYAnın çok eski olduğu varsayılır ve\n"
 "                              yeniden işlem yapılmaz.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
 msgstr ""
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       make'in içsel veritabanını basar.\n"
 
-#: main.c:385
+#: src/main.c:382
 #, fuzzy
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
@@ -989,49 +987,53 @@ msgid ""
 msgstr ""
 "  -q, --question              Komut çalıştırmaz; güncelse çıkışta belirtir\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr ""
 "  -r, --no-builtin-rules      Oluşumiçi örtük kuralları etkisizleştirir.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr ""
 "  -R, --no-builtin-variables  Oluşumiçi değişken ayarlarını etkisizleştirir\n"
 
-#: main.c:391
+#: src/main.c:388
 #, fuzzy
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet     Komutlar işlenirken gösterilmez.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
 msgstr ""
 "  -S, --no-keep-going, --stop Bazı hedefler yapılmadığında devam etmez.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Yeniden derlemek yerine hedeflere bakıp "
 "geçer.\n"
 
-#: main.c:398
+#: src/main.c:397
 #, fuzzy
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  -b, -m                      Bir sürü hata ayıklama bilgisi basar.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               make sürüm numarasını basar ve çıkar.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Kullanılan dizini basar.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1039,7 +1041,7 @@ msgstr ""
 "  --no-print-directory        Dolaylı olarak açılmış olsa bile -w 'yi "
 "kapatır\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1047,7 +1049,7 @@ msgstr ""
 "  -W DOSYA, --what-if=DOSYA, --new-file=DOSYA, --assume-new=DOSYA\n"
 "                              DOSYA sonsuz yeni varsayılır.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1055,26 +1057,27 @@ msgstr ""
 "  --warn-undefined-variables  Atanmamış bir değişkene bağıntı yapıldığında\n"
 "                              uyarır.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "dosyaismi olarak boş dizge geçersiz"
 
-#: main.c:766
+#: src/main.c:754
 #, fuzzy, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "Hata ayıklama düzeyi özelliği `%s' bilinmiyor"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr ""
 
-#: main.c:861
+#: src/main.c:849
 #, fuzzy, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Kesinti/Olağandışı durum saptandı (kod = 0x%lx, adres = 0x%lx)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -1089,136 +1092,143 @@ msgstr ""
 "OlağandışılıkBayrakları = %lx\n"
 "OlağandışılıkAdresi = %lx\n"
 
-#: main.c:876
+#: src/main.c:864
 #, fuzzy, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Erişim uyumsuzluğu: %lx adresinde yazma işlemi\n"
 
-#: main.c:877
+#: src/main.c:865
 #, fuzzy, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Erişim uyumsuzluğu: %lx adresinde okuma işlemi\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, fuzzy, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell default_shell = %s olarak belirliyor\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, fuzzy, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 "find_and_set_shell yol aramasını default_shell = %s olarak belirliyor\n"
 
-#: main.c:1538
-#, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s 30 saniyeliğine askıya alınıyor..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "sleep(30) bitti. Devam ediliyor.\n"
-
-#: main.c:1627
-#, fuzzy
+#: src/main.c:1609
+#, fuzzy, c-format
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "uyarı: iş sunucusu kullanımdışı: -j1 kullanılıyor. Üst make kuralına `+' "
 "ekle."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
+#: src/main.c:1617
+#, fuzzy, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
 msgstr "uyarı: alt derlemede -jN zorlandı: iş sunucusu kipi kapatılıyor."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile standart girdiden iki kez belirtildi."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (geçici dosya)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (geçici dosya)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, fuzzy, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "uyarı: alt derlemede -jN zorlandı: iş sunucusu kipi kapatılıyor."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Bu platformda paralel işler (-j) desteklenmiyor."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Tek iş kipi (-j1) için make'i başlatma konumuna alıyor"
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Sembolik bağlar desteklenmiyor: -L iptal ediliyor"
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "makefile'ları güncelliyor...\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, fuzzy, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "`%s' make dosyası çevrime girdi; yeniden derlenemez.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, fuzzy, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "`%s' make dosyası yeniden derlenemiyor."
 
-#: main.c:2299
+#: src/main.c:2323
 #, fuzzy, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "İçerilen make dosyası `%s' bulunamadı."
 
-#: main.c:2304
+#: src/main.c:2328
 #, fuzzy, c-format
 msgid "Makefile '%s' was not found"
 msgstr "`%s' make dosyası bulunamadı"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Geriye, özgün dizine geçilemiyor."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Yeniden çalıştırılıyor[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (geçici dosya): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL bir hedeften fazlasını içeriyor"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Hedefler belirtilmediğinden make dosyası yok"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Hedef yok"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Hedefler belirtilmediğinden make dosyası yok"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Amaçlanan hedefler güncelleniyor...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr "uyarı:  Clock skew saptandı. Derleme tamamlanamayabilir."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Kullanım: %s [seçenekler] [hedef] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1227,7 +1237,7 @@ msgstr ""
 "\n"
 "Bu program %s için kurgulanmış\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1236,38 +1246,38 @@ msgstr ""
 "\n"
 "Bu program %s için kurgulanmış (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Yazılım hatalarını <bug-make@gnu.org> adresine,\n"
 "çeviri hatalarını <gnu-tr@belgeler.org> adresine bildiriniz.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, fuzzy, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "`-%c' seçeneği bir boş olmayan dizge argüman gerektirir"
 
-#: main.c:2934
+#: src/main.c:2965
 #, fuzzy, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "`-%c' seçeneği bir pozitif tümleyici bağımsız değişkenle kullanılır"
 
-#: main.c:3332
+#: src/main.c:3363
 #, fuzzy, c-format
 msgid "%sBuilt for %s\n"
 msgstr ""
 "\n"
 "%sBu program %s için derlenmiş\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, fuzzy, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr ""
 "\n"
 "%sBu program %s için derlenmiş (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1276,7 +1286,7 @@ msgid ""
 "%sThere is NO WARRANTY, to the extent permitted by law.\n"
 msgstr ""
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1285,7 +1295,7 @@ msgstr ""
 "\n"
 "# Make veri tabanı, %s üzerine basıldı"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1294,361 +1304,385 @@ msgstr ""
 "\n"
 "# %s üzerindeki Make veri tabanı tamamlandı\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Bilinmeyen hata %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: kullanıcı %lu (gerçekte %lu), grup %lu (gerçekte %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "İlklendirilmiş erişim"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Kullanıcı erişimi"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Make erişimi"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Asta erişim"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: bilinmeyen bir dizine giriliyor\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: bilinmeyen dizinden çıkılıyor\n"
 
-#: output.c:109
+#: src/output.c:102
 #, fuzzy, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: `%s' dizine giriliyor\n"
 
-#: output.c:111
+#: src/output.c:104
 #, fuzzy, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: `%s' dizininden çıkılıyor\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Bilinmeyen bir dizine giriliyor\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Bilinmeyen dizinden çıkılıyor\n"
 
-#: output.c:120
+#: src/output.c:113
 #, fuzzy, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]:`%s' dizinine giriliyor\n"
 
-#: output.c:122
+#: src/output.c:115
 #, fuzzy, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: `%s' dizininden çıkılıyor\n"
 
-#: output.c:495 output.c:497
-#, fuzzy
+#: src/output.c:442 src/output.c:444
+#, fuzzy, c-format
 msgid "write error: stdout"
 msgstr "yazma hatası: %s"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ". Durdu.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "işleri yaratıyor"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 #, fuzzy
 msgid "duping jobs pipe"
 msgstr "işleri yaratıyor"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "işleri hazırlıyor"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, fuzzy, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "içsel hata: --jobserver-fds dizgesi `%s' geçersiz"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr ""
 
-#: posixos.c:109
+#: src/posixos.c:138
 #, fuzzy
 msgid "jobserver pipeline"
 msgstr "işleri hazırlıyor"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "iş-sunucusu yazıyor"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr ""
+
+#: src/posixos.c:303
 #, fuzzy
 msgid "pselect jobs pipe"
 msgstr "görev listesi okunuyor"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "görev listesi okunuyor"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Makefile'lar okunuyor...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, fuzzy, c-format
 msgid "Reading makefile '%s'"
 msgstr "`%s' make dosyası okunuyor"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (öntanımlı amaç yok)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (arama yolu)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (umurunda değil)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr "( ~ uzantısı yok)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr ""
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr ""
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "şartlı ifade de yazılış hatası"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr ""
 
-#: read.c:985
-#, fuzzy
+#: src/read.c:986
+#, fuzzy, c-format
 msgid "recipe commences before first target"
 msgstr "komutlar ilk hedeften önce başlıyor"
 
-#: read.c:1034
-#, fuzzy
+#: src/read.c:1035
+#, fuzzy, c-format
 msgid "missing rule before recipe"
 msgstr "komutlardan önceki kural kayıp"
 
-#: read.c:1124
-#, fuzzy
+#: src/read.c:1136
+#, fuzzy, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "(8 boşluğu TAB'mı zannettiniz?)"
 
-#: read.c:1126
-#, fuzzy
+#: src/read.c:1138
+#, fuzzy, c-format
 msgid "missing separator"
 msgstr "kayıp ayraç%s"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "hedef kalıp kayıp"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "çok sayıda hedef kalıp"
 
-#: read.c:1268
+#: src/read.c:1289
 #, fuzzy, c-format
 msgid "target pattern contains no '%%'"
 msgstr "hedef kalıp `%%' içermiyor"
 
-#: read.c:1390
-#, fuzzy
+#: src/read.c:1404
+#, fuzzy, c-format
 msgid "missing 'endif'"
 msgstr "`endif' kayıp"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "boş değişken ismi"
 
-#: read.c:1463
-#, fuzzy
+#: src/read.c:1478
+#, fuzzy, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "`endef' yönergesinden sonraki metin yersiz"
 
-#: read.c:1488
-#, fuzzy
+#: src/read.c:1503
+#, fuzzy, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "`endef' kayıp, `define' sonlandırılmamış"
 
-#: read.c:1516
-#, fuzzy
+#: src/read.c:1531
+#, fuzzy, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "`endef' yönergesinden sonraki metin yersiz"
 
-#: read.c:1588
+#: src/read.c:1603
 #, fuzzy, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "`%s' yönergesinden sonraki metin yersiz"
 
-#: read.c:1589
+#: src/read.c:1604
 #, fuzzy, c-format
 msgid "extraneous '%s'"
 msgstr "`%s' yersiz"
 
-#: read.c:1617
-#, fuzzy
+#: src/read.c:1632
+#, fuzzy, c-format
 msgid "only one 'else' per conditional"
 msgstr "her şartlı ifade de sadece bir `else'"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Hedefe özgü değişken tanımı bozuk"
 
-#: read.c:1950
-#, fuzzy
+#: src/read.c:1968
+#, fuzzy, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "öngereksinimler komut betiklerinde tanımlanamaz"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr ""
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "örtük ve durağan kalıp kuralları karışmış"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "örtük ve normal kurallar karışmış"
 
-#: read.c:2085
+#: src/read.c:2107
 #, fuzzy, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "hedef `%s' hedef kalıpla eşleşmiyor"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, fuzzy, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "hedef dosya `%s'hem : hem de :: girdilerine sahip"
 
-#: read.c:2106
+#: src/read.c:2128
 #, fuzzy, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "hedef `%s' aynı kuralda birden fazla belirtilmiş."
 
-#: read.c:2116
+#: src/read.c:2138
 #, fuzzy, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "uyarı: hedef `%s' için komutlar geçersiz kılınıyor"
 
-#: read.c:2119
+#: src/read.c:2141
 #, fuzzy, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "uyarı: hedef `%s' için eski komutlar yoksayılıyor"
 
-#: read.c:2223
-#, fuzzy
+#: src/read.c:2254
+#, fuzzy, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "örtük ve normal kurallar karışmış"
 
-#: read.c:2542
+#: src/read.c:2271
+#, fuzzy, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "uyarı: hedef `%s' için komutlar geçersiz kılınıyor"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "uyarı: NUL karakteri görüldü; satırın geri kalanı yoksayılıyor"
 
-#: remake.c:226
+#: src/remake.c:226
 #, fuzzy, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "`%s' için hiçbir şey yapılmadı."
 
-#: remake.c:227
+#: src/remake.c:227
 #, fuzzy, c-format
 msgid "'%s' is up to date."
 msgstr "`%s' güncel"
 
-#: remake.c:323
+#: src/remake.c:323
 #, fuzzy, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Budanmış dosya `%s'.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr ""
 "%sHedef `%s' i derlemek için  hiçbir kural yok, `%s' tarafından gereksinim "
 "duyuluyor%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, fuzzy, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sHedef `%s' i derlemek için  hiçbir kural yok%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, fuzzy, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "hedef dosya `%s' hesaba katılıyor.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, fuzzy, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "En son `%s'dosyasının güncellenmesi denendi ve başarısız oldu.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, fuzzy, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "`%s' dosyası zaten hesaba katıldı.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, fuzzy, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "`%s' dosyası hala güncelleniyor.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, fuzzy, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "`%s' dosyasının güncellenmesi tamamlandı.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, fuzzy, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "`%s' dosyası yok.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, fuzzy, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1656,147 +1690,147 @@ msgstr ""
 "*** Uyarı: .LOW_RESOLUTION_TIME dosyası `%s' yüksek çözünürlüklü bir zaman "
 "damgası içeriyor"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, fuzzy, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "`%s' için bir örtük kural bulundu.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, fuzzy, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "`%s' için bir örtük kural yok.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, fuzzy, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "`%s' için öntanımlı komutlar kullanılıyor.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Çevrimsel %s <- %s bağımlılığı iptal edildi."
 
-#: remake.c:691
+#: src/remake.c:674
 #, fuzzy, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "`%s' hedef dosyasının önceden gereklilikleri tamamlandı.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, fuzzy, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "`%s' için önceden gereklilikler derlenmeye devam ediyor.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, fuzzy, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "`%s' hedef dosyasında umut kesiliyor.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, fuzzy, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Hedef `%s' hatalardan dolayı yeniden derlenemez."
 
-#: remake.c:768
+#: src/remake.c:751
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Önceden gerekli `%s' hedef `%s' için şart.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, fuzzy, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Hedef `%s' in önceden gereklisi `%s' mevcut değil.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Önceden gerekli `%s' hedef `%s' den daha yeni.\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, fuzzy, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Önceden gerekli `%s' hedef `%s' den daha eski.\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, fuzzy, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Hedef `%s' çift-sütunlu ve önceden gereklilikler gerektirmiyor.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, fuzzy, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "`%s' için komutlar ve  önceden gerekliliklerde bir değişiklik yok.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, fuzzy, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Daima derle seçeneğinden dolayı `%s' derleniyor.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, fuzzy, c-format
 msgid "No need to remake target '%s'"
 msgstr "Hedef `%s' nin yeniden derlenmesine gerek yok"
 
-#: remake.c:821
+#: src/remake.c:804
 #, fuzzy, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; VPATH ismi `%s' kullanılıyor"
 
-#: remake.c:841
+#: src/remake.c:824
 #, fuzzy, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Hedef `%s' yeniden derlenmeli.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, fuzzy, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr " VPATH ismi `%s' yoksayılıyor.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, fuzzy, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "`%s' nin komutları çalışmaya devam ediyor.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, fuzzy, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Hedef dosya `%s' yeniden derlenirken hata oluştu.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, fuzzy, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Hedef dosya `%s' yeniden derlenmesi başarıyla tamamlandı.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, fuzzy, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "`%s' hedef dosyasının -q ile yeniden derlenmesi gerekir.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, fuzzy, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "`%s' için öntanımlı komutlar kullanılıyor.\n"
 
-#: remake.c:1430
-#, fuzzy, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Uyarı: `%s' dosyası gelecekteki bir değişiklik tarihini içeriyor"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, fuzzy, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Uyarı: `%s' dosyasının  değişiklik tarihi %.2g s kadar gelecekte"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, fuzzy, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS elemanı `%s' bir kalıp değil"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Özelleştirilmiş olanlar dışarı aktarılmayacak: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1804,7 +1838,7 @@ msgstr ""
 "\n"
 "# Örtük Kurallar"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1812,188 +1846,184 @@ msgstr ""
 "\n"
 "# Örtük kural yok."
 
-#: rule.c:514
-#, c-format
+#: src/rule.c:548
+#, fuzzy, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
 "# %u örtük kural, %u"
 
-#: rule.c:523
-msgid " terminal."
-msgstr " terminal."
-
-#: rule.c:531
+#: src/rule.c:557
 #, fuzzy, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "YAZILIM HATASI: num_pattern_rules yanlış!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "bilinmeyen sinyal"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Tıkanma"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Kesme"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Çık"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Yönergeler uygun değil"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "İzleme/kesmenoktası yakalayıcı"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "İptal edildi"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT tuzağı"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT tuzağı"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Gerçek sayı olağandışı durumu"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Süreç durduruldu"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Veri yolu hatası"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Parçalama arızası"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Sistem çağrısı hatalı"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Veri alınamıyor"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Alarm saati"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Sonlandırıldı"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Kullanıcı tanımlı sinyal 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Kullanıcı tanımlı sinyal 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Ast bıraktı"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Güç kesilmesi"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Durduruldu"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Durduruldu (konsol girdisi)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Durduruldu (konsol çıktısı)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Durduruldu (sinyal)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU zaman sınırı aşıldı"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Dosya uzunluğu sınırı aşıldı"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Sanal süreölçer kullanım süresi doldu"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Tanıtım süreölçer kullanım süresi doldu"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Pencere boyutları değiştirildi"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Devam ediliyor"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Acil G/Ç koşulu"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "G/Ç mümkün"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Kaynak kaybı"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Tehlike sinyali"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Bilgi isteği"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Aritmetik işlemci kullanılabilir değil"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, fuzzy, c-format
 msgid ""
 "\n"
 "%s No strcache buffers\n"
 msgstr "%s dizge belleği tamponlarının sayısı: %d\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -2001,31 +2031,31 @@ msgid ""
 "B\n"
 msgstr "%s dizge belleği boş: toplam = %d / max = %d / min = %d / ort = %d\n"
 
-#: strcache.c:308
-#, c-format
+#: src/strcache.c:308
+#, fuzzy, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
-msgstr ""
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr "%s dizge belleği boyu: toplam = %d / max = %d / min = %d / ort = %d\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, fuzzy, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s dizge belleği boyu: toplam = %d / max = %d / min = %d / ort = %d\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, fuzzy, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr "%s dizge belleği boş: toplam = %d / max = %d / min = %d / ort = %d\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
 "%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
 msgstr ""
 
-#: strcache.c:328
+#: src/strcache.c:328
 #, fuzzy
 msgid ""
 "# hash-table stats:\n"
@@ -2035,45 +2065,45 @@ msgstr ""
 "# dosyaların hash tablosu durumları:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "otomatik"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "öntanımlı"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "çevre"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "derleme dosyası"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "çevre -e altında"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "komut satırı"
 
-#: variable.c:1647
+#: src/variable.c:1671
 #, fuzzy
 msgid "'override' directive"
 msgstr "`override' yönergesi"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, fuzzy, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (`%s'den, satır %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# değişken kümesi hash tablosunun durumu:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2081,7 +2111,7 @@ msgstr ""
 "\n"
 "# Değişkenler\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2089,7 +2119,7 @@ msgstr ""
 "\n"
 "# Kalıba özgü Değişken Değerleri"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2097,7 +2127,7 @@ msgstr ""
 "\n"
 "# Örneğe duyarlı değişken değeri yok."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2106,49 +2136,49 @@ msgstr ""
 "\n"
 "# %u örneğe duyarlı değişken değeri"
 
-#: variable.h:224
+#: src/variable.h:229
 #, fuzzy, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "uyarı: `%.*s' değişkeni atanmamış"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, fuzzy, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search %d ile başarısız\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-uyarı, DCL den yönetimi almak için CTRL-Y'yi yeniden "
 "etkinleştirebilirsiniz.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "OLUŞUMİÇİ CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr ""
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, fuzzy, c-format
 msgid "Append output to %s\n"
 msgstr "%s e yönlendirilmiş çıktı\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr ""
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "%s yerine çalıştırılıyor\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2156,12 +2186,12 @@ msgstr ""
 "\n"
 "# VPATH Arama yolu\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 #, fuzzy
 msgid "# No 'vpath' search paths."
 msgstr "# `vpath' arama yolları yok"
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, fuzzy, c-format
 msgid ""
 "\n"
@@ -2170,7 +2200,7 @@ msgstr ""
 "\n"
 "# %u `vpath' arama yolu.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 #, fuzzy
 msgid ""
 "\n"
@@ -2179,7 +2209,7 @@ msgstr ""
 "\n"
 "# Genel arama yolu (`VPATH' çevre değişkeni) yok."
 
-#: vpath.c:631
+#: src/vpath.c:631
 #, fuzzy
 msgid ""
 "\n"
@@ -2190,33 +2220,33 @@ msgstr ""
 "# Genel (`VPATH' çevre değişkeni) arama yolu:\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr ""
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr ""
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr ""
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr ""
@@ -2233,6 +2263,18 @@ msgstr ""
 #~ msgid "process_easy() failed failed to launch process (e=%ld)\n"
 #~ msgstr "Süreci başlatmada process_easy() başarısız oldu (e=%ld)\n"
 
+#~ msgid "%s: Command not found"
+#~ msgstr "%s: Komut bulunamadı"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Kabuk uygulaması bulunamadı"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s 30 saniyeliğine askıya alınıyor..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "sleep(30) bitti. Devam ediliyor.\n"
+
 #~ msgid "internal error: multiple --jobserver-fds options"
 #~ msgstr "içsel hata: çok sayıda --jobserver-fds seçeneği"
 
@@ -2250,6 +2292,9 @@ msgstr ""
 #~ "KULLANIMINIZA\n"
 #~ "%sUYGUNLUĞU için bile garanti verilmez.\n"
 
+#~ msgid "Unknown error %d"
+#~ msgstr "Bilinmeyen hata %d"
+
 #~ msgid "virtual memory exhausted"
 #~ msgstr "sanal bellek tükendi"
 
@@ -2265,6 +2310,12 @@ msgstr ""
 #~ msgid "invalid `override' directive"
 #~ msgstr "`override' yönergesi geçersiz"
 
+#~ msgid "Warning: File `%s' has modification time in the future"
+#~ msgstr "Uyarı: `%s' dosyası gelecekteki bir değişiklik tarihini içeriyor"
+
+#~ msgid " terminal."
+#~ msgstr " terminal."
+
 #~ msgid ""
 #~ "\n"
 #~ "%s # of strings in strcache: %d\n"
index 538256cc05b19cae11fb5a39cac1a4514dbc78f0..3112ee8664b235a35b0d389832d40ef256cdde78 100644 (file)
Binary files a/po/uk.gmo and b/po/uk.gmo differ
index 3a8e7968bf0bd48bde792e7689b311af7bde5c72..2ed7e54d87c4987bb5851014c702226c495c8b90 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
 # This file is distributed under the same license as the make package.
 #
 # Volodymyr M. Lisivka <lvm@mystery.lviv.net>, 2001-2012.
-# Yuri Chornoivan <yurchor@ukr.net>, 2012, 2013, 2014, 2016.
+# Yuri Chornoivan <yurchor@ukr.net>, 2012, 2013, 2014, 2016, 2019, 2020.
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-22 21:55+0300\n"
-"Last-Translator: Volodymyr M. Lisivka <lvm@mystery.lviv.net>\n"
-"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 12:37+0200\n"
+"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n"
 "Language: uk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 19.11.70\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "спроба вжити можливість, підтримки якої не передбачено: \"%s\""
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "оновлення часу зміни члена архіву неможливо у системі VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "оновлення часу зміни: Архів \"%s\" не існує"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "оновлення часу зміни: некоректний архів: \"%s\""
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "оновлення часу зміни: Член \"%s\" не міститься у \"%s\""
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr ""
 "оновлення часу зміни: Функція ar_member_touch повернула\n"
 "помилковий код відповіді для \"%s\""
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_module() не вдалося видобути дані модуля, стан = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "Помилка lbr$ini_control() з повідомленням стану = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "не вдалося відкрити бібліотеку «%s» для пошуку стану елемента %d"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Елемент «%s»%s: %ld байтів з %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (ім'я може бути обрізано)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Дата %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, режим = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "У рецепті забагато рядків (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Зупинка.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Елемент архіву, «%s», можливо є фіктивним; не вилучено"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Елемент архіву, «%s», можливо є фіктивним; не вилучено"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Вилучаємо файл \"%s\""
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Вилучаємо файл \"%s\""
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  спосіб, який слід застосувати"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (вбудоване):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (з \"%s\", рядок %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -134,223 +136,223 @@ msgstr ""
 "\n"
 "# Каталоги\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: неможливо отримати інформацію (stat).\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (ключ %s, час зміни %ull): не вдалося відкрити.\n"
+msgstr "# %s (ключ %s, час зміни %I64u): не вдалося відкрити.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (пристрій %d, івузол [%d,%d,%d]): неможливо відкрити.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (пристрій %ld, івузол %ld): не вдалося відкрити.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (ключ %s, час модифікації %ull): "
+msgstr "# %s (ключ %s, час модифікації %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (пристрій %d, івузол [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (пристрій %ld, івузол %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Ні"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " файлів, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "ні"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " недосяжних цілей"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " на поточний момент."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " недосяжних цілей у %lu каталогах.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Рекурсивна змінна \"%s\" посилається сама на себе (у результаті)"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "незавершена посилання на змінну"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Спосіб для файла «%s» було задано %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr ""
 "Спосіб для файла «%s» було знайдено за допомогою пошуку неявних правил,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "але \"%s\" і \"%s\" тепер вважаються одним і тим же ж файлом. "
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr "Спосіб для «%s» буде проігноровано на користь способу для «%s»."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr ""
 "неможливо перейменувати \"%s\" з однією двокрапкою у \"%s\" з двома "
 "двокрапками"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr ""
 "неможливо перейменувати \"%s\" з двома двокрапками у \"%s\" з однією "
 "двокрапкою"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Вилучаємо проміжний файл «%s»"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Вилучаємо проміжні файли...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Поточний час"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: часова позначка поза допустимим діапазоном; замінюємо на %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Не є метою:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Вартісний файл (залежність .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Псевдоціль (залежність .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Мета, що викликається з командного рядка."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Типово, MAKEFILES, або -include/sinclude makefile."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Вбудоване правило"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Пошук неявних правил виконано."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Пошук неявних правил не було виконано."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Основа неявного або статичного шаблону: \"%s\"\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Файл є проміжною залежністю."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Збирає також:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Час зміни ніколи не перевірявся."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Файл не існує."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Файл дуже старий."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Востаннє оновлено %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Файл був оновлений."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Файл не було оновлено."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Виконується обробка (ЦЕ ПОМИЛКА)"
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Ці залежності вже обробляються (ЦЕ ПОМИЛКА)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Успішно оновлено."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Повинно бути оновлено (встановлений ключ -q)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Спроба оновлення безуспішна."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Некоректне значення члена \"command_state\"!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -358,7 +360,7 @@ msgstr ""
 "\n"
 "# Файли"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -368,333 +370,341 @@ msgstr ""
 "# статистика щодо таблиці хешів файлів:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: поле «%s» не кешовано: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "не числовий перший аргумент для функції \"word\""
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "першим аргументом функції «word» має бути число, більше за 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "не числовий перший аргумент для функції \"wordlist\""
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "не числовий другий аргумент для функції \"wordlist\""
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: помилка DuplicateHandle(In) (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: помилка DuplicateHandle(Err) (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "Помилка CreatePipe() (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): помилка process_init_fd()\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Спорожнюємо тимчасовий пакетний файл %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file: не вказано назви файла"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file: надто багато аргументів"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "file: некоректна дія над файлом: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "недостатня кількість аргументів (%d) функції «%s»"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "не реалізовано на цій платформі: функція «%s»"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "незавершений виклик функції \"%s\"; пропущено \"%c\""
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Порожня назва функції"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Некоректна назва функції: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Назва функції є задовгою: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Некоректна мінімальна кількість аргументів (%u) функції %s"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Некоректна максимальна кількість аргументів (%u) функції %s"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: параметр «%s» не є однозначним\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: додавання аргументів до параметра «--%s» не передбачено\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: додавання аргументів до параметра «%c%s» не передбачено\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: до параметра «%s» слід додати аргумент\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: невідомий параметр «--%s»\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: невідомий параметр «%c%s»\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: невірний параметр -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: невірний параметр -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: параметру необхідний аргумент -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: параметр «-W %s» не є однозначним\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: додавання аргументів до параметра «-W %s» не передбачено\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: розгортаємо «%s»\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: обчислюємо «%s»\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "не вдалося розмістити %lu байтів для таблиці хешів: вичерпано пам’ять"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Завантаження=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Завантаження=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Повторне хешування=%d, "
+msgid "Rehash=%u, "
+msgstr "Повторне хешування=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Збіги=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Збіги=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Пошук неявного правила для \"%s\".\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Пошук неявного правила для члена архіву \"%s\".\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Запобігання рекурсивного виклику неявного правила.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Занадто довгий шаблон: «%.*s».\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Занадто довгий шаблон: «%s%.*s».\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Спроба застосування правила зі зразком, основа \"%.*s\".\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Відкидання неможливої залежності правила «%s».\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Відкидання неможливої неявної залежності «%s».\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Пробую залежність правило \"%s\".\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Пробую неявні залежності \"%s\".\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Виявлено залежність «%s» у форматі VPATH «%s»\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Пошук правила з проміжним файлом \"%s\".\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Не вдалося створити тимчасовий файл\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (зроблений дамп пам'яті)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (ігнорується)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<вбудований>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Помилка %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Очікування завершення завдань..."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Незавершений дочірній процес %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (віддалений)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Підбираємо невдалий дочірній процес з PID %p %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Підбираємо вдалий дочірній процес з PID %p %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Підбираємо невдалий дочірній процес з PID %p %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Знищення тимчасового командного файла %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr ""
 "Спроба витикання тимчасового файла пакетної обробки %s зазнала невдачі (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Вилучаємо PID дочірнього процесу %p %s%s з ланцюжка.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Звільнено символ для дочірнього процесу %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() не вдалося запустити процес (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -703,96 +713,90 @@ msgstr ""
 "\n"
 "Під час невдалого запуску кількість аргументів дорівнювала %d\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Додаємо дочірній процес з PID %p (%s) %s%s до ланцюжка.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Отримано символ для дочірнього процесу %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: мети «%s» не існує"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: оновлення мети «%s» з такої причини: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr ""
 "ця операційна система не дозволяє встановлювати обмеження на завантаження"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "неможливо встановити обмеження на завантаження: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "не вистачає файлових дескрипторів: не вдалося здублювати stdin\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "не вистачає файлових дескрипторів: не вдалося здублювати stdout\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "не вистачає файлових дескрипторів: не вдалося здублювати stderr\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Не вдалося відновити stdin\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Не вдалося відновити stdout\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Не вдалося відновити stderr\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr ""
 "make підібрано дочірній процес з pid %s, який все ще чекає на завершення "
 "процесу з pid %s\n"
 
-#: job.c:2275
+#: src/job.c:2623
 #, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: не знайдено команди\n"
-
-#: job.c:2277
-#, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: не знайдено команди\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Командний процесор не знайдений"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: ймовірно, завершилося місце у середовищі"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL змінено (було «%s», тепер «%s»)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Створюємо тимчасовий пакетний файл %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -800,7 +804,7 @@ msgstr ""
 "Вміст файла пакетної обробки:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -809,59 +813,55 @@ msgstr ""
 "Вміст пакетного файла:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr ""
 "%s (рядок %d) Поганий контекст оболонки (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr ""
-"-O[ТИП] (--output-sync[=ТИП]) для цього сеансу збирання не налаштовано."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Не вдалося відкрити таблицю загальних символів: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Завантажений об’єкт %s не оголошено як сумісний з GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Не вдалося завантажити символ %s з %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Порожня назва символу для завантаження: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Завантажуємо символ %s з %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "На цій платформі виконання дії «load» не передбачено."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Ключі:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Ігнорується, для сумісності.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           безумовно обробляти всі записи мети.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -870,18 +870,18 @@ msgstr ""
 "                              Перейти до каталогу до виконання будь-яких "
 "дій.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          Вивести діагностичні повідомлення.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=ПРАПОРЦІ]          Вивести діагностичні повідомлення вказаних "
 "типів.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -890,12 +890,12 @@ msgstr ""
 "                              Змінні середовища мають вищий пріоритет за "
 "змінні makefile.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
-msgstr "  --eval=РЯДОК                Обробити РЯДОК як інструкцію makefile.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E РЯДОК, --eval=РЯДОК      Обробити РЯДОК як інструкцію makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -903,16 +903,16 @@ msgstr ""
 "  -f ФАЙЛ, --file=ФАЙЛ, --makefile=ФАЙЛ\n"
 "                              Використати ФАЙЛ як makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Вивести це повідомлення і вийти.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr ""
 "  -i, --ignore-errors         Ігнорувати помилки від способів збирання.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -920,7 +920,7 @@ msgstr ""
 "  -I КАТАЛОГ, --include-dir=КАТАЛОГ\n"
 "                              Виконати пошук включених makefile у каталозі.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -928,14 +928,14 @@ msgstr ""
 "  -j [N], --jobs[=N]          Виконувати одночасно N завдань; якщо не "
 "вказано — необмежену кількість.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr ""
 "  -k, --keep-going            Продовжувати роботу, якщо збирання якоїсь мети "
 "неможливе.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -945,7 +945,7 @@ msgstr ""
 "                              Не запускати декількох завдань, якщо "
 "навантаження перевищує N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
@@ -953,7 +953,7 @@ msgstr ""
 "  -L, --check-symlink-times   Використовувати новіший час зміни з часів "
 "зміни посилання і мети.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -963,7 +963,7 @@ msgstr ""
 "                              Не застосовувати способів збирання, просто "
 "вивести назви способів.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -973,7 +973,7 @@ msgstr ""
 "                              Вважати ФАЙЛ дуже старим і не виконувати його "
 "повторного збирання.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -982,11 +982,11 @@ msgstr ""
 "                              синхронізувати виведені дані паралельних "
 "завдань за ТИПом.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       Вивести внутрішню базу даних make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
@@ -995,19 +995,25 @@ msgstr ""
 "способів;                               код завершення показує, чи все вже "
 "зроблено.\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      Вимкнути вбудовані неявні правила.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  Вимкнути вбудовані параметри змінних.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Не виводити способи збирання.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr ""
+"  --no-silent                 Виводити способи збирання (вимкнути режим --"
+"silent).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1015,26 +1021,26 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Вимкнути -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 Змінювати час доступу до мети замість її "
 "повторного збирання.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Вивести дані щодо трасування.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               Вивести дані щодо версії make і вийти.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Виводити дані щодо поточного каталогу.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
@@ -1042,7 +1048,7 @@ msgstr ""
 "  --no-print-directory        Вимкнути -w, навіть якщо вмикання було "
 "виконано неявним чином.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1050,7 +1056,7 @@ msgstr ""
 "  -W ФАЙЛ, --what-if=ФАЙЛ, --new-file=ФАЙЛ, --assume-new=ФАЙЛ\n"
 "                              Вважати ФАЙЛ завжди новим.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
@@ -1058,26 +1064,27 @@ msgstr ""
 "  --warn-undefined-variables  Попереджати про посилання на невизначену "
 "змінну.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "порожній рядок не може бути назвою файла"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "невідома специфікація рівня діагностики, «%s»"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "невідомий тип синхронізації виведених даних, «%s»"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: сталося переривання або виключення (код = 0x%lx, адреса = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1092,139 +1099,146 @@ msgstr ""
 "Прапорці виключення = %lx\n"
 "Адреса виключення = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Порушення правил доступу: дія з запису за адресою 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Порушення правил доступу: дія з читання за адресою 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() встановлює default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr ""
 "Пошуком шляхів find_and_set_shell() встановлено значення default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s призупиняється на 30 секунд..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "виконано sleep(30). Продовжуємо.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "попередження: сервер завдань недоступний: використовуємо -j1. Додайте «+» до "
 "батьківського правила збирання."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr ""
-"попередження: у вкладеному файлів збирання вказано -jN: вимикаємо режим "
-"сервера завдань."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "попередження: у submake вказано -j%d: вимикаємо режим сервера завдань."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Makefile зі стандартного джерела вхідних даних вказано двічі."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (тимчасовий файл)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (тимчасовий файл)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"попередження: у makefile вказано -j%d: вимикаємо режим сервера завдань."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "На цій платформі паралельної обробки завдань (-j) не передбачено."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Повертаємося до режиму єдиного завдання (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Підтримки символічних посилань не передбачено: вимикаємо -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Оновлення make-файлів...\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Make-файл \"%s\", можливо, зациклений, він не перезбиратиметься.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Спроба перезібрати make-файл \"%s\" безуспішна."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Make-файл \"%s\", який включається, не було знайдено."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
 msgstr "Make-файл \"%s\" не було знайдено"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Неможливо перейти у первісний каталог."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Повторне виконання[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (тимчасовий файл): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL містить декілька записів мети"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Не задані цілі і не знайдений make-файл"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Нема цілей"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Не задані цілі і не знайдений make-файл"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Оновлення цілей мети...\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "попередження: виявлено відхилення показів годинника. Збирання може бути "
 "неповним."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Використання: %s [КЛЮЧІ]... [ЦІЛЬ]...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1233,7 +1247,7 @@ msgstr ""
 "\n"
 "Цю програму зібрано для %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1242,32 +1256,32 @@ msgstr ""
 "\n"
 "Цю програму зібрано для %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "Повідомлюйте про помилки до <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "разом з «%s%s» мало бути вказано непорожній рядковий аргумент"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "ключ \"-%c\" повинен використовуватися з цілим додатним аргументом"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sЗібрано для %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sЗібрано для %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1282,7 +1296,7 @@ msgstr ""
 "%sВам не надається ЖОДНИХ ГАРАНТІЙ, окрім гарантій передбачених "
 "законодавством.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1291,7 +1305,7 @@ msgstr ""
 "\n"
 "# База даних Make, надрукована %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1300,344 +1314,381 @@ msgstr ""
 "\n"
 "# Друк бази даних Make завершено %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Невідома помилка %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: користувач %lu (насправді %lu), група %lu (насправді %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Ініціалізований доступ"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Доступ користувача"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Доступ make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Доступ дочірнього процесу"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: входимо до невідомого каталогу\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: виходимо з невідомого каталогу\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: входимо до каталогу «%s»\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Залишаю каталог \"%s\"\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: входимо до невідомого каталогу\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: залишаємо невідомий каталог\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: входимо до каталогу «%s»\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Залишаю каталог \"%s\"\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "помилка запису: stdout"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Зупинка.\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr ""
+"-O[ТИП] (--output-sync[=ТИП]) для цього сеансу збирання не налаштовано."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "створюємо канал завдань"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "дублюємо канал завдань"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "ініціалізуємо канал сервера завдань"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "внутрішня помилка: некоректний рядок --jobserver-auth, «%s»"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Клієнт сервера завдань (fd %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "канал сервера завдань"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "запис до сервера завдань"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "сервер завдань вимкнено"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "виконання pselect для каналу завдань"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "читання записів з потоку завдань"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Читання make-файлів...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Читання make-файла \"%s\""
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (немає типової мети)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (шлях пошуку)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (не зважати)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (не розширювати ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Пропускаємо мітку UTF-8 у файлі makefile «%s»\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Пропускаємо мітку UTF-8 у буфері файла makefile\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "невірний синтаксис у умовному вираженні"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: не вдалося завантажити"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "визначення способу збирання розпочинається до визначення першої мети"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "пропущено правило до способу"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "пропущено роздільник (ви хотіли ввести TAB замість 8 пробілів?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "пропущено розділювач"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "пропущений шаблон цілі"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "не один шаблон цілі"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "шаблон цілі не містить \"%%\""
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "пропущена \"endif\""
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "порожнє ім'я змінної"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "зайвий текст після директиви «define»"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "пропущена \"endif\", незавершена \"define\""
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "зайвий текст після директиви «endef»"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "зайвий текст після директиви \"%s\""
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "зайва \"%s\""
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "в умовному виразі можлива лише одна директива `else'"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Помилкове форматування специфічного для мети визначення змінної"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "у способах збирання не можна вказувати залежностей"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "для згрупованих цілей має бути надано спосіб збирання"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "змішані неявні правила і правила зі статичними зразками"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "змішані неявні і звичайні правила"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "ціль \"%s\" не відповідає зразку цілей"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "цільовий файл \"%s\" має входження і з \":\", і з \"::\" "
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "ціль \"%s\" зазначено декілька разів у одному правилі"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "попередження: замінюємо спосіб для мети «%s»"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "попередження: ігноруємо застарілий спосіб для мети «%s»"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** змішані неявні і звичайні правила: застарілий синтаксис"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "попередження: перевизначаємо участь у групах для мети «%s»"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "попередження: зустрінутий символ NUL; ігнорується до кінця рядки"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Ціль \"%s\" не вимагає виконання команд."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "\"%s\" не вимагає оновлення."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Обрізаємо файл «%s».\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sНема правила для створення цілі \"%s\", необхідної для \"%s\"%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sНема правила для створення цілі \"%s\"%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Обробка цільового файла \"%s\".\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Попередня спроба оновити файл \"%s\" завершилася безуспішно.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Файл \"%s\" вже було оброблено.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Все ще оновлюється файл \"%s\".\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Оновлення файла \"%s\" завершено.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Не виявлено файла з назвою «%s».\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1645,147 +1696,147 @@ msgstr ""
 "*** Попередження: файл .LOW_RESOLUTION_TIME «%s» має часову позначку високої "
 "точності"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Знайдено неявне правило для \"%s\".\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Не знайдено неявних правил для \"%s\".\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Використовуємо типовий спосіб для «%s».\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Циклічна залежність %s <- %s пропущена."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Завершено обробку попередніх залежностей файла мети «%s».\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Цілі, від яких залежить \"%s\", збираються.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Аварійний зупинка на цільовому файлі \"%s\".\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Ціль \"%s\" не була перезібрана через помилки."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Залежність «%s» визначено для мети «%s» лише порядком збирання.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Залежності «%s» мети «%s» не існує.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Залежність «%s» є новішою за мету «%s».\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Залежність «%s» є старішою за мету «%s».\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Ціль \"%s\" оголошена з двома двокрапками і не має залежностей.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "Немає способу збирання «%s», всі попередні залежності не змінено.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Збираємо «%s» через встановлення ключа always-make.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Потреби у повторному збиранні мети «%s» немає"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; використовуємо назву VPATH «%s»"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Необхідно перезібрати ціль \"%s\".\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Ігноруємо назву VPATH «%s».\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Застосовуємо спосіб «%s».\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Спроба перезібрати цільовий файл \"%s\" безуспішна.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Цільовий файл \"%s\" успішно перезібраний.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Цільовий файл \"%s\" вимагає перезбирання з ключем -q.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Використання типових команд для «%s».\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Увага: Файл \"%s\" має майбутній час зміни"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "Увага: час зміни файла «%s» перебуває на %s с у майбутньому"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "Елемент .LIBPATTERNS «%s» не є зразком"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Неекспортовні налаштування: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1793,7 +1844,7 @@ msgstr ""
 "\n"
 "# Неявні правила"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1801,181 +1852,177 @@ msgstr ""
 "\n"
 "# Неявних правил нема."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# Неявних правил: %u, термінальних: %u"
-
-#: rule.c:523
-msgid " terminal."
-msgstr "."
+"# Неявних правил: %u, термінальних: %u (%.1f%%)."
 
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "ПОМИЛКА: значення num_pattern_rules є помилковим!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "невідомий сигнал"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Обрив"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Переривання"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Вихід"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Неприпустима інструкція"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Пастка трасування чи точки зупинки"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Припинено"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Пастка IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Пастка EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Помилка операції з крапкою, що плаває"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Знищення"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Помилка на шині"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Збій сегментації"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Поганий системний виклик"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Обрив каналу"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Сигнал по таймеру"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Завершено"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Обумовлений користувачем сигнал 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Обумовлений користувачем сигнал 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Нащадок завершив роботу"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Збій живлення"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Зупинено"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Зупинено (ввід з термінала) "
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Зупинено (вивід на термінал)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Зупинено (сигнал)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Перевищене обмеження на процесорний час"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Перевищений межа розміру файла"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Віртуальний час минув"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Час профілювання минув"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Вікно змінено"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Продовжено"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Умова екстреного вводу/виводу"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "Можливий ввід/вивід"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Ресурс втрачено"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Сигнал небезпеки"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Запит інформації"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Допоміжний процесор для обчислень з рухомою комою недоступний"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1984,7 +2031,7 @@ msgstr ""
 "\n"
 "%s немає буферів strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1995,27 +2042,27 @@ msgstr ""
 "Буфери strcache %s: %lu (%lu) / рядків = %lu / сховище = %lu Б / сер = %lu "
 "Б\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
 "Поточний буфер %s: розмір = %hu Б / використано = %hu Б / кількість = %hu / "
-"сер = %hu Б\n"
+"сер = %u Б\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "Інше використане %s: загалом = %lu B / кількість = %lu / сер = %lu Б\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "Інше вільне %s: загалом = %lu Б / макс = %lu Б / мін = %lu Б / сер = %hu Б\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2024,7 +2071,7 @@ msgstr ""
 "\n"
 "Швидкодія strcache %s: циклів пошуку = %lu / відсоток знайденого = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2032,44 +2079,44 @@ msgstr ""
 "# статистика щодо таблиці хешів:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "автоматична"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "типовий"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "визначена у середовищі"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "файл make"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "заданий ключ -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "визначена у командному рядку"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "Директива «override»"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (з \"%s\", рядок %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# стан змінних у хеш-таблиці:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2077,7 +2124,7 @@ msgstr ""
 "\n"
 "# Змінні\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2085,7 +2132,7 @@ msgstr ""
 "\n"
 "# Специфічні для зразка значення змінних"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2093,7 +2140,7 @@ msgstr ""
 "\n"
 "# Немає специфічних для зразка значень змінних."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2102,48 +2149,48 @@ msgstr ""
 "\n"
 "# %u специфічних для зразка значень змінних"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "попередження: невизначена змінна \"%.*s\""
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() повернуто код помилки %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr ""
 "-попередження, ймовірно, вам варто повторно увімкнути обробку CTRL-Y з DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "ВБУДОВАНИЙ CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Дописати виведенні дані до %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Дописати %.*s і спорожнити\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Замість заданого виконується %s\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2151,11 +2198,11 @@ msgstr ""
 "\n"
 "# Шляхи пошуку VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Не визначено шлях пошуку \"vpath\"."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2164,7 +2211,7 @@ msgstr ""
 "\n"
 "# %u шляхи пошуку \"vpath\".\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2172,7 +2219,7 @@ msgstr ""
 "\n"
 "# Не визначено загальний шлях пошуку (змінна \"VPATH\")."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2182,17 +2229,17 @@ msgstr ""
 "# Загальний шлях пошуку (змінна \"VPATH\"):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Слоти сервера завдань обмежено значенням %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "створюємо семафор сервера завдань: (помилка %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
@@ -2200,21 +2247,45 @@ msgstr ""
 "внутрішня помилка: не вдалося відкрити семафор сервера завдань «%s»: "
 "(помилка %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Клієнт сервера завдань (семафор %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "спускаємо семафор сервера завдань: (Помилка %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "очіккування семафора або дочірнього процесу: (помилка %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: не знайдено команди\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: не знайдено команди\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Командний процесор не знайдений"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s призупиняється на 30 секунд..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "виконано sleep(30). Продовжуємо.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Невідома помилка %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Увага: Файл \"%s\" має майбутній час зміни"
+
+#~ msgid " terminal."
+#~ msgstr "."
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: спроба виконання рецепта для мети «%s» зазнала невдачі"
 
index da4099b53cc60649b3843d13cd7a8b1d42077a83..53aac6bfe510dec5e60146c2907e057d2a755003 100644 (file)
Binary files a/po/vi.gmo and b/po/vi.gmo differ
index 6c12dc4b923e0aac580c31449835db992ffb2795..29fc1f2a8883c88ad3c3fca90a3b370de52fc89d 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
 # This file is distributed under the same license as the make package.
 # Clytie Siddall <clytie@riverland.net.au>, 2006-2010.
 # Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2012.
-# Trần Ngọc Quân <vnwildman@gmail.com>, 2012-2014, 2016.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2012-2014, 2016, 2020.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.2\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-05-23 07:10+0700\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-04 15:04+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
 "Language: vi\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Language-Team-Website: <http://translationproject.org/team/vi.html>\n"
-"X-Generator: Gtranslator 2.91.7\n"
+"X-Generator: Poedit 2.2.4\n"
 "X-Poedit-SourceCharset: UTF-8\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "đã dùng tính năng chưa được hỗ trợ: “%s”"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "“touch” thành viên kho không có trên VMS"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch: Kho “%s” không tồn tại"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch: “%s” không phải là kho hợp lệ"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch: Thành viên “%s” không tồn tại trong “%s”"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch: Gặp mã trả lại sai từ ar_member_touch trên “%s”"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr ""
 "lbr$set_module() đã không giải nén thông tin về mô-đun, trạng thái = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() bị lỗi với trạng thái = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "không thể mở thư viện “%s” để tra tìm thành viên “%d”"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "Thành viên “%s”%s: %ld byte tại %ld (%ld).\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (có lẽ tên đã bị cắt ngắn)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  Ngày %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d, gid = %d, chế độ = 0%o.\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "Công thức có quá nhiều dòng (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** Ngắt.\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] Thành phần kho “%s” có thể là giả; chưa bị xóa bỏ"
 
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** Thành viên kho “%s” có thể là giả; chưa bị xóa bỏ"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] Đang xóa tập tin “%s”"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** Đang xóa tập tin “%s”"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  công thức cần thực hiện"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (dựng-sẵn):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (từ “%s”, dòng %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -137,219 +139,219 @@ msgstr ""
 "\n"
 "# Thư mục\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s: không thể lấy thống kê.\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (khóa %s, mtime %ull): không thể mở.\n"
+msgstr "# %s (khóa %s, mtime %I64u): không thể mở.\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (thiết bị %d, nút thông tin [%d,%d,%d]): không thể mở.\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (thiết bị %ld, nút thông tin %ld): không thể mở.\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (khóa %s, mtime %ull): "
+msgstr "# %s (khóa %s, mtime %I64u): "
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (thiết bị %d, inode [%d,%d,%d]): "
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (thiết bị %ld, inode %ld): "
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "Không"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " tập tin, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "không"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " việc không thể làm được"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " cho đến giờ."
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " việc không thể làm được trong %lu thư mục.\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "Biến đệ quy “%s” (cuối cùng) lại tham chiếu đến chính nó"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "tham chiếu biến chưa chấm dứt"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "Công thức được chỉ định cho tập tin “%s” tại %s:%lu,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "Tìm thấy công thức cho tập tin “%s” nhờ quy tắc tìm kiếm ngầm,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "nhưng “%s” bây giờ được cũng được xem là cùng tập tin “%s”."
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
 msgstr ""
 "Công thức cho “%s” sẽ bị bỏ qua trong sự chấp thuận của một cái cho “%s”."
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "không thể đổi tên “%s” hai chấm đơn thành “%s” hai chấm đôi"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "không thể đổi tên “%s” hai chấm đôi thành “%s” hai chấm đơn"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** Đang xóa tập tin trung gian “%s”"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "Xóa các tập tin trung gian…\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "Giờ hiện tại"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s: Thời gian của tập tin ở ngoài phạm vi nên thay thế bằng %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# Không phải là đích:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  Tập tin giá trị (điều kiện tiên quyết của .PRECIOUS)."
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  Đích giả (điều kiện tiên quyết của .PHONY)."
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  Đích dòng lệnh."
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  Mặc định, MAKEFILES, hoặc makefile kiểu -include/sinclude."
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  Quy tắc dựng sẵn"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  Hoàn tất tìm quy tắc ngầm."
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  Chưa hoàn tất tìm quy tắc ngầm."
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  Cuống mẫu ngầm/tĩnh: “%s”\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  Tập tin là một điều kiện tiên quyết trung gian."
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  Cũng tạo:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  Chưa kiểm tra giờ sửa đổi."
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  Tập tin không tồn tại."
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  Tập tin rất cũ."
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  Lần sửa cuối cùng %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  Tập tin đã được cập nhật."
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  Tập tin chưa được cập nhật."
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  Công thức đang chạy (ĐÂY LÀ MỘT LỖI)."
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  Công thức phụ thuộc đang chạy (ĐÂY LÀ MỘT LỖI)."
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  Cập nhật thành công."
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  Cần được cập nhật (-q được đặt)."
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  Gặp lỗi khi cập nhật."
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  Gặp giá trị sai trong thành viên “command_state”!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -357,7 +359,7 @@ msgstr ""
 "\n"
 "# Tập tin"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -367,334 +369,342 @@ msgstr ""
 "# thống kê bảng băm tập tin:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s: Trường “%s” chưa được nhớ đệm: %s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "đối số thứ nhất không phải dạng số cho hàm “word”"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "đối số thứ nhất cho hàm “word” phải lớn hơn 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "đối số thứ nhất không phải số cho hàm “wordlist”"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "đối số thứ hai không phải số cho hàm “wordlist”"
 
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) gặp lỗi (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) gặp lỗi (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() bị lỗi (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() gặp lỗi\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "Dọn dẹp tập tin bó tạm %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file: thiết tên tập tin"
 
 # Variable: do not translate/ biến: đừng dịch
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "mở: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "ghi: %s: %s"
 
 # Variable: do not translate/ biến: đừng dịch
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "đóng: %s: %s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file: quá ít đối số"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read: %s: %s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
-msgstr "Tập tin: Thao tác tập tin không hợp lệ: %s"
+msgstr "tập tin: Thao tác tập tin không hợp lệ: %s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "không đủ số đối số (%d) cho hàm “%s”"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "chưa được viết mã thi hành trên hệ thống này: hàm “%s”"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "cuộc gọi chưa được chấm dứt cho hàm “%s”: thiếu “%c”"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "Tên hàm trống rỗng"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "Tên hàm không hợp lệ: %s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "Tên hàm quá dài: %s"
 
-#: function.c:2657
+#: src/function.c:2674
 #, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
 msgstr "Số lượng đối số tối thiểu (%u) là không hợp lệ cho hàm “%s”"
 
-#: function.c:2660
+#: src/function.c:2677
 #, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
 msgstr "Số lượng đối số tối đa (%u) là không hợp lệ cho hàm “%s”"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s: tùy chọn “%s” chưa rõ ràng\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s: tùy chọn “--%s” không nhận đối số\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s: tùy chọn “%c%s” không nhận đối số\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s: tùy chọn “%s” cần một đối số\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s: không nhận ra tùy chọn “--%s”\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s: không nhận ra tùy chọn “%c%s”\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s: tùy chọn không hợp lệ -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s: tùy chọn không hợp lệ -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s: tùy chọn cần một đối số -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s: tùy chọn “-W %s” chưa rõ ràng\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s: tùy chọn “-W %s” không nhận một đối số\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: Đang khai triển “%s”\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: Đang định giá “%s”\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "không thể cấp phát %lu byte cho bảng băm: hết bộ nhớ"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "Tải =%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "Tải =%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "Băm lại=%d, "
+msgid "Rehash=%u, "
+msgstr "Băm lại=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "Xung đột  =%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "Xung đột =%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "Tìm quy tắc ngầm cho “%s”.\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "Tìm quy tắc ngầm về thành phần kho cho “%s”.\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "Tránh quy tắc ngầm đệ quy.\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "Stem quá dài: “%.*s”.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "Stem quá dài: “%s%.*s”.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "Thử quy tắc mẫu với cuống “%.*s”.\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "Từ chối điều kiện tiên quyết không thể thỏa “%s”.\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "Từ chối điều kiện tiên quyết ngầm không thể “%s”.\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "Thử điều kiện tiên quyết quy tắc “%s”.\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "Thử điều kiện tiên quyết ngầm “%s”.\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "Tìm thấy điều kiện tiên quyết “%s” làm VPATH “%s”\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "Tìm quy tắc có tập tin trung gian “%s”.\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "Không thể tạo tập tin tạm\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
 msgstr " (đổ lõi)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (bỏ qua)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<dựng-sẵn>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s: %s] Lỗi %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** Đang đợi những công việc chưa hoàn tất…"
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "Tiến trình con còn sống %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (máy chủ)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "Đang mất tiến trình con %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "Đang thắng lại tiến trình con %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "Đang mất tiến trình con %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "Dọn dẹp tập tin bó tạm %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "Dọn dẹp tập tin bó tạm %s gặp lỗi (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "Bỏ tiến trình con %p PID %s%s khỏi xâu.\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "Đã giải phóng thẻ bài cho tiến trình con %p (%s).\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() gặp lỗi khi chạy tiến trình (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -703,96 +713,90 @@ msgstr ""
 "\n"
 "Đếm được %d đối số trong lần khởi chạy bị lỗi\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "Đặt tiến trình con %p (%s) PID %s%s vào xâu.\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "Đã lấy thẻ bài cho điều con  %p (%s).\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: đích “%s” không tồn tại"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s: cập nhật đích “%s”, cần bởi: %s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "không thể buộc giới hạn tải trên hệ điều hành này"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "không thể buộc giới hạn tải: "
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr ""
 "không thể xử lý thêm tập tin nào nữa: không thể nhân đôi đầu vào chuẩn\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr ""
 "không thể xử lý thêm tập tin nào nữa: không thể nhân đôi đầu ra chuẩn\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr ""
 "không thể xử lý thêm tập tin nào nữa: không thể nhân đôi đầu ra lỗi chuẩn\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "Không thể phục hồi đầu vào chuẩn\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "Không thể phục hồi đầu ra chuẩn\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "Không thể phục hồi đầu ra lỗi tiêu chuẩn\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "đặt điều con đã bắt là PID %s, vẫn còn đợi PID %s\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s: %s: Không tìm thấy lệnh\n"
-
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]: %s: Không tìm thấy lệnh\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s: Không tìm thấy chương trình hệ vỏ"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: cạn không gian dành cho biến môi trường"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL thay đổi (trước là “%s”, giờ là “%s”)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "Tạo tập tin bó lệnh tạm: %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -800,7 +804,7 @@ msgstr ""
 "Nội dung tập tin bó lệnh:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -809,57 +813,54 @@ msgstr ""
 "Nội dung tập tin bó lệnh:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (dòng %d) Ngữ cảnh shell sai (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[KIỂU] (--output-sync[=KIỂU]) chưa được cấu hình cho lần dịch này."
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "Gặp lỗi khi mở bảng ký hiệu toàn cục: %s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "Đối tượng %s đã được tải không được công bố là tương thích GPL"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "Gặp lỗi khi tải ký hiệu %s từ %s: %s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "Tên ký hiệu là trống rỗng cho việc tải: %s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "Đang tải ký hiệu %s từ %s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
-msgstr "không hỗ trợ thao tác “load” trên hệ thống này."
+msgstr "Không hỗ trợ thao tác “load” trên hệ thống này."
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "Tùy chọn:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      Bỏ qua để tương thích.\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           Tạo mọi đích vô điều kiện.\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
@@ -867,17 +868,17 @@ msgstr ""
 "  -C THƯ_MỤC, --directory=THƯ_MỤC\n"
 "                              Chuyển sang THƯ MỤC này trước khi làm.\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          In rất nhiều thông tin gỡ rối.\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr ""
 "  --debug[=CỜ…]               In nhiều loại thông tin gỡ rối khác nhau.\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -885,13 +886,13 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              Biến môi trường đè tập tin makefile.\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
 msgstr ""
-"  --eval=CHUỖI                Định lượng CHUỖI như một lệnh makefile.\n"
+"  -E STRING, --eval=CHUỖI      Định lượng CHUỖI như một lệnh makefile.\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -899,15 +900,15 @@ msgstr ""
 "  -f TẬP-TIN, --file=TẬP-TIN, --makefile=TẬP-TIN\n"
 "                              Đọc TẬP-TIN dạng makefile.\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  Hiển thị trợ giúp này và thoát.\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         Bỏ qua lỗi từ công thức.\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
@@ -915,7 +916,7 @@ msgstr ""
 "  -I THƯ_MỤC, --include-dir=THƯ_MỤC\n"
 "                              Quét THƯ-MỤC này tìm makefile con.\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
@@ -923,12 +924,12 @@ msgstr ""
 "  -j [N], --jobs[=N]          Cho phép N công việc đồng thời; không có đối "
 "số thì vô hạn.\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr "  -k, --keep-going            Cứ tiếp tục khi không thể tạo đích.\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -937,14 +938,14 @@ msgstr ""
 "  -l [SỐ], --load-average[=N], --max-load[=N]\n"
 "                              Chỉ chạy nhiều công việc nếu tải dưới N.\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 "  -L, --check-symlink-times   Dùng mtime mới nhất giữa liên kết và đích.\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -953,7 +954,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Không chạy công thức; chỉ in chúng ra.\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -962,7 +963,7 @@ msgstr ""
 "  -o TẬP-TIN, --old-file=TẬP-TIN, --assume-old=TẬP-TIN\n"
 "                              Coi TẬP-TIN là rất cũ và không tạo lại.\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -971,30 +972,34 @@ msgstr ""
 "                              Đồng bộ hóa kết xuất công việc song song theo "
 "KIỂU.\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       In cơ sở dữ liệu nội bộ của make.\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
 "  -q, --question              Không chạy; mã thoát là \"đã cập nhật\".\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      Tắt quy tắc ngầm dựng sẵn.\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  Tắt đặt biến dựng sẵn.\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       Không in lại công thức.\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr "  --no-silent                 In ra công thức (tắt chế độ --silent).\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -1002,30 +1007,30 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              Tắt -k.\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr "  -t, --touch                 Chạm đích thay vì tạo lại.\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     Hiển thị thông tin dấu vết.\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               Hiển thị phiên bản make rồi thoát.\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       Hiển thị thư mục hiện thời.\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr "  --no-print-directory        Tắt -w, thậm chí nếu được bật ngầm.\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1033,33 +1038,34 @@ msgstr ""
 "  -W TẬP-TIN, --what-if=TẬP-TIN, --new-file=TẬP-TIN, --assume-new=TẬP-TIN\n"
 "                              Giả định TẬP-TIN là mới vô hạn.\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr ""
 "  --warn-undefined-variables  Cảnh báo tham chiếu đến biến chưa xác định.\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "chuỗi rỗng không hợp lệ làm tên tập tin"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "không hiểu đặc tả cấp gỡ rối “%s”"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "không hiểu kiểu output-sync “%s”"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s: Bắt được ngắt/ngoại lệ (mã = 0x%lx, địa chỉ = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1074,135 +1080,145 @@ msgstr ""
 "ExceptionFlags (các cờ ngoại lệ) = %lx\n"
 "ExceptionAddress (địa chỉ ngoại lệ) = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "Vi phạm truy cập: thao tác ghi tại địa chỉ 0x%p\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "Vi phạm truy cập: thao tác đọc tại địa chỉ 0x%p\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() đang đặt default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell() đã quét đường dẫn thì đặt default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s đang ngưng trong 30 giây…"
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "đã ngủ(30). Tiếp tục.\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr ""
 "cảnh báo: trình jobserver không sẵn sàng: dùng -j1. Thêm “+” vào quy tắc "
 "make cha."
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "cảnh báo: -jN bị ép buộc trong make con: tắt chế độ jobserver."
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr ""
+"cảnh báo: -j%d bị ép buộc trong make con: đang đặt lại chế độ jobserver."
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "Tập tin makefile từ đầu vào chuẩn được ghi hai lần."
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (tập tin tạm)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (tập tin tạm)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr ""
+"cảnh báo: -j%d bị ép buộc trong make con: đang đặt lại chế độ jobserver."
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "Không hỗ trợ công việc song song (-j) trên hệ thống này."
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "Đặt lại thành chế độ công việc đơn (-j1)."
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
 msgstr "Không hỗ trợ liên kết mềm: tắt -L."
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "Cập nhật makefile…\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Makefile “%s” bị lặp; không tạo lại nó.\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "Gặp lỗi khi làm lại makefile “%s”."
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "Không tìm thấy makefile bao gồm “%s”."
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
-msgstr "Không tìm thấy makefile “%s”."
+msgstr "Không tìm thấy makefile “%s”"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "Không thể chuyển về thư mục gốc."
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "Thực hiện lại[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "unlink (bỏ liên kết tập tin tạm): "
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL chứa nhiều đích"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "Chưa chỉ định đích, và không tìm thấy makefile"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "Không có đích"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "Chưa chỉ định đích, và không tìm thấy makefile"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "Đang cập nhật đích mong muốn…\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr ""
 "cảnh báo: Phát hiện lệch giờ. Bản dịch của bạn có thể không hoàn thiện."
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "Cách dùng: %s [các_tùy_chọn] [đích] …\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1211,7 +1227,7 @@ msgstr ""
 "\n"
 "Chương trình này đã được dịch cho %s\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1220,34 +1236,34 @@ msgstr ""
 "\n"
 "Chương trình này đã được dịch cho %s (%s)\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr ""
 "Hãy thông báo lỗi cho <bug-make@gnu.org>\n"
 "Hãy thông báo lỗi dịch cho <http://translationproject.org/team/vi.html>.\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "tùy chọn “%s%s” cần một đối số là chuỗi khác rỗng"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "tùy chọn “-%c” cần một đối số số nguyên dương"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%sĐược biên dịch cho %s\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%sĐược biên dịch cho %s (%s)\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1260,7 +1276,7 @@ msgstr ""
 "%sĐây là phần mềm tự do: bạn có quyền sửa đổi và phát hành lại nó.\n"
 "%sKHÔNG CÓ BẢO HÀNH GÌ CẢ, với điều kiện được pháp luật cho phép.\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1269,7 +1285,7 @@ msgstr ""
 "\n"
 "# Cơ sở dữ liệu Make, in lúc %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1278,347 +1294,383 @@ msgstr ""
 "\n"
 "# Hoàn tất cơ sở dữ liệu Make lúc %s\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "Lỗi chưa biết %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: người dùng %lu (thật %lu), nhóm %lu (thật %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "Truy cập đã được khởi tạo"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "Truy cập người dùng"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Truy cập Make"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "Truy cập con"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: Vào thư mục lạ\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: Rời khỏi thư mục lạ\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: Vào thư mục “%s”\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: Rời thư mục “%s”\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: Vào thư mục chưa biết\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: Rời khỏi thư mục lạ\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: Vào thư mục “%s”\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: Rời khỏi thư mục “%s”\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "lỗi ghi: đầu ra tiêu chuẩn"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr ".  Dừng.\n"
 
 # Variable: don't translate / Biến: đừng dịch
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
 # Variable: do not translate/ biến: đừng dịch
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[KIỂU] (--output-sync[=KIỂU]) chưa được cấu hình cho lần dịch này."
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "tạo ống dẫn công việc"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "nhân bản ống dẫn công việc"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
 msgstr "khởi tạo đường ống “jobserver”"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "lỗi nội bộ: gặp chuỗi --jobserver-auth “%s” không hợp lệ"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
 msgstr "Ứng dụng khách jobserver (fds %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "đường ống “jobserver”"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "ghi lại trình phục vụ công việc"
 
-#: posixos.c:268
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "tắt máy phục vụ công việc"
+
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect (chọn tiến trình?) ống dẫn công việc"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "đọc ống dẫn công việc"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "Đang đọc makefile…\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "Đang đọc makefile “%s”"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (không có mục đích mặc định)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (đường dẫn tìm kiếm)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (không quan tâm)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (không nối thêm ~)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "Bỏ qua “UTF-8 BOM” trong makefile “%s”\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "Bỏ qua “UTF-8 BOM” trong bộ đệm của tập tin makefile\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "cú pháp không hợp lệ trong biểu thức điều kiện"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: gặp lỗi khi tải"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "công thức bắt đầu trước đích thứ nhất"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "thiếu quy tắc trước công thức"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr ""
 "thiếu dấu phân cách (bạn đã định dùng TAB thay vì 8 khoảng trắng phải không?)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
 msgstr "thiếu dấu phân cách"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "thiếu mẫu đích"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "nhiều mẫu đích"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "mẫu đích không chứa “%%”"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "thiếu chỉ thị “endif”"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "tên biến rỗng"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "gặp các ký tự thừa đằng sau chỉ thị “define”"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "thiếu “endef”, chỉ thị “define” chưa hoàn thiện"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "gặp các ký tự thừa đằng sau chỉ thị “endef”"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "gặp các ký tự thừa đằng sau chỉ thị “%s”"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "gặp “%s” thừa"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "chỉ cho phép một “else” cho mỗi biểu thức điều kiện"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "Định nghĩa biến đích riêng biệt bị hỏng"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "không thể định nghĩa điều kiện tiên quyết cho công thức"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "các đích đã nhóm phải cung cấp một công thức"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "trộn lẫn quy tắc ngầm và mẫu tĩnh"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "trộn quy tắc ngầm và thường"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "đích “%s” không tương ứng với mẫu đích"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
-msgstr "tập tin đích “%s” có cả hai mục nhập : và ::"
+msgstr "tập tin đích “%s” có cả hai hạng mục : và ::"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
 msgstr "đích “%s” có nhiều hơn một trong cùng một quy tắc"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "cảnh báo: đè công thức cho đích “%s”"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "cảnh báo: bỏ qua công thức cũ cho đích “%s”"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** trộn quy tắc ngầm và thường: cú pháp này đã lạc hậu"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "cảnh báo: đè thành viên nhóm cho đích “%s”"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "cảnh báo: thấy ký tự NUL; bỏ qua phần còn lại của dòng"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "Không cần làm gì cho “%s”."
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "“%s” đã cập nhật rồi."
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "Xén bớt tập tin “%s”.\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%sKhông có quy tắc để tạo đích “%s”, cần bởi “%s”%s"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%sKhông có quy tắc để tạo đích “%s”%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "Coi tập tin đích “%s”.\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "Vừa thử và thất bại khi cập nhật “%s”.\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "Coi tập tin “%s” là đã sẵn có rồi.\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "Vẫn đang cập nhật tập tin “%s”.\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "Hoàn tất cập nhật tập tin “%s”.\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "Tập tin “%s” không tồn tại.\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
@@ -1626,148 +1678,148 @@ msgstr ""
 "*** Cảnh báo: tập tin .LOW_RESOLUTION_TIME “%s” có nhãn thời gian độ phân "
 "giải cao"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "Tìm thấy quy tắc ngầm cho “%s”.\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "Không tìm thấy quy tắc ngầm cho “%s”.\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "Dùng công thức mặc định cho “%s”.\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "Bỏ phụ thuộc vòng tròn %s <- %s."
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "Hoàn tất điều kiện tiên quyết của tập tin đích “%s”.\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "Đang tạo điều kiện tiên quyết của “%s”.\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "Chịu thua tập tin đích “%s”.\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "Đích “%s” không được tạo lại do lỗi."
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "Điều kiện tiên quyết “%s” là order-only (chỉ thứ tự) cho đích “%s”.\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "Điều kiện tiên quyết “%s” của đích “%s” không tồn tại.\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "Điều kiện tiên quyết “%s” là mới hơn đích “%s” .\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "Điều kiện tiên quyết “%s” cũ hơn đích “%s” .\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "Đích “%s” là hai chấm đôi và không có điều kiện tiên quyết.\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr ""
 "Không có công thức cho “%s” và chưa thay đổi điều kiện tiên quyết nào.\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "Tạo “%s” do cờ “always-make”.\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "Không cần tạo lại đích “%s”."
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr "; dùng tên VPATH “%s”"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "Phải tạo lại đích “%s”.\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  Bỏ qua tên VPATH “%s”.\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "Đang chạy công thức của “%s”.\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "Gặp lỗi khi tạo lại được tập tin đích “%s”.\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "Tạo lại thành công tập tin đích “%s”.\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "Tập tin đích “%s” cần được tạo lại dưới tùy chọn “-q”.\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "Dùng lệnh mặc định cho “%s”.\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "Cảnh báo: Tập tin “%s” có giờ sửa đổi ở thì tương lai."
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
-msgstr "Cảnh báo: Tập tin “%s” có giờ sửa đổi %s giây trong thì tương lai."
+msgstr "Cảnh báo: Tập tin “%s” có giờ sửa đổi %s giây trong thì tương lai"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr "Phần tử .LIBPATTERNS “%s” không phải là một mẫu"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "Phần tùy chỉnh không xuất được: %s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
@@ -1775,7 +1827,7 @@ msgstr ""
 "\n"
 "# Quy tắc ngầm"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1783,183 +1835,179 @@ msgstr ""
 "\n"
 "# Không có quy tắc ngầm."
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u quy tắc ngầm, %u"
+"# %u quy tắc ngầm, %u (%.1f%%) đầu cuối."
 
-#: rule.c:523
-msgid " terminal."
-msgstr " thiết bị cuối."
-
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "LỖI: num_pattern_rules không đúng!  %u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "tín hiệu lạ"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "Treo"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "Ngắt"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "Thoát"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "Chỉ lệnh không hợp lệ"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "Bẫy vết/điểm ngắt"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
 msgstr "Bị hủy bỏ"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "Bẫy IOT"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "Bẫy EMT"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "Ngoại lệ dấu chấm động"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "Bị buộc kết thúc"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "Lỗi bus"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "Lỗi phân đoạn"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "Lệnh gọi hệ thống sai"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "Ống dẫn hỏng"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "Đồng hồ báo động"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "Đã chấm dứt"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "Tín hiệu tự định nghĩa 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "Tín hiệu tự định nghĩa 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "Tiến trình con đã thoát"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "Mất điện đột ngột"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "Bị ngừng"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "Bị ngừng (đầu vào tty)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "Bị ngừng (đầu ra tty)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "Bị ngừng (tín hiệu)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "Vượt giới hạn thời gian CPU"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "Vượt giới hạn kích cỡ tập tin"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "Bộ đếm thời gian ảo đã hết hạn"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "Hết hạn đếm thời gian khi theo dõi cách sử dụng tiềm năng hệ thống"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "Cửa sổ bị thay đổi"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "Đã tiếp tục"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "Điều kiện I/O khẩn cấp"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O có thể"
 
 # Literal: don't translate / Nghĩa chữ: đừng dịch
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
 # Literal: don't translate / Nghĩa chữ: đừng dịch
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "Tài nguyên bị mất"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "Tín hiệu nguy hiểm"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "Yêu cầu thông tin"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "Không có bộ đồng xử lý số thực dấu chấm động"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1968,7 +2016,7 @@ msgstr ""
 "\n"
 "%s Không có bộ đệm strcache\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1979,20 +2027,20 @@ msgstr ""
 "%s bộ đệm strcache:  %lu (%lu) / chuỗi   = %lu / lưu     = %lu B / t.bình = "
 "%lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
 msgstr ""
-"%s đệm hiện tại: kcỡ = %hu B / đã dùng = %hu B / slượng = %hu / tbình = %hu "
+"%s đệm hiện tại: kcỡ = %hu B / đã dùng = %hu B / slượng = %hu / tbình = %u "
 "B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s được dùng khác: tổng = %lu B / s.lượng = %lu / t.bình = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
@@ -2000,7 +2048,7 @@ msgstr ""
 "%s trống khác:  tổng = %lu B / tđa = %lu B / t.thiểu = %lu B / t.bình = %hu "
 "B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -2009,7 +2057,7 @@ msgstr ""
 "\n"
 "%s hiệu năng strcache:   tra cứu = %lu / tỷ lệ trúng = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -2017,44 +2065,44 @@ msgstr ""
 "# thống kê bảng băm tập tin:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "tự động"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "mặc định"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "môi trường"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "môi trường với -e"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "dòng lệnh"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "chỉ thị “override”"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (từ “%s”, dòng %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# thống kê bảng băm biến được đặt:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2062,7 +2110,7 @@ msgstr ""
 "\n"
 "# Biến\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2070,15 +2118,15 @@ msgstr ""
 "\n"
 "# Giá trị biến đặc tả cho mẫu"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
 msgstr ""
 "\n"
-"# Không có giá trị biến đặc tả cho mẫu"
+"# Không có giá trị biến đặc tả cho mẫu."
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2087,47 +2135,47 @@ msgstr ""
 "\n"
 "# %u giá trị biến đặc tả cho mẫu"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "cảnh báo: biến “%.*s” chưa được định nghĩa"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() gặp lỗi với %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-warning, có lẽ bạn cần phải bật lại xử lý CTRL-Y từ DCL.\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BUILTIN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL: %s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "Nối thêm đầu ra vào %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "Nối thêm %.*s và dọn dẹp\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "Thực hiện %s để thay thế\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2135,11 +2183,11 @@ msgstr ""
 "\n"
 "# Đường dẫn tìm kiếm VPATH\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# Không có đường dẫn tìm kiếm “vpath”."
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2148,7 +2196,7 @@ msgstr ""
 "\n"
 "# %u đường dẫn tìm kiếm “vpath”.\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2156,7 +2204,7 @@ msgstr ""
 "\n"
 "# Không có đường dẫn tìm kiếm chung (biến “VPATH”)."
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2166,38 +2214,62 @@ msgstr ""
 "# Đường dẫn tìm kiếm chung (biến “VPATH”):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
 msgstr "Khe jobserver bị giới hạn thành %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "đang tạo tín hiệu jobserver: (Lỗi %ld: %s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr ""
 "lỗi nội tại: không thể mở cờ hiệu máy phục vụ công việc “%s”: (Lỗi %ld: %s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
 msgstr "Ứng dụng khách jobserver (cờ hiệu %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "giải phóng tín hiệu jobserver: (Lỗi %ld: %s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "chờ tín hiệu hay tiến trình con: (Lỗi %ld: %s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s: %s: Không tìm thấy lệnh\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]: %s: Không tìm thấy lệnh\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s: Không tìm thấy chương trình hệ vỏ"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s đang ngưng trong 30 giây…"
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "đã ngủ(30). Tiếp tục.\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "Lỗi chưa biết %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "Cảnh báo: Tập tin “%s” có giờ sửa đổi ở thì tương lai."
+
+#~ msgid " terminal."
+#~ msgstr " thiết bị cuối."
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: công thức cho đích “%s” gặp lỗi"
 
index d1abf7997795ef59d10a955f9ff1106b41ba30b0..233ca38448a8062d13e883d8719553d368c28e5c 100644 (file)
Binary files a/po/zh_CN.gmo and b/po/zh_CN.gmo differ
index a1ad5b842b110968b1c894ebb0a0e155a2192d8f..2d15ff498edebeceab31fa0d345fbefbabc41d1b 100644 (file)
 # Wang Li <charles@linux.net.cn>, 2002.
 # LI Daobing <lidaobing@gmail.com>, 2008, 2013.
 # Mingye Wang <arthur200126@gmail.com>, 2015, 2016.
+# Boyuan Yang <073plan@gmail.com>, 2018, 2019.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: make 4.1.90\n"
+"Project-Id-Version: make 4.2.93\n"
 "Report-Msgid-Bugs-To: bug-make@gnu.org\n"
-"POT-Creation-Date: 2016-06-10 19:03-0400\n"
-"PO-Revision-Date: 2016-04-25 13:32-0400\n"
-"Last-Translator: Mingye Wang (Arthur2e5) <arthur200126@gmail.com>\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-05 15:27-0500\n"
+"Last-Translator: Boyuan Yang <073plan@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
 "Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.7\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 2.2.4\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
 
-#: ar.c:46
+#: src/ar.c:46
 #, c-format
 msgid "attempt to use unsupported feature: '%s'"
 msgstr "试图使用不支持的功能:“%s”"
 
-#: ar.c:123
+#: src/ar.c:123
+#, c-format
 msgid "touch archive member is not available on VMS"
 msgstr "VMS 系统上不支持 touch 归档成员"
 
-#: ar.c:147
+#: src/ar.c:147
 #, c-format
 msgid "touch: Archive '%s' does not exist"
 msgstr "touch:归档文件“%s”不存在"
 
-#: ar.c:150
+#: src/ar.c:150
 #, c-format
 msgid "touch: '%s' is not a valid archive"
 msgstr "touch:“%s”不是合法的归档文件"
 
-#: ar.c:157
+#: src/ar.c:157
 #, c-format
 msgid "touch: Member '%s' does not exist in '%s'"
 msgstr "touch:在“%2$s”中不存在成员“%1$s”"
 
-#: ar.c:164
+#: src/ar.c:164
 #, c-format
 msgid "touch: Bad return code from ar_member_touch on '%s'"
 msgstr "touch:“%s”上的 ar_member_touch 的返回码不当"
 
-#: arscan.c:130
+#: src/arscan.c:130
 #, c-format
 msgid "lbr$set_module() failed to extract module info, status = %d"
 msgstr "lbr$set_modules() 获取模块信息失败,返回状态 = %d"
 
-#: arscan.c:236
+#: src/arscan.c:236
 #, c-format
 msgid "lbr$ini_control() failed with status = %d"
 msgstr "lbr$ini_control() 失败,返回状态 = %d"
 
-#: arscan.c:261
+#: src/arscan.c:261
 #, c-format
 msgid "unable to open library '%s' to lookup member status %d"
 msgstr "无法打开库“%s”以寻找成员,状态 %d"
 
-#: arscan.c:965
+#: src/arscan.c:944
 #, c-format
 msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
 msgstr "成员“%s”%s: %ld 字节于 %ld (%ld)。\n"
 
-#: arscan.c:966
+#: src/arscan.c:945
 msgid " (name might be truncated)"
 msgstr " (名称可能被截断)"
 
-#: arscan.c:968
+#: src/arscan.c:947
 #, c-format
 msgid "  Date %s"
 msgstr "  日期 %s"
 
-#: arscan.c:969
+#: src/arscan.c:948
 #, c-format
 msgid "  uid = %d, gid = %d, mode = 0%o.\n"
 msgstr "  uid = %d,gid = %d,mode = 0%o。\n"
 
-#: commands.c:402
+#: src/commands.c:403
 #, c-format
 msgid "Recipe has too many lines (%ud)"
 msgstr "命令配方行数太多 (%ud)"
 
-#: commands.c:503
+#: src/commands.c:504
 msgid "*** Break.\n"
 msgstr "*** 中断。\n"
 
-#: commands.c:627
+#: src/commands.c:628
 #, c-format
 msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
 msgstr "*** [%s] 归档成员“%s”可能是假的;未删除"
 
 # 是化学的成分,是特技!
-#: commands.c:631
+#: src/commands.c:632
 #, c-format
 msgid "*** Archive member '%s' may be bogus; not deleted"
 msgstr "*** 归档成员“%s”可能是假的;未删除"
 
-#: commands.c:645
+#: src/commands.c:646
 #, c-format
 msgid "*** [%s] Deleting file '%s'"
 msgstr "*** [%s] 正在删除文件“%s”"
 
-#: commands.c:647
+#: src/commands.c:648
 #, c-format
 msgid "*** Deleting file '%s'"
 msgstr "*** 正在删除文件“%s”"
 
-#: commands.c:683
+#: src/commands.c:684
 msgid "#  recipe to execute"
 msgstr "#  要执行的配方"
 
-#: commands.c:686
+#: src/commands.c:687
 msgid " (built-in):"
 msgstr " (内置):"
 
-#: commands.c:688
+#: src/commands.c:689
 #, c-format
 msgid " (from '%s', line %lu):\n"
 msgstr " (从“%s”,行 %lu):\n"
 
-#: dir.c:1069
+#: src/dir.c:1073
 msgid ""
 "\n"
 "# Directories\n"
@@ -134,218 +137,218 @@ msgstr ""
 "\n"
 "# 目录\n"
 
-#: dir.c:1081
+#: src/dir.c:1085
 #, c-format
 msgid "# %s: could not be stat'd.\n"
 msgstr "# %s:无法对其进行 stat 操作。\n"
 
-#: dir.c:1085
-#, fuzzy
+#: src/dir.c:1089
 msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
-msgstr "# %s (关键字 %s,修改时间 %d):无法打开。\n"
+msgstr "# %s (关键字 %s,修改时间 %I64u):无法打开。\n"
 
-#: dir.c:1090
+#: src/dir.c:1094
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
 msgstr "# %s (设备 %d,i-节点 [%d,%d,%d]):无法打开。\n"
 
-#: dir.c:1095
+#: src/dir.c:1099
 #, c-format
 msgid "# %s (device %ld, inode %ld): could not be opened.\n"
 msgstr "# %s (设备 %ld,i-节点 %ld):无法打开。\n"
 
-#: dir.c:1122
-#, fuzzy
+#: src/dir.c:1126
 msgid "# %s (key %s, mtime %I64u): "
-msgstr "# %s (关键字 %s,修改时间 %d):"
+msgstr "# %s (关键字 %s,修改时间 %I64u):"
 
-#: dir.c:1127
+#: src/dir.c:1131
 #, c-format
 msgid "# %s (device %d, inode [%d,%d,%d]): "
 msgstr "# %s (设备 %d,i-节点 [%d,%d,%d]):"
 
-#: dir.c:1132
+#: src/dir.c:1136
 #, c-format
 msgid "# %s (device %ld, inode %ld): "
 msgstr "# %s (设备 %ld,i-节点 %ld):"
 
-#: dir.c:1138 dir.c:1159
+#: src/dir.c:1142 src/dir.c:1163
 msgid "No"
 msgstr "无"
 
-#: dir.c:1141 dir.c:1162
+#: src/dir.c:1145 src/dir.c:1166
 msgid " files, "
 msgstr " 文件, "
 
-#: dir.c:1143 dir.c:1164
+#: src/dir.c:1147 src/dir.c:1168
 msgid "no"
 msgstr "无"
 
-#: dir.c:1146
+#: src/dir.c:1150
 msgid " impossibilities"
 msgstr " 不可能"
 
-#: dir.c:1150
+#: src/dir.c:1154
 msgid " so far."
 msgstr " 迄今为止。"
 
-#: dir.c:1167
+#: src/dir.c:1171
 #, c-format
 msgid " impossibilities in %lu directories.\n"
 msgstr " 不可能在 %lu 目录中。\n"
 
-#: expand.c:125
+#: src/expand.c:125
 #, c-format
 msgid "Recursive variable '%s' references itself (eventually)"
 msgstr "递归变量“%s”(最终将会)引用自身"
 
-#: expand.c:271
+#: src/expand.c:271
+#, c-format
 msgid "unterminated variable reference"
 msgstr "未终止的变量引用"
 
-#: file.c:278
+#: src/file.c:278
 #, c-format
 msgid "Recipe was specified for file '%s' at %s:%lu,"
 msgstr "关于文件“%s”的命令配方在 %s:%lu 处指定,"
 
-#: file.c:283
+#: src/file.c:283
 #, c-format
 msgid "Recipe for file '%s' was found by implicit rule search,"
 msgstr "关于文件“%s”的命令配方通过隐含规则搜索而找到,"
 
-#: file.c:287
+#: src/file.c:287
 #, c-format
 msgid "but '%s' is now considered the same file as '%s'."
 msgstr "但“%s”现在被看做“%s”的同一个文件。"
 
-#: file.c:290
+#: src/file.c:290
 #, c-format
 msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
-msgstr "“%s”的命令配方被忽略,转而使用“%s”的"
+msgstr "“%s”的命令配方被忽略,转而使用“%s”的"
 
-#: file.c:310
+#: src/file.c:310
 #, c-format
 msgid "can't rename single-colon '%s' to double-colon '%s'"
 msgstr "无法将单冒号“%s”重命名为双冒号“%s”"
 
-#: file.c:316
+#: src/file.c:316
 #, c-format
 msgid "can't rename double-colon '%s' to single-colon '%s'"
 msgstr "无法将双冒号“%s”重命名为单冒号“%s”"
 
-#: file.c:408
+#: src/file.c:408
 #, c-format
 msgid "*** Deleting intermediate file '%s'"
 msgstr "*** 正在删除中间文件“%s”"
 
-#: file.c:412
+#: src/file.c:412
+#, c-format
 msgid "Removing intermediate files...\n"
 msgstr "正在删除中间文件...\n"
 
-#: file.c:818
+#: src/file.c:872
 msgid "Current time"
 msgstr "当前时间"
 
-#: file.c:822
+#: src/file.c:876
 #, c-format
 msgid "%s: Timestamp out of range; substituting %s"
 msgstr "%s:时间标记超出范围;正在替换 %s"
 
-#: file.c:962
+#: src/file.c:1016
 msgid "# Not a target:"
 msgstr "# 不是一个目标:"
 
-#: file.c:967
+#: src/file.c:1021
 msgid "#  Precious file (prerequisite of .PRECIOUS)."
 msgstr "#  重要文件 (.PRECIOUS的前提)。"
 
-#: file.c:969
+#: src/file.c:1023
 msgid "#  Phony target (prerequisite of .PHONY)."
 msgstr "#  假目标 (.PHONY的前提)。"
 
-#: file.c:971
+#: src/file.c:1025
 msgid "#  Command line target."
 msgstr "#  命令行目标。"
 
-#: file.c:973
+#: src/file.c:1027
 msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
 msgstr "#  缺省的、MAKEFILES 指定的、-include/sinclude 包含的 makefile。"
 
-#: file.c:975
+#: src/file.c:1029
 msgid "#  Builtin rule"
 msgstr "#  内建规则"
 
-#: file.c:977
+#: src/file.c:1031
 msgid "#  Implicit rule search has been done."
 msgstr "#  对隐含规则的搜索已完成。"
 
-#: file.c:978
+#: src/file.c:1032
 msgid "#  Implicit rule search has not been done."
 msgstr "#  对隐含规则的搜索尚未完成。"
 
-#: file.c:980
+#: src/file.c:1034
 #, c-format
 msgid "#  Implicit/static pattern stem: '%s'\n"
 msgstr "#  隐含/静态模式主干:“%s”\n"
 
-#: file.c:982
+#: src/file.c:1036
 msgid "#  File is an intermediate prerequisite."
 msgstr "#  文件是一个中间前提。"
 
-#: file.c:986
+#: src/file.c:1040
 msgid "#  Also makes:"
 msgstr "#  还要制作:"
 
-#: file.c:992
+#: src/file.c:1046
 msgid "#  Modification time never checked."
 msgstr "#  从不检查修改时间。"
 
-#: file.c:994
+#: src/file.c:1048
 msgid "#  File does not exist."
 msgstr "#  文件不存在。"
 
-#: file.c:996
+#: src/file.c:1050
 msgid "#  File is very old."
 msgstr "#  文件非常陈旧。"
 
-#: file.c:1001
+#: src/file.c:1055
 #, c-format
 msgid "#  Last modified %s\n"
 msgstr "#  最近更新 %s\n"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has been updated."
 msgstr "#  文件已经被更新。"
 
-#: file.c:1004
+#: src/file.c:1058
 msgid "#  File has not been updated."
 msgstr "#  文件尚未被更新。"
 
-#: file.c:1008
+#: src/file.c:1062
 msgid "#  Recipe currently running (THIS IS A BUG)."
 msgstr "#  正在运行的配方 (这是 BUG)。"
 
-#: file.c:1011
+#: src/file.c:1065
 msgid "#  Dependencies recipe running (THIS IS A BUG)."
 msgstr "#  正在运行的依赖性配方 (这是 BUG)。"
 
-#: file.c:1020
+#: src/file.c:1074
 msgid "#  Successfully updated."
 msgstr "#  更新成功。"
 
-#: file.c:1024
+#: src/file.c:1078
 msgid "#  Needs to be updated (-q is set)."
 msgstr "#  需要更新 (用 -q 设定)。"
 
-#: file.c:1027
+#: src/file.c:1081
 msgid "#  Failed to be updated."
 msgstr "#  更新失败。"
 
-#: file.c:1032
+#: src/file.c:1086
 msgid "#  Invalid value in 'command_state' member!"
 msgstr "#  “command_state”成员中存在无效的值!"
 
-#: file.c:1051
+#: src/file.c:1105
 msgid ""
 "\n"
 "# Files"
@@ -353,7 +356,7 @@ msgstr ""
 "\n"
 "# 文件"
 
-#: file.c:1055
+#: src/file.c:1109
 msgid ""
 "\n"
 "# files hash-table stats:\n"
@@ -363,333 +366,341 @@ msgstr ""
 "# 文件杂凑表状态:\n"
 "# "
 
-#: file.c:1065
+#: src/file.c:1119
 #, c-format
 msgid "%s: Field '%s' not cached: %s"
 msgstr "%s:字段“%s”未被缓存:%s"
 
-#: function.c:790
+#: src/function.c:794
 msgid "non-numeric first argument to 'word' function"
 msgstr "“word”函数的第一个参数不是数字"
 
-#: function.c:795
+#: src/function.c:799
+#, c-format
 msgid "first argument to 'word' function must be greater than 0"
 msgstr "“word”函数的第一个参数必须大于 0"
 
-#: function.c:815
+#: src/function.c:819
 msgid "non-numeric first argument to 'wordlist' function"
 msgstr "“wordlist”函数的第一个参数不是数字"
 
-#: function.c:817
+#: src/function.c:821
 msgid "non-numeric second argument to 'wordlist' function"
 msgstr "“wordlist”函数的第二个参数不是数字"
 
 # 程序员的函数名提示,还是不要动吧。
-#: function.c:1525
+#: src/function.c:1533
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(In) 失败 (e=%ld)\n"
 
-#: function.c:1549
+#: src/function.c:1557
 #, c-format
 msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
 msgstr "windows32_openpipe: DuplicateHandle(Err) 失败 (e=%ld)\n"
 
-#: function.c:1556
+#: src/function.c:1564
 #, c-format
 msgid "CreatePipe() failed (e=%ld)\n"
 msgstr "CreatePipe() 失败 (e=%ld)\n"
 
-#: function.c:1564
+#: src/function.c:1572
+#, c-format
 msgid "windows32_openpipe(): process_init_fd() failed\n"
 msgstr "windows32_openpipe(): process_init_fd() 失败\n"
 
-#: function.c:1858
+#: src/function.c:1857
 #, c-format
 msgid "Cleaning up temporary batch file %s\n"
 msgstr "正在清除临时批处理文件 %s\n"
 
-#: function.c:2215 function.c:2240
+#: src/function.c:2230 src/function.c:2255
+#, c-format
 msgid "file: missing filename"
 msgstr "file:缺少文件名"
 
-#: function.c:2219 function.c:2250
+#: src/function.c:2234 src/function.c:2265
 #, c-format
 msgid "open: %s: %s"
 msgstr "open: %s: %s"
 
-#: function.c:2227
+#: src/function.c:2242
 #, c-format
 msgid "write: %s: %s"
 msgstr "write: %s: %s"
 
-#: function.c:2230 function.c:2267
+#: src/function.c:2245 src/function.c:2282
 #, c-format
 msgid "close: %s: %s"
 msgstr "close:%s:%s"
 
-#: function.c:2243
+#: src/function.c:2258
+#, c-format
 msgid "file: too many arguments"
 msgstr "file:太多参数"
 
-#: function.c:2262
+#: src/function.c:2277
 #, c-format
 msgid "read: %s: %s"
 msgstr "read:%s:%s"
 
-#: function.c:2275
+#: src/function.c:2290
 #, c-format
 msgid "file: invalid file operation: %s"
 msgstr "file:无效文件(file)操作:%s"
 
-#: function.c:2390
+#: src/function.c:2405
 #, c-format
 msgid "insufficient number of arguments (%d) to function '%s'"
 msgstr "函数“%2$s”的参数数量 (%1$d) 不够"
 
-#: function.c:2402
+#: src/function.c:2417
 #, c-format
 msgid "unimplemented on this platform: function '%s'"
 msgstr "在本平台上未实现:函数“%s”"
 
-#: function.c:2466
+#: src/function.c:2483
 #, c-format
 msgid "unterminated call to function '%s': missing '%c'"
 msgstr "对函数“%s”的未终止的调用:遗漏“%c”"
 
-#: function.c:2650
+#: src/function.c:2667
+#, c-format
 msgid "Empty function name"
 msgstr "空函数名"
 
-#: function.c:2652
+#: src/function.c:2669
 #, c-format
 msgid "Invalid function name: %s"
 msgstr "无效的函数名称:%s"
 
-#: function.c:2654
+#: src/function.c:2671
 #, c-format
 msgid "Function name too long: %s"
 msgstr "函数名称太长:%s"
 
-#: function.c:2657
-#, fuzzy, c-format
+#: src/function.c:2674
+#, c-format
 msgid "Invalid minimum argument count (%u) for function %s"
-msgstr "函数“%2$s”的最少参数数量 (%1$d) 无效"
+msgstr "函数“%2$s”的最少参数数量 (%1$u) 无效"
 
-#: function.c:2660
-#, fuzzy, c-format
+#: src/function.c:2677
+#, c-format
 msgid "Invalid maximum argument count (%u) for function %s"
-msgstr "函数“%2$s”的最多参数数量 (%1$d) 无效"
+msgstr "函数“%2$s”的最多参数数量 (%1$u) 无效"
 
-#: getopt.c:659
+#: src/getopt.c:659
 #, c-format
 msgid "%s: option '%s' is ambiguous\n"
 msgstr "%s:选项“%s”含义不清\n"
 
-#: getopt.c:683
+#: src/getopt.c:683
 #, c-format
 msgid "%s: option '--%s' doesn't allow an argument\n"
 msgstr "%s:选项“--%s”不允许参数\n"
 
-#: getopt.c:688
+#: src/getopt.c:688
 #, c-format
 msgid "%s: option '%c%s' doesn't allow an argument\n"
 msgstr "%s:选项“%c%s”不允许参数\n"
 
-#: getopt.c:705 getopt.c:878
+#: src/getopt.c:705 src/getopt.c:878
 #, c-format
 msgid "%s: option '%s' requires an argument\n"
 msgstr "%s:选项“%s”需要一个参数\n"
 
-#: getopt.c:734
+#: src/getopt.c:734
 #, c-format
 msgid "%s: unrecognized option '--%s'\n"
 msgstr "%s:无法识别的选项“--%s”\n"
 
-#: getopt.c:738
+#: src/getopt.c:738
 #, c-format
 msgid "%s: unrecognized option '%c%s'\n"
 msgstr "%s:无法识别的选项“%c%s”\n"
 
-#: getopt.c:764
+#: src/getopt.c:764
 #, c-format
 msgid "%s: illegal option -- %c\n"
 msgstr "%s:非法选项 -- %c\n"
 
-#: getopt.c:767
+#: src/getopt.c:767
 #, c-format
 msgid "%s: invalid option -- %c\n"
 msgstr "%s:非法选项 -- %c\n"
 
-#: getopt.c:797 getopt.c:927
+#: src/getopt.c:797 src/getopt.c:927
 #, c-format
 msgid "%s: option requires an argument -- %c\n"
 msgstr "%s:选项需要一个参数 -- %c\n"
 
-#: getopt.c:844
+#: src/getopt.c:844
 #, c-format
 msgid "%s: option '-W %s' is ambiguous\n"
 msgstr "%s:选项“-W %s”含义不清\n"
 
-#: getopt.c:862
+#: src/getopt.c:862
 #, c-format
 msgid "%s: option '-W %s' doesn't allow an argument\n"
 msgstr "%s:选项“-W %s”不允许给出参数\n"
 
-#: guile.c:58
+#: src/guile.c:58
 #, c-format
 msgid "guile: Expanding '%s'\n"
 msgstr "guile: 正拓展 '%s'\n"
 
-#: guile.c:74
+#: src/guile.c:74
 #, c-format
 msgid "guile: Evaluating '%s'\n"
 msgstr "guile: 正求值 '%s'\n"
 
-#: hash.c:49
+#: src/hash.c:50
 #, c-format
 msgid "can't allocate %lu bytes for hash table: memory exhausted"
 msgstr "无法为杂凑表分配 %lu 字节: 内存耗尽"
 
-#: hash.c:280
+#: src/hash.c:280
 #, c-format
-msgid "Load=%ld/%ld=%.0f%%, "
-msgstr "负载=%ld/%ld=%.0f%%, "
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "负载=%lu/%lu=%.0f%%, "
 
-#: hash.c:282
+#: src/hash.c:282
 #, c-format
-msgid "Rehash=%d, "
-msgstr "重新杂凑=%d, "
+msgid "Rehash=%u, "
+msgstr "重新杂凑=%u, "
 
-#: hash.c:283
+#: src/hash.c:283
 #, c-format
-msgid "Collisions=%ld/%ld=%.0f%%"
-msgstr "碰撞=%ld/%ld=%.0f%%"
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "碰撞=%lu/%lu=%.0f%%"
 
-#: implicit.c:38
+#: src/implicit.c:38
 #, c-format
 msgid "Looking for an implicit rule for '%s'.\n"
 msgstr "正在为“%s”寻找隐含规则。\n"
 
-#: implicit.c:54
+#: src/implicit.c:54
 #, c-format
 msgid "Looking for archive-member implicit rule for '%s'.\n"
 msgstr "正在为“%s”寻找归档成员隐含规则。\n"
 
-#: implicit.c:311
+#: src/implicit.c:311
+#, c-format
 msgid "Avoiding implicit rule recursion.\n"
 msgstr "避免隐含规则递归。\n"
 
-#: implicit.c:486
+#: src/implicit.c:484
 #, c-format
-msgid "Stem too long: '%.*s'.\n"
-msgstr "主干太长:'%.*s'.\n"
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "主干太长:'%s%.*s'.\n"
 
-#: implicit.c:491
+#: src/implicit.c:490
 #, c-format
 msgid "Trying pattern rule with stem '%.*s'.\n"
 msgstr "用主干“%.*s”尝试匹配模式规则。\n"
 
-#: implicit.c:697
+#: src/implicit.c:717
 #, c-format
 msgid "Rejecting impossible rule prerequisite '%s'.\n"
 msgstr "拒绝不可能的规则前提“%s”。\n"
 
-#: implicit.c:698
+#: src/implicit.c:718
 #, c-format
 msgid "Rejecting impossible implicit prerequisite '%s'.\n"
 msgstr "拒绝不可能的隐含前提“%s”。\n"
 
-#: implicit.c:711
+#: src/implicit.c:732
 #, c-format
 msgid "Trying rule prerequisite '%s'.\n"
 msgstr "尝试规则前提“%s”。\n"
 
-#: implicit.c:712
+#: src/implicit.c:733
 #, c-format
 msgid "Trying implicit prerequisite '%s'.\n"
 msgstr "尝试隐含前提“%s”。\n"
 
-#: implicit.c:751
+#: src/implicit.c:772
 #, c-format
 msgid "Found prerequisite '%s' as VPATH '%s'\n"
 msgstr "前提“%s”在 VPATH“%s”中发现\n"
 
-#: implicit.c:765
+#: src/implicit.c:786
 #, c-format
 msgid "Looking for a rule with intermediate file '%s'.\n"
 msgstr "正在寻找包含中间文件“%s”的规则。\n"
 
-#: job.c:363
+#: src/job.c:370
 msgid "Cannot create a temporary file\n"
 msgstr "无法创建临时文件\n"
 
-#: job.c:485
+#: src/job.c:548
 msgid " (core dumped)"
-msgstr " (core dumped)"
+msgstr " (核心已转储)"
 
-#: job.c:490
+#: src/job.c:553
 msgid " (ignored)"
 msgstr " (已忽略)"
 
-#: job.c:494 job.c:1828
+#: src/job.c:557 src/job.c:1892
 msgid "<builtin>"
 msgstr "<内置>"
 
-#: job.c:510
+#: src/job.c:573
 #, c-format
 msgid "%s[%s: %s] Error %d%s"
 msgstr "%s[%s:%s] 错误 %d%s"
 
-#: job.c:599
+#: src/job.c:662
+#, c-format
 msgid "*** Waiting for unfinished jobs...."
 msgstr "*** 正在等待未完成的任务...."
 
-#: job.c:629
+#: src/job.c:704
 #, c-format
 msgid "Live child %p (%s) PID %s %s\n"
 msgstr "活跃子进程 %p (%s) PID %s %s\n"
 
-#: job.c:631 job.c:833 job.c:952 job.c:1583
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
 msgid " (remote)"
 msgstr " (远程)"
 
-#: job.c:831
-#, c-format
-msgid "Reaping losing child %p PID %s %s\n"
-msgstr "正在中止失败的子进程 %p PID %s %s\n"
-
-#: job.c:832
+#: src/job.c:898
 #, c-format
 msgid "Reaping winning child %p PID %s %s\n"
 msgstr "正在中止获胜的子进程 %p PID %s %s\n"
 
-#: job.c:839
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "正在中止失败的子进程 %p PID %s %s\n"
+
+#: src/job.c:950
 #, c-format
 msgid "Cleaning up temp batch file %s\n"
 msgstr "正在清除临时批文件 %s\n"
 
-#: job.c:845
+#: src/job.c:956
 #, c-format
 msgid "Cleaning up temp batch file %s failed (%d)\n"
 msgstr "清理临时批处理文件 %s 失败 (%d)\n"
 
-#: job.c:951
+#: src/job.c:1071
 #, c-format
 msgid "Removing child %p PID %s%s from chain.\n"
 msgstr "从链中删除子进程 %p PID %s%s。\n"
 
-#: job.c:1006
+#: src/job.c:1120
 #, c-format
 msgid "Released token for child %p (%s).\n"
 msgstr "为子进程 %p (%s) 释放令牌 (token)。\n"
 
-#: job.c:1508 job.c:2201
+#: src/job.c:1575 src/job.c:2487
 #, c-format
 msgid "process_easy() failed to launch process (e=%ld)\n"
 msgstr "process_easy() 启动进程失败 (e=%ld)\n"
 
-#: job.c:1512 job.c:2205
+#: src/job.c:1579 src/job.c:2491
 #, c-format
 msgid ""
 "\n"
@@ -698,93 +709,87 @@ msgstr ""
 "\n"
 "失败执行中共有 %d 个参数。\n"
 
-#: job.c:1581
+#: src/job.c:1642
 #, c-format
 msgid "Putting child %p (%s) PID %s%s on the chain.\n"
 msgstr "将子进程 %p (%s) PID %s%s 放入链。\n"
 
-#: job.c:1811
+#: src/job.c:1875
 #, c-format
 msgid "Obtained token for child %p (%s).\n"
 msgstr "获得至进程 %p (%s) 的标记。\n"
 
-#: job.c:1838
+#: src/job.c:1902
 #, c-format
 msgid "%s: target '%s' does not exist"
 msgstr "%s: 目标文件“%s”不存在"
 
-#: job.c:1841
+#: src/job.c:1905
 #, c-format
 msgid "%s: update target '%s' due to: %s"
 msgstr "%s:更新“%s”,因为:%s"
 
-#: job.c:1956
+#: src/job.c:2108
+#, c-format
 msgid "cannot enforce load limits on this operating system"
 msgstr "无法在本操作系统中实施负载限制"
 
-#: job.c:1958
+#: src/job.c:2110
 msgid "cannot enforce load limit: "
 msgstr "无法实施负载限制:"
 
-#: job.c:2048
+#: src/job.c:2200
+#, c-format
 msgid "no more file handles: could not duplicate stdin\n"
 msgstr "没有剩余的文件句柄: 无法复制标准输入\n"
 
-#: job.c:2060
+#: src/job.c:2212
+#, c-format
 msgid "no more file handles: could not duplicate stdout\n"
 msgstr "没有剩余的文件句柄: 无法复制标准输出\n"
 
-#: job.c:2074
+#: src/job.c:2226
+#, c-format
 msgid "no more file handles: could not duplicate stderr\n"
 msgstr "没有剩余的文件句柄: 无法复制标准错误\n"
 
-#: job.c:2089
+#: src/job.c:2241
+#, c-format
 msgid "Could not restore stdin\n"
 msgstr "无法还原标准输入\n"
 
-#: job.c:2097
+#: src/job.c:2249
+#, c-format
 msgid "Could not restore stdout\n"
 msgstr "无法还原标准输出\n"
 
-#: job.c:2105
+#: src/job.c:2257
+#, c-format
 msgid "Could not restore stderr\n"
 msgstr "无法还原标准错误\n"
 
-#: job.c:2234
+#: src/job.c:2520
 #, c-format
 msgid "make reaped child pid %s, still waiting for pid %s\n"
 msgstr "make 已中止的子进程 pid %s,仍在等待 pid %s\n"
 
-#: job.c:2275
-#, c-format
-msgid "%s: %s: Command not found\n"
-msgstr "%s:%s:命令未找到\n"
-
-#: job.c:2277
+#: src/job.c:2623
 #, c-format
-msgid "%s[%u]: %s: Command not found\n"
-msgstr "%s[%u]:%s:命令未找到\n"
-
-#: job.c:2337
-#, c-format
-msgid "%s: Shell program not found"
-msgstr "%s:未找到 shell 程序"
-
-#: job.c:2346
 msgid "spawnvpe: environment space might be exhausted"
 msgstr "spawnvpe: 环境变量空间可能会耗尽"
 
-#: job.c:2584
+#: src/job.c:2862
 #, c-format
 msgid "$SHELL changed (was '%s', now '%s')\n"
 msgstr "$SHELL 已改变 (原为“%s”,现为“%s”)\n"
 
-#: job.c:3022 job.c:3207
+#: src/job.c:3300 src/job.c:3485
 #, c-format
 msgid "Creating temporary batch file %s\n"
 msgstr "正在创建临时批文件 %s\n"
 
-#: job.c:3030
+#: src/job.c:3308
+#, c-format
 msgid ""
 "Batch file contents:\n"
 "\t@echo off\n"
@@ -792,7 +797,7 @@ msgstr ""
 "批处理文件内容:\n"
 "\t@echo off\n"
 
-#: job.c:3219
+#: src/job.c:3497
 #, c-format
 msgid ""
 "Batch file contents:%s\n"
@@ -801,72 +806,69 @@ msgstr ""
 "批处理文件内容:%s\n"
 "\t%s\n"
 
-#: job.c:3327
+#: src/job.c:3605
 #, c-format
 msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
 msgstr "%s (行 %d) 错误的 shell 上下文 (!unixy && !batch_mode_shell)\n"
 
-#: job.h:43
-msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
-msgstr "-O[类型] (--output-sync[=类型]) 并未配置入此 make 构建。"
-
-#: load.c:60
+#: src/load.c:60
 #, c-format
 msgid "Failed to open global symbol table: %s"
 msgstr "打开全局符号表失败:%s"
 
-#: load.c:97
+#: src/load.c:97
 #, c-format
 msgid "Loaded object %s is not declared to be GPL compatible"
 msgstr "已加载的对象 %s 未声明为 GPL 兼容"
 
-#: load.c:104
+#: src/load.c:104
 #, c-format
 msgid "Failed to load symbol %s from %s: %s"
 msgstr "从 %2$s 加载符号 %1$s 失败:%3$s"
 
-#: load.c:149
+#: src/load.c:149
 #, c-format
 msgid "Empty symbol name for load: %s"
 msgstr "要加载的符号名为空:%s"
 
-#: load.c:204
+#: src/load.c:204
 #, c-format
 msgid "Loading symbol %s from %s\n"
 msgstr "正从 %2$s 加载符号 %1$s\n"
 
-#: load.c:256
+#: src/load.c:256
+#, c-format
 msgid "The 'load' operation is not supported on this platform."
 msgstr "本平台不支持“load”操作。"
 
-#: main.c:338
+#: src/main.c:335
 msgid "Options:\n"
 msgstr "选项:\n"
 
-#: main.c:339
+#: src/main.c:336
 msgid "  -b, -m                      Ignored for compatibility.\n"
 msgstr "  -b, -m                      为兼容性而忽略。\n"
 
-#: main.c:341
+#: src/main.c:338
 msgid "  -B, --always-make           Unconditionally make all targets.\n"
 msgstr "  -B, --always-make           无条件制作 (make) 所有目标。\n"
 
-#: main.c:343
+#: src/main.c:340
 msgid ""
 "  -C DIRECTORY, --directory=DIRECTORY\n"
 "                              Change to DIRECTORY before doing anything.\n"
 msgstr "  -C 目录, --directory=目录    在执行前先切换到 <目录>。\n"
 
-#: main.c:346
+#: src/main.c:343
 msgid "  -d                          Print lots of debugging information.\n"
 msgstr "  -d                          打印大量调试信息。\n"
 
-#: main.c:348
+#: src/main.c:345
 msgid ""
 "  --debug[=FLAGS]             Print various types of debugging information.\n"
 msgstr "  --debug[=旗标]               打印各种调试信息。\n"
 
-#: main.c:350
+#: src/main.c:347
 msgid ""
 "  -e, --environment-overrides\n"
 "                              Environment variables override makefiles.\n"
@@ -874,12 +876,12 @@ msgstr ""
 "  -e, --environment-overrides\n"
 "                              环境变量覆盖 makefile 中的变量。\n"
 
-#: main.c:353
+#: src/main.c:350
 msgid ""
-"  --eval=STRING               Evaluate STRING as a makefile statement.\n"
-msgstr "  --eval=字串               将 <字串> 作为 makefile 语句估值。\n"
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E 字串, --eval=字串        将 <字串> 作为 makefile 语句估值。\n"
 
-#: main.c:355
+#: src/main.c:352
 msgid ""
 "  -f FILE, --file=FILE, --makefile=FILE\n"
 "                              Read FILE as a makefile.\n"
@@ -887,33 +889,33 @@ msgstr ""
 "  -f 文件, --file=文件, --makefile=文件\n"
 "                              从 <文件> 中读入 makefile。\n"
 
-#: main.c:358
+#: src/main.c:355
 msgid "  -h, --help                  Print this message and exit.\n"
 msgstr "  -h, --help                  打印该消息并退出。\n"
 
-#: main.c:360
+#: src/main.c:357
 msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
 msgstr "  -i, --ignore-errors         忽略来自命令配方的错误。\n"
 
-#: main.c:362
+#: src/main.c:359
 msgid ""
 "  -I DIRECTORY, --include-dir=DIRECTORY\n"
 "                              Search DIRECTORY for included makefiles.\n"
 msgstr "  -I 目录, --include-dir=目录  在 <目录> 中搜索被包含的 makefile。\n"
 
-#: main.c:365
+#: src/main.c:362
 msgid ""
 "  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
 "arg.\n"
 msgstr ""
 "  -j [N], --jobs[=N]          同时允许 N 个任务;无参数表明允许无限个任务。\n"
 
-#: main.c:367
+#: src/main.c:364
 msgid ""
 "  -k, --keep-going            Keep going when some targets can't be made.\n"
 msgstr "  -k, --keep-going            当某些目标无法制作时仍然继续。\n"
 
-#: main.c:369
+#: src/main.c:366
 msgid ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              Don't start multiple jobs unless load is below "
@@ -922,14 +924,14 @@ msgstr ""
 "  -l [N], --load-average[=N], --max-load[=N]\n"
 "                              在系统负载高于 N 时不启动多任务。\n"
 
-#: main.c:372
+#: src/main.c:369
 msgid ""
 "  -L, --check-symlink-times   Use the latest mtime between symlinks and "
 "target.\n"
 msgstr ""
 "  -L, --check-symlink-times   使用软链接及软链接目标中修改时间较晚的一个。\n"
 
-#: main.c:374
+#: src/main.c:371
 msgid ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              Don't actually run any recipe; just print "
@@ -938,7 +940,7 @@ msgstr ""
 "  -n, --just-print, --dry-run, --recon\n"
 "                              只打印命令配方,不实际执行。\n"
 
-#: main.c:377
+#: src/main.c:374
 msgid ""
 "  -o FILE, --old-file=FILE, --assume-old=FILE\n"
 "                              Consider FILE to be very old and don't remake "
@@ -947,7 +949,7 @@ msgstr ""
 "  -o 文件, --old-file=文件, --assume-old=文件\n"
 "                              将 <文件> 当做很旧,不必重新制作。\n"
 
-#: main.c:380
+#: src/main.c:377
 msgid ""
 "  -O[TYPE], --output-sync[=TYPE]\n"
 "                              Synchronize output of parallel jobs by TYPE.\n"
@@ -955,30 +957,34 @@ msgstr ""
 "  -O[类型], --output-sync[=类型]\n"
 "                           使用 <类型> 方式同步并行任务输出。\n"
 
-#: main.c:383
+#: src/main.c:380
 msgid "  -p, --print-data-base       Print make's internal database.\n"
 msgstr "  -p, --print-data-base       打印 make 的内部数据库。\n"
 
-#: main.c:385
+#: src/main.c:382
 msgid ""
 "  -q, --question              Run no recipe; exit status says if up to "
 "date.\n"
 msgstr ""
 "  -q, --question              不运行任何配方;退出状态说明是否已全部更新。\n"
 
-#: main.c:387
+#: src/main.c:384
 msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
 msgstr "  -r, --no-builtin-rules      禁用内置隐含规则。\n"
 
-#: main.c:389
+#: src/main.c:386
 msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
 msgstr "  -R, --no-builtin-variables  禁用内置变量设置。\n"
 
-#: main.c:391
+#: src/main.c:388
 msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
 msgstr "  -s, --silent, --quiet       不输出配方命令。\n"
 
-#: main.c:393
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr "  --no-silent                 对配方进行回显(禁用 --silent 模式)。\n"
+
+#: src/main.c:392
 msgid ""
 "  -S, --no-keep-going, --stop\n"
 "                              Turns off -k.\n"
@@ -986,32 +992,32 @@ msgstr ""
 "  -S, --no-keep-going, --stop\n"
 "                              关闭 -k。\n"
 
-#: main.c:396
+#: src/main.c:395
 msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
 msgstr ""
 "  -t, --touch                 touch 目标(更新修改时间)而不是重新制作它"
 "们。\n"
 
-#: main.c:398
+#: src/main.c:397
 msgid "  --trace                     Print tracing information.\n"
 msgstr "  --trace                     打印跟踪信息。\n"
 
-#: main.c:400
+#: src/main.c:399
 msgid ""
 "  -v, --version               Print the version number of make and exit.\n"
 msgstr "  -v, --version               打印 make 的版本号并退出。\n"
 
-#: main.c:402
+#: src/main.c:401
 msgid "  -w, --print-directory       Print the current directory.\n"
 msgstr "  -w, --print-directory       打印当前目录。\n"
 
-#: main.c:404
+#: src/main.c:403
 msgid ""
 "  --no-print-directory        Turn off -w, even if it was turned on "
 "implicitly.\n"
 msgstr "  --no-print-directory        关闭 -w,即使 -w 默认开启。\n"
 
-#: main.c:406
+#: src/main.c:405
 msgid ""
 "  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
 "                              Consider FILE to be infinitely new.\n"
@@ -1019,32 +1025,33 @@ msgstr ""
 "  -W 文件, --what-if=文件, --new-file=文件, --assume-new=文件\n"
 "                              将 <文件> 当做最新。\n"
 
-#: main.c:409
+#: src/main.c:408
 msgid ""
 "  --warn-undefined-variables  Warn when an undefined variable is "
 "referenced.\n"
 msgstr "  --warn-undefined-variables  当引用未定义变量的时候发出警告。\n"
 
-#: main.c:683
+#: src/main.c:671
+#, c-format
 msgid "empty string invalid as file name"
 msgstr "空字符串是无效的文件名"
 
-#: main.c:766
+#: src/main.c:754
 #, c-format
 msgid "unknown debug level specification '%s'"
 msgstr "未知的调试级别定义“%s”"
 
-#: main.c:806
+#: src/main.c:794
 #, c-format
 msgid "unknown output-sync type '%s'"
 msgstr "不明输出同步类型“%s”"
 
-#: main.c:861
+#: src/main.c:849
 #, c-format
 msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
 msgstr "%s:捕获中断/异常 (代码 = 0x%lx, 地址 = 0x%p)\n"
 
-#: main.c:868
+#: src/main.c:856
 #, c-format
 msgid ""
 "\n"
@@ -1059,132 +1066,140 @@ msgstr ""
 "异常标志 = %lx\n"
 "异常地址 = 0x%p\n"
 
-#: main.c:876
+#: src/main.c:864
 #, c-format
 msgid "Access violation: write operation at address 0x%p\n"
 msgstr "访问冲突:地址 0x%p 处的写操作\n"
 
-#: main.c:877
+#: src/main.c:865
 #, c-format
 msgid "Access violation: read operation at address 0x%p\n"
 msgstr "访问冲突:地址 0x%p 处的读操作\n"
 
-#: main.c:953 main.c:968
+#: src/main.c:941 src/main.c:956
 #, c-format
 msgid "find_and_set_shell() setting default_shell = %s\n"
 msgstr "find_and_set_shell() 设置 default_shell = %s\n"
 
-#: main.c:1021
+#: src/main.c:1009
 #, c-format
 msgid "find_and_set_shell() path search set default_shell = %s\n"
 msgstr "find_and_set_shell() 路径搜索结果设置 default_shell = %s\n"
 
-#: main.c:1538
+#: src/main.c:1609
 #, c-format
-msgid "%s is suspending for 30 seconds..."
-msgstr "%s 正在挂起 30 秒..."
-
-#: main.c:1540
-#, c-format
-msgid "done sleep(30). Continuing.\n"
-msgstr "睡眠完成(30)。继续。\n"
-
-#: main.c:1627
 msgid ""
 "warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
 msgstr "警告: jobserver 不可用: 正使用 -j1。添加 “+” 到父 make 的规则。"
 
-#: main.c:1635
-msgid "warning: -jN forced in submake: disabling jobserver mode."
-msgstr "警告: 子 make 中强制 -jN: 关闭 jobserver 模式。"
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "警告: 子 make 中强制 -j%d: 重置 jobserver 模式。"
 
-#: main.c:1805
+#: src/main.c:1781
+#, c-format
 msgid "Makefile from standard input specified twice."
 msgstr "两次指明来自标准输入的 makefile。"
 
-#: main.c:1843 vmsjobs.c:1252
+#: src/main.c:1819 src/vmsjobs.c:1248
 msgid "fopen (temporary file)"
 msgstr "fopen (临时文件)"
 
-#: main.c:1849
+#: src/main.c:1825
 msgid "fwrite (temporary file)"
 msgstr "fwrite (临时文件)"
 
-#: main.c:2048
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "警告: 子 make 中强制 -j%d: 重置 jobserver 模式。"
+
+#: src/main.c:2068
+#, c-format
 msgid "Parallel jobs (-j) are not supported on this platform."
 msgstr "本平台不支持并行任务 (-j)。"
 
-#: main.c:2049
+#: src/main.c:2069
+#, c-format
 msgid "Resetting to single job (-j1) mode."
 msgstr "重置为单任务模式 (-j1)。"
 
-#: main.c:2088
+#: src/main.c:2109
+#, c-format
 msgid "Symbolic links not supported: disabling -L."
-msgstr "不支持软链接: 关闭 -L"
+msgstr "不支持软链接:禁用 -L。"
 
-#: main.c:2170
+#: src/main.c:2190
+#, c-format
 msgid "Updating makefiles....\n"
 msgstr "正在更新 makefile....\n"
 
-#: main.c:2195
+#: src/main.c:2226
 #, c-format
 msgid "Makefile '%s' might loop; not remaking it.\n"
 msgstr "Makefile “%s”可能循环;不会重新执行它。\n"
 
-#: main.c:2279
+#: src/main.c:2303
 #, c-format
 msgid "Failed to remake makefile '%s'."
 msgstr "重新执行 makefile“%s”失败。"
 
-#: main.c:2299
+#: src/main.c:2323
 #, c-format
 msgid "Included makefile '%s' was not found."
 msgstr "找不到被引入的 makefile“%s”。"
 
-#: main.c:2304
+#: src/main.c:2328
 #, c-format
 msgid "Makefile '%s' was not found"
-msgstr "找不到 makefile “%s”"
+msgstr "找不到 makefile “%s”"
 
-#: main.c:2372
+#: src/main.c:2394
+#, c-format
 msgid "Couldn't change back to original directory."
 msgstr "无法回到原始目录。"
 
-#: main.c:2380
+#: src/main.c:2402
 #, c-format
 msgid "Re-executing[%u]:"
 msgstr "重新执行[%u]:"
 
-#: main.c:2492
+#: src/main.c:2522
 msgid "unlink (temporary file): "
 msgstr "删除 (临时文件):"
 
-#: main.c:2525
+#: src/main.c:2555
+#, c-format
 msgid ".DEFAULT_GOAL contains more than one target"
 msgstr ".DEFAULT_GOAL 包含多余一个目标"
 
-#: main.c:2548
-msgid "No targets specified and no makefile found"
-msgstr "没有指明目标并且找不到 makefile"
-
-#: main.c:2550
+#: src/main.c:2579
+#, c-format
 msgid "No targets"
 msgstr "无目标"
 
-#: main.c:2555
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "没有指明目标并且找不到 makefile"
+
+#: src/main.c:2586
+#, c-format
 msgid "Updating goal targets....\n"
 msgstr "更新目标....\n"
 
-#: main.c:2579
+#: src/main.c:2610
+#, c-format
 msgid "warning:  Clock skew detected.  Your build may be incomplete."
 msgstr "警告:检测到时钟错误。您的构建版本可能是不完整的。"
 
-#: main.c:2773
+#: src/main.c:2804
 #, c-format
 msgid "Usage: %s [options] [target] ...\n"
 msgstr "用法:%s [选项] [目标] ...\n"
 
-#: main.c:2779
+#: src/main.c:2810
 #, c-format
 msgid ""
 "\n"
@@ -1193,7 +1208,7 @@ msgstr ""
 "\n"
 "该程序为 %s 编译\n"
 
-#: main.c:2781
+#: src/main.c:2812
 #, c-format
 msgid ""
 "\n"
@@ -1202,32 +1217,32 @@ msgstr ""
 "\n"
 "该程序为 %s (%s) 编译\n"
 
-#: main.c:2784
+#: src/main.c:2815
 #, c-format
 msgid "Report bugs to <bug-make@gnu.org>\n"
 msgstr "报告错误到 <bug-make@gnu.org>\n"
 
-#: main.c:2870
+#: src/main.c:2901
 #, c-format
 msgid "the '%s%s' option requires a non-empty string argument"
 msgstr "“%s%s”选项需要非空字符串参数"
 
-#: main.c:2934
+#: src/main.c:2965
 #, c-format
 msgid "the '-%c' option requires a positive integer argument"
 msgstr "“-%c”选项需要正整数参数"
 
-#: main.c:3332
+#: src/main.c:3363
 #, c-format
 msgid "%sBuilt for %s\n"
 msgstr "%s为 %s 编译\n"
 
-#: main.c:3334
+#: src/main.c:3365
 #, c-format
 msgid "%sBuilt for %s (%s)\n"
 msgstr "%s为 %s (%s) 编译\n"
 
-#: main.c:3345
+#: src/main.c:3376
 #, c-format
 msgid ""
 "%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
@@ -1240,7 +1255,7 @@ msgstr ""
 "%s本软件是自由软件:您可以自由修改和重新发布它。\n"
 "%s在法律允许的范围内没有其他保证。\n"
 
-#: main.c:3366
+#: src/main.c:3397
 #, c-format
 msgid ""
 "\n"
@@ -1249,7 +1264,7 @@ msgstr ""
 "\n"
 "# make 数据基础,打印在 %s"
 
-#: main.c:3376
+#: src/main.c:3407
 #, c-format
 msgid ""
 "\n"
@@ -1258,499 +1273,535 @@ msgstr ""
 "\n"
 "# 在 %s 上完成 make 数据基础\n"
 
-#: misc.c:202
-#, c-format
-msgid "Unknown error %d"
-msgstr "未知错误 %d"
-
-#: misc.c:508
+#: src/misc.c:643
 #, c-format
 msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
 msgstr "%s: 用户 %lu (真实用户 %lu), 组 %lu (真实组 %lu)\n"
 
-#: misc.c:529
+#: src/misc.c:664
 msgid "Initialized access"
 msgstr "初始化成功"
 
-#: misc.c:608
+#: src/misc.c:743
 msgid "User access"
 msgstr "用户权限"
 
-#: misc.c:656
+#: src/misc.c:791
 msgid "Make access"
 msgstr "Make 权限"
 
-#: misc.c:690
+#: src/misc.c:825
 msgid "Child access"
 msgstr "子进程 权限"
 
-#: output.c:104
+#: src/output.c:97
 #, c-format
 msgid "%s: Entering an unknown directory\n"
 msgstr "%s: 进入一个未知的目录\n"
 
-#: output.c:106
+#: src/output.c:99
 #, c-format
 msgid "%s: Leaving an unknown directory\n"
 msgstr "%s: 离开一个未知的目录\n"
 
-#: output.c:109
+#: src/output.c:102
 #, c-format
 msgid "%s: Entering directory '%s'\n"
 msgstr "%s: 进入目录“%s”\n"
 
-#: output.c:111
+#: src/output.c:104
 #, c-format
 msgid "%s: Leaving directory '%s'\n"
 msgstr "%s: 离开目录“%s”\n"
 
-#: output.c:115
+#: src/output.c:108
 #, c-format
 msgid "%s[%u]: Entering an unknown directory\n"
 msgstr "%s[%u]: 进入一个未知的目录\n"
 
-#: output.c:117
+#: src/output.c:110
 #, c-format
 msgid "%s[%u]: Leaving an unknown directory\n"
 msgstr "%s[%u]: 离开一个未知的目录\n"
 
-#: output.c:120
+#: src/output.c:113
 #, c-format
 msgid "%s[%u]: Entering directory '%s'\n"
 msgstr "%s[%u]: 进入目录“%s”\n"
 
-#: output.c:122
+#: src/output.c:115
 #, c-format
 msgid "%s[%u]: Leaving directory '%s'\n"
 msgstr "%s[%u]: 离开目录“%s”\n"
 
-#: output.c:495 output.c:497
+#: src/output.c:442 src/output.c:444
+#, c-format
 msgid "write error: stdout"
 msgstr "写错误: 标准输出"
 
-#: output.c:677
+#: src/output.c:624
 msgid ".  Stop.\n"
 msgstr "。 停止。\n"
 
-#: output.c:711
+#: src/output.c:658
 #, c-format
 msgid "%s%s: %s"
 msgstr "%s%s: %s"
 
-#: output.c:720
+#: src/output.c:667
 #, c-format
 msgid "%s: %s"
 msgstr "%s: %s"
 
-#: posixos.c:69
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[类型] (--output-sync[=类型]) 并未配置入此 make 构建。"
+
+#: src/posixos.c:90
 msgid "creating jobs pipe"
 msgstr "正在创建任务管道"
 
-#: posixos.c:72 posixos.c:227
+#: src/posixos.c:98 src/posixos.c:251
 msgid "duping jobs pipe"
 msgstr "正在复制任务管道"
 
-#: posixos.c:78
+#: src/posixos.c:104
 msgid "init jobserver pipe"
-msgstr "å\88\9b始化任务服务器管道"
+msgstr "å\88\9d始化任务服务器管道"
 
-#: posixos.c:90
+#: src/posixos.c:119
 #, c-format
 msgid "internal error: invalid --jobserver-auth string '%s'"
 msgstr "内部错误:非法 --jobserver-auth 验证字符串“%s”"
 
-#: posixos.c:93
+#: src/posixos.c:122
 #, c-format
 msgid "Jobserver client (fds %d,%d)\n"
-msgstr "jobserver 客户端(文件描述符 %d,%d)\n"
+msgstr "Jobserver 客户端(文件描述符 %d,%d)\n"
 
-#: posixos.c:109
+#: src/posixos.c:138
 msgid "jobserver pipeline"
 msgstr "任务服务器管道"
 
-#: posixos.c:154
+#: src/posixos.c:186
 msgid "write jobserver"
 msgstr "写入任务服务器"
 
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "任务服务器关闭"
+
 # , fuzzy
-#: posixos.c:268
+#: src/posixos.c:303
 msgid "pselect jobs pipe"
 msgstr "pselect 任务管道"
 
-#: posixos.c:279 posixos.c:391
+#: src/posixos.c:319 src/posixos.c:433
 msgid "read jobs pipe"
 msgstr "读取任务管道"
 
-#: read.c:178
+#: src/read.c:181
+#, c-format
 msgid "Reading makefiles...\n"
 msgstr "正在读入 makefiles...\n"
 
-#: read.c:329
+#: src/read.c:336
 #, c-format
 msgid "Reading makefile '%s'"
 msgstr "正在读入 makefile “%s”"
 
-#: read.c:331
+#: src/read.c:338
 #, c-format
 msgid " (no default goal)"
 msgstr " (没有缺省目标)"
 
-#: read.c:333
+#: src/read.c:340
 #, c-format
 msgid " (search path)"
 msgstr " (搜索路径)"
 
-#: read.c:335
+#: src/read.c:342
 #, c-format
 msgid " (don't care)"
 msgstr " (不用理)"
 
-#: read.c:337
+#: src/read.c:344
 #, c-format
 msgid " (no ~ expansion)"
 msgstr " (没有 ~ 扩展)"
 
-#: read.c:651
+#: src/read.c:655
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile '%s'\n"
 msgstr "跳过 Makefile“%s”中的 UTF-8 BOM\n"
 
-#: read.c:654
+#: src/read.c:658
 #, c-format
 msgid "Skipping UTF-8 BOM in makefile buffer\n"
 msgstr "跳过 Makefile 缓冲区中的 UTF-8 BOM\n"
 
-#: read.c:783
+#: src/read.c:787
+#, c-format
 msgid "invalid syntax in conditional"
 msgstr "条件中含有无效语法"
 
-#: read.c:959
+#: src/read.c:960
 #, c-format
 msgid "%s: failed to load"
 msgstr "%s: 加载失败"
 
-#: read.c:985
+#: src/read.c:986
+#, c-format
 msgid "recipe commences before first target"
 msgstr "配方在第一个目标前开始"
 
-#: read.c:1034
+#: src/read.c:1035
+#, c-format
 msgid "missing rule before recipe"
 msgstr "配方之前遗漏了规则"
 
-#: read.c:1124
+#: src/read.c:1136
+#, c-format
 msgid "missing separator (did you mean TAB instead of 8 spaces?)"
 msgstr "分隔符缺失 (你大概想用 TAB,而不是八个空格)"
 
-#: read.c:1126
+#: src/read.c:1138
+#, c-format
 msgid "missing separator"
-msgstr "遗漏分隔符 %s"
+msgstr "缺失分隔符"
 
-#: read.c:1262
+#: src/read.c:1283
+#, c-format
 msgid "missing target pattern"
 msgstr "无目标匹配"
 
-#: read.c:1264
+#: src/read.c:1285
+#, c-format
 msgid "multiple target patterns"
 msgstr "多个目标匹配"
 
-#: read.c:1268
+#: src/read.c:1289
 #, c-format
 msgid "target pattern contains no '%%'"
 msgstr "目标模式不含有“%%”"
 
-#: read.c:1390
+#: src/read.c:1404
+#, c-format
 msgid "missing 'endif'"
 msgstr "遗漏“endif”"
 
-#: read.c:1428 read.c:1473 variable.c:1576
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
 msgid "empty variable name"
 msgstr "空变量名"
 
-#: read.c:1463
+#: src/read.c:1478
+#, c-format
 msgid "extraneous text after 'define' directive"
 msgstr "“endef”指令后含有不该出现的文字"
 
-#: read.c:1488
+#: src/read.c:1503
+#, c-format
 msgid "missing 'endef', unterminated 'define'"
 msgstr "遗漏“endef”,未终止的“define”"
 
-#: read.c:1516
+#: src/read.c:1531
+#, c-format
 msgid "extraneous text after 'endef' directive"
 msgstr "“endef”指令后含有不该出现的文字"
 
-#: read.c:1588
+#: src/read.c:1603
 #, c-format
 msgid "extraneous text after '%s' directive"
 msgstr "在“%s”指令之后含有不该出现的文字"
 
-#: read.c:1589
+#: src/read.c:1604
 #, c-format
 msgid "extraneous '%s'"
 msgstr "不该出现的“%s”"
 
-#: read.c:1617
+#: src/read.c:1632
+#, c-format
 msgid "only one 'else' per conditional"
 msgstr "每个条件只能有一个“else”"
 
-#: read.c:1892
+#: src/read.c:1908
+#, c-format
 msgid "Malformed target-specific variable definition"
 msgstr "畸形的针对目标的标量定义"
 
-#: read.c:1950
+#: src/read.c:1968
+#, c-format
 msgid "prerequisites cannot be defined in recipes"
 msgstr "依赖无法在配方脚本中定义"
 
-#: read.c:2009
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "成组的目标必须提供一个配方"
+
+#: src/read.c:2029
+#, c-format
 msgid "mixed implicit and static pattern rules"
 msgstr "混和的隐含和静态模式规则"
 
-#: read.c:2032
+#: src/read.c:2052
+#, c-format
 msgid "mixed implicit and normal rules"
 msgstr "混和的隐含和普通规则"
 
-#: read.c:2085
+#: src/read.c:2107
 #, c-format
 msgid "target '%s' doesn't match the target pattern"
 msgstr "目标“%s”不匹配目标模式"
 
-#: read.c:2100 read.c:2146
+#: src/read.c:2122 src/read.c:2168
 #, c-format
 msgid "target file '%s' has both : and :: entries"
 msgstr "目标文件“%s”含有 : 和 :: 两种条目"
 
-#: read.c:2106
+#: src/read.c:2128
 #, c-format
 msgid "target '%s' given more than once in the same rule"
-msgstr "目标“%s”在同一个规则中给出了多次"
+msgstr "目标“%s”在同一个规则中给出了多次"
 
-#: read.c:2116
+#: src/read.c:2138
 #, c-format
 msgid "warning: overriding recipe for target '%s'"
 msgstr "警告:覆盖关于目标“%s”的配方"
 
-#: read.c:2119
+#: src/read.c:2141
 #, c-format
 msgid "warning: ignoring old recipe for target '%s'"
 msgstr "警告:忽略关于目标“%s”的旧配方"
 
-#: read.c:2223
+#: src/read.c:2254
+#, c-format
 msgid "*** mixed implicit and normal rules: deprecated syntax"
 msgstr "*** 隐含和普通规则混合:已弃用的语法"
 
-#: read.c:2542
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "警告:覆盖关于目标“%s”的组成员"
+
+#: src/read.c:2636
+#, c-format
 msgid "warning: NUL character seen; rest of line ignored"
 msgstr "警告:遇到了 NUL 字符;忽略行的剩余部分"
 
-#: remake.c:226
+#: src/remake.c:226
 #, c-format
 msgid "Nothing to be done for '%s'."
 msgstr "对“%s”无需做任何事。"
 
-#: remake.c:227
+#: src/remake.c:227
 #, c-format
 msgid "'%s' is up to date."
 msgstr "“%s”已是最新。"
 
-#: remake.c:323
+#: src/remake.c:323
 #, c-format
 msgid "Pruning file '%s'.\n"
 msgstr "正删除文件“%s”。\n"
 
-#: remake.c:406
+#: src/remake.c:389
 #, c-format
 msgid "%sNo rule to make target '%s', needed by '%s'%s"
 msgstr "%s没有规则可制作目标“%s”,由“%s”%s 需求"
 
-#: remake.c:416
+#: src/remake.c:399
 #, c-format
 msgid "%sNo rule to make target '%s'%s"
 msgstr "%s没有规则可制作目标“%s”%s"
 
-#: remake.c:442
+#: src/remake.c:425
 #, c-format
 msgid "Considering target file '%s'.\n"
 msgstr "正在考虑目标文件“%s”。\n"
 
-#: remake.c:449
+#: src/remake.c:432
 #, c-format
 msgid "Recently tried and failed to update file '%s'.\n"
 msgstr "最近已尝试过更新文件“%s”并失败。\n"
 
-#: remake.c:461
+#: src/remake.c:444
 #, c-format
 msgid "File '%s' was considered already.\n"
 msgstr "已考虑过文件“%s”。\n"
 
-#: remake.c:471
+#: src/remake.c:454
 #, c-format
 msgid "Still updating file '%s'.\n"
 msgstr "仍然在更新文件“%s”。\n"
 
-#: remake.c:474
+#: src/remake.c:457
 #, c-format
 msgid "Finished updating file '%s'.\n"
 msgstr "更新文件“%s”完成。\n"
 
-#: remake.c:503
+#: src/remake.c:486
 #, c-format
 msgid "File '%s' does not exist.\n"
 msgstr "文件“%s”不存在。\n"
 
-#: remake.c:511
+#: src/remake.c:494
 #, c-format
 msgid ""
 "*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
 msgstr "*** 警告: .LOW_RESOLUTION_TIME 文件 `%s' 有一个高精度的的时间标志"
 
-#: remake.c:524 remake.c:1056
+#: src/remake.c:507 src/remake.c:1039
 #, c-format
 msgid "Found an implicit rule for '%s'.\n"
 msgstr "找到一条关于“%s”的隐含规则。\n"
 
-#: remake.c:526 remake.c:1058
+#: src/remake.c:509 src/remake.c:1041
 #, c-format
 msgid "No implicit rule found for '%s'.\n"
 msgstr "找不到关于“%s”的隐含规则。\n"
 
-#: remake.c:532
+#: src/remake.c:515
 #, c-format
 msgid "Using default recipe for '%s'.\n"
 msgstr "使用“%s”的默认配方。\n"
 
-#: remake.c:566 remake.c:1105
+#: src/remake.c:549 src/remake.c:1088
 #, c-format
 msgid "Circular %s <- %s dependency dropped."
 msgstr "放弃循环依赖 %s <- %s 。"
 
-#: remake.c:691
+#: src/remake.c:674
 #, c-format
 msgid "Finished prerequisites of target file '%s'.\n"
 msgstr "目标文件“%s”的前提已完成。\n"
 
-#: remake.c:697
+#: src/remake.c:680
 #, c-format
 msgid "The prerequisites of '%s' are being made.\n"
 msgstr "正在制作“%s”的前提。\n"
 
-#: remake.c:711
+#: src/remake.c:694
 #, c-format
 msgid "Giving up on target file '%s'.\n"
 msgstr "放弃目标文件“%s”。\n"
 
-#: remake.c:716
+#: src/remake.c:699
 #, c-format
 msgid "Target '%s' not remade because of errors."
 msgstr "由于错误目标“%s”并未重新制作。"
 
-#: remake.c:768
+#: src/remake.c:751
 #, c-format
 msgid "Prerequisite '%s' is order-only for target '%s'.\n"
 msgstr "前提“%s”对目标“%s”来说仅用于指定执行顺序 (order-only) 。\n"
 
-#: remake.c:773
+#: src/remake.c:756
 #, c-format
 msgid "Prerequisite '%s' of target '%s' does not exist.\n"
 msgstr "目标“%2$s”的前提“%1$s”不存在。\n"
 
-#: remake.c:778
+#: src/remake.c:761
 #, c-format
 msgid "Prerequisite '%s' is newer than target '%s'.\n"
 msgstr "前提“%s”比目标“%s”新。\n"
 
-#: remake.c:781
+#: src/remake.c:764
 #, c-format
 msgid "Prerequisite '%s' is older than target '%s'.\n"
 msgstr "前提“%s”比目标“%s”旧。\n"
 
-#: remake.c:799
+#: src/remake.c:782
 #, c-format
 msgid "Target '%s' is double-colon and has no prerequisites.\n"
 msgstr "目标“%s”是双冒号目标并且没有前提。\n"
 
-#: remake.c:806
+#: src/remake.c:789
 #, c-format
 msgid "No recipe for '%s' and no prerequisites actually changed.\n"
 msgstr "没有关于“%s”的配方,并且没有实际改变的前提。\n"
 
-#: remake.c:811
+#: src/remake.c:794
 #, c-format
 msgid "Making '%s' due to always-make flag.\n"
 msgstr "由于 always-make 标志所以制作“%s”。\n"
 
-#: remake.c:819
+#: src/remake.c:802
 #, c-format
 msgid "No need to remake target '%s'"
 msgstr "不需要重新制作目标“%s”"
 
-#: remake.c:821
+#: src/remake.c:804
 #, c-format
 msgid "; using VPATH name '%s'"
 msgstr ";使用 VPATH 名称“%s”"
 
-#: remake.c:841
+#: src/remake.c:824
 #, c-format
 msgid "Must remake target '%s'.\n"
 msgstr "必须重新制作目标“%s”。\n"
 
-#: remake.c:847
+#: src/remake.c:830
 #, c-format
 msgid "  Ignoring VPATH name '%s'.\n"
 msgstr "  忽略 VPATH 名称“%s”。\n"
 
-#: remake.c:856
+#: src/remake.c:839
 #, c-format
 msgid "Recipe of '%s' is being run.\n"
 msgstr "“%s”的命令配方正在被执行。\n"
 
-#: remake.c:863
+#: src/remake.c:846
 #, c-format
 msgid "Failed to remake target file '%s'.\n"
 msgstr "重新制作目标文件“%s”失败。\n"
 
-#: remake.c:866
+#: src/remake.c:849
 #, c-format
 msgid "Successfully remade target file '%s'.\n"
 msgstr "重新制作目标文件“%s”成功。\n"
 
-#: remake.c:869
+#: src/remake.c:852
 #, c-format
 msgid "Target file '%s' needs to be remade under -q.\n"
 msgstr "目标文件“%s”需要以 -q 选项重新制作。\n"
 
-#: remake.c:1064
+#: src/remake.c:1047
 #, c-format
 msgid "Using default commands for '%s'.\n"
 msgstr "使用关于“%s”的默认命令。\n"
 
-#: remake.c:1430
-#, c-format
-msgid "Warning: File '%s' has modification time in the future"
-msgstr "警告:文件“%s”的修改时间在未来"
-
-#: remake.c:1444
+#: src/remake.c:1422
 #, c-format
 msgid "Warning: File '%s' has modification time %s s in the future"
 msgstr "警告:文件“%s”的修改时间在未来 %s 秒后"
 
-#: remake.c:1647
+#: src/remake.c:1662
 #, c-format
 msgid ".LIBPATTERNS element '%s' is not a pattern"
 msgstr ".LIBPATTERNS 的元素“%s”不是一个模式"
 
-#: remote-cstms.c:122
+#: src/remote-cstms.c:122
 #, c-format
 msgid "Customs won't export: %s\n"
 msgstr "用户不希望导出:%s\n"
 
-#: rule.c:496
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
 msgid ""
 "\n"
 "# Implicit Rules"
 msgstr ""
 "\n"
-"# 隐含规则"
+"# 隐含规则"
 
-#: rule.c:511
+#: src/rule.c:545
 msgid ""
 "\n"
 "# No implicit rules."
@@ -1758,181 +1809,177 @@ msgstr ""
 "\n"
 "# 没有隐含规则。"
 
-#: rule.c:514
+#: src/rule.c:548
 #, c-format
 msgid ""
 "\n"
-"# %u implicit rules, %u"
+"# %u implicit rules, %u (%.1f%%) terminal."
 msgstr ""
 "\n"
-"# %u 条隐含规则,%u"
-
-#: rule.c:523
-msgid " terminal."
-msgstr " 终端。"
+"# %u 条隐含规则,%u (%.1f%%) 为末端。"
 
-#: rule.c:531
+#: src/rule.c:557
 #, c-format
 msgid "BUG: num_pattern_rules is wrong!  %u != %u"
 msgstr "BUG:num_pattern_rules 出错!%u != %u"
 
-#: signame.c:84
+#: src/signame.c:84
 msgid "unknown signal"
 msgstr "未知的信号"
 
-#: signame.c:92
+#: src/signame.c:92
 msgid "Hangup"
 msgstr "挂起"
 
-#: signame.c:95
+#: src/signame.c:95
 msgid "Interrupt"
 msgstr "中断"
 
-#: signame.c:98
+#: src/signame.c:98
 msgid "Quit"
 msgstr "退出"
 
-#: signame.c:101
+#: src/signame.c:101
 msgid "Illegal Instruction"
 msgstr "非法指令"
 
-#: signame.c:104
+#: src/signame.c:104
 msgid "Trace/breakpoint trap"
 msgstr "跟踪/断点陷阱"
 
-#: signame.c:109
+#: src/signame.c:109
 msgid "Aborted"
-msgstr "已失败"
+msgstr "已中止"
 
-#: signame.c:112
+#: src/signame.c:112
 msgid "IOT trap"
 msgstr "IOT 陷阱"
 
-#: signame.c:115
+#: src/signame.c:115
 msgid "EMT trap"
 msgstr "EMT 陷阱"
 
-#: signame.c:118
+#: src/signame.c:118
 msgid "Floating point exception"
 msgstr "浮点数异常"
 
-#: signame.c:121
+#: src/signame.c:121
 msgid "Killed"
 msgstr "已杀死"
 
-#: signame.c:124
+#: src/signame.c:124
 msgid "Bus error"
 msgstr "总线错误"
 
-#: signame.c:127
+#: src/signame.c:127
 msgid "Segmentation fault"
 msgstr "段错误"
 
-#: signame.c:130
+#: src/signame.c:130
 msgid "Bad system call"
 msgstr "错误的系统调用"
 
-#: signame.c:133
+#: src/signame.c:133
 msgid "Broken pipe"
 msgstr "断开的管道"
 
-#: signame.c:136
+#: src/signame.c:136
 msgid "Alarm clock"
 msgstr "闹钟"
 
-#: signame.c:139
+#: src/signame.c:139
 msgid "Terminated"
 msgstr "已终止"
 
-#: signame.c:142
+#: src/signame.c:142
 msgid "User defined signal 1"
 msgstr "用户定义信号 1"
 
-#: signame.c:145
+#: src/signame.c:145
 msgid "User defined signal 2"
 msgstr "用户定义信号 2"
 
-#: signame.c:150 signame.c:153
+#: src/signame.c:150 src/signame.c:153
 msgid "Child exited"
 msgstr "子进程已退出"
 
-#: signame.c:156
+#: src/signame.c:156
 msgid "Power failure"
 msgstr "电源失效"
 
-#: signame.c:159
+#: src/signame.c:159
 msgid "Stopped"
 msgstr "已停止"
 
-#: signame.c:162
+#: src/signame.c:162
 msgid "Stopped (tty input)"
 msgstr "已停止 (tty 输入)"
 
-#: signame.c:165
+#: src/signame.c:165
 msgid "Stopped (tty output)"
 msgstr "已停止 (tty 输出)"
 
-#: signame.c:168
+#: src/signame.c:168
 msgid "Stopped (signal)"
 msgstr "已停止 (信号)"
 
-#: signame.c:171
+#: src/signame.c:171
 msgid "CPU time limit exceeded"
 msgstr "CPU 时间超出限制"
 
-#: signame.c:174
+#: src/signame.c:174
 msgid "File size limit exceeded"
 msgstr "文件大小超出限制"
 
-#: signame.c:177
+#: src/signame.c:177
 msgid "Virtual timer expired"
 msgstr "虚拟时钟超时"
 
-#: signame.c:180
+#: src/signame.c:180
 msgid "Profiling timer expired"
 msgstr "测试时钟超市"
 
-#: signame.c:186
+#: src/signame.c:186
 msgid "Window changed"
 msgstr "窗口已改变"
 
-#: signame.c:189
+#: src/signame.c:189
 msgid "Continued"
 msgstr "继续"
 
-#: signame.c:192
+#: src/signame.c:192
 msgid "Urgent I/O condition"
 msgstr "紧急 I/O 条件"
 
-#: signame.c:199 signame.c:208
+#: src/signame.c:199 src/signame.c:208
 msgid "I/O possible"
 msgstr "I/O 可行"
 
-#: signame.c:202
+#: src/signame.c:202
 msgid "SIGWIND"
 msgstr "SIGWIND"
 
-#: signame.c:205
+#: src/signame.c:205
 msgid "SIGPHONE"
 msgstr "SIGPHONE"
 
-#: signame.c:211
+#: src/signame.c:211
 msgid "Resource lost"
 msgstr "资源丢失"
 
-#: signame.c:214
+#: src/signame.c:214
 msgid "Danger signal"
 msgstr "危险信号"
 
-#: signame.c:217
+#: src/signame.c:217
 msgid "Information request"
 msgstr "信息请求"
 
-#: signame.c:220
+#: src/signame.c:220
 msgid "Floating point co-processor not available"
 msgstr "浮点数协处理器不可用"
 
-#: strcache.c:274
+#: src/strcache.c:274
 #, c-format
 msgid ""
 "\n"
@@ -1941,7 +1988,7 @@ msgstr ""
 "\n"
 "%s 没有 strcache 缓冲区\n"
 
-#: strcache.c:304
+#: src/strcache.c:304
 #, c-format
 msgid ""
 "\n"
@@ -1951,25 +1998,25 @@ msgstr ""
 "\n"
 "%s strcache 缓冲: %lu (%lu) / 字串 = %lu / 空间 = %lu B / 平均 = %lu B\n"
 
-#: strcache.c:308
+#: src/strcache.c:308
 #, c-format
 msgid ""
-"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"
-msgstr "%s 目前缓冲: 尺寸 = %hu B / 已用 = %hu B / 数量 = %hu / 平均 = %hu B\n"
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr "%s 目前缓冲: 尺寸 = %hu B / 已用 = %hu B / 数量 = %hu / 平均 = %u B\n"
 
-#: strcache.c:319
+#: src/strcache.c:319
 #, c-format
 msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
 msgstr "%s 其他已用: 总共 = %lu B / 数量 = %lu / 平均 = %lu B\n"
 
-#: strcache.c:322
+#: src/strcache.c:322
 #, c-format
 msgid ""
 "%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
 msgstr ""
 "%s 其他空余: 总共 = %lu B / 最大 = %lu B / 最小 = %lu B / 平均 = %hu B\n"
 
-#: strcache.c:326
+#: src/strcache.c:326
 #, c-format
 msgid ""
 "\n"
@@ -1978,7 +2025,7 @@ msgstr ""
 "\n"
 "%s strcache 性能:查找 = %lu / 命中率 = %lu%%\n"
 
-#: strcache.c:328
+#: src/strcache.c:328
 msgid ""
 "# hash-table stats:\n"
 "# "
@@ -1986,44 +2033,44 @@ msgstr ""
 "# 杂凑表统计数据:\n"
 "# "
 
-#: variable.c:1629
+#: src/variable.c:1653
 msgid "automatic"
 msgstr "自动"
 
-#: variable.c:1632
+#: src/variable.c:1656
 msgid "default"
 msgstr "默认"
 
-#: variable.c:1635
+#: src/variable.c:1659
 msgid "environment"
 msgstr "环境"
 
-#: variable.c:1638
+#: src/variable.c:1662
 msgid "makefile"
 msgstr "makefile"
 
-#: variable.c:1641
+#: src/variable.c:1665
 msgid "environment under -e"
 msgstr "-e 指定的环境变量"
 
-#: variable.c:1644
+#: src/variable.c:1668
 msgid "command line"
 msgstr "命令行"
 
-#: variable.c:1647
+#: src/variable.c:1671
 msgid "'override' directive"
 msgstr "“override”指令"
 
-#: variable.c:1658
+#: src/variable.c:1682
 #, c-format
 msgid " (from '%s', line %lu)"
 msgstr " (从“%s”,行 %lu)"
 
-#: variable.c:1721
+#: src/variable.c:1745
 msgid "# variable set hash-table stats:\n"
 msgstr "# 变量的杂凑表状态:\n"
 
-#: variable.c:1732
+#: src/variable.c:1756
 msgid ""
 "\n"
 "# Variables\n"
@@ -2031,7 +2078,7 @@ msgstr ""
 "\n"
 "# 变量\n"
 
-#: variable.c:1736
+#: src/variable.c:1760
 msgid ""
 "\n"
 "# Pattern-specific Variable Values"
@@ -2039,7 +2086,7 @@ msgstr ""
 "\n"
 "# Pattern-specific 变量值"
 
-#: variable.c:1750
+#: src/variable.c:1774
 msgid ""
 "\n"
 "# No pattern-specific variable values."
@@ -2047,7 +2094,7 @@ msgstr ""
 "\n"
 "# 没有 pattern-specific 变量的值。"
 
-#: variable.c:1752
+#: src/variable.c:1776
 #, c-format
 msgid ""
 "\n"
@@ -2056,47 +2103,47 @@ msgstr ""
 "\n"
 "# %u 个 pattern-specific 变量的值"
 
-#: variable.h:224
+#: src/variable.h:229
 #, c-format
 msgid "warning: undefined variable '%.*s'"
 msgstr "警告:未定义的变量“%.*s”"
 
-#: vmsfunctions.c:91
+#: src/vmsfunctions.c:91
 #, c-format
 msgid "sys$search() failed with %d\n"
 msgstr "sys$search() 失败并返回 %d\n"
 
-#: vmsjobs.c:242
+#: src/vmsjobs.c:244
 #, c-format
 msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
 msgstr "-警告, 你可能必须从 DCL 重新启用 CTRL-Y 处理。\n"
 
-#: vmsjobs.c:679
+#: src/vmsjobs.c:681
 #, c-format
 msgid "BUILTIN CD %s\n"
 msgstr "BUILTIN CD %s\n"
 
-#: vmsjobs.c:1228
+#: src/vmsjobs.c:1224
 #, c-format
 msgid "DCL: %s\n"
 msgstr "DCL:%s\n"
 
-#: vmsjobs.c:1288
+#: src/vmsjobs.c:1284
 #, c-format
 msgid "Append output to %s\n"
 msgstr "将输出追加到 %s\n"
 
-#: vmsjobs.c:1313
+#: src/vmsjobs.c:1309
 #, c-format
 msgid "Append %.*s and cleanup\n"
 msgstr "追加 %.*s 并清理\n"
 
-#: vmsjobs.c:1326
+#: src/vmsjobs.c:1322
 #, c-format
 msgid "Executing %s instead\n"
 msgstr "执行 %s 作为替代\n"
 
-#: vpath.c:603
+#: src/vpath.c:603
 msgid ""
 "\n"
 "# VPATH Search Paths\n"
@@ -2104,11 +2151,11 @@ msgstr ""
 "\n"
 "# VPATH 搜索路径\n"
 
-#: vpath.c:620
+#: src/vpath.c:620
 msgid "# No 'vpath' search paths."
 msgstr "# 没有“vpath”搜索路径。"
 
-#: vpath.c:622
+#: src/vpath.c:622
 #, c-format
 msgid ""
 "\n"
@@ -2117,7 +2164,7 @@ msgstr ""
 "\n"
 "# %u “vpath”搜索路径。\n"
 
-#: vpath.c:625
+#: src/vpath.c:625
 msgid ""
 "\n"
 "# No general ('VPATH' variable) search path."
@@ -2125,7 +2172,7 @@ msgstr ""
 "\n"
 "# 没有通用搜索路径(“VPATH”变量)。"
 
-#: vpath.c:631
+#: src/vpath.c:631
 msgid ""
 "\n"
 "# General ('VPATH' variable) search path:\n"
@@ -2135,37 +2182,61 @@ msgstr ""
 "# 通用搜索路径(“VPATH”变量):\n"
 "# "
 
-#: w32/w32os.c:46
+#: src/w32/w32os.c:44
 #, c-format
 msgid "Jobserver slots limited to %d\n"
-msgstr "jobserver 槽位数限制为 %d\n"
+msgstr "Jobserver 槽位数限制为 %d\n"
 
-#: w32/w32os.c:62
+#: src/w32/w32os.c:60
 #, c-format
 msgid "creating jobserver semaphore: (Error %ld: %s)"
 msgstr "正创建 jobserver 信号量:(错误 %ld:%s)"
 
-#: w32/w32os.c:81
+#: src/w32/w32os.c:79
 #, c-format
 msgid ""
 "internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
 msgstr "内部错误:无法打开 jobserver 信号量“%s”:(错误 %ld:%s)"
 
-#: w32/w32os.c:84
+#: src/w32/w32os.c:82
 #, c-format
 msgid "Jobserver client (semaphore %s)\n"
-msgstr "jobserver 客户端(信号量 %s)\n"
+msgstr "Jobserver 客户端(信号量 %s)\n"
 
-#: w32/w32os.c:125
+#: src/w32/w32os.c:123
 #, c-format
 msgid "release jobserver semaphore: (Error %ld: %s)"
 msgstr "释放 jobserver 信号量:(错误 %ld:%s)"
 
-#: w32/w32os.c:192
+#: src/w32/w32os.c:194
 #, c-format
 msgid "semaphore or child process wait: (Error %ld: %s)"
 msgstr "信号量或子进程等待:(错误 %ld:%s)"
 
+#~ msgid "%s: %s: Command not found\n"
+#~ msgstr "%s:%s:命令未找到\n"
+
+#~ msgid "%s[%u]: %s: Command not found\n"
+#~ msgstr "%s[%u]:%s:命令未找到\n"
+
+#~ msgid "%s: Shell program not found"
+#~ msgstr "%s:未找到 shell 程序"
+
+#~ msgid "%s is suspending for 30 seconds..."
+#~ msgstr "%s 正在挂起 30 秒..."
+
+#~ msgid "done sleep(30). Continuing.\n"
+#~ msgstr "睡眠完成(30)。继续。\n"
+
+#~ msgid "Unknown error %d"
+#~ msgstr "未知错误 %d"
+
+#~ msgid "Warning: File '%s' has modification time in the future"
+#~ msgstr "警告:文件“%s”的修改时间在未来"
+
+#~ msgid " terminal."
+#~ msgstr " 终端。"
+
 #~ msgid "%s: recipe for target '%s' failed"
 #~ msgstr "%s: '%s' 的命令配方失败"
 
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
new file mode 100644 (file)
index 0000000..bf951d3
Binary files /dev/null and b/po/zh_TW.gmo differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644 (file)
index 0000000..768ae37
--- /dev/null
@@ -0,0 +1,2222 @@
+# Chinese (traditional) translation for make.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the make package.
+#
+# Wang Li <charles@linux.net.cn>, 2002.
+# LI Daobing <lidaobing@gmail.com>, 2008, 2013.
+# Mingye Wang <arthur200126@gmail.com>, 2015, 2016.
+# Y.C Cheng <mail@ycheng.net>, 2017.
+# Boyuan Yang <073plan@gmail.com>, 2018, 2019.
+# pan93412 <pan93412@gmail.com>, 2019, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: make 4.2.93\n"
+"Report-Msgid-Bugs-To: bug-make@gnu.org\n"
+"POT-Creation-Date: 2020-01-19 15:34-0500\n"
+"PO-Revision-Date: 2020-01-03 20:13+0800\n"
+"Last-Translator: pan93412 <pan93412@gmail.com>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@lists.linux.org.tw>\n"
+"Language: zh_TW\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Lokalize 19.12.0\n"
+"X-ZhConverter: 繁化姬 dict-4ac8d2ed-r906 @ 2019/10/24 21:28:21 | https://"
+"zhconvert.org\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: src/ar.c:46
+#, c-format
+msgid "attempt to use unsupported feature: '%s'"
+msgstr "試圖使用不支援的功能:「%s」"
+
+#: src/ar.c:123
+#, c-format
+msgid "touch archive member is not available on VMS"
+msgstr "VMS 系統上不支援 touch 封存成員"
+
+#: src/ar.c:147
+#, c-format
+msgid "touch: Archive '%s' does not exist"
+msgstr "touch:封存檔案「%s」不存在"
+
+#: src/ar.c:150
+#, c-format
+msgid "touch: '%s' is not a valid archive"
+msgstr "touch:「%s」不是有效的封存檔案"
+
+#: src/ar.c:157
+#, c-format
+msgid "touch: Member '%s' does not exist in '%s'"
+msgstr "touch:在「%2$s」中不存在成員「%1$s」"
+
+#: src/ar.c:164
+#, c-format
+msgid "touch: Bad return code from ar_member_touch on '%s'"
+msgstr "touch:「%s」上的 ar_member_touch 的返回碼不當"
+
+#: src/arscan.c:130
+#, c-format
+msgid "lbr$set_module() failed to extract module info, status = %d"
+msgstr "lbr$set_modules() 取得模組訊息失敗,返回狀態 = %d"
+
+#: src/arscan.c:236
+#, c-format
+msgid "lbr$ini_control() failed with status = %d"
+msgstr "lbr$ini_control() 失敗,返回狀態 = %d"
+
+#: src/arscan.c:261
+#, c-format
+msgid "unable to open library '%s' to lookup member status %d"
+msgstr "無法打開函式庫「%s」以尋找成員,狀態 %d"
+
+#: src/arscan.c:944
+#, c-format
+msgid "Member '%s'%s: %ld bytes at %ld (%ld).\n"
+msgstr "成員「%s」%s: %ld 位元組於 %ld (%ld)。\n"
+
+#: src/arscan.c:945
+msgid " (name might be truncated)"
+msgstr " (名稱可能被截斷)"
+
+#: src/arscan.c:947
+#, c-format
+msgid "  Date %s"
+msgstr "  日期 %s"
+
+#: src/arscan.c:948
+#, c-format
+msgid "  uid = %d, gid = %d, mode = 0%o.\n"
+msgstr "  uid = %d,gid = %d,mode = 0%o。\n"
+
+#: src/commands.c:403
+#, c-format
+msgid "Recipe has too many lines (%ud)"
+msgstr "指令方案行數太多 (%ud)"
+
+#: src/commands.c:504
+msgid "*** Break.\n"
+msgstr "*** 中斷。\n"
+
+#: src/commands.c:628
+#, c-format
+msgid "*** [%s] Archive member '%s' may be bogus; not deleted"
+msgstr "*** [%s] 封存成員「%s」可能是假的;未刪除"
+
+# 是化學的成分,是特技!
+#: src/commands.c:632
+#, c-format
+msgid "*** Archive member '%s' may be bogus; not deleted"
+msgstr "*** 封存成員「%s」可能是假的;未刪除"
+
+#: src/commands.c:646
+#, c-format
+msgid "*** [%s] Deleting file '%s'"
+msgstr "*** [%s] 正在刪除檔案「%s」"
+
+#: src/commands.c:648
+#, c-format
+msgid "*** Deleting file '%s'"
+msgstr "*** 正在刪除檔案「%s」"
+
+#: src/commands.c:684
+msgid "#  recipe to execute"
+msgstr "#  要執行的方案"
+
+#: src/commands.c:687
+msgid " (built-in):"
+msgstr " (內建):"
+
+#: src/commands.c:689
+#, c-format
+msgid " (from '%s', line %lu):\n"
+msgstr " (從「%s」,行 %lu):\n"
+
+#: src/dir.c:1073
+msgid ""
+"\n"
+"# Directories\n"
+msgstr ""
+"\n"
+"# 目錄\n"
+
+#: src/dir.c:1085
+#, c-format
+msgid "# %s: could not be stat'd.\n"
+msgstr "# %s:無法對其進行 stat 動作。\n"
+
+#: src/dir.c:1089
+msgid "# %s (key %s, mtime %I64u): could not be opened.\n"
+msgstr "# %s (關鍵字 %s,修改時間 %I64u):無法打開。\n"
+
+#: src/dir.c:1094
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"
+msgstr "# %s (裝置 %d,i-節點 [%d,%d,%d]):無法打開。\n"
+
+#: src/dir.c:1099
+#, c-format
+msgid "# %s (device %ld, inode %ld): could not be opened.\n"
+msgstr "# %s (裝置 %ld,i-節點 %ld):無法打開。\n"
+
+#: src/dir.c:1126
+msgid "# %s (key %s, mtime %I64u): "
+msgstr "# %s (關鍵字 %s,修改時間 %I64u):"
+
+#: src/dir.c:1131
+#, c-format
+msgid "# %s (device %d, inode [%d,%d,%d]): "
+msgstr "# %s (裝置 %d,i-節點 [%d,%d,%d]):"
+
+#: src/dir.c:1136
+#, c-format
+msgid "# %s (device %ld, inode %ld): "
+msgstr "# %s (裝置 %ld,i-節點 %ld):"
+
+#: src/dir.c:1142 src/dir.c:1163
+msgid "No"
+msgstr "無"
+
+#: src/dir.c:1145 src/dir.c:1166
+msgid " files, "
+msgstr " 檔案, "
+
+#: src/dir.c:1147 src/dir.c:1168
+msgid "no"
+msgstr "無"
+
+#: src/dir.c:1150
+msgid " impossibilities"
+msgstr " 不可能"
+
+#: src/dir.c:1154
+msgid " so far."
+msgstr " 迄今為止。"
+
+#: src/dir.c:1171
+#, c-format
+msgid " impossibilities in %lu directories.\n"
+msgstr " 不可能在 %lu 目錄中。\n"
+
+#: src/expand.c:125
+#, c-format
+msgid "Recursive variable '%s' references itself (eventually)"
+msgstr "遞迴變數「%s」(最終將會)引用自身"
+
+#: src/expand.c:271
+#, c-format
+msgid "unterminated variable reference"
+msgstr "未終止的變數引用"
+
+#: src/file.c:278
+#, c-format
+msgid "Recipe was specified for file '%s' at %s:%lu,"
+msgstr "關於檔案「%s」的指令方案在 %s:%lu 處指定,"
+
+#: src/file.c:283
+#, c-format
+msgid "Recipe for file '%s' was found by implicit rule search,"
+msgstr "關於檔案「%s」的指令方案透過隱含規則搜尋而找到,"
+
+#: src/file.c:287
+#, c-format
+msgid "but '%s' is now considered the same file as '%s'."
+msgstr "但「%s」現在被看做「%s」的同一個檔案。"
+
+#: src/file.c:290
+#, c-format
+msgid "Recipe for '%s' will be ignored in favor of the one for '%s'."
+msgstr "「%s」的指令方案被忽略,轉而使用「%s」的。"
+
+#: src/file.c:310
+#, c-format
+msgid "can't rename single-colon '%s' to double-colon '%s'"
+msgstr "無法將單冒號「%s」重新命名為雙冒號「%s」"
+
+#: src/file.c:316
+#, c-format
+msgid "can't rename double-colon '%s' to single-colon '%s'"
+msgstr "無法將雙冒號「%s」重新命名為單冒號「%s」"
+
+#: src/file.c:408
+#, c-format
+msgid "*** Deleting intermediate file '%s'"
+msgstr "*** 正在刪除中間檔案「%s」"
+
+#: src/file.c:412
+#, c-format
+msgid "Removing intermediate files...\n"
+msgstr "正在刪除中間檔案...\n"
+
+#: src/file.c:872
+msgid "Current time"
+msgstr "目前時間"
+
+#: src/file.c:876
+#, c-format
+msgid "%s: Timestamp out of range; substituting %s"
+msgstr "%s:時間標記超出範圍;正在取代 %s"
+
+#: src/file.c:1016
+msgid "# Not a target:"
+msgstr "# 不是一個目標:"
+
+#: src/file.c:1021
+msgid "#  Precious file (prerequisite of .PRECIOUS)."
+msgstr "#  重要檔案 (.PRECIOUS 的前提)。"
+
+#: src/file.c:1023
+msgid "#  Phony target (prerequisite of .PHONY)."
+msgstr "#  假目標 (.PHONY 的前提)。"
+
+#: src/file.c:1025
+msgid "#  Command line target."
+msgstr "#  指令列目標。"
+
+#: src/file.c:1027
+msgid "#  A default, MAKEFILES, or -include/sinclude makefile."
+msgstr "#  預設的、MAKEFILES 指定的、-include/sinclude 包含的 makefile。"
+
+#: src/file.c:1029
+msgid "#  Builtin rule"
+msgstr "#  內建規則"
+
+#: src/file.c:1031
+msgid "#  Implicit rule search has been done."
+msgstr "#  對隱含規則的搜尋已完成。"
+
+#: src/file.c:1032
+msgid "#  Implicit rule search has not been done."
+msgstr "#  對隱含規則的搜尋尚未完成。"
+
+#: src/file.c:1034
+#, c-format
+msgid "#  Implicit/static pattern stem: '%s'\n"
+msgstr "#  隱含/靜態模式主幹:「%s」\n"
+
+#: src/file.c:1036
+msgid "#  File is an intermediate prerequisite."
+msgstr "#  檔案是一個中間前提。"
+
+#: src/file.c:1040
+msgid "#  Also makes:"
+msgstr "#  還要製作:"
+
+#: src/file.c:1046
+msgid "#  Modification time never checked."
+msgstr "#  從不檢查修改時間。"
+
+#: src/file.c:1048
+msgid "#  File does not exist."
+msgstr "#  檔案不存在。"
+
+#: src/file.c:1050
+msgid "#  File is very old."
+msgstr "#  檔案非常陳舊。"
+
+#: src/file.c:1055
+#, c-format
+msgid "#  Last modified %s\n"
+msgstr "#  最近更新 %s\n"
+
+#: src/file.c:1058
+msgid "#  File has been updated."
+msgstr "#  檔案已經被更新。"
+
+#: src/file.c:1058
+msgid "#  File has not been updated."
+msgstr "#  檔案尚未被更新。"
+
+#: src/file.c:1062
+msgid "#  Recipe currently running (THIS IS A BUG)."
+msgstr "#  正在執行的方案 (這是 BUG)。"
+
+#: src/file.c:1065
+msgid "#  Dependencies recipe running (THIS IS A BUG)."
+msgstr "#  正在執行的依賴性方案 (這是 BUG)。"
+
+#: src/file.c:1074
+msgid "#  Successfully updated."
+msgstr "#  更新成功。"
+
+#: src/file.c:1078
+msgid "#  Needs to be updated (-q is set)."
+msgstr "#  需要更新 (用 -q 設定)。"
+
+#: src/file.c:1081
+msgid "#  Failed to be updated."
+msgstr "#  更新失敗。"
+
+#: src/file.c:1086
+msgid "#  Invalid value in 'command_state' member!"
+msgstr "# 「command_state」成員中存在無效的值!"
+
+#: src/file.c:1105
+msgid ""
+"\n"
+"# Files"
+msgstr ""
+"\n"
+"# 檔案"
+
+#: src/file.c:1109
+msgid ""
+"\n"
+"# files hash-table stats:\n"
+"# "
+msgstr ""
+"\n"
+"# 檔案雜湊表狀態:\n"
+"# "
+
+#: src/file.c:1119
+#, c-format
+msgid "%s: Field '%s' not cached: %s"
+msgstr "%s:欄位「%s」未被快取:%s"
+
+#: src/function.c:794
+msgid "non-numeric first argument to 'word' function"
+msgstr "「word」函數的第一個參數不是數字"
+
+#: src/function.c:799
+#, c-format
+msgid "first argument to 'word' function must be greater than 0"
+msgstr "「word」函數的第一個參數必須大於 0"
+
+#: src/function.c:819
+msgid "non-numeric first argument to 'wordlist' function"
+msgstr "「wordlist」函數的第一個參數不是數字"
+
+#: src/function.c:821
+msgid "non-numeric second argument to 'wordlist' function"
+msgstr "「wordlist」函數的第二個參數不是數字"
+
+# 程式設計師的函數名提示,還是不要動吧。
+#: src/function.c:1533
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(In) 失敗 (e=%ld)\n"
+
+#: src/function.c:1557
+#, c-format
+msgid "windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"
+msgstr "windows32_openpipe: DuplicateHandle(Err) 失敗 (e=%ld)\n"
+
+#: src/function.c:1564
+#, c-format
+msgid "CreatePipe() failed (e=%ld)\n"
+msgstr "CreatePipe() 失敗 (e=%ld)\n"
+
+#: src/function.c:1572
+#, c-format
+msgid "windows32_openpipe(): process_init_fd() failed\n"
+msgstr "windows32_openpipe(): process_init_fd() 失敗\n"
+
+#: src/function.c:1857
+#, c-format
+msgid "Cleaning up temporary batch file %s\n"
+msgstr "正在清除暫時批次檔 %s\n"
+
+#: src/function.c:2230 src/function.c:2255
+#, c-format
+msgid "file: missing filename"
+msgstr "file:缺少檔案名"
+
+#: src/function.c:2234 src/function.c:2265
+#, c-format
+msgid "open: %s: %s"
+msgstr "open: %s: %s"
+
+#: src/function.c:2242
+#, c-format
+msgid "write: %s: %s"
+msgstr "write: %s: %s"
+
+#: src/function.c:2245 src/function.c:2282
+#, c-format
+msgid "close: %s: %s"
+msgstr "close:%s:%s"
+
+#: src/function.c:2258
+#, c-format
+msgid "file: too many arguments"
+msgstr "file:太多參數"
+
+#: src/function.c:2277
+#, c-format
+msgid "read: %s: %s"
+msgstr "read:%s:%s"
+
+#: src/function.c:2290
+#, c-format
+msgid "file: invalid file operation: %s"
+msgstr "file:無效檔案(file)動作:%s"
+
+#: src/function.c:2405
+#, c-format
+msgid "insufficient number of arguments (%d) to function '%s'"
+msgstr "函數「%2$s」的參數數量 (%1$d) 不夠"
+
+#: src/function.c:2417
+#, c-format
+msgid "unimplemented on this platform: function '%s'"
+msgstr "在本平台上未實現:函數「%s」"
+
+#: src/function.c:2483
+#, c-format
+msgid "unterminated call to function '%s': missing '%c'"
+msgstr "對函數「%s」的未終止的呼叫:遺漏「%c」"
+
+#: src/function.c:2667
+#, c-format
+msgid "Empty function name"
+msgstr "空函數名"
+
+#: src/function.c:2669
+#, c-format
+msgid "Invalid function name: %s"
+msgstr "無效的函數名稱:%s"
+
+#: src/function.c:2671
+#, c-format
+msgid "Function name too long: %s"
+msgstr "函數名稱太長:%s"
+
+#: src/function.c:2674
+#, c-format
+msgid "Invalid minimum argument count (%u) for function %s"
+msgstr "函數「%2$s」的最少參數數量 (%1$u) 無效"
+
+#: src/function.c:2677
+#, c-format
+msgid "Invalid maximum argument count (%u) for function %s"
+msgstr "函數「%2$s」的最多參數數量 (%1$u) 無效"
+
+#: src/getopt.c:659
+#, c-format
+msgid "%s: option '%s' is ambiguous\n"
+msgstr "%s:選項「%s」含義不清\n"
+
+#: src/getopt.c:683
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s:選項「--%s」不允許參數\n"
+
+#: src/getopt.c:688
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s:選項「%c%s」不允許參數\n"
+
+#: src/getopt.c:705 src/getopt.c:878
+#, c-format
+msgid "%s: option '%s' requires an argument\n"
+msgstr "%s:選項「%s」需要一個參數\n"
+
+#: src/getopt.c:734
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s:無法識別的選項「--%s」\n"
+
+#: src/getopt.c:738
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s:無法識別的選項「%c%s」\n"
+
+#: src/getopt.c:764
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s:選項無效 ─ %c\n"
+
+#: src/getopt.c:767
+#, c-format
+msgid "%s: invalid option -- %c\n"
+msgstr "%s:無效選項 -- %c\n"
+
+#: src/getopt.c:797 src/getopt.c:927
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s:選項需要一個參數 -- %c\n"
+
+#: src/getopt.c:844
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s:選項「-W %s」含義不清\n"
+
+#: src/getopt.c:862
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s:選項「-W %s」不允許給出參數\n"
+
+#: src/guile.c:58
+#, c-format
+msgid "guile: Expanding '%s'\n"
+msgstr "guile: 正展開 '%s'\n"
+
+#: src/guile.c:74
+#, c-format
+msgid "guile: Evaluating '%s'\n"
+msgstr "guile: 正求值 '%s'\n"
+
+#: src/hash.c:50
+#, c-format
+msgid "can't allocate %lu bytes for hash table: memory exhausted"
+msgstr "無法為雜湊表分配 %lu 位元組: 記憶體耗盡"
+
+#: src/hash.c:280
+#, c-format
+msgid "Load=%lu/%lu=%.0f%%, "
+msgstr "負載=%lu/%lu=%.0f%%, "
+
+#: src/hash.c:282
+#, c-format
+msgid "Rehash=%u, "
+msgstr "重新雜湊=%u, "
+
+#: src/hash.c:283
+#, c-format
+msgid "Collisions=%lu/%lu=%.0f%%"
+msgstr "碰撞=%lu/%lu=%.0f%%"
+
+#: src/implicit.c:38
+#, c-format
+msgid "Looking for an implicit rule for '%s'.\n"
+msgstr "正在為「%s」尋找隱含規則。\n"
+
+#: src/implicit.c:54
+#, c-format
+msgid "Looking for archive-member implicit rule for '%s'.\n"
+msgstr "正在為「%s」尋找封存成員隱含規則。\n"
+
+#: src/implicit.c:311
+#, c-format
+msgid "Avoiding implicit rule recursion.\n"
+msgstr "避免隱含規則遞迴。\n"
+
+#: src/implicit.c:484
+#, c-format
+msgid "Stem too long: '%s%.*s'.\n"
+msgstr "主幹太長:「%s%.*s」。\n"
+
+#: src/implicit.c:490
+#, c-format
+msgid "Trying pattern rule with stem '%.*s'.\n"
+msgstr "用主幹「%.*s」嘗試符合模式規則。\n"
+
+#: src/implicit.c:717
+#, c-format
+msgid "Rejecting impossible rule prerequisite '%s'.\n"
+msgstr "拒絕不可能的規則前提「%s」。\n"
+
+#: src/implicit.c:718
+#, c-format
+msgid "Rejecting impossible implicit prerequisite '%s'.\n"
+msgstr "拒絕不可能的隱含前提「%s」。\n"
+
+#: src/implicit.c:732
+#, c-format
+msgid "Trying rule prerequisite '%s'.\n"
+msgstr "嘗試規則前提「%s」。\n"
+
+#: src/implicit.c:733
+#, c-format
+msgid "Trying implicit prerequisite '%s'.\n"
+msgstr "嘗試隱含前提「%s」。\n"
+
+#: src/implicit.c:772
+#, c-format
+msgid "Found prerequisite '%s' as VPATH '%s'\n"
+msgstr "前提「%s」在 VPATH「%s」中發現\n"
+
+#: src/implicit.c:786
+#, c-format
+msgid "Looking for a rule with intermediate file '%s'.\n"
+msgstr "正在尋找包含中間檔案「%s」的規則。\n"
+
+#: src/job.c:370
+msgid "Cannot create a temporary file\n"
+msgstr "無法建立暫存檔\n"
+
+#: src/job.c:548
+msgid " (core dumped)"
+msgstr " (已傾印核心)"
+
+#: src/job.c:553
+msgid " (ignored)"
+msgstr " (已忽略)"
+
+#: src/job.c:557 src/job.c:1892
+msgid "<builtin>"
+msgstr "<內建>"
+
+#: src/job.c:573
+#, c-format
+msgid "%s[%s: %s] Error %d%s"
+msgstr "%s[%s:%s] 錯誤 %d%s"
+
+#: src/job.c:662
+#, c-format
+msgid "*** Waiting for unfinished jobs...."
+msgstr "*** 正在等待未完成的作業...."
+
+#: src/job.c:704
+#, c-format
+msgid "Live child %p (%s) PID %s %s\n"
+msgstr "使用中子程序 %p (%s) PID %s %s\n"
+
+#: src/job.c:706 src/job.c:900 src/job.c:1072 src/job.c:1644
+#, c-format
+msgid " (remote)"
+msgstr " (遠端)"
+
+#: src/job.c:898
+#, c-format
+msgid "Reaping winning child %p PID %s %s\n"
+msgstr "正在中止獲勝的子程序 %p PID %s %s\n"
+
+#: src/job.c:899
+#, c-format
+msgid "Reaping losing child %p PID %s %s\n"
+msgstr "正在中止失敗的子程序 %p PID %s %s\n"
+
+#: src/job.c:950
+#, c-format
+msgid "Cleaning up temp batch file %s\n"
+msgstr "正在清除暫時批次檔 %s\n"
+
+#: src/job.c:956
+#, c-format
+msgid "Cleaning up temp batch file %s failed (%d)\n"
+msgstr "清理暫時批次檔 %s 失敗 (%d)\n"
+
+#: src/job.c:1071
+#, c-format
+msgid "Removing child %p PID %s%s from chain.\n"
+msgstr "從鏈中刪除子程序 %p PID %s%s。\n"
+
+#: src/job.c:1120
+#, c-format
+msgid "Released token for child %p (%s).\n"
+msgstr "為子程序 %p (%s) 釋放憑證 (token)。\n"
+
+#: src/job.c:1575 src/job.c:2487
+#, c-format
+msgid "process_easy() failed to launch process (e=%ld)\n"
+msgstr "process_easy() 啟動處理程序失敗 (e=%ld)\n"
+
+#: src/job.c:1579 src/job.c:2491
+#, c-format
+msgid ""
+"\n"
+"Counted %d args in failed launch\n"
+msgstr ""
+"\n"
+"失敗執行中共有 %d 個參數。\n"
+
+#: src/job.c:1642
+#, c-format
+msgid "Putting child %p (%s) PID %s%s on the chain.\n"
+msgstr "將子程序 %p (%s) PID %s%s 放入鏈。\n"
+
+#: src/job.c:1875
+#, c-format
+msgid "Obtained token for child %p (%s).\n"
+msgstr "取得至處理程序 %p (%s) 的標記。\n"
+
+#: src/job.c:1902
+#, c-format
+msgid "%s: target '%s' does not exist"
+msgstr "%s: 目標檔案「%s」不存在"
+
+#: src/job.c:1905
+#, c-format
+msgid "%s: update target '%s' due to: %s"
+msgstr "%s:更新「%s」,因為:%s"
+
+#: src/job.c:2108
+#, c-format
+msgid "cannot enforce load limits on this operating system"
+msgstr "無法在本作業系統中實施負載限制"
+
+#: src/job.c:2110
+msgid "cannot enforce load limit: "
+msgstr "無法實施負載限制:"
+
+#: src/job.c:2200
+#, c-format
+msgid "no more file handles: could not duplicate stdin\n"
+msgstr "沒有剩餘的檔案處理器: 無法複製標準輸入\n"
+
+#: src/job.c:2212
+#, c-format
+msgid "no more file handles: could not duplicate stdout\n"
+msgstr "沒有剩餘的檔案處理器: 無法複製標準輸出\n"
+
+#: src/job.c:2226
+#, c-format
+msgid "no more file handles: could not duplicate stderr\n"
+msgstr "沒有剩餘的檔案處理器: 無法複製標準錯誤\n"
+
+#: src/job.c:2241
+#, c-format
+msgid "Could not restore stdin\n"
+msgstr "無法還原標準輸入\n"
+
+#: src/job.c:2249
+#, c-format
+msgid "Could not restore stdout\n"
+msgstr "無法還原標準輸出\n"
+
+#: src/job.c:2257
+#, c-format
+msgid "Could not restore stderr\n"
+msgstr "無法還原標準錯誤\n"
+
+#: src/job.c:2520
+#, c-format
+msgid "make reaped child pid %s, still waiting for pid %s\n"
+msgstr "make 已中止的子程序 pid %s,仍在等待 pid %s\n"
+
+#: src/job.c:2623
+#, c-format
+msgid "spawnvpe: environment space might be exhausted"
+msgstr "spawnvpe: 環境變數空間可能會耗盡"
+
+#: src/job.c:2862
+#, c-format
+msgid "$SHELL changed (was '%s', now '%s')\n"
+msgstr "$SHELL 已改變 (原為「%s」,現為「%s」)\n"
+
+#: src/job.c:3300 src/job.c:3485
+#, c-format
+msgid "Creating temporary batch file %s\n"
+msgstr "正在建立暫時批檔案 %s\n"
+
+#: src/job.c:3308
+#, c-format
+msgid ""
+"Batch file contents:\n"
+"\t@echo off\n"
+msgstr ""
+"批次檔內容:\n"
+"\t@echo off\n"
+
+#: src/job.c:3497
+#, c-format
+msgid ""
+"Batch file contents:%s\n"
+"\t%s\n"
+msgstr ""
+"批次檔內容:%s\n"
+"\t%s\n"
+
+#: src/job.c:3605
+#, c-format
+msgid "%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"
+msgstr "%s (行 %d) 錯誤的 shell 上下文 (!unixy && !batch_mode_shell)\n"
+
+#: src/load.c:60
+#, c-format
+msgid "Failed to open global symbol table: %s"
+msgstr "打開全域符號表失敗:%s"
+
+#: src/load.c:97
+#, c-format
+msgid "Loaded object %s is not declared to be GPL compatible"
+msgstr "已載入的物件 %s 未聲明為 GPL 相容"
+
+#: src/load.c:104
+#, c-format
+msgid "Failed to load symbol %s from %s: %s"
+msgstr "從 %2$s 載入符號 %1$s 失敗:%3$s"
+
+#: src/load.c:149
+#, c-format
+msgid "Empty symbol name for load: %s"
+msgstr "要載入的符號名為空:%s"
+
+#: src/load.c:204
+#, c-format
+msgid "Loading symbol %s from %s\n"
+msgstr "正從 %2$s 載入符號 %1$s\n"
+
+#: src/load.c:256
+#, c-format
+msgid "The 'load' operation is not supported on this platform."
+msgstr "本平台不支援「load」動作。"
+
+#: src/main.c:335
+msgid "Options:\n"
+msgstr "選項:\n"
+
+#: src/main.c:336
+msgid "  -b, -m                      Ignored for compatibility.\n"
+msgstr "  -b, -m                      為相容性而忽略。\n"
+
+#: src/main.c:338
+msgid "  -B, --always-make           Unconditionally make all targets.\n"
+msgstr "  -B, --always-make           無條件製作 (make) 所有目標。\n"
+
+#: src/main.c:340
+msgid ""
+"  -C DIRECTORY, --directory=DIRECTORY\n"
+"                              Change to DIRECTORY before doing anything.\n"
+msgstr "  -C 目錄, --directory=目錄    在執行前先切換到 <目錄>。\n"
+
+#: src/main.c:343
+msgid "  -d                          Print lots of debugging information.\n"
+msgstr "  -d                          輸出大量除錯訊息。\n"
+
+#: src/main.c:345
+msgid ""
+"  --debug[=FLAGS]             Print various types of debugging information.\n"
+msgstr "  --debug[=旗標]               輸出各種除錯訊息。\n"
+
+#: src/main.c:347
+msgid ""
+"  -e, --environment-overrides\n"
+"                              Environment variables override makefiles.\n"
+msgstr ""
+"  -e, --environment-overrides\n"
+"                              環境變數覆蓋 makefile 中的變數。\n"
+
+#: src/main.c:350
+msgid ""
+"  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"
+msgstr "  -E 字串, --eval=字串        將 <字串> 作為 makefile 語句估值。\n"
+
+#: src/main.c:352
+msgid ""
+"  -f FILE, --file=FILE, --makefile=FILE\n"
+"                              Read FILE as a makefile.\n"
+msgstr ""
+"  -f 檔案, --file=檔案, --makefile=檔案\n"
+"                              從 <檔案> 中讀入 makefile。\n"
+
+#: src/main.c:355
+msgid "  -h, --help                  Print this message and exit.\n"
+msgstr "  -h, --help                  輸出該訊息並離開。\n"
+
+#: src/main.c:357
+msgid "  -i, --ignore-errors         Ignore errors from recipes.\n"
+msgstr "  -i, --ignore-errors         忽略來自指令方案的錯誤。\n"
+
+#: src/main.c:359
+msgid ""
+"  -I DIRECTORY, --include-dir=DIRECTORY\n"
+"                              Search DIRECTORY for included makefiles.\n"
+msgstr "  -I 目錄, --include-dir=目錄  在 <目錄> 中搜尋被包含的 makefile。\n"
+
+#: src/main.c:362
+msgid ""
+"  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no "
+"arg.\n"
+msgstr ""
+"  -j [N], --jobs[=N]          同時允許 N 個作業;無參數表明允許無限個作業。\n"
+
+#: src/main.c:364
+msgid ""
+"  -k, --keep-going            Keep going when some targets can't be made.\n"
+msgstr "  -k, --keep-going            當某些目標無法製作時仍然繼續。\n"
+
+#: src/main.c:366
+msgid ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              Don't start multiple jobs unless load is below "
+"N.\n"
+msgstr ""
+"  -l [N], --load-average[=N], --max-load[=N]\n"
+"                              在系統負載高於 N 時不啟動多作業。\n"
+
+#: src/main.c:369
+msgid ""
+"  -L, --check-symlink-times   Use the latest mtime between symlinks and "
+"target.\n"
+msgstr ""
+"  -L, --check-symlink-times   使用符號連結及符號連結目標中修改時間較晚的一"
+"個。\n"
+
+#: src/main.c:371
+msgid ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              Don't actually run any recipe; just print "
+"them.\n"
+msgstr ""
+"  -n, --just-print, --dry-run, --recon\n"
+"                              只輸出指令方案,不實際執行。\n"
+
+#: src/main.c:374
+msgid ""
+"  -o FILE, --old-file=FILE, --assume-old=FILE\n"
+"                              Consider FILE to be very old and don't remake "
+"it.\n"
+msgstr ""
+"  -o 檔案, --old-file=檔案, --assume-old=檔案\n"
+"                              將 <檔案> 當做很舊,不必重新製作。\n"
+
+#: src/main.c:377
+msgid ""
+"  -O[TYPE], --output-sync[=TYPE]\n"
+"                              Synchronize output of parallel jobs by TYPE.\n"
+msgstr ""
+"  -O[類型], --output-sync[=類型]\n"
+"                           使用 <類型> 方式同步並行作業輸出。\n"
+
+#: src/main.c:380
+msgid "  -p, --print-data-base       Print make's internal database.\n"
+msgstr "  -p, --print-data-base       輸出 make 的內部資料庫。\n"
+
+#: src/main.c:382
+msgid ""
+"  -q, --question              Run no recipe; exit status says if up to "
+"date.\n"
+msgstr ""
+"  -q, --question              不執行任何方案;離開狀態說明是否已全部更新。\n"
+
+#: src/main.c:384
+msgid "  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"
+msgstr "  -r, --no-builtin-rules      停用內建隱含規則。\n"
+
+#: src/main.c:386
+msgid "  -R, --no-builtin-variables  Disable the built-in variable settings.\n"
+msgstr "  -R, --no-builtin-variables  停用內建變數設定。\n"
+
+#: src/main.c:388
+msgid "  -s, --silent, --quiet       Don't echo recipes.\n"
+msgstr "  -s, --silent, --quiet       不輸出方案指令。\n"
+
+#: src/main.c:390
+msgid "  --no-silent                 Echo recipes (disable --silent mode).\n"
+msgstr "  --no-silent                 對方案進行回顯(停用 --silent 模式)。\n"
+
+#: src/main.c:392
+msgid ""
+"  -S, --no-keep-going, --stop\n"
+"                              Turns off -k.\n"
+msgstr ""
+"  -S, --no-keep-going, --stop\n"
+"                              關閉 -k。\n"
+
+#: src/main.c:395
+msgid "  -t, --touch                 Touch targets instead of remaking them.\n"
+msgstr ""
+"  -t, --touch                 touch 目標(更新修改時間)而不是重新製作它"
+"們。\n"
+
+#: src/main.c:397
+msgid "  --trace                     Print tracing information.\n"
+msgstr "  --trace                     輸出跟蹤訊息。\n"
+
+#: src/main.c:399
+msgid ""
+"  -v, --version               Print the version number of make and exit.\n"
+msgstr "  -v, --version               輸出 make 的版本號並離開。\n"
+
+#: src/main.c:401
+msgid "  -w, --print-directory       Print the current directory.\n"
+msgstr "  -w, --print-directory       輸出目前目錄。\n"
+
+#: src/main.c:403
+msgid ""
+"  --no-print-directory        Turn off -w, even if it was turned on "
+"implicitly.\n"
+msgstr "  --no-print-directory        關閉 -w,即使 -w 預設開啟。\n"
+
+#: src/main.c:405
+msgid ""
+"  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n"
+"                              Consider FILE to be infinitely new.\n"
+msgstr ""
+"  -W 檔案, --what-if=檔案, --new-file=檔案, --assume-new=檔案\n"
+"                              將 <檔案> 當做最新。\n"
+
+#: src/main.c:408
+msgid ""
+"  --warn-undefined-variables  Warn when an undefined variable is "
+"referenced.\n"
+msgstr "  --warn-undefined-variables  當引用未定義變數的時候發出警告。\n"
+
+#: src/main.c:671
+#, c-format
+msgid "empty string invalid as file name"
+msgstr "空字串是無效的檔案名"
+
+#: src/main.c:754
+#, c-format
+msgid "unknown debug level specification '%s'"
+msgstr "未知的除錯級別定義「%s」"
+
+#: src/main.c:794
+#, c-format
+msgid "unknown output-sync type '%s'"
+msgstr "不明輸出同步類型「%s」"
+
+#: src/main.c:849
+#, c-format
+msgid "%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"
+msgstr "%s:捕獲中斷/異常 (程式碼 = 0x%lx, 位址 = 0x%p)\n"
+
+#: src/main.c:856
+#, c-format
+msgid ""
+"\n"
+"Unhandled exception filter called from program %s\n"
+"ExceptionCode = %lx\n"
+"ExceptionFlags = %lx\n"
+"ExceptionAddress = 0x%p\n"
+msgstr ""
+"\n"
+"從程式 %s 產生的未處理的異常過濾器\n"
+"異常碼 = %lx\n"
+"異常標誌 = %lx\n"
+"異常位址 = 0x%p\n"
+
+#: src/main.c:864
+#, c-format
+msgid "Access violation: write operation at address 0x%p\n"
+msgstr "存取衝突:位址 0x%p 處的寫入動作\n"
+
+#: src/main.c:865
+#, c-format
+msgid "Access violation: read operation at address 0x%p\n"
+msgstr "存取衝突:位址 0x%p 處的讀取動作\n"
+
+#: src/main.c:941 src/main.c:956
+#, c-format
+msgid "find_and_set_shell() setting default_shell = %s\n"
+msgstr "find_and_set_shell() 設定 default_shell = %s\n"
+
+#: src/main.c:1009
+#, c-format
+msgid "find_and_set_shell() path search set default_shell = %s\n"
+msgstr "find_and_set_shell() 路徑搜尋結果設定 default_shell = %s\n"
+
+#: src/main.c:1609
+#, c-format
+msgid ""
+"warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."
+msgstr "警告: jobserver 不可用: 正使用 -j1。添加「+」到父 make 的規則。"
+
+#: src/main.c:1617
+#, c-format
+msgid "warning: -j%d forced in submake: resetting jobserver mode."
+msgstr "警告: 子 make 中強制 -j%d: 重設 jobserver 模式。"
+
+#: src/main.c:1781
+#, c-format
+msgid "Makefile from standard input specified twice."
+msgstr "兩次指明來自標準輸入的 makefile。"
+
+#: src/main.c:1819 src/vmsjobs.c:1248
+msgid "fopen (temporary file)"
+msgstr "fopen (暫存檔)"
+
+#: src/main.c:1825
+msgid "fwrite (temporary file)"
+msgstr "fwrite (暫存檔)"
+
+#: src/main.c:2004
+#, c-format
+msgid "warning: -j%d forced in makefile: resetting jobserver mode."
+msgstr "警告: 子 make 中強制 -j%d: 重設 jobserver 模式。"
+
+#: src/main.c:2068
+#, c-format
+msgid "Parallel jobs (-j) are not supported on this platform."
+msgstr "本平台不支援並行作業 (-j)。"
+
+#: src/main.c:2069
+#, c-format
+msgid "Resetting to single job (-j1) mode."
+msgstr "重設為單作業模式 (-j1)。"
+
+#: src/main.c:2109
+#, c-format
+msgid "Symbolic links not supported: disabling -L."
+msgstr "不支援符號連結:停用 -L。"
+
+#: src/main.c:2190
+#, c-format
+msgid "Updating makefiles....\n"
+msgstr "正在更新 makefile....\n"
+
+#: src/main.c:2226
+#, c-format
+msgid "Makefile '%s' might loop; not remaking it.\n"
+msgstr "Makefile「%s」可能循環;不會重新執行它。\n"
+
+#: src/main.c:2303
+#, c-format
+msgid "Failed to remake makefile '%s'."
+msgstr "重新執行 makefile「%s」失敗。"
+
+#: src/main.c:2323
+#, c-format
+msgid "Included makefile '%s' was not found."
+msgstr "找不到被引入的 makefile「%s」。"
+
+#: src/main.c:2328
+#, c-format
+msgid "Makefile '%s' was not found"
+msgstr "找不到 makefile「%s」"
+
+#: src/main.c:2394
+#, c-format
+msgid "Couldn't change back to original directory."
+msgstr "無法回到原始目錄。"
+
+#: src/main.c:2402
+#, c-format
+msgid "Re-executing[%u]:"
+msgstr "重新執行[%u]:"
+
+#: src/main.c:2522
+msgid "unlink (temporary file): "
+msgstr "刪除 (暫存檔):"
+
+#: src/main.c:2555
+#, c-format
+msgid ".DEFAULT_GOAL contains more than one target"
+msgstr ".DEFAULT_GOAL 包含多餘一個目標"
+
+#: src/main.c:2579
+#, c-format
+msgid "No targets"
+msgstr "無目標"
+
+#: src/main.c:2581
+#, c-format
+msgid "No targets specified and no makefile found"
+msgstr "沒有指明目標並且找不到 makefile"
+
+#: src/main.c:2586
+#, c-format
+msgid "Updating goal targets....\n"
+msgstr "更新目標....\n"
+
+#: src/main.c:2610
+#, c-format
+msgid "warning:  Clock skew detected.  Your build may be incomplete."
+msgstr "警告:檢測到時鐘錯誤。您的構建版本可能是不完整的。"
+
+#: src/main.c:2804
+#, c-format
+msgid "Usage: %s [options] [target] ...\n"
+msgstr "用法:%s [選項] [目標] ...\n"
+
+#: src/main.c:2810
+#, c-format
+msgid ""
+"\n"
+"This program built for %s\n"
+msgstr ""
+"\n"
+"該程式為 %s 編譯\n"
+
+#: src/main.c:2812
+#, c-format
+msgid ""
+"\n"
+"This program built for %s (%s)\n"
+msgstr ""
+"\n"
+"該程式為 %s (%s) 編譯\n"
+
+#: src/main.c:2815
+#, c-format
+msgid "Report bugs to <bug-make@gnu.org>\n"
+msgstr "報告錯誤到 <bug-make@gnu.org>\n"
+
+#: src/main.c:2901
+#, c-format
+msgid "the '%s%s' option requires a non-empty string argument"
+msgstr "「%s%s」選項需要非空字串參數"
+
+#: src/main.c:2965
+#, c-format
+msgid "the '-%c' option requires a positive integer argument"
+msgstr "「-%c」選項需要正整數參數"
+
+#: src/main.c:3363
+#, c-format
+msgid "%sBuilt for %s\n"
+msgstr "%s為 %s 編譯\n"
+
+#: src/main.c:3365
+#, c-format
+msgid "%sBuilt for %s (%s)\n"
+msgstr "%s為 %s (%s) 編譯\n"
+
+#: src/main.c:3376
+#, c-format
+msgid ""
+"%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
+"html>\n"
+"%sThis is free software: you are free to change and redistribute it.\n"
+"%sThere is NO WARRANTY, to the extent permitted by law.\n"
+msgstr ""
+"%s授權條款:GPLv3+:GNU 通用公共授權條款第 3 版或更新版本<http://gnu.org/"
+"licenses/gpl.html>。\n"
+"%s本軟體是自由軟體:您可以自由修改和重新發布它。\n"
+"%s在法律允許的範圍內沒有其他保證。\n"
+
+#: src/main.c:3397
+#, c-format
+msgid ""
+"\n"
+"# Make data base, printed on %s"
+msgstr ""
+"\n"
+"# make 資料基礎,輸出在 %s"
+
+#: src/main.c:3407
+#, c-format
+msgid ""
+"\n"
+"# Finished Make data base on %s\n"
+msgstr ""
+"\n"
+"# 在 %s 上完成 make 資料基礎\n"
+
+#: src/misc.c:643
+#, c-format
+msgid "%s: user %lu (real %lu), group %lu (real %lu)\n"
+msgstr "%s: 使用者 %lu (真實使用者 %lu), 組 %lu (真實組 %lu)\n"
+
+#: src/misc.c:664
+msgid "Initialized access"
+msgstr "初始化成功"
+
+#: src/misc.c:743
+msgid "User access"
+msgstr "使用者權限"
+
+#: src/misc.c:791
+msgid "Make access"
+msgstr "Make 權限"
+
+#: src/misc.c:825
+msgid "Child access"
+msgstr "子程序 權限"
+
+#: src/output.c:97
+#, c-format
+msgid "%s: Entering an unknown directory\n"
+msgstr "%s: 進入一個未知的目錄\n"
+
+#: src/output.c:99
+#, c-format
+msgid "%s: Leaving an unknown directory\n"
+msgstr "%s: 離開一個未知的目錄\n"
+
+#: src/output.c:102
+#, c-format
+msgid "%s: Entering directory '%s'\n"
+msgstr "%s: 進入目錄「%s」\n"
+
+#: src/output.c:104
+#, c-format
+msgid "%s: Leaving directory '%s'\n"
+msgstr "%s: 離開目錄「%s」\n"
+
+#: src/output.c:108
+#, c-format
+msgid "%s[%u]: Entering an unknown directory\n"
+msgstr "%s[%u]: 進入一個未知的目錄\n"
+
+#: src/output.c:110
+#, c-format
+msgid "%s[%u]: Leaving an unknown directory\n"
+msgstr "%s[%u]: 離開一個未知的目錄\n"
+
+#: src/output.c:113
+#, c-format
+msgid "%s[%u]: Entering directory '%s'\n"
+msgstr "%s[%u]: 進入目錄「%s」\n"
+
+#: src/output.c:115
+#, c-format
+msgid "%s[%u]: Leaving directory '%s'\n"
+msgstr "%s[%u]: 離開目錄「%s」\n"
+
+#: src/output.c:442 src/output.c:444
+#, c-format
+msgid "write error: stdout"
+msgstr "寫錯誤: 標準輸出"
+
+#: src/output.c:624
+msgid ".  Stop.\n"
+msgstr "。 停止。\n"
+
+#: src/output.c:658
+#, c-format
+msgid "%s%s: %s"
+msgstr "%s%s: %s"
+
+#: src/output.c:667
+#, c-format
+msgid "%s: %s"
+msgstr "%s: %s"
+
+#: src/output.h:62
+#, c-format
+msgid "-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."
+msgstr "-O[類型] (--output-sync[=類型]) 並未設定入此 make 構建。"
+
+#: src/posixos.c:90
+msgid "creating jobs pipe"
+msgstr "正在建立作業管道"
+
+#: src/posixos.c:98 src/posixos.c:251
+msgid "duping jobs pipe"
+msgstr "正在複製作業管道"
+
+#: src/posixos.c:104
+msgid "init jobserver pipe"
+msgstr "創始化作業伺服器管道"
+
+#: src/posixos.c:119
+#, c-format
+msgid "internal error: invalid --jobserver-auth string '%s'"
+msgstr "內部錯誤:無效 --jobserver-auth 驗證字串「%s」"
+
+#: src/posixos.c:122
+#, c-format
+msgid "Jobserver client (fds %d,%d)\n"
+msgstr "Jobserver 客戶端(檔案描述符 %d,%d)\n"
+
+#: src/posixos.c:138
+msgid "jobserver pipeline"
+msgstr "作業伺服器管道"
+
+#: src/posixos.c:186
+msgid "write jobserver"
+msgstr "寫入作業伺服器"
+
+#: src/posixos.c:300
+#, c-format
+msgid "job server shut down"
+msgstr "作業伺服器關閉"
+
+# , fuzzy
+#: src/posixos.c:303
+msgid "pselect jobs pipe"
+msgstr "pselect 作業管道"
+
+#: src/posixos.c:319 src/posixos.c:433
+msgid "read jobs pipe"
+msgstr "讀取作業管道"
+
+#: src/read.c:181
+#, c-format
+msgid "Reading makefiles...\n"
+msgstr "正在讀入 makefile...\n"
+
+#: src/read.c:336
+#, c-format
+msgid "Reading makefile '%s'"
+msgstr "正在讀入 makefile「%s」"
+
+#: src/read.c:338
+#, c-format
+msgid " (no default goal)"
+msgstr " (沒有預設目標)"
+
+#: src/read.c:340
+#, c-format
+msgid " (search path)"
+msgstr " (搜尋路徑)"
+
+#: src/read.c:342
+#, c-format
+msgid " (don't care)"
+msgstr " (不用理)"
+
+#: src/read.c:344
+#, c-format
+msgid " (no ~ expansion)"
+msgstr " (沒有 ~ 展開)"
+
+#: src/read.c:655
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile '%s'\n"
+msgstr "跳過 Makefile「%s」中的 UTF-8 BOM\n"
+
+#: src/read.c:658
+#, c-format
+msgid "Skipping UTF-8 BOM in makefile buffer\n"
+msgstr "跳過 Makefile 緩衝區中的 UTF-8 BOM\n"
+
+#: src/read.c:787
+#, c-format
+msgid "invalid syntax in conditional"
+msgstr "條件中含有無效語法"
+
+#: src/read.c:960
+#, c-format
+msgid "%s: failed to load"
+msgstr "%s: 載入失敗"
+
+#: src/read.c:986
+#, c-format
+msgid "recipe commences before first target"
+msgstr "方案在第一個目標前開始"
+
+#: src/read.c:1035
+#, c-format
+msgid "missing rule before recipe"
+msgstr "方案之前遺漏了規則"
+
+#: src/read.c:1136
+#, c-format
+msgid "missing separator (did you mean TAB instead of 8 spaces?)"
+msgstr "缺少分隔符 (你大概想用 TAB,而不是八個空格)"
+
+#: src/read.c:1138
+#, c-format
+msgid "missing separator"
+msgstr "缺少分隔符"
+
+#: src/read.c:1283
+#, c-format
+msgid "missing target pattern"
+msgstr "無目標符合"
+
+#: src/read.c:1285
+#, c-format
+msgid "multiple target patterns"
+msgstr "多個目標符合"
+
+#: src/read.c:1289
+#, c-format
+msgid "target pattern contains no '%%'"
+msgstr "目標模式不含有「%%」"
+
+#: src/read.c:1404
+#, c-format
+msgid "missing 'endif'"
+msgstr "遺漏「endif」"
+
+#: src/read.c:1443 src/read.c:1488 src/variable.c:1600
+#, c-format
+msgid "empty variable name"
+msgstr "空變數名"
+
+#: src/read.c:1478
+#, c-format
+msgid "extraneous text after 'define' directive"
+msgstr "「endef」指令後含有不該出現的文字"
+
+#: src/read.c:1503
+#, c-format
+msgid "missing 'endef', unterminated 'define'"
+msgstr "遺漏「endef」,未終止的「define」"
+
+#: src/read.c:1531
+#, c-format
+msgid "extraneous text after 'endef' directive"
+msgstr "「endef」指令後含有不該出現的文字"
+
+#: src/read.c:1603
+#, c-format
+msgid "extraneous text after '%s' directive"
+msgstr "在「%s」指令之後含有不該出現的文字"
+
+#: src/read.c:1604
+#, c-format
+msgid "extraneous '%s'"
+msgstr "不該出現的「%s」"
+
+#: src/read.c:1632
+#, c-format
+msgid "only one 'else' per conditional"
+msgstr "每個條件只能有一個「else」"
+
+#: src/read.c:1908
+#, c-format
+msgid "Malformed target-specific variable definition"
+msgstr "針對目標的純量定義格式錯誤"
+
+#: src/read.c:1968
+#, c-format
+msgid "prerequisites cannot be defined in recipes"
+msgstr "依賴無法在方案腳本中定義"
+
+#: src/read.c:1986
+#, c-format
+msgid "grouped targets must provide a recipe"
+msgstr "成組的目標必須提供一個方案"
+
+#: src/read.c:2029
+#, c-format
+msgid "mixed implicit and static pattern rules"
+msgstr "混合的隱含和靜態模式規則"
+
+#: src/read.c:2052
+#, c-format
+msgid "mixed implicit and normal rules"
+msgstr "混合的隱含和普通規則"
+
+#: src/read.c:2107
+#, c-format
+msgid "target '%s' doesn't match the target pattern"
+msgstr "目標「%s」不符合目標模式"
+
+#: src/read.c:2122 src/read.c:2168
+#, c-format
+msgid "target file '%s' has both : and :: entries"
+msgstr "目標檔案「%s」含有 : 和 :: 兩種條目"
+
+#: src/read.c:2128
+#, c-format
+msgid "target '%s' given more than once in the same rule"
+msgstr "目標「%s」在同一個規則中給出了多次"
+
+#: src/read.c:2138
+#, c-format
+msgid "warning: overriding recipe for target '%s'"
+msgstr "警告:覆蓋關於目標「%s」的方案"
+
+#: src/read.c:2141
+#, c-format
+msgid "warning: ignoring old recipe for target '%s'"
+msgstr "警告:忽略關於目標「%s」的舊方案"
+
+#: src/read.c:2254
+#, c-format
+msgid "*** mixed implicit and normal rules: deprecated syntax"
+msgstr "*** 隱含和普通規則混合:已棄用的語法"
+
+#: src/read.c:2271
+#, c-format
+msgid "warning: overriding group membership for target '%s'"
+msgstr "警告:覆蓋關於目標「%s」的組成員"
+
+#: src/read.c:2636
+#, c-format
+msgid "warning: NUL character seen; rest of line ignored"
+msgstr "警告:遇到了 NUL 字元;忽略行的剩餘部分"
+
+#: src/remake.c:226
+#, c-format
+msgid "Nothing to be done for '%s'."
+msgstr "對「%s」無需做任何事。"
+
+#: src/remake.c:227
+#, c-format
+msgid "'%s' is up to date."
+msgstr "「%s」已是最新。"
+
+#: src/remake.c:323
+#, c-format
+msgid "Pruning file '%s'.\n"
+msgstr "正刪除檔案「%s」。\n"
+
+#: src/remake.c:389
+#, c-format
+msgid "%sNo rule to make target '%s', needed by '%s'%s"
+msgstr "%s沒有規則可製作目標「%s」,由「%s」%s 需求"
+
+#: src/remake.c:399
+#, c-format
+msgid "%sNo rule to make target '%s'%s"
+msgstr "%s沒有規則可製作目標「%s」%s"
+
+#: src/remake.c:425
+#, c-format
+msgid "Considering target file '%s'.\n"
+msgstr "正在考慮目標檔案「%s」。\n"
+
+#: src/remake.c:432
+#, c-format
+msgid "Recently tried and failed to update file '%s'.\n"
+msgstr "最近已嘗試過更新檔案「%s」並失敗。\n"
+
+#: src/remake.c:444
+#, c-format
+msgid "File '%s' was considered already.\n"
+msgstr "已考慮過檔案「%s」。\n"
+
+#: src/remake.c:454
+#, c-format
+msgid "Still updating file '%s'.\n"
+msgstr "仍然在更新檔案「%s」。\n"
+
+#: src/remake.c:457
+#, c-format
+msgid "Finished updating file '%s'.\n"
+msgstr "更新檔案「%s」完成。\n"
+
+#: src/remake.c:486
+#, c-format
+msgid "File '%s' does not exist.\n"
+msgstr "檔案「%s」不存在。\n"
+
+#: src/remake.c:494
+#, c-format
+msgid ""
+"*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"
+msgstr "*** 警告: .LOW_RESOLUTION_TIME 檔案 `%s' 有一個高精度的的時間標誌"
+
+#: src/remake.c:507 src/remake.c:1039
+#, c-format
+msgid "Found an implicit rule for '%s'.\n"
+msgstr "找到一條關於「%s」的隱含規則。\n"
+
+#: src/remake.c:509 src/remake.c:1041
+#, c-format
+msgid "No implicit rule found for '%s'.\n"
+msgstr "找不到關於「%s」的隱含規則。\n"
+
+#: src/remake.c:515
+#, c-format
+msgid "Using default recipe for '%s'.\n"
+msgstr "使用「%s」的預設方案。\n"
+
+#: src/remake.c:549 src/remake.c:1088
+#, c-format
+msgid "Circular %s <- %s dependency dropped."
+msgstr "放棄循環依賴 %s <- %s 。"
+
+#: src/remake.c:674
+#, c-format
+msgid "Finished prerequisites of target file '%s'.\n"
+msgstr "目標檔案「%s」的前提已完成。\n"
+
+#: src/remake.c:680
+#, c-format
+msgid "The prerequisites of '%s' are being made.\n"
+msgstr "正在製作「%s」的前提。\n"
+
+#: src/remake.c:694
+#, c-format
+msgid "Giving up on target file '%s'.\n"
+msgstr "放棄目標檔案「%s」。\n"
+
+#: src/remake.c:699
+#, c-format
+msgid "Target '%s' not remade because of errors."
+msgstr "由於錯誤目標「%s」並未重新製作。"
+
+#: src/remake.c:751
+#, c-format
+msgid "Prerequisite '%s' is order-only for target '%s'.\n"
+msgstr "前提「%s」對目標「%s」來說僅用於指定執行順序 (order-only) 。\n"
+
+#: src/remake.c:756
+#, c-format
+msgid "Prerequisite '%s' of target '%s' does not exist.\n"
+msgstr "目標「%2$s」的前提「%1$s」不存在。\n"
+
+#: src/remake.c:761
+#, c-format
+msgid "Prerequisite '%s' is newer than target '%s'.\n"
+msgstr "前提「%s」比目標「%s」新。\n"
+
+#: src/remake.c:764
+#, c-format
+msgid "Prerequisite '%s' is older than target '%s'.\n"
+msgstr "前提「%s」比目標「%s」舊。\n"
+
+#: src/remake.c:782
+#, c-format
+msgid "Target '%s' is double-colon and has no prerequisites.\n"
+msgstr "目標「%s」是雙冒號目標並且沒有前提。\n"
+
+#: src/remake.c:789
+#, c-format
+msgid "No recipe for '%s' and no prerequisites actually changed.\n"
+msgstr "沒有關於「%s」的方案,並且沒有實際改變的前提。\n"
+
+#: src/remake.c:794
+#, c-format
+msgid "Making '%s' due to always-make flag.\n"
+msgstr "由於 always-make 標誌所以製作「%s」。\n"
+
+#: src/remake.c:802
+#, c-format
+msgid "No need to remake target '%s'"
+msgstr "不需要重新製作目標「%s」"
+
+#: src/remake.c:804
+#, c-format
+msgid "; using VPATH name '%s'"
+msgstr ";使用 VPATH 名稱「%s」"
+
+#: src/remake.c:824
+#, c-format
+msgid "Must remake target '%s'.\n"
+msgstr "必須重新製作目標「%s」。\n"
+
+#: src/remake.c:830
+#, c-format
+msgid "  Ignoring VPATH name '%s'.\n"
+msgstr "  忽略 VPATH 名稱「%s」。\n"
+
+#: src/remake.c:839
+#, c-format
+msgid "Recipe of '%s' is being run.\n"
+msgstr "「%s」的指令方案正在被執行。\n"
+
+#: src/remake.c:846
+#, c-format
+msgid "Failed to remake target file '%s'.\n"
+msgstr "重新製作目標檔案「%s」失敗。\n"
+
+#: src/remake.c:849
+#, c-format
+msgid "Successfully remade target file '%s'.\n"
+msgstr "重新製作目標檔案「%s」成功。\n"
+
+#: src/remake.c:852
+#, c-format
+msgid "Target file '%s' needs to be remade under -q.\n"
+msgstr "目標檔案「%s」需要以 -q 選項重新製作。\n"
+
+#: src/remake.c:1047
+#, c-format
+msgid "Using default commands for '%s'.\n"
+msgstr "使用關於「%s」的預設指令。\n"
+
+#: src/remake.c:1422
+#, c-format
+msgid "Warning: File '%s' has modification time %s s in the future"
+msgstr "警告:檔案「%s」的修改時間在未來 %s 秒後"
+
+#: src/remake.c:1662
+#, c-format
+msgid ".LIBPATTERNS element '%s' is not a pattern"
+msgstr ".LIBPATTERNS 的元素「%s」不是一個模式"
+
+#: src/remote-cstms.c:122
+#, c-format
+msgid "Customs won't export: %s\n"
+msgstr "使用者不希望匯出:%s\n"
+
+#: src/rule.c:289
+#, c-format
+msgid "warning: ignoring prerequisites on suffix rule definition"
+msgstr ""
+
+#: src/rule.c:530
+msgid ""
+"\n"
+"# Implicit Rules"
+msgstr ""
+"\n"
+"# 隱含規則"
+
+#: src/rule.c:545
+msgid ""
+"\n"
+"# No implicit rules."
+msgstr ""
+"\n"
+"# 沒有隱含規則。"
+
+#: src/rule.c:548
+#, c-format
+msgid ""
+"\n"
+"# %u implicit rules, %u (%.1f%%) terminal."
+msgstr ""
+"\n"
+"# %u 條隱含規則,%u (%.1f%%) 為末端。"
+
+#: src/rule.c:557
+#, c-format
+msgid "BUG: num_pattern_rules is wrong!  %u != %u"
+msgstr "BUG:num_pattern_rules 出錯!%u != %u"
+
+#: src/signame.c:84
+msgid "unknown signal"
+msgstr "未知的訊號"
+
+#: src/signame.c:92
+msgid "Hangup"
+msgstr "掛斷"
+
+#: src/signame.c:95
+msgid "Interrupt"
+msgstr "中止"
+
+#: src/signame.c:98
+msgid "Quit"
+msgstr "結束"
+
+#: src/signame.c:101
+msgid "Illegal Instruction"
+msgstr "無效指令"
+
+#: src/signame.c:104
+msgid "Trace/breakpoint trap"
+msgstr "追蹤 / 斷點陷阱"
+
+#: src/signame.c:109
+msgid "Aborted"
+msgstr "取消"
+
+#: src/signame.c:112
+msgid "IOT trap"
+msgstr "IOT 陷阱"
+
+#: src/signame.c:115
+msgid "EMT trap"
+msgstr "EMT 陷阱"
+
+#: src/signame.c:118
+msgid "Floating point exception"
+msgstr "期望浮點數"
+
+#: src/signame.c:121
+msgid "Killed"
+msgstr "強制結束"
+
+#: src/signame.c:124
+msgid "Bus error"
+msgstr "匯流排錯誤"
+
+#: src/signame.c:127
+msgid "Segmentation fault"
+msgstr "分割錯誤"
+
+#: src/signame.c:130
+msgid "Bad system call"
+msgstr "無效系統呼叫"
+
+#: src/signame.c:133
+msgid "Broken pipe"
+msgstr "管線損壞"
+
+#: src/signame.c:136
+msgid "Alarm clock"
+msgstr "鬧鐘"
+
+#: src/signame.c:139
+msgid "Terminated"
+msgstr "終止"
+
+#: src/signame.c:142
+msgid "User defined signal 1"
+msgstr "使用者定義信號 1"
+
+#: src/signame.c:145
+msgid "User defined signal 2"
+msgstr "使用者定義信號 2"
+
+#: src/signame.c:150 src/signame.c:153
+msgid "Child exited"
+msgstr "子程序退出"
+
+#: src/signame.c:156
+msgid "Power failure"
+msgstr "電源錯誤"
+
+#: src/signame.c:159
+msgid "Stopped"
+msgstr "停止"
+
+#: src/signame.c:162
+msgid "Stopped (tty input)"
+msgstr "停止(tty 輸入)"
+
+#: src/signame.c:165
+msgid "Stopped (tty output)"
+msgstr "停止(tty 輸出)"
+
+#: src/signame.c:168
+msgid "Stopped (signal)"
+msgstr "停止(信號)"
+
+#: src/signame.c:171
+msgid "CPU time limit exceeded"
+msgstr "到達 CPU 時間上限"
+
+#: src/signame.c:174
+msgid "File size limit exceeded"
+msgstr "到達檔案大小上限"
+
+#: src/signame.c:177
+msgid "Virtual timer expired"
+msgstr "虛擬計時器過期"
+
+#: src/signame.c:180
+msgid "Profiling timer expired"
+msgstr "分析計時器過期"
+
+#: src/signame.c:186
+msgid "Window changed"
+msgstr "已變更視窗"
+
+#: src/signame.c:189
+msgid "Continued"
+msgstr "繼續"
+
+#: src/signame.c:192
+msgid "Urgent I/O condition"
+msgstr "緊急 I/O 條件"
+
+#: src/signame.c:199 src/signame.c:208
+msgid "I/O possible"
+msgstr "可能 I/O"
+
+#: src/signame.c:202
+msgid "SIGWIND"
+msgstr "SIGWIND"
+
+#: src/signame.c:205
+msgid "SIGPHONE"
+msgstr "SIGPHONE"
+
+#: src/signame.c:211
+msgid "Resource lost"
+msgstr "資源遺失"
+
+#: src/signame.c:214
+msgid "Danger signal"
+msgstr "危險訊號"
+
+#: src/signame.c:217
+msgid "Information request"
+msgstr "資訊請求"
+
+#: src/signame.c:220
+msgid "Floating point co-processor not available"
+msgstr "浮點數協處理器不可用"
+
+#: src/strcache.c:274
+#, c-format
+msgid ""
+"\n"
+"%s No strcache buffers\n"
+msgstr ""
+"\n"
+"%s 沒有 strcache 緩衝區\n"
+
+#: src/strcache.c:304
+#, c-format
+msgid ""
+"\n"
+"%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu "
+"B\n"
+msgstr ""
+"\n"
+"%s strcache 緩衝: %lu (%lu) / 字串 = %lu / 空間 = %lu B / 平均 = %lu B\n"
+
+#: src/strcache.c:308
+#, c-format
+msgid ""
+"%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"
+msgstr "%s 目前緩衝: 尺寸 = %hu B / 已用 = %hu B / 數量 = %hu / 平均 = %u B\n"
+
+#: src/strcache.c:319
+#, c-format
+msgid "%s other used: total = %lu B / count = %lu / avg = %lu B\n"
+msgstr "%s 其他已用: 總共 = %lu B / 數量 = %lu / 平均 = %lu B\n"
+
+#: src/strcache.c:322
+#, c-format
+msgid ""
+"%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"
+msgstr ""
+"%s 其他空餘: 總共 = %lu B / 最大 = %lu B / 最小 = %lu B / 平均 = %hu B\n"
+
+#: src/strcache.c:326
+#, c-format
+msgid ""
+"\n"
+"%s strcache performance: lookups = %lu / hit rate = %lu%%\n"
+msgstr ""
+"\n"
+"%s strcache 性能:尋找 = %lu / 命中率 = %lu%%\n"
+
+#: src/strcache.c:328
+msgid ""
+"# hash-table stats:\n"
+"# "
+msgstr ""
+"# 雜湊表統計資料:\n"
+"# "
+
+#: src/variable.c:1653
+msgid "automatic"
+msgstr "自動"
+
+#: src/variable.c:1656
+msgid "default"
+msgstr "預設"
+
+#: src/variable.c:1659
+msgid "environment"
+msgstr "環境"
+
+#: src/variable.c:1662
+msgid "makefile"
+msgstr "makefile"
+
+#: src/variable.c:1665
+msgid "environment under -e"
+msgstr "-e 指定的環境變數"
+
+#: src/variable.c:1668
+msgid "command line"
+msgstr "指令列"
+
+#: src/variable.c:1671
+msgid "'override' directive"
+msgstr "「override」指令"
+
+#: src/variable.c:1682
+#, c-format
+msgid " (from '%s', line %lu)"
+msgstr " (從「%s」,行 %lu)"
+
+#: src/variable.c:1745
+msgid "# variable set hash-table stats:\n"
+msgstr "# 變數的雜湊表狀態:\n"
+
+#: src/variable.c:1756
+msgid ""
+"\n"
+"# Variables\n"
+msgstr ""
+"\n"
+"# 變數\n"
+
+#: src/variable.c:1760
+msgid ""
+"\n"
+"# Pattern-specific Variable Values"
+msgstr ""
+"\n"
+"# Pattern-specific 變數值"
+
+#: src/variable.c:1774
+msgid ""
+"\n"
+"# No pattern-specific variable values."
+msgstr ""
+"\n"
+"# 沒有 pattern-specific 變數的值。"
+
+#: src/variable.c:1776
+#, c-format
+msgid ""
+"\n"
+"# %u pattern-specific variable values"
+msgstr ""
+"\n"
+"# %u 個 pattern-specific 變數的值"
+
+#: src/variable.h:229
+#, c-format
+msgid "warning: undefined variable '%.*s'"
+msgstr "警告:未定義的變數「%.*s」"
+
+#: src/vmsfunctions.c:91
+#, c-format
+msgid "sys$search() failed with %d\n"
+msgstr "sys$search() 失敗並返回 %d\n"
+
+#: src/vmsjobs.c:244
+#, c-format
+msgid "-warning, you may have to re-enable CTRL-Y handling from DCL.\n"
+msgstr "-警告, 你可能必須從 DCL 重新啟用 CTRL-Y 處理。\n"
+
+#: src/vmsjobs.c:681
+#, c-format
+msgid "BUILTIN CD %s\n"
+msgstr "BUILTIN CD %s\n"
+
+#: src/vmsjobs.c:1224
+#, c-format
+msgid "DCL: %s\n"
+msgstr "DCL:%s\n"
+
+#: src/vmsjobs.c:1284
+#, c-format
+msgid "Append output to %s\n"
+msgstr "將輸出追加到 %s\n"
+
+#: src/vmsjobs.c:1309
+#, c-format
+msgid "Append %.*s and cleanup\n"
+msgstr "追加 %.*s 並清理\n"
+
+#: src/vmsjobs.c:1322
+#, c-format
+msgid "Executing %s instead\n"
+msgstr "執行 %s 作為替代\n"
+
+#: src/vpath.c:603
+msgid ""
+"\n"
+"# VPATH Search Paths\n"
+msgstr ""
+"\n"
+"# VPATH 搜尋路徑\n"
+
+#: src/vpath.c:620
+msgid "# No 'vpath' search paths."
+msgstr "# 沒有「vpath」搜尋路徑。"
+
+#: src/vpath.c:622
+#, c-format
+msgid ""
+"\n"
+"# %u 'vpath' search paths.\n"
+msgstr ""
+"\n"
+"# %u「vpath」搜尋路徑。\n"
+
+#: src/vpath.c:625
+msgid ""
+"\n"
+"# No general ('VPATH' variable) search path."
+msgstr ""
+"\n"
+"# 沒有通用搜尋路徑(「VPATH」變數)。"
+
+#: src/vpath.c:631
+msgid ""
+"\n"
+"# General ('VPATH' variable) search path:\n"
+"# "
+msgstr ""
+"\n"
+"# 通用搜尋路徑 (「VPATH」變數):\n"
+"# "
+
+#: src/w32/w32os.c:44
+#, c-format
+msgid "Jobserver slots limited to %d\n"
+msgstr "Jobserver 槽位數限制為 %d\n"
+
+#: src/w32/w32os.c:60
+#, c-format
+msgid "creating jobserver semaphore: (Error %ld: %s)"
+msgstr "正建立 jobserver 訊號量:(錯誤 %ld:%s)"
+
+#: src/w32/w32os.c:79
+#, c-format
+msgid ""
+"internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"
+msgstr "內部錯誤:無法打開 jobserver 訊號量「%s」:(錯誤 %ld:%s)"
+
+#: src/w32/w32os.c:82
+#, c-format
+msgid "Jobserver client (semaphore %s)\n"
+msgstr "Jobserver 客戶端(訊號量 %s)\n"
+
+#: src/w32/w32os.c:123
+#, c-format
+msgid "release jobserver semaphore: (Error %ld: %s)"
+msgstr "釋放 jobserver 訊號量:(錯誤 %ld:%s)"
+
+#: src/w32/w32os.c:194
+#, c-format
+msgid "semaphore or child process wait: (Error %ld: %s)"
+msgstr "訊號量或子程序等待:(錯誤 %ld:%s)"
+
+#~ msgid "write error"
+#~ msgstr "寫入時發生錯誤"
diff --git a/posixos.c b/posixos.c
deleted file mode 100644 (file)
index 4a787e4..0000000
--- a/posixos.c
+++ /dev/null
@@ -1,431 +0,0 @@
-/* POSIX-based operating system interface for GNU Make.
-Copyright (C) 2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <stdio.h>
-
-#ifdef HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
-#if defined(HAVE_PSELECT) && defined(HAVE_SYS_SELECT_H)
-# include <sys/select.h>
-#endif
-
-#include "debug.h"
-#include "job.h"
-#include "os.h"
-
-#ifdef MAKE_JOBSERVER
-
-/* This section provides OS-specific functions to support the jobserver.  */
-
-/* These track the state of the jobserver pipe.  Passed to child instances.  */
-static int job_fds[2] = { -1, -1 };
-
-/* Used to signal read() that a SIGCHLD happened.  Always CLOEXEC.
-   If we use pselect() this will never be created and always -1.
- */
-static int job_rfd = -1;
-
-/* Token written to the pipe (could be any character...)  */
-static char token = '+';
-
-static int
-make_job_rfd (void)
-{
-#ifdef HAVE_PSELECT
-  /* Pretend we succeeded.  */
-  return 0;
-#else
-  EINTRLOOP (job_rfd, dup (job_fds[0]));
-  if (job_rfd >= 0)
-    CLOSE_ON_EXEC (job_rfd);
-
-  return job_rfd;
-#endif
-}
-
-unsigned int
-jobserver_setup (int slots)
-{
-  int r;
-
-  EINTRLOOP (r, pipe (job_fds));
-  if (r < 0)
-    pfatal_with_name (_("creating jobs pipe"));
-
-  if (make_job_rfd () < 0)
-    pfatal_with_name (_("duping jobs pipe"));
-
-  while (slots--)
-    {
-      EINTRLOOP (r, write (job_fds[1], &token, 1));
-      if (r != 1)
-        pfatal_with_name (_("init jobserver pipe"));
-    }
-
-  return 1;
-}
-
-unsigned int
-jobserver_parse_auth (const char *auth)
-{
-  /* Given the command-line parameter, parse it.  */
-  if (sscanf (auth, "%d,%d", &job_fds[0], &job_fds[1]) != 2)
-    OS (fatal, NILF,
-        _("internal error: invalid --jobserver-auth string '%s'"), auth);
-
-  DB (DB_JOBS,
-      (_("Jobserver client (fds %d,%d)\n"), job_fds[0], job_fds[1]));
-
-#ifdef HAVE_FCNTL_H
-# define FD_OK(_f) (fcntl ((_f), F_GETFD) != -1)
-#else
-# define FD_OK(_f) 1
-#endif
-
-  /* Make sure our pipeline is valid, and (possibly) create a duplicate pipe,
-     that will be closed in the SIGCHLD handler.  If this fails with EBADF,
-     the parent has closed the pipe on us because it didn't think we were a
-     submake.  If so, warn and default to -j1.  */
-
-  if (!FD_OK (job_fds[0]) || !FD_OK (job_fds[1]) || make_job_rfd () < 0)
-    {
-      if (errno != EBADF)
-        pfatal_with_name (_("jobserver pipeline"));
-
-      job_fds[0] = job_fds[1] = -1;
-
-      return 0;
-    }
-
-  return 1;
-}
-
-char *
-jobserver_get_auth (void)
-{
-  char *auth = xmalloc ((INTSTR_LENGTH * 2) + 2);
-  sprintf (auth, "%d,%d", job_fds[0], job_fds[1]);
-  return auth;
-}
-
-unsigned int
-jobserver_enabled (void)
-{
-  return job_fds[0] >= 0;
-}
-
-void
-jobserver_clear (void)
-{
-  if (job_fds[0] >= 0)
-    close (job_fds[0]);
-  if (job_fds[1] >= 0)
-    close (job_fds[1]);
-  if (job_rfd >= 0)
-    close (job_rfd);
-
-  job_fds[0] = job_fds[1] = job_rfd = -1;
-}
-
-void
-jobserver_release (int is_fatal)
-{
-  int r;
-  EINTRLOOP (r, write (job_fds[1], &token, 1));
-  if (r != 1)
-    {
-      if (is_fatal)
-        pfatal_with_name (_("write jobserver"));
-      perror_with_name ("write", "");
-    }
-}
-
-unsigned int
-jobserver_acquire_all (void)
-{
-  unsigned int tokens = 0;
-
-  /* Close the write side, so the read() won't hang.  */
-  close (job_fds[1]);
-  job_fds[1] = -1;
-
-  while (1)
-    {
-      char intake;
-      int r;
-      EINTRLOOP (r, read (job_fds[0], &intake, 1));
-      if (r != 1)
-        return tokens;
-      ++tokens;
-    }
-}
-
-/* Prepare the jobserver to start a child process.  */
-void
-jobserver_pre_child (int recursive)
-{
-  /* If it's not a recursive make, avoid polutting the jobserver pipes.  */
-  if (!recursive && job_fds[0] >= 0)
-    {
-      CLOSE_ON_EXEC (job_fds[0]);
-      CLOSE_ON_EXEC (job_fds[1]);
-    }
-}
-
-void
-jobserver_post_child (int recursive)
-{
-#if defined(F_GETFD) && defined(F_SETFD)
-  if (!recursive && job_fds[0] >= 0)
-    {
-      unsigned int i;
-      for (i = 0; i < 2; ++i)
-        {
-          int flags;
-          EINTRLOOP (flags, fcntl (job_fds[i], F_GETFD));
-          if (flags >= 0)
-            {
-              int r;
-              EINTRLOOP (r, fcntl (job_fds[i], F_SETFD, flags & ~FD_CLOEXEC));
-            }
-        }
-    }
-#endif
-}
-
-void
-jobserver_signal (void)
-{
-  if (job_rfd >= 0)
-    {
-      close (job_rfd);
-      job_rfd = -1;
-    }
-}
-
-void
-jobserver_pre_acquire (void)
-{
-  /* Make sure we have a dup'd FD.  */
-  if (job_rfd < 0 && job_fds[0] >= 0 && make_job_rfd () < 0)
-    pfatal_with_name (_("duping jobs pipe"));
-}
-
-#ifdef HAVE_PSELECT
-
-/* Use pselect() to atomically wait for both a signal and a file descriptor.
-   It also provides a timeout facility so we don't need to use SIGALRM.
-
-   This method relies on the fact that SIGCHLD will be blocked everywhere,
-   and only unblocked (atomically) within the pselect() call, so we can
-   never miss a SIGCHLD.
- */
-unsigned int
-jobserver_acquire (int timeout)
-{
-  sigset_t empty;
-  fd_set readfds;
-  struct timespec spec;
-  struct timespec *specp = NULL;
-  int r;
-  char intake;
-
-  sigemptyset (&empty);
-
-  FD_ZERO (&readfds);
-  FD_SET (job_fds[0], &readfds);
-
-  if (timeout)
-    {
-      /* Alarm after one second (is this too granular?)  */
-      spec.tv_sec = 1;
-      spec.tv_nsec = 0;
-      specp = &spec;
-    }
-
-  r = pselect (job_fds[0]+1, &readfds, NULL, NULL, specp, &empty);
-
-  if (r == -1)
-    {
-      /* Better be SIGCHLD.  */
-      if (errno != EINTR)
-        pfatal_with_name (_("pselect jobs pipe"));
-      return 0;
-    }
-
-  if (r == 0)
-    /* Timeout.  */
-    return 0;
-
-  /* The read FD is ready: read it!  */
-  EINTRLOOP (r, read (job_fds[0], &intake, 1));
-  if (r < 0)
-    pfatal_with_name (_("read jobs pipe"));
-
-  /* What does it mean if read() returns 0?  It shouldn't happen because only
-     the master make can reap all the tokens and close the write side...??  */
-  return r > 0;
-}
-
-#else
-
-/* This method uses a "traditional" UNIX model for waiting on both a signal
-   and a file descriptor.  However, it's complex and since we have a SIGCHLD
-   handler installed we need to check ALL system calls for EINTR: painful!
-
-   Read a token.  As long as there's no token available we'll block.  We
-   enable interruptible system calls before the read(2) so that if we get a
-   SIGCHLD while we're waiting, we'll return with EINTR and we can process the
-   death(s) and return tokens to the free pool.
-
-   Once we return from the read, we immediately reinstate restartable system
-   calls.  This allows us to not worry about checking for EINTR on all the
-   other system calls in the program.
-
-   There is one other twist: there is a span between the time reap_children()
-   does its last check for dead children and the time the read(2) call is
-   entered, below, where if a child dies we won't notice.  This is extremely
-   serious as it could cause us to deadlock, given the right set of events.
-
-   To avoid this, we do the following: before we reap_children(), we dup(2)
-   the read FD on the jobserver pipe.  The read(2) call below uses that new
-   FD.  In the signal handler, we close that FD.  That way, if a child dies
-   during the section mentioned above, the read(2) will be invoked with an
-   invalid FD and will return immediately with EBADF.  */
-
-static RETSIGTYPE
-job_noop (int sig UNUSED)
-{
-}
-
-/* Set the child handler action flags to FLAGS.  */
-static void
-set_child_handler_action_flags (int set_handler, int set_alarm)
-{
-  struct sigaction sa;
-
-#ifdef __EMX__
-  /* The child handler must be turned off here.  */
-  signal (SIGCHLD, SIG_DFL);
-#endif
-
-  memset (&sa, '\0', sizeof sa);
-  sa.sa_handler = child_handler;
-  sa.sa_flags = set_handler ? 0 : SA_RESTART;
-
-#if defined SIGCHLD
-  if (sigaction (SIGCHLD, &sa, NULL) < 0)
-    pfatal_with_name ("sigaction: SIGCHLD");
-#endif
-
-#if defined SIGCLD && SIGCLD != SIGCHLD
-  if (sigaction (SIGCLD, &sa, NULL) < 0)
-    pfatal_with_name ("sigaction: SIGCLD");
-#endif
-
-#if defined SIGALRM
-  if (set_alarm)
-    {
-      /* If we're about to enter the read(), set an alarm to wake up in a
-         second so we can check if the load has dropped and we can start more
-         work.  On the way out, turn off the alarm and set SIG_DFL.  */
-      if (set_handler)
-        {
-          sa.sa_handler = job_noop;
-          sa.sa_flags = 0;
-          if (sigaction (SIGALRM, &sa, NULL) < 0)
-            pfatal_with_name ("sigaction: SIGALRM");
-          alarm (1);
-        }
-      else
-        {
-          alarm (0);
-          sa.sa_handler = SIG_DFL;
-          sa.sa_flags = 0;
-          if (sigaction (SIGALRM, &sa, NULL) < 0)
-            pfatal_with_name ("sigaction: SIGALRM");
-        }
-    }
-#endif
-}
-
-unsigned int
-jobserver_acquire (int timeout)
-{
-  char intake;
-  int got_token;
-  int saved_errno;
-
-  /* Set interruptible system calls, and read() for a job token.  */
-  set_child_handler_action_flags (1, timeout);
-
-  EINTRLOOP (got_token, read (job_rfd, &intake, 1));
-  saved_errno = errno;
-
-  set_child_handler_action_flags (0, timeout);
-
-  if (got_token == 1)
-    return 1;
-
-  /* If the error _wasn't_ expected (EINTR or EBADF), fatal.  Otherwise,
-     go back and reap_children(), and try again.  */
-  errno = saved_errno;
-
-  if (errno != EINTR && errno != EBADF)
-    pfatal_with_name (_("read jobs pipe"));
-
-  if (errno == EBADF)
-    DB (DB_JOBS, ("Read returned EBADF.\n"));
-
-  return 0;
-}
-
-#endif
-
-#endif /* MAKE_JOBSERVER */
-
-/* Create a "bad" file descriptor for stdin when parallel jobs are run.  */
-int
-get_bad_stdin (void)
-{
-  static int bad_stdin = -1;
-
-  /* Set up a bad standard input that reads from a broken pipe.  */
-
-  if (bad_stdin == -1)
-    {
-      /* Make a file descriptor that is the read end of a broken pipe.
-         This will be used for some children's standard inputs.  */
-      int pd[2];
-      if (pipe (pd) == 0)
-        {
-          /* Close the write side.  */
-          (void) close (pd[1]);
-          /* Save the read side.  */
-          bad_stdin = pd[0];
-
-          /* Set the descriptor to close on exec, so it does not litter any
-             child's descriptor table.  When it is dup2'd onto descriptor 0,
-             that descriptor will not close on exec.  */
-          CLOSE_ON_EXEC (bad_stdin);
-        }
-    }
-
-  return bad_stdin;
-}
diff --git a/read.c b/read.c
deleted file mode 100644 (file)
index b870aa8..0000000
--- a/read.c
+++ /dev/null
@@ -1,3355 +0,0 @@
-/* Reading and parsing of makefiles for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "filedef.h"
-#include "dep.h"
-#include "job.h"
-#include "commands.h"
-#include "variable.h"
-#include "rule.h"
-#include "debug.h"
-#include "hash.h"
-
-
-#ifdef WINDOWS32
-#include <windows.h>
-#include "sub_proc.h"
-#else  /* !WINDOWS32 */
-#ifndef _AMIGA
-#ifndef VMS
-#include <pwd.h>
-#else
-struct passwd *getpwnam (char *name);
-#endif
-#endif
-#endif /* !WINDOWS32 */
-
-/* A 'struct ebuffer' controls the origin of the makefile we are currently
-   eval'ing.
-*/
-
-struct ebuffer
-  {
-    char *buffer;       /* Start of the current line in the buffer.  */
-    char *bufnext;      /* Start of the next line in the buffer.  */
-    char *bufstart;     /* Start of the entire buffer.  */
-    unsigned int size;  /* Malloc'd size of buffer. */
-    FILE *fp;           /* File, or NULL if this is an internal buffer.  */
-    floc floc;          /* Info on the file in fp (if any).  */
-  };
-
-/* Track the modifiers we can have on variable assignments */
-
-struct vmodifiers
-  {
-    unsigned int assign_v:1;
-    unsigned int define_v:1;
-    unsigned int undefine_v:1;
-    unsigned int export_v:1;
-    unsigned int override_v:1;
-    unsigned int private_v:1;
-  };
-
-/* Types of "words" that can be read in a makefile.  */
-enum make_word_type
-  {
-     w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon,
-     w_varassign
-  };
-
-
-/* A 'struct conditionals' contains the information describing
-   all the active conditionals in a makefile.
-
-   The global variable 'conditionals' contains the conditionals
-   information for the current makefile.  It is initialized from
-   the static structure 'toplevel_conditionals' and is later changed
-   to new structures for included makefiles.  */
-
-struct conditionals
-  {
-    unsigned int if_cmds;       /* Depth of conditional nesting.  */
-    unsigned int allocated;     /* Elts allocated in following arrays.  */
-    char *ignoring;             /* Are we ignoring or interpreting?
-                                   0=interpreting, 1=not yet interpreted,
-                                   2=already interpreted */
-    char *seen_else;            /* Have we already seen an 'else'?  */
-  };
-
-static struct conditionals toplevel_conditionals;
-static struct conditionals *conditionals = &toplevel_conditionals;
-
-
-/* Default directories to search for include files in  */
-
-static const char *default_include_directories[] =
-  {
-#if defined(WINDOWS32) && !defined(INCLUDEDIR)
-/* This completely up to the user when they install MSVC or other packages.
-   This is defined as a placeholder.  */
-# define INCLUDEDIR "."
-#endif
-    INCLUDEDIR,
-#ifndef _AMIGA
-    "/usr/gnu/include",
-    "/usr/local/include",
-    "/usr/include",
-#endif
-    0
-  };
-
-/* List of directories to search for include files in  */
-
-static const char **include_directories;
-
-/* Maximum length of an element of the above.  */
-
-static unsigned int max_incl_len;
-
-/* The filename and pointer to line number of the
-   makefile currently being read in.  */
-
-const floc *reading_file = 0;
-
-/* The chain of files read by read_all_makefiles.  */
-
-static struct goaldep *read_files = 0;
-
-static struct goaldep *eval_makefile (const char *filename, int flags);
-static void eval (struct ebuffer *buffer, int flags);
-
-static long readline (struct ebuffer *ebuf);
-static void do_undefine (char *name, enum variable_origin origin,
-                         struct ebuffer *ebuf);
-static struct variable *do_define (char *name, enum variable_origin origin,
-                                   struct ebuffer *ebuf);
-static int conditional_line (char *line, int len, const floc *flocp);
-static void record_files (struct nameseq *filenames, const char *pattern,
-                          const char *pattern_percent, char *depstr,
-                          unsigned int cmds_started, char *commands,
-                          unsigned int commands_idx, int two_colon,
-                          char prefix, const floc *flocp);
-static void record_target_var (struct nameseq *filenames, char *defn,
-                               enum variable_origin origin,
-                               struct vmodifiers *vmod,
-                               const floc *flocp);
-static enum make_word_type get_next_mword (char *buffer, char *delim,
-                                           char **startp, unsigned int *length);
-static void remove_comments (char *line);
-static char *find_char_unquote (char *string, int map);
-static char *unescape_char (char *string, int c);
-
-
-/* Compare a word, both length and contents.
-   P must point to the word to be tested, and WLEN must be the length.
-*/
-#define word1eq(s)      (wlen == CSTRLEN (s) && strneq (s, p, CSTRLEN (s)))
-
-\f
-/* Read in all the makefiles and return a chain of targets to rebuild.  */
-
-struct goaldep *
-read_all_makefiles (const char **makefiles)
-{
-  unsigned int num_makefiles = 0;
-
-  /* Create *_LIST variables, to hold the makefiles, targets, and variables
-     we will be reading. */
-
-  define_variable_cname ("MAKEFILE_LIST", "", o_file, 0);
-
-  DB (DB_BASIC, (_("Reading makefiles...\n")));
-
-  /* If there's a non-null variable MAKEFILES, its value is a list of
-     files to read first thing.  But don't let it prevent reading the
-     default makefiles and don't let the default goal come from there.  */
-
-  {
-    char *value;
-    char *name, *p;
-    unsigned int length;
-
-    {
-      /* Turn off --warn-undefined-variables while we expand MAKEFILES.  */
-      int save = warn_undefined_variables_flag;
-      warn_undefined_variables_flag = 0;
-
-      value = allocated_variable_expand ("$(MAKEFILES)");
-
-      warn_undefined_variables_flag = save;
-    }
-
-    /* Set NAME to the start of next token and LENGTH to its length.
-       MAKEFILES is updated for finding remaining tokens.  */
-    p = value;
-
-    while ((name = find_next_token ((const char **)&p, &length)) != 0)
-      {
-        if (*p != '\0')
-          *p++ = '\0';
-        eval_makefile (name, RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE);
-      }
-
-    free (value);
-  }
-
-  /* Read makefiles specified with -f switches.  */
-
-  if (makefiles != 0)
-    while (*makefiles != 0)
-      {
-        struct goaldep *d = eval_makefile (*makefiles, 0);
-
-        if (errno)
-          perror_with_name ("", *makefiles);
-
-        /* Reuse the storage allocated for the read_file.  */
-        *makefiles = dep_name (d);
-        ++num_makefiles;
-        ++makefiles;
-      }
-
-  /* If there were no -f switches, try the default names.  */
-
-  if (num_makefiles == 0)
-    {
-      static const char *default_makefiles[] =
-#ifdef VMS
-        /* all lower case since readdir() (the vms version) 'lowercasifies' */
-        /* TODO: Above is not always true, this needs more work */
-        { "makefile.vms", "gnumakefile", "makefile", 0 };
-#else
-#ifdef _AMIGA
-        { "GNUmakefile", "Makefile", "SMakefile", 0 };
-#else /* !Amiga && !VMS */
-#ifdef WINDOWS32
-        { "GNUmakefile", "makefile", "Makefile", "makefile.mak", 0 };
-#else /* !Amiga && !VMS && !WINDOWS32 */
-        { "GNUmakefile", "makefile", "Makefile", 0 };
-#endif /* !Amiga && !VMS && !WINDOWS32 */
-#endif /* AMIGA */
-#endif /* VMS */
-      const char **p = default_makefiles;
-      while (*p != 0 && !file_exists_p (*p))
-        ++p;
-
-      if (*p != 0)
-        {
-          eval_makefile (*p, 0);
-          if (errno)
-            perror_with_name ("", *p);
-        }
-      else
-        {
-          /* No default makefile was found.  Add the default makefiles to the
-             'read_files' chain so they will be updated if possible.  */
-          struct goaldep *tail = read_files;
-          /* Add them to the tail, after any MAKEFILES variable makefiles.  */
-          while (tail != 0 && tail->next != 0)
-            tail = tail->next;
-          for (p = default_makefiles; *p != 0; ++p)
-            {
-              struct goaldep *d = alloc_goaldep ();
-              d->file = enter_file (strcache_add (*p));
-              /* Tell update_goal_chain to bail out as soon as this file is
-                 made, and main not to die if we can't make this file.  */
-              d->flags = RM_DONTCARE;
-              if (tail == 0)
-                read_files = d;
-              else
-                tail->next = d;
-              tail = d;
-            }
-          if (tail != 0)
-            tail->next = 0;
-        }
-    }
-
-  return read_files;
-}
-\f
-/* Install a new conditional and return the previous one.  */
-
-static struct conditionals *
-install_conditionals (struct conditionals *new)
-{
-  struct conditionals *save = conditionals;
-
-  memset (new, '\0', sizeof (*new));
-  conditionals = new;
-
-  return save;
-}
-
-/* Free the current conditionals and reinstate a saved one.  */
-
-static void
-restore_conditionals (struct conditionals *saved)
-{
-  /* Free any space allocated by conditional_line.  */
-  free (conditionals->ignoring);
-  free (conditionals->seen_else);
-
-  /* Restore state.  */
-  conditionals = saved;
-}
-\f
-static struct goaldep *
-eval_makefile (const char *filename, int flags)
-{
-  struct goaldep *deps;
-  struct ebuffer ebuf;
-  const floc *curfile;
-  char *expanded = 0;
-  int makefile_errno;
-
-  ebuf.floc.filenm = filename; /* Use the original file name.  */
-  ebuf.floc.lineno = 1;
-  ebuf.floc.offset = 0;
-
-  if (ISDB (DB_VERBOSE))
-    {
-      printf (_("Reading makefile '%s'"), filename);
-      if (flags & RM_NO_DEFAULT_GOAL)
-        printf (_(" (no default goal)"));
-      if (flags & RM_INCLUDED)
-        printf (_(" (search path)"));
-      if (flags & RM_DONTCARE)
-        printf (_(" (don't care)"));
-      if (flags & RM_NO_TILDE)
-        printf (_(" (no ~ expansion)"));
-      puts ("...");
-    }
-
-  /* First, get a stream to read.  */
-
-  /* Expand ~ in FILENAME unless it came from 'include',
-     in which case it was already done.  */
-  if (!(flags & RM_NO_TILDE) && filename[0] == '~')
-    {
-      expanded = tilde_expand (filename);
-      if (expanded != 0)
-        filename = expanded;
-    }
-
-  ENULLLOOP (ebuf.fp, fopen (filename, "r"));
-
-  /* Save the error code so we print the right message later.  */
-  makefile_errno = errno;
-
-  /* Check for unrecoverable errors: out of mem or FILE slots.  */
-  switch (makefile_errno)
-    {
-#ifdef EMFILE
-    case EMFILE:
-#endif
-#ifdef ENFILE
-    case ENFILE:
-#endif
-    case ENOMEM:
-      {
-        const char *err = strerror (makefile_errno);
-        OS (fatal, reading_file, "%s", err);
-      }
-    }
-
-  /* If the makefile wasn't found and it's either a makefile from
-     the 'MAKEFILES' variable or an included makefile,
-     search the included makefile search path for this makefile.  */
-  if (ebuf.fp == 0 && (flags & RM_INCLUDED) && *filename != '/')
-    {
-      unsigned int i;
-      for (i = 0; include_directories[i] != 0; ++i)
-        {
-          const char *included = concat (3, include_directories[i],
-                                         "/", filename);
-          ebuf.fp = fopen (included, "r");
-          if (ebuf.fp)
-            {
-              filename = included;
-              break;
-            }
-        }
-    }
-
-  /* Now we have the final name for this makefile. Enter it into
-     the cache.  */
-  filename = strcache_add (filename);
-
-  /* Add FILENAME to the chain of read makefiles.  */
-  deps = alloc_goaldep ();
-  deps->next = read_files;
-  read_files = deps;
-  deps->file = lookup_file (filename);
-  if (deps->file == 0)
-    deps->file = enter_file (filename);
-  filename = deps->file->name;
-  deps->flags = flags;
-
-  free (expanded);
-
-  /* If the makefile can't be found at all, give up entirely.  */
-
-  if (ebuf.fp == 0)
-    {
-      /* If we did some searching, errno has the error from the last
-         attempt, rather from FILENAME itself.  Store it in case the
-         caller wants to use it in a message.  */
-      errno = makefile_errno;
-      return deps;
-    }
-
-  /* Set close-on-exec to avoid leaking the makefile to children, such as
-     $(shell ...).  */
-#ifdef HAVE_FILENO
-  CLOSE_ON_EXEC (fileno (ebuf.fp));
-#endif
-
-  /* Add this makefile to the list. */
-  do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
-                          f_append, 0);
-
-  /* Evaluate the makefile */
-
-  ebuf.size = 200;
-  ebuf.buffer = ebuf.bufnext = ebuf.bufstart = xmalloc (ebuf.size);
-
-  curfile = reading_file;
-  reading_file = &ebuf.floc;
-
-  eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL));
-
-  reading_file = curfile;
-
-  fclose (ebuf.fp);
-
-  free (ebuf.bufstart);
-  alloca (0);
-
-  errno = 0;
-  return deps;
-}
-
-void
-eval_buffer (char *buffer, const floc *flocp)
-{
-  struct ebuffer ebuf;
-  struct conditionals *saved;
-  struct conditionals new;
-  const floc *curfile;
-
-  /* Evaluate the buffer */
-
-  ebuf.size = strlen (buffer);
-  ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer;
-  ebuf.fp = NULL;
-
-  if (flocp)
-    ebuf.floc = *flocp;
-  else if (reading_file)
-    ebuf.floc = *reading_file;
-  else
-    {
-      ebuf.floc.filenm = NULL;
-      ebuf.floc.lineno = 1;
-      ebuf.floc.offset = 0;
-    }
-
-  curfile = reading_file;
-  reading_file = &ebuf.floc;
-
-  saved = install_conditionals (&new);
-
-  eval (&ebuf, 1);
-
-  restore_conditionals (saved);
-
-  reading_file = curfile;
-
-  alloca (0);
-}
-\f
-/* Check LINE to see if it's a variable assignment or undefine.
-
-   It might use one of the modifiers "export", "override", "private", or it
-   might be one of the conditional tokens like "ifdef", "include", etc.
-
-   If it's not a variable assignment or undefine, VMOD.V_ASSIGN is 0.
-   Returns LINE.
-
-   Returns a pointer to the first non-modifier character, and sets VMOD
-   based on the modifiers found if any, plus V_ASSIGN is 1.
- */
-static char *
-parse_var_assignment (const char *line, struct vmodifiers *vmod)
-{
-  const char *p;
-  memset (vmod, '\0', sizeof (*vmod));
-
-  /* Find the start of the next token.  If there isn't one we're done.  */
-  NEXT_TOKEN (line);
-  if (*line == '\0')
-    return (char *)line;
-
-  p = line;
-  while (1)
-    {
-      int wlen;
-      const char *p2;
-      struct variable v;
-
-      p2 = parse_variable_definition (p, &v);
-
-      /* If this is a variable assignment, we're done.  */
-      if (p2)
-        break;
-
-      /* It's not a variable; see if it's a modifier.  */
-      p2 = end_of_token (p);
-      wlen = p2 - p;
-
-      if (word1eq ("export"))
-        vmod->export_v = 1;
-      else if (word1eq ("override"))
-        vmod->override_v = 1;
-      else if (word1eq ("private"))
-        vmod->private_v = 1;
-      else if (word1eq ("define"))
-        {
-          /* We can't have modifiers after 'define' */
-          vmod->define_v = 1;
-          p = next_token (p2);
-          break;
-        }
-      else if (word1eq ("undefine"))
-        {
-          /* We can't have modifiers after 'undefine' */
-          vmod->undefine_v = 1;
-          p = next_token (p2);
-          break;
-        }
-      else
-        /* Not a variable or modifier: this is not a variable assignment.  */
-        return (char *)line;
-
-      /* It was a modifier.  Try the next word.  */
-      p = next_token (p2);
-      if (*p == '\0')
-        return (char *)line;
-    }
-
-  /* Found a variable assignment or undefine.  */
-  vmod->assign_v = 1;
-  return (char *)p;
-}
-\f
-
-/* Read file FILENAME as a makefile and add its contents to the data base.
-
-   SET_DEFAULT is true if we are allowed to set the default goal.  */
-
-static void
-eval (struct ebuffer *ebuf, int set_default)
-{
-  char *collapsed = 0;
-  unsigned int collapsed_length = 0;
-  unsigned int commands_len = 200;
-  char *commands;
-  unsigned int commands_idx = 0;
-  unsigned int cmds_started, tgts_started;
-  int ignoring = 0, in_ignored_define = 0;
-  int no_targets = 0;           /* Set when reading a rule without targets.  */
-  struct nameseq *filenames = 0;
-  char *depstr = 0;
-  long nlines = 0;
-  int two_colon = 0;
-  char prefix = cmd_prefix;
-  const char *pattern = 0;
-  const char *pattern_percent;
-  floc *fstart;
-  floc fi;
-
-#define record_waiting_files()                                                \
-  do                                                                          \
-    {                                                                         \
-      if (filenames != 0)                                                     \
-        {                                                                     \
-          fi.lineno = tgts_started;                                           \
-          fi.offset = 0;                                                      \
-          record_files (filenames, pattern, pattern_percent, depstr,          \
-                        cmds_started, commands, commands_idx, two_colon,      \
-                        prefix, &fi);                                         \
-          filenames = 0;                                                      \
-        }                                                                     \
-      commands_idx = 0;                                                       \
-      no_targets = 0;                                                         \
-      pattern = 0;                                                            \
-    } while (0)
-
-  pattern_percent = 0;
-  cmds_started = tgts_started = 1;
-
-  fstart = &ebuf->floc;
-  fi.filenm = ebuf->floc.filenm;
-
-  /* Loop over lines in the file.
-     The strategy is to accumulate target names in FILENAMES, dependencies
-     in DEPS and commands in COMMANDS.  These are used to define a rule
-     when the start of the next rule (or eof) is encountered.
-
-     When you see a "continue" in the loop below, that means we are moving on
-     to the next line.  If you see record_waiting_files(), then the statement
-     we are parsing also finishes the previous rule.  */
-
-  commands = xmalloc (200);
-
-  while (1)
-    {
-      unsigned int linelen;
-      char *line;
-      unsigned int wlen;
-      char *p;
-      char *p2;
-      struct vmodifiers vmod;
-
-      /* At the top of this loop, we are starting a brand new line.  */
-      /* Grab the next line to be evaluated */
-      ebuf->floc.lineno += nlines;
-      nlines = readline (ebuf);
-
-      /* If there is nothing left to eval, we're done.  */
-      if (nlines < 0)
-        break;
-
-      line = ebuf->buffer;
-
-      /* If this is the first line, check for a UTF-8 BOM and skip it.  */
-      if (ebuf->floc.lineno == 1 && line[0] == (char)0xEF
-          && line[1] == (char)0xBB && line[2] == (char)0xBF)
-        {
-          line += 3;
-          if (ISDB(DB_BASIC))
-            {
-              if (ebuf->floc.filenm)
-                printf (_("Skipping UTF-8 BOM in makefile '%s'\n"),
-                        ebuf->floc.filenm);
-              else
-                printf (_("Skipping UTF-8 BOM in makefile buffer\n"));
-            }
-        }
-
-      /* If this line is empty, skip it.  */
-      if (line[0] == '\0')
-        continue;
-
-      linelen = strlen (line);
-
-      /* Check for a shell command line first.
-         If it is not one, we can stop treating cmd_prefix specially.  */
-      if (line[0] == cmd_prefix)
-        {
-          if (no_targets)
-            /* Ignore the commands in a rule with no targets.  */
-            continue;
-
-          /* If there is no preceding rule line, don't treat this line
-             as a command, even though it begins with a recipe prefix.
-             SunOS 4 make appears to behave this way.  */
-
-          if (filenames != 0)
-            {
-              if (ignoring)
-                /* Yep, this is a shell command, and we don't care.  */
-                continue;
-
-              if (commands_idx == 0)
-                cmds_started = ebuf->floc.lineno;
-
-              /* Append this command line to the line being accumulated.
-                 Skip the initial command prefix character.  */
-              if (linelen + commands_idx > commands_len)
-                {
-                  commands_len = (linelen + commands_idx) * 2;
-                  commands = xrealloc (commands, commands_len);
-                }
-              memcpy (&commands[commands_idx], line + 1, linelen - 1);
-              commands_idx += linelen - 1;
-              commands[commands_idx++] = '\n';
-              continue;
-            }
-        }
-
-      /* This line is not a shell command line.  Don't worry about whitespace.
-         Get more space if we need it; we don't need to preserve the current
-         contents of the buffer.  */
-
-      if (collapsed_length < linelen+1)
-        {
-          collapsed_length = linelen+1;
-          free (collapsed);
-          /* Don't need xrealloc: we don't need to preserve the content.  */
-          collapsed = xmalloc (collapsed_length);
-        }
-      strcpy (collapsed, line);
-      /* Collapse continuation lines.  */
-      collapse_continuations (collapsed);
-      remove_comments (collapsed);
-
-      /* Get rid if starting space (including formfeed, vtab, etc.)  */
-      p = collapsed;
-      NEXT_TOKEN (p);
-
-      /* See if this is a variable assignment.  We need to do this early, to
-         allow variables with names like 'ifdef', 'export', 'private', etc.  */
-      p = parse_var_assignment (p, &vmod);
-      if (vmod.assign_v)
-        {
-          struct variable *v;
-          enum variable_origin origin = vmod.override_v ? o_override : o_file;
-
-          /* If we're ignoring then we're done now.  */
-          if (ignoring)
-            {
-              if (vmod.define_v)
-                in_ignored_define = 1;
-              continue;
-            }
-
-          /* Variable assignment ends the previous rule.  */
-          record_waiting_files ();
-
-          if (vmod.undefine_v)
-          {
-            do_undefine (p, origin, ebuf);
-            continue;
-          }
-          else if (vmod.define_v)
-            v = do_define (p, origin, ebuf);
-          else
-            v = try_variable_definition (fstart, p, origin, 0);
-
-          assert (v != NULL);
-
-          if (vmod.export_v)
-            v->export = v_export;
-          if (vmod.private_v)
-            v->private_var = 1;
-
-          /* This line has been dealt with.  */
-          continue;
-        }
-
-      /* If this line is completely empty, ignore it.  */
-      if (*p == '\0')
-        continue;
-
-      p2 = end_of_token (p);
-      wlen = p2 - p;
-      NEXT_TOKEN (p2);
-
-      /* If we're in an ignored define, skip this line (but maybe get out).  */
-      if (in_ignored_define)
-        {
-          /* See if this is an endef line (plus optional comment).  */
-          if (word1eq ("endef") && STOP_SET (*p2, MAP_COMMENT|MAP_NUL))
-            in_ignored_define = 0;
-
-          continue;
-        }
-
-      /* Check for conditional state changes.  */
-      {
-        int i = conditional_line (p, wlen, fstart);
-        if (i != -2)
-          {
-            if (i == -1)
-              O (fatal, fstart, _("invalid syntax in conditional"));
-
-            ignoring = i;
-            continue;
-          }
-      }
-
-      /* Nothing to see here... move along.  */
-      if (ignoring)
-        continue;
-
-      /* Manage the "export" keyword used outside of variable assignment
-         as well as "unexport".  */
-      if (word1eq ("export") || word1eq ("unexport"))
-        {
-          int exporting = *p == 'u' ? 0 : 1;
-
-          /* Export/unexport ends the previous rule.  */
-          record_waiting_files ();
-
-          /* (un)export by itself causes everything to be (un)exported. */
-          if (*p2 == '\0')
-            export_all_variables = exporting;
-          else
-            {
-              unsigned int l;
-              const char *cp;
-              char *ap;
-
-              /* Expand the line so we can use indirect and constructed
-                 variable names in an (un)export command.  */
-              cp = ap = allocated_variable_expand (p2);
-
-              for (p = find_next_token (&cp, &l); p != 0;
-                   p = find_next_token (&cp, &l))
-                {
-                  struct variable *v = lookup_variable (p, l);
-                  if (v == 0)
-                    v = define_variable_global (p, l, "", o_file, 0, fstart);
-                  v->export = exporting ? v_export : v_noexport;
-                }
-
-              free (ap);
-            }
-          continue;
-        }
-
-      /* Handle the special syntax for vpath.  */
-      if (word1eq ("vpath"))
-        {
-          const char *cp;
-          char *vpat;
-          unsigned int l;
-
-          /* vpath ends the previous rule.  */
-          record_waiting_files ();
-
-          cp = variable_expand (p2);
-          p = find_next_token (&cp, &l);
-          if (p != 0)
-            {
-              vpat = xstrndup (p, l);
-              p = find_next_token (&cp, &l);
-              /* No searchpath means remove all previous
-                 selective VPATH's with the same pattern.  */
-            }
-          else
-            /* No pattern means remove all previous selective VPATH's.  */
-            vpat = 0;
-          construct_vpath_list (vpat, p);
-          free (vpat);
-
-          continue;
-        }
-
-      /* Handle include and variants.  */
-      if (word1eq ("include") || word1eq ("-include") || word1eq ("sinclude"))
-        {
-          /* We have found an 'include' line specifying a nested
-             makefile to be read at this point.  */
-          struct conditionals *save;
-          struct conditionals new_conditionals;
-          struct nameseq *files;
-          /* "-include" (vs "include") says no error if the file does not
-             exist.  "sinclude" is an alias for this from SGI.  */
-          int noerror = (p[0] != 'i');
-
-          /* Include ends the previous rule.  */
-          record_waiting_files ();
-
-          p = allocated_variable_expand (p2);
-
-          /* If no filenames, it's a no-op.  */
-          if (*p == '\0')
-            {
-              free (p);
-              continue;
-            }
-
-          /* Parse the list of file names.  Don't expand archive references!  */
-          p2 = p;
-          files = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_NUL, NULL,
-                                  PARSEFS_NOAR);
-          free (p);
-
-          /* Save the state of conditionals and start
-             the included makefile with a clean slate.  */
-          save = install_conditionals (&new_conditionals);
-
-          /* Record the rules that are waiting so they will determine
-             the default goal before those in the included makefile.  */
-          record_waiting_files ();
-
-          /* Read each included makefile.  */
-          while (files != 0)
-            {
-              struct nameseq *next = files->next;
-              int flags = (RM_INCLUDED | RM_NO_TILDE
-                           | (noerror ? RM_DONTCARE : 0)
-                           | (set_default ? 0 : RM_NO_DEFAULT_GOAL));
-
-              struct goaldep *d = eval_makefile (files->name, flags);
-
-              if (errno)
-                {
-                  d->error = (unsigned short)errno;
-                  d->floc = *fstart;
-                }
-
-              free_ns (files);
-              files = next;
-            }
-
-          /* Restore conditional state.  */
-          restore_conditionals (save);
-
-          continue;
-        }
-
-      /* Handle the load operations.  */
-      if (word1eq ("load") || word1eq ("-load"))
-        {
-          /* A 'load' line specifies a dynamic object to load.  */
-          struct nameseq *files;
-          int noerror = (p[0] == '-');
-
-          /* Load ends the previous rule.  */
-          record_waiting_files ();
-
-          p = allocated_variable_expand (p2);
-
-          /* If no filenames, it's a no-op.  */
-          if (*p == '\0')
-            {
-              free (p);
-              continue;
-            }
-
-          /* Parse the list of file names.
-             Don't expand archive references or strip "./"  */
-          p2 = p;
-          files = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_NUL, NULL,
-                                  PARSEFS_NOAR);
-          free (p);
-
-          /* Load each file.  */
-          while (files != 0)
-            {
-              struct nameseq *next = files->next;
-              const char *name = files->name;
-              struct goaldep *deps;
-              int r;
-
-              /* Load the file.  0 means failure.  */
-              r = load_file (&ebuf->floc, &name, noerror);
-              if (! r && ! noerror)
-                OS (fatal, &ebuf->floc, _("%s: failed to load"), name);
-
-              free_ns (files);
-              files = next;
-
-              /* Return of -1 means a special load: don't rebuild it.  */
-              if (r == -1)
-                continue;
-
-              /* It succeeded, so add it to the list "to be rebuilt".  */
-              deps = alloc_goaldep ();
-              deps->next = read_files;
-              read_files = deps;
-              deps->file = lookup_file (name);
-              if (deps->file == 0)
-                deps->file = enter_file (name);
-              deps->file->loaded = 1;
-            }
-
-          continue;
-        }
-
-      /* This line starts with a tab but was not caught above because there
-         was no preceding target, and the line might have been usable as a
-         variable definition.  But now we know it is definitely lossage.  */
-      if (line[0] == cmd_prefix)
-        O (fatal, fstart, _("recipe commences before first target"));
-
-      /* This line describes some target files.  This is complicated by
-         the existence of target-specific variables, because we can't
-         expand the entire line until we know if we have one or not.  So
-         we expand the line word by word until we find the first ':',
-         then check to see if it's a target-specific variable.
-
-         In this algorithm, 'lb_next' will point to the beginning of the
-         unexpanded parts of the input buffer, while 'p2' points to the
-         parts of the expanded buffer we haven't searched yet. */
-
-      {
-        enum make_word_type wtype;
-        char *cmdleft, *semip, *lb_next;
-        unsigned int plen = 0;
-        char *colonp;
-        const char *end, *beg; /* Helpers for whitespace stripping. */
-
-        /* Record the previous rule.  */
-
-        record_waiting_files ();
-        tgts_started = fstart->lineno;
-
-        /* Search the line for an unquoted ; that is not after an
-           unquoted #.  */
-        cmdleft = find_char_unquote (line, MAP_SEMI|MAP_COMMENT|MAP_VARIABLE);
-        if (cmdleft != 0 && *cmdleft == '#')
-          {
-            /* We found a comment before a semicolon.  */
-            *cmdleft = '\0';
-            cmdleft = 0;
-          }
-        else if (cmdleft != 0)
-          /* Found one.  Cut the line short there before expanding it.  */
-          *(cmdleft++) = '\0';
-        semip = cmdleft;
-
-        collapse_continuations (line);
-
-        /* We can't expand the entire line, since if it's a per-target
-           variable we don't want to expand it.  So, walk from the
-           beginning, expanding as we go, and looking for "interesting"
-           chars.  The first word is always expandable.  */
-        wtype = get_next_mword (line, NULL, &lb_next, &wlen);
-        switch (wtype)
-          {
-          case w_eol:
-            if (cmdleft != 0)
-              O (fatal, fstart, _("missing rule before recipe"));
-            /* This line contained something but turned out to be nothing
-               but whitespace (a comment?).  */
-            continue;
-
-          case w_colon:
-          case w_dcolon:
-            /* We accept and ignore rules without targets for
-               compatibility with SunOS 4 make.  */
-            no_targets = 1;
-            continue;
-
-          default:
-            break;
-          }
-
-        p2 = variable_expand_string (NULL, lb_next, wlen);
-
-        while (1)
-          {
-            lb_next += wlen;
-            if (cmdleft == 0)
-              {
-                /* Look for a semicolon in the expanded line.  */
-                cmdleft = find_char_unquote (p2, MAP_SEMI);
-
-                if (cmdleft != 0)
-                  {
-                    unsigned long p2_off = p2 - variable_buffer;
-                    unsigned long cmd_off = cmdleft - variable_buffer;
-                    char *pend = p2 + strlen (p2);
-
-                    /* Append any remnants of lb, then cut the line short
-                       at the semicolon.  */
-                    *cmdleft = '\0';
-
-                    /* One school of thought says that you shouldn't expand
-                       here, but merely copy, since now you're beyond a ";"
-                       and into a command script.  However, the old parser
-                       expanded the whole line, so we continue that for
-                       backwards-compatibility.  Also, it wouldn't be
-                       entirely consistent, since we do an unconditional
-                       expand below once we know we don't have a
-                       target-specific variable. */
-                    (void)variable_expand_string (pend, lb_next, (long)-1);
-                    lb_next += strlen (lb_next);
-                    p2 = variable_buffer + p2_off;
-                    cmdleft = variable_buffer + cmd_off + 1;
-                  }
-              }
-
-            colonp = find_char_unquote (p2, MAP_COLON);
-#ifdef HAVE_DOS_PATHS
-            /* The drive spec brain-damage strikes again...  */
-            /* Note that the only separators of targets in this context
-               are whitespace and a left paren.  If others are possible,
-               they should be added to the string in the call to index.  */
-            while (colonp && (colonp[1] == '/' || colonp[1] == '\\') &&
-                   colonp > p2 && isalpha ((unsigned char)colonp[-1]) &&
-                   (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0))
-              colonp = find_char_unquote (colonp + 1, MAP_COLON);
-#endif
-            if (colonp != 0)
-              break;
-
-            wtype = get_next_mword (lb_next, NULL, &lb_next, &wlen);
-            if (wtype == w_eol)
-              break;
-
-            p2 += strlen (p2);
-            *(p2++) = ' ';
-            p2 = variable_expand_string (p2, lb_next, wlen);
-            /* We don't need to worry about cmdleft here, because if it was
-               found in the variable_buffer the entire buffer has already
-               been expanded... we'll never get here.  */
-          }
-
-        p2 = next_token (variable_buffer);
-
-        /* If the word we're looking at is EOL, see if there's _anything_
-           on the line.  If not, a variable expanded to nothing, so ignore
-           it.  If so, we can't parse this line so punt.  */
-        if (wtype == w_eol)
-          {
-            if (*p2 == '\0')
-              continue;
-
-            /* There's no need to be ivory-tower about this: check for
-               one of the most common bugs found in makefiles...  */
-            if (cmd_prefix == '\t' && strneq (line, "        ", 8))
-              O (fatal, fstart, _("missing separator (did you mean TAB instead of 8 spaces?)"));
-            else
-              O (fatal, fstart, _("missing separator"));
-          }
-
-        /* Make the colon the end-of-string so we know where to stop
-           looking for targets.  Start there again once we're done.  */
-        *colonp = '\0';
-        filenames = PARSE_SIMPLE_SEQ (&p2, struct nameseq);
-        *colonp = ':';
-        p2 = colonp;
-
-        if (!filenames)
-          {
-            /* We accept and ignore rules without targets for
-               compatibility with SunOS 4 make.  */
-            no_targets = 1;
-            continue;
-          }
-        /* This should never be possible; we handled it above.  */
-        assert (*p2 != '\0');
-        ++p2;
-
-        /* Is this a one-colon or two-colon entry?  */
-        two_colon = *p2 == ':';
-        if (two_colon)
-          p2++;
-
-        /* Test to see if it's a target-specific variable.  Copy the rest
-           of the buffer over, possibly temporarily (we'll expand it later
-           if it's not a target-specific variable).  PLEN saves the length
-           of the unparsed section of p2, for later.  */
-        if (*lb_next != '\0')
-          {
-            unsigned int l = p2 - variable_buffer;
-            plen = strlen (p2);
-            variable_buffer_output (p2+plen, lb_next, strlen (lb_next)+1);
-            p2 = variable_buffer + l;
-          }
-
-        p2 = parse_var_assignment (p2, &vmod);
-        if (vmod.assign_v)
-          {
-            /* If there was a semicolon found, add it back, plus anything
-               after it.  */
-            if (semip)
-              {
-                unsigned int l = p2 - variable_buffer;
-                *(--semip) = ';';
-                collapse_continuations (semip);
-                variable_buffer_output (p2 + strlen (p2),
-                                        semip, strlen (semip)+1);
-                p2 = variable_buffer + l;
-              }
-            record_target_var (filenames, p2,
-                               vmod.override_v ? o_override : o_file,
-                               &vmod, fstart);
-            filenames = 0;
-            continue;
-          }
-
-        /* This is a normal target, _not_ a target-specific variable.
-           Unquote any = in the dependency list.  */
-        find_char_unquote (lb_next, MAP_EQUALS);
-
-        /* Remember the command prefix for this target.  */
-        prefix = cmd_prefix;
-
-        /* We have some targets, so don't ignore the following commands.  */
-        no_targets = 0;
-
-        /* Expand the dependencies, etc.  */
-        if (*lb_next != '\0')
-          {
-            unsigned int l = p2 - variable_buffer;
-            (void) variable_expand_string (p2 + plen, lb_next, (long)-1);
-            p2 = variable_buffer + l;
-
-            /* Look for a semicolon in the expanded line.  */
-            if (cmdleft == 0)
-              {
-                cmdleft = find_char_unquote (p2, MAP_SEMI);
-                if (cmdleft != 0)
-                  *(cmdleft++) = '\0';
-              }
-          }
-
-        /* Is this a static pattern rule: 'target: %targ: %dep; ...'?  */
-        p = strchr (p2, ':');
-        while (p != 0 && p[-1] == '\\')
-          {
-            char *q = &p[-1];
-            int backslash = 0;
-            while (*q-- == '\\')
-              backslash = !backslash;
-            if (backslash)
-              p = strchr (p + 1, ':');
-            else
-              break;
-          }
-#ifdef _AMIGA
-        /* Here, the situation is quite complicated. Let's have a look
-           at a couple of targets:
-
-           install: dev:make
-
-           dev:make: make
-
-           dev:make:: xyz
-
-           The rule is that it's only a target, if there are TWO :'s
-           OR a space around the :.
-        */
-        if (p && !(ISSPACE (p[1]) || !p[1] || ISSPACE (p[-1])))
-          p = 0;
-#endif
-#ifdef HAVE_DOS_PATHS
-        {
-          int check_again;
-          do {
-            check_again = 0;
-            /* For DOS-style paths, skip a "C:\..." or a "C:/..." */
-            if (p != 0 && (p[1] == '\\' || p[1] == '/') &&
-                isalpha ((unsigned char)p[-1]) &&
-                (p == p2 + 1 || strchr (" \t:(", p[-2]) != 0)) {
-              p = strchr (p + 1, ':');
-              check_again = 1;
-            }
-          } while (check_again);
-        }
-#endif
-        if (p != 0)
-          {
-            struct nameseq *target;
-            target = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_COLON, NULL,
-                                     PARSEFS_NOGLOB);
-            ++p2;
-            if (target == 0)
-              O (fatal, fstart, _("missing target pattern"));
-            else if (target->next != 0)
-              O (fatal, fstart, _("multiple target patterns"));
-            pattern_percent = find_percent_cached (&target->name);
-            pattern = target->name;
-            if (pattern_percent == 0)
-              O (fatal, fstart, _("target pattern contains no '%%'"));
-            free_ns (target);
-          }
-        else
-          pattern = 0;
-
-        /* Strip leading and trailing whitespaces. */
-        beg = p2;
-        end = beg + strlen (beg) - 1;
-        strip_whitespace (&beg, &end);
-
-        /* Put all the prerequisites here; they'll be parsed later.  */
-        if (beg <= end && *beg != '\0')
-          depstr = xstrndup (beg, end - beg + 1);
-        else
-          depstr = 0;
-
-        commands_idx = 0;
-        if (cmdleft != 0)
-          {
-            /* Semicolon means rest of line is a command.  */
-            unsigned int l = strlen (cmdleft);
-
-            cmds_started = fstart->lineno;
-
-            /* Add this command line to the buffer.  */
-            if (l + 2 > commands_len)
-              {
-                commands_len = (l + 2) * 2;
-                commands = xrealloc (commands, commands_len);
-              }
-            memcpy (commands, cmdleft, l);
-            commands_idx += l;
-            commands[commands_idx++] = '\n';
-          }
-
-        /* Determine if this target should be made default. We used to do
-           this in record_files() but because of the delayed target recording
-           and because preprocessor directives are legal in target's commands
-           it is too late. Consider this fragment for example:
-
-           foo:
-
-           ifeq ($(.DEFAULT_GOAL),foo)
-              ...
-           endif
-
-           Because the target is not recorded until after ifeq directive is
-           evaluated the .DEFAULT_GOAL does not contain foo yet as one
-           would expect. Because of this we have to move the logic here.  */
-
-        if (set_default && default_goal_var->value[0] == '\0')
-          {
-            struct dep *d;
-            struct nameseq *t = filenames;
-
-            for (; t != 0; t = t->next)
-              {
-                int reject = 0;
-                const char *name = t->name;
-
-                /* We have nothing to do if this is an implicit rule. */
-                if (strchr (name, '%') != 0)
-                  break;
-
-                /* See if this target's name does not start with a '.',
-                   unless it contains a slash.  */
-                if (*name == '.' && strchr (name, '/') == 0
-#ifdef HAVE_DOS_PATHS
-                    && strchr (name, '\\') == 0
-#endif
-                    )
-                  continue;
-
-
-                /* If this file is a suffix, don't let it be
-                   the default goal file.  */
-                for (d = suffix_file->deps; d != 0; d = d->next)
-                  {
-                    register struct dep *d2;
-                    if (*dep_name (d) != '.' && streq (name, dep_name (d)))
-                      {
-                        reject = 1;
-                        break;
-                      }
-                    for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
-                      {
-                        unsigned int l = strlen (dep_name (d2));
-                        if (!strneq (name, dep_name (d2), l))
-                          continue;
-                        if (streq (name + l, dep_name (d)))
-                          {
-                            reject = 1;
-                            break;
-                          }
-                      }
-
-                    if (reject)
-                      break;
-                  }
-
-                if (!reject)
-                  {
-                    define_variable_global (".DEFAULT_GOAL", 13, t->name,
-                                            o_file, 0, NILF);
-                    break;
-                  }
-              }
-          }
-
-        continue;
-      }
-
-      /* We get here except in the case that we just read a rule line.
-         Record now the last rule we read, so following spurious
-         commands are properly diagnosed.  */
-      record_waiting_files ();
-    }
-
-#undef word1eq
-
-  if (conditionals->if_cmds)
-    O (fatal, fstart, _("missing 'endif'"));
-
-  /* At eof, record the last rule.  */
-  record_waiting_files ();
-
-  free (collapsed);
-  free (commands);
-}
-\f
-
-/* Remove comments from LINE.
-   This is done by copying the text at LINE onto itself.  */
-
-static void
-remove_comments (char *line)
-{
-  char *comment;
-
-  comment = find_char_unquote (line, MAP_COMMENT);
-
-  if (comment != 0)
-    /* Cut off the line at the #.  */
-    *comment = '\0';
-}
-
-/* Execute a 'undefine' directive.
-   The undefine line has already been read, and NAME is the name of
-   the variable to be undefined. */
-
-static void
-do_undefine (char *name, enum variable_origin origin, struct ebuffer *ebuf)
-{
-  char *p, *var;
-
-  /* Expand the variable name and find the beginning (NAME) and end.  */
-  var = allocated_variable_expand (name);
-  name = next_token (var);
-  if (*name == '\0')
-    O (fatal, &ebuf->floc, _("empty variable name"));
-  p = name + strlen (name) - 1;
-  while (p > name && ISBLANK (*p))
-    --p;
-  p[1] = '\0';
-
-  undefine_variable_global (name, p - name + 1, origin);
-  free (var);
-}
-
-/* Execute a 'define' directive.
-   The first line has already been read, and NAME is the name of
-   the variable to be defined.  The following lines remain to be read.  */
-
-static struct variable *
-do_define (char *name, enum variable_origin origin, struct ebuffer *ebuf)
-{
-  struct variable *v;
-  struct variable var;
-  floc defstart;
-  int nlevels = 1;
-  unsigned int length = 100;
-  char *definition = xmalloc (length);
-  unsigned int idx = 0;
-  char *p, *n;
-
-  defstart = ebuf->floc;
-
-  p = parse_variable_definition (name, &var);
-  if (p == NULL)
-    /* No assignment token, so assume recursive.  */
-    var.flavor = f_recursive;
-  else
-    {
-      if (var.value[0] != '\0')
-        O (error, &defstart, _("extraneous text after 'define' directive"));
-
-      /* Chop the string before the assignment token to get the name.  */
-      var.name[var.length] = '\0';
-    }
-
-  /* Expand the variable name and find the beginning (NAME) and end.  */
-  n = allocated_variable_expand (name);
-  name = next_token (n);
-  if (name[0] == '\0')
-    O (fatal, &defstart, _("empty variable name"));
-  p = name + strlen (name) - 1;
-  while (p > name && ISBLANK (*p))
-    --p;
-  p[1] = '\0';
-
-  /* Now read the value of the variable.  */
-  while (1)
-    {
-      unsigned int len;
-      char *line;
-      long nlines = readline (ebuf);
-
-      /* If there is nothing left to be eval'd, there's no 'endef'!!  */
-      if (nlines < 0)
-        O (fatal, &defstart, _("missing 'endef', unterminated 'define'"));
-
-      ebuf->floc.lineno += nlines;
-      line = ebuf->buffer;
-
-      collapse_continuations (line);
-
-      /* If the line doesn't begin with a tab, test to see if it introduces
-         another define, or ends one.  Stop if we find an 'endef' */
-      if (line[0] != cmd_prefix)
-        {
-          p = next_token (line);
-          len = strlen (p);
-
-          /* If this is another 'define', increment the level count.  */
-          if ((len == 6 || (len > 6 && ISBLANK (p[6])))
-              && strneq (p, "define", 6))
-            ++nlevels;
-
-          /* If this is an 'endef', decrement the count.  If it's now 0,
-             we've found the last one.  */
-          else if ((len == 5 || (len > 5 && ISBLANK (p[5])))
-                   && strneq (p, "endef", 5))
-            {
-              p += 5;
-              remove_comments (p);
-              if (*(next_token (p)) != '\0')
-                O (error, &ebuf->floc,
-                   _("extraneous text after 'endef' directive"));
-
-              if (--nlevels == 0)
-                break;
-            }
-        }
-
-      /* Add this line to the variable definition.  */
-      len = strlen (line);
-      if (idx + len + 1 > length)
-        {
-          length = (idx + len) * 2;
-          definition = xrealloc (definition, length + 1);
-        }
-
-      memcpy (&definition[idx], line, len);
-      idx += len;
-      /* Separate lines with a newline.  */
-      definition[idx++] = '\n';
-    }
-
-  /* We've got what we need; define the variable.  */
-  if (idx == 0)
-    definition[0] = '\0';
-  else
-    definition[idx - 1] = '\0';
-
-  v = do_variable_definition (&defstart, name,
-                              definition, origin, var.flavor, 0);
-  free (definition);
-  free (n);
-  return (v);
-}
-\f
-/* Interpret conditional commands "ifdef", "ifndef", "ifeq",
-   "ifneq", "else" and "endif".
-   LINE is the input line, with the command as its first word.
-
-   FILENAME and LINENO are the filename and line number in the
-   current makefile.  They are used for error messages.
-
-   Value is -2 if the line is not a conditional at all,
-   -1 if the line is an invalid conditional,
-   0 if following text should be interpreted,
-   1 if following text should be ignored.  */
-
-static int
-conditional_line (char *line, int len, const floc *flocp)
-{
-  const char *cmdname;
-  enum { c_ifdef, c_ifndef, c_ifeq, c_ifneq, c_else, c_endif } cmdtype;
-  unsigned int i;
-  unsigned int o;
-
-  /* Compare a word, both length and contents. */
-#define word1eq(s)      (len == CSTRLEN (s) && strneq (s, line, CSTRLEN (s)))
-#define chkword(s, t)   if (word1eq (s)) { cmdtype = (t); cmdname = (s); }
-
-  /* Make sure this line is a conditional.  */
-  chkword ("ifdef", c_ifdef)
-  else chkword ("ifndef", c_ifndef)
-  else chkword ("ifeq", c_ifeq)
-  else chkword ("ifneq", c_ifneq)
-  else chkword ("else", c_else)
-  else chkword ("endif", c_endif)
-  else
-    return -2;
-
-  /* Found one: skip past it and any whitespace after it.  */
-  line += len;
-  NEXT_TOKEN (line);
-
-#define EXTRATEXT() OS (error, flocp, _("extraneous text after '%s' directive"), cmdname)
-#define EXTRACMD()  OS (fatal, flocp, _("extraneous '%s'"), cmdname)
-
-  /* An 'endif' cannot contain extra text, and reduces the if-depth by 1  */
-  if (cmdtype == c_endif)
-    {
-      if (*line != '\0')
-        EXTRATEXT ();
-
-      if (!conditionals->if_cmds)
-        EXTRACMD ();
-
-      --conditionals->if_cmds;
-
-      goto DONE;
-    }
-
-  /* An 'else' statement can either be simple, or it can have another
-     conditional after it.  */
-  if (cmdtype == c_else)
-    {
-      const char *p;
-
-      if (!conditionals->if_cmds)
-        EXTRACMD ();
-
-      o = conditionals->if_cmds - 1;
-
-      if (conditionals->seen_else[o])
-        O (fatal, flocp, _("only one 'else' per conditional"));
-
-      /* Change the state of ignorance.  */
-      switch (conditionals->ignoring[o])
-        {
-          case 0:
-            /* We've just been interpreting.  Never do it again.  */
-            conditionals->ignoring[o] = 2;
-            break;
-          case 1:
-            /* We've never interpreted yet.  Maybe this time!  */
-            conditionals->ignoring[o] = 0;
-            break;
-        }
-
-      /* It's a simple 'else'.  */
-      if (*line == '\0')
-        {
-          conditionals->seen_else[o] = 1;
-          goto DONE;
-        }
-
-      /* The 'else' has extra text.  That text must be another conditional
-         and cannot be an 'else' or 'endif'.  */
-
-      /* Find the length of the next word.  */
-      for (p = line+1; ! STOP_SET (*p, MAP_SPACE|MAP_NUL); ++p)
-        ;
-      len = p - line;
-
-      /* If it's 'else' or 'endif' or an illegal conditional, fail.  */
-      if (word1eq ("else") || word1eq ("endif")
-          || conditional_line (line, len, flocp) < 0)
-        EXTRATEXT ();
-      else
-        {
-          /* conditional_line() created a new level of conditional.
-             Raise it back to this level.  */
-          if (conditionals->ignoring[o] < 2)
-            conditionals->ignoring[o] = conditionals->ignoring[o+1];
-          --conditionals->if_cmds;
-        }
-
-      goto DONE;
-    }
-
-  if (conditionals->allocated == 0)
-    {
-      conditionals->allocated = 5;
-      conditionals->ignoring = xmalloc (conditionals->allocated);
-      conditionals->seen_else = xmalloc (conditionals->allocated);
-    }
-
-  o = conditionals->if_cmds++;
-  if (conditionals->if_cmds > conditionals->allocated)
-    {
-      conditionals->allocated += 5;
-      conditionals->ignoring = xrealloc (conditionals->ignoring,
-                                         conditionals->allocated);
-      conditionals->seen_else = xrealloc (conditionals->seen_else,
-                                          conditionals->allocated);
-    }
-
-  /* Record that we have seen an 'if...' but no 'else' so far.  */
-  conditionals->seen_else[o] = 0;
-
-  /* Search through the stack to see if we're already ignoring.  */
-  for (i = 0; i < o; ++i)
-    if (conditionals->ignoring[i])
-      {
-        /* We are already ignoring, so just push a level to match the next
-           "else" or "endif", and keep ignoring.  We don't want to expand
-           variables in the condition.  */
-        conditionals->ignoring[o] = 1;
-        return 1;
-      }
-
-  if (cmdtype == c_ifdef || cmdtype == c_ifndef)
-    {
-      char *var;
-      struct variable *v;
-      char *p;
-
-      /* Expand the thing we're looking up, so we can use indirect and
-         constructed variable names.  */
-      var = allocated_variable_expand (line);
-
-      /* Make sure there's only one variable name to test.  */
-      p = end_of_token (var);
-      i = p - var;
-      NEXT_TOKEN (p);
-      if (*p != '\0')
-        return -1;
-
-      var[i] = '\0';
-      v = lookup_variable (var, i);
-
-      conditionals->ignoring[o] =
-        ((v != 0 && *v->value != '\0') == (cmdtype == c_ifndef));
-
-      free (var);
-    }
-  else
-    {
-      /* "ifeq" or "ifneq".  */
-      char *s1, *s2;
-      unsigned int l;
-      char termin = *line == '(' ? ',' : *line;
-
-      if (termin != ',' && termin != '"' && termin != '\'')
-        return -1;
-
-      s1 = ++line;
-      /* Find the end of the first string.  */
-      if (termin == ',')
-        {
-          int count = 0;
-          for (; *line != '\0'; ++line)
-            if (*line == '(')
-              ++count;
-            else if (*line == ')')
-              --count;
-            else if (*line == ',' && count <= 0)
-              break;
-        }
-      else
-        while (*line != '\0' && *line != termin)
-          ++line;
-
-      if (*line == '\0')
-        return -1;
-
-      if (termin == ',')
-        {
-          /* Strip blanks after the first string.  */
-          char *p = line++;
-          while (ISBLANK (p[-1]))
-            --p;
-          *p = '\0';
-        }
-      else
-        *line++ = '\0';
-
-      s2 = variable_expand (s1);
-      /* We must allocate a new copy of the expanded string because
-         variable_expand re-uses the same buffer.  */
-      l = strlen (s2);
-      s1 = alloca (l + 1);
-      memcpy (s1, s2, l + 1);
-
-      if (termin != ',')
-        /* Find the start of the second string.  */
-        NEXT_TOKEN (line);
-
-      termin = termin == ',' ? ')' : *line;
-      if (termin != ')' && termin != '"' && termin != '\'')
-        return -1;
-
-      /* Find the end of the second string.  */
-      if (termin == ')')
-        {
-          int count = 0;
-          s2 = next_token (line);
-          for (line = s2; *line != '\0'; ++line)
-            {
-              if (*line == '(')
-                ++count;
-              else if (*line == ')')
-                {
-                  if (count <= 0)
-                    break;
-                  else
-                    --count;
-                }
-            }
-        }
-      else
-        {
-          ++line;
-          s2 = line;
-          while (*line != '\0' && *line != termin)
-            ++line;
-        }
-
-      if (*line == '\0')
-        return -1;
-
-      *(line++) = '\0';
-      NEXT_TOKEN (line);
-      if (*line != '\0')
-        EXTRATEXT ();
-
-      s2 = variable_expand (s2);
-      conditionals->ignoring[o] = (streq (s1, s2) == (cmdtype == c_ifneq));
-    }
-
- DONE:
-  /* Search through the stack to see if we're ignoring.  */
-  for (i = 0; i < conditionals->if_cmds; ++i)
-    if (conditionals->ignoring[i])
-      return 1;
-  return 0;
-}
-\f
-
-/* Record target-specific variable values for files FILENAMES.
-   TWO_COLON is nonzero if a double colon was used.
-
-   The links of FILENAMES are freed, and so are any names in it
-   that are not incorporated into other data structures.
-
-   If the target is a pattern, add the variable to the pattern-specific
-   variable value list.  */
-
-static void
-record_target_var (struct nameseq *filenames, char *defn,
-                   enum variable_origin origin, struct vmodifiers *vmod,
-                   const floc *flocp)
-{
-  struct nameseq *nextf;
-  struct variable_set_list *global;
-
-  global = current_variable_set_list;
-
-  /* If the variable is an append version, store that but treat it as a
-     normal recursive variable.  */
-
-  for (; filenames != 0; filenames = nextf)
-    {
-      struct variable *v;
-      const char *name = filenames->name;
-      const char *percent;
-      struct pattern_var *p;
-
-      nextf = filenames->next;
-      free_ns (filenames);
-
-      /* If it's a pattern target, then add it to the pattern-specific
-         variable list.  */
-      percent = find_percent_cached (&name);
-      if (percent)
-        {
-          /* Get a reference for this pattern-specific variable struct.  */
-          p = create_pattern_var (name, percent);
-          p->variable.fileinfo = *flocp;
-          /* I don't think this can fail since we already determined it was a
-             variable definition.  */
-          v = assign_variable_definition (&p->variable, defn);
-          assert (v != 0);
-
-          v->origin = origin;
-          if (v->flavor == f_simple)
-            v->value = allocated_variable_expand (v->value);
-          else
-            v->value = xstrdup (v->value);
-        }
-      else
-        {
-          struct file *f;
-
-          /* Get a file reference for this file, and initialize it.
-             We don't want to just call enter_file() because that allocates a
-             new entry if the file is a double-colon, which we don't want in
-             this situation.  */
-          f = lookup_file (name);
-          if (!f)
-            f = enter_file (strcache_add (name));
-          else if (f->double_colon)
-            f = f->double_colon;
-
-          initialize_file_variables (f, 1);
-
-          current_variable_set_list = f->variables;
-          v = try_variable_definition (flocp, defn, origin, 1);
-          if (!v)
-            O (fatal, flocp, _("Malformed target-specific variable definition"));
-          current_variable_set_list = global;
-        }
-
-      /* Set up the variable to be *-specific.  */
-      v->per_target = 1;
-      v->private_var = vmod->private_v;
-      v->export = vmod->export_v ? v_export : v_default;
-
-      /* If it's not an override, check to see if there was a command-line
-         setting.  If so, reset the value.  */
-      if (v->origin != o_override)
-        {
-          struct variable *gv;
-          int len = strlen (v->name);
-
-          gv = lookup_variable (v->name, len);
-          if (gv && v != gv
-              && (gv->origin == o_env_override || gv->origin == o_command))
-            {
-              free (v->value);
-              v->value = xstrdup (gv->value);
-              v->origin = gv->origin;
-              v->recursive = gv->recursive;
-              v->append = 0;
-            }
-        }
-    }
-}
-\f
-/* Record a description line for files FILENAMES,
-   with dependencies DEPS, commands to execute described
-   by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED.
-   TWO_COLON is nonzero if a double colon was used.
-   If not nil, PATTERN is the '%' pattern to make this
-   a static pattern rule, and PATTERN_PERCENT is a pointer
-   to the '%' within it.
-
-   The links of FILENAMES are freed, and so are any names in it
-   that are not incorporated into other data structures.  */
-
-static void
-record_files (struct nameseq *filenames, const char *pattern,
-              const char *pattern_percent, char *depstr,
-              unsigned int cmds_started, char *commands,
-              unsigned int commands_idx, int two_colon,
-              char prefix, const floc *flocp)
-{
-  struct commands *cmds;
-  struct dep *deps;
-  const char *implicit_percent;
-  const char *name;
-
-  /* If we've already snapped deps, that means we're in an eval being
-     resolved after the makefiles have been read in.  We can't add more rules
-     at this time, since they won't get snapped and we'll get core dumps.
-     See Savannah bug # 12124.  */
-  if (snapped_deps)
-    O (fatal, flocp, _("prerequisites cannot be defined in recipes"));
-
-  /* Determine if this is a pattern rule or not.  */
-  name = filenames->name;
-  implicit_percent = find_percent_cached (&name);
-
-  /* If there's a recipe, set up a struct for it.  */
-  if (commands_idx > 0)
-    {
-      cmds = xmalloc (sizeof (struct commands));
-      cmds->fileinfo.filenm = flocp->filenm;
-      cmds->fileinfo.lineno = cmds_started;
-      cmds->fileinfo.offset = 0;
-      cmds->commands = xstrndup (commands, commands_idx);
-      cmds->command_lines = 0;
-      cmds->recipe_prefix = prefix;
-    }
-  else
-     cmds = 0;
-
-  /* If there's a prereq string then parse it--unless it's eligible for 2nd
-     expansion: if so, snap_deps() will do it.  */
-  if (depstr == 0)
-    deps = 0;
-  else
-    {
-      depstr = unescape_char (depstr, ':');
-      if (second_expansion && strchr (depstr, '$'))
-        {
-          deps = alloc_dep ();
-          deps->name = depstr;
-          deps->need_2nd_expansion = 1;
-          deps->staticpattern = pattern != 0;
-        }
-      else
-        {
-          deps = split_prereqs (depstr);
-          free (depstr);
-
-          /* We'll enter static pattern prereqs later when we have the stem.
-             We don't want to enter pattern rules at all so that we don't
-             think that they ought to exist (make manual "Implicit Rule Search
-             Algorithm", item 5c).  */
-          if (! pattern && ! implicit_percent)
-            deps = enter_prereqs (deps, NULL);
-        }
-    }
-
-  /* For implicit rules, _all_ the targets must have a pattern.  That means we
-     can test the first one to see if we're working with an implicit rule; if
-     so we handle it specially. */
-
-  if (implicit_percent)
-    {
-      struct nameseq *nextf;
-      const char **targets, **target_pats;
-      unsigned int c;
-
-      if (pattern != 0)
-        O (fatal, flocp, _("mixed implicit and static pattern rules"));
-
-      /* Count the targets to create an array of target names.
-         We already have the first one.  */
-      nextf = filenames->next;
-      free_ns (filenames);
-      filenames = nextf;
-
-      for (c = 1; nextf; ++c, nextf = nextf->next)
-        ;
-      targets = xmalloc (c * sizeof (const char *));
-      target_pats = xmalloc (c * sizeof (const char *));
-
-      targets[0] = name;
-      target_pats[0] = implicit_percent;
-
-      c = 1;
-      while (filenames)
-        {
-          name = filenames->name;
-          implicit_percent = find_percent_cached (&name);
-
-          if (implicit_percent == 0)
-            O (fatal, flocp, _("mixed implicit and normal rules"));
-
-          targets[c] = name;
-          target_pats[c] = implicit_percent;
-          ++c;
-
-          nextf = filenames->next;
-          free_ns (filenames);
-          filenames = nextf;
-        }
-
-      create_pattern_rule (targets, target_pats, c, two_colon, deps, cmds, 1);
-
-      return;
-    }
-
-
-  /* Walk through each target and create it in the database.
-     We already set up the first target, above.  */
-  while (1)
-    {
-      struct nameseq *nextf = filenames->next;
-      struct file *f;
-      struct dep *this = 0;
-
-      free_ns (filenames);
-
-      /* Check for special targets.  Do it here instead of, say, snap_deps()
-         so that we can immediately use the value.  */
-      if (streq (name, ".POSIX"))
-        {
-          posix_pedantic = 1;
-          define_variable_cname (".SHELLFLAGS", "-ec", o_default, 0);
-          /* These default values are based on IEEE Std 1003.1-2008.  */
-          define_variable_cname ("ARFLAGS", "-rv", o_default, 0);
-          define_variable_cname ("CC", "c99", o_default, 0);
-          define_variable_cname ("CFLAGS", "-O", o_default, 0);
-          define_variable_cname ("FC", "fort77", o_default, 0);
-          define_variable_cname ("FFLAGS", "-O 1", o_default, 0);
-          define_variable_cname ("SCCSGETFLAGS", "-s", o_default, 0);
-        }
-      else if (streq (name, ".SECONDEXPANSION"))
-        second_expansion = 1;
-#if !defined (__MSDOS__) && !defined (__EMX__)
-      else if (streq (name, ".ONESHELL"))
-        one_shell = 1;
-#endif
-
-      /* If this is a static pattern rule:
-         'targets: target%pattern: prereq%pattern; recipe',
-         make sure the pattern matches this target name.  */
-      if (pattern && !pattern_matches (pattern, pattern_percent, name))
-        OS (error, flocp,
-            _("target '%s' doesn't match the target pattern"), name);
-      else if (deps)
-        /* If there are multiple targets, copy the chain DEPS for all but the
-           last one.  It is not safe for the same deps to go in more than one
-           place in the database.  */
-        this = nextf != 0 ? copy_dep_chain (deps) : deps;
-
-      /* Find or create an entry in the file database for this target.  */
-      if (!two_colon)
-        {
-          /* Single-colon.  Combine this rule with the file's existing record,
-             if any.  */
-          f = enter_file (strcache_add (name));
-          if (f->double_colon)
-            OS (fatal, flocp,
-                _("target file '%s' has both : and :: entries"), f->name);
-
-          /* If CMDS == F->CMDS, this target was listed in this rule
-             more than once.  Just give a warning since this is harmless.  */
-          if (cmds != 0 && cmds == f->cmds)
-            OS (error, flocp,
-                _("target '%s' given more than once in the same rule"),
-                f->name);
-
-          /* Check for two single-colon entries both with commands.
-             Check is_target so that we don't lose on files such as .c.o
-             whose commands were preinitialized.  */
-          else if (cmds != 0 && f->cmds != 0 && f->is_target)
-            {
-              size_t l = strlen (f->name);
-              error (&cmds->fileinfo, l,
-                     _("warning: overriding recipe for target '%s'"),
-                     f->name);
-              error (&f->cmds->fileinfo, l,
-                     _("warning: ignoring old recipe for target '%s'"),
-                     f->name);
-            }
-
-          /* Defining .DEFAULT with no deps or cmds clears it.  */
-          if (f == default_file && this == 0 && cmds == 0)
-            f->cmds = 0;
-          if (cmds != 0)
-            f->cmds = cmds;
-
-          /* Defining .SUFFIXES with no dependencies clears out the list of
-             suffixes.  */
-          if (f == suffix_file && this == 0)
-            {
-              free_dep_chain (f->deps);
-              f->deps = 0;
-            }
-        }
-      else
-        {
-          /* Double-colon.  Make a new record even if there already is one.  */
-          f = lookup_file (name);
-
-          /* Check for both : and :: rules.  Check is_target so we don't lose
-             on default suffix rules or makefiles.  */
-          if (f != 0 && f->is_target && !f->double_colon)
-            OS (fatal, flocp,
-                _("target file '%s' has both : and :: entries"), f->name);
-
-          f = enter_file (strcache_add (name));
-          /* If there was an existing entry and it was a double-colon entry,
-             enter_file will have returned a new one, making it the prev
-             pointer of the old one, and setting its double_colon pointer to
-             the first one.  */
-          if (f->double_colon == 0)
-            /* This is the first entry for this name, so we must set its
-               double_colon pointer to itself.  */
-            f->double_colon = f;
-
-          f->cmds = cmds;
-        }
-
-      f->is_target = 1;
-
-      /* If this is a static pattern rule, set the stem to the part of its
-         name that matched the '%' in the pattern, so you can use $* in the
-         commands.  If we didn't do it before, enter the prereqs now.  */
-      if (pattern)
-        {
-          static const char *percent = "%";
-          char *buffer = variable_expand ("");
-          char *o = patsubst_expand_pat (buffer, name, pattern, percent,
-                                         pattern_percent+1, percent+1);
-          f->stem = strcache_add_len (buffer, o - buffer);
-          if (this)
-            {
-              if (! this->need_2nd_expansion)
-                this = enter_prereqs (this, f->stem);
-              else
-                this->stem = f->stem;
-            }
-        }
-
-      /* Add the dependencies to this file entry.  */
-      if (this != 0)
-        {
-          /* Add the file's old deps and the new ones in THIS together.  */
-          if (f->deps == 0)
-            f->deps = this;
-          else if (cmds != 0)
-            {
-              struct dep *d = this;
-
-              /* If this rule has commands, put these deps first.  */
-              while (d->next != 0)
-                d = d->next;
-
-              d->next = f->deps;
-              f->deps = this;
-            }
-          else
-            {
-              struct dep *d = f->deps;
-
-              /* A rule without commands: put its prereqs at the end.  */
-              while (d->next != 0)
-                d = d->next;
-
-              d->next = this;
-            }
-        }
-
-      name = f->name;
-
-      /* All done!  Set up for the next one.  */
-      if (nextf == 0)
-        break;
-
-      filenames = nextf;
-
-      /* Reduce escaped percents.  If there are any unescaped it's an error  */
-      name = filenames->name;
-      if (find_percent_cached (&name))
-        O (error, flocp,
-           _("*** mixed implicit and normal rules: deprecated syntax"));
-    }
-}
-\f
-/* Search STRING for an unquoted STOPCHAR or blank (if BLANK is nonzero).
-   Backslashes quote STOPCHAR, blanks if BLANK is nonzero, and backslash.
-   Quoting backslashes are removed from STRING by compacting it into
-   itself.  Returns a pointer to the first unquoted STOPCHAR if there is
-   one, or nil if there are none.  STOPCHARs inside variable references are
-   ignored if IGNOREVARS is true.
-
-   STOPCHAR _cannot_ be '$' if IGNOREVARS is true.  */
-
-static char *
-find_char_unquote (char *string, int map)
-{
-  unsigned int string_len = 0;
-  char *p = string;
-
-  /* Always stop on NUL.  */
-  map |= MAP_NUL;
-
-  while (1)
-    {
-      while (! STOP_SET (*p, map))
-        ++p;
-
-      if (*p == '\0')
-        break;
-
-      /* If we stopped due to a variable reference, skip over its contents.  */
-      if (STOP_SET (*p, MAP_VARIABLE))
-        {
-          char openparen = p[1];
-
-          /* Check if '$' is the last character in the string.  */
-          if (openparen == '\0')
-            break;
-
-          p += 2;
-
-          /* Skip the contents of a non-quoted, multi-char variable ref.  */
-          if (openparen == '(' || openparen == '{')
-            {
-              unsigned int pcount = 1;
-              char closeparen = (openparen == '(' ? ')' : '}');
-
-              while (*p)
-                {
-                  if (*p == openparen)
-                    ++pcount;
-                  else if (*p == closeparen)
-                    if (--pcount == 0)
-                      {
-                        ++p;
-                        break;
-                      }
-                  ++p;
-                }
-            }
-
-          /* Skipped the variable reference: look for STOPCHARS again.  */
-          continue;
-        }
-
-      if (p > string && p[-1] == '\\')
-        {
-          /* Search for more backslashes.  */
-          int i = -2;
-          while (&p[i] >= string && p[i] == '\\')
-            --i;
-          ++i;
-          /* Only compute the length if really needed.  */
-          if (string_len == 0)
-            string_len = strlen (string);
-          /* The number of backslashes is now -I.
-             Copy P over itself to swallow half of them.  */
-          memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1);
-          p += i/2;
-          if (i % 2 == 0)
-            /* All the backslashes quoted each other; the STOPCHAR was
-               unquoted.  */
-            return p;
-
-          /* The STOPCHAR was quoted by a backslash.  Look for another.  */
-        }
-      else
-        /* No backslash in sight.  */
-        return p;
-    }
-
-  /* Never hit a STOPCHAR or blank (with BLANK nonzero).  */
-  return 0;
-}
-
-/* Unescape a character in a string.  The string is compressed onto itself.  */
-
-static char *
-unescape_char (char *string, int c)
-{
-  char *p = string;
-  char *s = string;
-
-  while (*s != '\0')
-    {
-      if (*s == '\\')
-        {
-          char *e = s;
-          int l;
-
-          /* We found a backslash.  See if it's escaping our character.  */
-          while (*e == '\\')
-            ++e;
-          l = e - s;
-
-          if (*e != c || l%2 == 0)
-            {
-              /* It's not; just take it all without unescaping.  */
-              memmove (p, s, l);
-              p += l;
-
-              // If we hit the end of the string, we're done
-              if (*e == '\0')
-                break;
-            }
-          else if (l > 1)
-            {
-              /* It is, and there's >1 backslash.  Take half of them.  */
-              l /= 2;
-              memmove (p, s, l);
-              p += l;
-            }
-
-          s = e;
-        }
-
-      *(p++) = *(s++);
-    }
-
-  *p = '\0';
-  return string;
-}
-
-/* Search PATTERN for an unquoted % and handle quoting.  */
-
-char *
-find_percent (char *pattern)
-{
-  return find_char_unquote (pattern, MAP_PERCENT);
-}
-
-/* Search STRING for an unquoted % and handle quoting.  Returns a pointer to
-   the % or NULL if no % was found.
-   This version is used with strings in the string cache: if there's a need to
-   modify the string a new version will be added to the string cache and
-   *STRING will be set to that.  */
-
-const char *
-find_percent_cached (const char **string)
-{
-  const char *p = *string;
-  char *new = 0;
-  int slen = 0;
-
-  /* If the first char is a % return now.  This lets us avoid extra tests
-     inside the loop.  */
-  if (*p == '%')
-    return p;
-
-  while (1)
-    {
-      while (! STOP_SET (*p, MAP_PERCENT|MAP_NUL))
-        ++p;
-
-      if (*p == '\0')
-        break;
-
-      /* See if this % is escaped with a backslash; if not we're done.  */
-      if (p[-1] != '\\')
-        break;
-
-      {
-        /* Search for more backslashes.  */
-        char *pv;
-        int i = -2;
-
-        while (&p[i] >= *string && p[i] == '\\')
-          --i;
-        ++i;
-
-        /* At this point we know we'll need to allocate a new string.
-           Make a copy if we haven't yet done so.  */
-        if (! new)
-          {
-            slen = strlen (*string);
-            new = alloca (slen + 1);
-            memcpy (new, *string, slen + 1);
-            p = new + (p - *string);
-            *string = new;
-          }
-
-        /* At this point *string, p, and new all point into the same string.
-           Get a non-const version of p so we can modify new.  */
-        pv = new + (p - *string);
-
-        /* The number of backslashes is now -I.
-           Copy P over itself to swallow half of them.  */
-        memmove (&pv[i], &pv[i/2], (slen - (pv - new)) - (i/2) + 1);
-        p += i/2;
-
-        /* If the backslashes quoted each other; the % was unquoted.  */
-        if (i % 2 == 0)
-          break;
-      }
-    }
-
-  /* If we had to change STRING, add it to the strcache.  */
-  if (new)
-    {
-      *string = strcache_add (*string);
-      p = *string + (p - new);
-    }
-
-  /* If we didn't find a %, return NULL.  Otherwise return a ptr to it.  */
-  return (*p == '\0') ? NULL : p;
-}
-\f
-/* Find the next line of text in an eval buffer, combining continuation lines
-   into one line.
-   Return the number of actual lines read (> 1 if continuation lines).
-   Returns -1 if there's nothing left in the buffer.
-
-   After this function, ebuf->buffer points to the first character of the
-   line we just found.
- */
-
-/* Read a line of text from a STRING.
-   Since we aren't really reading from a file, don't bother with linenumbers.
- */
-
-static long
-readstring (struct ebuffer *ebuf)
-{
-  char *eol;
-
-  /* If there is nothing left in this buffer, return 0.  */
-  if (ebuf->bufnext >= ebuf->bufstart + ebuf->size)
-    return -1;
-
-  /* Set up a new starting point for the buffer, and find the end of the
-     next logical line (taking into account backslash/newline pairs).  */
-
-  eol = ebuf->buffer = ebuf->bufnext;
-
-  while (1)
-    {
-      int backslash = 0;
-      const char *bol = eol;
-      const char *p;
-
-      /* Find the next newline.  At EOS, stop.  */
-      p = eol = strchr (eol , '\n');
-      if (!eol)
-        {
-          ebuf->bufnext = ebuf->bufstart + ebuf->size + 1;
-          return 0;
-        }
-
-      /* Found a newline; if it's escaped continue; else we're done.  */
-      while (p > bol && *(--p) == '\\')
-        backslash = !backslash;
-      if (!backslash)
-        break;
-      ++eol;
-    }
-
-  /* Overwrite the newline char.  */
-  *eol = '\0';
-  ebuf->bufnext = eol+1;
-
-  return 0;
-}
-
-static long
-readline (struct ebuffer *ebuf)
-{
-  char *p;
-  char *end;
-  char *start;
-  long nlines = 0;
-
-  /* The behaviors between string and stream buffers are different enough to
-     warrant different functions.  Do the Right Thing.  */
-
-  if (!ebuf->fp)
-    return readstring (ebuf);
-
-  /* When reading from a file, we always start over at the beginning of the
-     buffer for each new line.  */
-
-  p = start = ebuf->bufstart;
-  end = p + ebuf->size;
-  *p = '\0';
-
-  while (fgets (p, end - p, ebuf->fp) != 0)
-    {
-      char *p2;
-      unsigned long len;
-      int backslash;
-
-      len = strlen (p);
-      if (len == 0)
-        {
-          /* This only happens when the first thing on the line is a '\0'.
-             It is a pretty hopeless case, but (wonder of wonders) Athena
-             lossage strikes again!  (xmkmf puts NULs in its makefiles.)
-             There is nothing really to be done; we synthesize a newline so
-             the following line doesn't appear to be part of this line.  */
-          O (error, &ebuf->floc,
-             _("warning: NUL character seen; rest of line ignored"));
-          p[0] = '\n';
-          len = 1;
-        }
-
-      /* Jump past the text we just read.  */
-      p += len;
-
-      /* If the last char isn't a newline, the whole line didn't fit into the
-         buffer.  Get some more buffer and try again.  */
-      if (p[-1] != '\n')
-        goto more_buffer;
-
-      /* We got a newline, so add one to the count of lines.  */
-      ++nlines;
-
-#if !defined(WINDOWS32) && !defined(__MSDOS__) && !defined(__EMX__)
-      /* Check to see if the line was really ended with CRLF; if so ignore
-         the CR.  */
-      if ((p - start) > 1 && p[-2] == '\r')
-        {
-          --p;
-          memmove (p-1, p, strlen (p) + 1);
-        }
-#endif
-
-      backslash = 0;
-      for (p2 = p - 2; p2 >= start; --p2)
-        {
-          if (*p2 != '\\')
-            break;
-          backslash = !backslash;
-        }
-
-      if (!backslash)
-        {
-          p[-1] = '\0';
-          break;
-        }
-
-      /* It was a backslash/newline combo.  If we have more space, read
-         another line.  */
-      if (end - p >= 80)
-        continue;
-
-      /* We need more space at the end of our buffer, so realloc it.
-         Make sure to preserve the current offset of p.  */
-    more_buffer:
-      {
-        unsigned long off = p - start;
-        ebuf->size *= 2;
-        start = ebuf->buffer = ebuf->bufstart = xrealloc (start, ebuf->size);
-        p = start + off;
-        end = start + ebuf->size;
-        *p = '\0';
-      }
-    }
-
-  if (ferror (ebuf->fp))
-    pfatal_with_name (ebuf->floc.filenm);
-
-  /* If we found some lines, return how many.
-     If we didn't, but we did find _something_, that indicates we read the last
-     line of a file with no final newline; return 1.
-     If we read nothing, we're at EOF; return -1.  */
-
-  return nlines ? nlines : p == ebuf->bufstart ? -1 : 1;
-}
-\f
-/* Parse the next "makefile word" from the input buffer, and return info
-   about it.
-
-   A "makefile word" is one of:
-
-     w_bogus        Should never happen
-     w_eol          End of input
-     w_static       A static word; cannot be expanded
-     w_variable     A word containing one or more variables/functions
-     w_colon        A colon
-     w_dcolon       A double-colon
-     w_semicolon    A semicolon
-     w_varassign    A variable assignment operator (=, :=, ::=, +=, ?=, or !=)
-
-   Note that this function is only used when reading certain parts of the
-   makefile.  Don't use it where special rules hold sway (RHS of a variable,
-   in a command list, etc.)  */
-
-static enum make_word_type
-get_next_mword (char *buffer, char *delim, char **startp, unsigned int *length)
-{
-  enum make_word_type wtype = w_bogus;
-  char *p = buffer, *beg;
-  char c;
-
-  /* Skip any leading whitespace.  */
-  while (ISBLANK (*p))
-    ++p;
-
-  beg = p;
-  c = *(p++);
-  switch (c)
-    {
-    case '\0':
-      wtype = w_eol;
-      break;
-
-    case ';':
-      wtype = w_semicolon;
-      break;
-
-    case '=':
-      wtype = w_varassign;
-      break;
-
-    case ':':
-      wtype = w_colon;
-      switch (*p)
-        {
-        case ':':
-          ++p;
-          if (p[1] != '=')
-            wtype = w_dcolon;
-          else
-            {
-              wtype = w_varassign;
-              ++p;
-            }
-          break;
-
-        case '=':
-          ++p;
-          wtype = w_varassign;
-          break;
-        }
-      break;
-
-    case '+':
-    case '?':
-    case '!':
-      if (*p == '=')
-        {
-          ++p;
-          wtype = w_varassign;
-          break;
-        }
-
-    default:
-      if (delim && strchr (delim, c))
-        wtype = w_static;
-      break;
-    }
-
-  /* Did we find something?  If so, return now.  */
-  if (wtype != w_bogus)
-    goto done;
-
-  /* This is some non-operator word.  A word consists of the longest
-     string of characters that doesn't contain whitespace, one of [:=#],
-     or [?+!]=, or one of the chars in the DELIM string.  */
-
-  /* We start out assuming a static word; if we see a variable we'll
-     adjust our assumptions then.  */
-  wtype = w_static;
-
-  /* We already found the first value of "c", above.  */
-  while (1)
-    {
-      char closeparen;
-      int count;
-
-      switch (c)
-        {
-        case '\0':
-        case ' ':
-        case '\t':
-        case '=':
-          goto done_word;
-
-        case ':':
-#ifdef HAVE_DOS_PATHS
-          /* A word CAN include a colon in its drive spec.  The drive
-             spec is allowed either at the beginning of a word, or as part
-             of the archive member name, like in "libfoo.a(d:/foo/bar.o)".  */
-          if (!(p - beg >= 2
-                && (*p == '/' || *p == '\\') && isalpha ((unsigned char)p[-2])
-                && (p - beg == 2 || p[-3] == '(')))
-#endif
-          goto done_word;
-
-        case '$':
-          c = *(p++);
-          if (c == '$')
-            break;
-          if (c == '\0')
-            goto done_word;
-
-          /* This is a variable reference, so note that it's expandable.
-             Then read it to the matching close paren.  */
-          wtype = w_variable;
-
-          if (c == '(')
-            closeparen = ')';
-          else if (c == '{')
-            closeparen = '}';
-          else
-            /* This is a single-letter variable reference.  */
-            break;
-
-          for (count=0; *p != '\0'; ++p)
-            {
-              if (*p == c)
-                ++count;
-              else if (*p == closeparen && --count < 0)
-                {
-                  ++p;
-                  break;
-                }
-            }
-          break;
-
-        case '?':
-        case '+':
-          if (*p == '=')
-            goto done_word;
-          break;
-
-        case '\\':
-          switch (*p)
-            {
-            case ':':
-            case ';':
-            case '=':
-            case '\\':
-              ++p;
-              break;
-            }
-          break;
-
-        default:
-          if (delim && strchr (delim, c))
-            goto done_word;
-          break;
-        }
-
-      c = *(p++);
-    }
- done_word:
-  --p;
-
- done:
-  if (startp)
-    *startp = beg;
-  if (length)
-    *length = p - beg;
-  return wtype;
-}
-\f
-/* Construct the list of include directories
-   from the arguments and the default list.  */
-
-void
-construct_include_path (const char **arg_dirs)
-{
-#ifdef VAXC             /* just don't ask ... */
-  stat_t stbuf;
-#else
-  struct stat stbuf;
-#endif
-  const char **dirs;
-  const char **cpp;
-  unsigned int idx;
-
-  /* Compute the number of pointers we need in the table.  */
-  idx = sizeof (default_include_directories) / sizeof (const char *);
-  if (arg_dirs)
-    for (cpp = arg_dirs; *cpp != 0; ++cpp)
-      ++idx;
-
-#ifdef  __MSDOS__
-  /* Add one for $DJDIR.  */
-  ++idx;
-#endif
-
-  dirs = xmalloc (idx * sizeof (const char *));
-
-  idx = 0;
-  max_incl_len = 0;
-
-  /* First consider any dirs specified with -I switches.
-     Ignore any that don't exist.  Remember the maximum string length.  */
-
-  if (arg_dirs)
-    while (*arg_dirs != 0)
-      {
-        const char *dir = *(arg_dirs++);
-        char *expanded = 0;
-        int e;
-
-        if (dir[0] == '~')
-          {
-            expanded = tilde_expand (dir);
-            if (expanded != 0)
-              dir = expanded;
-          }
-
-        EINTRLOOP (e, stat (dir, &stbuf));
-        if (e == 0 && S_ISDIR (stbuf.st_mode))
-          {
-            unsigned int len = strlen (dir);
-            /* If dir name is written with trailing slashes, discard them.  */
-            while (len > 1 && dir[len - 1] == '/')
-              --len;
-            if (len > max_incl_len)
-              max_incl_len = len;
-            dirs[idx++] = strcache_add_len (dir, len);
-          }
-
-        free (expanded);
-      }
-
-  /* Now add the standard default dirs at the end.  */
-
-#ifdef  __MSDOS__
-  {
-    /* The environment variable $DJDIR holds the root of the DJGPP directory
-       tree; add ${DJDIR}/include.  */
-    struct variable *djdir = lookup_variable ("DJDIR", 5);
-
-    if (djdir)
-      {
-        unsigned int len = strlen (djdir->value) + 8;
-        char *defdir = alloca (len + 1);
-
-        strcat (strcpy (defdir, djdir->value), "/include");
-        dirs[idx++] = strcache_add (defdir);
-
-        if (len > max_incl_len)
-          max_incl_len = len;
-      }
-  }
-#endif
-
-  for (cpp = default_include_directories; *cpp != 0; ++cpp)
-    {
-      int e;
-
-      EINTRLOOP (e, stat (*cpp, &stbuf));
-      if (e == 0 && S_ISDIR (stbuf.st_mode))
-        {
-          unsigned int len = strlen (*cpp);
-          /* If dir name is written with trailing slashes, discard them.  */
-          while (len > 1 && (*cpp)[len - 1] == '/')
-            --len;
-          if (len > max_incl_len)
-            max_incl_len = len;
-          dirs[idx++] = strcache_add_len (*cpp, len);
-        }
-    }
-
-  dirs[idx] = 0;
-
-  /* Now add each dir to the .INCLUDE_DIRS variable.  */
-
-  for (cpp = dirs; *cpp != 0; ++cpp)
-    do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp,
-                            o_default, f_append, 0);
-
-  include_directories = dirs;
-}
-\f
-/* Expand ~ or ~USER at the beginning of NAME.
-   Return a newly malloc'd string or 0.  */
-
-char *
-tilde_expand (const char *name)
-{
-#ifndef VMS
-  if (name[1] == '/' || name[1] == '\0')
-    {
-      char *home_dir;
-      int is_variable;
-
-      {
-        /* Turn off --warn-undefined-variables while we expand HOME.  */
-        int save = warn_undefined_variables_flag;
-        warn_undefined_variables_flag = 0;
-
-        home_dir = allocated_variable_expand ("$(HOME)");
-
-        warn_undefined_variables_flag = save;
-      }
-
-      is_variable = home_dir[0] != '\0';
-      if (!is_variable)
-        {
-          free (home_dir);
-          home_dir = getenv ("HOME");
-        }
-# if !defined(_AMIGA) && !defined(WINDOWS32)
-      if (home_dir == 0 || home_dir[0] == '\0')
-        {
-          char *logname = getlogin ();
-          home_dir = 0;
-          if (logname != 0)
-            {
-              struct passwd *p = getpwnam (logname);
-              if (p != 0)
-                home_dir = p->pw_dir;
-            }
-        }
-# endif /* !AMIGA && !WINDOWS32 */
-      if (home_dir != 0)
-        {
-          char *new = xstrdup (concat (2, home_dir, name + 1));
-          if (is_variable)
-            free (home_dir);
-          return new;
-        }
-    }
-# if !defined(_AMIGA) && !defined(WINDOWS32)
-  else
-    {
-      struct passwd *pwent;
-      char *userend = strchr (name + 1, '/');
-      if (userend != 0)
-        *userend = '\0';
-      pwent = getpwnam (name + 1);
-      if (pwent != 0)
-        {
-          if (userend == 0)
-            return xstrdup (pwent->pw_dir);
-          else
-            return xstrdup (concat (3, pwent->pw_dir, "/", userend + 1));
-        }
-      else if (userend != 0)
-        *userend = '/';
-    }
-# endif /* !AMIGA && !WINDOWS32 */
-#endif /* !VMS */
-  return 0;
-}
-\f
-/* Parse a string into a sequence of filenames represented as a chain of
-   struct nameseq's and return that chain.  Optionally expand the strings via
-   glob().
-
-   The string is passed as STRINGP, the address of a string pointer.
-   The string pointer is updated to point at the first character
-   not parsed, which either is a null char or equals STOPCHAR.
-
-   SIZE is how big to construct chain elements.
-   This is useful if we want them actually to be other structures
-   that have room for additional info.
-
-   PREFIX, if non-null, is added to the beginning of each filename.
-
-   FLAGS allows one or more of the following bitflags to be set:
-        PARSEFS_NOSTRIP - Do no strip './'s off the beginning
-        PARSEFS_NOAR    - Do not check filenames for archive references
-        PARSEFS_NOGLOB  - Do not expand globbing characters
-        PARSEFS_EXISTS  - Only return globbed files that actually exist
-                          (cannot also set NOGLOB)
-        PARSEFS_NOCACHE - Do not add filenames to the strcache (caller frees)
-  */
-
-void *
-parse_file_seq (char **stringp, unsigned int size, int stopmap,
-                const char *prefix, int flags)
-{
-  /* tmp points to tmpbuf after the prefix, if any.
-     tp is the end of the buffer. */
-  static char *tmpbuf = NULL;
-
-  int cachep = NONE_SET (flags, PARSEFS_NOCACHE);
-
-  struct nameseq *new = 0;
-  struct nameseq **newp = &new;
-#define NEWELT(_n)  do { \
-                        const char *__n = (_n); \
-                        *newp = xcalloc (size); \
-                        (*newp)->name = (cachep ? strcache_add (__n) : xstrdup (__n)); \
-                        newp = &(*newp)->next; \
-                    } while(0)
-
-  char *p;
-  glob_t gl;
-  char *tp;
-
-  /* Always stop on NUL.  */
-  stopmap |= MAP_NUL;
-
-  if (size < sizeof (struct nameseq))
-    size = sizeof (struct nameseq);
-
-  if (NONE_SET (flags, PARSEFS_NOGLOB))
-    dir_setup_glob (&gl);
-
-  /* Get enough temporary space to construct the largest possible target.  */
-  {
-    static int tmpbuf_len = 0;
-    int l = strlen (*stringp) + 1;
-    if (l > tmpbuf_len)
-      {
-        tmpbuf = xrealloc (tmpbuf, l);
-        tmpbuf_len = l;
-      }
-  }
-  tp = tmpbuf;
-
-  /* Parse STRING.  P will always point to the end of the parsed content.  */
-  p = *stringp;
-  while (1)
-    {
-      const char *name;
-      const char **nlist = 0;
-      char *tildep = 0;
-      int globme = 1;
-#ifndef NO_ARCHIVES
-      char *arname = 0;
-      char *memname = 0;
-#endif
-      char *s;
-      int nlen;
-      int i;
-
-      /* Skip whitespace; at the end of the string or STOPCHAR we're done.  */
-      NEXT_TOKEN (p);
-      if (STOP_SET (*p, stopmap))
-        break;
-
-      /* There are names left, so find the end of the next name.
-         Throughout this iteration S points to the start.  */
-      s = p;
-      p = find_char_unquote (p, stopmap|MAP_VMSCOMMA|MAP_BLANK);
-#ifdef VMS
-        /* convert comma separated list to space separated */
-      if (p && *p == ',')
-        *p =' ';
-#endif
-#ifdef _AMIGA
-      if (p && STOP_SET (*p, stopmap & MAP_COLON)
-          && !(ISSPACE (p[1]) || !p[1] || ISSPACE (p[-1])))
-        p = find_char_unquote (p+1, stopmap|MAP_VMSCOMMA|MAP_BLANK);
-#endif
-#ifdef HAVE_DOS_PATHS
-    /* For DOS paths, skip a "C:\..." or a "C:/..." until we find the
-       first colon which isn't followed by a slash or a backslash.
-       Note that tokens separated by spaces should be treated as separate
-       tokens since make doesn't allow path names with spaces */
-    if (stopmap | MAP_COLON)
-      while (p != 0 && !ISSPACE (*p) &&
-             (p[1] == '\\' || p[1] == '/') && isalpha ((unsigned char)p[-1]))
-        p = find_char_unquote (p + 1, stopmap|MAP_VMSCOMMA|MAP_BLANK);
-#endif
-      if (p == 0)
-        p = s + strlen (s);
-
-      /* Strip leading "this directory" references.  */
-      if (NONE_SET (flags, PARSEFS_NOSTRIP))
-#ifdef VMS
-        /* Skip leading '[]'s. should only be one set or bug somwhere else */
-        if (p - s > 2 && s[0] == '[' && s[1] == ']')
-            s += 2;
-        /* Skip leading '<>'s. should only be one set or bug somwhere else */
-        if (p - s > 2 && s[0] == '<' && s[1] == '>')
-            s += 2;
-#endif
-        /* Skip leading './'s.  */
-        while (p - s > 2 && s[0] == '.' && s[1] == '/')
-          {
-            /* Skip "./" and all following slashes.  */
-            s += 2;
-            while (*s == '/')
-              ++s;
-          }
-
-      /* Extract the filename just found, and skip it.
-         Set NAME to the string, and NLEN to its length.  */
-
-      if (s == p)
-        {
-        /* The name was stripped to empty ("./"). */
-#if defined(_AMIGA)
-          /* PDS-- This cannot be right!! */
-          tp[0] = '\0';
-          nlen = 0;
-#else
-          tp[0] = '.';
-          tp[1] = '/';
-          tp[2] = '\0';
-          nlen = 2;
-#endif
-        }
-      else
-        {
-#ifdef VMS
-/* VMS filenames can have a ':' in them but they have to be '\'ed but we need
- *  to remove this '\' before we can use the filename.
- * xstrdup called because S may be read-only string constant.
- */
-          char *n = tp;
-          while (s < p)
-            {
-              if (s[0] == '\\' && s[1] == ':')
-                ++s;
-              *(n++) = *(s++);
-            }
-          n[0] = '\0';
-          nlen = strlen (tp);
-#else
-          nlen = p - s;
-          memcpy (tp, s, nlen);
-          tp[nlen] = '\0';
-#endif
-        }
-
-      /* At this point, TP points to the element and NLEN is its length.  */
-
-#ifndef NO_ARCHIVES
-      /* If this is the start of an archive group that isn't complete, set up
-         to add the archive prefix for future files.  A file list like:
-         "libf.a(x.o y.o z.o)" needs to be expanded as:
-         "libf.a(x.o) libf.a(y.o) libf.a(z.o)"
-
-         TP == TMP means we're not already in an archive group.  Ignore
-         something starting with '(', as that cannot actually be an
-         archive-member reference (and treating it as such results in an empty
-         file name, which causes much lossage).  Also if it ends in ")" then
-         it's a complete reference so we don't need to treat it specially.
-
-         Finally, note that archive groups must end with ')' as the last
-         character, so ensure there's some word ending like that before
-         considering this an archive group.  */
-      if (NONE_SET (flags, PARSEFS_NOAR)
-          && tp == tmpbuf && tp[0] != '(' && tp[nlen-1] != ')')
-        {
-          char *n = strchr (tp, '(');
-          if (n)
-            {
-              /* This looks like the first element in an open archive group.
-                 A valid group MUST have ')' as the last character.  */
-              const char *e = p;
-              do
-                {
-                  const char *o = e;
-                  NEXT_TOKEN (e);
-                  /* Find the end of this word.  We don't want to unquote and
-                     we don't care about quoting since we're looking for the
-                     last char in the word. */
-                  while (! STOP_SET (*e, stopmap|MAP_BLANK|MAP_VMSCOMMA))
-                    ++e;
-                  /* If we didn't move, we're done now.  */
-                  if (e == o)
-                    break;
-                  if (e[-1] == ')')
-                    {
-                      /* Found the end, so this is the first element in an
-                         open archive group.  It looks like "lib(mem".
-                         Reset TP past the open paren.  */
-                      nlen -= (n + 1) - tp;
-                      tp = n + 1;
-
-                      /* We can stop looking now.  */
-                      break;
-                    }
-                }
-              while (*e != '\0');
-
-              /* If we have just "lib(", part of something like "lib( a b)",
-                 go to the next item.  */
-              if (! nlen)
-                continue;
-            }
-        }
-
-      /* If we are inside an archive group, make sure it has an end.  */
-      if (tp > tmpbuf)
-        {
-          if (tp[nlen-1] == ')')
-            {
-              /* This is the natural end; reset TP.  */
-              tp = tmpbuf;
-
-              /* This is just ")", something like "lib(a b )": skip it.  */
-              if (nlen == 1)
-                continue;
-            }
-          else
-            {
-              /* Not the end, so add a "fake" end.  */
-              tp[nlen++] = ')';
-              tp[nlen] = '\0';
-            }
-        }
-#endif
-
-      /* If we're not globbing we're done: add it to the end of the chain.
-         Go to the next item in the string.  */
-      if (ANY_SET (flags, PARSEFS_NOGLOB))
-        {
-          NEWELT (concat (2, prefix, tmpbuf));
-          continue;
-        }
-
-      /* If we get here we know we're doing glob expansion.
-         TP is a string in tmpbuf.  NLEN is no longer used.
-         We may need to do more work: after this NAME will be set.  */
-      name = tmpbuf;
-
-      /* Expand tilde if applicable.  */
-      if (tmpbuf[0] == '~')
-        {
-          tildep = tilde_expand (tmpbuf);
-          if (tildep != 0)
-            name = tildep;
-        }
-
-#ifndef NO_ARCHIVES
-      /* If NAME is an archive member reference replace it with the archive
-         file name, and save the member name in MEMNAME.  We will glob on the
-         archive name and then reattach MEMNAME later.  */
-      if (NONE_SET (flags, PARSEFS_NOAR) && ar_name (name))
-        {
-          ar_parse_name (name, &arname, &memname);
-          name = arname;
-        }
-#endif /* !NO_ARCHIVES */
-
-      /* glob() is expensive: don't call it unless we need to.  */
-      if (NONE_SET (flags, PARSEFS_EXISTS) && strpbrk (name, "?*[") == NULL)
-        {
-          globme = 0;
-          i = 1;
-          nlist = &name;
-        }
-      else
-        switch (glob (name, GLOB_NOSORT|GLOB_ALTDIRFUNC, NULL, &gl))
-          {
-          case GLOB_NOSPACE:
-            OUT_OF_MEM();
-
-          case 0:
-            /* Success.  */
-            i = gl.gl_pathc;
-            nlist = (const char **)gl.gl_pathv;
-            break;
-
-          case GLOB_NOMATCH:
-            /* If we want only existing items, skip this one.  */
-            if (ANY_SET (flags, PARSEFS_EXISTS))
-              {
-                i = 0;
-                break;
-              }
-            /* FALLTHROUGH */
-
-          default:
-            /* By default keep this name.  */
-            i = 1;
-            nlist = &name;
-            break;
-          }
-
-      /* For each matched element, add it to the list.  */
-      while (i-- > 0)
-#ifndef NO_ARCHIVES
-        if (memname != 0)
-          {
-            /* Try to glob on MEMNAME within the archive.  */
-            struct nameseq *found = ar_glob (nlist[i], memname, size);
-            if (! found)
-              /* No matches.  Use MEMNAME as-is.  */
-              NEWELT (concat (5, prefix, nlist[i], "(", memname, ")"));
-            else
-              {
-                /* We got a chain of items.  Attach them.  */
-                if (*newp)
-                  (*newp)->next = found;
-                else
-                  *newp = found;
-
-                /* Find and set the new end.  Massage names if necessary.  */
-                while (1)
-                  {
-                    if (! cachep)
-                      found->name = xstrdup (concat (2, prefix, name));
-                    else if (prefix)
-                      found->name = strcache_add (concat (2, prefix, name));
-
-                    if (found->next == 0)
-                      break;
-
-                    found = found->next;
-                  }
-                newp = &found->next;
-              }
-          }
-        else
-#endif /* !NO_ARCHIVES */
-          NEWELT (concat (2, prefix, nlist[i]));
-
-      if (globme)
-        globfree (&gl);
-
-#ifndef NO_ARCHIVES
-      free (arname);
-#endif
-
-      free (tildep);
-    }
-
-  *stringp = p;
-  return new;
-}
diff --git a/remake.c b/remake.c
deleted file mode 100644 (file)
index 5d5d67a..0000000
--- a/remake.c
+++ /dev/null
@@ -1,1740 +0,0 @@
-/* Basic dependency engine for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "job.h"
-#include "commands.h"
-#include "dep.h"
-#include "variable.h"
-#include "debug.h"
-
-#include <assert.h>
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#else
-#include <sys/file.h>
-#endif
-
-#ifdef VMS
-#include <starlet.h>
-#endif
-#ifdef WINDOWS32
-#include <io.h>
-#endif
-
-
-/* The test for circular dependencies is based on the 'updating' bit in
-   'struct file'.  However, double colon targets have separate 'struct
-   file's; make sure we always use the base of the double colon chain. */
-
-#define start_updating(_f)  (((_f)->double_colon ? (_f)->double_colon : (_f))\
-                             ->updating = 1)
-#define finish_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\
-                             ->updating = 0)
-#define is_updating(_f)     (((_f)->double_colon ? (_f)->double_colon : (_f))\
-                             ->updating)
-
-
-/* Incremented when a command is started (under -n, when one would be).  */
-unsigned int commands_started = 0;
-
-/* Set to the goal dependency.  Mostly needed for remaking makefiles.  */
-static struct goaldep *goal_list;
-static struct dep *goal_dep;
-
-/* Current value for pruning the scan of the goal chain.
-   All files start with considered == 0.  */
-static unsigned int considered = 0;
-
-static enum update_status update_file (struct file *file, unsigned int depth);
-static enum update_status update_file_1 (struct file *file, unsigned int depth);
-static enum update_status check_dep (struct file *file, unsigned int depth,
-                                     FILE_TIMESTAMP this_mtime, int *must_make);
-static enum update_status touch_file (struct file *file);
-static void remake_file (struct file *file);
-static FILE_TIMESTAMP name_mtime (const char *name);
-static const char *library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr);
-
-\f
-/* Remake all the goals in the 'struct dep' chain GOALS.  Return -1 if nothing
-   was done, 0 if all goals were updated successfully, or 1 if a goal failed.
-
-   If rebuilding_makefiles is nonzero, these goals are makefiles, so -t, -q,
-   and -n should be disabled for them unless they were also command-line
-   targets, and we should only make one goal at a time and return as soon as
-   one goal whose 'changed' member is nonzero is successfully made.  */
-
-enum update_status
-update_goal_chain (struct goaldep *goaldeps)
-{
-  int t = touch_flag, q = question_flag, n = just_print_flag;
-  enum update_status status = us_none;
-
-  /* Duplicate the chain so we can remove things from it.  */
-
-  struct dep *goals = copy_dep_chain ((struct dep *)goaldeps);
-
-  goal_list = rebuilding_makefiles ? goaldeps : NULL;
-
-#define MTIME(file) (rebuilding_makefiles ? file_mtime_no_search (file) \
-                     : file_mtime (file))
-
-  /* Start a fresh batch of consideration.  */
-  ++considered;
-
-  /* Update all the goals until they are all finished.  */
-
-  while (goals != 0)
-    {
-      register struct dep *g, *lastgoal;
-
-      /* Start jobs that are waiting for the load to go down.  */
-
-      start_waiting_jobs ();
-
-      /* Wait for a child to die.  */
-
-      reap_children (1, 0);
-
-      lastgoal = 0;
-      g = goals;
-      while (g != 0)
-        {
-          /* Iterate over all double-colon entries for this file.  */
-          struct file *file;
-          int stop = 0, any_not_updated = 0;
-
-          goal_dep = g;
-
-          for (file = g->file->double_colon ? g->file->double_colon : g->file;
-               file != NULL;
-               file = file->prev)
-            {
-              unsigned int ocommands_started;
-              enum update_status fail;
-
-              file->dontcare = ANY_SET (g->flags, RM_DONTCARE);
-
-              check_renamed (file);
-              if (rebuilding_makefiles)
-                {
-                  if (file->cmd_target)
-                    {
-                      touch_flag = t;
-                      question_flag = q;
-                      just_print_flag = n;
-                    }
-                  else
-                    touch_flag = question_flag = just_print_flag = 0;
-                }
-
-              /* Save the old value of 'commands_started' so we can compare
-                 later.  It will be incremented when any commands are
-                 actually run.  */
-              ocommands_started = commands_started;
-
-              fail = update_file (file, rebuilding_makefiles ? 1 : 0);
-              check_renamed (file);
-
-              /* Set the goal's 'changed' flag if any commands were started
-                 by calling update_file above.  We check this flag below to
-                 decide when to give an "up to date" diagnostic.  */
-              if (commands_started > ocommands_started)
-                g->changed = 1;
-
-              stop = 0;
-              if ((fail || file->updated) && status < us_question)
-                {
-                  /* We updated this goal.  Update STATUS and decide whether
-                     to stop.  */
-                  if (file->update_status)
-                    {
-                      /* Updating failed, or -q triggered.  The STATUS value
-                         tells our caller which.  */
-                      status = file->update_status;
-                      /* If -q just triggered, stop immediately.  It doesn't
-                         matter how much more we run, since we already know
-                         the answer to return.  */
-                      stop = (question_flag && !keep_going_flag
-                              && !rebuilding_makefiles);
-                    }
-                  else
-                    {
-                      FILE_TIMESTAMP mtime = MTIME (file);
-                      check_renamed (file);
-
-                      if (file->updated && g->changed &&
-                           mtime != file->mtime_before_update)
-                        {
-                          /* Updating was done.  If this is a makefile and
-                             just_print_flag or question_flag is set (meaning
-                             -n or -q was given and this file was specified
-                             as a command-line target), don't change STATUS.
-                             If STATUS is changed, we will get re-exec'd, and
-                             enter an infinite loop.  */
-                          if (!rebuilding_makefiles
-                              || (!just_print_flag && !question_flag))
-                            status = us_success;
-                          if (rebuilding_makefiles && file->dontcare)
-                            /* This is a default makefile; stop remaking.  */
-                            stop = 1;
-                        }
-                    }
-                }
-
-              /* Keep track if any double-colon entry is not finished.
-                 When they are all finished, the goal is finished.  */
-              any_not_updated |= !file->updated;
-
-              file->dontcare = 0;
-
-              if (stop)
-                break;
-            }
-
-          /* Reset FILE since it is null at the end of the loop.  */
-          file = g->file;
-
-          if (stop || !any_not_updated)
-            {
-              /* If we have found nothing whatever to do for the goal,
-                 print a message saying nothing needs doing.  */
-
-              if (!rebuilding_makefiles
-                  /* If the update_status is success, we updated successfully
-                     or not at all.  G->changed will have been set above if
-                     any commands were actually started for this goal.  */
-                  && file->update_status == us_success && !g->changed
-                  /* Never give a message under -s or -q.  */
-                  && !silent_flag && !question_flag)
-                OS (message, 1, ((file->phony || file->cmds == 0)
-                                 ? _("Nothing to be done for '%s'.")
-                                 : _("'%s' is up to date.")),
-                    file->name);
-
-              /* This goal is finished.  Remove it from the chain.  */
-              if (lastgoal == 0)
-                goals = g->next;
-              else
-                lastgoal->next = g->next;
-
-              /* Free the storage.  */
-              free (g);
-
-              g = lastgoal == 0 ? goals : lastgoal->next;
-
-              if (stop)
-                break;
-            }
-          else
-            {
-              lastgoal = g;
-              g = g->next;
-            }
-        }
-
-      /* If we reached the end of the dependency graph update CONSIDERED
-         for the next pass.  */
-      if (g == 0)
-        ++considered;
-    }
-
-  if (rebuilding_makefiles)
-    {
-      touch_flag = t;
-      question_flag = q;
-      just_print_flag = n;
-    }
-
-  return status;
-}
-\f
-/* If we're rebuilding an included makefile that failed, and we care
-   about errors, show an error message the first time.  */
-
-void
-show_goal_error (void)
-{
-  struct goaldep *goal;
-
-  if ((goal_dep->flags & (RM_INCLUDED|RM_DONTCARE)) != RM_INCLUDED)
-    return;
-
-  for (goal = goal_list; goal; goal = goal->next)
-    if (goal_dep->file == goal->file)
-      {
-        if (goal->error)
-          {
-            OSS (error, &goal->floc, "%s: %s",
-                 goal->file->name, strerror ((int)goal->error));
-            goal->error = 0;
-          }
-        return;
-      }
-}
-\f
-/* If FILE is not up to date, execute the commands for it.
-   Return 0 if successful, non-0 if unsuccessful;
-   but with some flag settings, just call 'exit' if unsuccessful.
-
-   DEPTH is the depth in recursions of this function.
-   We increment it during the consideration of our dependencies,
-   then decrement it again after finding out whether this file
-   is out of date.
-
-   If there are multiple double-colon entries for FILE,
-   each is considered in turn.  */
-
-static enum update_status
-update_file (struct file *file, unsigned int depth)
-{
-  enum update_status status = us_success;
-  struct file *f;
-
-  f = file->double_colon ? file->double_colon : file;
-
-  /* Prune the dependency graph: if we've already been here on _this_
-     pass through the dependency graph, we don't have to go any further.
-     We won't reap_children until we start the next pass, so no state
-     change is possible below here until then.  */
-  if (f->considered == considered)
-    {
-      /* Check for the case where a target has been tried and failed but
-         the diagnostics haven't been issued. If we need the diagnostics
-         then we will have to continue. */
-      if (!(f->updated && f->update_status > us_none
-            && !f->dontcare && f->no_diag))
-        {
-          DBF (DB_VERBOSE, _("Pruning file '%s'.\n"));
-          return f->command_state == cs_finished ? f->update_status : us_success;
-        }
-    }
-
-  /* This loop runs until we start commands for a double colon rule, or until
-     the chain is exhausted. */
-  for (; f != 0; f = f->prev)
-    {
-      enum update_status new;
-
-      f->considered = considered;
-
-      new = update_file_1 (f, depth);
-      check_renamed (f);
-
-      /* Clean up any alloca() used during the update.  */
-      alloca (0);
-
-      /* If we got an error, don't bother with double_colon etc.  */
-      if (new && !keep_going_flag)
-        return new;
-
-      if (f->command_state == cs_running
-          || f->command_state == cs_deps_running)
-        /* Don't run other :: rules for this target until
-           this rule is finished.  */
-        return us_success;
-
-      if (new > status)
-        status = new;
-    }
-
-  /* Process the remaining rules in the double colon chain so they're marked
-     considered.  Start their prerequisites, too.  */
-  if (file->double_colon)
-    for (; f != 0 ; f = f->prev)
-      {
-        struct dep *d;
-
-        f->considered = considered;
-
-        for (d = f->deps; d != 0; d = d->next)
-          {
-            enum update_status new = update_file (d->file, depth + 1);
-            if (new > status)
-              status = new;
-          }
-      }
-
-  return status;
-}
-\f
-/* Show a message stating the target failed to build.  */
-
-static void
-complain (struct file *file)
-{
-  /* If this file has no_diag set then it means we tried to update it
-     before in the dontcare mode and failed. The target that actually
-     failed is not necessarily this file but could be one of its direct
-     or indirect dependencies. So traverse this file's dependencies and
-     find the one that actually caused the failure. */
-
-  struct dep *d;
-
-  for (d = file->deps; d != 0; d = d->next)
-    {
-      if (d->file->updated && d->file->update_status > us_none && file->no_diag)
-        {
-          complain (d->file);
-          break;
-        }
-    }
-
-  if (d == 0)
-    {
-      show_goal_error ();
-
-      /* Didn't find any dependencies to complain about. */
-      if (file->parent)
-        {
-          size_t l = strlen (file->name) + strlen (file->parent->name) + 4;
-          const char *m = _("%sNo rule to make target '%s', needed by '%s'%s");
-
-          if (!keep_going_flag)
-            fatal (NILF, l, m, "", file->name, file->parent->name, "");
-
-          error (NILF, l, m, "*** ", file->name, file->parent->name, ".");
-        }
-      else
-        {
-          size_t l = strlen (file->name) + 4;
-          const char *m = _("%sNo rule to make target '%s'%s");
-
-          if (!keep_going_flag)
-            fatal (NILF, l, m, "", file->name, "");
-
-          error (NILF, l, m, "*** ", file->name, ".");
-        }
-
-      file->no_diag = 0;
-    }
-}
-
-/* Consider a single 'struct file' and update it as appropriate.
-   Return 0 on success, or non-0 on failure.  */
-
-static enum update_status
-update_file_1 (struct file *file, unsigned int depth)
-{
-  enum update_status dep_status = us_success;
-  FILE_TIMESTAMP this_mtime;
-  int noexist, must_make, deps_changed;
-  struct file *ofile;
-  struct dep *d, *ad;
-  struct dep amake;
-  int running = 0;
-
-  DBF (DB_VERBOSE, _("Considering target file '%s'.\n"));
-
-  if (file->updated)
-    {
-      if (file->update_status > us_none)
-        {
-          DBF (DB_VERBOSE,
-               _("Recently tried and failed to update file '%s'.\n"));
-
-          /* If the file we tried to make is marked no_diag then no message
-             was printed about it when it failed during the makefile rebuild.
-             If we're trying to build it again in the normal rebuild, print a
-             message now.  */
-          if (file->no_diag && !file->dontcare)
-              complain (file);
-
-          return file->update_status;
-        }
-
-      DBF (DB_VERBOSE, _("File '%s' was considered already.\n"));
-      return 0;
-    }
-
-  switch (file->command_state)
-    {
-    case cs_not_started:
-    case cs_deps_running:
-      break;
-    case cs_running:
-      DBF (DB_VERBOSE, _("Still updating file '%s'.\n"));
-      return 0;
-    case cs_finished:
-      DBF (DB_VERBOSE, _("Finished updating file '%s'.\n"));
-      return file->update_status;
-    default:
-      abort ();
-    }
-
-  /* Determine whether the diagnostics will be issued should this update
-     fail. */
-  file->no_diag = file->dontcare;
-
-  ++depth;
-
-  /* Notice recursive update of the same file.  */
-  start_updating (file);
-
-  /* We might change file if we find a different one via vpath;
-     remember this one to turn off updating.  */
-  ofile = file;
-
-  /* Looking at the file's modtime beforehand allows the possibility
-     that its name may be changed by a VPATH search, and thus it may
-     not need an implicit rule.  If this were not done, the file
-     might get implicit commands that apply to its initial name, only
-     to have that name replaced with another found by VPATH search.  */
-
-  this_mtime = file_mtime (file);
-  check_renamed (file);
-  noexist = this_mtime == NONEXISTENT_MTIME;
-  if (noexist)
-    DBF (DB_BASIC, _("File '%s' does not exist.\n"));
-  else if (ORDINARY_MTIME_MIN <= this_mtime && this_mtime <= ORDINARY_MTIME_MAX
-           && file->low_resolution_time)
-    {
-      /* Avoid spurious rebuilds due to low resolution time stamps.  */
-      int ns = FILE_TIMESTAMP_NS (this_mtime);
-      if (ns != 0)
-        OS (error, NILF,
-            _("*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"),
-            file->name);
-      this_mtime += FILE_TIMESTAMPS_PER_S - 1 - ns;
-    }
-
-  must_make = noexist;
-
-  /* If file was specified as a target with no commands,
-     come up with some default commands.  */
-
-  if (!file->phony && file->cmds == 0 && !file->tried_implicit)
-    {
-      if (try_implicit_rule (file, depth))
-        DBF (DB_IMPLICIT, _("Found an implicit rule for '%s'.\n"));
-      else
-        DBF (DB_IMPLICIT, _("No implicit rule found for '%s'.\n"));
-      file->tried_implicit = 1;
-    }
-  if (file->cmds == 0 && !file->is_target
-      && default_file != 0 && default_file->cmds != 0)
-    {
-      DBF (DB_IMPLICIT, _("Using default recipe for '%s'.\n"));
-      file->cmds = default_file->cmds;
-    }
-
-  /* Update all non-intermediate files we depend on, if necessary, and see
-     whether any of them is more recent than this file.  We need to walk our
-     deps, AND the deps of any also_make targets to ensure everything happens
-     in the correct order.  */
-
-  amake.file = file;
-  amake.next = file->also_make;
-  ad = &amake;
-  while (ad)
-    {
-      struct dep *lastd = 0;
-
-      /* Find the deps we're scanning */
-      d = ad->file->deps;
-      ad = ad->next;
-
-      while (d)
-        {
-          enum update_status new;
-          FILE_TIMESTAMP mtime;
-          int maybe_make;
-          int dontcare = 0;
-
-          check_renamed (d->file);
-
-          mtime = file_mtime (d->file);
-          check_renamed (d->file);
-
-          if (is_updating (d->file))
-            {
-              OSS (error, NILF, _("Circular %s <- %s dependency dropped."),
-                   file->name, d->file->name);
-              /* We cannot free D here because our the caller will still have
-                 a reference to it when we were called recursively via
-                 check_dep below.  */
-              if (lastd == 0)
-                file->deps = d->next;
-              else
-                lastd->next = d->next;
-              d = d->next;
-              continue;
-            }
-
-          d->file->parent = file;
-          maybe_make = must_make;
-
-          /* Inherit dontcare flag from our parent. */
-          if (rebuilding_makefiles)
-            {
-              dontcare = d->file->dontcare;
-              d->file->dontcare = file->dontcare;
-            }
-
-          new = check_dep (d->file, depth, this_mtime, &maybe_make);
-          if (new > dep_status)
-            dep_status = new;
-
-          /* Restore original dontcare flag. */
-          if (rebuilding_makefiles)
-            d->file->dontcare = dontcare;
-
-          if (! d->ignore_mtime)
-            must_make = maybe_make;
-
-          check_renamed (d->file);
-
-          {
-            register struct file *f = d->file;
-            if (f->double_colon)
-              f = f->double_colon;
-            do
-              {
-                running |= (f->command_state == cs_running
-                            || f->command_state == cs_deps_running);
-                f = f->prev;
-              }
-            while (f != 0);
-          }
-
-          if (dep_status && !keep_going_flag)
-            break;
-
-          if (!running)
-            /* The prereq is considered changed if the timestamp has changed
-               while it was built, OR it doesn't exist.  */
-            d->changed = ((file_mtime (d->file) != mtime)
-                          || (mtime == NONEXISTENT_MTIME));
-
-          lastd = d;
-          d = d->next;
-        }
-    }
-
-  /* Now we know whether this target needs updating.
-     If it does, update all the intermediate files we depend on.  */
-
-  if (must_make || always_make_flag)
-    {
-      for (d = file->deps; d != 0; d = d->next)
-        if (d->file->intermediate)
-          {
-            enum update_status new;
-            int dontcare = 0;
-
-            FILE_TIMESTAMP mtime = file_mtime (d->file);
-            check_renamed (d->file);
-            d->file->parent = file;
-
-            /* Inherit dontcare flag from our parent. */
-            if (rebuilding_makefiles)
-              {
-                dontcare = d->file->dontcare;
-                d->file->dontcare = file->dontcare;
-              }
-
-            /* We may have already considered this file, when we didn't know
-               we'd need to update it.  Force update_file() to consider it and
-               not prune it.  */
-            d->file->considered = 0;
-
-            new = update_file (d->file, depth);
-            if (new > dep_status)
-              dep_status = new;
-
-            /* Restore original dontcare flag. */
-            if (rebuilding_makefiles)
-              d->file->dontcare = dontcare;
-
-            check_renamed (d->file);
-
-            {
-              register struct file *f = d->file;
-              if (f->double_colon)
-                f = f->double_colon;
-              do
-                {
-                  running |= (f->command_state == cs_running
-                              || f->command_state == cs_deps_running);
-                  f = f->prev;
-                }
-              while (f != 0);
-            }
-
-            if (dep_status && !keep_going_flag)
-              break;
-
-            if (!running)
-              d->changed = ((file->phony && file->cmds != 0)
-                            || file_mtime (d->file) != mtime);
-          }
-    }
-
-  finish_updating (file);
-  finish_updating (ofile);
-
-  DBF (DB_VERBOSE, _("Finished prerequisites of target file '%s'.\n"));
-
-  if (running)
-    {
-      set_command_state (file, cs_deps_running);
-      --depth;
-      DBF (DB_VERBOSE, _("The prerequisites of '%s' are being made.\n"));
-      return 0;
-    }
-
-  /* If any dependency failed, give up now.  */
-
-  if (dep_status)
-    {
-      /* I'm not sure if we can't just assign dep_status...  */
-      file->update_status = dep_status == us_none ? us_failed : dep_status;
-      notice_finished_file (file);
-
-      --depth;
-
-      DBF (DB_VERBOSE, _("Giving up on target file '%s'.\n"));
-
-      if (depth == 0 && keep_going_flag
-          && !just_print_flag && !question_flag)
-        OS (error, NILF,
-            _("Target '%s' not remade because of errors."), file->name);
-
-      return dep_status;
-    }
-
-  if (file->command_state == cs_deps_running)
-    /* The commands for some deps were running on the last iteration, but
-       they have finished now.  Reset the command_state to not_started to
-       simplify later bookkeeping.  It is important that we do this only
-       when the prior state was cs_deps_running, because that prior state
-       was definitely propagated to FILE's also_make's by set_command_state
-       (called above), but in another state an also_make may have
-       independently changed to finished state, and we would confuse that
-       file's bookkeeping (updated, but not_started is bogus state).  */
-    set_command_state (file, cs_not_started);
-
-  /* Now record which prerequisites are more
-     recent than this file, so we can define $?.  */
-
-  deps_changed = 0;
-  for (d = file->deps; d != 0; d = d->next)
-    {
-      FILE_TIMESTAMP d_mtime = file_mtime (d->file);
-      check_renamed (d->file);
-
-      if (! d->ignore_mtime)
-        {
-#if 1
-          /* %%% In version 4, remove this code completely to
-           implement not remaking deps if their deps are newer
-           than their parents.  */
-          if (d_mtime == NONEXISTENT_MTIME && !d->file->intermediate)
-            /* We must remake if this dep does not
-               exist and is not intermediate.  */
-            must_make = 1;
-#endif
-
-          /* Set DEPS_CHANGED if this dep actually changed.  */
-          deps_changed |= d->changed;
-        }
-
-      /* Set D->changed if either this dep actually changed,
-         or its dependent, FILE, is older or does not exist.  */
-      d->changed |= noexist || d_mtime > this_mtime;
-
-      if (!noexist && ISDB (DB_BASIC|DB_VERBOSE))
-        {
-          const char *fmt = 0;
-
-          if (d->ignore_mtime)
-            {
-              if (ISDB (DB_VERBOSE))
-                fmt = _("Prerequisite '%s' is order-only for target '%s'.\n");
-            }
-          else if (d_mtime == NONEXISTENT_MTIME)
-            {
-              if (ISDB (DB_BASIC))
-                fmt = _("Prerequisite '%s' of target '%s' does not exist.\n");
-            }
-          else if (d->changed)
-            {
-              if (ISDB (DB_BASIC))
-                fmt = _("Prerequisite '%s' is newer than target '%s'.\n");
-            }
-          else if (ISDB (DB_VERBOSE))
-            fmt = _("Prerequisite '%s' is older than target '%s'.\n");
-
-          if (fmt)
-            {
-              print_spaces (depth);
-              printf (fmt, dep_name (d), file->name);
-              fflush (stdout);
-            }
-        }
-    }
-
-  /* Here depth returns to the value it had when we were called.  */
-  depth--;
-
-  if (file->double_colon && file->deps == 0)
-    {
-      must_make = 1;
-      DBF (DB_BASIC,
-           _("Target '%s' is double-colon and has no prerequisites.\n"));
-    }
-  else if (!noexist && file->is_target && !deps_changed && file->cmds == 0
-           && !always_make_flag)
-    {
-      must_make = 0;
-      DBF (DB_VERBOSE,
-           _("No recipe for '%s' and no prerequisites actually changed.\n"));
-    }
-  else if (!must_make && file->cmds != 0 && always_make_flag)
-    {
-      must_make = 1;
-      DBF (DB_VERBOSE, _("Making '%s' due to always-make flag.\n"));
-    }
-
-  if (!must_make)
-    {
-      if (ISDB (DB_VERBOSE))
-        {
-          print_spaces (depth);
-          printf (_("No need to remake target '%s'"), file->name);
-          if (!streq (file->name, file->hname))
-              printf (_("; using VPATH name '%s'"), file->hname);
-          puts (".");
-          fflush (stdout);
-        }
-
-      notice_finished_file (file);
-
-      /* Since we don't need to remake the file, convert it to use the
-         VPATH filename if we found one.  hfile will be either the
-         local name if no VPATH or the VPATH name if one was found.  */
-
-      while (file)
-        {
-          file->name = file->hname;
-          file = file->prev;
-        }
-
-      return 0;
-    }
-
-  DBF (DB_BASIC, _("Must remake target '%s'.\n"));
-
-  /* It needs to be remade.  If it's VPATH and not reset via GPATH, toss the
-     VPATH.  */
-  if (!streq (file->name, file->hname))
-    {
-      DB (DB_BASIC, (_("  Ignoring VPATH name '%s'.\n"), file->hname));
-      file->ignore_vpath = 1;
-    }
-
-  /* Now, take appropriate actions to remake the file.  */
-  remake_file (file);
-
-  if (file->command_state != cs_finished)
-    {
-      DBF (DB_VERBOSE, _("Recipe of '%s' is being run.\n"));
-      return 0;
-    }
-
-  switch (file->update_status)
-    {
-    case us_failed:
-      DBF (DB_BASIC, _("Failed to remake target file '%s'.\n"));
-      break;
-    case us_success:
-      DBF (DB_BASIC, _("Successfully remade target file '%s'.\n"));
-      break;
-    case us_question:
-      DBF (DB_BASIC, _("Target file '%s' needs to be remade under -q.\n"));
-      break;
-    case us_none:
-      break;
-    }
-
-  file->updated = 1;
-  return file->update_status;
-}
-\f
-/* Set FILE's 'updated' flag and re-check its mtime and the mtime's of all
-   files listed in its 'also_make' member.  Under -t, this function also
-   touches FILE.
-
-   On return, FILE->update_status will no longer be us_none if it was.  */
-
-void
-notice_finished_file (struct file *file)
-{
-  struct dep *d;
-  int ran = file->command_state == cs_running;
-  int touched = 0;
-
-  file->command_state = cs_finished;
-  file->updated = 1;
-
-  if (touch_flag
-      /* The update status will be:
-           us_success   if 0 or more commands (+ or ${MAKE}) were run and won;
-           us_none      if this target was not remade;
-           >us_none     if some commands were run and lost.
-         We touch the target if it has commands which either were not run
-         or won when they ran (i.e. status is 0).  */
-      && file->update_status == us_success)
-    {
-      if (file->cmds != 0 && file->cmds->any_recurse)
-        {
-          /* If all the command lines were recursive,
-             we don't want to do the touching.  */
-          unsigned int i;
-          for (i = 0; i < file->cmds->ncommand_lines; ++i)
-            if (!(file->cmds->lines_flags[i] & COMMANDS_RECURSE))
-              goto have_nonrecursing;
-        }
-      else
-        {
-        have_nonrecursing:
-          if (file->phony)
-            file->update_status = us_success;
-          /* According to POSIX, -t doesn't affect targets with no cmds.  */
-          else if (file->cmds != 0)
-            {
-              /* Should set file's modification date and do nothing else.  */
-              file->update_status = touch_file (file);
-
-              /* Pretend we ran a real touch command, to suppress the
-                 "'foo' is up to date" message.  */
-              commands_started++;
-
-              /* Request for the timestamp to be updated (and distributed
-                 to the double-colon entries). Simply setting ran=1 would
-                 almost have done the trick, but messes up with the also_make
-                 updating logic below.  */
-              touched = 1;
-            }
-        }
-    }
-
-  if (file->mtime_before_update == UNKNOWN_MTIME)
-    file->mtime_before_update = file->last_mtime;
-
-  if ((ran && !file->phony) || touched)
-    {
-      int i = 0;
-
-      /* If -n, -t, or -q and all the commands are recursive, we ran them so
-         really check the target's mtime again.  Otherwise, assume the target
-         would have been updated. */
-
-      if ((question_flag || just_print_flag || touch_flag) && file->cmds)
-        {
-          for (i = file->cmds->ncommand_lines; i > 0; --i)
-            if (! (file->cmds->lines_flags[i-1] & COMMANDS_RECURSE))
-              break;
-        }
-
-      /* If there were no commands at all, it's always new. */
-
-      else if (file->is_target && file->cmds == 0)
-        i = 1;
-
-      file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME;
-    }
-
-  if (file->double_colon)
-    {
-      /* If this is a double colon rule and it is the last one to be
-         updated, propagate the change of modification time to all the
-         double-colon entries for this file.
-
-         We do it on the last update because it is important to handle
-         individual entries as separate rules with separate timestamps
-         while they are treated as targets and then as one rule with the
-         unified timestamp when they are considered as a prerequisite
-         of some target.  */
-
-      struct file *f;
-      FILE_TIMESTAMP max_mtime = file->last_mtime;
-
-      /* Check that all rules were updated and at the same time find
-         the max timestamp.  We assume UNKNOWN_MTIME is newer then
-         any other value.  */
-      for (f = file->double_colon; f != 0 && f->updated; f = f->prev)
-        if (max_mtime != UNKNOWN_MTIME
-            && (f->last_mtime == UNKNOWN_MTIME || f->last_mtime > max_mtime))
-          max_mtime = f->last_mtime;
-
-      if (f == 0)
-        for (f = file->double_colon; f != 0; f = f->prev)
-          f->last_mtime = max_mtime;
-    }
-
-  if (ran && file->update_status != us_none)
-    /* We actually tried to update FILE, which has
-       updated its also_make's as well (if it worked).
-       If it didn't work, it wouldn't work again for them.
-       So mark them as updated with the same status.  */
-    for (d = file->also_make; d != 0; d = d->next)
-      {
-        d->file->command_state = cs_finished;
-        d->file->updated = 1;
-        d->file->update_status = file->update_status;
-
-        if (ran && !d->file->phony)
-          /* Fetch the new modification time.
-             We do this instead of just invalidating the cached time
-             so that a vpath_search can happen.  Otherwise, it would
-             never be done because the target is already updated.  */
-          f_mtime (d->file, 0);
-      }
-  else if (file->update_status == us_none)
-    /* Nothing was done for FILE, but it needed nothing done.
-       So mark it now as "succeeded".  */
-    file->update_status = us_success;
-}
-\f
-/* Check whether another file (whose mtime is THIS_MTIME) needs updating on
-   account of a dependency which is file FILE.  If it does, store 1 in
-   *MUST_MAKE_PTR.  In the process, update any non-intermediate files that
-   FILE depends on (including FILE itself).  Return nonzero if any updating
-   failed.  */
-
-static enum update_status
-check_dep (struct file *file, unsigned int depth,
-           FILE_TIMESTAMP this_mtime, int *must_make_ptr)
-{
-  struct file *ofile;
-  struct dep *d;
-  enum update_status dep_status = us_success;
-
-  ++depth;
-  start_updating (file);
-
-  /* We might change file if we find a different one via vpath;
-     remember this one to turn off updating.  */
-  ofile = file;
-
-  if (file->phony || !file->intermediate)
-    {
-      /* If this is a non-intermediate file, update it and record whether it
-         is newer than THIS_MTIME.  */
-      FILE_TIMESTAMP mtime;
-      dep_status = update_file (file, depth);
-      check_renamed (file);
-      mtime = file_mtime (file);
-      check_renamed (file);
-      if (mtime == NONEXISTENT_MTIME || mtime > this_mtime)
-        *must_make_ptr = 1;
-    }
-  else
-    {
-      /* FILE is an intermediate file.  */
-      FILE_TIMESTAMP mtime;
-
-      if (!file->phony && file->cmds == 0 && !file->tried_implicit)
-        {
-          if (try_implicit_rule (file, depth))
-            DBF (DB_IMPLICIT, _("Found an implicit rule for '%s'.\n"));
-          else
-            DBF (DB_IMPLICIT, _("No implicit rule found for '%s'.\n"));
-          file->tried_implicit = 1;
-        }
-      if (file->cmds == 0 && !file->is_target
-          && default_file != 0 && default_file->cmds != 0)
-        {
-          DBF (DB_IMPLICIT, _("Using default commands for '%s'.\n"));
-          file->cmds = default_file->cmds;
-        }
-
-      check_renamed (file);
-      mtime = file_mtime (file);
-      check_renamed (file);
-      if (mtime != NONEXISTENT_MTIME && mtime > this_mtime)
-        /* If the intermediate file actually exists and is newer, then we
-           should remake from it.  */
-        *must_make_ptr = 1;
-      else
-        {
-          /* Otherwise, update all non-intermediate files we depend on, if
-             necessary, and see whether any of them is more recent than the
-             file on whose behalf we are checking.  */
-          struct dep *ld;
-          int deps_running = 0;
-
-          /* If this target is not running, set it's state so that we check it
-             fresh.  It could be it was checked as part of an order-only
-             prerequisite and so wasn't rebuilt then, but should be now.  */
-          if (file->command_state != cs_running)
-            {
-              /* If the target was waiting for a dependency it has to be
-                 reconsidered, as that dependency might have finished.  */
-              if (file->command_state == cs_deps_running)
-                file->considered = 0;
-
-              set_command_state (file, cs_not_started);
-            }
-
-          ld = 0;
-          d = file->deps;
-          while (d != 0)
-            {
-              enum update_status new;
-              int maybe_make;
-
-              if (is_updating (d->file))
-                {
-                  OSS (error, NILF, _("Circular %s <- %s dependency dropped."),
-                       file->name, d->file->name);
-                  if (ld == 0)
-                    {
-                      file->deps = d->next;
-                      free_dep (d);
-                      d = file->deps;
-                    }
-                  else
-                    {
-                      ld->next = d->next;
-                      free_dep (d);
-                      d = ld->next;
-                    }
-                  continue;
-                }
-
-              d->file->parent = file;
-              maybe_make = *must_make_ptr;
-              new = check_dep (d->file, depth, this_mtime, &maybe_make);
-              if (new > dep_status)
-                dep_status = new;
-
-              if (! d->ignore_mtime)
-                *must_make_ptr = maybe_make;
-              check_renamed (d->file);
-              if (dep_status && !keep_going_flag)
-                break;
-
-              if (d->file->command_state == cs_running
-                  || d->file->command_state == cs_deps_running)
-                deps_running = 1;
-
-              ld = d;
-              d = d->next;
-            }
-
-          if (deps_running)
-            /* Record that some of FILE's deps are still being made.
-               This tells the upper levels to wait on processing it until the
-               commands are finished.  */
-            set_command_state (file, cs_deps_running);
-        }
-    }
-
-  finish_updating (file);
-  finish_updating (ofile);
-
-  return dep_status;
-}
-\f
-/* Touch FILE.  Return us_success if successful, us_failed if not.  */
-
-#define TOUCH_ERROR(call) do{ perror_with_name ((call), file->name);    \
-                              return us_failed; }while(0)
-
-static enum update_status
-touch_file (struct file *file)
-{
-  if (!silent_flag)
-    OS (message, 0, "touch %s", file->name);
-
-  /* Print-only (-n) takes precedence over touch (-t).  */
-  if (just_print_flag)
-    return us_success;
-
-#ifndef NO_ARCHIVES
-  if (ar_name (file->name))
-    return ar_touch (file->name) ? us_failed : us_success;
-  else
-#endif
-    {
-      int fd;
-
-      EINTRLOOP (fd, open (file->name, O_RDWR | O_CREAT, 0666));
-      if (fd < 0)
-        TOUCH_ERROR ("touch: open: ");
-      else
-        {
-          struct stat statbuf;
-          char buf = 'x';
-          int e;
-
-          EINTRLOOP (e, fstat (fd, &statbuf));
-          if (e < 0)
-            TOUCH_ERROR ("touch: fstat: ");
-          /* Rewrite character 0 same as it already is.  */
-          EINTRLOOP (e, read (fd, &buf, 1));
-          if (e < 0)
-            TOUCH_ERROR ("touch: read: ");
-          {
-            off_t o;
-            EINTRLOOP (o, lseek (fd, 0L, 0));
-            if (o < 0L)
-              TOUCH_ERROR ("touch: lseek: ");
-          }
-          EINTRLOOP (e, write (fd, &buf, 1));
-          if (e < 0)
-            TOUCH_ERROR ("touch: write: ");
-
-          /* If file length was 0, we just changed it, so change it back.  */
-          if (statbuf.st_size == 0)
-            {
-              (void) close (fd);
-              EINTRLOOP (fd, open (file->name, O_RDWR | O_TRUNC, 0666));
-              if (fd < 0)
-                TOUCH_ERROR ("touch: open: ");
-            }
-          (void) close (fd);
-        }
-    }
-
-  return us_success;
-}
-\f
-/* Having checked and updated the dependencies of FILE,
-   do whatever is appropriate to remake FILE itself.
-   Return the status from executing FILE's commands.  */
-
-static void
-remake_file (struct file *file)
-{
-  if (file->cmds == 0)
-    {
-      if (file->phony)
-        /* Phony target.  Pretend it succeeded.  */
-        file->update_status = us_success;
-      else if (file->is_target)
-        /* This is a nonexistent target file we cannot make.
-           Pretend it was successfully remade.  */
-        file->update_status = us_success;
-      else
-        {
-          /* This is a dependency file we cannot remake.  Fail.  */
-          if (!rebuilding_makefiles || !file->dontcare)
-            complain (file);
-          file->update_status = us_failed;
-        }
-    }
-  else
-    {
-      chop_commands (file->cmds);
-
-      /* The normal case: start some commands.  */
-      if (!touch_flag || file->cmds->any_recurse)
-        {
-          execute_file_commands (file);
-          return;
-        }
-
-      /* This tells notice_finished_file it is ok to touch the file.  */
-      file->update_status = us_success;
-    }
-
-  /* This does the touching under -t.  */
-  notice_finished_file (file);
-}
-\f
-/* Return the mtime of a file, given a 'struct file'.
-   Caches the time in the struct file to avoid excess stat calls.
-
-   If the file is not found, and SEARCH is nonzero, VPATH searching and
-   replacement is done.  If that fails, a library (-lLIBNAME) is tried and
-   the library's actual name (/lib/libLIBNAME.a, etc.) is substituted into
-   FILE.  */
-
-FILE_TIMESTAMP
-f_mtime (struct file *file, int search)
-{
-  FILE_TIMESTAMP mtime;
-  int propagate_timestamp;
-
-  /* File's mtime is not known; must get it from the system.  */
-
-#ifndef NO_ARCHIVES
-  if (ar_name (file->name))
-    {
-      /* This file is an archive-member reference.  */
-
-      char *arname, *memname;
-      struct file *arfile;
-      time_t member_date;
-
-      /* Find the archive's name.  */
-      ar_parse_name (file->name, &arname, &memname);
-
-      /* Find the modification time of the archive itself.
-         Also allow for its name to be changed via VPATH search.  */
-      arfile = lookup_file (arname);
-      if (arfile == 0)
-        arfile = enter_file (strcache_add (arname));
-      mtime = f_mtime (arfile, search);
-      check_renamed (arfile);
-      if (search && strcmp (arfile->hname, arname))
-        {
-          /* The archive's name has changed.
-             Change the archive-member reference accordingly.  */
-
-          char *name;
-          unsigned int arlen, memlen;
-
-          arlen = strlen (arfile->hname);
-          memlen = strlen (memname);
-
-          name = alloca (arlen + 1 + memlen + 2);
-          memcpy (name, arfile->hname, arlen);
-          name[arlen] = '(';
-          memcpy (name + arlen + 1, memname, memlen);
-          name[arlen + 1 + memlen] = ')';
-          name[arlen + 1 + memlen + 1] = '\0';
-
-          /* If the archive was found with GPATH, make the change permanent;
-             otherwise defer it until later.  */
-          if (arfile->name == arfile->hname)
-            rename_file (file, strcache_add (name));
-          else
-            rehash_file (file, strcache_add (name));
-          check_renamed (file);
-        }
-
-      free (arname);
-
-      file->low_resolution_time = 1;
-
-      if (mtime == NONEXISTENT_MTIME)
-        /* The archive doesn't exist, so its members don't exist either.  */
-        return NONEXISTENT_MTIME;
-
-      member_date = ar_member_date (file->hname);
-      mtime = (member_date == (time_t) -1
-               ? NONEXISTENT_MTIME
-               : file_timestamp_cons (file->hname, member_date, 0));
-    }
-  else
-#endif
-    {
-      mtime = name_mtime (file->name);
-
-      if (mtime == NONEXISTENT_MTIME && search && !file->ignore_vpath)
-        {
-          /* If name_mtime failed, search VPATH.  */
-          const char *name = vpath_search (file->name, &mtime, NULL, NULL);
-          if (name
-              /* Last resort, is it a library (-lxxx)?  */
-              || (file->name[0] == '-' && file->name[1] == 'l'
-                  && (name = library_search (file->name, &mtime)) != 0))
-            {
-              int name_len;
-
-              if (mtime != UNKNOWN_MTIME)
-                /* vpath_search and library_search store UNKNOWN_MTIME
-                   if they didn't need to do a stat call for their work.  */
-                file->last_mtime = mtime;
-
-              /* If we found it in VPATH, see if it's in GPATH too; if so,
-                 change the name right now; if not, defer until after the
-                 dependencies are updated. */
-#ifndef VMS
-              name_len = strlen (name) - strlen (file->name) - 1;
-#else
-              name_len = strlen (name) - strlen (file->name);
-              if (name[name_len - 1] == '/')
-                  name_len--;
-#endif
-              if (gpath_search (name, name_len))
-                {
-                  rename_file (file, name);
-                  check_renamed (file);
-                  return file_mtime (file);
-                }
-
-              rehash_file (file, name);
-              check_renamed (file);
-              /* If the result of a vpath search is -o or -W, preserve it.
-                 Otherwise, find the mtime of the resulting file.  */
-              if (mtime != OLD_MTIME && mtime != NEW_MTIME)
-                mtime = name_mtime (name);
-            }
-        }
-    }
-
-  /* Files can have bogus timestamps that nothing newly made will be
-     "newer" than.  Updating their dependents could just result in loops.
-     So notify the user of the anomaly with a warning.
-
-     We only need to do this once, for now. */
-
-  if (!clock_skew_detected
-      && mtime != NONEXISTENT_MTIME && mtime != NEW_MTIME
-      && !file->updated)
-    {
-      static FILE_TIMESTAMP adjusted_now;
-
-      FILE_TIMESTAMP adjusted_mtime = mtime;
-
-#if defined(WINDOWS32) || defined(__MSDOS__)
-      /* Experimentation has shown that FAT filesystems can set file times
-         up to 3 seconds into the future!  Play it safe.  */
-
-#define FAT_ADJ_OFFSET  (FILE_TIMESTAMP) 3
-
-      FILE_TIMESTAMP adjustment = FAT_ADJ_OFFSET << FILE_TIMESTAMP_LO_BITS;
-      if (ORDINARY_MTIME_MIN + adjustment <= adjusted_mtime)
-        adjusted_mtime -= adjustment;
-#elif defined(__EMX__)
-      /* FAT filesystems round time to the nearest even second!
-         Allow for any file (NTFS or FAT) to perhaps suffer from this
-         brain damage.  */
-      FILE_TIMESTAMP adjustment = (((FILE_TIMESTAMP_S (adjusted_mtime) & 1) == 0
-                     && FILE_TIMESTAMP_NS (adjusted_mtime) == 0)
-                    ? (FILE_TIMESTAMP) 1 << FILE_TIMESTAMP_LO_BITS
-                    : 0);
-#endif
-
-      /* If the file's time appears to be in the future, update our
-         concept of the present and try once more.  */
-      if (adjusted_now < adjusted_mtime)
-        {
-          int resolution;
-          FILE_TIMESTAMP now = file_timestamp_now (&resolution);
-          adjusted_now = now + (resolution - 1);
-          if (adjusted_now < adjusted_mtime)
-            {
-#ifdef NO_FLOAT
-              OS (error, NILF,
-                  _("Warning: File '%s' has modification time in the future"),
-                  file->name);
-#else
-              double from_now =
-                (FILE_TIMESTAMP_S (mtime) - FILE_TIMESTAMP_S (now)
-                 + ((FILE_TIMESTAMP_NS (mtime) - FILE_TIMESTAMP_NS (now))
-                    / 1e9));
-              char from_now_string[100];
-
-              if (from_now >= 99 && from_now <= ULONG_MAX)
-                sprintf (from_now_string, "%lu", (unsigned long) from_now);
-              else
-                sprintf (from_now_string, "%.2g", from_now);
-              OSS (error, NILF,
-                   _("Warning: File '%s' has modification time %s s in the future"),
-                   file->name, from_now_string);
-#endif
-              clock_skew_detected = 1;
-            }
-        }
-    }
-
-  /* Store the mtime into all the entries for this file for which it is safe
-     to do so: avoid propagating timestamps to double-colon rules that haven't
-     been examined so they're run or not based on the pre-update timestamp.  */
-  if (file->double_colon)
-    file = file->double_colon;
-
-  propagate_timestamp = file->updated;
-  do
-    {
-      /* If this file is not implicit but it is intermediate then it was
-         made so by the .INTERMEDIATE target.  If this file has never
-         been built by us but was found now, it existed before make
-         started.  So, turn off the intermediate bit so make doesn't
-         delete it, since it didn't create it.  */
-      if (mtime != NONEXISTENT_MTIME && file->command_state == cs_not_started
-          && !file->tried_implicit && file->intermediate)
-        file->intermediate = 0;
-
-      if (file->updated == propagate_timestamp)
-        file->last_mtime = mtime;
-      file = file->prev;
-    }
-  while (file != 0);
-
-  return mtime;
-}
-
-
-/* Return the mtime of the file or archive-member reference NAME.  */
-
-/* First, we check with stat().  If the file does not exist, then we return
-   NONEXISTENT_MTIME.  If it does, and the symlink check flag is set, then
-   examine each indirection of the symlink and find the newest mtime.
-   This causes one duplicate stat() when -L is being used, but the code is
-   much cleaner.  */
-
-static FILE_TIMESTAMP
-name_mtime (const char *name)
-{
-  FILE_TIMESTAMP mtime;
-  struct stat st;
-  int e;
-
-  EINTRLOOP (e, stat (name, &st));
-  if (e == 0)
-    mtime = FILE_TIMESTAMP_STAT_MODTIME (name, st);
-  else if (errno == ENOENT || errno == ENOTDIR)
-    mtime = NONEXISTENT_MTIME;
-  else
-    {
-      perror_with_name ("stat: ", name);
-      return NONEXISTENT_MTIME;
-    }
-
-  /* If we get here we either found it, or it doesn't exist.
-     If it doesn't exist see if we can use a symlink mtime instead.  */
-
-#ifdef MAKE_SYMLINKS
-#ifndef S_ISLNK
-# define S_ISLNK(_m)     (((_m)&S_IFMT)==S_IFLNK)
-#endif
-  if (check_symlink_flag)
-    {
-      PATH_VAR (lpath);
-
-      /* Check each symbolic link segment (if any).  Find the latest mtime
-         amongst all of them (and the target file of course).
-         Note that we have already successfully dereferenced all the links
-         above.  So, if we run into any error trying to lstat(), or
-         readlink(), or whatever, something bizarre-o happened.  Just give up
-         and use whatever mtime we've already computed at that point.  */
-      strcpy (lpath, name);
-      while (1)
-        {
-          FILE_TIMESTAMP ltime;
-          PATH_VAR (lbuf);
-          long llen;
-          char *p;
-
-          EINTRLOOP (e, lstat (lpath, &st));
-          if (e)
-            {
-              /* Just take what we have so far.  */
-              if (errno != ENOENT && errno != ENOTDIR)
-                perror_with_name ("lstat: ", lpath);
-              break;
-            }
-
-          /* If this is not a symlink, we're done (we started with the real
-             file's mtime so we don't need to test it again).  */
-          if (!S_ISLNK (st.st_mode))
-            break;
-
-          /* If this mtime is newer than what we had, keep the new one.  */
-          ltime = FILE_TIMESTAMP_STAT_MODTIME (lpath, st);
-          if (ltime > mtime)
-            mtime = ltime;
-
-          /* Set up to check the file pointed to by this link.  */
-          EINTRLOOP (llen, readlink (lpath, lbuf, GET_PATH_MAX));
-          if (llen < 0)
-            {
-              /* Eh?  Just take what we have.  */
-              perror_with_name ("readlink: ", lpath);
-              break;
-            }
-          lbuf[llen] = '\0';
-
-          /* If the target is fully-qualified or the source is just a
-             filename, then the new path is the target.  Otherwise it's the
-             source directory plus the target.  */
-          if (lbuf[0] == '/' || (p = strrchr (lpath, '/')) == NULL)
-            strcpy (lpath, lbuf);
-          else if ((p - lpath) + llen + 2 > GET_PATH_MAX)
-            /* Eh?  Path too long!  Again, just go with what we have.  */
-            break;
-          else
-            /* Create the next step in the symlink chain.  */
-            strcpy (p+1, lbuf);
-        }
-    }
-#endif
-
-  return mtime;
-}
-
-
-/* Search for a library file specified as -lLIBNAME, searching for a
-   suitable library file in the system library directories and the VPATH
-   directories.  */
-
-static const char *
-library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr)
-{
-  static const char *dirs[] =
-    {
-#ifndef _AMIGA
-      "/lib",
-      "/usr/lib",
-#endif
-#if defined(WINDOWS32) && !defined(LIBDIR)
-/*
- * This is completely up to the user at product install time. Just define
- * a placeholder.
- */
-#define LIBDIR "."
-#endif
-      LIBDIR,                   /* Defined by configuration.  */
-      0
-    };
-
-  const char *file = 0;
-  char *libpatterns;
-  FILE_TIMESTAMP mtime;
-
-  /* Loop variables for the libpatterns value.  */
-  char *p;
-  const char *p2;
-  unsigned int len;
-  unsigned int liblen;
-
-  /* Information about the earliest (in the vpath sequence) match.  */
-  unsigned int best_vpath = 0, best_path = 0;
-
-  const char **dp;
-
-  libpatterns = xstrdup (variable_expand ("$(.LIBPATTERNS)"));
-
-  /* Skip the '-l'.  */
-  lib += 2;
-  liblen = strlen (lib);
-
-  /* Loop through all the patterns in .LIBPATTERNS, and search on each one.
-     To implement the linker-compatible behavior we have to search through
-     all entries in .LIBPATTERNS and choose the "earliest" one.  */
-  p2 = libpatterns;
-  while ((p = find_next_token (&p2, &len)) != 0)
-    {
-      static char *buf = NULL;
-      static unsigned int buflen = 0;
-      static int libdir_maxlen = -1;
-      static unsigned int std_dirs = 0;
-      char *libbuf = variable_expand ("");
-
-      /* Expand the pattern using LIB as a replacement.  */
-      {
-        char c = p[len];
-        char *p3, *p4;
-
-        p[len] = '\0';
-        p3 = find_percent (p);
-        if (!p3)
-          {
-            /* Give a warning if there is no pattern.  */
-            OS (error, NILF,
-                _(".LIBPATTERNS element '%s' is not a pattern"), p);
-            p[len] = c;
-            continue;
-          }
-        p4 = variable_buffer_output (libbuf, p, p3-p);
-        p4 = variable_buffer_output (p4, lib, liblen);
-        p4 = variable_buffer_output (p4, p3+1, len - (p3-p));
-        p[len] = c;
-      }
-
-      /* Look first for 'libNAME.a' in the current directory.  */
-      mtime = name_mtime (libbuf);
-      if (mtime != NONEXISTENT_MTIME)
-        {
-          if (mtime_ptr != 0)
-            *mtime_ptr = mtime;
-          file = strcache_add (libbuf);
-          /* This by definition will have the best index, so stop now.  */
-          break;
-        }
-
-      /* Now try VPATH search on that.  */
-
-      {
-        unsigned int vpath_index, path_index;
-        const char* f = vpath_search (libbuf, mtime_ptr ? &mtime : NULL,
-                                      &vpath_index, &path_index);
-        if (f)
-          {
-            /* If we have a better match, record it.  */
-            if (file == 0 ||
-                vpath_index < best_vpath ||
-                (vpath_index == best_vpath && path_index < best_path))
-              {
-                file = f;
-                best_vpath = vpath_index;
-                best_path = path_index;
-
-                if (mtime_ptr != 0)
-                  *mtime_ptr = mtime;
-              }
-          }
-      }
-
-      /* Now try the standard set of directories.  */
-
-      if (!buflen)
-        {
-          for (dp = dirs; *dp != 0; ++dp)
-            {
-              int l = strlen (*dp);
-              if (l > libdir_maxlen)
-                libdir_maxlen = l;
-              std_dirs++;
-            }
-          buflen = strlen (libbuf);
-          buf = xmalloc (libdir_maxlen + buflen + 2);
-        }
-      else if (buflen < strlen (libbuf))
-        {
-          buflen = strlen (libbuf);
-          buf = xrealloc (buf, libdir_maxlen + buflen + 2);
-        }
-
-      {
-        /* Use the last std_dirs index for standard directories. This
-           was it will always be greater than the VPATH index.  */
-        unsigned int vpath_index = ~((unsigned int)0) - std_dirs;
-
-        for (dp = dirs; *dp != 0; ++dp)
-          {
-            sprintf (buf, "%s/%s", *dp, libbuf);
-            mtime = name_mtime (buf);
-            if (mtime != NONEXISTENT_MTIME)
-              {
-                if (file == 0 || vpath_index < best_vpath)
-                  {
-                    file = strcache_add (buf);
-                    best_vpath = vpath_index;
-
-                    if (mtime_ptr != 0)
-                      *mtime_ptr = mtime;
-                  }
-              }
-
-            vpath_index++;
-          }
-      }
-
-    }
-
-  free (libpatterns);
-  return file;
-}
diff --git a/remote-cstms.c b/remote-cstms.c
deleted file mode 100644 (file)
index 7c36b9d..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/* GNU Make remote job exportation interface to the Customs daemon.
-   THIS CODE IS NOT SUPPORTED BY THE GNU PROJECT.
-   Please do not send bug reports or questions about it to
-   the Make maintainers.
-
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "commands.h"
-#include "job.h"
-#include "debug.h"
-
-#include <sys/time.h>
-#include <netdb.h>
-
-#include "customs.h"
-
-char *remote_description = "Customs";
-
-/* File name of the Customs 'export' client command.
-   A full path name can be used to avoid some path-searching overhead.  */
-#define EXPORT_COMMAND  "/usr/local/bin/export"
-
-/* ExportPermit gotten by start_remote_job_p, and used by start_remote_job.  */
-static ExportPermit permit;
-
-/* Normalized path name of the current directory.  */
-static char *normalized_cwd;
-
-/* Call once at startup even if no commands are run.  */
-
-void
-remote_setup (void)
-{
-}
-
-/* Called before exit.  */
-
-void
-remote_cleanup (void)
-{
-}
-\f
-/* Return nonzero if the next job should be done remotely.  */
-
-int
-start_remote_job_p (int first_p)
-{
-  static int inited = 0;
-  int status;
-  int njobs;
-
-  if (!inited)
-    {
-      /* Allow the user to turn off job exportation (useful while he is
-         debugging Customs, for example).  */
-      if (getenv ("GNU_MAKE_NO_CUSTOMS") != 0)
-        {
-          inited = -1;
-          return 0;
-        }
-
-      /* For secure Customs, make is installed setuid root and
-         Customs requires a privileged source port be used.  */
-      make_access ();
-
-      if (ISDB (DB_JOBS))
-        Rpc_Debug (1);
-
-      /* Ping the daemon once to see if it is there.  */
-      inited = Customs_Ping () == RPC_SUCCESS ? 1 : -1;
-
-      /* Return to normal user access.  */
-      user_access ();
-
-      if (starting_directory == 0)
-        /* main couldn't figure it out.  */
-        inited = -1;
-      else
-        {
-          /* Normalize the current directory path name to something
-             that should work on all machines exported to.  */
-
-          normalized_cwd = xmalloc (GET_PATH_MAX);
-          strcpy (normalized_cwd, starting_directory);
-          if (Customs_NormPath (normalized_cwd, GET_PATH_MAX) < 0)
-            /* Path normalization failure means using Customs
-               won't work, but it's not really an error.  */
-            inited = -1;
-        }
-    }
-
-  if (inited < 0)
-    return 0;
-
-  njobs = job_slots_used;
-  if (!first_p)
-    njobs -= 1;         /* correction for being called from reap_children() */
-
-  /* the first job should run locally, or, if the -l flag is given, we use
-     that as clue as to how many local jobs should be scheduled locally */
-  if (max_load_average < 0 && njobs == 0 || njobs < max_load_average)
-     return 0;
-
-  status = Customs_Host (EXPORT_SAME, &permit);
-  if (status != RPC_SUCCESS)
-    {
-      DB (DB_JOBS, (_("Customs won't export: %s\n"),
-                    Rpc_ErrorMessage (status)));
-      return 0;
-    }
-
-  return !CUSTOMS_FAIL (&permit.addr);
-}
-\f
-/* Start a remote job running the command in ARGV, with environment from
-   ENVP.  It gets standard input from STDIN_FD.  On failure, return
-   nonzero.  On success, return zero, and set *USED_STDIN to nonzero if it
-   will actually use STDIN_FD, zero if not, set *ID_PTR to a unique
-   identification, and set *IS_REMOTE to nonzero if the job is remote, zero
-   if it is local (meaning *ID_PTR is a process ID).  */
-
-int
-start_remote_job (char **argv, char **envp, int stdin_fd,
-                  int *is_remote, int *id_ptr, int *used_stdin)
-{
-  char waybill[MAX_DATA_SIZE], msg[128];
-  struct hostent *host;
-  struct timeval timeout;
-  struct sockaddr_in sin;
-  int len;
-  int retsock, retport, sock;
-  Rpc_Stat status;
-  int pid;
-
-  /* Create the return socket.  */
-  retsock = Rpc_UdpCreate (True, 0);
-  if (retsock < 0)
-    {
-      O (error, NILF, "exporting: Couldn't create return socket.");
-      return 1;
-    }
-
-  /* Get the return socket's port number.  */
-  len = sizeof (sin);
-  if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0)
-    {
-      (void) close (retsock);
-      perror_with_name ("exporting: ", "getsockname");
-      return 1;
-    }
-  retport = sin.sin_port;
-
-  /* Create the TCP socket for talking to the remote child.  */
-  sock = Rpc_TcpCreate (False, 0);
-
-  /* Create a WayBill to give to the server.  */
-  len = Customs_MakeWayBill (&permit, normalized_cwd, argv[0], argv,
-                             envp, retport, waybill);
-
-  /* Modify the waybill as if the remote child had done 'child_access ()'.  */
-  {
-    WayBill *wb = (WayBill *) waybill;
-    wb->ruid = wb->euid;
-    wb->rgid = wb->egid;
-  }
-
-  /* Send the request to the server, timing out in 20 seconds.  */
-  timeout.tv_usec = 0;
-  timeout.tv_sec = 20;
-  sin.sin_family = AF_INET;
-  sin.sin_port = htons (Customs_Port ());
-  sin.sin_addr = permit.addr;
-  status = Rpc_Call (sock, &sin, (Rpc_Proc) CUSTOMS_IMPORT,
-                     len, (Rpc_Opaque) waybill,
-                     sizeof (msg), (Rpc_Opaque) msg,
-                     1, &timeout);
-
-  host = gethostbyaddr ((char *)&permit.addr, sizeof(permit.addr), AF_INET);
-
-  {
-    const char *hnm = host ? host->h_name : inet_ntoa (permit.addr);
-    size_t hlen = strlen (hnm);
-
-    if (status != RPC_SUCCESS)
-      {
-        const char *err = Rpc_ErrorMessage (status);
-        (void) close (retsock);
-        (void) close (sock);
-        error (NILF, hlen + strlen (err),
-               "exporting to %s: %s", hnm, err);
-        return 1;
-      }
-    else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0')
-      {
-        (void) close (retsock);
-        (void) close (sock);
-        error (NILF, hlen + strlen (msg), "exporting to %s: %s", hnm, msg);
-        return 1;
-      }
-    else
-      {
-        error (NILF, hlen + INTSTR_LENGTH,
-               "*** exported to %s (id %u)", hnm, permit.id);
-      }
-
-    fflush (stdout);
-    fflush (stderr);
-  }
-
-  pid = vfork ();
-  if (pid < 0)
-    {
-      /* The fork failed!  */
-      perror_with_name ("fork", "");
-      return 1;
-    }
-  else if (pid == 0)
-    {
-      /* Child side.  Run 'export' to handle the connection.  */
-      static char sock_buf[20], retsock_buf[20], id_buf[20];
-      static char *new_argv[6] =
-        { EXPORT_COMMAND, "-id", sock_buf, retsock_buf, id_buf, 0 };
-
-      /* Set up the arguments.  */
-      (void) sprintf (sock_buf, "%d", sock);
-      (void) sprintf (retsock_buf, "%d", retsock);
-      (void) sprintf (id_buf, "%x", permit.id);
-
-      /* Get the right stdin.  */
-      if (stdin_fd != 0)
-        (void) dup2 (stdin_fd, 0);
-
-      /* Unblock signals in the child.  */
-      unblock_sigs ();
-
-      /* Run the command.  */
-      exec_command (new_argv, envp);
-    }
-
-  /* Parent side.  Return the 'export' process's ID.  */
-  (void) close (retsock);
-  (void) close (sock);
-  *is_remote = 0;
-  *id_ptr = pid;
-  *used_stdin = 1;
-  return 0;
-}
-\f
-/* Get the status of a dead remote child.  Block waiting for one to die
-   if BLOCK is nonzero.  Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR
-   to the termination signal or zero if it exited normally, and *COREDUMP_PTR
-   nonzero if it dumped core.  Return the ID of the child that died,
-   0 if we would have to block and !BLOCK, or < 0 if there were none.  */
-
-int
-remote_status (int *exit_code_ptr, int *signal_ptr, int *coredump_ptr,
-               int block)
-{
-  return -1;
-}
-
-/* Block asynchronous notification of remote child death.
-   If this notification is done by raising the child termination
-   signal, do not block that signal.  */
-void
-block_remote_children (void)
-{
-  return;
-}
-
-/* Restore asynchronous notification of remote child death.
-   If this is done by raising the child termination signal,
-   do not unblock that signal.  */
-void
-unblock_remote_children (void)
-{
-  return;
-}
-
-/* Send signal SIG to child ID.  Return 0 if successful, -1 if not.  */
-int
-remote_kill (int id, int sig)
-{
-  return -1;
-}
diff --git a/remote-stub.c b/remote-stub.c
deleted file mode 100644 (file)
index 8e31a20..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/* Template for the remote job exportation interface to GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "job.h"
-#include "commands.h"
-
-
-char *remote_description = 0;
-
-/* Call once at startup even if no commands are run.  */
-
-void
-remote_setup (void)
-{
-}
-
-/* Called before exit.  */
-
-void
-remote_cleanup (void)
-{
-}
-\f
-/* Return nonzero if the next job should be done remotely.  */
-
-int
-start_remote_job_p (int first_p UNUSED)
-{
-  return 0;
-}
-\f
-/* Start a remote job running the command in ARGV,
-   with environment from ENVP.  It gets standard input from STDIN_FD.  On
-   failure, return nonzero.  On success, return zero, and set *USED_STDIN
-   to nonzero if it will actually use STDIN_FD, zero if not, set *ID_PTR to
-   a unique identification, and set *IS_REMOTE to zero if the job is local,
-   nonzero if it is remote (meaning *ID_PTR is a process ID).  */
-
-int
-start_remote_job (char **argv UNUSED, char **envp UNUSED, int stdin_fd UNUSED,
-                  int *is_remote UNUSED, int *id_ptr UNUSED,
-                  int *used_stdin UNUSED)
-{
-  return -1;
-}
-\f
-/* Get the status of a dead remote child.  Block waiting for one to die
-   if BLOCK is nonzero.  Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR
-   to the termination signal or zero if it exited normally, and *COREDUMP_PTR
-   nonzero if it dumped core.  Return the ID of the child that died,
-   0 if we would have to block and !BLOCK, or < 0 if there were none.  */
-
-int
-remote_status (int *exit_code_ptr UNUSED, int *signal_ptr UNUSED,
-               int *coredump_ptr UNUSED, int block UNUSED)
-{
-  errno = ECHILD;
-  return -1;
-}
-
-/* Block asynchronous notification of remote child death.
-   If this notification is done by raising the child termination
-   signal, do not block that signal.  */
-void
-block_remote_children (void)
-{
-  return;
-}
-
-/* Restore asynchronous notification of remote child death.
-   If this is done by raising the child termination signal,
-   do not unblock that signal.  */
-void
-unblock_remote_children (void)
-{
-  return;
-}
-
-/* Send signal SIG to child ID.  Return 0 if successful, -1 if not.  */
-int
-remote_kill (int id UNUSED, int sig UNUSED)
-{
-  return -1;
-}
diff --git a/rule.c b/rule.c
deleted file mode 100644 (file)
index de8b304..0000000
--- a/rule.c
+++ /dev/null
@@ -1,534 +0,0 @@
-/* Pattern and suffix rule internals for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "filedef.h"
-#include "dep.h"
-#include "job.h"
-#include "commands.h"
-#include "variable.h"
-#include "rule.h"
-
-static void freerule (struct rule *rule, struct rule *lastrule);
-\f
-/* Chain of all pattern rules.  */
-
-struct rule *pattern_rules;
-
-/* Pointer to last rule in the chain, so we can add onto the end.  */
-
-struct rule *last_pattern_rule;
-
-/* Number of rules in the chain.  */
-
-unsigned int num_pattern_rules;
-
-/* Maximum number of target patterns of any pattern rule.  */
-
-unsigned int max_pattern_targets;
-
-/* Maximum number of dependencies of any pattern rule.  */
-
-unsigned int max_pattern_deps;
-
-/* Maximum length of the name of a dependencies of any pattern rule.  */
-
-unsigned int max_pattern_dep_length;
-
-/* Pointer to structure for the file .SUFFIXES
-   whose dependencies are the suffixes to be searched.  */
-
-struct file *suffix_file;
-
-/* Maximum length of a suffix.  */
-
-unsigned int maxsuffix;
-\f
-/* Compute the maximum dependency length and maximum number of
-   dependencies of all implicit rules.  Also sets the subdir
-   flag for a rule when appropriate, possibly removing the rule
-   completely when appropriate.  */
-
-void
-count_implicit_rule_limits (void)
-{
-  char *name;
-  int namelen;
-  struct rule *rule;
-
-  num_pattern_rules = max_pattern_targets = max_pattern_deps = 0;
-  max_pattern_dep_length = 0;
-
-  name = 0;
-  namelen = 0;
-  rule = pattern_rules;
-  while (rule != 0)
-    {
-      unsigned int ndeps = 0;
-      struct dep *dep;
-      struct rule *next = rule->next;
-
-      ++num_pattern_rules;
-
-      if (rule->num > max_pattern_targets)
-        max_pattern_targets = rule->num;
-
-      for (dep = rule->deps; dep != 0; dep = dep->next)
-        {
-          const char *dname = dep_name (dep);
-          unsigned int len = strlen (dname);
-
-#ifdef VMS
-          const char *p = strrchr (dname, ']');
-          const char *p2;
-          if (p == 0)
-            p = strrchr (dname, ':');
-          p2 = p != 0 ? strchr (dname, '%') : 0;
-#else
-          const char *p = strrchr (dname, '/');
-          const char *p2 = p != 0 ? strchr (dname, '%') : 0;
-#endif
-          ndeps++;
-
-          if (len > max_pattern_dep_length)
-            max_pattern_dep_length = len;
-
-          if (p != 0 && p2 > p)
-            {
-              /* There is a slash before the % in the dep name.
-                 Extract the directory name.  */
-              if (p == dname)
-                ++p;
-              if (p - dname > namelen)
-                {
-                  namelen = p - dname;
-                  name = xrealloc (name, namelen + 1);
-                }
-              memcpy (name, dname, p - dname);
-              name[p - dname] = '\0';
-
-              /* In the deps of an implicit rule the 'changed' flag
-                 actually indicates that the dependency is in a
-                 nonexistent subdirectory.  */
-
-              dep->changed = !dir_file_exists_p (name, "");
-            }
-          else
-            /* This dependency does not reside in a subdirectory.  */
-            dep->changed = 0;
-        }
-
-      if (ndeps > max_pattern_deps)
-        max_pattern_deps = ndeps;
-
-      rule = next;
-    }
-
-  free (name);
-}
-\f
-/* Create a pattern rule from a suffix rule.
-   TARGET is the target suffix; SOURCE is the source suffix.
-   CMDS are the commands.
-   If TARGET is nil, it means the target pattern should be '(%.o)'.
-   If SOURCE is nil, it means there should be no deps.  */
-
-static void
-convert_suffix_rule (const char *target, const char *source,
-                     struct commands *cmds)
-{
-  const char **names, **percents;
-  struct dep *deps;
-
-  names = xmalloc (sizeof (const char *));
-  percents = xmalloc (sizeof (const char *));
-
-  if (target == 0)
-    {
-      /* Special case: TARGET being nil means we are defining a '.X.a' suffix
-         rule; the target pattern is always '(%.o)'.  */
-#ifdef VMS
-      *names = strcache_add_len ("(%.obj)", 7);
-#else
-      *names = strcache_add_len ("(%.o)", 5);
-#endif
-      *percents = *names + 1;
-    }
-  else
-    {
-      /* Construct the target name.  */
-      unsigned int len = strlen (target);
-      char *p = alloca (1 + len + 1);
-      p[0] = '%';
-      memcpy (p + 1, target, len + 1);
-      *names = strcache_add_len (p, len + 1);
-      *percents = *names;
-    }
-
-  if (source == 0)
-    deps = 0;
-  else
-    {
-      /* Construct the dependency name.  */
-      unsigned int len = strlen (source);
-      char *p = alloca (1 + len + 1);
-      p[0] = '%';
-      memcpy (p + 1, source, len + 1);
-      deps = alloc_dep ();
-      deps->name = strcache_add_len (p, len + 1);
-    }
-
-  create_pattern_rule (names, percents, 1, 0, deps, cmds, 0);
-}
-
-/* Convert old-style suffix rules to pattern rules.
-   All rules for the suffixes on the .SUFFIXES list are converted and added to
-   the chain of pattern rules.  */
-
-void
-convert_to_pattern (void)
-{
-  struct dep *d, *d2;
-  char *rulename;
-
-  /* We will compute every potential suffix rule (.x.y) from the list of
-     suffixes in the .SUFFIXES target's dependencies and see if it exists.
-     First find the longest of the suffixes.  */
-
-  maxsuffix = 0;
-  for (d = suffix_file->deps; d != 0; d = d->next)
-    {
-      unsigned int l = strlen (dep_name (d));
-      if (l > maxsuffix)
-        maxsuffix = l;
-    }
-
-  /* Space to construct the suffix rule target name.  */
-  rulename = alloca ((maxsuffix * 2) + 1);
-
-  for (d = suffix_file->deps; d != 0; d = d->next)
-    {
-      unsigned int slen;
-
-      /* Make a rule that is just the suffix, with no deps or commands.
-         This rule exists solely to disqualify match-anything rules.  */
-      convert_suffix_rule (dep_name (d), 0, 0);
-
-      if (d->file->cmds != 0)
-        /* Record a pattern for this suffix's null-suffix rule.  */
-        convert_suffix_rule ("", dep_name (d), d->file->cmds);
-
-      /* Add every other suffix to this one and see if it exists as a
-         two-suffix rule.  */
-      slen = strlen (dep_name (d));
-      memcpy (rulename, dep_name (d), slen);
-
-      for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
-        {
-          struct file *f;
-          unsigned int s2len;
-
-          s2len = strlen (dep_name (d2));
-
-          /* Can't build something from itself.  */
-          if (slen == s2len && streq (dep_name (d), dep_name (d2)))
-            continue;
-
-          memcpy (rulename + slen, dep_name (d2), s2len + 1);
-          f = lookup_file (rulename);
-          if (f == 0 || f->cmds == 0)
-            continue;
-
-          if (s2len == 2 && rulename[slen] == '.' && rulename[slen + 1] == 'a')
-            /* A suffix rule '.X.a:' generates the pattern rule '(%.o): %.X'.
-               It also generates a normal '%.a: %.X' rule below.  */
-            convert_suffix_rule (NULL, /* Indicates '(%.o)'.  */
-                                 dep_name (d),
-                                 f->cmds);
-
-          /* The suffix rule '.X.Y:' is converted
-             to the pattern rule '%.Y: %.X'.  */
-          convert_suffix_rule (dep_name (d2), dep_name (d), f->cmds);
-        }
-    }
-}
-
-
-/* Install the pattern rule RULE (whose fields have been filled in) at the end
-   of the list (so that any rules previously defined will take precedence).
-   If this rule duplicates a previous one (identical target and dependencies),
-   the old one is replaced if OVERRIDE is nonzero, otherwise this new one is
-   thrown out.  When an old rule is replaced, the new one is put at the end of
-   the list.  Return nonzero if RULE is used; zero if not.  */
-
-static int
-new_pattern_rule (struct rule *rule, int override)
-{
-  struct rule *r, *lastrule;
-  unsigned int i, j;
-
-  rule->in_use = 0;
-  rule->terminal = 0;
-
-  rule->next = 0;
-
-  /* Search for an identical rule.  */
-  lastrule = 0;
-  for (r = pattern_rules; r != 0; lastrule = r, r = r->next)
-    for (i = 0; i < rule->num; ++i)
-      {
-        for (j = 0; j < r->num; ++j)
-          if (!streq (rule->targets[i], r->targets[j]))
-            break;
-        /* If all the targets matched...  */
-        if (j == r->num)
-          {
-            struct dep *d, *d2;
-            for (d = rule->deps, d2 = r->deps;
-                 d != 0 && d2 != 0; d = d->next, d2 = d2->next)
-              if (!streq (dep_name (d), dep_name (d2)))
-                break;
-            if (d == 0 && d2 == 0)
-              {
-                /* All the dependencies matched.  */
-                if (override)
-                  {
-                    /* Remove the old rule.  */
-                    freerule (r, lastrule);
-                    /* Install the new one.  */
-                    if (pattern_rules == 0)
-                      pattern_rules = rule;
-                    else
-                      last_pattern_rule->next = rule;
-                    last_pattern_rule = rule;
-
-                    /* We got one.  Stop looking.  */
-                    goto matched;
-                  }
-                else
-                  {
-                    /* The old rule stays intact.  Destroy the new one.  */
-                    freerule (rule, (struct rule *) 0);
-                    return 0;
-                  }
-              }
-          }
-      }
-
- matched:;
-
-  if (r == 0)
-    {
-      /* There was no rule to replace.  */
-      if (pattern_rules == 0)
-        pattern_rules = rule;
-      else
-        last_pattern_rule->next = rule;
-      last_pattern_rule = rule;
-    }
-
-  return 1;
-}
-
-
-/* Install an implicit pattern rule based on the three text strings
-   in the structure P points to.  These strings come from one of
-   the arrays of default implicit pattern rules.
-   TERMINAL specifies what the 'terminal' field of the rule should be.  */
-
-void
-install_pattern_rule (struct pspec *p, int terminal)
-{
-  struct rule *r;
-  const char *ptr;
-
-  r = xmalloc (sizeof (struct rule));
-
-  r->num = 1;
-  r->targets = xmalloc (sizeof (const char *));
-  r->suffixes = xmalloc (sizeof (const char *));
-  r->lens = xmalloc (sizeof (unsigned int));
-
-  r->lens[0] = strlen (p->target);
-  r->targets[0] = p->target;
-  r->suffixes[0] = find_percent_cached (&r->targets[0]);
-  assert (r->suffixes[0] != NULL);
-  ++r->suffixes[0];
-
-  ptr = p->dep;
-  r->deps = PARSE_SIMPLE_SEQ ((char **)&ptr, struct dep);
-
-  if (new_pattern_rule (r, 0))
-    {
-      r->terminal = terminal;
-      r->cmds = xmalloc (sizeof (struct commands));
-      r->cmds->fileinfo.filenm = 0;
-      r->cmds->fileinfo.lineno = 0;
-      r->cmds->fileinfo.offset = 0;
-      /* These will all be string literals, but we malloc space for them
-         anyway because somebody might want to free them later.  */
-      r->cmds->commands = xstrdup (p->commands);
-      r->cmds->command_lines = 0;
-      r->cmds->recipe_prefix = RECIPEPREFIX_DEFAULT;
-    }
-}
-
-
-/* Free all the storage used in RULE and take it out of the
-   pattern_rules chain.  LASTRULE is the rule whose next pointer
-   points to RULE.  */
-
-static void
-freerule (struct rule *rule, struct rule *lastrule)
-{
-  struct rule *next = rule->next;
-
-  free_dep_chain (rule->deps);
-
-  /* MSVC erroneously warns without a cast here.  */
-  free ((void *)rule->targets);
-  free ((void *)rule->suffixes);
-  free (rule->lens);
-
-  /* We can't free the storage for the commands because there
-     are ways that they could be in more than one place:
-       * If the commands came from a suffix rule, they could also be in
-       the 'struct file's for other suffix rules or plain targets given
-       on the same makefile line.
-       * If two suffixes that together make a two-suffix rule were each
-       given twice in the .SUFFIXES list, and in the proper order, two
-       identical pattern rules would be created and the second one would
-       be discarded here, but both would contain the same 'struct commands'
-       pointer from the 'struct file' for the suffix rule.  */
-
-  free (rule);
-
-  if (pattern_rules == rule)
-    if (lastrule != 0)
-      abort ();
-    else
-      pattern_rules = next;
-  else if (lastrule != 0)
-    lastrule->next = next;
-  if (last_pattern_rule == rule)
-    last_pattern_rule = lastrule;
-}
-\f
-/* Create a new pattern rule with the targets in the nil-terminated array
-   TARGETS.  TARGET_PERCENTS is an array of pointers to the % in each element
-   of TARGETS.  N is the number of items in the array (not counting the nil
-   element).  The new rule has dependencies DEPS and commands from COMMANDS.
-   It is a terminal rule if TERMINAL is nonzero.  This rule overrides
-   identical rules with different commands if OVERRIDE is nonzero.
-
-   The storage for TARGETS and its elements and TARGET_PERCENTS is used and
-   must not be freed until the rule is destroyed.  */
-
-void
-create_pattern_rule (const char **targets, const char **target_percents,
-                     unsigned int n, int terminal, struct dep *deps,
-                     struct commands *commands, int override)
-{
-  unsigned int i;
-  struct rule *r = xmalloc (sizeof (struct rule));
-
-  r->num = n;
-  r->cmds = commands;
-  r->deps = deps;
-  r->targets = targets;
-  r->suffixes = target_percents;
-  r->lens = xmalloc (n * sizeof (unsigned int));
-
-  for (i = 0; i < n; ++i)
-    {
-      r->lens[i] = strlen (targets[i]);
-      assert (r->suffixes[i] != NULL);
-      ++r->suffixes[i];
-    }
-
-  if (new_pattern_rule (r, override))
-    r->terminal = terminal;
-}
-\f
-/* Print the data base of rules.  */
-
-static void                     /* Useful to call from gdb.  */
-print_rule (struct rule *r)
-{
-  unsigned int i;
-
-  for (i = 0; i < r->num; ++i)
-    {
-      fputs (r->targets[i], stdout);
-      putchar ((i + 1 == r->num) ? ':' : ' ');
-    }
-  if (r->terminal)
-    putchar (':');
-
-  print_prereqs (r->deps);
-
-  if (r->cmds != 0)
-    print_commands (r->cmds);
-}
-
-void
-print_rule_data_base (void)
-{
-  unsigned int rules, terminal;
-  struct rule *r;
-
-  puts (_("\n# Implicit Rules"));
-
-  rules = terminal = 0;
-  for (r = pattern_rules; r != 0; r = r->next)
-    {
-      ++rules;
-
-      putchar ('\n');
-      print_rule (r);
-
-      if (r->terminal)
-        ++terminal;
-    }
-
-  if (rules == 0)
-    puts (_("\n# No implicit rules."));
-  else
-    {
-      printf (_("\n# %u implicit rules, %u"), rules, terminal);
-#ifndef NO_FLOAT
-      printf (" (%.1f%%)", (double) terminal / (double) rules * 100.0);
-#else
-      {
-        int f = (terminal * 1000 + 5) / rules;
-        printf (" (%d.%d%%)", f/10, f%10);
-      }
-#endif
-      puts (_(" terminal."));
-    }
-
-  if (num_pattern_rules != rules)
-    {
-      /* This can happen if a fatal error was detected while reading the
-         makefiles and thus count_implicit_rule_limits wasn't called yet.  */
-      if (num_pattern_rules != 0)
-        ONN (fatal, NILF, _("BUG: num_pattern_rules is wrong!  %u != %u"),
-             num_pattern_rules, rules);
-    }
-}
diff --git a/rule.h b/rule.h
deleted file mode 100644 (file)
index 9156b8e..0000000
--- a/rule.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Definitions for using pattern rules in GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* Structure used for pattern (implicit) rules.  */
-
-struct rule
-  {
-    struct rule *next;
-    const char **targets;       /* Targets of the rule.  */
-    unsigned int *lens;         /* Lengths of each target.  */
-    const char **suffixes;      /* Suffixes (after '%') of each target.  */
-    struct dep *deps;           /* Dependencies of the rule.  */
-    struct commands *cmds;      /* Commands to execute.  */
-    unsigned short num;         /* Number of targets.  */
-    char terminal;              /* If terminal (double-colon).  */
-    char in_use;                /* If in use by a parent pattern_search.  */
-  };
-
-/* For calling install_pattern_rule.  */
-struct pspec
-  {
-    const char *target, *dep, *commands;
-  };
-
-
-extern struct rule *pattern_rules;
-extern struct rule *last_pattern_rule;
-extern unsigned int num_pattern_rules;
-
-extern unsigned int max_pattern_deps;
-extern unsigned int max_pattern_targets;
-extern unsigned int max_pattern_dep_length;
-
-extern struct file *suffix_file;
-extern unsigned int maxsuffix;
-
-
-void count_implicit_rule_limits (void);
-void convert_to_pattern (void);
-void install_pattern_rule (struct pspec *p, int terminal);
-void create_pattern_rule (const char **targets, const char **target_percents,
-                          unsigned int num, int terminal, struct dep *deps,
-                          struct commands *commands, int override);
-void print_rule_data_base (void);
diff --git a/signame.c b/signame.c
deleted file mode 100644 (file)
index 55646e9..0000000
--- a/signame.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/* Convert between signal names and numbers.
-Copyright (C) 1990-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-/* If the system provides strsignal, we don't need it. */
-
-#if !HAVE_STRSIGNAL
-
-/* If the system provides sys_siglist, we'll use that.
-   Otherwise create our own.
- */
-
-#if !HAVE_DECL_SYS_SIGLIST
-
-/* Some systems do not define NSIG in <signal.h>.  */
-#ifndef NSIG
-#ifdef  _NSIG
-#define NSIG    _NSIG
-#else
-#define NSIG    32
-#endif
-#endif
-
-/* There is too much variation in Sys V signal numbers and names, so
-   we must initialize them at runtime.  */
-
-static const char *undoc;
-
-static const char *sys_siglist[NSIG];
-
-/* Table of abbreviations for signals.  Note:  A given number can
-   appear more than once with different abbreviations.  */
-#define SIG_TABLE_SIZE  (NSIG*2)
-
-typedef struct
-  {
-    int number;
-    const char *abbrev;
-  } num_abbrev;
-
-static num_abbrev sig_table[SIG_TABLE_SIZE];
-
-/* Number of elements of sig_table used.  */
-static int sig_table_nelts = 0;
-
-/* Enter signal number NUMBER into the tables with ABBREV and NAME.  */
-
-static void
-init_sig (int number, const char *abbrev, const char *name)
-{
-  /* If this value is ever greater than NSIG it seems like it'd be a bug in
-     the system headers, but... better safe than sorry.  We know, for
-     example, that this isn't always true on VMS.  */
-
-  if (number >= 0 && number < NSIG)
-    sys_siglist[number] = name;
-
-  if (sig_table_nelts < SIG_TABLE_SIZE)
-    {
-      sig_table[sig_table_nelts].number = number;
-      sig_table[sig_table_nelts++].abbrev = abbrev;
-    }
-}
-
-static int
-signame_init (void)
-{
-  int i;
-
-  undoc = xstrdup (_("unknown signal"));
-
-  /* Initialize signal names.  */
-  for (i = 0; i < NSIG; i++)
-    sys_siglist[i] = undoc;
-
-  /* Initialize signal names.  */
-#if defined (SIGHUP)
-  init_sig (SIGHUP, "HUP", _("Hangup"));
-#endif
-#if defined (SIGINT)
-  init_sig (SIGINT, "INT", _("Interrupt"));
-#endif
-#if defined (SIGQUIT)
-  init_sig (SIGQUIT, "QUIT", _("Quit"));
-#endif
-#if defined (SIGILL)
-  init_sig (SIGILL, "ILL", _("Illegal Instruction"));
-#endif
-#if defined (SIGTRAP)
-  init_sig (SIGTRAP, "TRAP", _("Trace/breakpoint trap"));
-#endif
-  /* If SIGIOT == SIGABRT, we want to print it as SIGABRT because
-     SIGABRT is in ANSI and POSIX.1 and SIGIOT isn't.  */
-#if defined (SIGABRT)
-  init_sig (SIGABRT, "ABRT", _("Aborted"));
-#endif
-#if defined (SIGIOT)
-  init_sig (SIGIOT, "IOT", _("IOT trap"));
-#endif
-#if defined (SIGEMT)
-  init_sig (SIGEMT, "EMT", _("EMT trap"));
-#endif
-#if defined (SIGFPE)
-  init_sig (SIGFPE, "FPE", _("Floating point exception"));
-#endif
-#if defined (SIGKILL)
-  init_sig (SIGKILL, "KILL", _("Killed"));
-#endif
-#if defined (SIGBUS)
-  init_sig (SIGBUS, "BUS", _("Bus error"));
-#endif
-#if defined (SIGSEGV)
-  init_sig (SIGSEGV, "SEGV", _("Segmentation fault"));
-#endif
-#if defined (SIGSYS)
-  init_sig (SIGSYS, "SYS", _("Bad system call"));
-#endif
-#if defined (SIGPIPE)
-  init_sig (SIGPIPE, "PIPE", _("Broken pipe"));
-#endif
-#if defined (SIGALRM)
-  init_sig (SIGALRM, "ALRM", _("Alarm clock"));
-#endif
-#if defined (SIGTERM)
-  init_sig (SIGTERM, "TERM", _("Terminated"));
-#endif
-#if defined (SIGUSR1)
-  init_sig (SIGUSR1, "USR1", _("User defined signal 1"));
-#endif
-#if defined (SIGUSR2)
-  init_sig (SIGUSR2, "USR2", _("User defined signal 2"));
-#endif
-  /* If SIGCLD == SIGCHLD, we want to print it as SIGCHLD because that
-     is what is in POSIX.1.  */
-#if defined (SIGCHLD)
-  init_sig (SIGCHLD, "CHLD", _("Child exited"));
-#endif
-#if defined (SIGCLD)
-  init_sig (SIGCLD, "CLD", _("Child exited"));
-#endif
-#if defined (SIGPWR)
-  init_sig (SIGPWR, "PWR", _("Power failure"));
-#endif
-#if defined (SIGTSTP)
-  init_sig (SIGTSTP, "TSTP", _("Stopped"));
-#endif
-#if defined (SIGTTIN)
-  init_sig (SIGTTIN, "TTIN", _("Stopped (tty input)"));
-#endif
-#if defined (SIGTTOU)
-  init_sig (SIGTTOU, "TTOU", _("Stopped (tty output)"));
-#endif
-#if defined (SIGSTOP)
-  init_sig (SIGSTOP, "STOP", _("Stopped (signal)"));
-#endif
-#if defined (SIGXCPU)
-  init_sig (SIGXCPU, "XCPU", _("CPU time limit exceeded"));
-#endif
-#if defined (SIGXFSZ)
-  init_sig (SIGXFSZ, "XFSZ", _("File size limit exceeded"));
-#endif
-#if defined (SIGVTALRM)
-  init_sig (SIGVTALRM, "VTALRM", _("Virtual timer expired"));
-#endif
-#if defined (SIGPROF)
-  init_sig (SIGPROF, "PROF", _("Profiling timer expired"));
-#endif
-#if defined (SIGWINCH)
-  /* "Window size changed" might be more accurate, but even if that
-     is all that it means now, perhaps in the future it will be
-     extended to cover other kinds of window changes.  */
-  init_sig (SIGWINCH, "WINCH", _("Window changed"));
-#endif
-#if defined (SIGCONT)
-  init_sig (SIGCONT, "CONT", _("Continued"));
-#endif
-#if defined (SIGURG)
-  init_sig (SIGURG, "URG", _("Urgent I/O condition"));
-#endif
-#if defined (SIGIO)
-  /* "I/O pending" has also been suggested.  A disadvantage is that signal
-     only happens when the process has asked for it, not every time I/O is
-     pending.  Another disadvantage is the confusion from giving it a
-     different name than under Unix.  */
-  init_sig (SIGIO, "IO", _("I/O possible"));
-#endif
-#if defined (SIGWIND)
-  init_sig (SIGWIND, "WIND", _("SIGWIND"));
-#endif
-#if defined (SIGPHONE)
-  init_sig (SIGPHONE, "PHONE", _("SIGPHONE"));
-#endif
-#if defined (SIGPOLL)
-  init_sig (SIGPOLL, "POLL", _("I/O possible"));
-#endif
-#if defined (SIGLOST)
-  init_sig (SIGLOST, "LOST", _("Resource lost"));
-#endif
-#if defined (SIGDANGER)
-  init_sig (SIGDANGER, "DANGER", _("Danger signal"));
-#endif
-#if defined (SIGINFO)
-  init_sig (SIGINFO, "INFO", _("Information request"));
-#endif
-#if defined (SIGNOFP)
-  init_sig (SIGNOFP, "NOFP", _("Floating point co-processor not available"));
-#endif
-
-  return 1;
-}
-
-#endif  /* HAVE_DECL_SYS_SIGLIST */
-
-
-char *
-strsignal (int sig)
-{
-  static char buf[] = "Signal 12345678901234567890";
-
-#if ! HAVE_DECL_SYS_SIGLIST
-# if HAVE_DECL__SYS_SIGLIST
-#  define sys_siglist _sys_siglist
-# elif HAVE_DECL___SYS_SIGLIST
-#  define sys_siglist __sys_siglist
-# else
-  static char sig_initted = 0;
-
-  if (!sig_initted)
-    sig_initted = signame_init ();
-# endif
-#endif
-
-  if (sig > 0 && sig < NSIG)
-    return (char *) sys_siglist[sig];
-
-  sprintf (buf, "Signal %d", sig);
-  return buf;
-}
-
-#endif  /* HAVE_STRSIGNAL */
diff --git a/src/amiga.c b/src/amiga.c
new file mode 100644 (file)
index 0000000..5189a02
--- /dev/null
@@ -0,0 +1,117 @@
+/* Running commands on Amiga
+Copyright (C) 1995-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "variable.h"
+#include "amiga.h"
+#include <assert.h>
+#include <exec/memory.h>
+#include <dos/dostags.h>
+#include <proto/exec.h>
+#include <proto/dos.h>
+
+static const char Amiga_version[] = "$VER: Make 3.74.3 (12.05.96) \n"
+                    "Amiga Port by A. Digulla (digulla@home.lake.de)";
+
+int
+MyExecute (char **argv)
+{
+    char * buffer, * ptr;
+    char ** aptr;
+    int len = 0;
+    int status;
+
+    for (aptr=argv; *aptr; aptr++)
+    {
+        len += strlen (*aptr) + 4;
+    }
+
+    buffer = AllocMem (len, MEMF_ANY);
+
+    if (!buffer)
+      O (fatal, NILF, "MyExecute: Cannot allocate space for calling a command\n");
+
+    ptr = buffer;
+
+    for (aptr=argv; *aptr; aptr++)
+    {
+        if (((*aptr)[0] == ';' && !(*aptr)[1]))
+        {
+            *ptr ++ = '"';
+            strcpy (ptr, *aptr);
+            ptr += strlen (ptr);
+            *ptr ++ = '"';
+        }
+        else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2])
+        {
+            *ptr ++ = '\n';
+            continue;
+        }
+        else
+        {
+            strcpy (ptr, *aptr);
+            ptr += strlen (ptr);
+        }
+        *ptr ++ = ' ';
+        *ptr = 0;
+    }
+
+    ptr[-1] = '\n';
+
+    status = SystemTags (buffer,
+        SYS_UserShell, TRUE,
+        TAG_END);
+
+    FreeMem (buffer, len);
+
+    if (SetSignal (0L,0L) & SIGBREAKF_CTRL_C)
+        status = 20;
+
+    /* Warnings don't count */
+    if (status == 5)
+        status = 0;
+
+    return status;
+}
+
+char *
+wildcard_expansion (char *wc, char *o)
+{
+#   define PATH_SIZE    1024
+    struct AnchorPath * apath;
+
+    if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE,
+            MEMF_CLEAR))
+        )
+    {
+        apath->ap_Strlen = PATH_SIZE;
+
+        if (MatchFirst (wc, apath) == 0)
+        {
+            do
+            {
+                o = variable_buffer_output (o, apath->ap_Buf,
+                        strlen (apath->ap_Buf));
+                o = variable_buffer_output (o, " ",1);
+            } while (MatchNext (apath) == 0);
+        }
+
+        MatchEnd (apath);
+        FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE);
+    }
+
+    return o;
+}
diff --git a/src/amiga.h b/src/amiga.h
new file mode 100644 (file)
index 0000000..5bc3531
--- /dev/null
@@ -0,0 +1,18 @@
+/* Definitions for amiga specific things
+Copyright (C) 1995-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int MyExecute (char ** argv);
+char * wildcard_expansion (char * wc, char * o);
diff --git a/src/ar.c b/src/ar.c
new file mode 100644 (file)
index 0000000..62919ff
--- /dev/null
+++ b/src/ar.c
@@ -0,0 +1,328 @@
+/* Interface to 'ar' archives for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#ifndef NO_ARCHIVES
+
+#include "filedef.h"
+#include "dep.h"
+#include <fnmatch.h>
+
+/* Return nonzero if NAME is an archive-member reference, zero if not.  An
+   archive-member reference is a name like 'lib(member)' where member is a
+   non-empty string.
+   If a name like 'lib((entry))' is used, a fatal error is signaled at
+   the attempt to use this unsupported feature.  */
+
+int
+ar_name (const char *name)
+{
+  const char *p = strchr (name, '(');
+  const char *end;
+
+  if (p == 0 || p == name)
+    return 0;
+
+  end = p + strlen (p) - 1;
+  if (*end != ')' || end == p + 1)
+    return 0;
+
+  if (p[1] == '(' && end[-1] == ')')
+    OS (fatal, NILF, _("attempt to use unsupported feature: '%s'"), name);
+
+  return 1;
+}
+
+
+/* Parse the archive-member reference NAME into the archive and member names.
+   Creates one allocated string containing both names, pointed to by ARNAME_P.
+   MEMNAME_P points to the member.  */
+
+void
+ar_parse_name (const char *name, char **arname_p, char **memname_p)
+{
+  char *p;
+
+  *arname_p = xstrdup (name);
+  p = strchr (*arname_p, '(');
+  *(p++) = '\0';
+  p[strlen (p) - 1] = '\0';
+  *memname_p = p;
+}
+\f
+
+/* This function is called by 'ar_scan' to find which member to look at.  */
+
+/* ARGSUSED */
+static long int
+ar_member_date_1 (int desc UNUSED, const char *mem, int truncated,
+                  long int hdrpos UNUSED, long int datapos UNUSED,
+                  long int size UNUSED, long int date,
+                  int uid UNUSED, int gid UNUSED, unsigned int mode UNUSED,
+                  const void *name)
+{
+  return ar_name_equal (name, mem, truncated) ? date : 0;
+}
+
+/* Return the modtime of NAME.  */
+
+time_t
+ar_member_date (const char *name)
+{
+  char *arname;
+  char *memname;
+  long int val;
+
+  ar_parse_name (name, &arname, &memname);
+
+  /* Make sure we know the modtime of the archive itself because we are
+     likely to be called just before commands to remake a member are run,
+     and they will change the archive itself.
+
+     But we must be careful not to enter_file the archive itself if it does
+     not exist, because pattern_search assumes that files found in the data
+     base exist or can be made.  */
+  {
+    struct file *arfile;
+    arfile = lookup_file (arname);
+    if (arfile == 0 && file_exists_p (arname))
+      arfile = enter_file (strcache_add (arname));
+
+    if (arfile != 0)
+      (void) f_mtime (arfile, 0);
+  }
+
+  val = ar_scan (arname, ar_member_date_1, memname);
+
+  free (arname);
+
+  return (val <= 0 ? (time_t) -1 : (time_t) val);
+}
+\f
+/* Set the archive-member NAME's modtime to now.  */
+
+#ifdef VMS
+int
+ar_touch (const char *name)
+{
+  O (error, NILF, _("touch archive member is not available on VMS"));
+  return -1;
+}
+#else
+int
+ar_touch (const char *name)
+{
+  char *arname, *memname;
+  int val;
+
+  ar_parse_name (name, &arname, &memname);
+
+  /* Make sure we know the modtime of the archive itself before we
+     touch the member, since this will change the archive modtime.  */
+  {
+    struct file *arfile;
+    arfile = enter_file (strcache_add (arname));
+    f_mtime (arfile, 0);
+  }
+
+  val = 1;
+  switch (ar_member_touch (arname, memname))
+    {
+    case -1:
+      OS (error, NILF, _("touch: Archive '%s' does not exist"), arname);
+      break;
+    case -2:
+      OS (error, NILF, _("touch: '%s' is not a valid archive"), arname);
+      break;
+    case -3:
+      perror_with_name ("touch: ", arname);
+      break;
+    case 1:
+      OSS (error, NILF,
+           _("touch: Member '%s' does not exist in '%s'"), memname, arname);
+      break;
+    case 0:
+      val = 0;
+      break;
+    default:
+      OS (error, NILF,
+          _("touch: Bad return code from ar_member_touch on '%s'"), name);
+    }
+
+  free (arname);
+
+  return val;
+}
+#endif /* !VMS */
+\f
+/* State of an 'ar_glob' run, passed to 'ar_glob_match'.  */
+
+/* On VMS, (object) modules in libraries do not have suffixes. That is, to
+   find a match for a pattern, the pattern must not have any suffix. So the
+   suffix of the pattern is saved and the pattern is stripped (ar_glob).
+   If there is a match and the match, which is a module name, is added to
+   the chain, the saved suffix is added back to construct a source filename
+   (ar_glob_match). */
+
+struct ar_glob_state
+  {
+    const char *arname;
+    const char *pattern;
+#ifdef VMS
+    char *suffix;
+#endif
+    size_t size;
+    struct nameseq *chain;
+    unsigned int n;
+  };
+
+/* This function is called by 'ar_scan' to match one archive
+   element against the pattern in STATE.  */
+
+static long int
+ar_glob_match (int desc UNUSED, const char *mem, int truncated UNUSED,
+               long int hdrpos UNUSED, long int datapos UNUSED,
+               long int size UNUSED, long int date UNUSED, int uid UNUSED,
+               int gid UNUSED, unsigned int mode UNUSED, const void *arg)
+{
+  struct ar_glob_state *state = (struct ar_glob_state *)arg;
+
+  if (fnmatch (state->pattern, mem, FNM_PATHNAME|FNM_PERIOD) == 0)
+    {
+      /* We have a match.  Add it to the chain.  */
+      struct nameseq *new = xcalloc (state->size);
+#ifdef VMS
+      if (state->suffix)
+        new->name = strcache_add(
+            concat(5, state->arname, "(", mem, state->suffix, ")"));
+      else
+#endif
+        new->name = strcache_add(concat(4, state->arname, "(", mem, ")"));
+      new->next = state->chain;
+      state->chain = new;
+      ++state->n;
+    }
+
+  return 0L;
+}
+
+/* Return nonzero if PATTERN contains any metacharacters.
+   Metacharacters can be quoted with backslashes if QUOTE is nonzero.  */
+static int
+ar_glob_pattern_p (const char *pattern, int quote)
+{
+  const char *p;
+  int opened = 0;
+
+  for (p = pattern; *p != '\0'; ++p)
+    switch (*p)
+      {
+      case '?':
+      case '*':
+        return 1;
+
+      case '\\':
+        if (quote)
+          ++p;
+        break;
+
+      case '[':
+        opened = 1;
+        break;
+
+      case ']':
+        if (opened)
+          return 1;
+        break;
+      }
+
+  return 0;
+}
+
+/* Glob for MEMBER_PATTERN in archive ARNAME.
+   Return a malloc'd chain of matching elements (or nil if none).  */
+
+struct nameseq *
+ar_glob (const char *arname, const char *member_pattern, size_t size)
+{
+  struct ar_glob_state state;
+  struct nameseq *n;
+  const char **names;
+  unsigned int i;
+#ifdef VMS
+  char *vms_member_pattern;
+#endif
+  if (! ar_glob_pattern_p (member_pattern, 1))
+    return 0;
+
+  /* Scan the archive for matches.
+     ar_glob_match will accumulate them in STATE.chain.  */
+  state.arname = arname;
+  state.pattern = member_pattern;
+#ifdef VMS
+    {
+      /* In a copy of the pattern, find the suffix, save it and  remove it from
+         the pattern */
+      char *lastdot;
+      vms_member_pattern = xstrdup(member_pattern);
+      lastdot = strrchr(vms_member_pattern, '.');
+      state.suffix = lastdot;
+      if (lastdot)
+        {
+          state.suffix = xstrdup(lastdot);
+          *lastdot = 0;
+        }
+      state.pattern = vms_member_pattern;
+    }
+#endif
+  state.size = size;
+  state.chain = 0;
+  state.n = 0;
+  ar_scan (arname, ar_glob_match, &state);
+
+#ifdef VMS
+  /* Deallocate any duplicated string */
+  free(vms_member_pattern);
+  if (state.suffix)
+    {
+      free(state.suffix);
+    }
+#endif
+
+  if (state.chain == 0)
+    return 0;
+
+  /* Now put the names into a vector for sorting.  */
+  names = alloca (state.n * sizeof (const char *));
+  i = 0;
+  for (n = state.chain; n != 0; n = n->next)
+    names[i++] = n->name;
+
+  /* Sort them alphabetically.  */
+  /* MSVC erroneously warns without a cast here.  */
+  qsort ((void *)names, i, sizeof (*names), alpha_compare);
+
+  /* Put them back into the chain in the sorted order.  */
+  i = 0;
+  for (n = state.chain; n != 0; n = n->next)
+    n->name = names[i++];
+
+  return state.chain;
+}
+
+#endif  /* Not NO_ARCHIVES.  */
diff --git a/src/arscan.c b/src/arscan.c
new file mode 100644 (file)
index 0000000..3ce21db
--- /dev/null
@@ -0,0 +1,961 @@
+/* Library function for scanning an archive file.
+Copyright (C) 1987-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#ifdef TEST
+/* Hack, the real error() routine eventually pulls in die from main.c */
+#define error(a, b, c, d)
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#include <sys/file.h>
+#endif
+
+#ifndef NO_ARCHIVES
+
+#ifdef VMS
+#include <lbrdef.h>
+#include <mhddef.h>
+#include <credef.h>
+#include <descrip.h>
+#include <ctype.h>
+#include <ssdef.h>
+#include <stsdef.h>
+#include <rmsdef.h>
+
+/* This symbol should be present in lbrdef.h. */
+#if !defined LBR$_HDRTRUNC
+#pragma extern_model save
+#pragma extern_model globalvalue
+extern unsigned int LBR$_HDRTRUNC;
+#pragma extern_model restore
+#endif
+
+#include <unixlib.h>
+#include <lbr$routines.h>
+
+const char *
+vmsify (const char *name, int type);
+
+/* Time conversion from VMS to Unix
+   Conversion from local time (stored in library) to GMT (needed for gmake)
+   Note: The tm_gmtoff element is a VMS extension to the ANSI standard. */
+static time_t
+vms_time_to_unix(void *vms_time)
+{
+  struct tm *tmp;
+  time_t unix_time;
+
+  unix_time = decc$fix_time(vms_time);
+  tmp = localtime(&unix_time);
+  unix_time -= tmp->tm_gmtoff;
+
+  return unix_time;
+}
+
+
+/* VMS library routines need static variables for callback */
+static void *VMS_lib_idx;
+
+static const void *VMS_saved_arg;
+
+static long int (*VMS_function) ();
+
+static long int VMS_function_ret;
+
+
+/* This is a callback procedure for lib$get_index */
+static int
+VMS_get_member_info(struct dsc$descriptor_s *module, unsigned long *rfa)
+{
+  int status, i;
+  const int truncated = 0; /* Member name may be truncated */
+  time_t member_date; /* Member date */
+  char *filename;
+  unsigned int buffer_length; /* Actual buffer length */
+
+  /* Unused constants - Make does not actually use most of these */
+  const int file_desc = -1; /* archive file descriptor for reading the data */
+  const int header_position = 0; /* Header position */
+  const int data_position = 0; /* Data position in file */
+  const int data_size = 0; /* Data size */
+  const int uid = 0; /* member gid */
+  const int gid = 0; /* member gid */
+  const int mode = 0; /* member protection mode */
+  /* End of unused constants */
+
+  static struct dsc$descriptor_s bufdesc =
+    { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
+
+  /* Only need the module definition */
+  struct mhddef *mhd;
+
+  /* If a previous callback is non-zero, just return that status */
+  if (VMS_function_ret)
+    {
+      return SS$_NORMAL;
+    }
+
+  /* lbr_set_module returns more than just the module header. So allocate
+     a buffer which is big enough: the maximum LBR$C_MAXHDRSIZ. That's at
+     least bigger than the size of struct mhddef.
+     If the request is too small, a buffer truncated warning is issued so
+     it can be reissued with a larger buffer.
+     We do not care if the buffer is truncated, so that is still a success. */
+  mhd = xmalloc(LBR$C_MAXHDRSIZ);
+  bufdesc.dsc$a_pointer = (char *) mhd;
+  bufdesc.dsc$w_length = LBR$C_MAXHDRSIZ;
+
+  status = lbr$set_module(&VMS_lib_idx, rfa, &bufdesc, &buffer_length, 0);
+
+  if ((status != LBR$_HDRTRUNC) && !$VMS_STATUS_SUCCESS(status))
+    {
+      ON(error, NILF,
+          _("lbr$set_module() failed to extract module info, status = %d"),
+          status);
+
+      lbr$close(&VMS_lib_idx);
+
+      return status;
+    }
+
+#ifdef TEST
+  /* When testing this code, it is useful to know the length returned */
+  printf ("Input length = %d, actual = %u\n",
+          bufdesc.dsc$w_length, buffer_length);
+#endif
+
+  /* Conversion from VMS time to C time.
+     VMS defectlet - mhddef is sub-optimal, for the time, it has a 32 bit
+     longword, mhd$l_datim, and a 32 bit fill instead of two longwords, or
+     equivalent. */
+  member_date = vms_time_to_unix(&mhd->mhd$l_datim);
+  free(mhd);
+
+  /* Here we have a problem.  The module name on VMS does not have
+     a file type, but the filename pattern in the "VMS_saved_arg"
+     may have one.
+     But only the method being called knows how to interpret the
+     filename pattern.
+     There are currently two different formats being used.
+     This means that we need a VMS specific code in those methods
+     to handle it. */
+  filename = xmalloc(module->dsc$w_length + 1);
+
+  /* TODO: We may need an option to preserve the case of the module
+     For now force the module name to lower case */
+  for (i = 0; i < module->dsc$w_length; i++)
+    filename[i] = _tolower((unsigned char )module->dsc$a_pointer[i]);
+
+  filename[i] = '\0';
+
+  VMS_function_ret = (*VMS_function)(file_desc, filename, truncated,
+      header_position, data_position, data_size, member_date, uid, gid, mode,
+      VMS_saved_arg);
+
+  free(filename);
+  return SS$_NORMAL;
+}
+
+
+/* Takes three arguments ARCHIVE, FUNCTION and ARG.
+
+   Open the archive named ARCHIVE, find its members one by one,
+   and for each one call FUNCTION with the following arguments:
+     archive file descriptor for reading the data,
+     member name,
+     member name might be truncated flag,
+     member header position in file,
+     member data position in file,
+     member data size,
+     member date,
+     member uid,
+     member gid,
+     member protection mode,
+     ARG.
+
+   NOTE: on VMS systems, only name, date, and arg are meaningful!
+
+   The descriptor is poised to read the data of the member
+   when FUNCTION is called.  It does not matter how much
+   data FUNCTION reads.
+
+   If FUNCTION returns nonzero, we immediately return
+   what FUNCTION returned.
+
+   Returns -1 if archive does not exist,
+   Returns -2 if archive has invalid format.
+   Returns 0 if have scanned successfully.  */
+
+long int
+ar_scan (const char *archive, ar_member_func_t function, const void *varg)
+{
+  char *vms_archive;
+
+  static struct dsc$descriptor_s libdesc =
+    { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
+
+  const unsigned long func = LBR$C_READ;
+  const unsigned long type = LBR$C_TYP_UNK;
+  const unsigned long index = 1;
+  unsigned long lib_idx;
+  int status;
+
+  VMS_saved_arg = varg;
+
+  /* Null archive string can show up in test and cause an access violation */
+  if (archive == NULL)
+    {
+      /* Null filenames do not exist */
+      return -1;
+    }
+
+  /* archive path name must be in VMS format */
+  vms_archive = (char *) vmsify(archive, 0);
+
+  status = lbr$ini_control(&VMS_lib_idx, &func, &type, 0);
+
+  if (!$VMS_STATUS_SUCCESS(status))
+    {
+      ON(error, NILF, _("lbr$ini_control() failed with status = %d"), status);
+      return -2;
+    }
+
+  libdesc.dsc$a_pointer = vms_archive;
+  libdesc.dsc$w_length = strlen(vms_archive);
+
+  status = lbr$open(&VMS_lib_idx, &libdesc, 0, NULL, 0, NULL, 0);
+
+  if (!$VMS_STATUS_SUCCESS(status))
+    {
+
+      /* TODO: A library format failure could mean that this is a file
+         generated by the GNU AR utility and in that case, we need to
+         take the UNIX codepath.  This will also take a change to the
+         GNV AR wrapper program. */
+
+      switch (status)
+        {
+      case RMS$_FNF:
+        /* Archive does not exist */
+        return -1;
+      default:
+#ifndef TEST
+        OSN(error, NILF,
+            _("unable to open library '%s' to lookup member status %d"),
+            archive, status);
+#endif
+        /* For library format errors, specification says to return -2 */
+        return -2;
+        }
+    }
+
+  VMS_function = function;
+
+  /* Clear the return status, as we are supposed to stop calling the
+     callback function if it becomes non-zero, and this is a static
+     variable. */
+  VMS_function_ret = 0;
+
+  status = lbr$get_index(&VMS_lib_idx, &index, VMS_get_member_info, NULL, 0);
+
+  lbr$close(&VMS_lib_idx);
+
+  /* Unless a failure occurred in the lbr$ routines, return the
+     the status from the 'function' routine. */
+  if ($VMS_STATUS_SUCCESS(status))
+    {
+      return VMS_function_ret;
+    }
+
+  /* This must be something wrong with the library and an error
+     message should already have been printed. */
+  return -2;
+}
+
+#else /* !VMS */
+
+/* SCO Unix's compiler defines both of these.  */
+#ifdef  M_UNIX
+#undef  M_XENIX
+#endif
+
+/* On the sun386i and in System V rel 3, ar.h defines two different archive
+   formats depending upon whether you have defined PORTAR (normal) or PORT5AR
+   (System V Release 1).  There is no default, one or the other must be defined
+   to have a nonzero value.  */
+
+#if (!defined (PORTAR) || PORTAR == 0) && (!defined (PORT5AR) || PORT5AR == 0)
+#undef  PORTAR
+#ifdef M_XENIX
+/* According to Jim Sievert <jas1@rsvl.unisys.com>, for SCO XENIX defining
+   PORTAR to 1 gets the wrong archive format, and defining it to 0 gets the
+   right one.  */
+#define PORTAR 0
+#else
+#define PORTAR 1
+#endif
+#endif
+
+/* On AIX, define these symbols to be sure to get both archive formats.
+   AIX 4.3 introduced the "big" archive format to support 64-bit object
+   files, so on AIX 4.3 systems we need to support both the "normal" and
+   "big" archive formats.  An archive's format is indicated in the
+   "fl_magic" field of the "FL_HDR" structure.  For a normal archive,
+   this field will be the string defined by the AIAMAG symbol.  For a
+   "big" archive, it will be the string defined by the AIAMAGBIG symbol
+   (at least on AIX it works this way).
+
+   Note: we'll define these symbols regardless of which AIX version
+   we're compiling on, but this is okay since we'll use the new symbols
+   only if they're present.  */
+#ifdef _AIX
+# define __AR_SMALL__
+# define __AR_BIG__
+#endif
+
+#ifndef WINDOWS32
+# if !defined (__ANDROID__) && !defined (__BEOS__)
+#  include <ar.h>
+# else
+   /* These platforms don't have <ar.h> but have archives in the same format
+    * as many other Unices.  This was taken from GNU binutils for BeOS.
+    */
+#  define ARMAG "!<arch>\n"     /* String that begins an archive file.  */
+#  define SARMAG 8              /* Size of that string.  */
+#  define ARFMAG "`\n"          /* String in ar_fmag at end of each header.  */
+struct ar_hdr
+  {
+    char ar_name[16];           /* Member file name, sometimes / terminated. */
+    char ar_date[12];           /* File date, decimal seconds since Epoch.  */
+    char ar_uid[6], ar_gid[6];  /* User and group IDs, in ASCII decimal.  */
+    char ar_mode[8];            /* File mode, in ASCII octal.  */
+    char ar_size[10];           /* File size, in ASCII decimal.  */
+    char ar_fmag[2];            /* Always contains ARFMAG.  */
+  };
+# endif
+# define TOCHAR(_m)     (_m)
+#else
+/* These should allow us to read Windows (VC++) libraries (according to Frank
+ * Libbrecht <frankl@abzx.belgium.hp.com>)
+ */
+# include <windows.h>
+# include <windef.h>
+# include <io.h>
+# define ARMAG      IMAGE_ARCHIVE_START
+# define SARMAG     IMAGE_ARCHIVE_START_SIZE
+# define ar_hdr     _IMAGE_ARCHIVE_MEMBER_HEADER
+# define ar_name    Name
+# define ar_mode    Mode
+# define ar_size    Size
+# define ar_date    Date
+# define ar_uid     UserID
+# define ar_gid     GroupID
+/* In Windows the member names have type BYTE so we must cast them.  */
+# define TOCHAR(_m)     ((char *)(_m))
+#endif
+
+/* Cray's <ar.h> apparently defines this.  */
+#ifndef AR_HDR_SIZE
+# define   AR_HDR_SIZE  (sizeof (struct ar_hdr))
+#endif
+
+#include "output.h"
+\f
+/* Takes three arguments ARCHIVE, FUNCTION and ARG.
+
+   Open the archive named ARCHIVE, find its members one by one,
+   and for each one call FUNCTION with the following arguments:
+     archive file descriptor for reading the data,
+     member name,
+     member name might be truncated flag,
+     member header position in file,
+     member data position in file,
+     member data size,
+     member date,
+     member uid,
+     member gid,
+     member protection mode,
+     ARG.
+
+   The descriptor is poised to read the data of the member
+   when FUNCTION is called.  It does not matter how much
+   data FUNCTION reads.
+
+   If FUNCTION returns nonzero, we immediately return
+   what FUNCTION returned.
+
+   Returns -1 if archive does not exist,
+   Returns -2 if archive has invalid format.
+   Returns 0 if have scanned successfully.  */
+
+long int
+ar_scan (const char *archive, ar_member_func_t function, const void *arg)
+{
+#ifdef AIAMAG
+  FL_HDR fl_header;
+# ifdef AIAMAGBIG
+  int big_archive = 0;
+  FL_HDR_BIG fl_header_big;
+# endif
+#endif
+  char *namemap = 0;
+  int namemap_size = 0;
+  int desc = open (archive, O_RDONLY, 0);
+  if (desc < 0)
+    return -1;
+
+#ifdef SARMAG
+  {
+    char buf[SARMAG];
+    int nread;
+    nread = readbuf (desc, buf, SARMAG);
+    if (nread != SARMAG || memcmp (buf, ARMAG, SARMAG))
+      goto invalid;
+  }
+#else
+#ifdef AIAMAG
+  {
+    int nread;
+    nread = readbuf (desc, &fl_header, FL_HSZ);
+    if (nread != FL_HSZ)
+      goto invalid;
+
+#ifdef AIAMAGBIG
+    /* If this is a "big" archive, then set the flag and
+       re-read the header into the "big" structure. */
+    if (!memcmp (fl_header.fl_magic, AIAMAGBIG, SAIAMAG))
+      {
+        off_t o;
+
+        big_archive = 1;
+
+        /* seek back to beginning of archive */
+        EINTRLOOP (o, lseek (desc, 0, 0));
+        if (o < 0)
+          goto invalid;
+
+        /* re-read the header into the "big" structure */
+        nread = readbuf (desc, &fl_header_big, FL_HSZ_BIG);
+        if (nread != FL_HSZ_BIG)
+          goto invalid;
+      }
+    else
+#endif
+       /* Check to make sure this is a "normal" archive. */
+      if (memcmp (fl_header.fl_magic, AIAMAG, SAIAMAG))
+        goto invalid;
+  }
+#else
+  {
+#ifndef M_XENIX
+    int buf;
+#else
+    unsigned short int buf;
+#endif
+    int nread;
+    nread = readbuf (desc, &buf, sizeof (buf));
+    if (nread != sizeof (buf) || buf != ARMAG)
+      goto invalid;
+  }
+#endif
+#endif
+
+  /* Now find the members one by one.  */
+  {
+#ifdef SARMAG
+    long int member_offset = SARMAG;
+#else
+#ifdef AIAMAG
+    long int member_offset;
+    long int last_member_offset;
+
+#ifdef AIAMAGBIG
+    if ( big_archive )
+      {
+        sscanf (fl_header_big.fl_fstmoff, "%20ld", &member_offset);
+        sscanf (fl_header_big.fl_lstmoff, "%20ld", &last_member_offset);
+      }
+    else
+#endif
+      {
+        sscanf (fl_header.fl_fstmoff, "%12ld", &member_offset);
+        sscanf (fl_header.fl_lstmoff, "%12ld", &last_member_offset);
+      }
+
+    if (member_offset == 0)
+      {
+        /* Empty archive.  */
+        close (desc);
+        return 0;
+      }
+#else
+#ifndef M_XENIX
+    long int member_offset = sizeof (int);
+#else   /* Xenix.  */
+    long int member_offset = sizeof (unsigned short int);
+#endif  /* Not Xenix.  */
+#endif
+#endif
+
+    while (1)
+      {
+        int nread;
+        struct ar_hdr member_header;
+#ifdef AIAMAGBIG
+        struct ar_hdr_big member_header_big;
+#endif
+#ifdef AIAMAG
+# define ARNAME_MAX 255
+        char name[ARNAME_MAX + 1];
+        int name_len;
+        long int dateval;
+        int uidval, gidval;
+        long int data_offset;
+#else
+# define ARNAME_MAX (int)sizeof(member_header.ar_name)
+        char namebuf[ARNAME_MAX + 1];
+        char *name;
+        int is_namemap;         /* Nonzero if this entry maps long names.  */
+        int long_name = 0;
+#endif
+        long int eltsize;
+        unsigned int eltmode;
+        long int fnval;
+        off_t o;
+
+        EINTRLOOP (o, lseek (desc, member_offset, 0));
+        if (o < 0)
+          goto invalid;
+
+#ifdef AIAMAG
+#define       AR_MEMHDR_SZ(x) (sizeof(x) - sizeof (x._ar_name))
+
+#ifdef AIAMAGBIG
+        if (big_archive)
+          {
+            nread = readbuf (desc, &member_header_big,
+                             AR_MEMHDR_SZ(member_header_big));
+
+            if (nread != AR_MEMHDR_SZ(member_header_big))
+              goto invalid;
+
+            sscanf (member_header_big.ar_namlen, "%4d", &name_len);
+            if (name_len < 1 || name_len > ARNAME_MAX)
+              goto invalid;
+
+            nread = readbuf (desc, name, name_len);
+            if (nread != name_len)
+              goto invalid;
+
+            name[name_len] = '\0';
+
+            sscanf (member_header_big.ar_date, "%12ld", &dateval);
+            sscanf (member_header_big.ar_uid, "%12d", &uidval);
+            sscanf (member_header_big.ar_gid, "%12d", &gidval);
+            sscanf (member_header_big.ar_mode, "%12o", &eltmode);
+            sscanf (member_header_big.ar_size, "%20ld", &eltsize);
+
+            data_offset = (member_offset + AR_MEMHDR_SZ(member_header_big)
+                           + name_len + 2);
+          }
+        else
+#endif
+          {
+            nread = readbuf (desc, &member_header,
+                             AR_MEMHDR_SZ(member_header));
+
+            if (nread != AR_MEMHDR_SZ(member_header))
+              goto invalid;
+
+            sscanf (member_header.ar_namlen, "%4d", &name_len);
+            if (name_len < 1 || name_len > ARNAME_MAX)
+              goto invalid;
+
+            nread = readbuf (desc, name, name_len);
+            if (nread != name_len)
+              goto invalid;
+
+            name[name_len] = '\0';
+
+            sscanf (member_header.ar_date, "%12ld", &dateval);
+            sscanf (member_header.ar_uid, "%12d", &uidval);
+            sscanf (member_header.ar_gid, "%12d", &gidval);
+            sscanf (member_header.ar_mode, "%12o", &eltmode);
+            sscanf (member_header.ar_size, "%12ld", &eltsize);
+
+            data_offset = (member_offset + AR_MEMHDR_SZ(member_header)
+                           + name_len + 2);
+          }
+        data_offset += data_offset % 2;
+
+        fnval =
+          (*function) (desc, name, 0,
+                       member_offset, data_offset, eltsize,
+                       dateval, uidval, gidval,
+                       eltmode, arg);
+
+#else   /* Not AIAMAG.  */
+        nread = readbuf (desc, &member_header, AR_HDR_SIZE);
+        if (nread == 0)
+          /* No data left means end of file; that is OK.  */
+          break;
+
+        if (nread != AR_HDR_SIZE
+#if defined(ARFMAG) || defined(ARFZMAG)
+            || (
+# ifdef ARFMAG
+                memcmp (member_header.ar_fmag, ARFMAG, 2)
+# else
+                1
+# endif
+                &&
+# ifdef ARFZMAG
+                memcmp (member_header.ar_fmag, ARFZMAG, 2)
+# else
+                1
+# endif
+               )
+#endif
+            )
+          goto invalid;
+
+        name = namebuf;
+        memcpy (name, member_header.ar_name, sizeof member_header.ar_name);
+        {
+          char *p = name + sizeof member_header.ar_name;
+          do
+            *p = '\0';
+          while (p > name && *--p == ' ');
+
+#ifndef AIAMAG
+          /* If the member name is "//" or "ARFILENAMES/" this may be
+             a list of file name mappings.  The maximum file name
+             length supported by the standard archive format is 14
+             characters.  This member will actually always be the
+             first or second entry in the archive, but we don't check
+             that.  */
+          is_namemap = (!strcmp (name, "//")
+                        || !strcmp (name, "ARFILENAMES/"));
+#endif  /* Not AIAMAG. */
+
+          /* On some systems, there is a slash after each member name.  */
+          if (*p == '/')
+            *p = '\0';
+
+#ifndef AIAMAG
+          /* If the member name starts with a space or a slash, this
+             is an index into the file name mappings (used by GNU ar).
+             Otherwise if the member name looks like #1/NUMBER the
+             real member name appears in the element data (used by
+             4.4BSD).  */
+          if (! is_namemap
+              && (name[0] == ' ' || name[0] == '/')
+              && namemap != 0)
+            {
+              int name_off = atoi (name + 1);
+              int name_len;
+
+              if (name_off < 0 || name_off >= namemap_size)
+                goto invalid;
+
+              name = namemap + name_off;
+              name_len = strlen (name);
+              if (name_len < 1)
+                goto invalid;
+              long_name = 1;
+            }
+          else if (name[0] == '#'
+                   && name[1] == '1'
+                   && name[2] == '/')
+            {
+              int name_len = atoi (name + 3);
+
+              if (name_len < 1)
+                goto invalid;
+
+              name = alloca (name_len + 1);
+              nread = readbuf (desc, name, name_len);
+              if (nread != name_len)
+                goto invalid;
+
+              name[name_len] = '\0';
+
+              long_name = 1;
+            }
+#endif /* Not AIAMAG. */
+        }
+
+#ifndef M_XENIX
+        sscanf (TOCHAR (member_header.ar_mode), "%8o", &eltmode);
+        eltsize = atol (TOCHAR (member_header.ar_size));
+#else   /* Xenix.  */
+        eltmode = (unsigned short int) member_header.ar_mode;
+        eltsize = member_header.ar_size;
+#endif  /* Not Xenix.  */
+
+        fnval =
+          (*function) (desc, name, ! long_name, member_offset,
+                       member_offset + AR_HDR_SIZE, eltsize,
+#ifndef M_XENIX
+                       atol (TOCHAR (member_header.ar_date)),
+                       atoi (TOCHAR (member_header.ar_uid)),
+                       atoi (TOCHAR (member_header.ar_gid)),
+#else   /* Xenix.  */
+                       member_header.ar_date,
+                       member_header.ar_uid,
+                       member_header.ar_gid,
+#endif  /* Not Xenix.  */
+                       eltmode, arg);
+
+#endif  /* AIAMAG.  */
+
+        if (fnval)
+          {
+            (void) close (desc);
+            return fnval;
+          }
+
+#ifdef AIAMAG
+        if (member_offset == last_member_offset)
+          /* End of the chain.  */
+          break;
+
+#ifdef AIAMAGBIG
+        if (big_archive)
+         sscanf (member_header_big.ar_nxtmem, "%20ld", &member_offset);
+        else
+#endif
+          sscanf (member_header.ar_nxtmem, "%12ld", &member_offset);
+
+        if (lseek (desc, member_offset, 0) != member_offset)
+          goto invalid;
+#else
+
+        /* If this member maps archive names, we must read it in.  The
+           name map will always precede any members whose names must
+           be mapped.  */
+        if (is_namemap)
+          {
+            char *clear;
+            char *limit;
+
+            if (eltsize > INT_MAX)
+              goto invalid;
+            namemap = alloca (eltsize + 1);
+            nread = readbuf (desc, namemap, eltsize);
+            if (nread != eltsize)
+              goto invalid;
+            namemap_size = eltsize;
+
+            /* The names are separated by newlines.  Some formats have
+               a trailing slash.  Null terminate the strings for
+               convenience.  */
+            limit = namemap + eltsize;
+            for (clear = namemap; clear < limit; clear++)
+              {
+                if (*clear == '\n')
+                  {
+                    *clear = '\0';
+                    if (clear[-1] == '/')
+                      clear[-1] = '\0';
+                  }
+              }
+            *limit = '\0';
+
+            is_namemap = 0;
+          }
+
+        member_offset += AR_HDR_SIZE + eltsize;
+        if (member_offset % 2 != 0)
+          member_offset++;
+#endif
+      }
+  }
+
+  close (desc);
+  return 0;
+
+ invalid:
+  close (desc);
+  return -2;
+}
+#endif /* !VMS */
+\f
+/* Return nonzero iff NAME matches MEM.
+   If TRUNCATED is nonzero, MEM may be truncated to
+   sizeof (struct ar_hdr.ar_name) - 1.  */
+
+int
+ar_name_equal (const char *name, const char *mem, int truncated)
+{
+  const char *p;
+
+  p = strrchr (name, '/');
+  if (p != 0)
+    name = p + 1;
+
+#ifndef VMS
+  if (truncated)
+    {
+#ifdef AIAMAG
+      /* TRUNCATED should never be set on this system.  */
+      abort ();
+#else
+      struct ar_hdr hdr;
+#if !defined (__hpux) && !defined (cray)
+      return strneq (name, mem, sizeof (hdr.ar_name) - 1);
+#else
+      return strneq (name, mem, sizeof (hdr.ar_name) - 2);
+#endif /* !__hpux && !cray */
+#endif /* !AIAMAG */
+    }
+
+  return !strcmp (name, mem);
+#else
+  /* VMS members do not have suffixes, but the filenames usually
+     have.
+     Do we need to strip VMS disk/directory format paths?
+
+     Most VMS compilers etc. by default are case insensitive
+     but produce uppercase external names, incl. module names.
+     However the VMS librarian (ar) and the linker by default
+     are case sensitive: they take what they get, usually
+     uppercase names. So for the non-default settings of the
+     compilers etc. there is a need to have a case sensitive
+     mode. */
+  {
+    int len;
+    len = strlen(mem);
+    int match;
+    char *dot;
+    if ((dot=strrchr(name,'.')))
+      match = (len == dot - name) && !strncasecmp(name, mem, len);
+    else
+      match = !strcasecmp (name, mem);
+    return match;
+  }
+#endif /* !VMS */
+}
+\f
+#ifndef VMS
+/* ARGSUSED */
+static long int
+ar_member_pos (int desc UNUSED, const char *mem, int truncated,
+               long int hdrpos, long int datapos UNUSED, long int size UNUSED,
+               long int date UNUSED, int uid UNUSED, int gid UNUSED,
+               unsigned int mode UNUSED, const void *name)
+{
+  if (!ar_name_equal (name, mem, truncated))
+    return 0;
+  return hdrpos;
+}
+
+/* Set date of member MEMNAME in archive ARNAME to current time.
+   Returns 0 if successful,
+   -1 if file ARNAME does not exist,
+   -2 if not a valid archive,
+   -3 if other random system call error (including file read-only),
+   1 if valid but member MEMNAME does not exist.  */
+
+int
+ar_member_touch (const char *arname, const char *memname)
+{
+  long int pos = ar_scan (arname, ar_member_pos, memname);
+  int fd;
+  struct ar_hdr ar_hdr;
+  off_t o;
+  int r;
+  unsigned int ui;
+  struct stat statbuf;
+
+  if (pos < 0)
+    return (int) pos;
+  if (!pos)
+    return 1;
+
+  EINTRLOOP (fd, open (arname, O_RDWR, 0666));
+  if (fd < 0)
+    return -3;
+  /* Read in this member's header */
+  EINTRLOOP (o, lseek (fd, pos, 0));
+  if (o < 0)
+    goto lose;
+  r = readbuf (fd, &ar_hdr, AR_HDR_SIZE);
+  if (r != AR_HDR_SIZE)
+    goto lose;
+  /* The file's mtime is the time we we want.  */
+  EINTRLOOP (r, fstat (fd, &statbuf));
+  if (r < 0)
+    goto lose;
+  /* Advance member's time to that time */
+#if defined(ARFMAG) || defined(ARFZMAG) || defined(AIAMAG) || defined(WINDOWS32)
+  for (ui = 0; ui < sizeof ar_hdr.ar_date; ui++)
+    ar_hdr.ar_date[ui] = ' ';
+  sprintf (TOCHAR (ar_hdr.ar_date), "%lu", (long unsigned) statbuf.st_mtime);
+  ar_hdr.ar_date[strlen ((char *) ar_hdr.ar_date)] = ' ';
+#else
+  ar_hdr.ar_date = statbuf.st_mtime;
+#endif
+  /* Write back this member's header */
+  EINTRLOOP (o, lseek (fd, pos, 0));
+  if (o < 0)
+    goto lose;
+  r = writebuf (fd, &ar_hdr, AR_HDR_SIZE);
+  if (r != AR_HDR_SIZE)
+    goto lose;
+  close (fd);
+  return 0;
+
+ lose:
+  r = errno;
+  close (fd);
+  errno = r;
+  return -3;
+}
+#endif
+\f
+#ifdef TEST
+
+long int
+describe_member (int desc, const char *name, int truncated,
+                 long int hdrpos, long int datapos, long int size,
+                 long int date, int uid, int gid, unsigned int mode,
+                 const void *arg)
+{
+  extern char *ctime ();
+
+  printf (_("Member '%s'%s: %ld bytes at %ld (%ld).\n"),
+          name, truncated ? _(" (name might be truncated)") : "",
+          size, hdrpos, datapos);
+  printf (_("  Date %s"), ctime (&date));
+  printf (_("  uid = %d, gid = %d, mode = 0%o.\n"), uid, gid, mode);
+
+  return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+  ar_scan (argv[1], describe_member, NULL);
+  return 0;
+}
+
+#endif  /* TEST.  */
+#endif  /* NO_ARCHIVES.  */
diff --git a/src/commands.c b/src/commands.c
new file mode 100644 (file)
index 0000000..88c33a3
--- /dev/null
@@ -0,0 +1,711 @@
+/* Command processing for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "dep.h"
+#include "variable.h"
+#include "job.h"
+#include "commands.h"
+#ifdef WINDOWS32
+#include <windows.h>
+#include "w32err.h"
+#endif
+
+#if VMS
+# define FILE_LIST_SEPARATOR (vms_comma_separator ? ',' : ' ')
+#else
+# define FILE_LIST_SEPARATOR ' '
+#endif
+
+#ifndef HAVE_UNISTD_H
+pid_t getpid ();
+#endif
+\f
+
+static unsigned long
+dep_hash_1 (const void *key)
+{
+  const struct dep *d = key;
+  return_STRING_HASH_1 (dep_name (d));
+}
+
+static unsigned long
+dep_hash_2 (const void *key)
+{
+  const struct dep *d = key;
+  return_STRING_HASH_2 (dep_name (d));
+}
+
+static int
+dep_hash_cmp (const void *x, const void *y)
+{
+  const struct dep *dx = x;
+  const struct dep *dy = y;
+  return strcmp (dep_name (dx), dep_name (dy));
+}
+
+/* Set FILE's automatic variables up.  */
+
+void
+set_file_variables (struct file *file)
+{
+  struct dep *d;
+  const char *at, *percent, *star, *less;
+
+#ifndef NO_ARCHIVES
+  /* If the target is an archive member 'lib(member)',
+     then $@ is 'lib' and $% is 'member'.  */
+
+  if (ar_name (file->name))
+    {
+      size_t len;
+      const char *cp;
+      char *p;
+
+      cp = strchr (file->name, '(');
+      p = alloca (cp - file->name + 1);
+      memcpy (p, file->name, cp - file->name);
+      p[cp - file->name] = '\0';
+      at = p;
+      len = strlen (cp + 1);
+      p = alloca (len);
+      memcpy (p, cp + 1, len - 1);
+      p[len - 1] = '\0';
+      percent = p;
+    }
+  else
+#endif  /* NO_ARCHIVES.  */
+    {
+      at = file->name;
+      percent = "";
+    }
+
+  /* $* is the stem from an implicit or static pattern rule.  */
+  if (file->stem == 0)
+    {
+      /* In Unix make, $* is set to the target name with
+         any suffix in the .SUFFIXES list stripped off for
+         explicit rules.  We store this in the 'stem' member.  */
+      const char *name;
+      size_t len;
+
+#ifndef NO_ARCHIVES
+      if (ar_name (file->name))
+        {
+          name = strchr (file->name, '(') + 1;
+          len = strlen (name) - 1;
+        }
+      else
+#endif
+        {
+          name = file->name;
+          len = strlen (name);
+        }
+
+      for (d = enter_file (strcache_add (".SUFFIXES"))->deps; d ; d = d->next)
+        {
+          size_t slen = strlen (dep_name (d));
+          if (len > slen && strneq (dep_name (d), name + (len - slen), slen))
+            {
+              file->stem = strcache_add_len (name, len - slen);
+              break;
+            }
+        }
+      if (d == 0)
+        file->stem = "";
+    }
+  star = file->stem;
+
+  /* $< is the first not order-only dependency.  */
+  less = "";
+  for (d = file->deps; d != 0; d = d->next)
+    if (!d->ignore_mtime && !d->ignore_automatic_vars)
+      {
+        if (!d->need_2nd_expansion)
+          less = dep_name (d);
+        break;
+      }
+
+  if (file->cmds != 0 && file->cmds == default_file->cmds)
+    /* This file got its commands from .DEFAULT.
+       In this case $< is the same as $@.  */
+    less = at;
+
+#define DEFINE_VARIABLE(name, len, value) \
+  (void) define_variable_for_file (name,len,value,o_automatic,0,file)
+
+  /* Define the variables.  */
+
+  DEFINE_VARIABLE ("<", 1, less);
+  DEFINE_VARIABLE ("*", 1, star);
+  DEFINE_VARIABLE ("@", 1, at);
+  DEFINE_VARIABLE ("%", 1, percent);
+
+  /* Compute the values for $^, $+, $?, and $|.  */
+
+  {
+    static char *plus_value=0, *bar_value=0, *qmark_value=0;
+    static size_t plus_max=0, bar_max=0, qmark_max=0;
+
+    size_t qmark_len, plus_len, bar_len;
+    char *cp;
+    char *caret_value;
+    char *qp;
+    char *bp;
+    size_t len;
+
+    struct hash_table dep_hash;
+    void **slot;
+
+    /* Compute first the value for $+, which is supposed to contain
+       duplicate dependencies as they were listed in the makefile.  */
+
+    plus_len = 0;
+    bar_len = 0;
+    for (d = file->deps; d != 0; d = d->next)
+      {
+        if (!d->need_2nd_expansion && !d->ignore_automatic_vars)
+          {
+            if (d->ignore_mtime)
+              bar_len += strlen (dep_name (d)) + 1;
+            else
+              plus_len += strlen (dep_name (d)) + 1;
+          }
+      }
+
+    if (bar_len == 0)
+      bar_len++;
+
+    if (plus_len == 0)
+      plus_len++;
+
+    if (plus_len > plus_max)
+      plus_value = xrealloc (plus_value, plus_max = plus_len);
+
+    cp = plus_value;
+
+    qmark_len = plus_len + 1;   /* Will be this or less.  */
+    for (d = file->deps; d != 0; d = d->next)
+      if (! d->ignore_mtime && ! d->need_2nd_expansion && ! d->ignore_automatic_vars)
+        {
+          const char *c = dep_name (d);
+
+#ifndef NO_ARCHIVES
+          if (ar_name (c))
+            {
+              c = strchr (c, '(') + 1;
+              len = strlen (c) - 1;
+            }
+          else
+#endif
+            len = strlen (c);
+
+          memcpy (cp, c, len);
+          cp += len;
+          *cp++ = FILE_LIST_SEPARATOR;
+          if (! (d->changed || always_make_flag))
+            qmark_len -= len + 1;       /* Don't space in $? for this one.  */
+        }
+
+    /* Kill the last space and define the variable.  */
+
+    cp[cp > plus_value ? -1 : 0] = '\0';
+    DEFINE_VARIABLE ("+", 1, plus_value);
+
+    /* Compute the values for $^, $?, and $|.  */
+
+    cp = caret_value = plus_value; /* Reuse the buffer; it's big enough.  */
+
+    if (qmark_len > qmark_max)
+      qmark_value = xrealloc (qmark_value, qmark_max = qmark_len);
+    qp = qmark_value;
+
+    if (bar_len > bar_max)
+      bar_value = xrealloc (bar_value, bar_max = bar_len);
+    bp = bar_value;
+
+    /* Make sure that no dependencies are repeated in $^, $?, and $|.  It
+       would be natural to combine the next two loops but we can't do it
+       because of a situation where we have two dep entries, the first
+       is order-only and the second is normal (see below).  */
+
+    hash_init (&dep_hash, 500, dep_hash_1, dep_hash_2, dep_hash_cmp);
+
+    for (d = file->deps; d != 0; d = d->next)
+      {
+        if (d->need_2nd_expansion || d->ignore_automatic_vars)
+          continue;
+
+        slot = hash_find_slot (&dep_hash, d);
+        if (HASH_VACANT (*slot))
+          hash_insert_at (&dep_hash, d, slot);
+        else
+          {
+            /* Check if the two prerequisites have different ignore_mtime.
+               If so then we need to "upgrade" one that is order-only.  */
+
+            struct dep* hd = (struct dep*) *slot;
+
+            if (d->ignore_mtime != hd->ignore_mtime)
+              d->ignore_mtime = hd->ignore_mtime = 0;
+          }
+      }
+
+    for (d = file->deps; d != 0; d = d->next)
+      {
+        const char *c;
+
+        if (d->need_2nd_expansion || d->ignore_automatic_vars || hash_find_item (&dep_hash, d) != d)
+          continue;
+
+        c = dep_name (d);
+#ifndef NO_ARCHIVES
+        if (ar_name (c))
+          {
+            c = strchr (c, '(') + 1;
+            len = strlen (c) - 1;
+          }
+        else
+#endif
+          len = strlen (c);
+
+        if (d->ignore_mtime)
+          {
+            memcpy (bp, c, len);
+            bp += len;
+            *bp++ = FILE_LIST_SEPARATOR;
+          }
+        else
+          {
+            memcpy (cp, c, len);
+            cp += len;
+            *cp++ = FILE_LIST_SEPARATOR;
+            if (d->changed || always_make_flag)
+              {
+                memcpy (qp, c, len);
+                qp += len;
+                *qp++ = FILE_LIST_SEPARATOR;
+              }
+          }
+      }
+
+    hash_free (&dep_hash, 0);
+
+    /* Kill the last spaces and define the variables.  */
+
+    cp[cp > caret_value ? -1 : 0] = '\0';
+    DEFINE_VARIABLE ("^", 1, caret_value);
+
+    qp[qp > qmark_value ? -1 : 0] = '\0';
+    DEFINE_VARIABLE ("?", 1, qmark_value);
+
+    bp[bp > bar_value ? -1 : 0] = '\0';
+    DEFINE_VARIABLE ("|", 1, bar_value);
+  }
+
+#undef  DEFINE_VARIABLE
+}
+\f
+/* Chop CMDS up into individual command lines if necessary.
+   Also set the 'lines_flags' and 'any_recurse' members.  */
+
+void
+chop_commands (struct commands *cmds)
+{
+  unsigned int nlines;
+  unsigned short idx;
+  char **lines;
+
+  /* If we don't have any commands,
+     or we already parsed them, never mind.  */
+
+  if (!cmds || cmds->command_lines != 0)
+    return;
+
+  /* Chop CMDS->commands up into lines in CMDS->command_lines.  */
+
+  if (one_shell)
+    {
+      size_t l = strlen (cmds->commands);
+
+      nlines = 1;
+      lines = xmalloc (nlines * sizeof (char *));
+      lines[0] = xstrdup (cmds->commands);
+
+      /* Strip the trailing newline.  */
+      if (l > 0 && lines[0][l-1] == '\n')
+        lines[0][l-1] = '\0';
+    }
+  else
+    {
+      const char *p;
+
+      nlines = 5;
+      lines = xmalloc (nlines * sizeof (char *));
+      idx = 0;
+      p = cmds->commands;
+      while (*p != '\0')
+        {
+          const char *end = p;
+        find_end:;
+          end = strchr (end, '\n');
+          if (end == 0)
+            end = p + strlen (p);
+          else if (end > p && end[-1] == '\\')
+            {
+              int backslash = 1;
+              const char *b;
+              for (b = end - 2; b >= p && *b == '\\'; --b)
+                backslash = !backslash;
+              if (backslash)
+                {
+                  ++end;
+                  goto find_end;
+                }
+            }
+
+          if (idx == nlines)
+            {
+              nlines += 2;
+              lines = xrealloc (lines, nlines * sizeof (char *));
+            }
+          lines[idx++] = xstrndup (p, (size_t) (end - p));
+          p = end;
+          if (*p != '\0')
+            ++p;
+        }
+
+      if (idx != nlines)
+        {
+          nlines = idx;
+          lines = xrealloc (lines, nlines * sizeof (char *));
+        }
+    }
+
+  /* Finally, set the corresponding CMDS->lines_flags elements and the
+     CMDS->any_recurse flag.  */
+
+  if (nlines > USHRT_MAX)
+    ON (fatal, &cmds->fileinfo, _("Recipe has too many lines (%ud)"), nlines);
+
+  cmds->ncommand_lines = (unsigned short)nlines;
+  cmds->command_lines = lines;
+
+  cmds->any_recurse = 0;
+  cmds->lines_flags = xmalloc (nlines);
+
+  for (idx = 0; idx < nlines; ++idx)
+    {
+      unsigned char flags = 0;
+      const char *p = lines[idx];
+
+      while (ISBLANK (*p) || *p == '-' || *p == '@' || *p == '+')
+        switch (*(p++))
+          {
+          case '+':
+            flags |= COMMANDS_RECURSE;
+            break;
+          case '@':
+            flags |= COMMANDS_SILENT;
+            break;
+          case '-':
+            flags |= COMMANDS_NOERROR;
+            break;
+          }
+
+      /* If no explicit '+' was given, look for MAKE variable references.  */
+      if (!(flags & COMMANDS_RECURSE)
+          && (strstr (p, "$(MAKE)") != 0 || strstr (p, "${MAKE}") != 0))
+        flags |= COMMANDS_RECURSE;
+
+      cmds->lines_flags[idx] = flags;
+      cmds->any_recurse |= flags & COMMANDS_RECURSE ? 1 : 0;
+    }
+}
+\f
+/* Execute the commands to remake FILE.  If they are currently executing,
+   return or have already finished executing, just return.  Otherwise,
+   fork off a child process to run the first command line in the sequence.  */
+
+void
+execute_file_commands (struct file *file)
+{
+  const char *p;
+
+  /* Don't go through all the preparations if
+     the commands are nothing but whitespace.  */
+
+  for (p = file->cmds->commands; *p != '\0'; ++p)
+    if (!ISSPACE (*p) && *p != '-' && *p != '@' && *p != '+')
+      break;
+  if (*p == '\0')
+    {
+      /* If there are no commands, assume everything worked.  */
+      set_command_state (file, cs_running);
+      file->update_status = us_success;
+      notice_finished_file (file);
+      return;
+    }
+
+  /* First set the automatic variables according to this file.  */
+
+  initialize_file_variables (file, 0);
+
+  set_file_variables (file);
+
+  /* If this is a loaded dynamic object, unload it before remaking.
+     Some systems don't support overwriting a loaded object.  */
+  if (file->loaded)
+    unload_file (file->name);
+
+  /* Start the commands running.  */
+  new_job (file);
+}
+\f
+/* This is set while we are inside fatal_error_signal,
+   so things can avoid nonreentrant operations.  */
+
+int handling_fatal_signal = 0;
+
+/* Handle fatal signals.  */
+
+RETSIGTYPE
+fatal_error_signal (int sig)
+{
+#ifdef __MSDOS__
+  extern int dos_status, dos_command_running;
+
+  if (dos_command_running)
+    {
+      /* That was the child who got the signal, not us.  */
+      dos_status |= (sig << 8);
+      return;
+    }
+  remove_intermediates (1);
+  exit (EXIT_FAILURE);
+#else /* not __MSDOS__ */
+#ifdef _AMIGA
+  remove_intermediates (1);
+  if (sig == SIGINT)
+     fputs (_("*** Break.\n"), stderr);
+
+  exit (10);
+#else /* not Amiga */
+#ifdef WINDOWS32
+  extern HANDLE main_thread;
+
+  /* Windows creates a sperate thread for handling Ctrl+C, so we need
+     to suspend the main thread, or else we will have race conditions
+     when both threads call reap_children.  */
+  if (main_thread)
+    {
+      DWORD susp_count = SuspendThread (main_thread);
+
+      if (susp_count != 0)
+        fprintf (stderr, "SuspendThread: suspend count = %ld\n", susp_count);
+      else if (susp_count == (DWORD)-1)
+        {
+          DWORD ierr = GetLastError ();
+
+          fprintf (stderr, "SuspendThread: error %ld: %s\n",
+                   ierr, map_windows32_error_to_string (ierr));
+        }
+    }
+#endif
+  handling_fatal_signal = 1;
+
+  /* Set the handling for this signal to the default.
+     It is blocked now while we run this handler.  */
+  signal (sig, SIG_DFL);
+
+  /* A termination signal won't be sent to the entire
+     process group, but it means we want to kill the children.  */
+
+  if (sig == SIGTERM)
+    {
+      struct child *c;
+      for (c = children; c != 0; c = c->next)
+        if (!c->remote && c->pid > 0)
+          (void) kill (c->pid, SIGTERM);
+    }
+
+  /* If we got a signal that means the user
+     wanted to kill make, remove pending targets.  */
+
+  if (sig == SIGTERM || sig == SIGINT
+#ifdef SIGHUP
+    || sig == SIGHUP
+#endif
+#ifdef SIGQUIT
+    || sig == SIGQUIT
+#endif
+    )
+    {
+      struct child *c;
+
+      /* Remote children won't automatically get signals sent
+         to the process group, so we must send them.  */
+      for (c = children; c != 0; c = c->next)
+        if (c->remote && c->pid > 0)
+          (void) remote_kill (c->pid, sig);
+
+      for (c = children; c != 0; c = c->next)
+        delete_child_targets (c);
+
+      /* Clean up the children.  We don't just use the call below because
+         we don't want to print the "Waiting for children" message.  */
+      while (job_slots_used > 0)
+        reap_children (1, 0);
+    }
+  else
+    /* Wait for our children to die.  */
+    while (job_slots_used > 0)
+      reap_children (1, 1);
+
+  /* Delete any non-precious intermediate files that were made.  */
+
+  remove_intermediates (1);
+
+#ifdef SIGQUIT
+  if (sig == SIGQUIT)
+    /* We don't want to send ourselves SIGQUIT, because it will
+       cause a core dump.  Just exit instead.  */
+    exit (MAKE_TROUBLE);
+#endif
+
+#ifdef WINDOWS32
+  if (main_thread)
+    CloseHandle (main_thread);
+  /* Cannot call W32_kill with a pid (it needs a handle).  The exit
+     status of 130 emulates what happens in Bash.  */
+  exit (130);
+#else
+  /* Signal the same code; this time it will really be fatal.  The signal
+     will be unblocked when we return and arrive then to kill us.  */
+  if (kill (getpid (), sig) < 0)
+    pfatal_with_name ("kill");
+#endif /* not WINDOWS32 */
+#endif /* not Amiga */
+#endif /* not __MSDOS__  */
+}
+\f
+/* Delete FILE unless it's precious or not actually a file (phony),
+   and it has changed on disk since we last stat'd it.  */
+
+static void
+delete_target (struct file *file, const char *on_behalf_of)
+{
+  struct stat st;
+  int e;
+
+  if (file->precious || file->phony)
+    return;
+
+#ifndef NO_ARCHIVES
+  if (ar_name (file->name))
+    {
+      time_t file_date = (file->last_mtime == NONEXISTENT_MTIME
+                          ? (time_t) -1
+                          : (time_t) FILE_TIMESTAMP_S (file->last_mtime));
+      if (ar_member_date (file->name) != file_date)
+        {
+          if (on_behalf_of)
+            OSS (error, NILF,
+                 _("*** [%s] Archive member '%s' may be bogus; not deleted"),
+                 on_behalf_of, file->name);
+          else
+            OS (error, NILF,
+                _("*** Archive member '%s' may be bogus; not deleted"),
+                file->name);
+        }
+      return;
+    }
+#endif
+
+  EINTRLOOP (e, stat (file->name, &st));
+  if (e == 0
+      && S_ISREG (st.st_mode)
+      && FILE_TIMESTAMP_STAT_MODTIME (file->name, st) != file->last_mtime)
+    {
+      if (on_behalf_of)
+        OSS (error, NILF,
+             _("*** [%s] Deleting file '%s'"), on_behalf_of, file->name);
+      else
+        OS (error, NILF, _("*** Deleting file '%s'"), file->name);
+      if (unlink (file->name) < 0
+          && errno != ENOENT)   /* It disappeared; so what.  */
+        perror_with_name ("unlink: ", file->name);
+    }
+}
+
+
+/* Delete all non-precious targets of CHILD unless they were already deleted.
+   Set the flag in CHILD to say they've been deleted.  */
+
+void
+delete_child_targets (struct child *child)
+{
+  struct dep *d;
+
+  if (child->deleted || child->pid < 0)
+    return;
+
+  /* Delete the target file if it changed.  */
+  delete_target (child->file, NULL);
+
+  /* Also remove any non-precious targets listed in the 'also_make' member.  */
+  for (d = child->file->also_make; d != 0; d = d->next)
+    delete_target (d->file, child->file->name);
+
+  child->deleted = 1;
+}
+\f
+/* Print out the commands in CMDS.  */
+
+void
+print_commands (const struct commands *cmds)
+{
+  const char *s;
+
+  fputs (_("#  recipe to execute"), stdout);
+
+  if (cmds->fileinfo.filenm == 0)
+    puts (_(" (built-in):"));
+  else
+    printf (_(" (from '%s', line %lu):\n"),
+            cmds->fileinfo.filenm, cmds->fileinfo.lineno);
+
+  s = cmds->commands;
+  while (*s != '\0')
+    {
+      const char *end;
+      int bs;
+
+      /* Print one full logical recipe line: find a non-escaped newline.  */
+      for (end = s, bs = 0; *end != '\0'; ++end)
+        {
+          if (*end == '\n' && !bs)
+            break;
+
+          bs = *end == '\\' ? !bs : 0;
+        }
+
+      printf ("%c%.*s\n", cmd_prefix, (int) (end - s), s);
+
+      s = end + (end[0] == '\n');
+    }
+}
diff --git a/src/commands.h b/src/commands.h
new file mode 100644 (file)
index 0000000..d86752c
--- /dev/null
@@ -0,0 +1,42 @@
+/* Definition of data structures describing shell commands for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Structure that gives the commands to make a file
+   and information about where these commands came from.  */
+
+struct commands
+  {
+    floc fileinfo;              /* Where commands were defined.  */
+    char *commands;             /* Commands text.  */
+    char **command_lines;       /* Commands chopped up into lines.  */
+    unsigned char *lines_flags; /* One set of flag bits for each line.  */
+    unsigned short ncommand_lines;/* Number of command lines.  */
+    char recipe_prefix;         /* Recipe prefix for this command set.  */
+    unsigned int any_recurse:1; /* Nonzero if any 'lines_flags' elt has */
+                                /* the COMMANDS_RECURSE bit set.  */
+  };
+
+/* Bits in 'lines_flags'.  */
+#define COMMANDS_RECURSE        1 /* Recurses: + or $(MAKE).  */
+#define COMMANDS_SILENT         2 /* Silent: @.  */
+#define COMMANDS_NOERROR        4 /* No errors: -.  */
+
+RETSIGTYPE fatal_error_signal (int sig);
+void execute_file_commands (struct file *file);
+void print_commands (const struct commands *cmds);
+void delete_child_targets (struct child *child);
+void chop_commands (struct commands *cmds);
+void set_file_variables (struct file *file);
diff --git a/src/config.ami b/src/config.ami
new file mode 100644 (file)
index 0000000..d7f637d
--- /dev/null
@@ -0,0 +1,337 @@
+/* config.h -- hand-massaged for Amiga                                  -*-C-*-
+Copyright (C) 1995-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+/* #undef _ALL_SOURCE */
+#endif
+
+/* Define if using alloca.c.  */
+#define C_ALLOCA
+
+/* Define if the closedir function returns void instead of int.  */
+/* #undef CLOSEDIR_VOID */
+
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define for DGUX with <sys/dg_sys_info.h>.  */
+/* #undef DGUX */
+
+/* Define if the 'getloadavg' function needs to be run setuid or setgid.  */
+/* #undef GETLOADAVG_PRIVILEGED */
+
+/* Define to 'unsigned long' or 'unsigned long long'
+   if <inttypes.h> doesn't define.  */
+#define uintmax_t unsigned long
+
+/* Define to 'int' if <sys/types.h> doesn't define.  */
+#define gid_t int
+
+/* Define if you have alloca, as a function or macro.  */
+/* #undef HAVE_ALLOCA */
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+/* #undef HAVE_ALLOCA_H */
+
+/* Define if your system has a working fnmatch function.  */
+/* #undef HAVE_FNMATCH */
+
+/* Define if your system has its own 'getloadavg' function.  */
+/* #undef HAVE_GETLOADAVG */
+
+/* Define if you have the getmntent function.  */
+/* #undef HAVE_GETMNTENT */
+
+/* Embed GNU Guile support */
+/* #undef HAVE_GUILE */
+
+/* Define if the 'long double' type works.  */
+/* #undef HAVE_LONG_DOUBLE */
+
+/* Define if you support file names longer than 14 characters.  */
+#define HAVE_LONG_FILE_NAMES 1
+
+/* Define if you have a working 'mmap' system call.  */
+/* #undef HAVE_MMAP */
+
+/* Define if system calls automatically restart after interruption
+   by a signal.  */
+/* #undef HAVE_RESTARTABLE_SYSCALLS */
+
+/* Define if your struct stat has st_blksize.  */
+/* #undef HAVE_ST_BLKSIZE */
+
+/* Define if your struct stat has st_blocks.  */
+/* #undef HAVE_ST_BLOCKS */
+
+/* Define if you have the strcoll function and it is properly defined.  */
+#define HAVE_STRCOLL 1
+
+/* Define if your struct stat has st_rdev.  */
+#define HAVE_ST_RDEV 1
+
+/* Define if you have the strftime function.  */
+#define HAVE_STRFTIME 1
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define if your struct tm has tm_zone.  */
+/* #undef HAVE_TM_ZONE */
+
+/* Define if you don't have tm_zone but do have the external array
+   tzname.  */
+#define HAVE_TZNAME 1
+
+/* Define if you have <unistd.h>.  */
+#define HAVE_UNISTD_H 1
+
+/* Define if utime(file, NULL) sets file's timestamp to the present.  */
+/* #undef HAVE_UTIME_NULL */
+
+/* Define if you have the wait3 system call.  */
+/* #undef HAVE_WAIT3 */
+
+/* Define if on MINIX.  */
+/* #undef _MINIX */
+
+/* Define if your struct nlist has an n_un member.  */
+/* #undef NLIST_NAME_UNION */
+
+/* Define if you have <nlist.h>.  */
+/* #undef NLIST_STRUCT */
+
+/* Define if your C compiler doesn't accept -c and -o together.  */
+/* #undef NO_MINUS_C_MINUS_O */
+
+/* Define to 'int' if <sys/types.h> doesn't define.  */
+#define pid_t int
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define if you need to in order for stat and other things to work.  */
+/* #undef _POSIX_SOURCE */
+
+/* Define as the return type of signal handlers (int or void).  */
+#define RETSIGTYPE void
+
+/* Define if the setvbuf function takes the buffering type as its second
+   argument and the buffer pointer as the third, as on System V
+   before release 3.  */
+/* #undef SETVBUF_REVERSED */
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#define STACK_DIRECTION -1
+
+/* Define if the 'S_IS*' macros in <sys/stat.h> do not work properly.  */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS
+
+/* Define on System V Release 4.  */
+/* #undef SVR4 */
+
+/* Define if 'sys_siglist' is declared by <signal.h>.  */
+/* #undef SYS_SIGLIST_DECLARED */
+
+/* Define to 'int' if <sys/types.h> doesn't define.  */
+#define uid_t int
+
+/* Define for Encore UMAX.  */
+/* #undef UMAX */
+
+/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
+   instead of <sys/cpustats.h>.  */
+/* #undef UMAX4_3 */
+
+/* Name of this package (needed by automake) */
+#define PACKAGE "make"
+
+/* Version of this package (needed by automake) */
+#define VERSION "4.3"
+
+/* Define to the name of the SCCS 'get' command.  */
+#define SCCS_GET "get"
+
+/* Define this if the SCCS 'get' command understands the '-G<file>' option.  */
+/* #undef SCCS_GET_MINUS_G */
+
+/* Define this to enable job server support in GNU make.  */
+/* #undef MAKE_JOBSERVER */
+
+/* Define to be the nanoseconds member of struct stat's st_mtim,
+   if it exists.  */
+/* #undef ST_MTIM_NSEC */
+
+/* Define this if the C library defines the variable 'sys_siglist'.  */
+/* #undef HAVE_SYS_SIGLIST */
+
+/* Define this if the C library defines the variable '_sys_siglist'.  */
+/* #undef HAVE__SYS_SIGLIST */
+
+/* Define this if you have the 'union wait' type in <sys/wait.h>.  */
+/* #undef HAVE_UNION_WAIT */
+
+/* Define if you have the dup2 function.  */
+/* #undef HAVE_DUP2 */
+
+/* Define if you have the getcwd function.  */
+#define HAVE_GETCWD 1
+
+/* Define if you have the getgroups function.  */
+/* #undef HAVE_GETGROUPS */
+
+/* Define if you have the gethostbyname function.  */
+/* #undef HAVE_GETHOSTBYNAME */
+
+/* Define if you have the gethostname function.  */
+/* #undef HAVE_GETHOSTNAME */
+
+/* Define if you have the memmove function.  */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the mktemp function.  */
+#define HAVE_MKTEMP 1
+
+/* Define if you have the psignal function.  */
+/* #undef HAVE_PSIGNAL */
+
+/* Define if you have the pstat_getdynamic function.  */
+/* #undef HAVE_PSTAT_GETDYNAMIC */
+
+/* Define if you have the setegid function.  */
+/* #undef HAVE_SETEGID */
+
+/* Define if you have the seteuid function.  */
+/* #undef HAVE_SETEUID */
+
+/* Define if you have the setlinebuf function.  */
+/* #undef HAVE_SETLINEBUF */
+
+/* Define if you have the setregid function.  */
+/* #undef HAVE_SETREGID */
+
+/* Define if you have the setreuid function.  */
+/* #undef HAVE_SETREUID */
+
+/* Define if you have the sigsetmask function.  */
+/* #undef HAVE_SIGSETMASK */
+
+/* Define if you have the socket function.  */
+/* #undef HAVE_SOCKET */
+
+/* Define to 1 if you have the strcasecmp function.  */
+/* #undef HAVE_STRCASECMP */
+
+/* Define to 1 if you have the strcmpi function.  */
+/* #undef HAVE_STRCMPI */
+
+/* Define to 1 if you have the stricmp function.  */
+/* #undef HAVE_STRICMP */
+
+/* Define if you have the strsignal function.  */
+/* #undef HAVE_STRSIGNAL */
+
+/* Define if you have the wait3 function.  */
+/* #undef HAVE_WAIT3 */
+
+/* Define if you have the waitpid function.  */
+/* #undef HAVE_WAITPID */
+
+/* Define if you have the <dirent.h> header file.  */
+#define HAVE_DIRENT_H 1
+
+/* Define if you have the <fcntl.h> header file.  */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <limits.h> header file.  */
+#define HAVE_LIMITS_H 1
+
+/* Define if you have the <mach/mach.h> header file.  */
+/* #undef HAVE_MACH_MACH_H */
+
+/* Define if you have the <memory.h> header file.  */
+/* #undef HAVE_MEMORY_H */
+
+/* Define if you have the <ndir.h> header file.  */
+/* #undef HAVE_NDIR_H */
+
+/* Define if you have the <stdlib.h> header file.  */
+/* #undef HAVE_STDLIB_H */
+
+/* Define if you have the <string.h> header file.  */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <sys/dir.h> header file.  */
+#define HAVE_SYS_DIR_H 1
+
+/* Define if you have the <sys/ndir.h> header file.  */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define if you have the <sys/param.h> header file.  */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define if you have the <sys/timeb.h> header file.  */
+/* #undef HAVE_SYS_TIMEB_H */
+
+/* Define if you have the <sys/wait.h> header file.  */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the dgc library (-ldgc).  */
+/* #undef HAVE_LIBDGC */
+
+/* Define if you have the kstat library (-lkstat).  */
+/* #undef HAVE_LIBKSTAT */
+
+/* Define to 1 if you have the `isatty' function. */
+/* #undef HAVE_ISATTY */
+
+/* Define to 1 if you have the `ttyname' function. */
+/* #undef HAVE_TTYNAME */
+
+/* Define if you have the sun library (-lsun).  */
+/* #undef HAVE_LIBSUN */
+
+/* Output sync sypport */
+#define NO_OUTPUT_SYNC
+
+/* Define for Case Insensitve behavior */
+#define HAVE_CASE_INSENSITIVE_FS
+
+/* Build host information. */
+#define MAKE_HOST "Amiga"
+
+/* Define to `int' if <sys/types.h> does not define. */
+#define ssize_t int
diff --git a/src/config.h-vms b/src/config.h-vms
new file mode 100644 (file)
index 0000000..e2284a3
--- /dev/null
@@ -0,0 +1,433 @@
+/* config.h-vms. Generated by hand by Klaus Kämpf <kkaempf@rmi.de>      -*-C-*-
+
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.ac by autoheader.  */
+
+/* Pull in types.h here to get __CRTL_VER defined for old versions of the
+   compiler which don't define it. */
+#ifdef __DECC
+# include <types.h>
+#endif
+
+/* Define to 1 if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+/* #undef _ALL_SOURCE */
+#endif
+
+/* Define to 1 if NLS is requested.  */
+/* #undef ENABLE_NLS */
+
+/* Define as 1 if you have dcgettext.  */
+/* #undef HAVE_DCGETTEXT */
+
+/* Define as 1 if you have gettext and don't want to use GNU gettext.  */
+/* #undef HAVE_GETTEXT */
+
+/* Embed GNU Guile support */
+/* #undef HAVE_GUILE */
+
+/* Define to 1 if your locale.h file contains LC_MESSAGES.  */
+/* #undef HAVE_LC_MESSAGES */
+
+/* Define to the installation directory for locales.  */
+#define LOCALEDIR ""
+
+/* Define as 1 if you have the stpcpy function.  */
+/* #undef HAVE_STPCPY */
+
+/* Define to 1 if the closedir function returns void instead of int.  */
+/* #undef CLOSEDIR_VOID */
+
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define for DGUX with <sys/dg_sys_info.h>.  */
+/* #undef DGUX */
+
+/* Define to 1 if the 'getloadavg' function needs to be run setuid or setgid.  */
+/* #undef GETLOADAVG_PRIVILEGED */
+
+/* Define to 'unsigned long' or 'unsigned long long'
+   if <inttypes.h> doesn't define.  */
+#define uintmax_t unsigned long
+
+/* Define to 'int' if <sys/types.h> doesn't define.  */
+/* #undef gid_t */
+
+/* Define to 1 if you have alloca, as a function or macro.  */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).  */
+/* #undef HAVE_ALLOCA_H */
+
+/* Define to 1 if you have the fdopen function.  */
+#define HAVE_FDOPEN 1
+
+/* Define to 1 if your system has a working fnmatch function.  */
+/* #undef HAVE_FNMATCH */
+
+/* Define to 1 if your system has its own 'getloadavg' function.  */
+/* #undef HAVE_GETLOADAVG */
+
+/* Define to 1 if you have the getmntent function.  */
+/* #undef HAVE_GETMNTENT */
+
+/* Define to 1 if the 'long double' type works.  */
+/* #undef HAVE_LONG_DOUBLE */
+
+/* Define to 1 if you support file names longer than 14 characters.  */
+#define HAVE_LONG_FILE_NAMES 1
+
+/* Define to 1 if you have a working 'mmap' system call.  */
+/* #undef HAVE_MMAP */
+
+/* Define to 1 if system calls automatically restart after interruption
+   by a signal.  */
+/* #undef HAVE_RESTARTABLE_SYSCALLS */
+
+/* Define to 1 if your struct stat has st_blksize.  */
+/* #undef HAVE_ST_BLKSIZE */
+
+/* Define to 1 if your struct stat has st_blocks.  */
+/* #undef HAVE_ST_BLOCKS */
+
+/* Define to 1 if you have the strcoll function and it is properly defined.  */
+/* #undef HAVE_STRCOLL */
+
+/* Define to 1 if you have the strncasecmp' function. */
+#if __CRTL_VER >= 70000000
+#define HAVE_STRNCASECMP 1
+#endif
+
+/* Define to 1 if your struct stat has st_rdev.  */
+/* #undef HAVE_ST_RDEV */
+
+/* Define to 1 if you have the strftime function.  */
+/* #undef HAVE_STRFTIME */
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible.  */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define to 1 if your struct tm has tm_zone.  */
+/* #undef HAVE_TM_ZONE */
+
+/* Define to 1 if you don't have tm_zone but do have the external array
+   tzname.  */
+/* #undef HAVE_TZNAME */
+
+/* Define to 1 if you have <unistd.h>.  */
+#ifdef __DECC
+#define HAVE_UNISTD_H 1
+#endif
+
+/* Define to 1 if utime(file, NULL) sets file's timestamp to the present.  */
+/* #undef HAVE_UTIME_NULL */
+
+/* Define to 1 if you have the wait3 system call.  */
+/* #undef HAVE_WAIT3 */
+
+/* Define to 1 if on MINIX.  */
+/* #undef _MINIX */
+
+/* Define to 1 if your struct nlist has an n_un member.  */
+/* #undef NLIST_NAME_UNION */
+
+/* Define to 1 if you have <nlist.h>.  */
+/* #undef NLIST_STRUCT */
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together.  */
+/* #undef NO_MINUS_C_MINUS_O */
+
+/* Define to 'int' if <sys/types.h> doesn't define.  */
+/* I assume types.h is available for all 5.0 cc/cxx compilers */
+#if __DECC_VER < 50090000
+#define pid_t int
+#endif
+
+/* Define to 1 if the system does not provide POSIX.1 features except
+   with this defined.  */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for stat and other things to work.  */
+/* #undef _POSIX_SOURCE */
+
+/* Define as the return type of signal handlers (int or void).  */
+#define RETSIGTYPE void
+
+/* Define to 1 if the setvbuf function takes the buffering type as its second
+   argument and the buffer pointer as the third, as on System V
+   before release 3.  */
+/* #undef SETVBUF_REVERSED */
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown
+ */
+/* #undef STACK_DIRECTION */
+
+/* Define to 1 if the 'S_IS*' macros in <sys/stat.h> do not work properly.  */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define to 1 if you have the ANSI C header files.  */
+/* #undef STDC_HEADERS */
+
+/* Define on System V Release 4.  */
+/* #undef SVR4 */
+
+/* Define to 1 if 'sys_siglist' is declared by <signal.h>.  */
+/* #undef SYS_SIGLIST_DECLARED */
+
+/* Define to 'int' if <sys/types.h> doesn't define.  */
+#if __DECC_VER < 50090000
+#define uid_t int
+#endif
+
+/* Define for Encore UMAX.  */
+/* #undef UMAX */
+
+/* Define for Encore UMAX 4.3 that has <inq_status/cpustats.h>
+   instead of <sys/cpustats.h>.  */
+/* #undef UMAX4_3 */
+
+/* Name of this package (needed by automake) */
+#define PACKAGE "make"
+
+/* Version of this package (needed by automake) */
+#define VERSION "4.3"
+
+/* Define to the name of the SCCS 'get' command.  */
+/* #undef SCCS_GET */
+
+/* Define this if the SCCS 'get' command understands the '-G<file>' option.  */
+/* #undef SCCS_GET_MINUS_G */
+
+/* Define this to enable job server support in GNU make.  */
+/* #undef MAKE_JOBSERVER */
+
+/* Define to be the nanoseconds member of struct stat's st_mtim,
+   if it exists.  */
+/* #undef ST_MTIM_NSEC */
+
+/* Define to 1 if the C library defines the variable 'sys_siglist'.  */
+/* #undefine HAVE_SYS_SIGLIST */
+
+/* Define to 1 if the C library defines the variable '_sys_siglist'.  */
+/* #undef HAVE__SYS_SIGLIST */
+
+/* Define to 1 if you have the 'union wait' type in <sys/wait.h>.  */
+/* #undef HAVE_UNION_WAIT */
+
+/* Define to 1 if you have the dup2 function.  */
+#define HAVE_DUP2 1
+
+/* Define to 1 if you have the getcwd function.  */
+#define HAVE_GETCWD 1
+
+/* Define to 1 if you have the getgroups function.  */
+/* #undef HAVE_GETGROUPS */
+
+/* Define to 1 if you have the gethostbyname function.  */
+/* #undef HAVE_GETHOSTBYNAME */
+
+/* Define to 1 if you have the gethostname function.  */
+/* #undef HAVE_GETHOSTNAME */
+
+/* Define to 1 if you have the memmove function.  */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the mktemp function.  */
+#define HAVE_MKTEMP 1
+
+/* Define to 1 if you have the psignal function.  */
+/* #undef HAVE_PSIGNAL */
+
+/* Define to 1 if you have the pstat_getdynamic function.  */
+/* #undef HAVE_PSTAT_GETDYNAMIC */
+
+/* Define to 1 if you have the setegid function.  */
+/* #undef HAVE_SETEGID */
+
+/* Define to 1 if you have the seteuid function.  */
+/* #undef HAVE_SETEUID */
+
+/* Define to 1 if you have the setlinebuf function.  */
+/* #undef HAVE_SETLINEBUF */
+
+/* Define to 1 if you have the setregid function.  */
+/* #undefine HAVE_SETREGID */
+
+/* Define to 1 if you have the setreuid function.  */
+/* #define HAVE_SETREUID */
+
+/* Define to 1 if you have the sigsetmask function.  */
+#define HAVE_SIGSETMASK 1
+
+/* Define to 1 if you have the socket function.  */
+/* #undef HAVE_SOCKET */
+
+/* Define to 1 if you have the strcasecmp function.  */
+#define HAVE_STRCASECMP 1
+
+/* Define to 1 if you have the strcmpi function.  */
+/* #undef HAVE_STRCMPI */
+
+/* Define to 1 if you have the stricmp function.  */
+/* #undef HAVE_STRICMP */
+
+/* Define to 1 if you have the strsignal function.  */
+/* #undef HAVE_STRSIGNAL */
+
+/* Define to 1 if you have the wait3 function.  */
+/* #undef HAVE_WAIT3 */
+
+/* Define to 1 if you have the waitpid function.  */
+/* #undef HAVE_WAITPID */
+
+/* Define to 1 if you have the <dirent.h> header file.  */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <fcntl.h> header file.  */
+#ifdef __DECC
+#define HAVE_FCNTL_H 1
+#endif
+
+/* Define to 1 if you have the <limits.h> header file.  */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the <mach/mach.h> header file.  */
+/* #undef HAVE_MACH_MACH_H */
+
+/* Define to 1 if you have the <memory.h> header file.  */
+/* #undef HAVE_MEMORY_H */
+
+/* Define to 1 if you have the <ndir.h> header file.  */
+/* #undef HAVE_NDIR_H */
+
+/* Define to 1 if you have the <stdlib.h> header file.  */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <string.h> header file.  */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/dir.h> header file.  */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define to 1 if you have the <sys/ndir.h> header file.  */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define to 1 if you have the <sys/param.h> header file.  */
+/* #undef HAVE_SYS_PARAM_H */
+
+/* Define to 1 if you have the <sys/timeb.h> header file.  */
+#ifndef __GNUC__
+#define HAVE_SYS_TIMEB_H 1
+#endif
+
+/* Define to 1 if you have the <sys/wait.h> header file.  */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define to 1 if you have the dgc library (-ldgc).  */
+/* #undef HAVE_LIBDGC */
+
+/* Define to 1 if you have the kstat library (-lkstat).  */
+/* #undef HAVE_LIBKSTAT *
+
+/* Define to 1 if you have the sun library (-lsun).  */
+/* #undef HAVE_LIBSUN */
+
+/* Define to 1 if you have the `isatty' function. */
+/* #undef HAVE_ISATTY */
+
+/* Define to 1 if you have the `ttyname' function. */
+/* #undef HAVE_TTYNAME */
+
+/* Use high resolution file timestamps if nonzero. */
+#define FILE_TIMESTAMP_HI_RES 0
+
+/* Define for case insensitve filenames */
+#define HAVE_CASE_INSENSITIVE_FS 1
+
+/* VMS specific, define it if you want to use case sensitive targets */
+/* #undef WANT_CASE_SENSITIVE_TARGETS */
+
+/* VMS specific, V7.0 has opendir() and friends, so it's undefined */
+/* If you want to use non-VMS code for opendir() etc. on V7.0 and greater
+   define the first or both macros AND change the compile command to get the
+   non-VMS versions linked: (prefix=(all,except=(opendir,...  */
+/* #undef HAVE_VMSDIR_H */
+/* #undef _DIRENT_HAVE_D_NAMLEN */
+
+/* On older systems without 7.0 backport of CRTL use non-VMS code for opendir() etc. */
+#if __CRTL_VER < 70000000
+# define HAVE_VMSDIR_H 1
+#endif
+
+#if defined(HAVE_VMSDIR_H) && defined(HAVE_DIRENT_H)
+#undef HAVE_DIRENT_H
+#endif
+
+#define HAVE_STDLIB_H 1
+#define INCLUDEDIR "sys$sysroot:[syslib]"
+#define LIBDIR "sys$sysroot:[syslib]"
+
+/* Don't use RTL functions of OpenVMS */
+#ifdef __DECC
+#include <stdio.h>
+#include <unistd.h>
+#define getopt   gnu_getopt
+#define optarg   gnu_optarg
+#define optopt   gnu_optopt
+#define optind   gnu_optind
+#define opterr   gnu_opterr
+#define globfree gnu_globfree
+#define glob     gnu_glob
+#endif
+
+/* Define if using alloca.c.  */
+/* #undef C_ALLOCA */
+/* maybe this should be placed into makeint.h */
+#if     defined(__VAX) && defined(__DECC)
+#define alloca(n)       __ALLOCA(n)
+#endif
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #  undef WORDS_BIGENDIAN */
+
+/* Output sync sypport */
+#define NO_OUTPUT_SYNC
+
+/* Define to 1 to write even short single-line actions into a VMS/DCL command
+   file; this also enables exporting make environment variables into the
+   (sub-)process, which executes the action.
+   The usual make rules apply whether a shell variable - here a DCL symbol or
+   VMS logical [see CRTL getenv()] - is added to the make environment and
+   is exported. */
+#define USE_DCL_COM_FILE 1
+
+/* Build host information. */
+#define MAKE_HOST "VMS"
diff --git a/src/config.h.W32 b/src/config.h.W32
new file mode 100644 (file)
index 0000000..be2a33e
--- /dev/null
@@ -0,0 +1,554 @@
+/* config.h.W32 -- hand-massaged config.h file for Windows builds       -*-C-*-
+
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Suppress some Visual C++ warnings.
+   Maybe after the code cleanup for ISO C we can remove some/all of these.  */
+#if _MSC_VER > 1000
+# pragma warning(disable:4100) /* unreferenced formal parameter */
+# pragma warning(disable:4102) /* unreferenced label */
+# pragma warning(disable:4127) /* conditional expression is constant */
+# pragma warning(disable:4131) /* uses old-style declarator */
+# pragma warning(disable:4702) /* unreachable code */
+# define _CRT_SECURE_NO_WARNINGS  /* function or variable may be unsafe */
+# define _CRT_NONSTDC_NO_WARNINGS /* functions w/o a leading underscore */
+#endif
+
+/* Define to 1 if the 'closedir' function returns void instead of 'int'. */
+/* #undef CLOSEDIR_VOID */
+
+/* Define to one of '_getb67', 'GETB67', 'getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for 'alloca.c' support on those systems.
+   */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define to 1 if using 'alloca.c'. */
+/* #undef C_ALLOCA */
+
+/* Define to 1 if using 'getloadavg.c'. */
+#define C_GETLOADAVG 1
+
+/* Define to 1 for DGUX with <sys/dg_sys_info.h>. */
+/* #undef DGUX */
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+/* #undef ENABLE_NLS */
+
+/* Use high resolution file timestamps if nonzero. */
+#define FILE_TIMESTAMP_HI_RES 0
+
+/* Define to 1 if the 'getloadavg' function needs to be run setuid or setgid.
+   */
+/* #undef GETLOADAVG_PRIVILEGED */
+
+/* Define to 1 if you have 'alloca', as a function or macro. */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+/* #undef HAVE_ALLOCA_H */
+
+/* Define to 1 if you have the 'atexit' function. */
+#define HAVE_ATEXIT 1
+
+/* Use case insensitive file names */
+/* #undef HAVE_CASE_INSENSITIVE_FS */
+
+/* Define to 1 if you have the clock_gettime function. */
+/* #undef HAVE_CLOCK_GETTIME */
+
+/* Embed GNU Guile support.  Windows build sets this on the
+   compilation command line.  */
+/* #undef HAVE_GUILE */
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+   */
+/* #undef HAVE_DCGETTEXT */
+
+/* Define to 1 if you have the declaration of 'bsd_signal', and to 0 if you
+   don't. */
+#define HAVE_DECL_BSD_SIGNAL 0
+
+/* Define to 1 if you have the declaration of 'sys_siglist', and to 0 if you
+   don't. */
+#define HAVE_DECL_SYS_SIGLIST 0
+
+/* Define to 1 if you have the declaration of '_sys_siglist', and to 0 if you
+   don't. */
+#define HAVE_DECL__SYS_SIGLIST 0
+
+/* Define to 1 if you have the declaration of '__sys_siglist', and to 0 if you
+   don't. */
+#define HAVE_DECL___SYS_SIGLIST 0
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines 'DIR'.
+   */
+#define HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the <direct.h> header file, and it defines getcwd()
+   and chdir().
+   */
+#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(__INTERIX)
+# define HAVE_DIRECT_H 1
+#endif
+
+/* Use platform specific coding */
+#define HAVE_DOS_PATHS 1
+
+/* Define to 1 if you have the 'dup2' function. */
+#define HAVE_DUP2 1
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the 'fdopen' function. */
+#ifdef __MINGW32__
+#define HAVE_FDOPEN 1
+#endif
+
+/* Define to 1 if you have the 'fileno' function. */
+#define HAVE_FILENO 1
+
+/* Define to 1 if you have the 'getcwd' function.  */
+#define HAVE_GETCWD 1
+
+/* Define to 1 if you have the 'getgroups' function. */
+/* #undef HAVE_GETGROUPS */
+
+/* Define to 1 if you have the 'gethostbyname' function. */
+/* #undef HAVE_GETHOSTBYNAME */
+
+/* Define to 1 if you have the 'gethostname' function. */
+/* #undef HAVE_GETHOSTNAME */
+
+/* Define to 1 if you have the 'getloadavg' function. */
+/* #undef HAVE_GETLOADAVG */
+
+/* Define to 1 if you have the 'getrlimit' function. */
+/* #undef HAVE_GETRLIMIT */
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+/* #undef HAVE_GETTEXT */
+
+/* Define to 1 if you have a standard gettimeofday function */
+#ifdef __MINGW32__
+#define HAVE_GETTIMEOFDAY 1
+#endif
+
+/* Define if you have the iconv() function. */
+/* #undef HAVE_ICONV */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#ifdef __MINGW32__
+#define HAVE_INTTYPES_H 1
+#endif
+
+/* Define to 1 if you have the 'dgc' library (-ldgc). */
+/* #undef HAVE_LIBDGC */
+
+/* Define to 1 if you have the 'kstat' library (-lkstat). */
+/* #undef HAVE_LIBKSTAT */
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the <locale.h> header file. */
+/*#define HAVE_LOCALE_H 1*/
+
+/* Define to 1 if you have the 'lstat' function. */
+/* #undef HAVE_LSTAT */
+
+/* Define to 1 if you have the <mach/mach.h> header file. */
+/* #undef HAVE_MACH_MACH_H */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the 'mkstemp' function. */
+/* #undef HAVE_MKSTEMP */
+
+/* Define to 1 if you have the 'mktemp' function. */
+#define HAVE_MKTEMP 1
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines 'DIR'. */
+/* #undef HAVE_NDIR_H */
+
+/* Define to 1 if you have the <nlist.h> header file. */
+/* #undef HAVE_NLIST_H */
+
+/* Define to 1 if you have the 'pipe' function. */
+/* #undef HAVE_PIPE */
+
+/* Define to 1 if you have the 'pstat_getdynamic' function. */
+/* #undef HAVE_PSTAT_GETDYNAMIC */
+
+/* Define to 1 if you have the 'readlink' function. */
+/* #undef HAVE_READLINK */
+
+/* Define to 1 if you have the 'realpath' function. */
+/* #undef HAVE_REALPATH */
+
+/* Define to 1 if <signal.h> defines the SA_RESTART constant. */
+/* #undef HAVE_SA_RESTART */
+
+/* Define to 1 if you have the 'setegid' function. */
+/* #undef HAVE_SETEGID */
+
+/* Define to 1 if you have the 'seteuid' function. */
+/* #undef HAVE_SETEUID */
+
+/* Define to 1 if you have the 'setlinebuf' function. */
+/* #undef HAVE_SETLINEBUF */
+
+/* Define to 1 if you have the 'setlocale' function. */
+/*#define HAVE_SETLOCALE 1*/
+
+/* Define to 1 if you have the 'setregid' function. */
+/* #undef HAVE_SETREGID */
+
+/* Define to 1 if you have the 'setreuid' function. */
+/* #undef HAVE_SETREUID */
+
+/* Define to 1 if you have the 'setrlimit' function. */
+/* #undef HAVE_SETRLIMIT */
+
+/* Define to 1 if you have the 'setvbuf' function. */
+#define HAVE_SETVBUF 1
+
+/* Define to 1 if you have the 'sigaction' function. */
+/* #undef HAVE_SIGACTION */
+
+/* Define to 1 if you have the 'sigsetmask' function. */
+/* #undef HAVE_SIGSETMASK */
+
+/* Define to 1 if you have the 'socket' function. */
+/* #undef HAVE_SOCKET */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#ifdef __MINGW32__
+#define HAVE_STDINT_H 1
+#endif
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the 'strcasecmp' function. */
+#ifdef __MINGW32__
+#define HAVE_STRCASECMP 1
+#endif
+
+/* Define to 1 if you have the 'strcmpi' function. */
+#define HAVE_STRCMPI 1
+
+/* Define to 1 if you have the 'strcoll' function and it is properly defined.
+   */
+#define HAVE_STRCOLL 1
+
+/* Define to 1 if you have the 'strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the 'stricmp' function. */
+#define HAVE_STRICMP 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#ifdef __MINGW32__
+#define HAVE_STRINGS_H 1
+#endif
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the 'strncasecmp' function. */
+#ifdef __MINGW32__
+#define HAVE_STRNCASECMP 1
+#endif
+
+/* Define to 1 if you have the 'strncmpi' function. */
+/* #undef HAVE_STRNCMPI */
+
+/* Define to 1 if you have the 'strndup' function. */
+/* #undef HAVE_STRNDUP */
+
+/* Define to 1 if you have the 'strnicmp' function. */
+#ifdef __MINGW32__
+#define HAVE_STRNICMP 1
+#endif
+
+/* Define to 1 if you have the 'strsignal' function. */
+/* #undef HAVE_STRSIGNAL */
+
+/* Define to 1 if `d_type' is a member of `struct dirent'. */
+/* SV 57152: MinGW64 version of dirent doesn't support d_type. */
+#ifndef __MINGW64__
+# define HAVE_STRUCT_DIRENT_D_TYPE 1
+#endif
+
+/* Define to 1 if you have the `isatty' function. */
+#define HAVE_ISATTY 1
+
+/* Define to 1 if you have the `ttyname' function. */
+#define HAVE_TTYNAME 1
+char *ttyname (int);
+
+/* Define to 1 if you have the `umask' function. */
+#ifdef __MINGW32__
+# define HAVE_UMASK 1
+#endif
+
+/* Define to 1 if 'n_un.n_name' is a member of 'struct nlist'. */
+/* #undef HAVE_STRUCT_NLIST_N_UN_N_NAME */
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines 'DIR'.
+   */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines 'DIR'.
+   */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#ifdef __MINGW32__
+#define HAVE_SYS_PARAM_H 1
+#endif
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+/* #undef HAVE_SYS_RESOURCE_H */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/timeb.h> header file. */
+#define HAVE_SYS_TIMEB_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#ifdef __MINGW32__
+#define HAVE_SYS_TIME_H 1
+#endif
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define to 1 if you have the \'union wait' type in <sys/wait.h>. */
+/* #undef HAVE_UNION_WAIT */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#ifdef __MINGW32__
+#define HAVE_UNISTD_H 1
+#endif
+
+/* Define to 1 if you have the 'wait3' function. */
+/* #undef HAVE_WAIT3 */
+
+/* Define to 1 if you have the 'waitpid' function. */
+/* #undef HAVE_WAITPID */
+
+/* Build host information. */
+#define MAKE_HOST "Windows32"
+
+/* Define to 1 to enable job server support in GNU make. */
+#define MAKE_JOBSERVER 1
+
+/* Define to 1 to enable 'load' support in GNU make. */
+#define MAKE_LOAD 1
+
+/* Define to 1 to enable symbolic link timestamp checking. */
+/* #undef MAKE_SYMLINKS */
+
+/* Define to 1 if your 'struct nlist' has an 'n_un' member. Obsolete, depend
+   on 'HAVE_STRUCT_NLIST_N_UN_N_NAME */
+/* #undef NLIST_NAME_UNION */
+
+/* Define to 1 if struct nlist.n_name is a pointer rather than an array. */
+/* #undef NLIST_STRUCT */
+
+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+/* #undef NO_MINUS_C_MINUS_O */
+
+/* Name of this package (needed by automake) */
+#define PACKAGE "make"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "bug-make@gnu.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "GNU make"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL "http://www.gnu.org/software/make/"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "4.3"
+
+/* Define to the character that separates directories in PATH. */
+#define PATH_SEPARATOR_CHAR ';'
+
+/* Define as the return type of signal handlers ('int' or 'void'). */
+#define RETSIGTYPE void
+
+/* Define to the name of the SCCS 'get' command. */
+#define SCCS_GET "echo no sccs get"
+
+/* Define this if the SCCS 'get' command understands the '-G<file>' option. */
+/* #undef SCCS_GET_MINUS_G */
+
+/* Define to 1 if the 'setvbuf' function takes the buffering type as its
+   second argument and the buffer pointer as the third, as on System V before
+   release 3. */
+/* #undef SETVBUF_REVERSED */
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run time.
+        STACK_DIRECTION > 0 => grows toward higher addresses
+        STACK_DIRECTION < 0 => grows toward lower addresses
+        STACK_DIRECTION = 0 => direction of growth unknown */
+/* #undef STACK_DIRECTION */
+
+/* Define to 1 if the 'S_IS*' macros in <sys/stat.h> do not work properly. */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define if struct stat contains a nanoseconds field */
+/* #undef ST_MTIM_NSEC */
+
+/* Define to 1 on System V Release 4. */
+/* #undef SVR4 */
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#ifdef __MINGW32__
+#define TIME_WITH_SYS_TIME 1
+#endif
+
+/* Define to 1 for Encore UMAX. */
+/* #undef UMAX */
+
+/* Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h> instead of
+   <sys/cpustats.h>. */
+/* #undef UMAX4_3 */
+
+/* Version number of package */
+#define VERSION "4.3"
+
+/* Define if using the dmalloc debugging malloc package */
+/* #undef WITH_DMALLOC */
+
+/* Define to 1 if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+/* # undef _ALL_SOURCE */
+#endif
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+/* #  undef WORDS_BIGENDIAN */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to 1 if on MINIX. */
+/* #undef _MINIX */
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define to 1 if you need to in order for 'stat' and other things to work. */
+/* #undef _POSIX_SOURCE */
+
+/* Define to empty if 'const' does not conform to ANSI C. */
+/* #undef const */
+
+#ifdef __MINGW32__
+# undef __USE_MINGW_ANSI_STDIO
+# define __USE_MINGW_ANSI_STDIO 1
+#endif
+
+#include <sys/types.h>
+
+/* Define to 'int' if <sys/types.h> doesn't define. */
+#define gid_t int
+
+/* Define to 'int' if <sys/types.h> does not define. */
+/* GCC 4.x reportedly defines pid_t.  */
+#ifndef _PID_T_
+#ifdef _WIN64
+#define pid_t __int64
+#else
+#define pid_t int
+#endif
+#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+#define ssize_t int
+
+/* Define to 'int' if <sys/types.h> doesn't define. */
+#define uid_t int
+
+/* Define uintmax_t if not defined in <stdint.h> or <inttypes.h>. */
+#if !HAVE_STDINT_H && !HAVE_INTTYPES_H
+#define uintmax_t unsigned long
+#endif
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
+/* #undef HAVE_SYS_WAIT_H */
+
+/* Define to the installation directory for locales.  */
+#define LOCALEDIR ""
+
+/*
+ * Refer to README.W32 for info on the following settings
+ */
+
+
+/*
+ * If you have a shell that does not grok 'sh -c quoted-command-line'
+ * correctly, you need this setting. Please see below for specific
+ * shell support.
+ */
+/*#define BATCH_MODE_ONLY_SHELL 1 */
+
+/*
+ * Define if you have the Cygnus "Cygwin" GNU Windows32 tool set.
+ * Do NOT define BATCH_MODE_ONLY_SHELL if you define HAVE_CYGWIN_SHELL
+ */
+/*#define HAVE_CYGWIN_SHELL 1 */
+
+/*
+ * Define if you have the MKS tool set or shell. Do NOT define
+ * BATCH_MODE_ONLY_SHELL if you define HAVE_MKS_SHELL
+ */
+/*#define HAVE_MKS_SHELL 1 */
+
+/*
+ * Enforce the mutual exclusivity restriction.
+ */
+#ifdef HAVE_MKS_SHELL
+#undef BATCH_MODE_ONLY_SHELL
+#endif
+
+#ifdef HAVE_CYGWIN_SHELL
+#undef BATCH_MODE_ONLY_SHELL
+#endif
diff --git a/src/config.h.in b/src/config.h.in
new file mode 100644 (file)
index 0000000..4757a50
--- /dev/null
@@ -0,0 +1,1132 @@
+/* src/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* CPU and C ABI indicator */
+#ifndef __i386__
+#undef __i386__
+#endif
+#ifndef __x86_64_x32__
+#undef __x86_64_x32__
+#endif
+#ifndef __x86_64__
+#undef __x86_64__
+#endif
+#ifndef __alpha__
+#undef __alpha__
+#endif
+#ifndef __arm__
+#undef __arm__
+#endif
+#ifndef __armhf__
+#undef __armhf__
+#endif
+#ifndef __arm64_ilp32__
+#undef __arm64_ilp32__
+#endif
+#ifndef __arm64__
+#undef __arm64__
+#endif
+#ifndef __hppa__
+#undef __hppa__
+#endif
+#ifndef __hppa64__
+#undef __hppa64__
+#endif
+#ifndef __ia64_ilp32__
+#undef __ia64_ilp32__
+#endif
+#ifndef __ia64__
+#undef __ia64__
+#endif
+#ifndef __m68k__
+#undef __m68k__
+#endif
+#ifndef __mips__
+#undef __mips__
+#endif
+#ifndef __mipsn32__
+#undef __mipsn32__
+#endif
+#ifndef __mips64__
+#undef __mips64__
+#endif
+#ifndef __powerpc__
+#undef __powerpc__
+#endif
+#ifndef __powerpc64__
+#undef __powerpc64__
+#endif
+#ifndef __powerpc64_elfv2__
+#undef __powerpc64_elfv2__
+#endif
+#ifndef __riscv32__
+#undef __riscv32__
+#endif
+#ifndef __riscv64__
+#undef __riscv64__
+#endif
+#ifndef __riscv32_ilp32__
+#undef __riscv32_ilp32__
+#endif
+#ifndef __riscv32_ilp32f__
+#undef __riscv32_ilp32f__
+#endif
+#ifndef __riscv32_ilp32d__
+#undef __riscv32_ilp32d__
+#endif
+#ifndef __riscv64_ilp32__
+#undef __riscv64_ilp32__
+#endif
+#ifndef __riscv64_ilp32f__
+#undef __riscv64_ilp32f__
+#endif
+#ifndef __riscv64_ilp32d__
+#undef __riscv64_ilp32d__
+#endif
+#ifndef __riscv64_lp64__
+#undef __riscv64_lp64__
+#endif
+#ifndef __riscv64_lp64f__
+#undef __riscv64_lp64f__
+#endif
+#ifndef __riscv64_lp64d__
+#undef __riscv64_lp64d__
+#endif
+#ifndef __s390__
+#undef __s390__
+#endif
+#ifndef __s390x__
+#undef __s390x__
+#endif
+#ifndef __sh__
+#undef __sh__
+#endif
+#ifndef __sparc__
+#undef __sparc__
+#endif
+#ifndef __sparc64__
+#undef __sparc64__
+#endif
+
+
+/* Define if building universal (internal helper macro) */
+#undef AC_APPLE_UNIVERSAL_BUILD
+
+/* Define to the number of bits in type 'ptrdiff_t'. */
+#undef BITSIZEOF_PTRDIFF_T
+
+/* Define to the number of bits in type 'sig_atomic_t'. */
+#undef BITSIZEOF_SIG_ATOMIC_T
+
+/* Define to the number of bits in type 'size_t'. */
+#undef BITSIZEOF_SIZE_T
+
+/* Define to the number of bits in type 'wchar_t'. */
+#undef BITSIZEOF_WCHAR_T
+
+/* Define to the number of bits in type 'wint_t'. */
+#undef BITSIZEOF_WINT_T
+
+/* Define to 1 if the `closedir' function returns void instead of `int'. */
+#undef CLOSEDIR_VOID
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* Define to 1 for DGUX with <sys/dg_sys_info.h>. */
+#undef DGUX
+
+/* Define to 1 if // is a file system root distinct from /. */
+#undef DOUBLE_SLASH_IS_DISTINCT_ROOT
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#undef ENABLE_NLS
+
+/* Define this to 1 if F_DUPFD behavior does not match POSIX */
+#undef FCNTL_DUPFD_BUGGY
+
+/* Use high resolution file timestamps if nonzero. */
+#undef FILE_TIMESTAMP_HI_RES
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module fscanf shall be considered present. */
+#undef GNULIB_FSCANF
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module msvc-nothrow shall be considered present. */
+#undef GNULIB_MSVC_NOTHROW
+
+/* Define to 1 if printf and friends should be labeled with attribute
+   "__gnu_printf__" instead of "__printf__" */
+#undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module scanf shall be considered present. */
+#undef GNULIB_SCANF
+
+/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
+   whether the gnulib module strerror shall be considered present. */
+#undef GNULIB_STRERROR
+
+/* Define to 1 when the gnulib module access should be tested. */
+#undef GNULIB_TEST_ACCESS
+
+/* Define to 1 when the gnulib module close should be tested. */
+#undef GNULIB_TEST_CLOSE
+
+/* Define to 1 when the gnulib module dup2 should be tested. */
+#undef GNULIB_TEST_DUP2
+
+/* Define to 1 when the gnulib module fcntl should be tested. */
+#undef GNULIB_TEST_FCNTL
+
+/* Define to 1 when the gnulib module getdtablesize should be tested. */
+#undef GNULIB_TEST_GETDTABLESIZE
+
+/* Define to 1 when the gnulib module getloadavg should be tested. */
+#undef GNULIB_TEST_GETLOADAVG
+
+/* Define to 1 when the gnulib module malloc-posix should be tested. */
+#undef GNULIB_TEST_MALLOC_POSIX
+
+/* Define to 1 when the gnulib module stpcpy should be tested. */
+#undef GNULIB_TEST_STPCPY
+
+/* Define to 1 when the gnulib module strerror should be tested. */
+#undef GNULIB_TEST_STRERROR
+
+/* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
+   may be supplied by this distribution. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the `atexit' function. */
+#undef HAVE_ATEXIT
+
+/* Use case insensitive file names */
+#undef HAVE_CASE_INSENSITIVE_FS
+
+/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
+   CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
+   the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define to 1 if you have the clock_gettime function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+   */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `bsd_signal', and to 0 if you
+   don't. */
+#undef HAVE_DECL_BSD_SIGNAL
+
+/* Define to 1 if you have the declaration of `dlerror', and to 0 if you
+   don't. */
+#undef HAVE_DECL_DLERROR
+
+/* Define to 1 if you have the declaration of `dlopen', and to 0 if you don't.
+   */
+#undef HAVE_DECL_DLOPEN
+
+/* Define to 1 if you have the declaration of `dlsym', and to 0 if you don't.
+   */
+#undef HAVE_DECL_DLSYM
+
+/* Define to 1 if you have the declaration of `getdtablesize', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETDTABLESIZE
+
+/* Define to 1 if you have the declaration of `program_invocation_name', and
+   to 0 if you don't. */
+#undef HAVE_DECL_PROGRAM_INVOCATION_NAME
+
+/* Define to 1 if you have the declaration of `program_invocation_short_name',
+   and to 0 if you don't. */
+#undef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
+
+/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
+   don't. */
+#undef HAVE_DECL_STRERROR_R
+
+/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
+   don't. */
+#undef HAVE_DECL_SYS_SIGLIST
+
+/* Define to 1 if you have the declaration of `_sys_siglist', and to 0 if you
+   don't. */
+#undef HAVE_DECL__SYS_SIGLIST
+
+/* Define to 1 if you have the declaration of `__argv', and to 0 if you don't.
+   */
+#undef HAVE_DECL___ARGV
+
+/* Define to 1 if you have the declaration of `__sys_siglist', and to 0 if you
+   don't. */
+#undef HAVE_DECL___SYS_SIGLIST
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
+/* Use platform specific coding */
+#undef HAVE_DOS_PATHS
+
+/* Define to 1 if you have the `dup' function. */
+#undef HAVE_DUP
+
+/* Define to 1 if you have the `dup2' function. */
+#undef HAVE_DUP2
+
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fdopen' function. */
+#undef HAVE_FDOPEN
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getdtablesize' function. */
+#undef HAVE_GETDTABLESIZE
+
+/* Define to 1 if you have the `getexecname' function. */
+#undef HAVE_GETEXECNAME
+
+/* Define to 1 if you have the `getgroups' function. */
+#undef HAVE_GETGROUPS
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#undef HAVE_GETHOSTBYNAME
+
+/* Define to 1 if you have the `gethostname' function. */
+#undef HAVE_GETHOSTNAME
+
+/* Define to 1 if you have the `getprogname' function. */
+#undef HAVE_GETPROGNAME
+
+/* Define to 1 if you have the `getrlimit' function. */
+#undef HAVE_GETRLIMIT
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have a standard gettimeofday function */
+#undef HAVE_GETTIMEOFDAY
+
+/* Embed GNU Guile support */
+#undef HAVE_GUILE
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `isatty' function. */
+#undef HAVE_ISATTY
+
+/* Define to 1 if you have the `dgc' library (-ldgc). */
+#undef HAVE_LIBDGC
+
+/* Define to 1 if you have the `kstat' library (-lkstat). */
+#undef HAVE_LIBKSTAT
+
+/* Define to 1 if you have the `perfstat' library (-lperfstat). */
+#undef HAVE_LIBPERFSTAT
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if the system has the type 'long long int'. */
+#undef HAVE_LONG_LONG_INT
+
+/* Define to 1 if you have the `lstat' function. */
+#undef HAVE_LSTAT
+
+/* Define to 1 if you have the <mach/mach.h> header file. */
+#undef HAVE_MACH_MACH_H
+
+/* Define if the 'malloc' function is POSIX compliant. */
+#undef HAVE_MALLOC_POSIX
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memrchr' function. */
+#undef HAVE_MEMRCHR
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* Define to 1 if you have the `mktemp' function. */
+#undef HAVE_MKTEMP
+
+/* Define to 1 on MSVC platforms that have the "invalid parameter handler"
+   concept. */
+#undef HAVE_MSVC_INVALID_PARAMETER_HANDLER
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the <nlist.h> header file. */
+#undef HAVE_NLIST_H
+
+/* Define to 1 if you have the `pipe' function. */
+#undef HAVE_PIPE
+
+/* Define to 1 if you have the `posix_spawn' function. */
+#undef HAVE_POSIX_SPAWN
+
+/* Define to 1 if you have the `posix_spawnattr_setsigmask' function. */
+#undef HAVE_POSIX_SPAWNATTR_SETSIGMASK
+
+/* Define to 1 if you have the `pselect' function. */
+#undef HAVE_PSELECT
+
+/* Define to 1 if you have the `pstat_getdynamic' function. */
+#undef HAVE_PSTAT_GETDYNAMIC
+
+/* Define to 1 if you have the `readlink' function. */
+#undef HAVE_READLINK
+
+/* Define to 1 if you have the `realpath' function. */
+#undef HAVE_REALPATH
+
+/* Define to 1 if <signal.h> defines the SA_RESTART constant. */
+#undef HAVE_SA_RESTART
+
+/* Define to 1 if you have the `setdtablesize' function. */
+#undef HAVE_SETDTABLESIZE
+
+/* Define to 1 if you have the `setegid' function. */
+#undef HAVE_SETEGID
+
+/* Define to 1 if you have the `seteuid' function. */
+#undef HAVE_SETEUID
+
+/* Define to 1 if you have the `setlinebuf' function. */
+#undef HAVE_SETLINEBUF
+
+/* Define to 1 if you have the `setregid' function. */
+#undef HAVE_SETREGID
+
+/* Define to 1 if you have the `setreuid' function. */
+#undef HAVE_SETREUID
+
+/* Define to 1 if you have the `setrlimit' function. */
+#undef HAVE_SETRLIMIT
+
+/* Define to 1 if you have the `setvbuf' function. */
+#undef HAVE_SETVBUF
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if 'sig_atomic_t' is a signed integer type. */
+#undef HAVE_SIGNED_SIG_ATOMIC_T
+
+/* Define to 1 if 'wchar_t' is a signed integer type. */
+#undef HAVE_SIGNED_WCHAR_T
+
+/* Define to 1 if 'wint_t' is a signed integer type. */
+#undef HAVE_SIGNED_WINT_T
+
+/* Define to 1 if you have the `sigsetmask' function. */
+#undef HAVE_SIGSETMASK
+
+/* Define to 1 if you have the `socket' function. */
+#undef HAVE_SOCKET
+
+/* Define to 1 if you have the <spawn.h> header file. */
+#undef HAVE_SPAWN_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strcmpi' function. */
+#undef HAVE_STRCMPI
+
+/* Define to 1 if you have the `strcoll' function and it is properly defined.
+   */
+#undef HAVE_STRCOLL
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror_r' function. */
+#undef HAVE_STRERROR_R
+
+/* Define to 1 if you have the `stricmp' function. */
+#undef HAVE_STRICMP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the `strncmpi' function. */
+#undef HAVE_STRNCMPI
+
+/* Define to 1 if you have the `strndup' function. */
+#undef HAVE_STRNDUP
+
+/* Define to 1 if you have the `strnicmp' function. */
+#undef HAVE_STRNICMP
+
+/* Define to 1 if you have the `strsignal' function. */
+#undef HAVE_STRSIGNAL
+
+/* Define to 1 if `d_type' is a member of `struct dirent'. */
+#undef HAVE_STRUCT_DIRENT_D_TYPE
+
+/* Define to 1 if `n_un.n_name' is a member of `struct nlist'. */
+#undef HAVE_STRUCT_NLIST_N_UN_N_NAME
+
+/* Define to 1 if you have the `symlink' function. */
+#undef HAVE_SYMLINK
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
+/* Define to 1 if you have the <sys/inttypes.h> header file. */
+#undef HAVE_SYS_INTTYPES_H
+
+/* Define to 1 if you have the <sys/loadavg.h> header file. */
+#undef HAVE_SYS_LOADAVG_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#undef HAVE_SYS_RESOURCE_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/timeb.h> header file. */
+#undef HAVE_SYS_TIMEB_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the `ttyname' function. */
+#undef HAVE_TTYNAME
+
+/* Define to 1 if the system has the type `uintmax_t'. */
+#undef HAVE_UINTMAX_T
+
+/* Define to 1 if you have the `umask' function. */
+#undef HAVE_UMASK
+
+/* Define to 1 if you have the 'union wait' type in <sys/wait.h>. */
+#undef HAVE_UNION_WAIT
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if the system has the type 'unsigned long long int'. */
+#undef HAVE_UNSIGNED_LONG_LONG_INT
+
+/* Define if you have a global __progname variable */
+#undef HAVE_VAR___PROGNAME
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if you have the `wait3' function. */
+#undef HAVE_WAIT3
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
+/* Define if you have the 'wchar_t' type. */
+#undef HAVE_WCHAR_T
+
+/* Define to 1 if you have the <winsock2.h> header file. */
+#undef HAVE_WINSOCK2_H
+
+/* Define if you have the 'wint_t' type. */
+#undef HAVE_WINT_T
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if O_NOATIME works. */
+#undef HAVE_WORKING_O_NOATIME
+
+/* Define to 1 if O_NOFOLLOW works. */
+#undef HAVE_WORKING_O_NOFOLLOW
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
+#undef HAVE__SET_INVALID_PARAMETER_HANDLER
+
+/* Build host information. */
+#undef MAKE_HOST
+
+/* Define to 1 to enable job server support in GNU make. */
+#undef MAKE_JOBSERVER
+
+/* Define to 1 to enable 'load' support in GNU make. */
+#undef MAKE_LOAD
+
+/* Define to 1 to enable symbolic link timestamp checking. */
+#undef MAKE_SYMLINKS
+
+/* Use GNU style printf and scanf.  */
+#ifndef __USE_MINGW_ANSI_STDIO
+# undef __USE_MINGW_ANSI_STDIO
+#endif
+
+
+/* Define to 1 if the nlist n_name member is a pointer */
+#undef N_NAME_POINTER
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to the character that separates directories in PATH. */
+#undef PATH_SEPARATOR_CHAR
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'ptrdiff_t'. */
+#undef PTRDIFF_T_SUFFIX
+
+/* Define to 1 if strerror(0) does not return a message implying success. */
+#undef REPLACE_STRERROR_0
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to the name of the SCCS 'get' command. */
+#undef SCCS_GET
+
+/* Define to 1 if the SCCS 'get' command understands the '-G<file>' option. */
+#undef SCCS_GET_MINUS_G
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'sig_atomic_t'. */
+#undef SIG_ATOMIC_T_SUFFIX
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'size_t'. */
+#undef SIZE_T_SUFFIX
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+       STACK_DIRECTION > 0 => grows toward higher addresses
+       STACK_DIRECTION < 0 => grows toward lower addresses
+       STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
+#undef STAT_MACROS_BROKEN
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if strerror_r returns char *. */
+#undef STRERROR_R_CHAR_P
+
+/* Define if struct stat contains a nanoseconds field */
+#undef ST_MTIM_NSEC
+
+/* Define to 1 on System V Release 4. */
+#undef SVR4
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define to 1 for Encore UMAX. */
+#undef UMAX
+
+/* Define to 1 for Encore UMAX 4.3 that has <inq_status/cpustats.h> instead of
+   <sys/cpustats.h>. */
+#undef UMAX4_3
+
+/* Define to 1 to use posix_spawn(). */
+#undef USE_POSIX_SPAWN
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS.  */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable NetBSD extensions on NetBSD.  */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD extensions on NetBSD.  */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014.  */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014.  */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015.  */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015.  */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-3:2015.  */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010.  */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009.  */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
+   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
+   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+   with -lxnet on HP-UX 11.11.  */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'wchar_t'. */
+#undef WCHAR_T_SUFFIX
+
+/* Use platform specific coding */
+#undef WINDOWS32
+
+/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
+   'wint_t'. */
+#undef WINT_T_SUFFIX
+
+/* Define if using the dmalloc debugging malloc package */
+#undef WITH_DMALLOC
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+   significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+#  define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#  undef WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
+#undef _NETBSD_SOURCE
+
+/* The _Noreturn keyword of C11.  */
+#ifndef _Noreturn
+# if (defined __cplusplus \
+      && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
+          || (defined _MSC_VER && 1900 <= _MSC_VER)) \
+      && 0)
+    /* [[noreturn]] is not practically usable, because with it the syntax
+         extern _Noreturn void func (...);
+       would not be valid; such a declaration would only be valid with 'extern'
+       and '_Noreturn' swapped, or without the 'extern' keyword.  However, some
+       AIX system header files and several gnulib header files use precisely
+       this syntax with 'extern'.  */
+#  define _Noreturn [[noreturn]]
+# elif ((!defined __cplusplus || defined __clang__) \
+        && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0)  \
+            || 4 < __GNUC__ + (7 <= __GNUC_MINOR__)))
+   /* _Noreturn works as-is.  */
+# elif 2 < __GNUC__ + (8 <= __GNUC_MINOR__) || 0x5110 <= __SUNPRO_C
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
+
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for 'stat' and other things to work. */
+#undef _POSIX_SOURCE
+
+/* For standard stat data types on VMS. */
+#undef _USE_STD_STAT
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+#undef __STDC_CONSTANT_MACROS
+
+/* Define to 1 if the system <stdint.h> predates C++11. */
+#undef __STDC_LIMIT_MACROS
+
+/* The _GL_ASYNC_SAFE marker should be attached to functions that are
+   signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
+   invoked from such signal handlers.  Such functions have some restrictions:
+     * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
+       or should be listed as async-signal-safe in POSIX
+       <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
+       section 2.4.3.  Note that malloc(), sprintf(), and fwrite(), in
+       particular, are NOT async-signal-safe.
+     * All memory locations (variables and struct fields) that these functions
+       access must be marked 'volatile'.  This holds for both read and write
+       accesses.  Otherwise the compiler might optimize away stores to and
+       reads from such locations that occur in the program, depending on its
+       data flow analysis.  For example, when the program contains a loop
+       that is intended to inspect a variable set from within a signal handler
+           while (!signal_occurred)
+             ;
+       the compiler is allowed to transform this into an endless loop if the
+       variable 'signal_occurred' is not declared 'volatile'.
+   Additionally, recall that:
+     * A signal handler should not modify errno (except if it is a handler
+       for a fatal signal and ends by raising the same signal again, thus
+       provoking the termination of the process).  If it invokes a function
+       that may clobber errno, it needs to save and restore the value of
+       errno.  */
+#define _GL_ASYNC_SAFE
+
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define as 'access' if you don't have the eaccess() function. */
+#undef eaccess
+
+/* Please see the Gnulib manual for how to use these macros.
+
+   Suppress extern inline with HP-UX cc, as it appears to be broken; see
+   <https://lists.gnu.org/r/bug-texinfo/2013-02/msg00030.html>.
+
+   Suppress extern inline with Sun C in standards-conformance mode, as it
+   mishandles inline functions that call each other.  E.g., for 'inline void f
+   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+   'reference to static identifier "f" in extern inline function'.
+   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+   on configurations that mistakenly use 'static inline' to implement
+   functions or macros in standard C headers like <ctype.h>.  For example,
+   if isdigit is mistakenly implemented via a static inline function,
+   a program containing an extern inline function that calls isdigit
+   may not work since the C standard prohibits extern inline functions
+   from calling static functions (ISO C 99 section 6.7.4.(3).
+   This bug is known to occur on:
+
+     OS X 10.8 and earlier; see:
+     https://lists.gnu.org/r/bug-gnulib/2012-12/msg00023.html
+
+     DragonFly; see
+     http://muscles.dragonflybsd.org/bulk/clang-master-potential/20141111_102002/logs/ah-tty-0.3.12.log
+
+     FreeBSD; see:
+     https://lists.gnu.org/r/bug-gnulib/2014-07/msg00104.html
+
+   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+   for clang but remains for g++; see <https://trac.macports.org/ticket/41033>.
+   Assume DragonFly and FreeBSD will be similar.
+
+   GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+   inline semantics, unless -fgnu89-inline is used.  It defines a macro
+   __GNUC_STDC_INLINE__ to indicate this situation or a macro
+   __GNUC_GNU_INLINE__ to indicate the opposite situation.
+   GCC 4.2 with -std=c99 or -std=gnu99 implements the GNU C inline
+   semantics but warns, unless -fgnu89-inline is used:
+     warning: C99 inline functions are not supported; using GNU89
+     warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
+   It defines a macro __GNUC_GNU_INLINE__ to indicate this situation.
+ */
+#if (((defined __APPLE__ && defined __MACH__) \
+      || defined __DragonFly__ || defined __FreeBSD__) \
+     && (defined __header_inline \
+         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+            && ! defined __clang__) \
+         : ((! defined _DONT_USE_CTYPE_INLINE_ \
+             && (defined __GNUC__ || defined __cplusplus)) \
+            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+                && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+      : (199901L <= __STDC_VERSION__ \
+         && !defined __HP_cc \
+         && !defined __PGI \
+         && !(defined __SUNPRO_C && __STDC__))) \
+     && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+       && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
+#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+#  define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+   suppress bogus "no previous prototype for 'FOO'"
+   and "no previous declaration for 'FOO'" diagnostics,
+   when FOO is an inline function in the header; see
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+#  define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+#  define _GL_INLINE_HEADER_CONST_PRAGMA \
+     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+    _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef gid_t
+
+/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
+   the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
+   earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
+   __APPLE__ && __MACH__ test for Mac OS X.
+   __APPLE_CC__ tests for the Apple compiler and its version.
+   __STDC_VERSION__ tests for the C99 mode.  */
+#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
+# define __GNUC_STDC_INLINE__ 1
+#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#undef restrict
+/* Work around a bug in older versions of Sun C++, which did not
+   #define __restrict__ or support _Restrict or __restrict__
+   even though the corresponding Sun C compiler ended up with
+   "#define restrict _Restrict" or "#define restrict __restrict__"
+   in the previous line.  This workaround can be removed once
+   we assume Oracle Developer Studio 12.5 (2016) or later.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef ssize_t
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef uid_t
+
+/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
+   do not define. */
+#undef uintmax_t
+
+/* Define as a marker that can be attached to declarations that might not
+    be used.  This helps to reduce warnings, such as from
+    GCC -Wunused-parameter.  */
+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+# define _GL_UNUSED __attribute__ ((__unused__))
+#else
+# define _GL_UNUSED
+#endif
+/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
+   is a misnomer outside of parameter lists.  */
+#define _UNUSED_PARAMETER_ _GL_UNUSED
+
+/* gcc supports the "unused" attribute on possibly unused labels, and
+   g++ has since version 4.5.  Note to support C++ as well as C,
+   _GL_UNUSED_LABEL should be used with a trailing ;  */
+#if !defined __cplusplus || __GNUC__ > 4 \
+    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+# define _GL_UNUSED_LABEL _GL_UNUSED
+#else
+# define _GL_UNUSED_LABEL
+#endif
+
+/* The __pure__ attribute was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
+
+/* The __const__ attribute was added in gcc 2.95.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
+# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
+#else
+# define _GL_ATTRIBUTE_CONST /* empty */
+#endif
+
+/* The __malloc__ attribute was added in gcc 3.  */
+#if 3 <= __GNUC__
+# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#else
+# define _GL_ATTRIBUTE_MALLOC /* empty */
+#endif
+
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
diff --git a/src/configh.dos b/src/configh.dos
new file mode 100644 (file)
index 0000000..38c8bde
--- /dev/null
@@ -0,0 +1,116 @@
+/* configh.dos -- hand-massaged config.h file for MS-DOS builds         -*-C-*-
+
+Copyright (C) 1994-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Include this header to make __DJGPP_MINOR__ available because DJGPP ports
+   of GCC 4.3.0 and later no longer do it automatically.  */
+#include <sys/version.h>
+
+/* Many things are defined already by a system header.  */
+#include <sys/config.h>
+
+#if __DJGPP__ > 2 || __DJGPP_MINOR__ > 1
+
+/* Define to 1 if 'sys_siglist' is declared by <signal.h> or <unistd.h>. */
+# define SYS_SIGLIST_DECLARED 1
+
+/* Define to 1 if the C library defines the variable '_sys_siglist'.  */
+# define HAVE_DECL_SYS_SIGLIST 1
+
+#else
+
+/* Define NSIG.  */
+# define NSIG SIGMAX
+
+#endif
+
+/* Use high resolution file timestamps if nonzero. */
+#define FILE_TIMESTAMP_HI_RES 0
+
+/* Define to 1 if you have 'alloca', as a function or macro. */
+#define HAVE_ALLOCA 1
+
+/* Define to 1 if you have the fdopen function.  */
+#define HAVE_FDOPEN 1
+
+/* Define to 1 if you have the 'getgroups' function. */
+#define HAVE_GETGROUPS 1
+
+/* Define to 1 if you have the <memory.h> header file.  */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the mkstemp function.  */
+#define HAVE_MKSTEMP 1
+
+/* Define to 1 if you have the 'mktemp' function. */
+#define HAVE_MKTEMP 1
+
+/* Define to 1 if you have the 'setlinebuf' function. */
+#define HAVE_SETLINEBUF 1
+
+/* Define to 1 if you have the 'setvbuf' function. */
+#define HAVE_SETVBUF 1
+
+#define SCCS_GET "get"
+
+/* Define to 'unsigned long' or 'unsigned long long'
+   if <inttypes.h> doesn't define.  */
+#define uintmax_t unsigned long long
+
+/* Define the type of the first arg to select().  */
+#define fd_set_size_t int
+
+/* Define to 1 if you have the select function.  */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the stricmp function.  */
+#define HAVE_STRICMP 1
+
+/* Define to 1 if you have the 'strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Name of the package */
+#define PACKAGE "make"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "bug-make@gnu.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "GNU make"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "GNU make 4.3"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "make"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "4.3"
+
+/* Output sync sypport */
+#define NO_OUTPUT_SYNC
+
+/* Version number of package */
+#define VERSION "4.3"
+
+/* Build host information. */
+#define MAKE_HOST "i386-pc-msdosdjgpp"
+
+/* Grok DOS paths (drive specs and backslash path element separators) */
+#define HAVE_DOS_PATHS
+
+/* Define to `int' if <sys/types.h> does not define. */
+#define ssize_t int
diff --git a/src/debug.h b/src/debug.h
new file mode 100644 (file)
index 0000000..514b7e8
--- /dev/null
@@ -0,0 +1,39 @@
+/* Debugging macros and interface.
+Copyright (C) 1999-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#define DB_NONE         (0x000)
+#define DB_BASIC        (0x001)
+#define DB_VERBOSE      (0x002)
+#define DB_JOBS         (0x004)
+#define DB_IMPLICIT     (0x008)
+#define DB_MAKEFILES    (0x100)
+
+#define DB_ALL          (0xfff)
+
+extern int db_level;
+
+#define ISDB(_l)    ((_l)&db_level)
+
+/* When adding macros to this list be sure to update the value of
+   XGETTEXT_OPTIONS in the po/Makevars file.  */
+#define DBS(_l,_x)  do{ if(ISDB(_l)) {print_spaces (depth); \
+                                      printf _x; fflush (stdout);} }while(0)
+
+#define DBF(_l,_x)  do{ if(ISDB(_l)) {print_spaces (depth); \
+                                      printf (_x, file->name); \
+                                      fflush (stdout);} }while(0)
+
+#define DB(_l,_x)   do{ if(ISDB(_l)) {printf _x; fflush (stdout);} }while(0)
diff --git a/src/default.c b/src/default.c
new file mode 100644 (file)
index 0000000..751ea15
--- /dev/null
@@ -0,0 +1,757 @@
+/* Data base of default implicit rules for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+
+#include "filedef.h"
+#include "variable.h"
+#include "rule.h"
+#include "dep.h"
+#include "job.h"
+#include "commands.h"
+
+/* Define GCC_IS_NATIVE if gcc is the native development environment on
+   your system (gcc/bison/flex vs cc/yacc/lex).  */
+#if defined(__MSDOS__) || defined(__EMX__)
+# define GCC_IS_NATIVE
+#endif
+
+
+/* This is the default list of suffixes for suffix rules.
+   '.s' must come last, so that a '.o' file will be made from
+   a '.c' or '.p' or ... file rather than from a .s file.  */
+
+static char default_suffixes[]
+#ifdef VMS
+  /* VMS should include all UNIX/POSIX + some VMS extensions */
+  = ".out .exe .a .olb .hlb .tlb .mlb .ln .o .obj .c .cxx .cc .cpp .pas .p \
+.for .f .r .y .l .ym .yl .mar .s .ss .i .ii .mod .sym .def .h .info .dvi \
+.tex .texinfo .texi .txinfo .mem .hlp .brn .rnh .rno .rnt .rnx .w .ch .cweb \
+.web .com .sh .elc .el";
+#elif defined(__EMX__)
+  = ".out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S \
+.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \
+.w .ch .web .sh .elc .el .obj .exe .dll .lib";
+#else
+  = ".out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S \
+.mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \
+.w .ch .web .sh .elc .el";
+#endif
+
+static struct pspec default_pattern_rules[] =
+  {
+#ifdef VMS
+    { "(%)", "%",
+        "@if f$$search(\"$@\") .eqs. \"\" then $(LIBRARY)/CREATE/"
+         "$(or "
+          "$(patsubst %,TEXT,$(filter %.tlb %.TLB,$@)),"
+          "$(patsubst %,HELP,$(filter %.hlb %.HLB,$@)),"
+          "$(patsubst %,MACRO,$(filter %.mlb %.MLB,$@)),"
+          "$(and "
+           "$(patsubst %,SHARE,$(filter %.olb %.OLB,$@)),"
+           "$(patsubst %,SHARE,$(filter %.exe %.EXE,$<))),"
+          "OBJECT)"
+         " $@\n"
+        "$(AR) $(ARFLAGS) $@ $<" },
+
+#else
+    { "(%)", "%",
+        "$(AR) $(ARFLAGS) $@ $<" },
+#endif
+    /* The X.out rules are only in BSD's default set because
+       BSD Make has no null-suffix rules, so 'foo.out' and
+       'foo' are the same thing.  */
+#ifdef VMS
+    { "%.exe", "%",
+        "$(CP) $< $@" },
+
+#endif
+    { "%.out", "%",
+        "@rm -f $@ \n cp $< $@" },
+
+    /* Syntax is "ctangle foo.w foo.ch foo.c".  */
+    { "%.c", "%.w %.ch",
+        "$(CTANGLE) $^ $@" },
+    { "%.tex", "%.w %.ch",
+        "$(CWEAVE) $^ $@" },
+
+    { 0, 0, 0 }
+  };
+
+static struct pspec default_terminal_rules[] =
+  {
+#ifdef VMS
+
+    /* RCS.  */
+    { "%", "%$$5lv", /* Multinet style */
+        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
+    { "%", "[.$$rcs]%$$5lv", /* Multinet style */
+        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
+    { "%", "%_v", /* Normal style */
+        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
+    { "%", "[.rcs]%_v", /* Normal style */
+        "if f$$search(\"$@\") .nes. \"\" then +$(CHECKOUT,v)" },
+
+    /* SCCS.  */
+        /* ain't no SCCS on vms */
+
+#else
+    /* RCS.  */
+    { "%", "%,v",
+        "$(CHECKOUT,v)" },
+    { "%", "RCS/%,v",
+        "$(CHECKOUT,v)" },
+    { "%", "RCS/%",
+        "$(CHECKOUT,v)" },
+
+    /* SCCS.  */
+    { "%", "s.%",
+        "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" },
+    { "%", "SCCS/s.%",
+        "$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<" },
+#endif /* !VMS */
+    { 0, 0, 0 }
+  };
+
+static const char *default_suffix_rules[] =
+  {
+#ifdef VMS
+    ".o",
+    "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".obj",
+    "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".s",
+    "$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".S",
+    "$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".c",
+    "$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".cc",
+    "$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".C",
+    "$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".cpp",
+    "$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".f",
+    "$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".m",
+    "$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".p",
+    "$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".F",
+    "$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".r",
+    "$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".mod",
+    "$(COMPILE.mod) -o $@ -e $@ $^",
+
+    ".def.sym",
+    "$(COMPILE.def) -o $@ $<",
+
+    ".sh",
+    "copy $< >$@",
+
+    ".obj.exe",
+    "$(LINK.obj) $^ $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
+    ".mar.exe",
+    "$(COMPILE.mar) $^ \n $(LINK.obj) $(subst .mar,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
+    ".s.o",
+    "$(COMPILE.s) -o $@ $<",
+    ".s.exe",
+    "$(COMPILE.s) $^ \n $(LINK.obj) $(subst .s,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
+    ".c.exe",
+    "$(COMPILE.c) $^ \n $(LINK.obj) $(subst .c,.obj,$^) $(LOADLIBES) $(LDLIBS) $(CRT0) /exe=$@",
+    ".cc.exe",
+#ifdef GCC_IS_NATIVE
+    "$(COMPILE.cc) $^ \n $(LINK.obj) $(CXXSTARTUP),sys$$disk:[]$(subst .cc,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@",
+#else
+    "$(COMPILE.cc) $^ \n $(CXXLINK.obj) $(subst .cc,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@",
+    ".cxx.exe",
+    "$(COMPILE.cxx) $^ \n $(CXXLINK.obj) $(subst .cxx,.obj,$^) $(LOADLIBES) $(LXLIBS) $(LDLIBS) $(CXXRT0) /exe=$@",
+#endif
+    ".for.exe",
+    "$(COMPILE.for) $^ \n $(LINK.obj) $(subst .for,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
+    ".pas.exe",
+    "$(COMPILE.pas) $^ \n $(LINK.obj) $(subst .pas,.obj,$^) $(LOADLIBES) $(LDLIBS) /exe=$@",
+
+    ".com",
+    "copy $< >$@",
+
+    ".mar.obj",
+    "$(COMPILE.mar) /obj=$@ $<",
+    ".s.obj",
+    "$(COMPILE.s) /obj=$@ $<",
+    ".ss.obj",
+    "$(COMPILE.s) /obj=$@ $<",
+    ".c.i",
+    "$(COMPILE.c)/prep /list=$@ $<",
+    ".c.s",
+    "$(COMPILE.c)/noobj/machine /list=$@ $<",
+    ".i.s",
+    "$(COMPILE.c)/noprep/noobj/machine /list=$@ $<",
+    ".c.obj",
+    "$(COMPILE.c) /obj=$@ $<",
+    ".c.o",
+    "$(COMPILE.c) /obj=$@ $<",
+    ".cc.ii",
+    "$(COMPILE.cc)/prep /list=$@ $<",
+    ".cc.ss",
+    "$(COMPILE.cc)/noobj/machine /list=$@ $<",
+    ".ii.ss",
+    "$(COMPILE.cc)/noprep/noobj/machine /list=$@ $<",
+    ".cc.obj",
+    "$(COMPILE.cc) /obj=$@ $<",
+    ".cc.o",
+    "$(COMPILE.cc) /obj=$@ $<",
+    ".cxx.obj",
+    "$(COMPILE.cxx) /obj=$@ $<",
+    ".cxx.o",
+    "$(COMPILE.cxx) /obj=$@ $<",
+    ".for.obj",
+    "$(COMPILE.for) /obj=$@ $<",
+    ".for.o",
+    "$(COMPILE.for) /obj=$@ $<",
+    ".pas.obj",
+    "$(COMPILE.pas) /obj=$@ $<",
+    ".pas.o",
+    "$(COMPILE.pas) /obj=$@ $<",
+
+    ".y.c",
+    "$(YACC.y) $< \n rename y_tab.c $@",
+    ".l.c",
+    "$(LEX.l) $< \n rename lexyy.c $@",
+
+    ".texinfo.info",
+    "$(MAKEINFO) $<",
+
+    ".tex.dvi",
+    "$(TEX) $<",
+
+    ".cpp.o",
+    "$(COMPILE.cpp) $(OUTPUT_OPTION) $<",
+    ".f.o",
+    "$(COMPILE.f) $(OUTPUT_OPTION) $<",
+    ".m.o",
+    "$(COMPILE.m) $(OUTPUT_OPTION) $<",
+    ".p.o",
+    "$(COMPILE.p) $(OUTPUT_OPTION) $<",
+    ".r.o",
+    "$(COMPILE.r) $(OUTPUT_OPTION) $<",
+    ".mod.o",
+    "$(COMPILE.mod) -o $@ $<",
+
+    ".c.ln",
+    "$(LINT.c) -C$* $<",
+    ".y.ln",
+    "$(YACC.y) $< \n rename y_tab.c $@",
+
+    ".l.ln",
+    "@$(RM) $*.c\n $(LEX.l) $< > $*.c\n$(LINT.c) -i $*.c -o $@\n $(RM) $*.c",
+
+#else /* ! VMS */
+
+    ".o",
+    "$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".s",
+    "$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".S",
+    "$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".c",
+    "$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".cc",
+    "$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".C",
+    "$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".cpp",
+    "$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".f",
+    "$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".m",
+    "$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".p",
+    "$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".F",
+    "$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".r",
+    "$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@",
+    ".mod",
+    "$(COMPILE.mod) -o $@ -e $@ $^",
+
+    ".def.sym",
+    "$(COMPILE.def) -o $@ $<",
+
+    ".sh",
+    "cat $< >$@ \n chmod a+x $@",
+
+    ".s.o",
+    "$(COMPILE.s) -o $@ $<",
+    ".S.o",
+    "$(COMPILE.S) -o $@ $<",
+    ".c.o",
+    "$(COMPILE.c) $(OUTPUT_OPTION) $<",
+    ".cc.o",
+    "$(COMPILE.cc) $(OUTPUT_OPTION) $<",
+    ".C.o",
+    "$(COMPILE.C) $(OUTPUT_OPTION) $<",
+    ".cpp.o",
+    "$(COMPILE.cpp) $(OUTPUT_OPTION) $<",
+    ".f.o",
+    "$(COMPILE.f) $(OUTPUT_OPTION) $<",
+    ".m.o",
+    "$(COMPILE.m) $(OUTPUT_OPTION) $<",
+    ".p.o",
+    "$(COMPILE.p) $(OUTPUT_OPTION) $<",
+    ".F.o",
+    "$(COMPILE.F) $(OUTPUT_OPTION) $<",
+    ".r.o",
+    "$(COMPILE.r) $(OUTPUT_OPTION) $<",
+    ".mod.o",
+    "$(COMPILE.mod) -o $@ $<",
+
+    ".c.ln",
+    "$(LINT.c) -C$* $<",
+    ".y.ln",
+#ifndef __MSDOS__
+    "$(YACC.y) $< \n $(LINT.c) -C$* y.tab.c \n $(RM) y.tab.c",
+#else
+    "$(YACC.y) $< \n $(LINT.c) -C$* y_tab.c \n $(RM) y_tab.c",
+#endif
+    ".l.ln",
+    "@$(RM) $*.c\n $(LEX.l) $< > $*.c\n$(LINT.c) -i $*.c -o $@\n $(RM) $*.c",
+
+    ".y.c",
+#ifndef __MSDOS__
+    "$(YACC.y) $< \n mv -f y.tab.c $@",
+#else
+    "$(YACC.y) $< \n mv -f y_tab.c $@",
+#endif
+    ".l.c",
+    "@$(RM) $@ \n $(LEX.l) $< > $@",
+    ".ym.m",
+    "$(YACC.m) $< \n mv -f y.tab.c $@",
+    ".lm.m",
+    "@$(RM) $@ \n $(LEX.m) $< > $@",
+
+    ".F.f",
+    "$(PREPROCESS.F) $(OUTPUT_OPTION) $<",
+    ".r.f",
+    "$(PREPROCESS.r) $(OUTPUT_OPTION) $<",
+
+    /* This might actually make lex.yy.c if there's no %R% directive in $*.l,
+       but in that case why were you trying to make $*.r anyway?  */
+    ".l.r",
+    "$(LEX.l) $< > $@ \n mv -f lex.yy.r $@",
+
+    ".S.s",
+    "$(PREPROCESS.S) $< > $@",
+
+    ".texinfo.info",
+    "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@",
+
+    ".texi.info",
+    "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@",
+
+    ".txinfo.info",
+    "$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@",
+
+    ".tex.dvi",
+    "$(TEX) $<",
+
+    ".texinfo.dvi",
+    "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<",
+
+    ".texi.dvi",
+    "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<",
+
+    ".txinfo.dvi",
+    "$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<",
+
+    ".w.c",
+    "$(CTANGLE) $< - $@",       /* The '-' says there is no '.ch' file.  */
+
+    ".web.p",
+    "$(TANGLE) $<",
+
+    ".w.tex",
+    "$(CWEAVE) $< - $@",        /* The '-' says there is no '.ch' file.  */
+
+    ".web.tex",
+    "$(WEAVE) $<",
+
+#endif /* !VMS */
+
+    0, 0,
+  };
+
+static const char *default_variables[] =
+  {
+#ifdef VMS
+#ifdef __ALPHA
+    "ARCH", "ALPHA",
+#endif
+#ifdef __ia64
+    "ARCH", "IA64",
+#endif
+#ifdef __VAX
+    "ARCH", "VAX",
+#endif
+    "AR", "library",
+    "LIBRARY", "library",
+    "ARFLAGS", "/replace",
+    "AS", "macro",
+    "MACRO", "macro",
+#ifdef GCC_IS_NATIVE
+    "CC", "gcc",
+#else
+    "CC", "cc",
+#endif
+    "CD", "builtin_cd",
+    "ECHO", "builtin_echo",
+#ifdef GCC_IS_NATIVE
+    "C++", "gcc/plus",
+    "CXX", "gcc/plus",
+#else
+    "C++", "cxx",
+    "CXX", "cxx",
+#ifndef __ia64
+    "CXXLD", "cxxlink",
+    "CXXLINK", "cxxlink",
+#else
+    /* CXXLINK is not used on VMS/IA64 */
+    "CXXLD", "link",
+    "CXXLINK", "link",
+#endif
+#endif
+    "CO", "co",
+    "CPP", "$(CC) /preprocess_only",
+    "FC", "fortran",
+    /* System V uses these, so explicit rules using them should work.
+       However, there is no way to make implicit rules use them and FC.  */
+    "F77", "$(FC)",
+    "F77FLAGS", "$(FFLAGS)",
+    "LD", "link",
+    "LEX", "lex",
+    "PC", "pascal",
+    "YACC", "bison/yacc",
+    "YFLAGS", "/Define/Verbose",
+    "BISON", "bison",
+    "MAKEINFO", "makeinfo",
+    "TEX", "tex",
+    "TEXINDEX", "texindex",
+
+    "RM", "delete/nolog",
+
+    "CSTARTUP", "",
+#ifdef GCC_IS_NATIVE
+    "CRT0", ",sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crt0.obj",
+    "CXXSTARTUP", "gnu_cc_library:crtbegin.obj",
+    "CXXRT0", ",sys$$library:vaxcrtl.olb/lib,gnu_cc_library:crtend.obj,gnu_cc_library:gxx_main.obj",
+    "LXLIBS", ",gnu_cc_library:libstdcxx.olb/lib,gnu_cc_library:libgccplus.olb/lib",
+    "LDLIBS", ",gnu_cc_library:libgcc.olb/lib",
+#else
+    "CRT0", "",
+    "CXXSTARTUP", "",
+    "CXXRT0", "",
+    "LXLIBS", "",
+    "LDLIBS", "",
+#endif
+
+    "LINK.o", "$(LD) $(LDFLAGS)",
+    "LINK.obj", "$(LD) $(LDFLAGS)",
+#ifndef GCC_IS_NATIVE
+    "CXXLINK.obj", "$(CXXLD) $(LDFLAGS)",
+    "COMPILE.cxx", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+#endif
+    "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+    "LINK.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+    "COMPILE.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+    "COMPILE.C", "$(COMPILE.cc)",
+    "COMPILE.cpp", "$(COMPILE.cc)",
+    "LINK.C", "$(LINK.cc)",
+    "LINK.cpp", "$(LINK.cc)",
+    "YACC.y", "$(YACC) $(YFLAGS)",
+    "LEX.l", "$(LEX) $(LFLAGS)",
+    "YACC.m", "$(YACC) $(YFLAGS)",
+    "LEX.m", "$(LEX) $(LFLAGS) -t",
+    "COMPILE.for", "$(FC) $(FFLAGS) $(TARGET_ARCH)",
+    "COMPILE.f", "$(FC) $(FFLAGS) $(TARGET_ARCH) -c",
+    "LINK.f", "$(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c",
+    "LINK.r", "$(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.pas", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+    "COMPILE.def", "$(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)",
+    "COMPILE.mod", "$(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)",
+    "COMPILE.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.mar", "$(MACRO) $(MACROFLAGS)",
+    "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)",
+    "LINK.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)",
+    "COMPILE.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c",
+    "PREPROCESS.S", "$(CC) -E $(CPPFLAGS)",
+    "PREPROCESS.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F",
+    "PREPROCESS.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F",
+    "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+
+    "MV", "rename/new_version",
+    "CP", "copy",
+    ".LIBPATTERNS", "%.olb lib%.a",
+
+#else /* !VMS */
+
+    "AR", "ar",
+    "ARFLAGS", "rv",
+    "AS", "as",
+#ifdef GCC_IS_NATIVE
+    "CC", "gcc",
+# ifdef __MSDOS__
+    "CXX", "gpp",       /* g++ is an invalid name on MSDOS */
+# else
+    "CXX", "gcc",
+# endif /* __MSDOS__ */
+    "OBJC", "gcc",
+#else
+    "CC", "cc",
+    "CXX", "g++",
+    "OBJC", "cc",
+#endif
+
+    /* This expands to $(CO) $(COFLAGS) $< $@ if $@ does not exist,
+       and to the empty string if $@ does exist.  */
+    "CHECKOUT,v", "+$(if $(wildcard $@),,$(CO) $(COFLAGS) $< $@)",
+    "CO", "co",
+    "COFLAGS", "",
+
+    "CPP", "$(CC) -E",
+#ifdef  CRAY
+    "CF77PPFLAGS", "-P",
+    "CF77PP", "/lib/cpp",
+    "CFT", "cft77",
+    "CF", "cf77",
+    "FC", "$(CF)",
+#else   /* Not CRAY.  */
+#ifdef  _IBMR2
+    "FC", "xlf",
+#else
+#ifdef  __convex__
+    "FC", "fc",
+#else
+    "FC", "f77",
+#endif /* __convex__ */
+#endif /* _IBMR2 */
+    /* System V uses these, so explicit rules using them should work.
+       However, there is no way to make implicit rules use them and FC.  */
+    "F77", "$(FC)",
+    "F77FLAGS", "$(FFLAGS)",
+#endif  /* Cray.  */
+    "GET", SCCS_GET,
+    "LD", "ld",
+#ifdef GCC_IS_NATIVE
+    "LEX", "flex",
+#else
+    "LEX", "lex",
+#endif
+    "LINT", "lint",
+    "M2C", "m2c",
+#ifdef  pyr
+    "PC", "pascal",
+#else
+#ifdef  CRAY
+    "PC", "PASCAL",
+    "SEGLDR", "segldr",
+#else
+    "PC", "pc",
+#endif  /* CRAY.  */
+#endif  /* pyr.  */
+#ifdef GCC_IS_NATIVE
+    "YACC", "bison -y",
+#else
+    "YACC", "yacc",     /* Or "bison -y"  */
+#endif
+    "MAKEINFO", "makeinfo",
+    "TEX", "tex",
+    "TEXI2DVI", "texi2dvi",
+    "WEAVE", "weave",
+    "CWEAVE", "cweave",
+    "TANGLE", "tangle",
+    "CTANGLE", "ctangle",
+
+    "RM", "rm -f",
+
+    "LINK.o", "$(CC) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.c", "$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.m", "$(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+#ifndef HAVE_CASE_INSENSITIVE_FS
+    /* On case-insensitive filesystems, treat *.C files as *.c files,
+       to avoid erroneously compiling C sources as C++, which will
+       probably fail.  */
+    "COMPILE.C", "$(COMPILE.cc)",
+#else
+    "COMPILE.C", "$(COMPILE.c)",
+#endif
+    "COMPILE.cpp", "$(COMPILE.cc)",
+    "LINK.cc", "$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+#ifndef HAVE_CASE_INSENSITIVE_FS
+    "LINK.C", "$(LINK.cc)",
+#else
+    "LINK.C", "$(LINK.c)",
+#endif
+    "LINK.cpp", "$(LINK.cc)",
+    "YACC.y", "$(YACC) $(YFLAGS)",
+    "LEX.l", "$(LEX) $(LFLAGS) -t",
+    "YACC.m", "$(YACC) $(YFLAGS)",
+    "LEX.m", "$(LEX) $(LFLAGS) -t",
+    "COMPILE.f", "$(FC) $(FFLAGS) $(TARGET_ARCH) -c",
+    "LINK.f", "$(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c",
+    "LINK.r", "$(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "COMPILE.def", "$(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)",
+    "COMPILE.mod", "$(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)",
+    "COMPILE.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c",
+    "LINK.p", "$(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)",
+    "LINK.s", "$(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)",
+    "COMPILE.s", "$(AS) $(ASFLAGS) $(TARGET_MACH)",
+    "LINK.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)",
+    "COMPILE.S", "$(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c",
+    "PREPROCESS.S", "$(CC) -E $(CPPFLAGS)",
+    "PREPROCESS.F", "$(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F",
+    "PREPROCESS.r", "$(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F",
+    "LINT.c", "$(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)",
+
+#ifndef NO_MINUS_C_MINUS_O
+    "OUTPUT_OPTION", "-o $@",
+#endif
+
+#ifdef  SCCS_GET_MINUS_G
+    "SCCS_OUTPUT_OPTION", "-G$@",
+#endif
+
+#if defined(_AMIGA)
+    ".LIBPATTERNS", "%.lib",
+#elif defined(__MSDOS__)
+    ".LIBPATTERNS", "lib%.a $(DJDIR)/lib/lib%.a",
+#elif defined(__APPLE__)
+    ".LIBPATTERNS", "lib%.dylib lib%.a",
+#elif defined(__CYGWIN__) || defined(WINDOWS32)
+    ".LIBPATTERNS", "lib%.dll.a %.dll.a lib%.a %.lib lib%.dll %.dll",
+#else
+    ".LIBPATTERNS", "lib%.so lib%.a",
+#endif
+
+#endif /* !VMS */
+    /* Make this assignment to avoid undefined variable warnings.  */
+    "GNUMAKEFLAGS", "",
+    0, 0
+  };
+\f
+/* Set up the default .SUFFIXES list.  */
+
+void
+set_default_suffixes (void)
+{
+  suffix_file = enter_file (strcache_add (".SUFFIXES"));
+  suffix_file->builtin = 1;
+
+  if (no_builtin_rules_flag)
+    define_variable_cname ("SUFFIXES", "", o_default, 0);
+  else
+    {
+      struct dep *d;
+      const char *p = default_suffixes;
+      suffix_file->deps = enter_prereqs (PARSE_SIMPLE_SEQ ((char **)&p, struct dep),
+                                         NULL);
+      for (d = suffix_file->deps; d; d = d->next)
+        d->file->builtin = 1;
+
+      define_variable_cname ("SUFFIXES", default_suffixes, o_default, 0);
+    }
+}
+
+/* Enter the default suffix rules as file rules.  This used to be done in
+   install_default_implicit_rules, but that loses because we want the
+   suffix rules installed before reading makefiles, and the pattern rules
+   installed after.  */
+
+void
+install_default_suffix_rules (void)
+{
+  const char **s;
+
+  if (no_builtin_rules_flag)
+    return;
+
+  for (s = default_suffix_rules; *s != 0; s += 2)
+    {
+      struct file *f = enter_file (strcache_add (s[0]));
+      /* This function should run before any makefile is parsed.  */
+      assert (f->cmds == 0);
+      f->cmds = xmalloc (sizeof (struct commands));
+      f->cmds->fileinfo.filenm = 0;
+      f->cmds->commands = xstrdup (s[1]);
+      f->cmds->command_lines = 0;
+      f->cmds->recipe_prefix = RECIPEPREFIX_DEFAULT;
+      f->builtin = 1;
+    }
+}
+
+
+/* Install the default pattern rules.  */
+
+void
+install_default_implicit_rules (void)
+{
+  struct pspec *p;
+
+  if (no_builtin_rules_flag)
+    return;
+
+  for (p = default_pattern_rules; p->target != 0; ++p)
+    install_pattern_rule (p, 0);
+
+  for (p = default_terminal_rules; p->target != 0; ++p)
+    install_pattern_rule (p, 1);
+}
+
+void
+define_default_variables (void)
+{
+  const char **s;
+
+  if (no_builtin_variables_flag)
+    return;
+
+  for (s = default_variables; *s != 0; s += 2)
+    define_variable (s[0], strlen (s[0]), s[1], o_default, 1);
+}
+
+void
+undefine_default_variables (void)
+{
+  const char **s;
+
+  for (s = default_variables; *s != 0; s += 2)
+    undefine_variable_global (s[0], strlen (s[0]), o_default);
+}
diff --git a/src/dep.h b/src/dep.h
new file mode 100644 (file)
index 0000000..76718f0
--- /dev/null
+++ b/src/dep.h
@@ -0,0 +1,133 @@
+/* Definitions of dependency data structures for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Structure used in chains of names, for parsing and globbing.  */
+
+#define NAMESEQ(_t)     \
+    _t *next;           \
+    const char *name
+
+struct nameseq
+  {
+    NAMESEQ (struct nameseq);
+  };
+
+/* Flag bits for the second argument to 'read_makefile'.
+   These flags are saved in the 'flags' field of each
+   'struct goaldep' in the chain returned by 'read_all_makefiles'.  */
+
+#define RM_NO_DEFAULT_GOAL      (1 << 0) /* Do not set default goal.  */
+#define RM_INCLUDED             (1 << 1) /* Search makefile search path.  */
+#define RM_DONTCARE             (1 << 2) /* No error if it doesn't exist.  */
+#define RM_NO_TILDE             (1 << 3) /* Don't expand ~ in file name.  */
+#define RM_NOFLAG               0
+
+/* Structure representing one dependency of a file.
+   Each struct file's 'deps' points to a chain of these, through 'next'.
+   'stem' is the stem for this dep line of static pattern rule or NULL.  */
+
+#define DEP(_t)                                 \
+    NAMESEQ (_t);                               \
+    struct file *file;                          \
+    const char *stem;                           \
+    unsigned int flags : 8;                     \
+    unsigned int changed : 1;                   \
+    unsigned int ignore_mtime : 1;              \
+    unsigned int staticpattern : 1;             \
+    unsigned int need_2nd_expansion : 1;        \
+    unsigned int ignore_automatic_vars : 1
+
+struct dep
+  {
+    DEP (struct dep);
+  };
+
+/* Structure representing one goal.
+   The goals to be built constitute a chain of these, chained through 'next'.
+   'stem' is not used, but it's simpler to include and ignore it.  */
+
+struct goaldep
+  {
+    DEP (struct goaldep);
+    int error;
+    floc floc;
+  };
+
+/* Options for parsing lists of filenames.  */
+
+#define PARSEFS_NONE    0x0000
+#define PARSEFS_NOSTRIP 0x0001
+#define PARSEFS_NOAR    0x0002
+#define PARSEFS_NOGLOB  0x0004
+#define PARSEFS_EXISTS  0x0008
+#define PARSEFS_NOCACHE 0x0010
+#define PARSEFS_ONEWORD 0x0020
+
+#define PARSE_FILE_SEQ(_s,_t,_c,_p,_f) \
+            (_t *)parse_file_seq ((_s),sizeof (_t),(_c),(_p),(_f))
+#define PARSE_SIMPLE_SEQ(_s,_t) \
+            (_t *)parse_file_seq ((_s),sizeof (_t),MAP_NUL,NULL,PARSEFS_NONE)
+
+#ifdef VMS
+void *parse_file_seq ();
+#else
+void *parse_file_seq (char **stringp, size_t size,
+                      int stopmap, const char *prefix, int flags);
+#endif
+
+char *tilde_expand (const char *name);
+
+#ifndef NO_ARCHIVES
+struct nameseq *ar_glob (const char *arname, const char *member_pattern, size_t size);
+#endif
+
+#define dep_name(d)        ((d)->name ? (d)->name : (d)->file->name)
+
+#define alloc_seq_elt(_t)   xcalloc (sizeof (_t))
+void free_ns_chain (struct nameseq *n);
+
+#if defined(MAKE_MAINTAINER_MODE) && defined(__GNUC__) && !defined(__STRICT_ANSI__)
+/* Use inline to get real type-checking.  */
+#define SI static inline
+SI struct nameseq *alloc_ns()      { return alloc_seq_elt (struct nameseq); }
+SI struct dep *alloc_dep()         { return alloc_seq_elt (struct dep); }
+SI struct goaldep *alloc_goaldep() { return alloc_seq_elt (struct goaldep); }
+
+SI void free_ns(struct nameseq *n)      { free (n); }
+SI void free_dep(struct dep *d)         { free_ns ((struct nameseq *)d); }
+SI void free_goaldep(struct goaldep *g) { free_dep ((struct dep *)g); }
+
+SI void free_dep_chain(struct dep *d)      { free_ns_chain((struct nameseq *)d); }
+SI void free_goal_chain(struct goaldep *g) { free_dep_chain((struct dep *)g); }
+#else
+# define alloc_ns()          alloc_seq_elt (struct nameseq)
+# define alloc_dep()         alloc_seq_elt (struct dep)
+# define alloc_goaldep()     alloc_seq_elt (struct goaldep)
+
+# define free_ns(_n)         free (_n)
+# define free_dep(_d)        free_ns (_d)
+# define free_goaldep(_g)    free_dep (_g)
+
+# define free_dep_chain(_d)  free_ns_chain ((struct nameseq *)(_d))
+# define free_goal_chain(_g) free_ns_chain ((struct nameseq *)(_g))
+#endif
+
+struct dep *copy_dep_chain (const struct dep *d);
+
+struct goaldep *read_all_makefiles (const char **makefiles);
+void eval_buffer (char *buffer, const floc *floc);
+enum update_status update_goal_chain (struct goaldep *goals);
diff --git a/src/dir.c b/src/dir.c
new file mode 100644 (file)
index 0000000..862a18e
--- /dev/null
+++ b/src/dir.c
@@ -0,0 +1,1351 @@
+/* Directory hashing for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "hash.h"
+#include "filedef.h"
+#include "dep.h"
+
+#ifdef  HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+# ifdef VMS
+/* its prototype is in vmsdir.h, which is not needed for HAVE_DIRENT_H */
+const char *vmsify (const char *name, int type);
+# endif
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# ifdef HAVE_SYS_NDIR_H
+#  include <sys/ndir.h>
+# endif
+# ifdef HAVE_SYS_DIR_H
+#  include <sys/dir.h>
+# endif
+# ifdef HAVE_NDIR_H
+#  include <ndir.h>
+# endif
+# ifdef HAVE_VMSDIR_H
+#  include "vmsdir.h"
+# endif /* HAVE_VMSDIR_H */
+#endif
+
+/* In GNU systems, <dirent.h> defines this macro for us.  */
+#ifdef _D_NAMLEN
+# undef NAMLEN
+# define NAMLEN(d) _D_NAMLEN(d)
+#endif
+
+#if (defined (POSIX) || defined (VMS) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__)
+/* Posix does not require that the d_ino field be present, and some
+   systems do not provide it. */
+# define REAL_DIR_ENTRY(dp) 1
+# define FAKE_DIR_ENTRY(dp)
+#else
+# define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
+# define FAKE_DIR_ENTRY(dp) (dp->d_ino = 1)
+#endif /* POSIX */
+\f
+#ifdef __MSDOS__
+#include <ctype.h>
+#include <fcntl.h>
+
+/* If it's MSDOS that doesn't have _USE_LFN, disable LFN support.  */
+#ifndef _USE_LFN
+#define _USE_LFN 0
+#endif
+
+static const char *
+dosify (const char *filename)
+{
+  static char dos_filename[14];
+  char *df;
+  int i;
+
+  if (filename == 0 || _USE_LFN)
+    return filename;
+
+  /* FIXME: what about filenames which violate
+     8+3 constraints, like "config.h.in", or ".emacs"?  */
+  if (strpbrk (filename, "\"*+,;<=>?[\\]|") != 0)
+    return filename;
+
+  df = dos_filename;
+
+  /* First, transform the name part.  */
+  for (i = 0; i < 8 && ! STOP_SET (*filename, MAP_DOT|MAP_NUL); ++i)
+    *df++ = tolower ((unsigned char)*filename++);
+
+  /* Now skip to the next dot.  */
+  while (! STOP_SET (*filename, MAP_DOT|MAP_NUL))
+    ++filename;
+  if (*filename != '\0')
+    {
+      *df++ = *filename++;
+      for (i = 0; i < 3 && ! STOP_SET (*filename, MAP_DOT|MAP_NUL); ++i)
+        *df++ = tolower ((unsigned char)*filename++);
+    }
+
+  /* Look for more dots.  */
+  while (! STOP_SET (*filename, MAP_DOT|MAP_NUL))
+    ++filename;
+  if (*filename == '.')
+    return filename;
+  *df = 0;
+  return dos_filename;
+}
+#endif /* __MSDOS__ */
+
+#ifdef WINDOWS32
+#include "pathstuff.h"
+#endif
+
+#ifdef _AMIGA
+#include <ctype.h>
+#endif
+
+#ifdef HAVE_CASE_INSENSITIVE_FS
+static const char *
+downcase (const char *filename)
+{
+  static PATH_VAR (new_filename);
+  char *df;
+
+  if (filename == 0)
+    return 0;
+
+  df = new_filename;
+  while (*filename != '\0')
+    {
+      *df++ = tolower ((unsigned char)*filename);
+      ++filename;
+    }
+
+  *df = 0;
+
+  return new_filename;
+}
+#endif /* HAVE_CASE_INSENSITIVE_FS */
+
+#ifdef VMS
+
+static char *
+downcase_inplace(char *filename)
+{
+  char *name;
+  name = filename;
+  while (*name != '\0')
+    {
+      *name = tolower ((unsigned char)*name);
+      ++name;
+    }
+  return filename;
+}
+
+#ifndef _USE_STD_STAT
+/* VMS 8.2 fixed the VMS stat output to have unique st_dev and st_ino
+   when _USE_STD_STAT is used on the compile line.
+
+   Prior to _USE_STD_STAT support, the st_dev is a pointer to thread
+   static memory containing the device of the last filename looked up.
+
+   Todo: find out if the ino_t still needs to be faked on a directory.
+ */
+
+/* Define this if the older VMS_INO_T is needed */
+#define VMS_INO_T 1
+
+static int
+vms_hash (const char *name)
+{
+  int h = 0;
+
+  while (*name)
+    {
+      unsigned char uc = *name;
+      int g;
+#ifdef HAVE_CASE_INSENSITIVE_FS
+      h = (h << 4) + (isupper (uc) ? tolower (uc) : uc);
+#else
+      h = (h << 4) + uc;
+#endif
+      name++;
+      g = h & 0xf0000000;
+      if (g)
+        {
+          h = h ^ (g >> 24);
+          h = h ^ g;
+        }
+    }
+  return h;
+}
+
+/* fake stat entry for a directory */
+static int
+vmsstat_dir (const char *name, struct stat *st)
+{
+  char *s;
+  int h;
+  DIR *dir;
+
+  dir = opendir (name);
+  if (dir == 0)
+    return -1;
+  closedir (dir);
+  s = strchr (name, ':');       /* find device */
+  if (s)
+    {
+      /* to keep the compiler happy we said "const char *name", now we cheat */
+      *s++ = 0;
+      st->st_dev = (char *)vms_hash (name);
+      h = vms_hash (s);
+      *(s-1) = ':';
+    }
+  else
+    {
+      st->st_dev = 0;
+      h = vms_hash (name);
+    }
+
+  st->st_ino[0] = h & 0xff;
+  st->st_ino[1] = h & 0xff00;
+  st->st_ino[2] = h >> 16;
+
+  return 0;
+}
+
+# define stat(__path, __sbuf) vmsstat_dir (__path, __sbuf)
+
+#endif /* _USE_STD_STAT */
+#endif /* VMS */
+\f
+/* Hash table of directories.  */
+
+#ifndef DIRECTORY_BUCKETS
+#define DIRECTORY_BUCKETS 199
+#endif
+
+struct directory_contents
+  {
+    dev_t dev;                  /* Device and inode numbers of this dir.  */
+#ifdef WINDOWS32
+    /* Inode means nothing on WINDOWS32. Even file key information is
+     * unreliable because it is random per file open and undefined for remote
+     * filesystems. The most unique attribute I can come up with is the fully
+     * qualified name of the directory. Beware though, this is also
+     * unreliable. I'm open to suggestion on a better way to emulate inode.  */
+    char *path_key;
+    time_t ctime;
+    time_t mtime;        /* controls check for stale directory cache */
+    int fs_flags;     /* FS_FAT, FS_NTFS, ... */
+# define FS_FAT      0x1
+# define FS_NTFS     0x2
+# define FS_UNKNOWN  0x4
+#else
+# ifdef VMS_INO_T
+    ino_t ino[3];
+# else
+    ino_t ino;
+# endif
+#endif /* WINDOWS32 */
+    struct hash_table dirfiles; /* Files in this directory.  */
+    DIR *dirstream;             /* Stream reading this directory.  */
+  };
+
+static unsigned long
+directory_contents_hash_1 (const void *key_0)
+{
+  const struct directory_contents *key = key_0;
+  unsigned long hash;
+
+#ifdef WINDOWS32
+  hash = 0;
+  ISTRING_HASH_1 (key->path_key, hash);
+  hash ^= ((unsigned int) key->dev << 4) ^ (unsigned int) key->ctime;
+#else
+# ifdef VMS_INO_T
+  hash = (((unsigned int) key->dev << 4)
+          ^ ((unsigned int) key->ino[0]
+             + (unsigned int) key->ino[1]
+             + (unsigned int) key->ino[2]));
+# else
+  hash = ((unsigned int) key->dev << 4) ^ (unsigned int) key->ino;
+# endif
+#endif /* WINDOWS32 */
+  return hash;
+}
+
+static unsigned long
+directory_contents_hash_2 (const void *key_0)
+{
+  const struct directory_contents *key = key_0;
+  unsigned long hash;
+
+#ifdef WINDOWS32
+  hash = 0;
+  ISTRING_HASH_2 (key->path_key, hash);
+  hash ^= ((unsigned int) key->dev << 4) ^ (unsigned int) ~key->ctime;
+#else
+# ifdef VMS_INO_T
+  hash = (((unsigned int) key->dev << 4)
+          ^ ~((unsigned int) key->ino[0]
+              + (unsigned int) key->ino[1]
+              + (unsigned int) key->ino[2]));
+# else
+  hash = ((unsigned int) key->dev << 4) ^ (unsigned int) ~key->ino;
+# endif
+#endif /* WINDOWS32 */
+
+  return hash;
+}
+
+/* Sometimes it's OK to use subtraction to get this value:
+     result = X - Y;
+   But, if we're not sure of the type of X and Y they may be too large for an
+   int (on a 64-bit system for example).  So, use ?: instead.
+   See Savannah bug #15534.
+
+   NOTE!  This macro has side-effects!
+*/
+
+#define MAKECMP(_x,_y)  ((_x)<(_y)?-1:((_x)==(_y)?0:1))
+
+static int
+directory_contents_hash_cmp (const void *xv, const void *yv)
+{
+  const struct directory_contents *x = xv;
+  const struct directory_contents *y = yv;
+  int result;
+
+#ifdef WINDOWS32
+  ISTRING_COMPARE (x->path_key, y->path_key, result);
+  if (result)
+    return result;
+  result = MAKECMP(x->ctime, y->ctime);
+  if (result)
+    return result;
+#else
+# ifdef VMS_INO_T
+  result = MAKECMP(x->ino[0], y->ino[0]);
+  if (result)
+    return result;
+  result = MAKECMP(x->ino[1], y->ino[1]);
+  if (result)
+    return result;
+  result = MAKECMP(x->ino[2], y->ino[2]);
+  if (result)
+    return result;
+# else
+  result = MAKECMP(x->ino, y->ino);
+  if (result)
+    return result;
+# endif
+#endif /* WINDOWS32 */
+
+  return MAKECMP(x->dev, y->dev);
+}
+
+/* Table of directory contents hashed by device and inode number.  */
+static struct hash_table directory_contents;
+
+struct directory
+  {
+    const char *name;                   /* Name of the directory.  */
+
+    /* The directory's contents.  This data may be shared by several
+       entries in the hash table, which refer to the same directory
+       (identified uniquely by 'dev' and 'ino') under different names.  */
+    struct directory_contents *contents;
+  };
+
+static unsigned long
+directory_hash_1 (const void *key)
+{
+  return_ISTRING_HASH_1 (((const struct directory *) key)->name);
+}
+
+static unsigned long
+directory_hash_2 (const void *key)
+{
+  return_ISTRING_HASH_2 (((const struct directory *) key)->name);
+}
+
+static int
+directory_hash_cmp (const void *x, const void *y)
+{
+  return_ISTRING_COMPARE (((const struct directory *) x)->name,
+                          ((const struct directory *) y)->name);
+}
+
+/* Table of directories hashed by name.  */
+static struct hash_table directories;
+
+/* Never have more than this many directories open at once.  */
+
+#define MAX_OPEN_DIRECTORIES 10
+
+static unsigned int open_directories = 0;
+
+
+/* Hash table of files in each directory.  */
+
+struct dirfile
+  {
+    const char *name;           /* Name of the file.  */
+    size_t length;
+    short impossible;           /* This file is impossible.  */
+    unsigned char type;
+  };
+
+static unsigned long
+dirfile_hash_1 (const void *key)
+{
+  return_ISTRING_HASH_1 (((struct dirfile const *) key)->name);
+}
+
+static unsigned long
+dirfile_hash_2 (const void *key)
+{
+  return_ISTRING_HASH_2 (((struct dirfile const *) key)->name);
+}
+
+static int
+dirfile_hash_cmp (const void *xv, const void *yv)
+{
+  const struct dirfile *x = xv;
+  const struct dirfile *y = yv;
+  int result = (int) (x->length - y->length);
+  if (result)
+    return result;
+  return_ISTRING_COMPARE (x->name, y->name);
+}
+
+#ifndef DIRFILE_BUCKETS
+#define DIRFILE_BUCKETS 107
+#endif
+\f
+static int dir_contents_file_exists_p (struct directory_contents *dir,
+                                       const char *filename);
+static struct directory *find_directory (const char *name);
+
+/* Find the directory named NAME and return its 'struct directory'.  */
+
+static struct directory *
+find_directory (const char *name)
+{
+  struct directory *dir;
+  struct directory **dir_slot;
+  struct directory dir_key;
+
+  dir_key.name = name;
+  dir_slot = (struct directory **) hash_find_slot (&directories, &dir_key);
+  dir = *dir_slot;
+
+  if (HASH_VACANT (dir))
+    {
+      /* The directory was not found.  Create a new entry for it.  */
+      const char *p = name + strlen (name);
+      struct stat st;
+      int r;
+
+      dir = xmalloc (sizeof (struct directory));
+#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS)
+      /* Todo: Why is this only needed on VMS? */
+      {
+        char *lname = downcase_inplace (xstrdup (name));
+        dir->name = strcache_add_len (lname, p - name);
+        free (lname);
+      }
+#else
+      dir->name = strcache_add_len (name, p - name);
+#endif
+      hash_insert_at (&directories, dir, dir_slot);
+      /* The directory is not in the name hash table.
+         Find its device and inode numbers, and look it up by them.  */
+
+#if defined(WINDOWS32)
+      {
+        char tem[MAXPATHLEN], *tstart, *tend;
+
+        /* Remove any trailing slashes.  Windows32 stat fails even on
+           valid directories if they end in a slash. */
+        memcpy (tem, name, p - name + 1);
+        tstart = tem;
+        if (tstart[1] == ':')
+          tstart += 2;
+        for (tend = tem + (p - name - 1);
+             tend > tstart && (*tend == '/' || *tend == '\\');
+             tend--)
+          *tend = '\0';
+
+        r = stat (tem, &st);
+      }
+#else
+      EINTRLOOP (r, stat (name, &st));
+#endif
+
+      if (r < 0)
+        {
+        /* Couldn't stat the directory.  Mark this by
+           setting the 'contents' member to a nil pointer.  */
+          dir->contents = 0;
+        }
+      else
+        {
+          /* Search the contents hash table; device and inode are the key.  */
+
+#ifdef WINDOWS32
+          char *w32_path;
+#endif
+          struct directory_contents *dc;
+          struct directory_contents **dc_slot;
+          struct directory_contents dc_key;
+
+          dc_key.dev = st.st_dev;
+#ifdef WINDOWS32
+          dc_key.path_key = w32_path = w32ify (name, 1);
+          dc_key.ctime = st.st_ctime;
+#else
+# ifdef VMS_INO_T
+          dc_key.ino[0] = st.st_ino[0];
+          dc_key.ino[1] = st.st_ino[1];
+          dc_key.ino[2] = st.st_ino[2];
+# else
+          dc_key.ino = st.st_ino;
+# endif
+#endif
+          dc_slot = (struct directory_contents **) hash_find_slot (&directory_contents, &dc_key);
+          dc = *dc_slot;
+
+          if (HASH_VACANT (dc))
+            {
+              /* Nope; this really is a directory we haven't seen before.  */
+#ifdef WINDOWS32
+              char  fs_label[BUFSIZ];
+              char  fs_type[BUFSIZ];
+              unsigned long  fs_serno;
+              unsigned long  fs_flags;
+              unsigned long  fs_len;
+#endif
+              dc = (struct directory_contents *)
+                xmalloc (sizeof (struct directory_contents));
+
+              /* Enter it in the contents hash table.  */
+              dc->dev = st.st_dev;
+#ifdef WINDOWS32
+              dc->path_key = xstrdup (w32_path);
+              dc->ctime = st.st_ctime;
+              dc->mtime = st.st_mtime;
+
+              /* NTFS is the only WINDOWS32 filesystem that bumps mtime on a
+                 directory when files are added/deleted from a directory.  */
+              w32_path[3] = '\0';
+              if (GetVolumeInformation (w32_path, fs_label, sizeof (fs_label),
+                                        &fs_serno, &fs_len, &fs_flags, fs_type,
+                                        sizeof (fs_type)) == FALSE)
+                dc->fs_flags = FS_UNKNOWN;
+              else if (!strcmp (fs_type, "FAT"))
+                dc->fs_flags = FS_FAT;
+              else if (!strcmp (fs_type, "NTFS"))
+                dc->fs_flags = FS_NTFS;
+              else
+                dc->fs_flags = FS_UNKNOWN;
+#else
+# ifdef VMS_INO_T
+              dc->ino[0] = st.st_ino[0];
+              dc->ino[1] = st.st_ino[1];
+              dc->ino[2] = st.st_ino[2];
+# else
+              dc->ino = st.st_ino;
+# endif
+#endif /* WINDOWS32 */
+              hash_insert_at (&directory_contents, dc, dc_slot);
+              ENULLLOOP (dc->dirstream, opendir (name));
+              if (dc->dirstream == 0)
+                /* Couldn't open the directory.  Mark this by setting the
+                   'files' member to a nil pointer.  */
+                dc->dirfiles.ht_vec = 0;
+              else
+                {
+                  hash_init (&dc->dirfiles, DIRFILE_BUCKETS,
+                             dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp);
+                  /* Keep track of how many directories are open.  */
+                  ++open_directories;
+                  if (open_directories == MAX_OPEN_DIRECTORIES)
+                    /* We have too many directories open already.
+                       Read the entire directory and then close it.  */
+                    dir_contents_file_exists_p (dc, 0);
+                }
+            }
+
+          /* Point the name-hashed entry for DIR at its contents data.  */
+          dir->contents = dc;
+        }
+    }
+
+  return dir;
+}
+\f
+/* Return 1 if the name FILENAME is entered in DIR's hash table.
+   FILENAME must contain no slashes.  */
+
+static int
+dir_contents_file_exists_p (struct directory_contents *dir,
+                            const char *filename)
+{
+  struct dirfile *df;
+  struct dirent *d;
+#ifdef WINDOWS32
+  struct stat st;
+  int rehash = 0;
+#endif
+
+  if (dir == 0 || dir->dirfiles.ht_vec == 0)
+    /* The directory could not be stat'd or opened.  */
+    return 0;
+
+#ifdef __MSDOS__
+  filename = dosify (filename);
+#endif
+
+#ifdef HAVE_CASE_INSENSITIVE_FS
+  filename = downcase (filename);
+#endif
+
+#ifdef __EMX__
+  if (filename != 0)
+    _fnlwr (filename); /* lower case for FAT drives */
+#endif
+  if (filename != 0)
+    {
+      struct dirfile dirfile_key;
+
+      if (*filename == '\0')
+        {
+          /* Checking if the directory exists.  */
+          return 1;
+        }
+      dirfile_key.name = filename;
+      dirfile_key.length = strlen (filename);
+      df = hash_find_item (&dir->dirfiles, &dirfile_key);
+      if (df)
+        return !df->impossible;
+    }
+
+  /* The file was not found in the hashed list.
+     Try to read the directory further.  */
+
+  if (dir->dirstream == 0)
+    {
+#ifdef WINDOWS32
+      /*
+       * Check to see if directory has changed since last read. FAT
+       * filesystems force a rehash always as mtime does not change
+       * on directories (ugh!).
+       */
+      if (dir->path_key)
+        {
+          if ((dir->fs_flags & FS_FAT) != 0)
+            {
+              dir->mtime = time ((time_t *) 0);
+              rehash = 1;
+            }
+          else if (stat (dir->path_key, &st) == 0 && st.st_mtime > dir->mtime)
+            {
+              /* reset date stamp to show most recent re-process.  */
+              dir->mtime = st.st_mtime;
+              rehash = 1;
+            }
+
+          /* If it has been already read in, all done.  */
+          if (!rehash)
+            return 0;
+
+          /* make sure directory can still be opened; if not return.  */
+          dir->dirstream = opendir (dir->path_key);
+          if (!dir->dirstream)
+            return 0;
+        }
+      else
+#endif
+        /* The directory has been all read in.  */
+        return 0;
+    }
+
+  while (1)
+    {
+      /* Enter the file in the hash table.  */
+      size_t len;
+      struct dirfile dirfile_key;
+      struct dirfile **dirfile_slot;
+
+      ENULLLOOP (d, readdir (dir->dirstream));
+      if (d == 0)
+        {
+          if (errno)
+            pfatal_with_name ("INTERNAL: readdir");
+          break;
+        }
+
+#if defined(VMS) && defined(HAVE_DIRENT_H)
+      /* In VMS we get file versions too, which have to be stripped off.
+         Some versions of VMS return versions on Unix files even when
+         the feature option to strip them is set.  */
+      {
+        char *p = strrchr (d->d_name, ';');
+        if (p)
+          *p = '\0';
+      }
+#endif
+      if (!REAL_DIR_ENTRY (d))
+        continue;
+
+      len = NAMLEN (d);
+      dirfile_key.name = d->d_name;
+      dirfile_key.length = len;
+      dirfile_slot = (struct dirfile **) hash_find_slot (&dir->dirfiles, &dirfile_key);
+#ifdef WINDOWS32
+      /*
+       * If re-reading a directory, don't cache files that have
+       * already been discovered.
+       */
+      if (! rehash || HASH_VACANT (*dirfile_slot))
+#endif
+        {
+          df = xmalloc (sizeof (struct dirfile));
+#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS)
+          /* TODO: Why is this only needed on VMS? */
+          df->name = strcache_add_len (downcase_inplace (d->d_name), len);
+#else
+          df->name = strcache_add_len (d->d_name, len);
+#endif
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
+          df->type = d->d_type;
+#endif
+          df->length = len;
+          df->impossible = 0;
+          hash_insert_at (&dir->dirfiles, df, dirfile_slot);
+        }
+      /* Check if the name matches the one we're searching for.  */
+      if (filename != 0 && patheq (d->d_name, filename))
+        return 1;
+    }
+
+  /* If the directory has been completely read in,
+     close the stream and reset the pointer to nil.  */
+  if (d == 0)
+    {
+      --open_directories;
+      closedir (dir->dirstream);
+      dir->dirstream = 0;
+    }
+  return 0;
+}
+
+/* Return 1 if the name FILENAME in directory DIRNAME
+   is entered in the dir hash table.
+   FILENAME must contain no slashes.  */
+
+int
+dir_file_exists_p (const char *dirname, const char *filename)
+{
+#ifdef VMS
+  if ((filename != NULL) && (dirname != NULL))
+    {
+      int want_vmsify;
+      want_vmsify = (strpbrk (dirname, ":<[") != NULL);
+      if (want_vmsify)
+        filename = vmsify (filename, 0);
+    }
+#endif
+  return dir_contents_file_exists_p (find_directory (dirname)->contents,
+                                     filename);
+}
+\f
+/* Return 1 if the file named NAME exists.  */
+
+int
+file_exists_p (const char *name)
+{
+  const char *dirend;
+  const char *dirname;
+  const char *slash;
+
+#ifndef NO_ARCHIVES
+  if (ar_name (name))
+    return ar_member_date (name) != (time_t) -1;
+#endif
+
+  dirend = strrchr (name, '/');
+#ifdef VMS
+  if (dirend == 0)
+    {
+      dirend = strrchr (name, ']');
+      dirend == NULL ? dirend : dirend++;
+    }
+  if (dirend == 0)
+    {
+      dirend = strrchr (name, '>');
+      dirend == NULL ? dirend : dirend++;
+    }
+  if (dirend == 0)
+    {
+      dirend = strrchr (name, ':');
+      dirend == NULL ? dirend : dirend++;
+    }
+#endif /* VMS */
+#ifdef HAVE_DOS_PATHS
+  /* Forward and backslashes might be mixed.  We need the rightmost one.  */
+  {
+    const char *bslash = strrchr (name, '\\');
+    if (!dirend || bslash > dirend)
+      dirend = bslash;
+    /* The case of "d:file".  */
+    if (!dirend && name[0] && name[1] == ':')
+      dirend = name + 1;
+  }
+#endif /* HAVE_DOS_PATHS */
+  if (dirend == 0)
+#ifndef _AMIGA
+    return dir_file_exists_p (".", name);
+#else /* !AMIGA */
+    return dir_file_exists_p ("", name);
+#endif /* AMIGA */
+
+  slash = dirend;
+  if (dirend == name)
+    dirname = "/";
+  else
+    {
+      char *p;
+#ifdef HAVE_DOS_PATHS
+  /* d:/ and d: are *very* different...  */
+      if (dirend < name + 3 && name[1] == ':' &&
+          (*dirend == '/' || *dirend == '\\' || *dirend == ':'))
+        dirend++;
+#endif
+      p = alloca (dirend - name + 1);
+      memcpy (p, name, dirend - name);
+      p[dirend - name] = '\0';
+      dirname = p;
+    }
+#ifdef VMS
+  if (*slash == '/')
+    slash++;
+#else
+  slash++;
+#endif
+  return dir_file_exists_p (dirname, slash);
+}
+\f
+/* Mark FILENAME as 'impossible' for 'file_impossible_p'.
+   This means an attempt has been made to search for FILENAME
+   as an intermediate file, and it has failed.  */
+
+void
+file_impossible (const char *filename)
+{
+  const char *dirend;
+  const char *p = filename;
+  struct directory *dir;
+  struct dirfile *new;
+
+  dirend = strrchr (p, '/');
+#ifdef VMS
+  if (dirend == NULL)
+    {
+      dirend = strrchr (p, ']');
+      dirend == NULL ? dirend : dirend++;
+    }
+  if (dirend == NULL)
+    {
+      dirend = strrchr (p, '>');
+      dirend == NULL ? dirend : dirend++;
+    }
+  if (dirend == NULL)
+    {
+      dirend = strrchr (p, ':');
+      dirend == NULL ? dirend : dirend++;
+    }
+#endif
+#ifdef HAVE_DOS_PATHS
+  /* Forward and backslashes might be mixed.  We need the rightmost one.  */
+  {
+    const char *bslash = strrchr (p, '\\');
+    if (!dirend || bslash > dirend)
+      dirend = bslash;
+    /* The case of "d:file".  */
+    if (!dirend && p[0] && p[1] == ':')
+      dirend = p + 1;
+  }
+#endif /* HAVE_DOS_PATHS */
+  if (dirend == 0)
+#ifdef _AMIGA
+    dir = find_directory ("");
+#else /* !AMIGA */
+    dir = find_directory (".");
+#endif /* AMIGA */
+  else
+    {
+      const char *dirname;
+      const char *slash = dirend;
+      if (dirend == p)
+        dirname = "/";
+      else
+        {
+          char *cp;
+#ifdef HAVE_DOS_PATHS
+          /* d:/ and d: are *very* different...  */
+          if (dirend < p + 3 && p[1] == ':' &&
+              (*dirend == '/' || *dirend == '\\' || *dirend == ':'))
+            dirend++;
+#endif
+          cp = alloca (dirend - p + 1);
+          memcpy (cp, p, dirend - p);
+          cp[dirend - p] = '\0';
+          dirname = cp;
+        }
+      dir = find_directory (dirname);
+#ifdef VMS
+      if (*slash == '/')
+        filename = p = slash + 1;
+      else
+        filename = p = slash;
+#else
+      filename = p = slash + 1;
+#endif
+    }
+
+  if (dir->contents == 0)
+    /* The directory could not be stat'd.  We allocate a contents
+       structure for it, but leave it out of the contents hash table.  */
+    dir->contents = xcalloc (sizeof (struct directory_contents));
+
+  if (dir->contents->dirfiles.ht_vec == 0)
+    {
+      hash_init (&dir->contents->dirfiles, DIRFILE_BUCKETS,
+                 dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp);
+    }
+
+  /* Make a new entry and put it in the table.  */
+
+  new = xmalloc (sizeof (struct dirfile));
+  new->length = strlen (filename);
+#if defined(HAVE_CASE_INSENSITIVE_FS) && defined(VMS)
+  /* todo: Why is this only needed on VMS? */
+  new->name = strcache_add_len (downcase (filename), new->length);
+#else
+  new->name = strcache_add_len (filename, new->length);
+#endif
+  new->impossible = 1;
+  hash_insert (&dir->contents->dirfiles, new);
+}
+\f
+/* Return nonzero if FILENAME has been marked impossible.  */
+
+int
+file_impossible_p (const char *filename)
+{
+  const char *dirend;
+  struct directory_contents *dir;
+  struct dirfile *dirfile;
+  struct dirfile dirfile_key;
+#ifdef VMS
+  int want_vmsify = 0;
+#endif
+
+  dirend = strrchr (filename, '/');
+#ifdef VMS
+  if (dirend == NULL)
+    {
+      want_vmsify = (strpbrk (filename, "]>:^") != NULL);
+      dirend = strrchr (filename, ']');
+    }
+  if (dirend == NULL && want_vmsify)
+    dirend = strrchr (filename, '>');
+  if (dirend == NULL && want_vmsify)
+    dirend = strrchr (filename, ':');
+#endif
+#ifdef HAVE_DOS_PATHS
+  /* Forward and backslashes might be mixed.  We need the rightmost one.  */
+  {
+    const char *bslash = strrchr (filename, '\\');
+    if (!dirend || bslash > dirend)
+      dirend = bslash;
+    /* The case of "d:file".  */
+    if (!dirend && filename[0] && filename[1] == ':')
+      dirend = filename + 1;
+  }
+#endif /* HAVE_DOS_PATHS */
+  if (dirend == 0)
+#ifdef _AMIGA
+    dir = find_directory ("")->contents;
+#else /* !AMIGA */
+    dir = find_directory (".")->contents;
+#endif /* AMIGA */
+  else
+    {
+      const char *dirname;
+      const char *slash = dirend;
+      if (dirend == filename)
+        dirname = "/";
+      else
+        {
+          char *cp;
+#ifdef HAVE_DOS_PATHS
+          /* d:/ and d: are *very* different...  */
+          if (dirend < filename + 3 && filename[1] == ':' &&
+              (*dirend == '/' || *dirend == '\\' || *dirend == ':'))
+            dirend++;
+#endif
+          cp = alloca (dirend - filename + 1);
+          memcpy (cp, filename, dirend - filename);
+          cp[dirend - filename] = '\0';
+          dirname = cp;
+        }
+      dir = find_directory (dirname)->contents;
+#ifdef VMS
+      if (*slash == '/')
+        filename = slash + 1;
+      else
+        filename = slash;
+#else
+      filename = slash + 1;
+#endif
+    }
+
+  if (dir == 0 || dir->dirfiles.ht_vec == 0)
+    /* There are no files entered for this directory.  */
+    return 0;
+
+#ifdef __MSDOS__
+  filename = dosify (filename);
+#endif
+#ifdef HAVE_CASE_INSENSITIVE_FS
+  filename = downcase (filename);
+#endif
+#ifdef VMS
+  if (want_vmsify)
+    filename = vmsify (filename, 1);
+#endif
+
+  dirfile_key.name = filename;
+  dirfile_key.length = strlen (filename);
+  dirfile = hash_find_item (&dir->dirfiles, &dirfile_key);
+  if (dirfile)
+    return dirfile->impossible;
+
+  return 0;
+}
+\f
+/* Return the already allocated name in the
+   directory hash table that matches DIR.  */
+
+const char *
+dir_name (const char *dir)
+{
+  return find_directory (dir)->name;
+}
+\f
+/* Print the data base of directories.  */
+
+void
+print_dir_data_base (void)
+{
+  unsigned int files;
+  unsigned int impossible;
+  struct directory **dir_slot;
+  struct directory **dir_end;
+
+  puts (_("\n# Directories\n"));
+
+  files = impossible = 0;
+
+  dir_slot = (struct directory **) directories.ht_vec;
+  dir_end = dir_slot + directories.ht_size;
+  for ( ; dir_slot < dir_end; dir_slot++)
+    {
+      struct directory *dir = *dir_slot;
+      if (! HASH_VACANT (dir))
+        {
+          if (dir->contents == 0)
+            printf (_("# %s: could not be stat'd.\n"), dir->name);
+          else if (dir->contents->dirfiles.ht_vec == 0)
+            {
+#ifdef WINDOWS32
+              printf (_("# %s (key %s, mtime %I64u): could not be opened.\n"),
+                      dir->name, dir->contents->path_key,
+                      (unsigned long long)dir->contents->mtime);
+#else  /* WINDOWS32 */
+#ifdef VMS_INO_T
+              printf (_("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"),
+                      dir->name, dir->contents->dev,
+                      dir->contents->ino[0], dir->contents->ino[1],
+                      dir->contents->ino[2]);
+#else
+              printf (_("# %s (device %ld, inode %ld): could not be opened.\n"),
+                      dir->name, (long int) dir->contents->dev,
+                      (long int) dir->contents->ino);
+#endif
+#endif /* WINDOWS32 */
+            }
+          else
+            {
+              unsigned int f = 0;
+              unsigned int im = 0;
+              struct dirfile **files_slot;
+              struct dirfile **files_end;
+
+              files_slot = (struct dirfile **) dir->contents->dirfiles.ht_vec;
+              files_end = files_slot + dir->contents->dirfiles.ht_size;
+              for ( ; files_slot < files_end; files_slot++)
+                {
+                  struct dirfile *df = *files_slot;
+                  if (! HASH_VACANT (df))
+                    {
+                      if (df->impossible)
+                        ++im;
+                      else
+                        ++f;
+                    }
+                }
+#ifdef WINDOWS32
+              printf (_("# %s (key %s, mtime %I64u): "),
+                      dir->name, dir->contents->path_key,
+                      (unsigned long long)dir->contents->mtime);
+#else  /* WINDOWS32 */
+#ifdef VMS_INO_T
+              printf (_("# %s (device %d, inode [%d,%d,%d]): "),
+                      dir->name, dir->contents->dev,
+                      dir->contents->ino[0], dir->contents->ino[1],
+                      dir->contents->ino[2]);
+#else
+              printf (_("# %s (device %ld, inode %ld): "),
+                      dir->name,
+                      (long)dir->contents->dev, (long)dir->contents->ino);
+#endif
+#endif /* WINDOWS32 */
+              if (f == 0)
+                fputs (_("No"), stdout);
+              else
+                printf ("%u", f);
+              fputs (_(" files, "), stdout);
+              if (im == 0)
+                fputs (_("no"), stdout);
+              else
+                printf ("%u", im);
+              fputs (_(" impossibilities"), stdout);
+              if (dir->contents->dirstream == 0)
+                puts (".");
+              else
+                puts (_(" so far."));
+              files += f;
+              impossible += im;
+            }
+        }
+    }
+
+  fputs ("\n# ", stdout);
+  if (files == 0)
+    fputs (_("No"), stdout);
+  else
+    printf ("%u", files);
+  fputs (_(" files, "), stdout);
+  if (impossible == 0)
+    fputs (_("no"), stdout);
+  else
+    printf ("%u", impossible);
+  printf (_(" impossibilities in %lu directories.\n"), directories.ht_fill);
+}
+\f
+/* Hooks for globbing.  */
+
+/* Structure describing state of iterating through a directory hash table.  */
+
+struct dirstream
+  {
+    struct directory_contents *contents; /* The directory being read.  */
+    struct dirfile **dirfile_slot; /* Current slot in table.  */
+  };
+
+/* Forward declarations.  */
+static __ptr_t open_dirstream (const char *);
+static struct dirent *read_dirstream (__ptr_t);
+
+static __ptr_t
+open_dirstream (const char *directory)
+{
+  struct dirstream *new;
+  struct directory *dir = find_directory (directory);
+
+  if (dir->contents == 0 || dir->contents->dirfiles.ht_vec == 0)
+    /* DIR->contents is nil if the directory could not be stat'd.
+       DIR->contents->dirfiles is nil if it could not be opened.  */
+    return 0;
+
+  /* Read all the contents of the directory now.  There is no benefit
+     in being lazy, since glob will want to see every file anyway.  */
+
+  dir_contents_file_exists_p (dir->contents, 0);
+
+  new = xmalloc (sizeof (struct dirstream));
+  new->contents = dir->contents;
+  new->dirfile_slot = (struct dirfile **) new->contents->dirfiles.ht_vec;
+
+  return (__ptr_t) new;
+}
+
+static struct dirent *
+read_dirstream (__ptr_t stream)
+{
+  static char *buf;
+  static size_t bufsz;
+
+  struct dirstream *const ds = (struct dirstream *) stream;
+  struct directory_contents *dc = ds->contents;
+  struct dirfile **dirfile_end = (struct dirfile **) dc->dirfiles.ht_vec + dc->dirfiles.ht_size;
+
+  while (ds->dirfile_slot < dirfile_end)
+    {
+      struct dirfile *df = *ds->dirfile_slot++;
+      if (! HASH_VACANT (df) && !df->impossible)
+        {
+          /* The glob interface wants a 'struct dirent', so mock one up.  */
+          struct dirent *d;
+          size_t len = df->length + 1;
+          size_t sz = sizeof (*d) - sizeof (d->d_name) + len;
+          if (sz > bufsz)
+            {
+              bufsz *= 2;
+              if (sz > bufsz)
+                bufsz = sz;
+              buf = xrealloc (buf, bufsz);
+            }
+          d = (struct dirent *) buf;
+#ifdef __MINGW32__
+# if __MINGW32_MAJOR_VERSION < 3 || (__MINGW32_MAJOR_VERSION == 3 && \
+                                     __MINGW32_MINOR_VERSION == 0)
+          d->d_name = xmalloc (len);
+# endif
+#endif
+          FAKE_DIR_ENTRY (d);
+#ifdef _DIRENT_HAVE_D_NAMLEN
+          d->d_namlen = len - 1;
+#endif
+#ifdef HAVE_STRUCT_DIRENT_D_TYPE
+          d->d_type = df->type;
+#endif
+          memcpy (d->d_name, df->name, len);
+          return d;
+        }
+    }
+
+  return 0;
+}
+
+/* On 64 bit ReliantUNIX (5.44 and above) in LFS mode, stat() is actually a
+ * macro for stat64().  If stat is a macro, make a local wrapper function to
+ * invoke it.
+ *
+ * On MS-Windows, stat() "succeeds" for foo/bar/. where foo/bar is a
+ * regular file; fix that here.
+ */
+#if !defined(stat) && !defined(WINDOWS32) || defined(VMS)
+# ifndef VMS
+#  ifndef HAVE_SYS_STAT_H
+int stat (const char *path, struct stat *sbuf);
+#  endif
+# else
+    /* We are done with the fake stat.  Go back to the real stat */
+#   ifdef stat
+#     undef stat
+#   endif
+# endif
+# define local_stat stat
+#else
+static int
+local_stat (const char *path, struct stat *buf)
+{
+  int e;
+#ifdef WINDOWS32
+  size_t plen = strlen (path);
+
+  /* Make sure the parent of "." exists and is a directory, not a
+     file.  This is because 'stat' on Windows normalizes the argument
+     foo/. => foo without checking first that foo is a directory.  */
+  if (plen > 1 && path[plen - 1] == '.'
+      && (path[plen - 2] == '/' || path[plen - 2] == '\\'))
+    {
+      char parent[MAXPATHLEN];
+
+      strncpy (parent, path, plen - 2);
+      parent[plen - 2] = '\0';
+      if (stat (parent, buf) < 0 || !_S_ISDIR (buf->st_mode))
+        return -1;
+    }
+#endif
+
+  EINTRLOOP (e, stat (path, buf));
+  return e;
+}
+#endif
+
+/* Similarly for lstat.  */
+#if !defined(lstat) && !defined(WINDOWS32) || defined(VMS)
+# ifndef VMS
+#  ifndef HAVE_SYS_STAT_H
+int lstat (const char *path, struct stat *sbuf);
+#  endif
+# else
+    /* We are done with the fake lstat.  Go back to the real lstat */
+#   ifdef lstat
+#     undef lstat
+#   endif
+# endif
+# define local_lstat lstat
+#elif defined(WINDOWS32)
+/* Windows doesn't support lstat().  */
+# define local_lstat local_stat
+#else
+static int
+local_lstat (const char *path, struct stat *buf)
+{
+  int e;
+  EINTRLOOP (e, lstat (path, buf));
+  return e;
+}
+#endif
+
+void
+dir_setup_glob (glob_t *gl)
+{
+  gl->gl_offs = 0;
+  gl->gl_opendir = open_dirstream;
+  gl->gl_readdir = read_dirstream;
+  gl->gl_closedir = free;
+  gl->gl_lstat = local_lstat;
+  gl->gl_stat = local_stat;
+}
+
+void
+hash_init_directories (void)
+{
+  hash_init (&directories, DIRECTORY_BUCKETS,
+             directory_hash_1, directory_hash_2, directory_hash_cmp);
+  hash_init (&directory_contents, DIRECTORY_BUCKETS,
+             directory_contents_hash_1, directory_contents_hash_2,
+             directory_contents_hash_cmp);
+}
diff --git a/src/expand.c b/src/expand.c
new file mode 100644 (file)
index 0000000..0b6bb25
--- /dev/null
@@ -0,0 +1,597 @@
+/* Variable expansion functions for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+
+#include "filedef.h"
+#include "job.h"
+#include "commands.h"
+#include "variable.h"
+#include "rule.h"
+
+/* Initially, any errors reported when expanding strings will be reported
+   against the file where the error appears.  */
+const floc **expanding_var = &reading_file;
+
+/* The next two describe the variable output buffer.
+   This buffer is used to hold the variable-expansion of a line of the
+   makefile.  It is made bigger with realloc whenever it is too small.
+   variable_buffer_length is the size currently allocated.
+   variable_buffer is the address of the buffer.
+
+   For efficiency, it's guaranteed that the buffer will always have
+   VARIABLE_BUFFER_ZONE extra bytes allocated.  This allows you to add a few
+   extra chars without having to call a function.  Note you should never use
+   these bytes unless you're _sure_ you have room (you know when the buffer
+   length was last checked.  */
+
+#define VARIABLE_BUFFER_ZONE    5
+
+static size_t variable_buffer_length;
+char *variable_buffer;
+
+/* Subroutine of variable_expand and friends:
+   The text to add is LENGTH chars starting at STRING to the variable_buffer.
+   The text is added to the buffer at PTR, and the updated pointer into
+   the buffer is returned as the value.  Thus, the value returned by
+   each call to variable_buffer_output should be the first argument to
+   the following call.  */
+
+char *
+variable_buffer_output (char *ptr, const char *string, size_t length)
+{
+  size_t newlen = length + (ptr - variable_buffer);
+
+  if ((newlen + VARIABLE_BUFFER_ZONE) > variable_buffer_length)
+    {
+      size_t offset = ptr - variable_buffer;
+      variable_buffer_length = (newlen + 100 > 2 * variable_buffer_length
+                                ? newlen + 100
+                                : 2 * variable_buffer_length);
+      variable_buffer = xrealloc (variable_buffer, variable_buffer_length);
+      ptr = variable_buffer + offset;
+    }
+
+  memcpy (ptr, string, length);
+  return ptr + length;
+}
+
+/* Return a pointer to the beginning of the variable buffer.  */
+
+static char *
+initialize_variable_output (void)
+{
+  /* If we don't have a variable output buffer yet, get one.  */
+
+  if (variable_buffer == 0)
+    {
+      variable_buffer_length = 200;
+      variable_buffer = xmalloc (variable_buffer_length);
+      variable_buffer[0] = '\0';
+    }
+
+  return variable_buffer;
+}
+\f
+/* Recursively expand V.  The returned string is malloc'd.  */
+
+static char *allocated_variable_append (const struct variable *v);
+
+char *
+recursively_expand_for_file (struct variable *v, struct file *file)
+{
+  char *value;
+  const floc *this_var;
+  const floc **saved_varp;
+  struct variable_set_list *save = 0;
+  int set_reading = 0;
+
+  /* Don't install a new location if this location is empty.
+     This can happen for command-line variables, builtin variables, etc.  */
+  saved_varp = expanding_var;
+  if (v->fileinfo.filenm)
+    {
+      this_var = &v->fileinfo;
+      expanding_var = &this_var;
+    }
+
+  /* If we have no other file-reading context, use the variable's context. */
+  if (!reading_file)
+    {
+      set_reading = 1;
+      reading_file = &v->fileinfo;
+    }
+
+  if (v->expanding)
+    {
+      if (!v->exp_count)
+        /* Expanding V causes infinite recursion.  Lose.  */
+        OS (fatal, *expanding_var,
+            _("Recursive variable '%s' references itself (eventually)"),
+            v->name);
+      --v->exp_count;
+    }
+
+  if (file)
+    {
+      save = current_variable_set_list;
+      current_variable_set_list = file->variables;
+    }
+
+  v->expanding = 1;
+  if (v->append)
+    value = allocated_variable_append (v);
+  else
+    value = allocated_variable_expand (v->value);
+  v->expanding = 0;
+
+  if (set_reading)
+    reading_file = 0;
+
+  if (file)
+    current_variable_set_list = save;
+
+  expanding_var = saved_varp;
+
+  return value;
+}
+
+/* Expand a simple reference to variable NAME, which is LENGTH chars long.  */
+
+#ifdef __GNUC__
+__inline
+#endif
+static char *
+reference_variable (char *o, const char *name, size_t length)
+{
+  struct variable *v;
+  char *value;
+
+  v = lookup_variable (name, length);
+
+  if (v == 0)
+    warn_undefined (name, length);
+
+  /* If there's no variable by that name or it has no value, stop now.  */
+  if (v == 0 || (*v->value == '\0' && !v->append))
+    return o;
+
+  value = (v->recursive ? recursively_expand (v) : v->value);
+
+  o = variable_buffer_output (o, value, strlen (value));
+
+  if (v->recursive)
+    free (value);
+
+  return o;
+}
+\f
+/* Scan STRING for variable references and expansion-function calls.  Only
+   LENGTH bytes of STRING are actually scanned.  If LENGTH is -1, scan until
+   a null byte is found.
+
+   Write the results to LINE, which must point into 'variable_buffer'.  If
+   LINE is NULL, start at the beginning of the buffer.
+   Return a pointer to LINE, or to the beginning of the buffer if LINE is
+   NULL.
+ */
+char *
+variable_expand_string (char *line, const char *string, size_t length)
+{
+  struct variable *v;
+  const char *p, *p1;
+  char *save;
+  char *o;
+  size_t line_offset;
+
+  if (!line)
+    line = initialize_variable_output ();
+  o = line;
+  line_offset = line - variable_buffer;
+
+  if (length == 0)
+    {
+      variable_buffer_output (o, "", 1);
+      return (variable_buffer);
+    }
+
+  /* We need a copy of STRING: due to eval, it's possible that it will get
+     freed as we process it (it might be the value of a variable that's reset
+     for example).  Also having a nil-terminated string is handy.  */
+  save = length == SIZE_MAX ? xstrdup (string) : xstrndup (string, length);
+  p = save;
+
+  while (1)
+    {
+      /* Copy all following uninteresting chars all at once to the
+         variable output buffer, and skip them.  Uninteresting chars end
+         at the next $ or the end of the input.  */
+
+      p1 = strchr (p, '$');
+
+      o = variable_buffer_output (o, p, p1 != 0 ? (size_t) (p1 - p) : strlen (p) + 1);
+
+      if (p1 == 0)
+        break;
+      p = p1 + 1;
+
+      /* Dispatch on the char that follows the $.  */
+
+      switch (*p)
+        {
+        case '$':
+        case '\0':
+          /* $$ or $ at the end of the string means output one $ to the
+             variable output buffer.  */
+          o = variable_buffer_output (o, p1, 1);
+          break;
+
+        case '(':
+        case '{':
+          /* $(...) or ${...} is the general case of substitution.  */
+          {
+            char openparen = *p;
+            char closeparen = (openparen == '(') ? ')' : '}';
+            const char *begp;
+            const char *beg = p + 1;
+            char *op;
+            char *abeg = NULL;
+            const char *end, *colon;
+
+            op = o;
+            begp = p;
+            if (handle_function (&op, &begp))
+              {
+                o = op;
+                p = begp;
+                break;
+              }
+
+            /* Is there a variable reference inside the parens or braces?
+               If so, expand it before expanding the entire reference.  */
+
+            end = strchr (beg, closeparen);
+            if (end == 0)
+              /* Unterminated variable reference.  */
+              O (fatal, *expanding_var, _("unterminated variable reference"));
+            p1 = lindex (beg, end, '$');
+            if (p1 != 0)
+              {
+                /* BEG now points past the opening paren or brace.
+                   Count parens or braces until it is matched.  */
+                int count = 0;
+                for (p = beg; *p != '\0'; ++p)
+                  {
+                    if (*p == openparen)
+                      ++count;
+                    else if (*p == closeparen && --count < 0)
+                      break;
+                  }
+                /* If COUNT is >= 0, there were unmatched opening parens
+                   or braces, so we go to the simple case of a variable name
+                   such as '$($(a)'.  */
+                if (count < 0)
+                  {
+                    abeg = expand_argument (beg, p); /* Expand the name.  */
+                    beg = abeg;
+                    end = strchr (beg, '\0');
+                  }
+              }
+            else
+              /* Advance P to the end of this reference.  After we are
+                 finished expanding this one, P will be incremented to
+                 continue the scan.  */
+              p = end;
+
+            /* This is not a reference to a built-in function and
+               any variable references inside are now expanded.
+               Is the resultant text a substitution reference?  */
+
+            colon = lindex (beg, end, ':');
+            if (colon)
+              {
+                /* This looks like a substitution reference: $(FOO:A=B).  */
+                const char *subst_beg = colon + 1;
+                const char *subst_end = lindex (subst_beg, end, '=');
+                if (subst_end == 0)
+                  /* There is no = in sight.  Punt on the substitution
+                     reference and treat this as a variable name containing
+                     a colon, in the code below.  */
+                  colon = 0;
+                else
+                  {
+                    const char *replace_beg = subst_end + 1;
+                    const char *replace_end = end;
+
+                    /* Extract the variable name before the colon
+                       and look up that variable.  */
+                    v = lookup_variable (beg, colon - beg);
+                    if (v == 0)
+                      warn_undefined (beg, colon - beg);
+
+                    /* If the variable is not empty, perform the
+                       substitution.  */
+                    if (v != 0 && *v->value != '\0')
+                      {
+                        char *pattern, *replace, *ppercent, *rpercent;
+                        char *value = (v->recursive
+                                       ? recursively_expand (v)
+                                       : v->value);
+
+                        /* Copy the pattern and the replacement.  Add in an
+                           extra % at the beginning to use in case there
+                           isn't one in the pattern.  */
+                        pattern = alloca (subst_end - subst_beg + 2);
+                        *(pattern++) = '%';
+                        memcpy (pattern, subst_beg, subst_end - subst_beg);
+                        pattern[subst_end - subst_beg] = '\0';
+
+                        replace = alloca (replace_end - replace_beg + 2);
+                        *(replace++) = '%';
+                        memcpy (replace, replace_beg,
+                               replace_end - replace_beg);
+                        replace[replace_end - replace_beg] = '\0';
+
+                        /* Look for %.  Set the percent pointers properly
+                           based on whether we find one or not.  */
+                        ppercent = find_percent (pattern);
+                        if (ppercent)
+                          {
+                            ++ppercent;
+                            rpercent = find_percent (replace);
+                            if (rpercent)
+                              ++rpercent;
+                          }
+                        else
+                          {
+                            ppercent = pattern;
+                            rpercent = replace;
+                            --pattern;
+                            --replace;
+                          }
+
+                        o = patsubst_expand_pat (o, value, pattern, replace,
+                                                 ppercent, rpercent);
+
+                        if (v->recursive)
+                          free (value);
+                      }
+                  }
+              }
+
+            if (colon == 0)
+              /* This is an ordinary variable reference.
+                 Look up the value of the variable.  */
+                o = reference_variable (o, beg, end - beg);
+
+            free (abeg);
+          }
+          break;
+
+        default:
+          if (ISSPACE (p[-1]))
+            break;
+
+          /* A $ followed by a random char is a variable reference:
+             $a is equivalent to $(a).  */
+          o = reference_variable (o, p, 1);
+
+          break;
+        }
+
+      if (*p == '\0')
+        break;
+
+      ++p;
+    }
+
+  free (save);
+
+  variable_buffer_output (o, "", 1);
+  return (variable_buffer + line_offset);
+}
+\f
+/* Scan LINE for variable references and expansion-function calls.
+   Build in 'variable_buffer' the result of expanding the references and calls.
+   Return the address of the resulting string, which is null-terminated
+   and is valid only until the next time this function is called.  */
+
+char *
+variable_expand (const char *line)
+{
+  return variable_expand_string (NULL, line, SIZE_MAX);
+}
+\f
+/* Expand an argument for an expansion function.
+   The text starting at STR and ending at END is variable-expanded
+   into a null-terminated string that is returned as the value.
+   This is done without clobbering 'variable_buffer' or the current
+   variable-expansion that is in progress.  */
+
+char *
+expand_argument (const char *str, const char *end)
+{
+  char *tmp, *alloc = NULL;
+  char *r;
+
+  if (str == end)
+    return xstrdup ("");
+
+  if (!end || *end == '\0')
+    return allocated_variable_expand (str);
+
+  if (end - str + 1 > 1000)
+    tmp = alloc = xmalloc (end - str + 1);
+  else
+    tmp = alloca (end - str + 1);
+
+  memcpy (tmp, str, end - str);
+  tmp[end - str] = '\0';
+
+  r = allocated_variable_expand (tmp);
+
+  free (alloc);
+
+  return r;
+}
+\f
+/* Expand LINE for FILE.  Error messages refer to the file and line where
+   FILE's commands were found.  Expansion uses FILE's variable set list.  */
+
+char *
+variable_expand_for_file (const char *line, struct file *file)
+{
+  char *result;
+  struct variable_set_list *savev;
+  const floc *savef;
+
+  if (file == 0)
+    return variable_expand (line);
+
+  savev = current_variable_set_list;
+  current_variable_set_list = file->variables;
+
+  savef = reading_file;
+  if (file->cmds && file->cmds->fileinfo.filenm)
+    reading_file = &file->cmds->fileinfo;
+  else
+    reading_file = 0;
+
+  result = variable_expand (line);
+
+  current_variable_set_list = savev;
+  reading_file = savef;
+
+  return result;
+}
+\f
+/* Like allocated_variable_expand, but for += target-specific variables.
+   First recursively construct the variable value from its appended parts in
+   any upper variable sets.  Then expand the resulting value.  */
+
+static char *
+variable_append (const char *name, size_t length,
+                 const struct variable_set_list *set, int local)
+{
+  const struct variable *v;
+  char *buf = 0;
+  int nextlocal;
+
+  /* If there's nothing left to check, return the empty buffer.  */
+  if (!set)
+    return initialize_variable_output ();
+
+  /* If this set is local and the next is not a parent, then next is local.  */
+  nextlocal = local && set->next_is_parent == 0;
+
+  /* Try to find the variable in this variable set.  */
+  v = lookup_variable_in_set (name, length, set->set);
+
+  /* If there isn't one, or this one is private, try the set above us.  */
+  if (!v || (!local && v->private_var))
+    return variable_append (name, length, set->next, nextlocal);
+
+  /* If this variable type is append, first get any upper values.
+     If not, initialize the buffer.  */
+  if (v->append)
+    buf = variable_append (name, length, set->next, nextlocal);
+  else
+    buf = initialize_variable_output ();
+
+  /* Append this value to the buffer, and return it.
+     If we already have a value, first add a space.  */
+  if (buf > variable_buffer)
+    buf = variable_buffer_output (buf, " ", 1);
+
+  /* Either expand it or copy it, depending.  */
+  if (! v->recursive)
+    return variable_buffer_output (buf, v->value, strlen (v->value));
+
+  buf = variable_expand_string (buf, v->value, strlen (v->value));
+  return (buf + strlen (buf));
+}
+
+
+static char *
+allocated_variable_append (const struct variable *v)
+{
+  char *val;
+
+  /* Construct the appended variable value.  */
+
+  char *obuf = variable_buffer;
+  size_t olen = variable_buffer_length;
+
+  variable_buffer = 0;
+
+  val = variable_append (v->name, strlen (v->name),
+                         current_variable_set_list, 1);
+  variable_buffer_output (val, "", 1);
+  val = variable_buffer;
+
+  variable_buffer = obuf;
+  variable_buffer_length = olen;
+
+  return val;
+}
+
+/* Like variable_expand_for_file, but the returned string is malloc'd.
+   This function is called a lot.  It wants to be efficient.  */
+
+char *
+allocated_variable_expand_for_file (const char *line, struct file *file)
+{
+  char *value;
+
+  char *obuf = variable_buffer;
+  size_t olen = variable_buffer_length;
+
+  variable_buffer = 0;
+
+  value = variable_expand_for_file (line, file);
+
+  variable_buffer = obuf;
+  variable_buffer_length = olen;
+
+  return value;
+}
+
+/* Install a new variable_buffer context, returning the current one for
+   safe-keeping.  */
+
+void
+install_variable_buffer (char **bufp, size_t *lenp)
+{
+  *bufp = variable_buffer;
+  *lenp = variable_buffer_length;
+
+  variable_buffer = 0;
+  initialize_variable_output ();
+}
+
+/* Restore a previously-saved variable_buffer setting (free the current one).
+ */
+
+void
+restore_variable_buffer (char *buf, size_t len)
+{
+  free (variable_buffer);
+
+  variable_buffer = buf;
+  variable_buffer_length = len;
+}
diff --git a/src/file.c b/src/file.c
new file mode 100644 (file)
index 0000000..a979ca5
--- /dev/null
@@ -0,0 +1,1202 @@
+/* Target file management for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+
+#include "filedef.h"
+#include "dep.h"
+#include "job.h"
+#include "commands.h"
+#include "variable.h"
+#include "debug.h"
+#include "hash.h"
+
+
+/* Remember whether snap_deps has been invoked: we need this to be sure we
+   don't add new rules (via $(eval ...)) afterwards.  In the future it would
+   be nice to support this, but it means we'd need to re-run snap_deps() or
+   at least its functionality... it might mean changing snap_deps() to be run
+   per-file, so we can invoke it after the eval... or remembering which files
+   in the hash have been snapped (a new boolean flag?) and having snap_deps()
+   only work on files which have not yet been snapped. */
+int snapped_deps = 0;
+
+/* Hash table of files the makefile knows how to make.  */
+
+static unsigned long
+file_hash_1 (const void *key)
+{
+  return_ISTRING_HASH_1 (((struct file const *) key)->hname);
+}
+
+static unsigned long
+file_hash_2 (const void *key)
+{
+  return_ISTRING_HASH_2 (((struct file const *) key)->hname);
+}
+
+static int
+file_hash_cmp (const void *x, const void *y)
+{
+  return_ISTRING_COMPARE (((struct file const *) x)->hname,
+                          ((struct file const *) y)->hname);
+}
+
+static struct hash_table files;
+
+/* Whether or not .SECONDARY with no prerequisites was given.  */
+static int all_secondary = 0;
+
+/* Access the hash table of all file records.
+   lookup_file  given a name, return the struct file * for that name,
+                or nil if there is none.
+*/
+
+struct file *
+lookup_file (const char *name)
+{
+  struct file *f;
+  struct file file_key;
+#ifdef VMS
+  int want_vmsify;
+#ifndef WANT_CASE_SENSITIVE_TARGETS
+  char *lname;
+#endif
+#endif
+
+  assert (*name != '\0');
+
+  /* This is also done in parse_file_seq, so this is redundant
+     for names read from makefiles.  It is here for names passed
+     on the command line.  */
+#ifdef VMS
+   want_vmsify = (strpbrk (name, "]>:^") != NULL);
+# ifndef WANT_CASE_SENSITIVE_TARGETS
+  if (*name != '.')
+    {
+      const char *n;
+      char *ln;
+      lname = xstrdup (name);
+      for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
+        *ln = isupper ((unsigned char)*n) ? tolower ((unsigned char)*n) : *n;
+      *ln = '\0';
+      name = lname;
+    }
+# endif
+
+  while (name[0] == '[' && name[1] == ']' && name[2] != '\0')
+      name += 2;
+  while (name[0] == '<' && name[1] == '>' && name[2] != '\0')
+      name += 2;
+#endif
+  while (name[0] == '.'
+#ifdef HAVE_DOS_PATHS
+         && (name[1] == '/' || name[1] == '\\')
+#else
+         && name[1] == '/'
+#endif
+         && name[2] != '\0')
+    {
+      name += 2;
+      while (*name == '/'
+#ifdef HAVE_DOS_PATHS
+             || *name == '\\'
+#endif
+             )
+        /* Skip following slashes: ".//foo" is "foo", not "/foo".  */
+        ++name;
+    }
+
+  if (*name == '\0')
+    {
+      /* It was all slashes after a dot.  */
+#if defined(_AMIGA)
+      name = "";
+#else
+      name = "./";
+#endif
+#if defined(VMS)
+      /* TODO - This section is probably not needed. */
+      if (want_vmsify)
+        name = "[]";
+#endif
+    }
+  file_key.hname = name;
+  f = hash_find_item (&files, &file_key);
+#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
+  if (*name != '.')
+    free (lname);
+#endif
+
+  return f;
+}
+
+/* Look up a file record for file NAME and return it.
+   Create a new record if one doesn't exist.  NAME will be stored in the
+   new record so it should be constant or in the strcache etc.
+ */
+
+struct file *
+enter_file (const char *name)
+{
+  struct file *f;
+  struct file *new;
+  struct file **file_slot;
+  struct file file_key;
+
+  assert (*name != '\0');
+  assert (! verify_flag || strcache_iscached (name));
+
+#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
+  if (*name != '.')
+    {
+      const char *n;
+      char *lname, *ln;
+      lname = xstrdup (name);
+      for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
+        if (isupper ((unsigned char)*n))
+          *ln = tolower ((unsigned char)*n);
+        else
+          *ln = *n;
+
+      *ln = '\0';
+      name = strcache_add (lname);
+      free (lname);
+    }
+#endif
+
+  file_key.hname = name;
+  file_slot = (struct file **) hash_find_slot (&files, &file_key);
+  f = *file_slot;
+  if (! HASH_VACANT (f) && !f->double_colon)
+    {
+      f->builtin = 0;
+      return f;
+    }
+
+  new = xcalloc (sizeof (struct file));
+  new->name = new->hname = name;
+  new->update_status = us_none;
+
+  if (HASH_VACANT (f))
+    {
+      new->last = new;
+      hash_insert_at (&files, new, file_slot);
+    }
+  else
+    {
+      /* There is already a double-colon entry for this file.  */
+      new->double_colon = f;
+      f->last->prev = new;
+      f->last = new;
+    }
+
+  return new;
+}
+\f
+/* Rehash FILE to NAME.  This is not as simple as resetting
+   the 'hname' member, since it must be put in a new hash bucket,
+   and possibly merged with an existing file called NAME.  */
+
+void
+rehash_file (struct file *from_file, const char *to_hname)
+{
+  struct file file_key;
+  struct file **file_slot;
+  struct file *to_file;
+  struct file *deleted_file;
+  struct file *f;
+
+  /* If it's already that name, we're done.  */
+  from_file->builtin = 0;
+  file_key.hname = to_hname;
+  if (! file_hash_cmp (from_file, &file_key))
+    return;
+
+  /* Find the end of the renamed list for the "from" file.  */
+  file_key.hname = from_file->hname;
+  while (from_file->renamed != 0)
+    from_file = from_file->renamed;
+  if (file_hash_cmp (from_file, &file_key))
+    /* hname changed unexpectedly!! */
+    abort ();
+
+  /* Remove the "from" file from the hash.  */
+  deleted_file = hash_delete (&files, from_file);
+  if (deleted_file != from_file)
+    /* from_file isn't the one stored in files */
+    abort ();
+
+  /* Find where the newly renamed file will go in the hash.  */
+  file_key.hname = to_hname;
+  file_slot = (struct file **) hash_find_slot (&files, &file_key);
+  to_file = *file_slot;
+
+  /* Change the hash name for this file.  */
+  from_file->hname = to_hname;
+  for (f = from_file->double_colon; f != 0; f = f->prev)
+    f->hname = to_hname;
+
+  /* If the new name doesn't exist yet just set it to the renamed file.  */
+  if (HASH_VACANT (to_file))
+    {
+      hash_insert_at (&files, from_file, file_slot);
+      return;
+    }
+
+  /* TO_FILE already exists under TO_HNAME.
+     We must retain TO_FILE and merge FROM_FILE into it.  */
+
+  if (from_file->cmds != 0)
+    {
+      if (to_file->cmds == 0)
+        to_file->cmds = from_file->cmds;
+      else if (from_file->cmds != to_file->cmds)
+        {
+          size_t l = strlen (from_file->name);
+          /* We have two sets of commands.  We will go with the
+             one given in the rule explicitly mentioning this name,
+             but give a message to let the user know what's going on.  */
+          if (to_file->cmds->fileinfo.filenm != 0)
+            error (&from_file->cmds->fileinfo,
+                   l + strlen (to_file->cmds->fileinfo.filenm) + INTSTR_LENGTH,
+                   _("Recipe was specified for file '%s' at %s:%lu,"),
+                   from_file->name, to_file->cmds->fileinfo.filenm,
+                   to_file->cmds->fileinfo.lineno);
+          else
+            error (&from_file->cmds->fileinfo, l,
+                   _("Recipe for file '%s' was found by implicit rule search,"),
+                   from_file->name);
+          l += strlen (to_hname);
+          error (&from_file->cmds->fileinfo, l,
+                 _("but '%s' is now considered the same file as '%s'."),
+                 from_file->name, to_hname);
+          error (&from_file->cmds->fileinfo, l,
+                 _("Recipe for '%s' will be ignored in favor of the one for '%s'."),
+                 to_hname, from_file->name);
+        }
+    }
+
+  /* Merge the dependencies of the two files.  */
+
+  if (to_file->deps == 0)
+    to_file->deps = from_file->deps;
+  else
+    {
+      struct dep *deps = to_file->deps;
+      while (deps->next != 0)
+        deps = deps->next;
+      deps->next = from_file->deps;
+    }
+
+  merge_variable_set_lists (&to_file->variables, from_file->variables);
+
+  if (to_file->double_colon && from_file->is_target && !from_file->double_colon)
+    OSS (fatal, NILF, _("can't rename single-colon '%s' to double-colon '%s'"),
+         from_file->name, to_hname);
+  if (!to_file->double_colon  && from_file->double_colon)
+    {
+      if (to_file->is_target)
+        OSS (fatal, NILF,
+             _("can't rename double-colon '%s' to single-colon '%s'"),
+             from_file->name, to_hname);
+      else
+        to_file->double_colon = from_file->double_colon;
+    }
+
+  if (from_file->last_mtime > to_file->last_mtime)
+    /* %%% Kludge so -W wins on a file that gets vpathized.  */
+    to_file->last_mtime = from_file->last_mtime;
+
+  to_file->mtime_before_update = from_file->mtime_before_update;
+
+#define MERGE(field) to_file->field |= from_file->field
+  MERGE (precious);
+  MERGE (tried_implicit);
+  MERGE (updating);
+  MERGE (updated);
+  MERGE (is_target);
+  MERGE (cmd_target);
+  MERGE (phony);
+  MERGE (loaded);
+  MERGE (ignore_vpath);
+#undef MERGE
+
+  to_file->builtin = 0;
+  from_file->renamed = to_file;
+}
+
+/* Rename FILE to NAME.  This is not as simple as resetting
+   the 'name' member, since it must be put in a new hash bucket,
+   and possibly merged with an existing file called NAME.  */
+
+void
+rename_file (struct file *from_file, const char *to_hname)
+{
+  rehash_file (from_file, to_hname);
+  while (from_file)
+    {
+      from_file->name = from_file->hname;
+      from_file = from_file->prev;
+    }
+}
+\f
+/* Remove all nonprecious intermediate files.
+   If SIG is nonzero, this was caused by a fatal signal,
+   meaning that a different message will be printed, and
+   the message will go to stderr rather than stdout.  */
+
+void
+remove_intermediates (int sig)
+{
+  struct file **file_slot;
+  struct file **file_end;
+  int doneany = 0;
+
+  /* If there's no way we will ever remove anything anyway, punt early.  */
+  if (question_flag || touch_flag || all_secondary)
+    return;
+
+  if (sig && just_print_flag)
+    return;
+
+  file_slot = (struct file **) files.ht_vec;
+  file_end = file_slot + files.ht_size;
+  for ( ; file_slot < file_end; file_slot++)
+    if (! HASH_VACANT (*file_slot))
+      {
+        struct file *f = *file_slot;
+        /* Is this file eligible for automatic deletion?
+           Yes, IFF: it's marked intermediate, it's not secondary, it wasn't
+           given on the command line, and it's either a -include makefile or
+           it's not precious.  */
+        if (f->intermediate && (f->dontcare || !f->precious)
+            && !f->secondary && !f->cmd_target)
+          {
+            int status;
+            if (f->update_status == us_none)
+              /* If nothing would have created this file yet,
+                 don't print an "rm" command for it.  */
+              continue;
+            if (just_print_flag)
+              status = 0;
+            else
+              {
+                status = unlink (f->name);
+                if (status < 0 && errno == ENOENT)
+                  continue;
+              }
+            if (!f->dontcare)
+              {
+                if (sig)
+                  OS (error, NILF,
+                      _("*** Deleting intermediate file '%s'"), f->name);
+                else
+                  {
+                    if (! doneany)
+                      DB (DB_BASIC, (_("Removing intermediate files...\n")));
+                    if (!run_silent)
+                      {
+                        if (! doneany)
+                          {
+                            fputs ("rm ", stdout);
+                            doneany = 1;
+                          }
+                        else
+                          putchar (' ');
+                        fputs (f->name, stdout);
+                        fflush (stdout);
+                      }
+                  }
+                if (status < 0)
+                  perror_with_name ("unlink: ", f->name);
+              }
+          }
+      }
+
+  if (doneany && !sig)
+    {
+      putchar ('\n');
+      fflush (stdout);
+    }
+}
+\f
+/* Given a string containing prerequisites (fully expanded), break it up into
+   a struct dep list.  Enter each of these prereqs into the file database.
+ */
+struct dep *
+split_prereqs (char *p)
+{
+  struct dep *new = PARSE_FILE_SEQ (&p, struct dep, MAP_PIPE, NULL,
+                                    PARSEFS_NONE);
+
+  if (*p)
+    {
+      /* Files that follow '|' are "order-only" prerequisites that satisfy the
+         dependency by existing: their modification times are irrelevant.  */
+      struct dep *ood;
+
+      ++p;
+      ood = PARSE_SIMPLE_SEQ (&p, struct dep);
+
+      if (! new)
+        new = ood;
+      else
+        {
+          struct dep *dp;
+          for (dp = new; dp->next != NULL; dp = dp->next)
+            ;
+          dp->next = ood;
+        }
+
+      for (; ood != NULL; ood = ood->next)
+        ood->ignore_mtime = 1;
+    }
+
+  return new;
+}
+
+/* Given a list of prerequisites, enter them into the file database.
+   If STEM is set then first expand patterns using STEM.  */
+struct dep *
+enter_prereqs (struct dep *deps, const char *stem)
+{
+  struct dep *d1;
+
+  if (deps == 0)
+    return 0;
+
+  /* If we have a stem, expand the %'s.  We use patsubst_expand to translate
+     the prerequisites' patterns into plain prerequisite names.  */
+  if (stem)
+    {
+      const char *pattern = "%";
+      char *buffer = variable_expand ("");
+      struct dep *dp = deps, *dl = 0;
+
+      while (dp != 0)
+        {
+          char *percent;
+          size_t nl = strlen (dp->name) + 1;
+          char *nm = alloca (nl);
+          memcpy (nm, dp->name, nl);
+          percent = find_percent (nm);
+          if (percent)
+            {
+              char *o;
+
+              /* We have to handle empty stems specially, because that
+                 would be equivalent to $(patsubst %,dp->name,) which
+                 will always be empty.  */
+              if (stem[0] == '\0')
+                {
+                  memmove (percent, percent+1, strlen (percent));
+                  o = variable_buffer_output (buffer, nm, strlen (nm) + 1);
+                }
+              else
+                o = patsubst_expand_pat (buffer, stem, pattern, nm,
+                                         pattern+1, percent+1);
+
+              /* If the name expanded to the empty string, ignore it.  */
+              if (buffer[0] == '\0')
+                {
+                  struct dep *df = dp;
+                  if (dp == deps)
+                    dp = deps = deps->next;
+                  else
+                    dp = dl->next = dp->next;
+                  free_dep (df);
+                  continue;
+                }
+
+              /* Save the name.  */
+              dp->name = strcache_add_len (buffer, o - buffer);
+            }
+          dp->stem = stem;
+          dp->staticpattern = 1;
+          dl = dp;
+          dp = dp->next;
+        }
+    }
+
+  /* Enter them as files, unless they need a 2nd expansion.  */
+  for (d1 = deps; d1 != 0; d1 = d1->next)
+    {
+      if (d1->need_2nd_expansion)
+        continue;
+
+      d1->file = lookup_file (d1->name);
+      if (d1->file == 0)
+        d1->file = enter_file (d1->name);
+      d1->staticpattern = 0;
+      d1->name = 0;
+    }
+
+  return deps;
+}
+
+/* Expand and parse each dependency line. */
+static void
+expand_deps (struct file *f)
+{
+  struct dep *d;
+  struct dep **dp;
+  const char *file_stem = f->stem;
+  int initialized = 0;
+
+  f->updating = 0;
+
+  /* Walk through the dependencies.  For any dependency that needs 2nd
+     expansion, expand it then insert the result into the list.  */
+  dp = &f->deps;
+  d = f->deps;
+  while (d != 0)
+    {
+      char *p;
+      struct dep *new, *next;
+      char *name = (char *)d->name;
+
+      if (! d->name || ! d->need_2nd_expansion)
+        {
+          /* This one is all set already.  */
+          dp = &d->next;
+          d = d->next;
+          continue;
+        }
+
+      /* If it's from a static pattern rule, convert the patterns into
+         "$*" so they'll expand properly.  */
+      if (d->staticpattern)
+        {
+          char *o = variable_expand ("");
+          o = subst_expand (o, name, "%", "$*", 1, 2, 0);
+          *o = '\0';
+          free (name);
+          d->name = name = xstrdup (variable_buffer);
+          d->staticpattern = 0;
+        }
+
+      /* We're going to do second expansion so initialize file variables for
+         the file. Since the stem for static pattern rules comes from
+         individual dep lines, we will temporarily set f->stem to d->stem.  */
+      if (!initialized)
+        {
+          initialize_file_variables (f, 0);
+          initialized = 1;
+        }
+
+      if (d->stem != 0)
+        f->stem = d->stem;
+
+      set_file_variables (f);
+
+      p = variable_expand_for_file (d->name, f);
+
+      if (d->stem != 0)
+        f->stem = file_stem;
+
+      /* At this point we don't need the name anymore: free it.  */
+      free (name);
+
+      /* Parse the prerequisites and enter them into the file database.  */
+      new = enter_prereqs (split_prereqs (p), d->stem);
+
+      /* If there were no prereqs here (blank!) then throw this one out.  */
+      if (new == 0)
+        {
+          *dp = d->next;
+          free_dep (d);
+          d = *dp;
+          continue;
+        }
+
+      /* Add newly parsed prerequisites.  */
+      next = d->next;
+      *dp = new;
+      for (dp = &new->next, d = new->next; d != 0; dp = &d->next, d = d->next)
+        ;
+      *dp = next;
+      d = *dp;
+    }
+}
+
+/* Add extra prereqs to the file in question.  */
+
+struct dep *
+expand_extra_prereqs (const struct variable *extra)
+{
+  struct dep *d;
+  struct dep *prereqs = extra ? split_prereqs (variable_expand (extra->value)) : NULL;
+
+  for (d = prereqs; d; d = d->next)
+    {
+      d->file = lookup_file (d->name);
+      if (!d->file)
+        d->file = enter_file (d->name);
+      d->name = NULL;
+      d->ignore_automatic_vars = 1;
+    }
+
+  return prereqs;
+}
+
+/* Perform per-file snap operations. */
+
+static void
+snap_file (const void *item, void *arg)
+{
+  struct file *f = (struct file*)item;
+  struct dep *prereqs = NULL;
+
+  /* If we're not doing second expansion then reset updating.  */
+  if (!second_expansion)
+    f->updating = 0;
+
+  /* If .SECONDARY is set with no deps, mark all targets as intermediate.  */
+  if (all_secondary)
+    f->intermediate = 1;
+
+  /* If .EXTRA_PREREQS is set, add them as ignored by automatic variables.  */
+  if (f->variables)
+    prereqs = expand_extra_prereqs (lookup_variable_in_set (STRING_SIZE_TUPLE(".EXTRA_PREREQS"), f->variables->set));
+
+  else if (f->is_target)
+    prereqs = copy_dep_chain (arg);
+
+  if (prereqs)
+    {
+      struct dep *d;
+      for (d = prereqs; d; d = d->next)
+        if (streq (f->name, dep_name (d)))
+          /* Skip circular dependencies.  */
+          break;
+
+      if (d)
+        /* We broke early: must have found a circular dependency.  */
+        free_dep_chain (prereqs);
+      else if (!f->deps)
+        f->deps = prereqs;
+      else
+        {
+          d = f->deps;
+          while (d->next)
+            d = d->next;
+          d->next = prereqs;
+        }
+    }
+}
+
+/* For each dependency of each file, make the 'struct dep' point
+   at the appropriate 'struct file' (which may have to be created).
+
+   Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT,
+   and various other special targets.  */
+
+void
+snap_deps (void)
+{
+  struct file *f;
+  struct file *f2;
+  struct dep *d;
+
+  /* Remember that we've done this.  Once we start snapping deps we can no
+     longer define new targets.  */
+  snapped_deps = 1;
+
+  /* Perform second expansion and enter each dependency name as a file.  We
+     must use hash_dump() here because within these loops we likely add new
+     files to the table, possibly causing an in-situ table expansion.
+
+     We only need to do this if second_expansion has been defined; if it
+     hasn't then all deps were expanded as the makefile was read in.  If we
+     ever change make to be able to unset .SECONDARY_EXPANSION this will have
+     to change.  */
+
+  if (second_expansion)
+    {
+      struct file **file_slot_0 = (struct file **) hash_dump (&files, 0, 0);
+      struct file **file_end = file_slot_0 + files.ht_fill;
+      struct file **file_slot;
+      const char *suffixes;
+
+      /* Expand .SUFFIXES: its prerequisites are used for $$* calc.  */
+      f = lookup_file (".SUFFIXES");
+      suffixes = f ? f->name : 0;
+      for (; f != 0; f = f->prev)
+        expand_deps (f);
+
+      /* For every target that's not .SUFFIXES, expand its prerequisites.  */
+
+      for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
+        for (f = *file_slot; f != 0; f = f->prev)
+          if (f->name != suffixes)
+            expand_deps (f);
+      free (file_slot_0);
+    }
+
+  /* Now manage all the special targets.  */
+
+  for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev)
+    for (d = f->deps; d != 0; d = d->next)
+      for (f2 = d->file; f2 != 0; f2 = f2->prev)
+        f2->precious = 1;
+
+  for (f = lookup_file (".LOW_RESOLUTION_TIME"); f != 0; f = f->prev)
+    for (d = f->deps; d != 0; d = d->next)
+      for (f2 = d->file; f2 != 0; f2 = f2->prev)
+        f2->low_resolution_time = 1;
+
+  for (f = lookup_file (".PHONY"); f != 0; f = f->prev)
+    for (d = f->deps; d != 0; d = d->next)
+      for (f2 = d->file; f2 != 0; f2 = f2->prev)
+        {
+          /* Mark this file as phony nonexistent target.  */
+          f2->phony = 1;
+          f2->is_target = 1;
+          f2->last_mtime = NONEXISTENT_MTIME;
+          f2->mtime_before_update = NONEXISTENT_MTIME;
+        }
+
+  for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev)
+    /* Mark .INTERMEDIATE deps as intermediate files.  */
+    for (d = f->deps; d != 0; d = d->next)
+      for (f2 = d->file; f2 != 0; f2 = f2->prev)
+        f2->intermediate = 1;
+    /* .INTERMEDIATE with no deps does nothing.
+       Marking all files as intermediates is useless since the goal targets
+       would be deleted after they are built.  */
+
+  for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev)
+    /* Mark .SECONDARY deps as both intermediate and secondary.  */
+    if (f->deps)
+      for (d = f->deps; d != 0; d = d->next)
+        for (f2 = d->file; f2 != 0; f2 = f2->prev)
+          f2->intermediate = f2->secondary = 1;
+    /* .SECONDARY with no deps listed marks *all* files that way.  */
+    else
+      all_secondary = 1;
+
+  f = lookup_file (".EXPORT_ALL_VARIABLES");
+  if (f != 0 && f->is_target)
+    export_all_variables = 1;
+
+  f = lookup_file (".IGNORE");
+  if (f != 0 && f->is_target)
+    {
+      if (f->deps == 0)
+        ignore_errors_flag = 1;
+      else
+        for (d = f->deps; d != 0; d = d->next)
+          for (f2 = d->file; f2 != 0; f2 = f2->prev)
+            f2->command_flags |= COMMANDS_NOERROR;
+    }
+
+  f = lookup_file (".SILENT");
+  if (f != 0 && f->is_target)
+    {
+      if (f->deps == 0)
+        run_silent = 1;
+      else
+        for (d = f->deps; d != 0; d = d->next)
+          for (f2 = d->file; f2 != 0; f2 = f2->prev)
+            f2->command_flags |= COMMANDS_SILENT;
+    }
+
+  f = lookup_file (".NOTPARALLEL");
+  if (f != 0 && f->is_target)
+    not_parallel = 1;
+
+  {
+    struct dep *prereqs = expand_extra_prereqs (lookup_variable (STRING_SIZE_TUPLE(".EXTRA_PREREQS")));
+
+    /* Perform per-file snap operations.  */
+    hash_map_arg(&files, snap_file, prereqs);
+
+    free_dep_chain (prereqs);
+  }
+
+#ifndef NO_MINUS_C_MINUS_O
+  /* If .POSIX was defined, remove OUTPUT_OPTION to comply.  */
+  /* This needs more work: what if the user sets this in the makefile?
+  if (posix_pedantic)
+    define_variable_cname ("OUTPUT_OPTION", "", o_default, 1);
+  */
+#endif
+}
+\f
+/* Set the 'command_state' member of FILE and all its 'also_make's.
+   Don't decrease the state of also_make's (e.g., don't downgrade a 'running'
+   also_make to a 'deps_running' also_make).  */
+
+void
+set_command_state (struct file *file, enum cmd_state state)
+{
+  struct dep *d;
+
+  file->command_state = state;
+
+  for (d = file->also_make; d != 0; d = d->next)
+    if (state > d->file->command_state)
+      d->file->command_state = state;
+}
+\f
+/* Convert an external file timestamp to internal form.  */
+
+FILE_TIMESTAMP
+file_timestamp_cons (const char *fname, time_t stamp, long int ns)
+{
+  int offset = ORDINARY_MTIME_MIN + (FILE_TIMESTAMP_HI_RES ? ns : 0);
+  FILE_TIMESTAMP s = stamp;
+  FILE_TIMESTAMP product = (FILE_TIMESTAMP) s << FILE_TIMESTAMP_LO_BITS;
+  FILE_TIMESTAMP ts = product + offset;
+
+  if (! (s <= FILE_TIMESTAMP_S (ORDINARY_MTIME_MAX)
+         && product <= ts && ts <= ORDINARY_MTIME_MAX))
+    {
+      char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
+      const char *f = fname ? fname : _("Current time");
+      ts = s <= OLD_MTIME ? ORDINARY_MTIME_MIN : ORDINARY_MTIME_MAX;
+      file_timestamp_sprintf (buf, ts);
+      OSS (error, NILF,
+           _("%s: Timestamp out of range; substituting %s"), f, buf);
+    }
+
+  return ts;
+}
+\f
+/* Return the current time as a file timestamp, setting *RESOLUTION to
+   its resolution.  */
+FILE_TIMESTAMP
+file_timestamp_now (int *resolution)
+{
+  int r;
+  time_t s;
+  int ns;
+
+  /* Don't bother with high-resolution clocks if file timestamps have
+     only one-second resolution.  The code below should work, but it's
+     not worth the hassle of debugging it on hosts where it fails.  */
+#if FILE_TIMESTAMP_HI_RES
+# if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME
+  {
+    struct timespec timespec;
+    if (clock_gettime (CLOCK_REALTIME, &timespec) == 0)
+      {
+        r = 1;
+        s = timespec.tv_sec;
+        ns = timespec.tv_nsec;
+        goto got_time;
+      }
+  }
+# endif
+# if HAVE_GETTIMEOFDAY
+  {
+    struct timeval timeval;
+    if (gettimeofday (&timeval, 0) == 0)
+      {
+        r = 1000;
+        s = timeval.tv_sec;
+        ns = timeval.tv_usec * 1000;
+        goto got_time;
+      }
+  }
+# endif
+#endif
+
+  r = 1000000000;
+  s = time ((time_t *) 0);
+  ns = 0;
+
+#if FILE_TIMESTAMP_HI_RES
+ got_time:
+#endif
+  *resolution = r;
+  return file_timestamp_cons (0, s, ns);
+}
+
+/* Place into the buffer P a printable representation of the file
+   timestamp TS.  */
+void
+file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts)
+{
+  time_t t = FILE_TIMESTAMP_S (ts);
+  struct tm *tm = localtime (&t);
+
+  if (tm)
+    sprintf (p, "%04d-%02d-%02d %02d:%02d:%02d",
+             tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
+             tm->tm_hour, tm->tm_min, tm->tm_sec);
+  else if (t < 0)
+    sprintf (p, "%ld", (long) t);
+  else
+    sprintf (p, "%lu", (unsigned long) t);
+  p += strlen (p);
+
+  /* Append nanoseconds as a fraction, but remove trailing zeros.  We don't
+     know the actual timestamp resolution, since clock_getres applies only to
+     local times, whereas this timestamp might come from a remote filesystem.
+     So removing trailing zeros is the best guess that we can do.  */
+  sprintf (p, ".%09d", FILE_TIMESTAMP_NS (ts));
+  p += strlen (p) - 1;
+  while (*p == '0')
+    p--;
+  p += *p != '.';
+
+  *p = '\0';
+}
+\f
+/* Print the data base of files.  */
+
+void
+print_prereqs (const struct dep *deps)
+{
+  const struct dep *ood = 0;
+
+  /* Print all normal dependencies; note any order-only deps.  */
+  for (; deps != 0; deps = deps->next)
+    if (! deps->ignore_mtime)
+      printf (" %s", dep_name (deps));
+    else if (! ood)
+      ood = deps;
+
+  /* Print order-only deps, if we have any.  */
+  if (ood)
+    {
+      printf (" | %s", dep_name (ood));
+      for (ood = ood->next; ood != 0; ood = ood->next)
+        if (ood->ignore_mtime)
+          printf (" %s", dep_name (ood));
+    }
+
+  putchar ('\n');
+}
+
+static void
+print_file (const void *item)
+{
+  const struct file *f = item;
+
+  /* If we're not using builtin targets, don't show them.
+
+     Ideally we'd be able to delete them altogether but currently there's no
+     facility to ever delete a file once it's been added.  */
+  if (no_builtin_rules_flag && f->builtin)
+    return;
+
+  putchar ('\n');
+
+  if (f->cmds && f->cmds->recipe_prefix != cmd_prefix)
+    {
+      fputs (".RECIPEPREFIX = ", stdout);
+      cmd_prefix = f->cmds->recipe_prefix;
+      if (cmd_prefix != RECIPEPREFIX_DEFAULT)
+        putchar (cmd_prefix);
+      putchar ('\n');
+    }
+
+  if (f->variables != 0)
+    print_target_variables (f);
+
+  if (!f->is_target)
+    puts (_("# Not a target:"));
+  printf ("%s:%s", f->name, f->double_colon ? ":" : "");
+  print_prereqs (f->deps);
+
+  if (f->precious)
+    puts (_("#  Precious file (prerequisite of .PRECIOUS)."));
+  if (f->phony)
+    puts (_("#  Phony target (prerequisite of .PHONY)."));
+  if (f->cmd_target)
+    puts (_("#  Command line target."));
+  if (f->dontcare)
+    puts (_("#  A default, MAKEFILES, or -include/sinclude makefile."));
+  if (f->builtin)
+    puts (_("#  Builtin rule"));
+  puts (f->tried_implicit
+        ? _("#  Implicit rule search has been done.")
+        : _("#  Implicit rule search has not been done."));
+  if (f->stem != 0)
+    printf (_("#  Implicit/static pattern stem: '%s'\n"), f->stem);
+  if (f->intermediate)
+    puts (_("#  File is an intermediate prerequisite."));
+  if (f->also_make != 0)
+    {
+      const struct dep *d;
+      fputs (_("#  Also makes:"), stdout);
+      for (d = f->also_make; d != 0; d = d->next)
+        printf (" %s", dep_name (d));
+      putchar ('\n');
+    }
+  if (f->last_mtime == UNKNOWN_MTIME)
+    puts (_("#  Modification time never checked."));
+  else if (f->last_mtime == NONEXISTENT_MTIME)
+    puts (_("#  File does not exist."));
+  else if (f->last_mtime == OLD_MTIME)
+    puts (_("#  File is very old."));
+  else
+    {
+      char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
+      file_timestamp_sprintf (buf, f->last_mtime);
+      printf (_("#  Last modified %s\n"), buf);
+    }
+  puts (f->updated
+        ? _("#  File has been updated.") : _("#  File has not been updated."));
+  switch (f->command_state)
+    {
+    case cs_running:
+      puts (_("#  Recipe currently running (THIS IS A BUG)."));
+      break;
+    case cs_deps_running:
+      puts (_("#  Dependencies recipe running (THIS IS A BUG)."));
+      break;
+    case cs_not_started:
+    case cs_finished:
+      switch (f->update_status)
+        {
+        case us_none:
+          break;
+        case us_success:
+          puts (_("#  Successfully updated."));
+          break;
+        case us_question:
+          assert (question_flag);
+          puts (_("#  Needs to be updated (-q is set)."));
+          break;
+        case us_failed:
+          puts (_("#  Failed to be updated."));
+          break;
+        }
+      break;
+    default:
+      puts (_("#  Invalid value in 'command_state' member!"));
+      fflush (stdout);
+      fflush (stderr);
+      abort ();
+    }
+
+  if (f->variables != 0)
+    print_file_variables (f);
+
+  if (f->cmds != 0)
+    print_commands (f->cmds);
+
+  if (f->prev)
+    print_file ((const void *) f->prev);
+}
+
+void
+print_file_data_base (void)
+{
+  puts (_("\n# Files"));
+
+  hash_map (&files, print_file);
+
+  fputs (_("\n# files hash-table stats:\n# "), stdout);
+  hash_print_stats (&files, stdout);
+}
+\f
+/* Verify the integrity of the data base of files.  */
+
+#define VERIFY_CACHED(_p,_n) \
+    do{                                                                       \
+        if (_p->_n && _p->_n[0] && !strcache_iscached (_p->_n))               \
+          error (NULL, strlen (_p->name) + CSTRLEN (# _n) + strlen (_p->_n),  \
+                 _("%s: Field '%s' not cached: %s"), _p->name, # _n, _p->_n); \
+    }while(0)
+
+static void
+verify_file (const void *item)
+{
+  const struct file *f = item;
+  const struct dep *d;
+
+  VERIFY_CACHED (f, name);
+  VERIFY_CACHED (f, hname);
+  VERIFY_CACHED (f, vpath);
+  VERIFY_CACHED (f, stem);
+
+  /* Check the deps.  */
+  for (d = f->deps; d != 0; d = d->next)
+    {
+      if (! d->need_2nd_expansion)
+        VERIFY_CACHED (d, name);
+      VERIFY_CACHED (d, stem);
+    }
+}
+
+void
+verify_file_data_base (void)
+{
+  hash_map (&files, verify_file);
+}
+
+#define EXPANSION_INCREMENT(_l)  ((((_l) / 500) + 1) * 500)
+
+char *
+build_target_list (char *value)
+{
+  static unsigned long last_targ_count = 0;
+
+  if (files.ht_fill != last_targ_count)
+    {
+      size_t max = EXPANSION_INCREMENT (strlen (value));
+      size_t len;
+      char *p;
+      struct file **fp = (struct file **) files.ht_vec;
+      struct file **end = &fp[files.ht_size];
+
+      /* Make sure we have at least MAX bytes in the allocated buffer.  */
+      value = xrealloc (value, max);
+
+      p = value;
+      len = 0;
+      for (; fp < end; ++fp)
+        if (!HASH_VACANT (*fp) && (*fp)->is_target)
+          {
+            struct file *f = *fp;
+            size_t l = strlen (f->name);
+
+            len += l + 1;
+            if (len > max)
+              {
+                size_t off = p - value;
+
+                max += EXPANSION_INCREMENT (l + 1);
+                value = xrealloc (value, max);
+                p = &value[off];
+              }
+
+            memcpy (p, f->name, l);
+            p += l;
+            *(p++) = ' ';
+          }
+      *(p-1) = '\0';
+
+      last_targ_count = files.ht_fill;
+    }
+
+  return value;
+}
+
+void
+init_hash_files (void)
+{
+  hash_init (&files, 1000, file_hash_1, file_hash_2, file_hash_cmp);
+}
+
+/* EOF */
diff --git a/src/filedef.h b/src/filedef.h
new file mode 100644 (file)
index 0000000..972f853
--- /dev/null
@@ -0,0 +1,218 @@
+/* Definition of target file data structures for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Structure that represents the info on one file
+   that the makefile says how to make.
+   All of these are chained together through 'next'.  */
+
+#include "hash.h"
+
+struct commands;
+struct dep;
+struct variable;
+struct variable_set_list;
+
+struct file
+  {
+    const char *name;
+    const char *hname;          /* Hashed filename */
+    const char *vpath;          /* VPATH/vpath pathname */
+    struct dep *deps;           /* all dependencies, including duplicates */
+    struct commands *cmds;      /* Commands to execute for this target.  */
+    const char *stem;           /* Implicit stem, if an implicit
+                                   rule has been used */
+    struct dep *also_make;      /* Targets that are made by making this.  */
+    struct file *prev;          /* Previous entry for same file name;
+                                   used when there are multiple double-colon
+                                   entries for the same file.  */
+    struct file *last;          /* Last entry for the same file name.  */
+
+    /* File that this file was renamed to.  After any time that a
+       file could be renamed, call 'check_renamed' (below).  */
+    struct file *renamed;
+
+    /* List of variable sets used for this file.  */
+    struct variable_set_list *variables;
+
+    /* Pattern-specific variable reference for this target, or null if there
+       isn't one.  Also see the pat_searched flag, below.  */
+    struct variable_set_list *pat_variables;
+
+    /* Immediate dependent that caused this target to be remade,
+       or nil if there isn't one.  */
+    struct file *parent;
+
+    /* For a double-colon entry, this is the first double-colon entry for
+       the same file.  Otherwise this is null.  */
+    struct file *double_colon;
+
+    FILE_TIMESTAMP last_mtime;  /* File's modtime, if already known.  */
+    FILE_TIMESTAMP mtime_before_update; /* File's modtime before any updating
+                                           has been performed.  */
+    unsigned int considered;    /* equal to 'considered' if file has been
+                                   considered on current scan of goal chain */
+    int command_flags;          /* Flags OR'd in for cmds; see commands.h.  */
+    enum update_status          /* Status of the last attempt to update.  */
+      {
+        us_success = 0,         /* Successfully updated.  Must be 0!  */
+        us_none,                /* No attempt to update has been made.  */
+        us_question,            /* Needs to be updated (-q is is set).  */
+        us_failed               /* Update failed.  */
+      } update_status ENUM_BITFIELD (2);
+    enum cmd_state              /* State of commands.  ORDER IS IMPORTANT!  */
+      {
+        cs_not_started = 0,     /* Not yet started.  Must be 0!  */
+        cs_deps_running,        /* Dep commands running.  */
+        cs_running,             /* Commands running.  */
+        cs_finished             /* Commands finished.  */
+      } command_state ENUM_BITFIELD (2);
+
+    unsigned int builtin:1;     /* True if the file is a builtin rule. */
+    unsigned int precious:1;    /* Non-0 means don't delete file on quit */
+    unsigned int loaded:1;      /* True if the file is a loaded object. */
+    unsigned int low_resolution_time:1; /* Nonzero if this file's time stamp
+                                           has only one-second resolution.  */
+    unsigned int tried_implicit:1; /* Nonzero if have searched
+                                      for implicit rule for making
+                                      this file; don't search again.  */
+    unsigned int updating:1;    /* Nonzero while updating deps of this file */
+    unsigned int updated:1;     /* Nonzero if this file has been remade.  */
+    unsigned int is_target:1;   /* Nonzero if file is described as target.  */
+    unsigned int cmd_target:1;  /* Nonzero if file was given on cmd line.  */
+    unsigned int phony:1;       /* Nonzero if this is a phony file
+                                   i.e., a prerequisite of .PHONY.  */
+    unsigned int intermediate:1;/* Nonzero if this is an intermediate file.  */
+    unsigned int secondary:1;   /* Nonzero means remove_intermediates should
+                                   not delete it.  */
+    unsigned int dontcare:1;    /* Nonzero if no complaint is to be made if
+                                   this target cannot be remade.  */
+    unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name.  */
+    unsigned int pat_searched:1;/* Nonzero if we already searched for
+                                   pattern-specific variables.  */
+    unsigned int no_diag:1;     /* True if the file failed to update and no
+                                   diagnostics has been issued (dontcare). */
+  };
+
+
+extern struct file *default_file;
+
+
+struct file *lookup_file (const char *name);
+struct file *enter_file (const char *name);
+struct dep *split_prereqs (char *prereqstr);
+struct dep *enter_prereqs (struct dep *prereqs, const char *stem);
+struct dep *expand_extra_prereqs (const struct variable *extra);
+void remove_intermediates (int sig);
+void snap_deps (void);
+void rename_file (struct file *file, const char *name);
+void rehash_file (struct file *file, const char *name);
+void set_command_state (struct file *file, enum cmd_state state);
+void notice_finished_file (struct file *file);
+void init_hash_files (void);
+void verify_file_data_base (void);
+char *build_target_list (char *old_list);
+void print_prereqs (const struct dep *deps);
+void print_file_data_base (void);
+int try_implicit_rule (struct file *file, unsigned int depth);
+int stemlen_compare (const void *v1, const void *v2);
+
+#if FILE_TIMESTAMP_HI_RES
+# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
+    file_timestamp_cons (fname, (st).st_mtime, (st).ST_MTIM_NSEC)
+#else
+# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
+    file_timestamp_cons (fname, (st).st_mtime, 0)
+#endif
+
+/* If FILE_TIMESTAMP is 64 bits (or more), use nanosecond resolution.
+   (Multiply by 2**30 instead of by 10**9 to save time at the cost of
+   slightly decreasing the number of available timestamps.)  With
+   64-bit FILE_TIMESTAMP, this stops working on 2514-05-30 01:53:04
+   UTC, but by then uintmax_t should be larger than 64 bits.  */
+#define FILE_TIMESTAMPS_PER_S (FILE_TIMESTAMP_HI_RES ? 1000000000 : 1)
+#define FILE_TIMESTAMP_LO_BITS (FILE_TIMESTAMP_HI_RES ? 30 : 0)
+
+#define FILE_TIMESTAMP_S(ts) (((ts) - ORDINARY_MTIME_MIN) \
+                              >> FILE_TIMESTAMP_LO_BITS)
+#define FILE_TIMESTAMP_NS(ts) ((int) (((ts) - ORDINARY_MTIME_MIN) \
+                                      & ((1 << FILE_TIMESTAMP_LO_BITS) - 1)))
+
+/* Upper bound on length of string "YYYY-MM-DD HH:MM:SS.NNNNNNNNN"
+   representing a file timestamp.  The upper bound is not necessarily 29,
+   since the year might be less than -999 or greater than 9999.
+
+   Subtract one for the sign bit if in case file timestamps can be negative;
+   subtract FLOOR_LOG2_SECONDS_PER_YEAR to yield an upper bound on how many
+   file timestamp bits might affect the year;
+   302 / 1000 is log10 (2) rounded up;
+   add one for integer division truncation;
+   add one more for a minus sign if file timestamps can be negative;
+   add 4 to allow for any 4-digit epoch year (e.g. 1970);
+   add 25 to allow for "-MM-DD HH:MM:SS.NNNNNNNNN".  */
+#define FLOOR_LOG2_SECONDS_PER_YEAR 24
+#define FILE_TIMESTAMP_PRINT_LEN_BOUND \
+  (((sizeof (FILE_TIMESTAMP) * CHAR_BIT - 1 - FLOOR_LOG2_SECONDS_PER_YEAR) \
+    * 302 / 1000) \
+   + 1 + 1 + 4 + 25)
+
+FILE_TIMESTAMP file_timestamp_cons (char const *, time_t, long int);
+FILE_TIMESTAMP file_timestamp_now (int *);
+void file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts);
+
+/* Return the mtime of file F (a struct file *), caching it.
+   The value is NONEXISTENT_MTIME if the file does not exist.  */
+#define file_mtime(f) file_mtime_1 ((f), 1)
+/* Return the mtime of file F (a struct file *), caching it.
+   Don't search using vpath for the file--if it doesn't actually exist,
+   we don't find it.
+   The value is NONEXISTENT_MTIME if the file does not exist.  */
+#define file_mtime_no_search(f) file_mtime_1 ((f), 0)
+FILE_TIMESTAMP f_mtime (struct file *file, int search);
+#define file_mtime_1(f, v) \
+  ((f)->last_mtime == UNKNOWN_MTIME ? f_mtime ((f), v) : (f)->last_mtime)
+
+/* Special timestamp values.  */
+
+/* The file's timestamp is not yet known.  */
+#define UNKNOWN_MTIME 0
+
+/* The file does not exist.  */
+#define NONEXISTENT_MTIME 1
+
+/* The file does not exist, and we assume that it is older than any
+   actual file.  */
+#define OLD_MTIME 2
+
+/* The smallest and largest ordinary timestamps.  */
+#define ORDINARY_MTIME_MIN (OLD_MTIME + 1)
+#define ORDINARY_MTIME_MAX ((FILE_TIMESTAMP_S (NEW_MTIME) \
+                             << FILE_TIMESTAMP_LO_BITS) \
+                            + ORDINARY_MTIME_MIN + FILE_TIMESTAMPS_PER_S - 1)
+
+/* Modtime value to use for 'infinitely new'.  We used to get the current time
+   from the system and use that whenever we wanted 'new'.  But that causes
+   trouble when the machine running make and the machine holding a file have
+   different ideas about what time it is; and can also lose for 'force'
+   targets, which need to be considered newer than anything that depends on
+   them, even if said dependents' modtimes are in the future.  */
+#define NEW_MTIME INTEGER_TYPE_MAXIMUM (FILE_TIMESTAMP)
+
+#define check_renamed(file) \
+  while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here.  */
+
+/* Have we snapped deps yet?  */
+extern int snapped_deps;
diff --git a/src/function.c b/src/function.c
new file mode 100644 (file)
index 0000000..0917e0c
--- /dev/null
@@ -0,0 +1,2699 @@
+/* Builtin function expansion for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "variable.h"
+#include "dep.h"
+#include "job.h"
+#include "os.h"
+#include "commands.h"
+#include "debug.h"
+
+#ifdef _AMIGA
+#include "amiga.h"
+#endif
+
+
+struct function_table_entry
+  {
+    union {
+      char *(*func_ptr) (char *output, char **argv, const char *fname);
+      gmk_func_ptr alloc_func_ptr;
+    } fptr;
+    const char *name;
+    unsigned char len;
+    unsigned char minimum_args;
+    unsigned char maximum_args;
+    unsigned int expand_args:1;
+    unsigned int alloc_fn:1;
+  };
+
+static unsigned long
+function_table_entry_hash_1 (const void *keyv)
+{
+  const struct function_table_entry *key = keyv;
+  return_STRING_N_HASH_1 (key->name, key->len);
+}
+
+static unsigned long
+function_table_entry_hash_2 (const void *keyv)
+{
+  const struct function_table_entry *key = keyv;
+  return_STRING_N_HASH_2 (key->name, key->len);
+}
+
+static int
+function_table_entry_hash_cmp (const void *xv, const void *yv)
+{
+  const struct function_table_entry *x = xv;
+  const struct function_table_entry *y = yv;
+  int result = x->len - y->len;
+  if (result)
+    return result;
+  return_STRING_N_COMPARE (x->name, y->name, x->len);
+}
+
+static struct hash_table function_table;
+\f
+
+/* Store into VARIABLE_BUFFER at O the result of scanning TEXT and replacing
+   each occurrence of SUBST with REPLACE. TEXT is null-terminated.  SLEN is
+   the length of SUBST and RLEN is the length of REPLACE.  If BY_WORD is
+   nonzero, substitutions are done only on matches which are complete
+   whitespace-delimited words.  */
+
+char *
+subst_expand (char *o, const char *text, const char *subst, const char *replace,
+              size_t slen, size_t rlen, int by_word)
+{
+  const char *t = text;
+  const char *p;
+
+  if (slen == 0 && !by_word)
+    {
+      /* The first occurrence of "" in any string is its end.  */
+      o = variable_buffer_output (o, t, strlen (t));
+      if (rlen > 0)
+        o = variable_buffer_output (o, replace, rlen);
+      return o;
+    }
+
+  do
+    {
+      if (by_word && slen == 0)
+        /* When matching by words, the empty string should match
+           the end of each word, rather than the end of the whole text.  */
+        p = end_of_token (next_token (t));
+      else
+        {
+          p = strstr (t, subst);
+          if (p == 0)
+            {
+              /* No more matches.  Output everything left on the end.  */
+              o = variable_buffer_output (o, t, strlen (t));
+              return o;
+            }
+        }
+
+      /* Output everything before this occurrence of the string to replace.  */
+      if (p > t)
+        o = variable_buffer_output (o, t, p - t);
+
+      /* If we're substituting only by fully matched words,
+         or only at the ends of words, check that this case qualifies.  */
+      if (by_word
+          && ((p > text && !ISSPACE (p[-1]))
+              || ! STOP_SET (p[slen], MAP_SPACE|MAP_NUL)))
+        /* Struck out.  Output the rest of the string that is
+           no longer to be replaced.  */
+        o = variable_buffer_output (o, subst, slen);
+      else if (rlen > 0)
+        /* Output the replacement string.  */
+        o = variable_buffer_output (o, replace, rlen);
+
+      /* Advance T past the string to be replaced.  */
+      t = p + slen;
+    } while (*t != '\0');
+
+  return o;
+}
+\f
+
+/* Store into VARIABLE_BUFFER at O the result of scanning TEXT
+   and replacing strings matching PATTERN with REPLACE.
+   If PATTERN_PERCENT is not nil, PATTERN has already been
+   run through find_percent, and PATTERN_PERCENT is the result.
+   If REPLACE_PERCENT is not nil, REPLACE has already been
+   run through find_percent, and REPLACE_PERCENT is the result.
+   Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
+   character _AFTER_ the %, not to the % itself.
+*/
+
+char *
+patsubst_expand_pat (char *o, const char *text,
+                     const char *pattern, const char *replace,
+                     const char *pattern_percent, const char *replace_percent)
+{
+  size_t pattern_prepercent_len, pattern_postpercent_len;
+  size_t replace_prepercent_len, replace_postpercent_len;
+  const char *t;
+  size_t len;
+  int doneany = 0;
+
+  /* Record the length of REPLACE before and after the % so we don't have to
+     compute these lengths more than once.  */
+  if (replace_percent)
+    {
+      replace_prepercent_len = replace_percent - replace - 1;
+      replace_postpercent_len = strlen (replace_percent);
+    }
+  else
+    {
+      replace_prepercent_len = strlen (replace);
+      replace_postpercent_len = 0;
+    }
+
+  if (!pattern_percent)
+    /* With no % in the pattern, this is just a simple substitution.  */
+    return subst_expand (o, text, pattern, replace,
+                         strlen (pattern), strlen (replace), 1);
+
+  /* Record the length of PATTERN before and after the %
+     so we don't have to compute it more than once.  */
+  pattern_prepercent_len = pattern_percent - pattern - 1;
+  pattern_postpercent_len = strlen (pattern_percent);
+
+  while ((t = find_next_token (&text, &len)) != 0)
+    {
+      int fail = 0;
+
+      /* Is it big enough to match?  */
+      if (len < pattern_prepercent_len + pattern_postpercent_len)
+        fail = 1;
+
+      /* Does the prefix match? */
+      if (!fail && pattern_prepercent_len > 0
+          && (*t != *pattern
+              || t[pattern_prepercent_len - 1] != pattern_percent[-2]
+              || !strneq (t + 1, pattern + 1, pattern_prepercent_len - 1)))
+        fail = 1;
+
+      /* Does the suffix match? */
+      if (!fail && pattern_postpercent_len > 0
+          && (t[len - 1] != pattern_percent[pattern_postpercent_len - 1]
+              || t[len - pattern_postpercent_len] != *pattern_percent
+              || !strneq (&t[len - pattern_postpercent_len],
+                          pattern_percent, pattern_postpercent_len - 1)))
+        fail = 1;
+
+      if (fail)
+        /* It didn't match.  Output the string.  */
+        o = variable_buffer_output (o, t, len);
+      else
+        {
+          /* It matched.  Output the replacement.  */
+
+          /* Output the part of the replacement before the %.  */
+          o = variable_buffer_output (o, replace, replace_prepercent_len);
+
+          if (replace_percent != 0)
+            {
+              /* Output the part of the matched string that
+                 matched the % in the pattern.  */
+              o = variable_buffer_output (o, t + pattern_prepercent_len,
+                                          len - (pattern_prepercent_len
+                                                 + pattern_postpercent_len));
+              /* Output the part of the replacement after the %.  */
+              o = variable_buffer_output (o, replace_percent,
+                                          replace_postpercent_len);
+            }
+        }
+
+      /* Output a space, but not if the replacement is "".  */
+      if (fail || replace_prepercent_len > 0
+          || (replace_percent != 0 && len + replace_postpercent_len > 0))
+        {
+          o = variable_buffer_output (o, " ", 1);
+          doneany = 1;
+        }
+    }
+  if (doneany)
+    /* Kill the last space.  */
+    --o;
+
+  return o;
+}
+
+/* Store into VARIABLE_BUFFER at O the result of scanning TEXT
+   and replacing strings matching PATTERN with REPLACE.
+   If PATTERN_PERCENT is not nil, PATTERN has already been
+   run through find_percent, and PATTERN_PERCENT is the result.
+   If REPLACE_PERCENT is not nil, REPLACE has already been
+   run through find_percent, and REPLACE_PERCENT is the result.
+   Note that we expect PATTERN_PERCENT and REPLACE_PERCENT to point to the
+   character _AFTER_ the %, not to the % itself.
+*/
+
+char *
+patsubst_expand (char *o, const char *text, char *pattern, char *replace)
+{
+  const char *pattern_percent = find_percent (pattern);
+  const char *replace_percent = find_percent (replace);
+
+  /* If there's a percent in the pattern or replacement skip it.  */
+  if (replace_percent)
+    ++replace_percent;
+  if (pattern_percent)
+    ++pattern_percent;
+
+  return patsubst_expand_pat (o, text, pattern, replace,
+                              pattern_percent, replace_percent);
+}
+\f
+
+/* Look up a function by name.  */
+
+static const struct function_table_entry *
+lookup_function (const char *s)
+{
+  struct function_table_entry function_table_entry_key;
+  const char *e = s;
+
+  while (STOP_SET (*e, MAP_USERFUNC))
+    e++;
+
+  if (e == s || !STOP_SET(*e, MAP_NUL|MAP_SPACE))
+    return NULL;
+
+  function_table_entry_key.name = s;
+  function_table_entry_key.len = (unsigned char) (e - s);
+
+  return hash_find_item (&function_table, &function_table_entry_key);
+}
+\f
+
+/* Return 1 if PATTERN matches STR, 0 if not.  */
+
+int
+pattern_matches (const char *pattern, const char *percent, const char *str)
+{
+  size_t sfxlen, strlength;
+
+  if (percent == 0)
+    {
+      size_t len = strlen (pattern) + 1;
+      char *new_chars = alloca (len);
+      memcpy (new_chars, pattern, len);
+      percent = find_percent (new_chars);
+      if (percent == 0)
+        return streq (new_chars, str);
+      pattern = new_chars;
+    }
+
+  sfxlen = strlen (percent + 1);
+  strlength = strlen (str);
+
+  if (strlength < (percent - pattern) + sfxlen
+      || !strneq (pattern, str, percent - pattern))
+    return 0;
+
+  return !strcmp (percent + 1, str + (strlength - sfxlen));
+}
+\f
+
+/* Find the next comma or ENDPAREN (counting nested STARTPAREN and
+   ENDPARENtheses), starting at PTR before END.  Return a pointer to
+   next character.
+
+   If no next argument is found, return NULL.
+*/
+
+static char *
+find_next_argument (char startparen, char endparen,
+                    const char *ptr, const char *end)
+{
+  int count = 0;
+
+  for (; ptr < end; ++ptr)
+    if (!STOP_SET (*ptr, MAP_VARSEP|MAP_COMMA))
+      continue;
+
+    else if (*ptr == startparen)
+      ++count;
+
+    else if (*ptr == endparen)
+      {
+        --count;
+        if (count < 0)
+          return NULL;
+      }
+
+    else if (*ptr == ',' && !count)
+      return (char *)ptr;
+
+  /* We didn't find anything.  */
+  return NULL;
+}
+\f
+
+/* Glob-expand LINE.  The returned pointer is
+   only good until the next call to string_glob.  */
+
+static char *
+string_glob (char *line)
+{
+  static char *result = 0;
+  static size_t length;
+  struct nameseq *chain;
+  size_t idx;
+
+  chain = PARSE_FILE_SEQ (&line, struct nameseq, MAP_NUL, NULL,
+                          /* We do not want parse_file_seq to strip './'s.
+                             That would break examples like:
+                             $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)).  */
+                          PARSEFS_NOSTRIP|PARSEFS_NOCACHE|PARSEFS_EXISTS);
+
+  if (result == 0)
+    {
+      length = 100;
+      result = xmalloc (100);
+    }
+
+  idx = 0;
+  while (chain != 0)
+    {
+      struct nameseq *next = chain->next;
+      size_t len = strlen (chain->name);
+
+      if (idx + len + 1 > length)
+        {
+          length += (len + 1) * 2;
+          result = xrealloc (result, length);
+        }
+      memcpy (&result[idx], chain->name, len);
+      idx += len;
+      result[idx++] = ' ';
+
+      /* Because we used PARSEFS_NOCACHE above, we have to free() NAME.  */
+      free ((char *)chain->name);
+      free (chain);
+      chain = next;
+    }
+
+  /* Kill the last space and terminate the string.  */
+  if (idx == 0)
+    result[0] = '\0';
+  else
+    result[idx - 1] = '\0';
+
+  return result;
+}
+\f
+/*
+  Builtin functions
+ */
+
+static char *
+func_patsubst (char *o, char **argv, const char *funcname UNUSED)
+{
+  o = patsubst_expand (o, argv[2], argv[0], argv[1]);
+  return o;
+}
+
+
+static char *
+func_join (char *o, char **argv, const char *funcname UNUSED)
+{
+  int doneany = 0;
+
+  /* Write each word of the first argument directly followed
+     by the corresponding word of the second argument.
+     If the two arguments have a different number of words,
+     the excess words are just output separated by blanks.  */
+  const char *tp;
+  const char *pp;
+  const char *list1_iterator = argv[0];
+  const char *list2_iterator = argv[1];
+  do
+    {
+      size_t len1, len2;
+
+      tp = find_next_token (&list1_iterator, &len1);
+      if (tp != 0)
+        o = variable_buffer_output (o, tp, len1);
+
+      pp = find_next_token (&list2_iterator, &len2);
+      if (pp != 0)
+        o = variable_buffer_output (o, pp, len2);
+
+      if (tp != 0 || pp != 0)
+        {
+          o = variable_buffer_output (o, " ", 1);
+          doneany = 1;
+        }
+    }
+  while (tp != 0 || pp != 0);
+  if (doneany)
+    /* Kill the last blank.  */
+    --o;
+
+  return o;
+}
+
+
+static char *
+func_origin (char *o, char **argv, const char *funcname UNUSED)
+{
+  /* Expand the argument.  */
+  struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
+  if (v == 0)
+    o = variable_buffer_output (o, "undefined", 9);
+  else
+    switch (v->origin)
+      {
+      default:
+      case o_invalid:
+        abort ();
+        break;
+      case o_default:
+        o = variable_buffer_output (o, "default", 7);
+        break;
+      case o_env:
+        o = variable_buffer_output (o, "environment", 11);
+        break;
+      case o_file:
+        o = variable_buffer_output (o, "file", 4);
+        break;
+      case o_env_override:
+        o = variable_buffer_output (o, "environment override", 20);
+        break;
+      case o_command:
+        o = variable_buffer_output (o, "command line", 12);
+        break;
+      case o_override:
+        o = variable_buffer_output (o, "override", 8);
+        break;
+      case o_automatic:
+        o = variable_buffer_output (o, "automatic", 9);
+        break;
+      }
+
+  return o;
+}
+
+static char *
+func_flavor (char *o, char **argv, const char *funcname UNUSED)
+{
+  struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
+
+  if (v == 0)
+    o = variable_buffer_output (o, "undefined", 9);
+  else
+    if (v->recursive)
+      o = variable_buffer_output (o, "recursive", 9);
+    else
+      o = variable_buffer_output (o, "simple", 6);
+
+  return o;
+}
+
+
+static char *
+func_notdir_suffix (char *o, char **argv, const char *funcname)
+{
+  /* Expand the argument.  */
+  const char *list_iterator = argv[0];
+  const char *p2;
+  int doneany =0;
+  size_t len=0;
+
+  int is_suffix = funcname[0] == 's';
+  int is_notdir = !is_suffix;
+  int stop = MAP_DIRSEP | (is_suffix ? MAP_DOT : 0);
+#ifdef VMS
+  /* For VMS list_iterator points to a comma separated list. To use the common
+     [find_]next_token, create a local copy and replace the commas with
+     spaces. Obviously, there is a problem if there is a ',' in the VMS filename
+     (can only happen on ODS5), the same problem as with spaces in filenames,
+     which seems to be present in make on all platforms. */
+  char *vms_list_iterator = alloca(strlen(list_iterator) + 1);
+  int i;
+  for (i = 0; list_iterator[i]; i++)
+    if (list_iterator[i] == ',')
+      vms_list_iterator[i] = ' ';
+    else
+      vms_list_iterator[i] = list_iterator[i];
+  vms_list_iterator[i] = list_iterator[i];
+  while ((p2 = find_next_token((const char**) &vms_list_iterator, &len)) != 0)
+#else
+  while ((p2 = find_next_token (&list_iterator, &len)) != 0)
+#endif
+    {
+      const char *p = p2 + len - 1;
+
+      while (p >= p2 && ! STOP_SET (*p, stop))
+        --p;
+
+      if (p >= p2)
+        {
+          if (is_notdir)
+            ++p;
+          else if (*p != '.')
+            continue;
+          o = variable_buffer_output (o, p, len - (p - p2));
+        }
+#ifdef HAVE_DOS_PATHS
+      /* Handle the case of "d:foo/bar".  */
+      else if (is_notdir && p2[0] && p2[1] == ':')
+        {
+          p = p2 + 2;
+          o = variable_buffer_output (o, p, len - (p - p2));
+        }
+#endif
+      else if (is_notdir)
+        o = variable_buffer_output (o, p2, len);
+
+      if (is_notdir || p >= p2)
+        {
+#ifdef VMS
+          if (vms_comma_separator)
+            o = variable_buffer_output (o, ",", 1);
+          else
+#endif
+          o = variable_buffer_output (o, " ", 1);
+
+          doneany = 1;
+        }
+    }
+
+  if (doneany)
+    /* Kill last space.  */
+    --o;
+
+  return o;
+}
+
+
+static char *
+func_basename_dir (char *o, char **argv, const char *funcname)
+{
+  /* Expand the argument.  */
+  const char *p3 = argv[0];
+  const char *p2;
+  int doneany = 0;
+  size_t len = 0;
+
+  int is_basename = funcname[0] == 'b';
+  int is_dir = !is_basename;
+  int stop = MAP_DIRSEP | (is_basename ? MAP_DOT : 0) | MAP_NUL;
+#ifdef VMS
+  /* As in func_notdir_suffix ... */
+  char *vms_p3 = alloca (strlen(p3) + 1);
+  int i;
+  for (i = 0; p3[i]; i++)
+    if (p3[i] == ',')
+      vms_p3[i] = ' ';
+    else
+      vms_p3[i] = p3[i];
+  vms_p3[i] = p3[i];
+  while ((p2 = find_next_token((const char**) &vms_p3, &len)) != 0)
+#else
+  while ((p2 = find_next_token (&p3, &len)) != 0)
+#endif
+    {
+      const char *p = p2 + len - 1;
+      while (p >= p2 && ! STOP_SET (*p, stop))
+        --p;
+
+      if (p >= p2 && (is_dir))
+        o = variable_buffer_output (o, p2, ++p - p2);
+      else if (p >= p2 && (*p == '.'))
+        o = variable_buffer_output (o, p2, p - p2);
+#ifdef HAVE_DOS_PATHS
+      /* Handle the "d:foobar" case */
+      else if (p2[0] && p2[1] == ':' && is_dir)
+        o = variable_buffer_output (o, p2, 2);
+#endif
+      else if (is_dir)
+#ifdef VMS
+        {
+          extern int vms_report_unix_paths;
+          if (vms_report_unix_paths)
+            o = variable_buffer_output (o, "./", 2);
+          else
+            o = variable_buffer_output (o, "[]", 2);
+        }
+#else
+#ifndef _AMIGA
+      o = variable_buffer_output (o, "./", 2);
+#else
+      ; /* Just a nop...  */
+#endif /* AMIGA */
+#endif /* !VMS */
+      else
+        /* The entire name is the basename.  */
+        o = variable_buffer_output (o, p2, len);
+
+#ifdef VMS
+      if (vms_comma_separator)
+        o = variable_buffer_output (o, ",", 1);
+      else
+#endif
+        o = variable_buffer_output (o, " ", 1);
+
+      doneany = 1;
+    }
+
+  if (doneany)
+    /* Kill last space.  */
+    --o;
+
+  return o;
+}
+
+static char *
+func_addsuffix_addprefix (char *o, char **argv, const char *funcname)
+{
+  size_t fixlen = strlen (argv[0]);
+  const char *list_iterator = argv[1];
+  int is_addprefix = funcname[3] == 'p';
+  int is_addsuffix = !is_addprefix;
+
+  int doneany = 0;
+  const char *p;
+  size_t len;
+
+  while ((p = find_next_token (&list_iterator, &len)) != 0)
+    {
+      if (is_addprefix)
+        o = variable_buffer_output (o, argv[0], fixlen);
+      o = variable_buffer_output (o, p, len);
+      if (is_addsuffix)
+        o = variable_buffer_output (o, argv[0], fixlen);
+      o = variable_buffer_output (o, " ", 1);
+      doneany = 1;
+    }
+
+  if (doneany)
+    /* Kill last space.  */
+    --o;
+
+  return o;
+}
+
+static char *
+func_subst (char *o, char **argv, const char *funcname UNUSED)
+{
+  o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]),
+                    strlen (argv[1]), 0);
+
+  return o;
+}
+
+
+static char *
+func_firstword (char *o, char **argv, const char *funcname UNUSED)
+{
+  size_t i;
+  const char *words = argv[0];    /* Use a temp variable for find_next_token */
+  const char *p = find_next_token (&words, &i);
+
+  if (p != 0)
+    o = variable_buffer_output (o, p, i);
+
+  return o;
+}
+
+static char *
+func_lastword (char *o, char **argv, const char *funcname UNUSED)
+{
+  size_t i;
+  const char *words = argv[0];    /* Use a temp variable for find_next_token */
+  const char *p = NULL;
+  const char *t;
+
+  while ((t = find_next_token (&words, &i)) != NULL)
+    p = t;
+
+  if (p != 0)
+    o = variable_buffer_output (o, p, i);
+
+  return o;
+}
+
+static char *
+func_words (char *o, char **argv, const char *funcname UNUSED)
+{
+  int i = 0;
+  const char *word_iterator = argv[0];
+  char buf[20];
+
+  while (find_next_token (&word_iterator, NULL) != 0)
+    ++i;
+
+  sprintf (buf, "%d", i);
+  o = variable_buffer_output (o, buf, strlen (buf));
+
+  return o;
+}
+
+/* Set begpp to point to the first non-whitespace character of the string,
+ * and endpp to point to the last non-whitespace character of the string.
+ * If the string is empty or contains nothing but whitespace, endpp will be
+ * begpp-1.
+ */
+char *
+strip_whitespace (const char **begpp, const char **endpp)
+{
+  while (*begpp <= *endpp && ISSPACE (**begpp))
+    (*begpp) ++;
+  while (*endpp >= *begpp && ISSPACE (**endpp))
+    (*endpp) --;
+  return (char *)*begpp;
+}
+
+static void
+check_numeric (const char *s, const char *msg)
+{
+  const char *end = s + strlen (s) - 1;
+  const char *beg = s;
+  strip_whitespace (&s, &end);
+
+  for (; s <= end; ++s)
+    if (!ISDIGIT (*s))  /* ISDIGIT only evals its arg once: see makeint.h.  */
+      break;
+
+  if (s <= end || end - beg < 0)
+    OSS (fatal, *expanding_var, "%s: '%s'", msg, beg);
+}
+
+
+
+static char *
+func_word (char *o, char **argv, const char *funcname UNUSED)
+{
+  const char *end_p;
+  const char *p;
+  int i;
+
+  /* Check the first argument.  */
+  check_numeric (argv[0], _("non-numeric first argument to 'word' function"));
+  i = atoi (argv[0]);
+
+  if (i == 0)
+    O (fatal, *expanding_var,
+       _("first argument to 'word' function must be greater than 0"));
+
+  end_p = argv[1];
+  while ((p = find_next_token (&end_p, 0)) != 0)
+    if (--i == 0)
+      break;
+
+  if (i == 0)
+    o = variable_buffer_output (o, p, end_p - p);
+
+  return o;
+}
+
+static char *
+func_wordlist (char *o, char **argv, const char *funcname UNUSED)
+{
+  int start, count;
+
+  /* Check the arguments.  */
+  check_numeric (argv[0],
+                 _("non-numeric first argument to 'wordlist' function"));
+  check_numeric (argv[1],
+                 _("non-numeric second argument to 'wordlist' function"));
+
+  start = atoi (argv[0]);
+  if (start < 1)
+    ON (fatal, *expanding_var,
+        "invalid first argument to 'wordlist' function: '%d'", start);
+
+  count = atoi (argv[1]) - start + 1;
+
+  if (count > 0)
+    {
+      const char *p;
+      const char *end_p = argv[2];
+
+      /* Find the beginning of the "start"th word.  */
+      while (((p = find_next_token (&end_p, 0)) != 0) && --start)
+        ;
+
+      if (p)
+        {
+          /* Find the end of the "count"th word from start.  */
+          while (--count && (find_next_token (&end_p, 0) != 0))
+            ;
+
+          /* Return the stuff in the middle.  */
+          o = variable_buffer_output (o, p, end_p - p);
+        }
+    }
+
+  return o;
+}
+
+static char *
+func_findstring (char *o, char **argv, const char *funcname UNUSED)
+{
+  /* Find the first occurrence of the first string in the second.  */
+  if (strstr (argv[1], argv[0]) != 0)
+    o = variable_buffer_output (o, argv[0], strlen (argv[0]));
+
+  return o;
+}
+
+static char *
+func_foreach (char *o, char **argv, const char *funcname UNUSED)
+{
+  /* expand only the first two.  */
+  char *varname = expand_argument (argv[0], NULL);
+  char *list = expand_argument (argv[1], NULL);
+  const char *body = argv[2];
+
+  int doneany = 0;
+  const char *list_iterator = list;
+  const char *p;
+  size_t len;
+  struct variable *var;
+
+  /* Clean up the variable name by removing whitespace.  */
+  char *vp = next_token (varname);
+  end_of_token (vp)[0] = '\0';
+
+  push_new_variable_scope ();
+  var = define_variable (vp, strlen (vp), "", o_automatic, 0);
+
+  /* loop through LIST,  put the value in VAR and expand BODY */
+  while ((p = find_next_token (&list_iterator, &len)) != 0)
+    {
+      char *result = 0;
+
+      free (var->value);
+      var->value = xstrndup (p, len);
+
+      result = allocated_variable_expand (body);
+
+      o = variable_buffer_output (o, result, strlen (result));
+      o = variable_buffer_output (o, " ", 1);
+      doneany = 1;
+      free (result);
+    }
+
+  if (doneany)
+    /* Kill the last space.  */
+    --o;
+
+  pop_variable_scope ();
+  free (varname);
+  free (list);
+
+  return o;
+}
+
+struct a_word
+{
+  struct a_word *next;
+  struct a_word *chain;
+  char *str;
+  size_t length;
+  int matched;
+};
+
+static unsigned long
+a_word_hash_1 (const void *key)
+{
+  return_STRING_HASH_1 (((struct a_word const *) key)->str);
+}
+
+static unsigned long
+a_word_hash_2 (const void *key)
+{
+  return_STRING_HASH_2 (((struct a_word const *) key)->str);
+}
+
+static int
+a_word_hash_cmp (const void *x, const void *y)
+{
+  int result = (int) ((struct a_word const *) x)->length - ((struct a_word const *) y)->length;
+  if (result)
+    return result;
+  return_STRING_COMPARE (((struct a_word const *) x)->str,
+                         ((struct a_word const *) y)->str);
+}
+
+struct a_pattern
+{
+  struct a_pattern *next;
+  char *str;
+  char *percent;
+  size_t length;
+};
+
+static char *
+func_filter_filterout (char *o, char **argv, const char *funcname)
+{
+  struct a_word *wordhead;
+  struct a_word **wordtail;
+  struct a_word *wp;
+  struct a_pattern *pathead;
+  struct a_pattern **pattail;
+  struct a_pattern *pp;
+
+  struct hash_table a_word_table;
+  int is_filter = funcname[CSTRLEN ("filter")] == '\0';
+  const char *pat_iterator = argv[0];
+  const char *word_iterator = argv[1];
+  int literals = 0;
+  int words = 0;
+  int hashing = 0;
+  char *p;
+  size_t len;
+
+  /* Chop ARGV[0] up into patterns to match against the words.
+     We don't need to preserve it because our caller frees all the
+     argument memory anyway.  */
+
+  pattail = &pathead;
+  while ((p = find_next_token (&pat_iterator, &len)) != 0)
+    {
+      struct a_pattern *pat = alloca (sizeof (struct a_pattern));
+
+      *pattail = pat;
+      pattail = &pat->next;
+
+      if (*pat_iterator != '\0')
+        ++pat_iterator;
+
+      pat->str = p;
+      p[len] = '\0';
+      pat->percent = find_percent (p);
+      if (pat->percent == 0)
+        literals++;
+
+      /* find_percent() might shorten the string so LEN is wrong.  */
+      pat->length = strlen (pat->str);
+    }
+  *pattail = 0;
+
+  /* Chop ARGV[1] up into words to match against the patterns.  */
+
+  wordtail = &wordhead;
+  while ((p = find_next_token (&word_iterator, &len)) != 0)
+    {
+      struct a_word *word = alloca (sizeof (struct a_word));
+
+      *wordtail = word;
+      wordtail = &word->next;
+
+      if (*word_iterator != '\0')
+        ++word_iterator;
+
+      p[len] = '\0';
+      word->str = p;
+      word->length = len;
+      word->matched = 0;
+      word->chain = 0;
+      words++;
+    }
+  *wordtail = 0;
+
+  /* Only use a hash table if arg list lengths justifies the cost.  */
+  hashing = (literals >= 2 && (literals * words) >= 10);
+  if (hashing)
+    {
+      hash_init (&a_word_table, words, a_word_hash_1, a_word_hash_2,
+                 a_word_hash_cmp);
+      for (wp = wordhead; wp != 0; wp = wp->next)
+        {
+          struct a_word *owp = hash_insert (&a_word_table, wp);
+          if (owp)
+            wp->chain = owp;
+        }
+    }
+
+  if (words)
+    {
+      int doneany = 0;
+
+      /* Run each pattern through the words, killing words.  */
+      for (pp = pathead; pp != 0; pp = pp->next)
+        {
+          if (pp->percent)
+            for (wp = wordhead; wp != 0; wp = wp->next)
+              wp->matched |= pattern_matches (pp->str, pp->percent, wp->str);
+          else if (hashing)
+            {
+              struct a_word a_word_key;
+              a_word_key.str = pp->str;
+              a_word_key.length = pp->length;
+              wp = hash_find_item (&a_word_table, &a_word_key);
+              while (wp)
+                {
+                  wp->matched |= 1;
+                  wp = wp->chain;
+                }
+            }
+          else
+            for (wp = wordhead; wp != 0; wp = wp->next)
+              wp->matched |= (wp->length == pp->length
+                              && strneq (pp->str, wp->str, wp->length));
+        }
+
+      /* Output the words that matched (or didn't, for filter-out).  */
+      for (wp = wordhead; wp != 0; wp = wp->next)
+        if (is_filter ? wp->matched : !wp->matched)
+          {
+            o = variable_buffer_output (o, wp->str, strlen (wp->str));
+            o = variable_buffer_output (o, " ", 1);
+            doneany = 1;
+          }
+
+      if (doneany)
+        /* Kill the last space.  */
+        --o;
+    }
+
+  if (hashing)
+    hash_free (&a_word_table, 0);
+
+  return o;
+}
+
+
+static char *
+func_strip (char *o, char **argv, const char *funcname UNUSED)
+{
+  const char *p = argv[0];
+  int doneany = 0;
+
+  while (*p != '\0')
+    {
+      int i=0;
+      const char *word_start;
+
+      NEXT_TOKEN (p);
+      word_start = p;
+      for (i=0; *p != '\0' && !ISSPACE (*p); ++p, ++i)
+        {}
+      if (!i)
+        break;
+      o = variable_buffer_output (o, word_start, i);
+      o = variable_buffer_output (o, " ", 1);
+      doneany = 1;
+    }
+
+  if (doneany)
+    /* Kill the last space.  */
+    --o;
+
+  return o;
+}
+
+/*
+  Print a warning or fatal message.
+*/
+static char *
+func_error (char *o, char **argv, const char *funcname)
+{
+  char **argvp;
+  char *msg, *p;
+  size_t len;
+
+  /* The arguments will be broken on commas.  Rather than create yet
+     another special case where function arguments aren't broken up,
+     just create a format string that puts them back together.  */
+  for (len=0, argvp=argv; *argvp != 0; ++argvp)
+    len += strlen (*argvp) + 2;
+
+  p = msg = alloca (len + 1);
+  msg[0] = '\0';
+
+  for (argvp=argv; argvp[1] != 0; ++argvp)
+    {
+      strcpy (p, *argvp);
+      p += strlen (*argvp);
+      *(p++) = ',';
+      *(p++) = ' ';
+    }
+  strcpy (p, *argvp);
+
+  switch (*funcname)
+    {
+    case 'e':
+      OS (fatal, reading_file, "%s", msg);
+
+    case 'w':
+      OS (error, reading_file, "%s", msg);
+      break;
+
+    case 'i':
+      outputs (0, msg);
+      outputs (0, "\n");
+      break;
+
+    default:
+      OS (fatal, *expanding_var, "Internal error: func_error: '%s'", funcname);
+    }
+
+  /* The warning function expands to the empty string.  */
+  return o;
+}
+
+
+/*
+  chop argv[0] into words, and sort them.
+ */
+static char *
+func_sort (char *o, char **argv, const char *funcname UNUSED)
+{
+  const char *t;
+  char **words;
+  int wordi;
+  char *p;
+  size_t len;
+
+  /* Find the maximum number of words we'll have.  */
+  t = argv[0];
+  wordi = 0;
+  while ((p = find_next_token (&t, NULL)) != 0)
+    {
+      ++t;
+      ++wordi;
+    }
+
+  words = xmalloc ((wordi == 0 ? 1 : wordi) * sizeof (char *));
+
+  /* Now assign pointers to each string in the array.  */
+  t = argv[0];
+  wordi = 0;
+  while ((p = find_next_token (&t, &len)) != 0)
+    {
+      ++t;
+      p[len] = '\0';
+      words[wordi++] = p;
+    }
+
+  if (wordi)
+    {
+      int i;
+
+      /* Now sort the list of words.  */
+      qsort (words, wordi, sizeof (char *), alpha_compare);
+
+      /* Now write the sorted list, uniquified.  */
+      for (i = 0; i < wordi; ++i)
+        {
+          len = strlen (words[i]);
+          if (i == wordi - 1 || strlen (words[i + 1]) != len
+              || strcmp (words[i], words[i + 1]))
+            {
+              o = variable_buffer_output (o, words[i], len);
+              o = variable_buffer_output (o, " ", 1);
+            }
+        }
+
+      /* Kill the last space.  */
+      --o;
+    }
+
+  free (words);
+
+  return o;
+}
+
+/*
+  $(if condition,true-part[,false-part])
+
+  CONDITION is false iff it evaluates to an empty string.  White
+  space before and after condition are stripped before evaluation.
+
+  If CONDITION is true, then TRUE-PART is evaluated, otherwise FALSE-PART is
+  evaluated (if it exists).  Because only one of the two PARTs is evaluated,
+  you can use $(if ...) to create side-effects (with $(shell ...), for
+  example).
+*/
+
+static char *
+func_if (char *o, char **argv, const char *funcname UNUSED)
+{
+  const char *begp = argv[0];
+  const char *endp = begp + strlen (argv[0]) - 1;
+  int result = 0;
+
+  /* Find the result of the condition: if we have a value, and it's not
+     empty, the condition is true.  If we don't have a value, or it's the
+     empty string, then it's false.  */
+
+  strip_whitespace (&begp, &endp);
+
+  if (begp <= endp)
+    {
+      char *expansion = expand_argument (begp, endp+1);
+
+      result = expansion[0] != '\0';
+      free (expansion);
+    }
+
+  /* If the result is true (1) we want to eval the first argument, and if
+     it's false (0) we want to eval the second.  If the argument doesn't
+     exist we do nothing, otherwise expand it and add to the buffer.  */
+
+  argv += 1 + !result;
+
+  if (*argv)
+    {
+      char *expansion = expand_argument (*argv, NULL);
+
+      o = variable_buffer_output (o, expansion, strlen (expansion));
+
+      free (expansion);
+    }
+
+  return o;
+}
+
+/*
+  $(or condition1[,condition2[,condition3[...]]])
+
+  A CONDITION is false iff it evaluates to an empty string.  White
+  space before and after CONDITION are stripped before evaluation.
+
+  CONDITION1 is evaluated.  If it's true, then this is the result of
+  expansion.  If it's false, CONDITION2 is evaluated, and so on.  If none of
+  the conditions are true, the expansion is the empty string.
+
+  Once a CONDITION is true no further conditions are evaluated
+  (short-circuiting).
+*/
+
+static char *
+func_or (char *o, char **argv, const char *funcname UNUSED)
+{
+  for ( ; *argv ; ++argv)
+    {
+      const char *begp = *argv;
+      const char *endp = begp + strlen (*argv) - 1;
+      char *expansion;
+      size_t result = 0;
+
+      /* Find the result of the condition: if it's false keep going.  */
+
+      strip_whitespace (&begp, &endp);
+
+      if (begp > endp)
+        continue;
+
+      expansion = expand_argument (begp, endp+1);
+      result = strlen (expansion);
+
+      /* If the result is false keep going.  */
+      if (!result)
+        {
+          free (expansion);
+          continue;
+        }
+
+      /* It's true!  Keep this result and return.  */
+      o = variable_buffer_output (o, expansion, result);
+      free (expansion);
+      break;
+    }
+
+  return o;
+}
+
+/*
+  $(and condition1[,condition2[,condition3[...]]])
+
+  A CONDITION is false iff it evaluates to an empty string.  White
+  space before and after CONDITION are stripped before evaluation.
+
+  CONDITION1 is evaluated.  If it's false, then this is the result of
+  expansion.  If it's true, CONDITION2 is evaluated, and so on.  If all of
+  the conditions are true, the expansion is the result of the last condition.
+
+  Once a CONDITION is false no further conditions are evaluated
+  (short-circuiting).
+*/
+
+static char *
+func_and (char *o, char **argv, const char *funcname UNUSED)
+{
+  char *expansion;
+
+  while (1)
+    {
+      const char *begp = *argv;
+      const char *endp = begp + strlen (*argv) - 1;
+      size_t result;
+
+      /* An empty condition is always false.  */
+      strip_whitespace (&begp, &endp);
+      if (begp > endp)
+        return o;
+
+      expansion = expand_argument (begp, endp+1);
+      result = strlen (expansion);
+
+      /* If the result is false, stop here: we're done.  */
+      if (!result)
+        break;
+
+      /* Otherwise the result is true.  If this is the last one, keep this
+         result and quit.  Otherwise go on to the next one!  */
+
+      if (*(++argv))
+        free (expansion);
+      else
+        {
+          o = variable_buffer_output (o, expansion, result);
+          break;
+        }
+    }
+
+  free (expansion);
+
+  return o;
+}
+
+static char *
+func_wildcard (char *o, char **argv, const char *funcname UNUSED)
+{
+#ifdef _AMIGA
+   o = wildcard_expansion (argv[0], o);
+#else
+   char *p = string_glob (argv[0]);
+   o = variable_buffer_output (o, p, strlen (p));
+#endif
+   return o;
+}
+
+/*
+  $(eval <makefile string>)
+
+  Always resolves to the empty string.
+
+  Treat the arguments as a segment of makefile, and parse them.
+*/
+
+static char *
+func_eval (char *o, char **argv, const char *funcname UNUSED)
+{
+  char *buf;
+  size_t len;
+
+  /* Eval the buffer.  Pop the current variable buffer setting so that the
+     eval'd code can use its own without conflicting.  */
+
+  install_variable_buffer (&buf, &len);
+
+  eval_buffer (argv[0], NULL);
+
+  restore_variable_buffer (buf, len);
+
+  return o;
+}
+
+
+static char *
+func_value (char *o, char **argv, const char *funcname UNUSED)
+{
+  /* Look up the variable.  */
+  struct variable *v = lookup_variable (argv[0], strlen (argv[0]));
+
+  /* Copy its value into the output buffer without expanding it.  */
+  if (v)
+    o = variable_buffer_output (o, v->value, strlen (v->value));
+
+  return o;
+}
+
+/*
+  \r is replaced on UNIX as well. Is this desirable?
+ */
+static void
+fold_newlines (char *buffer, size_t *length, int trim_newlines)
+{
+  char *dst = buffer;
+  char *src = buffer;
+  char *last_nonnl = buffer - 1;
+  src[*length] = 0;
+  for (; *src != '\0'; ++src)
+    {
+      if (src[0] == '\r' && src[1] == '\n')
+        continue;
+      if (*src == '\n')
+        {
+          *dst++ = ' ';
+        }
+      else
+        {
+          last_nonnl = dst;
+          *dst++ = *src;
+        }
+    }
+
+  if (!trim_newlines && (last_nonnl < (dst - 2)))
+    last_nonnl = dst - 2;
+
+  *(++last_nonnl) = '\0';
+  *length = last_nonnl - buffer;
+}
+
+pid_t shell_function_pid = 0;
+static int shell_function_completed;
+
+void
+shell_completed (int exit_code, int exit_sig)
+{
+  char buf[256];
+
+  shell_function_pid = 0;
+  if (exit_sig == 0 && exit_code == 127)
+    shell_function_completed = -1;
+  else
+    shell_function_completed = 1;
+
+  if (exit_code == 0 && exit_sig > 0)
+    exit_code = 128 + exit_sig;
+
+  sprintf (buf, "%d", exit_code);
+  define_variable_cname (".SHELLSTATUS", buf, o_override, 0);
+}
+
+#ifdef WINDOWS32
+/*untested*/
+
+#include <windows.h>
+#include <io.h>
+#include "sub_proc.h"
+
+
+int
+windows32_openpipe (int *pipedes, int errfd, pid_t *pid_p, char **command_argv, char **envp)
+{
+  SECURITY_ATTRIBUTES saAttr;
+  HANDLE hIn = INVALID_HANDLE_VALUE;
+  HANDLE hErr = INVALID_HANDLE_VALUE;
+  HANDLE hChildOutRd;
+  HANDLE hChildOutWr;
+  HANDLE hProcess, tmpIn, tmpErr;
+  DWORD e;
+
+  /* Set status for return.  */
+  pipedes[0] = pipedes[1] = -1;
+  *pid_p = (pid_t)-1;
+
+  saAttr.nLength = sizeof (SECURITY_ATTRIBUTES);
+  saAttr.bInheritHandle = TRUE;
+  saAttr.lpSecurityDescriptor = NULL;
+
+  /* Standard handles returned by GetStdHandle can be NULL or
+     INVALID_HANDLE_VALUE if the parent process closed them.  If that
+     happens, we open the null device and pass its handle to
+     process_begin below as the corresponding handle to inherit.  */
+  tmpIn = GetStdHandle (STD_INPUT_HANDLE);
+  if (DuplicateHandle (GetCurrentProcess (), tmpIn,
+                       GetCurrentProcess (), &hIn,
+                       0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
+    {
+      e = GetLastError ();
+      if (e == ERROR_INVALID_HANDLE)
+        {
+          tmpIn = CreateFile ("NUL", GENERIC_READ,
+                              FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+          if (tmpIn != INVALID_HANDLE_VALUE
+              && DuplicateHandle (GetCurrentProcess (), tmpIn,
+                                  GetCurrentProcess (), &hIn,
+                                  0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
+            CloseHandle (tmpIn);
+        }
+      if (hIn == INVALID_HANDLE_VALUE)
+        {
+          ON (error, NILF,
+              _("windows32_openpipe: DuplicateHandle(In) failed (e=%ld)\n"), e);
+          return -1;
+        }
+    }
+  tmpErr = (HANDLE)_get_osfhandle (errfd);
+  if (DuplicateHandle (GetCurrentProcess (), tmpErr,
+                       GetCurrentProcess (), &hErr,
+                       0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
+    {
+      e = GetLastError ();
+      if (e == ERROR_INVALID_HANDLE)
+        {
+          tmpErr = CreateFile ("NUL", GENERIC_WRITE,
+                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+          if (tmpErr != INVALID_HANDLE_VALUE
+              && DuplicateHandle (GetCurrentProcess (), tmpErr,
+                                  GetCurrentProcess (), &hErr,
+                                  0, TRUE, DUPLICATE_SAME_ACCESS) == FALSE)
+            CloseHandle (tmpErr);
+        }
+      if (hErr == INVALID_HANDLE_VALUE)
+        {
+          ON (error, NILF,
+              _("windows32_openpipe: DuplicateHandle(Err) failed (e=%ld)\n"), e);
+          return -1;
+        }
+    }
+
+  if (! CreatePipe (&hChildOutRd, &hChildOutWr, &saAttr, 0))
+    {
+      ON (error, NILF, _("CreatePipe() failed (e=%ld)\n"), GetLastError());
+      return -1;
+    }
+
+  hProcess = process_init_fd (hIn, hChildOutWr, hErr);
+
+  if (!hProcess)
+    {
+      O (error, NILF, _("windows32_openpipe(): process_init_fd() failed\n"));
+      return -1;
+    }
+
+  /* make sure that CreateProcess() has Path it needs */
+  sync_Path_environment ();
+  /* 'sync_Path_environment' may realloc 'environ', so take note of
+     the new value.  */
+  envp = environ;
+
+  if (! process_begin (hProcess, command_argv, envp, command_argv[0], NULL))
+    {
+      /* register process for wait */
+      process_register (hProcess);
+
+      /* set the pid for returning to caller */
+      *pid_p = (pid_t) hProcess;
+
+      /* set up to read data from child */
+      pipedes[0] = _open_osfhandle ((intptr_t) hChildOutRd, O_RDONLY);
+
+      /* this will be closed almost right away */
+      pipedes[1] = _open_osfhandle ((intptr_t) hChildOutWr, O_APPEND);
+      return 0;
+    }
+  else
+    {
+      /* reap/cleanup the failed process */
+      process_cleanup (hProcess);
+
+      /* close handles which were duplicated, they weren't used */
+      if (hIn != INVALID_HANDLE_VALUE)
+        CloseHandle (hIn);
+      if (hErr != INVALID_HANDLE_VALUE)
+        CloseHandle (hErr);
+
+      /* close pipe handles, they won't be used */
+      CloseHandle (hChildOutRd);
+      CloseHandle (hChildOutWr);
+
+      return -1;
+    }
+}
+#endif
+
+
+#ifdef __MSDOS__
+FILE *
+msdos_openpipe (int* pipedes, int *pidp, char *text)
+{
+  FILE *fpipe=0;
+  /* MSDOS can't fork, but it has 'popen'.  */
+  struct variable *sh = lookup_variable ("SHELL", 5);
+  int e;
+  extern int dos_command_running, dos_status;
+
+  /* Make sure not to bother processing an empty line.  */
+  NEXT_TOKEN (text);
+  if (*text == '\0')
+    return 0;
+
+  if (sh)
+    {
+      char buf[PATH_MAX + 7];
+      /* This makes sure $SHELL value is used by $(shell), even
+         though the target environment is not passed to it.  */
+      sprintf (buf, "SHELL=%s", sh->value);
+      putenv (buf);
+    }
+
+  e = errno;
+  errno = 0;
+  dos_command_running = 1;
+  dos_status = 0;
+  /* If dos_status becomes non-zero, it means the child process
+     was interrupted by a signal, like SIGINT or SIGQUIT.  See
+     fatal_error_signal in commands.c.  */
+  fpipe = popen (text, "rt");
+  dos_command_running = 0;
+  if (!fpipe || dos_status)
+    {
+      pipedes[0] = -1;
+      *pidp = -1;
+      if (dos_status)
+        errno = EINTR;
+      else if (errno == 0)
+        errno = ENOMEM;
+      if (fpipe)
+        pclose (fpipe);
+      shell_completed (127, 0);
+    }
+  else
+    {
+      pipedes[0] = fileno (fpipe);
+      *pidp = 42; /* Yes, the Meaning of Life, the Universe, and Everything! */
+      errno = e;
+    }
+  return fpipe;
+}
+#endif
+
+/*
+  Do shell spawning, with the naughty bits for different OSes.
+ */
+
+#ifdef VMS
+
+/* VMS can't do $(shell ...)  */
+
+char *
+func_shell_base (char *o, char **argv, int trim_newlines)
+{
+  fprintf (stderr, "This platform does not support shell\n");
+  die (MAKE_TROUBLE);
+  return NULL;
+}
+
+#define func_shell 0
+
+#else
+#ifndef _AMIGA
+char *
+func_shell_base (char *o, char **argv, int trim_newlines)
+{
+  char *batch_filename = NULL;
+  int errfd;
+#ifdef __MSDOS__
+  FILE *fpipe;
+#endif
+  char **command_argv = NULL;
+  char **envp;
+  int pipedes[2];
+  pid_t pid;
+
+#ifndef __MSDOS__
+#ifdef WINDOWS32
+  /* Reset just_print_flag.  This is needed on Windows when batch files
+     are used to run the commands, because we normally refrain from
+     creating batch files under -n.  */
+  int j_p_f = just_print_flag;
+  just_print_flag = 0;
+#endif
+
+  /* Construct the argument list.  */
+  command_argv = construct_command_argv (argv[0], NULL, NULL, 0,
+                                         &batch_filename);
+  if (command_argv == 0)
+    {
+#ifdef WINDOWS32
+      just_print_flag = j_p_f;
+#endif
+      return o;
+    }
+#endif /* !__MSDOS__ */
+
+  /* Using a target environment for 'shell' loses in cases like:
+       export var = $(shell echo foobie)
+       bad := $(var)
+     because target_environment hits a loop trying to expand $(var) to put it
+     in the environment.  This is even more confusing when 'var' was not
+     explicitly exported, but just appeared in the calling environment.
+
+     See Savannah bug #10593.
+
+  envp = target_environment (NULL);
+  */
+
+  envp = environ;
+
+  /* Set up the output in case the shell writes something.  */
+  output_start ();
+
+  errfd = (output_context && output_context->err >= 0
+           ? output_context->err : FD_STDERR);
+
+#if defined(__MSDOS__)
+  fpipe = msdos_openpipe (pipedes, &pid, argv[0]);
+  if (pipedes[0] < 0)
+    {
+      OS (error, reading_file, "pipe: %s", strerror (errno));
+      pid = -1;
+      goto done;
+    }
+
+#elif defined(WINDOWS32)
+  windows32_openpipe (pipedes, errfd, &pid, command_argv, envp);
+  /* Restore the value of just_print_flag.  */
+  just_print_flag = j_p_f;
+
+  if (pipedes[0] < 0)
+    {
+      /* Open of the pipe failed, mark as failed execution.  */
+      shell_completed (127, 0);
+      OS (error, reading_file, "pipe: %s", strerror (errno));
+      pid = -1;
+      goto done;
+    }
+
+#else
+  if (pipe (pipedes) < 0)
+    {
+      OS (error, reading_file, "pipe: %s", strerror (errno));
+      pid = -1;
+      goto done;
+    }
+
+  /* Close handles that are unnecessary for the child process.  */
+  fd_noinherit (pipedes[1]);
+  fd_noinherit (pipedes[0]);
+
+  {
+    struct childbase child;
+    child.cmd_name = NULL;
+    child.output.syncout = 1;
+    child.output.out = pipedes[1];
+    child.output.err = errfd;
+    child.environment = envp;
+
+    pid = child_execute_job (&child, 1, command_argv);
+
+    free (child.cmd_name);
+  }
+
+  if (pid < 0)
+    {
+      shell_completed (127, 0);
+      goto done;
+    }
+#endif
+
+  {
+    char *buffer;
+    size_t maxlen, i;
+    int cc;
+
+    /* Record the PID for reap_children.  */
+    shell_function_pid = pid;
+#ifndef  __MSDOS__
+    shell_function_completed = 0;
+
+    /* Close the write side of the pipe.  We test for -1, since
+       pipedes[1] is -1 on MS-Windows, and some versions of MS
+       libraries barf when 'close' is called with -1.  */
+    if (pipedes[1] >= 0)
+      close (pipedes[1]);
+#endif
+
+    /* Set up and read from the pipe.  */
+
+    maxlen = 200;
+    buffer = xmalloc (maxlen + 1);
+
+    /* Read from the pipe until it gets EOF.  */
+    for (i = 0; ; i += cc)
+      {
+        if (i == maxlen)
+          {
+            maxlen += 512;
+            buffer = xrealloc (buffer, maxlen + 1);
+          }
+
+        EINTRLOOP (cc, read (pipedes[0], &buffer[i], maxlen - i));
+        if (cc <= 0)
+          break;
+      }
+    buffer[i] = '\0';
+
+    /* Close the read side of the pipe.  */
+#ifdef  __MSDOS__
+    if (fpipe)
+      {
+        int st = pclose (fpipe);
+        shell_completed (st, 0);
+      }
+#else
+    (void) close (pipedes[0]);
+#endif
+
+    /* Loop until child_handler or reap_children()  sets
+       shell_function_completed to the status of our child shell.  */
+    while (shell_function_completed == 0)
+      reap_children (1, 0);
+
+    if (batch_filename)
+      {
+        DB (DB_VERBOSE, (_("Cleaning up temporary batch file %s\n"),
+                         batch_filename));
+        remove (batch_filename);
+        free (batch_filename);
+      }
+    shell_function_pid = 0;
+
+    /* shell_completed() will set shell_function_completed to 1 when the
+       child dies normally, or to -1 if it dies with status 127, which is
+       most likely an exec fail.  */
+
+    if (shell_function_completed == -1)
+      {
+        /* This likely means that the execvp failed, so we should just
+           write the error message in the pipe from the child.  */
+        fputs (buffer, stderr);
+        fflush (stderr);
+      }
+    else
+      {
+        /* The child finished normally.  Replace all newlines in its output
+           with spaces, and put that in the variable output buffer.  */
+        fold_newlines (buffer, &i, trim_newlines);
+        o = variable_buffer_output (o, buffer, i);
+      }
+
+    free (buffer);
+  }
+
+ done:
+  if (command_argv)
+    {
+      /* Free the storage only the child needed.  */
+      free (command_argv[0]);
+      free (command_argv);
+    }
+
+  return o;
+}
+
+#else   /* _AMIGA */
+
+/* Do the Amiga version of func_shell.  */
+
+char *
+func_shell_base (char *o, char **argv, int trim_newlines)
+{
+  /* Amiga can't fork nor spawn, but I can start a program with
+     redirection of my choice.  However, this means that we
+     don't have an opportunity to reopen stdout to trap it.  Thus,
+     we save our own stdout onto a new descriptor and dup a temp
+     file's descriptor onto our stdout temporarily.  After we
+     spawn the shell program, we dup our own stdout back to the
+     stdout descriptor.  The buffer reading is the same as above,
+     except that we're now reading from a file.  */
+
+#include <dos/dos.h>
+#include <proto/dos.h>
+
+  BPTR child_stdout;
+  char tmp_output[FILENAME_MAX];
+  size_t maxlen = 200, i;
+  int cc;
+  char * buffer, * ptr;
+  char ** aptr;
+  size_t len = 0;
+  char* batch_filename = NULL;
+
+  /* Construct the argument list.  */
+  command_argv = construct_command_argv (argv[0], NULL, NULL, 0,
+                                         &batch_filename);
+  if (command_argv == 0)
+    return o;
+
+  /* Note the mktemp() is a security hole, but this only runs on Amiga.
+     Ideally we would use get_tmpfile(), but this uses a special Open(), not
+     fopen(), and I'm not familiar enough with the code to mess with it.  */
+  strcpy (tmp_output, "t:MakeshXXXXXXXX");
+  mktemp (tmp_output);
+  child_stdout = Open (tmp_output, MODE_NEWFILE);
+
+  for (aptr=command_argv; *aptr; aptr++)
+    len += strlen (*aptr) + 1;
+
+  buffer = xmalloc (len + 1);
+  ptr = buffer;
+
+  for (aptr=command_argv; *aptr; aptr++)
+    {
+      strcpy (ptr, *aptr);
+      ptr += strlen (ptr) + 1;
+      *ptr ++ = ' ';
+      *ptr = 0;
+    }
+
+  ptr[-1] = '\n';
+
+  Execute (buffer, NULL, child_stdout);
+  free (buffer);
+
+  Close (child_stdout);
+
+  child_stdout = Open (tmp_output, MODE_OLDFILE);
+
+  buffer = xmalloc (maxlen);
+  i = 0;
+  do
+    {
+      if (i == maxlen)
+        {
+          maxlen += 512;
+          buffer = xrealloc (buffer, maxlen + 1);
+        }
+
+      cc = Read (child_stdout, &buffer[i], maxlen - i);
+      if (cc > 0)
+        i += cc;
+    } while (cc > 0);
+
+  Close (child_stdout);
+
+  fold_newlines (buffer, &i, trim_newlines);
+  o = variable_buffer_output (o, buffer, i);
+  free (buffer);
+  return o;
+}
+#endif  /* _AMIGA */
+
+static char *
+func_shell (char *o, char **argv, const char *funcname UNUSED)
+{
+  return func_shell_base (o, argv, 1);
+}
+#endif  /* !VMS */
+
+#ifdef EXPERIMENTAL
+
+/*
+  equality. Return is string-boolean, i.e., the empty string is false.
+ */
+static char *
+func_eq (char *o, char **argv, char *funcname UNUSED)
+{
+  int result = ! strcmp (argv[0], argv[1]);
+  o = variable_buffer_output (o,  result ? "1" : "", result);
+  return o;
+}
+
+
+/*
+  string-boolean not operator.
+ */
+static char *
+func_not (char *o, char **argv, char *funcname UNUSED)
+{
+  const char *s = argv[0];
+  int result = 0;
+  NEXT_TOKEN (s);
+  result = ! (*s);
+  o = variable_buffer_output (o,  result ? "1" : "", result);
+  return o;
+}
+#endif
+\f
+
+#ifdef HAVE_DOS_PATHS
+# ifdef __CYGWIN__
+#  define IS_ABSOLUTE(n) ((n[0] && n[1] == ':') || STOP_SET (n[0], MAP_DIRSEP))
+# else
+#  define IS_ABSOLUTE(n) (n[0] && n[1] == ':')
+# endif
+# define ROOT_LEN 3
+#else
+# define IS_ABSOLUTE(n) (n[0] == '/')
+# define ROOT_LEN 1
+#endif
+
+/* Return the absolute name of file NAME which does not contain any '.',
+   '..' components nor any repeated path separators ('/').   */
+
+static char *
+abspath (const char *name, char *apath)
+{
+  char *dest;
+  const char *start, *end, *apath_limit;
+  unsigned long root_len = ROOT_LEN;
+
+  if (name[0] == '\0')
+    return NULL;
+
+  apath_limit = apath + GET_PATH_MAX;
+
+  if (!IS_ABSOLUTE(name))
+    {
+      /* It is unlikely we would make it until here but just to make sure. */
+      if (!starting_directory)
+        return NULL;
+
+      strcpy (apath, starting_directory);
+
+#ifdef HAVE_DOS_PATHS
+      if (STOP_SET (name[0], MAP_DIRSEP))
+        {
+          if (STOP_SET (name[1], MAP_DIRSEP))
+            {
+              /* A UNC.  Don't prepend a drive letter.  */
+              apath[0] = name[0];
+              apath[1] = name[1];
+              root_len = 2;
+            }
+          /* We have /foo, an absolute file name except for the drive
+             letter.  Assume the missing drive letter is the current
+             drive, which we can get if we remove from starting_directory
+             everything past the root directory.  */
+          apath[root_len] = '\0';
+        }
+#endif
+
+      dest = strchr (apath, '\0');
+    }
+  else
+    {
+#if defined(__CYGWIN__) && defined(HAVE_DOS_PATHS)
+      if (STOP_SET (name[0], MAP_DIRSEP))
+        root_len = 1;
+#endif
+      memcpy (apath, name, root_len);
+      apath[root_len] = '\0';
+      dest = apath + root_len;
+      /* Get past the root, since we already copied it.  */
+      name += root_len;
+#ifdef HAVE_DOS_PATHS
+      if (! STOP_SET (apath[root_len - 1], MAP_DIRSEP))
+        {
+          /* Convert d:foo into d:./foo and increase root_len.  */
+          apath[2] = '.';
+          apath[3] = '/';
+          dest++;
+          root_len++;
+          /* strncpy above copied one character too many.  */
+          name--;
+        }
+      else
+        apath[root_len - 1] = '/'; /* make sure it's a forward slash */
+#endif
+    }
+
+  for (start = end = name; *start != '\0'; start = end)
+    {
+      size_t len;
+
+      /* Skip sequence of multiple path-separators.  */
+      while (STOP_SET (*start, MAP_DIRSEP))
+        ++start;
+
+      /* Find end of path component.  */
+      for (end = start; ! STOP_SET (*end, MAP_DIRSEP|MAP_NUL); ++end)
+        ;
+
+      len = end - start;
+
+      if (len == 0)
+        break;
+      else if (len == 1 && start[0] == '.')
+        /* nothing */;
+      else if (len == 2 && start[0] == '.' && start[1] == '.')
+        {
+          /* Back up to previous component, ignore if at root already.  */
+          if (dest > apath + root_len)
+            for (--dest; ! STOP_SET (dest[-1], MAP_DIRSEP); --dest)
+              ;
+        }
+      else
+        {
+          if (! STOP_SET (dest[-1], MAP_DIRSEP))
+            *dest++ = '/';
+
+          if (dest + len >= apath_limit)
+            return NULL;
+
+          dest = memcpy (dest, start, len);
+          dest += len;
+          *dest = '\0';
+        }
+    }
+
+  /* Unless it is root strip trailing separator.  */
+  if (dest > apath + root_len && STOP_SET (dest[-1], MAP_DIRSEP))
+    --dest;
+
+  *dest = '\0';
+
+  return apath;
+}
+
+
+static char *
+func_realpath (char *o, char **argv, const char *funcname UNUSED)
+{
+  /* Expand the argument.  */
+  const char *p = argv[0];
+  const char *path = 0;
+  int doneany = 0;
+  size_t len = 0;
+
+  while ((path = find_next_token (&p, &len)) != 0)
+    {
+      if (len < GET_PATH_MAX)
+        {
+          char *rp;
+          struct stat st;
+          PATH_VAR (in);
+          PATH_VAR (out);
+
+          strncpy (in, path, len);
+          in[len] = '\0';
+
+#ifdef HAVE_REALPATH
+          ENULLLOOP (rp, realpath (in, out));
+# if defined _AIX
+          /* AIX realpath() doesn't remove trailing slashes correctly.  */
+          if (rp)
+            {
+              char *ep = rp + strlen (rp) - 1;
+              while (ep > rp && ep[0] == '/')
+                *(ep--) = '\0';
+            }
+# endif
+#else
+          rp = abspath (in, out);
+#endif
+
+          if (rp)
+            {
+              int r;
+              EINTRLOOP (r, stat (out, &st));
+              if (r == 0)
+                {
+                  o = variable_buffer_output (o, out, strlen (out));
+                  o = variable_buffer_output (o, " ", 1);
+                  doneany = 1;
+                }
+            }
+        }
+    }
+
+  /* Kill last space.  */
+  if (doneany)
+    --o;
+
+  return o;
+}
+
+static char *
+func_file (char *o, char **argv, const char *funcname UNUSED)
+{
+  char *fn = argv[0];
+
+  if (fn[0] == '>')
+    {
+      FILE *fp;
+      const char *mode = "w";
+
+      /* We are writing a file.  */
+      ++fn;
+      if (fn[0] == '>')
+        {
+          mode = "a";
+          ++fn;
+        }
+      NEXT_TOKEN (fn);
+
+      if (fn[0] == '\0')
+        O (fatal, *expanding_var, _("file: missing filename"));
+
+      ENULLLOOP (fp, fopen (fn, mode));
+      if (fp == NULL)
+        OSS (fatal, reading_file, _("open: %s: %s"), fn, strerror (errno));
+
+      if (argv[1])
+        {
+          size_t l = strlen (argv[1]);
+          int nl = l == 0 || argv[1][l-1] != '\n';
+
+          if (fputs (argv[1], fp) == EOF || (nl && fputc ('\n', fp) == EOF))
+            OSS (fatal, reading_file, _("write: %s: %s"), fn, strerror (errno));
+        }
+      if (fclose (fp))
+        OSS (fatal, reading_file, _("close: %s: %s"), fn, strerror (errno));
+    }
+  else if (fn[0] == '<')
+    {
+      char *preo = o;
+      FILE *fp;
+
+      ++fn;
+      NEXT_TOKEN (fn);
+      if (fn[0] == '\0')
+        O (fatal, *expanding_var, _("file: missing filename"));
+
+      if (argv[1])
+        O (fatal, *expanding_var, _("file: too many arguments"));
+
+      ENULLLOOP (fp, fopen (fn, "r"));
+      if (fp == NULL)
+        {
+          if (errno == ENOENT)
+            return o;
+          OSS (fatal, reading_file, _("open: %s: %s"), fn, strerror (errno));
+        }
+
+      while (1)
+        {
+          char buf[1024];
+          size_t l = fread (buf, 1, sizeof (buf), fp);
+          if (l > 0)
+            o = variable_buffer_output (o, buf, l);
+
+          if (ferror (fp))
+            if (errno != EINTR)
+              OSS (fatal, reading_file, _("read: %s: %s"), fn, strerror (errno));
+          if (feof (fp))
+            break;
+        }
+      if (fclose (fp))
+        OSS (fatal, reading_file, _("close: %s: %s"), fn, strerror (errno));
+
+      /* Remove trailing newline.  */
+      if (o > preo && o[-1] == '\n')
+        if (--o > preo && o[-1] == '\r')
+          --o;
+    }
+  else
+    OS (fatal, *expanding_var, _("file: invalid file operation: %s"), fn);
+
+  return o;
+}
+
+static char *
+func_abspath (char *o, char **argv, const char *funcname UNUSED)
+{
+  /* Expand the argument.  */
+  const char *p = argv[0];
+  const char *path = 0;
+  int doneany = 0;
+  size_t len = 0;
+
+  while ((path = find_next_token (&p, &len)) != 0)
+    {
+      if (len < GET_PATH_MAX)
+        {
+          PATH_VAR (in);
+          PATH_VAR (out);
+
+          strncpy (in, path, len);
+          in[len] = '\0';
+
+          if (abspath (in, out))
+            {
+              o = variable_buffer_output (o, out, strlen (out));
+              o = variable_buffer_output (o, " ", 1);
+              doneany = 1;
+            }
+        }
+    }
+
+  /* Kill last space.  */
+  if (doneany)
+    --o;
+
+  return o;
+}
+
+/* Lookup table for builtin functions.
+
+   This doesn't have to be sorted; we use a straight lookup.  We might gain
+   some efficiency by moving most often used functions to the start of the
+   table.
+
+   If MAXIMUM_ARGS is 0, that means there is no maximum and all
+   comma-separated values are treated as arguments.
+
+   EXPAND_ARGS means that all arguments should be expanded before invocation.
+   Functions that do namespace tricks (foreach) don't automatically expand.  */
+
+static char *func_call (char *o, char **argv, const char *funcname);
+
+#define FT_ENTRY(_name, _min, _max, _exp, _func) \
+  { { (_func) }, STRING_SIZE_TUPLE(_name), (_min), (_max), (_exp), 0 }
+
+static struct function_table_entry function_table_init[] =
+{
+ /*         Name            MIN MAX EXP? Function */
+  FT_ENTRY ("abspath",       0,  1,  1,  func_abspath),
+  FT_ENTRY ("addprefix",     2,  2,  1,  func_addsuffix_addprefix),
+  FT_ENTRY ("addsuffix",     2,  2,  1,  func_addsuffix_addprefix),
+  FT_ENTRY ("basename",      0,  1,  1,  func_basename_dir),
+  FT_ENTRY ("dir",           0,  1,  1,  func_basename_dir),
+  FT_ENTRY ("notdir",        0,  1,  1,  func_notdir_suffix),
+  FT_ENTRY ("subst",         3,  3,  1,  func_subst),
+  FT_ENTRY ("suffix",        0,  1,  1,  func_notdir_suffix),
+  FT_ENTRY ("filter",        2,  2,  1,  func_filter_filterout),
+  FT_ENTRY ("filter-out",    2,  2,  1,  func_filter_filterout),
+  FT_ENTRY ("findstring",    2,  2,  1,  func_findstring),
+  FT_ENTRY ("firstword",     0,  1,  1,  func_firstword),
+  FT_ENTRY ("flavor",        0,  1,  1,  func_flavor),
+  FT_ENTRY ("join",          2,  2,  1,  func_join),
+  FT_ENTRY ("lastword",      0,  1,  1,  func_lastword),
+  FT_ENTRY ("patsubst",      3,  3,  1,  func_patsubst),
+  FT_ENTRY ("realpath",      0,  1,  1,  func_realpath),
+  FT_ENTRY ("shell",         0,  1,  1,  func_shell),
+  FT_ENTRY ("sort",          0,  1,  1,  func_sort),
+  FT_ENTRY ("strip",         0,  1,  1,  func_strip),
+  FT_ENTRY ("wildcard",      0,  1,  1,  func_wildcard),
+  FT_ENTRY ("word",          2,  2,  1,  func_word),
+  FT_ENTRY ("wordlist",      3,  3,  1,  func_wordlist),
+  FT_ENTRY ("words",         0,  1,  1,  func_words),
+  FT_ENTRY ("origin",        0,  1,  1,  func_origin),
+  FT_ENTRY ("foreach",       3,  3,  0,  func_foreach),
+  FT_ENTRY ("call",          1,  0,  1,  func_call),
+  FT_ENTRY ("info",          0,  1,  1,  func_error),
+  FT_ENTRY ("error",         0,  1,  1,  func_error),
+  FT_ENTRY ("warning",       0,  1,  1,  func_error),
+  FT_ENTRY ("if",            2,  3,  0,  func_if),
+  FT_ENTRY ("or",            1,  0,  0,  func_or),
+  FT_ENTRY ("and",           1,  0,  0,  func_and),
+  FT_ENTRY ("value",         0,  1,  1,  func_value),
+  FT_ENTRY ("eval",          0,  1,  1,  func_eval),
+  FT_ENTRY ("file",          1,  2,  1,  func_file),
+#ifdef EXPERIMENTAL
+  FT_ENTRY ("eq",            2,  2,  1,  func_eq),
+  FT_ENTRY ("not",           0,  1,  1,  func_not),
+#endif
+};
+
+#define FUNCTION_TABLE_ENTRIES (sizeof (function_table_init) / sizeof (struct function_table_entry))
+\f
+
+/* These must come after the definition of function_table.  */
+
+static char *
+expand_builtin_function (char *o, int argc, char **argv,
+                         const struct function_table_entry *entry_p)
+{
+  char *p;
+
+  if (argc < (int)entry_p->minimum_args)
+    fatal (*expanding_var, strlen (entry_p->name),
+           _("insufficient number of arguments (%d) to function '%s'"),
+           argc, entry_p->name);
+
+  /* I suppose technically some function could do something with no arguments,
+     but so far no internal ones do, so just test it for all functions here
+     rather than in each one.  We can change it later if necessary.  */
+
+  if (!argc && !entry_p->alloc_fn)
+    return o;
+
+  if (!entry_p->fptr.func_ptr)
+    OS (fatal, *expanding_var,
+        _("unimplemented on this platform: function '%s'"), entry_p->name);
+
+  if (!entry_p->alloc_fn)
+    return entry_p->fptr.func_ptr (o, argv, entry_p->name);
+
+  /* This function allocates memory and returns it to us.
+     Write it to the variable buffer, then free it.  */
+
+  p = entry_p->fptr.alloc_func_ptr (entry_p->name, argc, argv);
+  if (p)
+    {
+      o = variable_buffer_output (o, p, strlen (p));
+      free (p);
+    }
+
+  return o;
+}
+
+/* Check for a function invocation in *STRINGP.  *STRINGP points at the
+   opening ( or { and is not null-terminated.  If a function invocation
+   is found, expand it into the buffer at *OP, updating *OP, incrementing
+   *STRINGP past the reference and returning nonzero.  If not, return zero.  */
+
+int
+handle_function (char **op, const char **stringp)
+{
+  const struct function_table_entry *entry_p;
+  char openparen = (*stringp)[0];
+  char closeparen = openparen == '(' ? ')' : '}';
+  const char *beg;
+  const char *end;
+  int count = 0;
+  char *abeg = NULL;
+  char **argv, **argvp;
+  int nargs;
+
+  beg = *stringp + 1;
+
+  entry_p = lookup_function (beg);
+
+  if (!entry_p)
+    return 0;
+
+  /* We found a builtin function.  Find the beginning of its arguments (skip
+     whitespace after the name).  */
+
+  beg += entry_p->len;
+  NEXT_TOKEN (beg);
+
+  /* Find the end of the function invocation, counting nested use of
+     whichever kind of parens we use.  Since we're looking, count commas
+     to get a rough estimate of how many arguments we might have.  The
+     count might be high, but it'll never be low.  */
+
+  for (nargs=1, end=beg; *end != '\0'; ++end)
+    if (!STOP_SET (*end, MAP_VARSEP|MAP_COMMA))
+      continue;
+    else if (*end == ',')
+      ++nargs;
+    else if (*end == openparen)
+      ++count;
+    else if (*end == closeparen && --count < 0)
+      break;
+
+  if (count >= 0)
+    fatal (*expanding_var, strlen (entry_p->name),
+           _("unterminated call to function '%s': missing '%c'"),
+           entry_p->name, closeparen);
+
+  *stringp = end;
+
+  /* Get some memory to store the arg pointers.  */
+  argvp = argv = alloca (sizeof (char *) * (nargs + 2));
+
+  /* Chop the string into arguments, then a nul.  As soon as we hit
+     MAXIMUM_ARGS (if it's >0) assume the rest of the string is part of the
+     last argument.
+
+     If we're expanding, store pointers to the expansion of each one.  If
+     not, make a duplicate of the string and point into that, nul-terminating
+     each argument.  */
+
+  if (entry_p->expand_args)
+    {
+      const char *p;
+      for (p=beg, nargs=0; p <= end; ++argvp)
+        {
+          const char *next;
+
+          ++nargs;
+
+          if (nargs == entry_p->maximum_args
+              || ((next = find_next_argument (openparen, closeparen, p, end)) == NULL))
+            next = end;
+
+          *argvp = expand_argument (p, next);
+          p = next + 1;
+        }
+    }
+  else
+    {
+      size_t len = end - beg;
+      char *p, *aend;
+
+      abeg = xmalloc (len+1);
+      memcpy (abeg, beg, len);
+      abeg[len] = '\0';
+      aend = abeg + len;
+
+      for (p=abeg, nargs=0; p <= aend; ++argvp)
+        {
+          char *next;
+
+          ++nargs;
+
+          if (nargs == entry_p->maximum_args
+              || ((next = find_next_argument (openparen, closeparen, p, aend)) == NULL))
+            next = aend;
+
+          *argvp = p;
+          *next = '\0';
+          p = next + 1;
+        }
+    }
+  *argvp = NULL;
+
+  /* Finally!  Run the function...  */
+  *op = expand_builtin_function (*op, nargs, argv, entry_p);
+
+  /* Free memory.  */
+  if (entry_p->expand_args)
+    for (argvp=argv; *argvp != 0; ++argvp)
+      free (*argvp);
+  else
+    free (abeg);
+
+  return 1;
+}
+\f
+
+/* User-defined functions.  Expand the first argument as either a builtin
+   function or a make variable, in the context of the rest of the arguments
+   assigned to $1, $2, ... $N.  $0 is the name of the function.  */
+
+static char *
+func_call (char *o, char **argv, const char *funcname UNUSED)
+{
+  static int max_args = 0;
+  char *fname;
+  char *body;
+  size_t flen;
+  int i;
+  int saved_args;
+  const struct function_table_entry *entry_p;
+  struct variable *v;
+
+  /* Clean up the name of the variable to be invoked.  */
+  fname = next_token (argv[0]);
+  end_of_token (fname)[0] = '\0';
+
+  /* Calling nothing is a no-op */
+  if (*fname == '\0')
+    return o;
+
+  /* Are we invoking a builtin function?  */
+
+  entry_p = lookup_function (fname);
+  if (entry_p)
+    {
+      /* How many arguments do we have?  */
+      for (i=0; argv[i+1]; ++i)
+        ;
+      return expand_builtin_function (o, i, argv+1, entry_p);
+    }
+
+  /* Not a builtin, so the first argument is the name of a variable to be
+     expanded and interpreted as a function.  Find it.  */
+  flen = strlen (fname);
+
+  v = lookup_variable (fname, flen);
+
+  if (v == 0)
+    warn_undefined (fname, flen);
+
+  if (v == 0 || *v->value == '\0')
+    return o;
+
+  body = alloca (flen + 4);
+  body[0] = '$';
+  body[1] = '(';
+  memcpy (body + 2, fname, flen);
+  body[flen+2] = ')';
+  body[flen+3] = '\0';
+
+  /* Set up arguments $(1) .. $(N).  $(0) is the function name.  */
+
+  push_new_variable_scope ();
+
+  for (i=0; *argv; ++i, ++argv)
+    {
+      char num[11];
+
+      sprintf (num, "%d", i);
+      define_variable (num, strlen (num), *argv, o_automatic, 0);
+    }
+
+  /* If the number of arguments we have is < max_args, it means we're inside
+     a recursive invocation of $(call ...).  Fill in the remaining arguments
+     in the new scope with the empty value, to hide them from this
+     invocation.  */
+
+  for (; i < max_args; ++i)
+    {
+      char num[11];
+
+      sprintf (num, "%d", i);
+      define_variable (num, strlen (num), "", o_automatic, 0);
+    }
+
+  /* Expand the body in the context of the arguments, adding the result to
+     the variable buffer.  */
+
+  v->exp_count = EXP_COUNT_MAX;
+
+  saved_args = max_args;
+  max_args = i;
+  o = variable_expand_string (o, body, flen+3);
+  max_args = saved_args;
+
+  v->exp_count = 0;
+
+  pop_variable_scope ();
+
+  return o + strlen (o);
+}
+
+void
+define_new_function (const floc *flocp, const char *name,
+                     unsigned int min, unsigned int max, unsigned int flags,
+                     gmk_func_ptr func)
+{
+  const char *e = name;
+  struct function_table_entry *ent;
+  size_t len;
+
+  while (STOP_SET (*e, MAP_USERFUNC))
+    e++;
+  len = e - name;
+
+  if (len == 0)
+    O (fatal, flocp, _("Empty function name"));
+  if (*name == '.' || *e != '\0')
+    OS (fatal, flocp, _("Invalid function name: %s"), name);
+  if (len > 255)
+    OS (fatal, flocp, _("Function name too long: %s"), name);
+  if (min > 255)
+    ONS (fatal, flocp,
+         _("Invalid minimum argument count (%u) for function %s"), min, name);
+  if (max > 255 || (max && max < min))
+    ONS (fatal, flocp,
+         _("Invalid maximum argument count (%u) for function %s"), max, name);
+
+  ent = xmalloc (sizeof (struct function_table_entry));
+  ent->name = name;
+  ent->len = (unsigned char) len;
+  ent->minimum_args = (unsigned char) min;
+  ent->maximum_args = (unsigned char) max;
+  ent->expand_args = ANY_SET(flags, GMK_FUNC_NOEXPAND) ? 0 : 1;
+  ent->alloc_fn = 1;
+  ent->fptr.alloc_func_ptr = func;
+
+  hash_insert (&function_table, ent);
+}
+
+void
+hash_init_function_table (void)
+{
+  hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2,
+             function_table_entry_hash_1, function_table_entry_hash_2,
+             function_table_entry_hash_cmp);
+  hash_load (&function_table, function_table_init,
+             FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry));
+}
diff --git a/src/getopt.c b/src/getopt.c
new file mode 100644 (file)
index 0000000..35e71ef
--- /dev/null
@@ -0,0 +1,1026 @@
+/* Getopt for GNU.
+NOTE: getopt is now part of the C library, so if you don't know what
+"Keep this file name-space clean" means, talk to drepper@gnu.org
+before changing it!
+
+Copyright (C) 1987-2020 Free Software Foundation, Inc.
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@gnu.org.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+# ifndef const
+#  define const
+# endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+# include <gnu-versions.h>
+# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+# include <stdlib.h>
+# include <unistd.h>
+#endif /* GNU C library.  */
+
+#ifdef VMS
+# include <unixlib.h>
+# if HAVE_STRING_H - 0
+#  include <string.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages.
+   When compiling libc, the _ macro is predefined.  */
+#include "gettext.h"
+#define _(msgid)    gettext (msgid)
+
+
+/* This version of `getopt' appears to the caller like standard Unix 'getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg = NULL;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int optind = 1;
+
+/* Formerly, initialization of getopt depended on optind==0, which
+   causes problems with re-calling getopt as programs generally don't
+   know that. */
+
+int __getopt_initialized = 0;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+# include <string.h>
+# define my_index      strchr
+#else
+
+# if HAVE_STRING_H
+#  include <string.h>
+# else
+#  include <strings.h>
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+static char *
+my_index (const char *str, int chr)
+{
+  while (*str)
+    {
+      if (*str == chr)
+       return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
+# if (!defined __STDC__ || !__STDC__) && !defined strlen
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
+# endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+\f
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+#ifdef _LIBC
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+
+static int nonoption_flags_max_len;
+static int nonoption_flags_len;
+
+static int original_argc;
+static char *const *original_argv;
+
+/* Make sure the environment variable bash 2.0 puts in the environment
+   is valid for the getopt call we must make sure that the ARGV passed
+   to getopt is that one passed to the process.  */
+static void __attribute__ ((unused))
+store_args_and_env (int argc, char *const *argv)
+{
+  /* XXX This is no good solution.  We should rather copy the args so
+     that we can compare them later.  But we must not use malloc(3).  */
+  original_argc = argc;
+  original_argv = argv;
+}
+# ifdef text_set_element
+text_set_element (__libc_subinit, store_args_and_env);
+# endif /* text_set_element */
+
+# define SWAP_FLAGS(ch1, ch2) \
+  if (nonoption_flags_len > 0)                                               \
+    {                                                                        \
+      char __tmp = __getopt_nonoption_flags[ch1];                            \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
+      __getopt_nonoption_flags[ch2] = __tmp;                                 \
+    }
+#else  /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+#if defined __STDC__ && __STDC__
+static void exchange (char **);
+#endif
+
+static void
+exchange (char **argv)
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#ifdef _LIBC
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+        presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+       nonoption_flags_len = nonoption_flags_max_len = 0;
+      else
+       {
+         memset (__mempcpy (new_str, __getopt_nonoption_flags,
+                            nonoption_flags_max_len),
+                 '\0', top + 1 - nonoption_flags_max_len);
+         nonoption_flags_max_len = top + 1;
+         __getopt_nonoption_flags = new_str;
+       }
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+       {
+         /* Bottom segment is the short one.  */
+         int len = middle - bottom;
+         register int i;
+
+         /* Swap it with the top part of the top segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[top - (middle - bottom) + i];
+             argv[top - (middle - bottom) + i] = tem;
+             SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+           }
+         /* Exclude the moved bottom segment from further swapping.  */
+         top -= len;
+       }
+      else
+       {
+         /* Top segment is the short one.  */
+         int len = top - middle;
+         register int i;
+
+         /* Swap it with the bottom part of the bottom segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[middle + i];
+             argv[middle + i] = tem;
+             SWAP_FLAGS (bottom + i, middle + i);
+           }
+         /* Exclude the moved top segment from further swapping.  */
+         bottom += len;
+       }
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+#if defined __STDC__ && __STDC__
+static const char *_getopt_initialize (int, char *const *, const char *);
+#endif
+static const char *
+_getopt_initialize (int argc, char *const *argv, const char *optstring)
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  first_nonopt = last_nonopt = optind;
+
+  nextchar = NULL;
+
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (posixly_correct != NULL)
+    ordering = REQUIRE_ORDER;
+  else
+    ordering = PERMUTE;
+
+#ifdef _LIBC
+  if (posixly_correct == NULL
+      && argc == original_argc && argv == original_argv)
+    {
+      if (nonoption_flags_max_len == 0)
+       {
+         if (__getopt_nonoption_flags == NULL
+             || __getopt_nonoption_flags[0] == '\0')
+           nonoption_flags_max_len = -1;
+         else
+           {
+             const char *orig_str = __getopt_nonoption_flags;
+             int len = nonoption_flags_max_len = strlen (orig_str);
+             if (nonoption_flags_max_len < argc)
+               nonoption_flags_max_len = argc;
+             __getopt_nonoption_flags =
+               (char *) malloc (nonoption_flags_max_len);
+             if (__getopt_nonoption_flags == NULL)
+               nonoption_flags_max_len = -1;
+             else
+               memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+                       '\0', nonoption_flags_max_len - len);
+           }
+       }
+      nonoption_flags_len = nonoption_flags_max_len;
+    }
+  else
+    nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (int argc, char *const *argv, const char *optstring,
+                  const struct option *longopts, int *longind, int long_only)
+{
+  optarg = NULL;
+
+  if (optind == 0 || !__getopt_initialized)
+    {
+      if (optind == 0)
+       optind = 1;     /* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring);
+      __getopt_initialized = 1;
+    }
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#ifdef _LIBC
+# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0'              \
+                     || (optind < nonoption_flags_len                        \
+                         && __getopt_nonoption_flags[optind] == '1'))
+#else
+# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#endif
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+        moved back by the user (who may also have changed the arguments).  */
+      if (last_nonopt > optind)
+       last_nonopt = optind;
+      if (first_nonopt > optind)
+       first_nonopt = optind;
+
+      if (ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (last_nonopt != optind)
+           first_nonopt = optind;
+
+         /* Skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (optind < argc && NONOPTION_P)
+           optind++;
+         last_nonopt = optind;
+       }
+
+      /* The special ARGV-element `--' means premature end of options.
+        Skip it like a null option,
+        then exchange with previous non-options as if it were an option,
+        then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+       {
+         optind++;
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (first_nonopt == last_nonopt)
+           first_nonopt = optind;
+         last_nonopt = argc;
+
+         optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+        and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (first_nonopt != last_nonopt)
+           optind = first_nonopt;
+         return -1;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+        either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+       {
+         if (ordering == REQUIRE_ORDER)
+           return -1;
+         optarg = argv[optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+        Skip the initial punctuation.  */
+
+      nextchar = (argv[optind] + 1
+                 + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[optind][1] == '-'
+         || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+    {
+      char *nameend;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+       /* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+        or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+       if (!strncmp (p->name, nextchar, nameend - nextchar))
+         {
+           if ((unsigned int) (nameend - nextchar)
+               == (unsigned int) strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else
+             /* Second or later nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (opterr)
+           fprintf (stderr, _("%s: option '%s' is ambiguous\n"),
+                    argv[0], argv[optind]);
+         nextchar += strlen (nextchar);
+         optind++;
+         optopt = 0;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         optind++;
+         if (*nameend)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               optarg = nameend + 1;
+             else
+               {
+                 if (opterr)
+                  if (argv[optind - 1][1] == '-')
+                   /* --option */
+                   fprintf (stderr,
+                    _("%s: option '--%s' doesn't allow an argument\n"),
+                    argv[0], pfound->name);
+                  else
+                   /* +option or -option */
+                   fprintf (stderr,
+                    _("%s: option '%c%s' doesn't allow an argument\n"),
+                    argv[0], argv[optind - 1][0], pfound->name);
+
+                 nextchar += strlen (nextchar);
+
+                 optopt = pfound->val;
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (optind < argc)
+               optarg = argv[optind++];
+             else
+               {
+                 if (opterr)
+                   fprintf (stderr,
+                          _("%s: option '%s' requires an argument\n"),
+                          argv[0], argv[optind - 1]);
+                 nextchar += strlen (nextchar);
+                 optopt = pfound->val;
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         nextchar += strlen (nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+        or the option starts with '--' or is not a valid short
+        option, then it's an error.
+        Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+         || my_index (optstring, *nextchar) == NULL)
+       {
+         if (opterr)
+           {
+             if (argv[optind][1] == '-')
+               /* --option */
+               fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
+                        argv[0], nextchar);
+             else
+               /* +option or -option */
+               fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
+                        argv[0], argv[optind][0], nextchar);
+           }
+         nextchar = (char *) "";
+         optind++;
+         optopt = 0;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (opterr)
+         {
+           if (posixly_correct)
+             /* 1003.2 specifies the format of this message.  */
+             fprintf (stderr, _("%s: illegal option -- %c\n"),
+                      argv[0], c);
+           else
+             fprintf (stderr, _("%s: invalid option -- %c\n"),
+                      argv[0], c);
+         }
+       optopt = c;
+       return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+       char *nameend;
+       const struct option *p;
+       const struct option *pfound = NULL;
+       int exact = 0;
+       int ambig = 0;
+       int indfound = 0;
+       int option_index;
+
+       /* This is an option that requires an argument.  */
+       if (*nextchar != '\0')
+         {
+           optarg = nextchar;
+           /* If we end this ARGV-element by taking the rest as an arg,
+              we must advance to the next element now.  */
+           optind++;
+         }
+       else if (optind == argc)
+         {
+           if (opterr)
+             {
+               /* 1003.2 specifies the format of this message.  */
+               fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+                        argv[0], c);
+             }
+           optopt = c;
+           if (optstring[0] == ':')
+             c = ':';
+           else
+             c = '?';
+           return c;
+         }
+       else
+         /* We already incremented `optind' once;
+            increment it again when taking next ARGV-elt as argument.  */
+         optarg = argv[optind++];
+
+       /* optarg is now the argument, see if it's in the
+          table of longopts.  */
+
+       for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
+         /* Do nothing.  */ ;
+
+       /* Test all long options for either exact match
+          or abbreviated matches.  */
+       for (p = longopts, option_index = 0; p->name; p++, option_index++)
+         if (!strncmp (p->name, nextchar, nameend - nextchar))
+           {
+             if ((unsigned int) (nameend - nextchar) == strlen (p->name))
+               {
+                 /* Exact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+                 exact = 1;
+                 break;
+               }
+             else if (pfound == NULL)
+               {
+                 /* First nonexact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+               }
+             else
+               /* Second or later nonexact match found.  */
+               ambig = 1;
+           }
+       if (ambig && !exact)
+         {
+           if (opterr)
+             fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
+                      argv[0], argv[optind]);
+           nextchar += strlen (nextchar);
+           optind++;
+           return '?';
+         }
+       if (pfound != NULL)
+         {
+           option_index = indfound;
+           if (*nameend)
+             {
+               /* Don't test has_arg with >, because some C compilers don't
+                  allow it to be used on enums.  */
+               if (pfound->has_arg)
+                 optarg = nameend + 1;
+               else
+                 {
+                   if (opterr)
+                     fprintf (stderr, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+                              argv[0], pfound->name);
+
+                   nextchar += strlen (nextchar);
+                   return '?';
+                 }
+             }
+           else if (pfound->has_arg == 1)
+             {
+               if (optind < argc)
+                 optarg = argv[optind++];
+               else
+                 {
+                   if (opterr)
+                     fprintf (stderr,
+                              _("%s: option '%s' requires an argument\n"),
+                              argv[0], argv[optind - 1]);
+                   nextchar += strlen (nextchar);
+                   return optstring[0] == ':' ? ':' : '?';
+                 }
+             }
+           nextchar += strlen (nextchar);
+           if (longind != NULL)
+             *longind = option_index;
+           if (pfound->flag)
+             {
+               *(pfound->flag) = pfound->val;
+               return 0;
+             }
+           return pfound->val;
+         }
+         nextchar = NULL;
+         return 'W';   /* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               optind++;
+             }
+           else
+             optarg = NULL;
+           nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               optind++;
+             }
+           else if (optind == argc)
+             {
+               if (opterr)
+                 {
+                   /* 1003.2 specifies the format of this message.  */
+                   fprintf (stderr,
+                          _("%s: option requires an argument -- %c\n"),
+                          argv[0], c);
+                 }
+               optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             optarg = argv[optind++];
+           nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct option *) 0,
+                          (int *) 0,
+                          0);
+}
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (int argc, char **argv)
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value '%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/src/getopt.h b/src/getopt.h
new file mode 100644 (file)
index 0000000..abfc31e
--- /dev/null
@@ -0,0 +1,130 @@
+/* Declarations for getopt.
+Copyright (C) 1989-2020 Free Software Foundation, Inc.
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@gnu.org.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if defined (__STDC__) && __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if defined (__STDC__) && __STDC__
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* getopt.h */
diff --git a/src/getopt1.c b/src/getopt1.c
new file mode 100644 (file)
index 0000000..0bef6b0
--- /dev/null
@@ -0,0 +1,176 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+Copyright (C) 1987-1994, 1996-2020 Free Software Foundation, Inc.
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@gnu.org.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+\f
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "getopt.h"
+
+#if !defined __STDC__ || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (int argc, char *const *argv, const char *options,
+             const struct option *long_options, int *opt_index)
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (int argc, char *const *argv, const char *options,
+                  const struct option *long_options, int *opt_index)
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (optarg)
+           printf (" with arg %s", optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value '%s'\n", optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value '%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/src/gettext.h b/src/gettext.h
new file mode 100644 (file)
index 0000000..8647b37
--- /dev/null
@@ -0,0 +1,57 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+Copyright (C) 1995-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option.  */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions.  */
+# include <libintl.h>
+
+#else
+
+/* Disabled NLS.
+   The casts to 'const char *' serve the purpose of producing warnings
+   for invalid uses of the value returned from these functions.
+   On pre-ANSI systems without 'const', the config.h file is supposed to
+   contain "#define const".  */
+# define gettext(Msgid) ((const char *) (Msgid))
+# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
+# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
+# define ngettext(Msgid1, Msgid2, N) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
+
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+   extraction of messages, but does not call gettext().  The run-time
+   translation is done at a different place in the code.
+   The argument, String, should be a literal string.  Concatenated strings
+   and other string expressions won't work.
+   The macro's expansion is not parenthesized, so that it is suitable as
+   initializer for static 'char[]' or 'const char[]' variables.  */
+#define gettext_noop(String) String
+
+#endif /* _LIBGETTEXT_H */
diff --git a/src/gmk-default.h b/src/gmk-default.h
new file mode 100644 (file)
index 0000000..9fa09a6
--- /dev/null
@@ -0,0 +1,28 @@
+static const char *const GUILE_module_defn = " \
+(define (to-string-maybe x) \
+  (cond \
+   ((or (not x) \
+        (unspecified? x) \
+        (variable? x) \
+        (null? x) \
+        (and (string? x) (string-null? x))) \
+    #f) \
+   ((eq? x #t) \"#t\") \
+   ((or (symbol? x) (number? x)) \
+    (object->string x)) \
+   ((char? x) \
+    (string x)) \
+   ((and (string? x) (string-every char-set:printing x)) \
+    x) \
+   (else (error \"Unknown object:\" x)))) \
+(define (obj-to-str x) \
+  (let ((acc '())) \
+    (define (walk x) \
+      (cond ((pair? x) (walk (car x)) (walk (cdr x))) \
+            ((to-string-maybe x) => (lambda (s) (set! acc (cons s acc)))))) \
+    (walk x) \
+    (string-join (reverse! acc)))) \
+(define (gmk-var v) \
+  (gmk-expand (format #f \"$(~a)\" (obj-to-str v)))) \
+(export gmk-expand gmk-eval gmk-var) \
+";
diff --git a/src/gmk-default.scm b/src/gmk-default.scm
new file mode 100644 (file)
index 0000000..ffcea6b
--- /dev/null
@@ -0,0 +1,53 @@
+;; Contents of the (gnu make) Guile module
+;; Copyright (C) 2011-2020 Free Software Foundation, Inc.
+;; This file is part of GNU Make.
+;;
+;; GNU Make is free software; you can redistribute it and/or modify it under
+;; the terms of the GNU General Public License as published by the Free
+;; Software Foundation; either version 3 of the License, or (at your option)
+;; any later version.
+;;
+;; GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+;; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+;; FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+;; details.
+;;
+;; You should have received a copy of the GNU General Public License along
+;; with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+(define (to-string-maybe x)
+  (cond
+   ;; In GNU make, "false" is the empty string
+   ((or (not x)
+        (unspecified? x)
+        (variable? x)
+        (null? x)
+        (and (string? x) (string-null? x)))
+    #f)
+   ;; We want something not false... not sure about this
+   ((eq? x #t) "#t")
+   ;; Basics
+   ((or (symbol? x) (number? x))
+    (object->string x))
+   ((char? x)
+    (string x))
+   ;; Printable string (no special characters)
+   ((and (string? x) (string-every char-set:printing x))
+    x)
+   ;; No idea: fail
+   (else (error "Unknown object:" x))))
+
+(define (obj-to-str x)
+  (let ((acc '()))
+    (define (walk x)
+      (cond ((pair? x) (walk (car x)) (walk (cdr x)))
+            ((to-string-maybe x) => (lambda (s) (set! acc (cons s acc))))))
+    (walk x)
+    (string-join (reverse! acc))))
+
+;; Return the value of the GNU make variable V
+(define (gmk-var v)
+  (gmk-expand (format #f "$(~a)" (obj-to-str v))))
+
+;; Export the public interfaces
+(export gmk-expand gmk-eval gmk-var)
diff --git a/src/gnumake.h b/src/gnumake.h
new file mode 100644 (file)
index 0000000..fe0f7f3
--- /dev/null
@@ -0,0 +1,79 @@
+/* External interfaces usable by dynamic objects loaded into GNU Make.
+   --THIS API IS A "TECHNOLOGY PREVIEW" ONLY.  IT IS NOT A STABLE INTERFACE--
+
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GNUMAKE_H_
+#define _GNUMAKE_H_
+
+/* Specify the location of elements read from makefiles.  */
+typedef struct
+  {
+    const char *filenm;
+    unsigned long lineno;
+  } gmk_floc;
+
+typedef char *(*gmk_func_ptr)(const char *nm, unsigned int argc, char **argv);
+
+#ifdef _WIN32
+# ifdef GMK_BUILDING_MAKE
+#  define GMK_EXPORT  __declspec(dllexport)
+# else
+#  define GMK_EXPORT  __declspec(dllimport)
+# endif
+#else
+# define GMK_EXPORT
+#endif
+
+/* Free memory returned by the gmk_expand() function.  */
+GMK_EXPORT void gmk_free (char *str);
+
+/* Allocate memory in GNU make's context.  */
+GMK_EXPORT char *gmk_alloc (unsigned int len);
+
+/* Run $(eval ...) on the provided string BUFFER.  */
+GMK_EXPORT void gmk_eval (const char *buffer, const gmk_floc *floc);
+
+/* Run GNU make expansion on the provided string STR.
+   Returns an allocated buffer that the caller must free with gmk_free().  */
+GMK_EXPORT char *gmk_expand (const char *str);
+
+/* Register a new GNU make function NAME (maximum of 255 chars long).
+   When the function is expanded in the makefile, FUNC will be invoked with
+   the appropriate arguments.
+
+   The return value of FUNC must be either NULL, in which case it expands to
+   the empty string, or a pointer to the result of the expansion in a string
+   created by gmk_alloc().  GNU make will free the memory when it's done.
+
+   MIN_ARGS is the minimum number of arguments the function requires.
+   MAX_ARGS is the maximum number of arguments (or 0 if there's no maximum).
+   MIN_ARGS and MAX_ARGS may not exceed 255.
+
+   The FLAGS value may be GMK_FUNC_DEFAULT, or one or more of the following
+   flags OR'd together:
+
+     GMK_FUNC_NOEXPAND: the arguments to the function will be not be expanded
+                        before FUNC is called.
+*/
+GMK_EXPORT void gmk_add_function (const char *name, gmk_func_ptr func,
+                                  unsigned int min_args, unsigned int max_args,
+                                  unsigned int flags);
+
+#define GMK_FUNC_DEFAULT    0x00
+#define GMK_FUNC_NOEXPAND   0x01
+
+#endif  /* _GNUMAKE_H_ */
diff --git a/src/guile.c b/src/guile.c
new file mode 100644 (file)
index 0000000..52f0e5c
--- /dev/null
@@ -0,0 +1,159 @@
+/* GNU Guile interface for GNU Make.
+Copyright (C) 2011-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#ifdef HAVE_GUILE
+
+#include "gnumake.h"
+
+#include "debug.h"
+#include "filedef.h"
+#include "dep.h"
+#include "variable.h"
+
+#include <libguile.h>
+
+/* Pre-2.0 versions of Guile don't have a typedef for gsubr function types.  */
+#if SCM_MAJOR_VERSION < 2
+# define GSUBR_TYPE         SCM (*) ()
+/* Guile 1.x doesn't really support i18n.  */
+# define EVAL_STRING(_s)    scm_c_eval_string (_s)
+#else
+# define GSUBR_TYPE         scm_t_subr
+# define EVAL_STRING(_s)    scm_eval_string (scm_from_utf8_string (_s))
+#endif
+
+static SCM make_mod = SCM_EOL;
+static SCM obj_to_str = SCM_EOL;
+
+/* Convert an SCM object into a string.  */
+static char *
+cvt_scm_to_str (SCM obj)
+{
+  return scm_to_locale_string (scm_call_1 (obj_to_str, obj));
+}
+
+/* Perform the GNU make expansion function.  */
+static SCM
+guile_expand_wrapper (SCM obj)
+{
+  char *str = cvt_scm_to_str (obj);
+  SCM ret;
+  char *res;
+
+  DB (DB_BASIC, (_("guile: Expanding '%s'\n"), str));
+  res = gmk_expand (str);
+  ret = scm_from_locale_string (res);
+
+  free (str);
+  free (res);
+
+  return ret;
+}
+
+/* Perform the GNU make eval function.  */
+static SCM
+guile_eval_wrapper (SCM obj)
+{
+  char *str = cvt_scm_to_str (obj);
+
+  DB (DB_BASIC, (_("guile: Evaluating '%s'\n"), str));
+  gmk_eval (str, 0);
+
+  return SCM_BOOL_F;
+}
+
+/* Invoked by scm_c_define_module(), in the context of the GNU make module.  */
+static void
+guile_define_module (void *data UNUSED)
+{
+/* Ingest the predefined Guile module for GNU make.  */
+#include "gmk-default.h"
+
+  /* Register a subr for GNU make's eval capability.  */
+  scm_c_define_gsubr ("gmk-expand", 1, 0, 0, (GSUBR_TYPE) guile_expand_wrapper);
+
+  /* Register a subr for GNU make's eval capability.  */
+  scm_c_define_gsubr ("gmk-eval", 1, 0, 0, (GSUBR_TYPE) guile_eval_wrapper);
+
+  /* Define the rest of the module.  */
+  scm_c_eval_string (GUILE_module_defn);
+}
+
+/* Initialize the GNU make Guile module.  */
+static void *
+guile_init (void *arg UNUSED)
+{
+  /* Define the module.  */
+  make_mod = scm_c_define_module ("gnu make", guile_define_module, NULL);
+
+  /* Get a reference to the object-to-string translator, for later.  */
+  obj_to_str = scm_variable_ref (scm_c_module_lookup (make_mod, "obj-to-str"));
+
+  /* Import the GNU make module exports into the generic space.  */
+  scm_c_eval_string ("(use-modules (gnu make))");
+
+  return NULL;
+}
+
+static void *
+internal_guile_eval (void *arg)
+{
+  return cvt_scm_to_str (EVAL_STRING (arg));
+}
+
+/* This is the function registered with make  */
+static char *
+func_guile (const char *funcname UNUSED, unsigned int argc UNUSED, char **argv)
+{
+  static int init = 0;
+
+  if (! init)
+    {
+      /* Initialize the Guile interpreter.  */
+      scm_with_guile (guile_init, NULL);
+      init = 1;
+    }
+
+  if (argv[0] && argv[0][0] != '\0')
+    return scm_with_guile (internal_guile_eval, argv[0]);
+
+  return NULL;
+}
+
+/* ----- Public interface ----- */
+
+/* We could send the flocp to define_new_function(), but since guile is
+   "kind of" built-in, that didn't seem so useful.  */
+int
+guile_gmake_setup (const floc *flocp UNUSED)
+{
+  /* Create a make function "guile".  */
+  gmk_add_function ("guile", func_guile, 0, 1, GMK_FUNC_DEFAULT);
+
+  return 1;
+}
+
+#else
+
+int
+guile_gmake_setup (const floc *flocp UNUSED)
+{
+  return 1;
+}
+
+#endif
diff --git a/src/hash.c b/src/hash.c
new file mode 100644 (file)
index 0000000..004097d
--- /dev/null
@@ -0,0 +1,495 @@
+/* hash.c -- hash table maintenance
+Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc.
+Written by Greg McGary <gkm@gnu.org> <greg@mcgary.org>
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "hash.h"
+#include <assert.h>
+
+#define CALLOC(t, n) ((t *) xcalloc (sizeof (t) * (n)))
+#define MALLOC(t, n) ((t *) xmalloc (sizeof (t) * (n)))
+#define REALLOC(o, t, n) ((t *) xrealloc ((o), sizeof (t) * (n)))
+#define CLONE(o, t, n) ((t *) memcpy (MALLOC (t, (n)), (o), sizeof (t) * (n)))
+
+static void hash_rehash __P((struct hash_table* ht));
+static unsigned long round_up_2 __P((unsigned long rough));
+
+/* Implement double hashing with open addressing.  The table size is
+   always a power of two.  The secondary ('increment') hash function
+   is forced to return an odd-value, in order to be relatively prime
+   to the table size.  This guarantees that the increment can
+   potentially hit every slot in the table during collision
+   resolution.  */
+
+void *hash_deleted_item = &hash_deleted_item;
+
+/* Force the table size to be a power of two, possibly rounding up the
+   given size.  */
+
+void
+hash_init (struct hash_table *ht, unsigned long size,
+           hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp)
+{
+  ht->ht_size = round_up_2 (size);
+  ht->ht_empty_slots = ht->ht_size;
+  ht->ht_vec = (void**) CALLOC (struct token *, ht->ht_size);
+  if (ht->ht_vec == 0)
+    {
+      fprintf (stderr, _("can't allocate %lu bytes for hash table: memory exhausted"),
+               ht->ht_size * (unsigned long) sizeof (struct token *));
+      exit (MAKE_TROUBLE);
+    }
+
+  ht->ht_capacity = ht->ht_size - (ht->ht_size / 16); /* 93.75% loading factor */
+  ht->ht_fill = 0;
+  ht->ht_collisions = 0;
+  ht->ht_lookups = 0;
+  ht->ht_rehashes = 0;
+  ht->ht_hash_1 = hash_1;
+  ht->ht_hash_2 = hash_2;
+  ht->ht_compare = hash_cmp;
+}
+
+/* Load an array of items into 'ht'.  */
+
+void
+hash_load (struct hash_table *ht, void *item_table,
+           unsigned long cardinality, unsigned long size)
+{
+  char *items = (char *) item_table;
+  while (cardinality--)
+    {
+      hash_insert (ht, items);
+      items += size;
+    }
+}
+
+/* Returns the address of the table slot matching 'key'.  If 'key' is
+   not found, return the address of an empty slot suitable for
+   inserting 'key'.  The caller is responsible for incrementing
+   ht_fill on insertion.  */
+
+void **
+hash_find_slot (struct hash_table *ht, const void *key)
+{
+  void **slot;
+  void **deleted_slot = 0;
+  unsigned int hash_2 = 0;
+  unsigned int hash_1 = (*ht->ht_hash_1) (key);
+
+  ht->ht_lookups++;
+  for (;;)
+    {
+      hash_1 &= (ht->ht_size - 1);
+      slot = &ht->ht_vec[hash_1];
+
+      if (*slot == 0)
+        return (deleted_slot ? deleted_slot : slot);
+      if (*slot == hash_deleted_item)
+        {
+          if (deleted_slot == 0)
+            deleted_slot = slot;
+        }
+      else
+        {
+          if (key == *slot)
+            return slot;
+          if ((*ht->ht_compare) (key, *slot) == 0)
+            return slot;
+          ht->ht_collisions++;
+        }
+      if (!hash_2)
+          hash_2 = (*ht->ht_hash_2) (key) | 1;
+      hash_1 += hash_2;
+    }
+}
+
+void *
+hash_find_item (struct hash_table *ht, const void *key)
+{
+  void **slot = hash_find_slot (ht, key);
+  return ((HASH_VACANT (*slot)) ? 0 : *slot);
+}
+
+void *
+hash_insert (struct hash_table *ht, const void *item)
+{
+  void **slot = hash_find_slot (ht, item);
+  const void *old_item = *slot;
+  hash_insert_at (ht, item, slot);
+  return (void *)((HASH_VACANT (old_item)) ? 0 : old_item);
+}
+
+void *
+hash_insert_at (struct hash_table *ht, const void *item, const void *slot)
+{
+  const void *old_item = *(void **) slot;
+  if (HASH_VACANT (old_item))
+    {
+      ht->ht_fill++;
+      if (old_item == 0)
+        ht->ht_empty_slots--;
+      old_item = item;
+    }
+  *(void const **) slot = item;
+  if (ht->ht_empty_slots < ht->ht_size - ht->ht_capacity)
+    {
+      hash_rehash (ht);
+      return (void *) hash_find_slot (ht, item);
+    }
+  else
+    return (void *) slot;
+}
+
+void *
+hash_delete (struct hash_table *ht, const void *item)
+{
+  void **slot = hash_find_slot (ht, item);
+  return hash_delete_at (ht, slot);
+}
+
+void *
+hash_delete_at (struct hash_table *ht, const void *slot)
+{
+  void *item = *(void **) slot;
+  if (!HASH_VACANT (item))
+    {
+      *(void const **) slot = hash_deleted_item;
+      ht->ht_fill--;
+      return item;
+    }
+  else
+    return 0;
+}
+
+void
+hash_free_items (struct hash_table *ht)
+{
+  void **vec = ht->ht_vec;
+  void **end = &vec[ht->ht_size];
+  for (; vec < end; vec++)
+    {
+      void *item = *vec;
+      if (!HASH_VACANT (item))
+        free (item);
+      *vec = 0;
+    }
+  ht->ht_fill = 0;
+  ht->ht_empty_slots = ht->ht_size;
+}
+
+void
+hash_delete_items (struct hash_table *ht)
+{
+  void **vec = ht->ht_vec;
+  void **end = &vec[ht->ht_size];
+  for (; vec < end; vec++)
+    *vec = 0;
+  ht->ht_fill = 0;
+  ht->ht_collisions = 0;
+  ht->ht_lookups = 0;
+  ht->ht_rehashes = 0;
+  ht->ht_empty_slots = ht->ht_size;
+}
+
+void
+hash_free (struct hash_table *ht, int free_items)
+{
+  if (free_items)
+    hash_free_items (ht);
+  else
+    {
+      ht->ht_fill = 0;
+      ht->ht_empty_slots = ht->ht_size;
+    }
+  free (ht->ht_vec);
+  ht->ht_vec = 0;
+  ht->ht_capacity = 0;
+}
+
+void
+hash_map (struct hash_table *ht, hash_map_func_t map)
+{
+  void **slot;
+  void **end = &ht->ht_vec[ht->ht_size];
+
+  for (slot = ht->ht_vec; slot < end; slot++)
+    {
+      if (!HASH_VACANT (*slot))
+        (*map) (*slot);
+    }
+}
+
+void
+hash_map_arg (struct hash_table *ht, hash_map_arg_func_t map, void *arg)
+{
+  void **slot;
+  void **end = &ht->ht_vec[ht->ht_size];
+
+  for (slot = ht->ht_vec; slot < end; slot++)
+    {
+      if (!HASH_VACANT (*slot))
+        (*map) (*slot, arg);
+    }
+}
+
+/* Double the size of the hash table in the event of overflow... */
+
+static void
+hash_rehash (struct hash_table *ht)
+{
+  unsigned long old_ht_size = ht->ht_size;
+  void **old_vec = ht->ht_vec;
+  void **ovp;
+
+  if (ht->ht_fill >= ht->ht_capacity)
+    {
+      ht->ht_size *= 2;
+      ht->ht_capacity = ht->ht_size - (ht->ht_size >> 4);
+    }
+  ht->ht_rehashes++;
+  ht->ht_vec = (void **) CALLOC (struct token *, ht->ht_size);
+
+  for (ovp = old_vec; ovp < &old_vec[old_ht_size]; ovp++)
+    {
+      if (! HASH_VACANT (*ovp))
+        {
+          void **slot = hash_find_slot (ht, *ovp);
+          *slot = *ovp;
+        }
+    }
+  ht->ht_empty_slots = ht->ht_size - ht->ht_fill;
+  free (old_vec);
+}
+
+void
+hash_print_stats (struct hash_table *ht, FILE *out_FILE)
+{
+  fprintf (out_FILE, _("Load=%lu/%lu=%.0f%%, "), ht->ht_fill, ht->ht_size,
+           100.0 * (double) ht->ht_fill / (double) ht->ht_size);
+  fprintf (out_FILE, _("Rehash=%u, "), ht->ht_rehashes);
+  fprintf (out_FILE, _("Collisions=%lu/%lu=%.0f%%"), ht->ht_collisions, ht->ht_lookups,
+           (ht->ht_lookups
+            ? (100.0 * (double) ht->ht_collisions / (double) ht->ht_lookups)
+            : 0));
+}
+
+/* Dump all items into a NULL-terminated vector.  Use the
+   user-supplied vector, or malloc one.  */
+
+void **
+hash_dump (struct hash_table *ht, void **vector_0, qsort_cmp_t compare)
+{
+  void **vector;
+  void **slot;
+  void **end = &ht->ht_vec[ht->ht_size];
+
+  if (vector_0 == 0)
+    vector_0 = MALLOC (void *, ht->ht_fill + 1);
+  vector = vector_0;
+
+  for (slot = ht->ht_vec; slot < end; slot++)
+    if (!HASH_VACANT (*slot))
+      *vector++ = *slot;
+  *vector = 0;
+
+  if (compare)
+    qsort (vector_0, ht->ht_fill, sizeof (void *), compare);
+  return vector_0;
+}
+
+/* Round a given number up to the nearest power of 2. */
+
+static unsigned long
+round_up_2 (unsigned long n)
+{
+  n |= (n >> 1);
+  n |= (n >> 2);
+  n |= (n >> 4);
+  n |= (n >> 8);
+  n |= (n >> 16);
+
+#if !defined(HAVE_LIMITS_H) || ULONG_MAX > 4294967295
+  /* We only need this on systems where unsigned long is >32 bits.  */
+  n |= (n >> 32);
+#endif
+
+  return n + 1;
+}
+
+#define rol32(v, n) \
+        ((v) << (n) | ((v) >> (32 - (n))))
+
+/* jhash_mix -- mix 3 32-bit values reversibly. */
+#define jhash_mix(a, b, c)                      \
+{                                               \
+        a -= c;  a ^= rol32(c, 4);  c += b;     \
+        b -= a;  b ^= rol32(a, 6);  a += c;     \
+        c -= b;  c ^= rol32(b, 8);  b += a;     \
+        a -= c;  a ^= rol32(c, 16); c += b;     \
+        b -= a;  b ^= rol32(a, 19); a += c;     \
+        c -= b;  c ^= rol32(b, 4);  b += a;     \
+}
+
+/* jhash_final - final mixing of 3 32-bit values (a,b,c) into c */
+#define jhash_final(a, b, c)                    \
+{                                               \
+        c ^= b; c -= rol32(b, 14);              \
+        a ^= c; a -= rol32(c, 11);              \
+        b ^= a; b -= rol32(a, 25);              \
+        c ^= b; c -= rol32(b, 16);              \
+        a ^= c; a -= rol32(c, 4);               \
+        b ^= a; b -= rol32(a, 14);              \
+        c ^= b; c -= rol32(b, 24);              \
+}
+
+/* An arbitrary initial parameter */
+#define JHASH_INITVAL           0xdeadbeef
+
+#define sum_get_unaligned_32(r, p)              \
+  do {                                          \
+    unsigned int val;                           \
+    memcpy(&val, (p), 4);                       \
+    r += val;                                   \
+  } while(0);
+
+unsigned int
+jhash(unsigned const char *k, int length)
+{
+  unsigned int a, b, c;
+
+  /* Set up the internal state */
+  a = b = c = JHASH_INITVAL + length;
+
+  /* All but the last block: affect some 32 bits of (a,b,c) */
+  while (length > 12) {
+    sum_get_unaligned_32(a, k);
+    sum_get_unaligned_32(b, k + 4);
+    sum_get_unaligned_32(c, k + 8);
+    jhash_mix(a, b, c);
+    length -= 12;
+    k += 12;
+  }
+
+  if (!length)
+    return c;
+
+  if (length > 8)
+    {
+      sum_get_unaligned_32(a, k);
+      length -= 4;
+      k += 4;
+    }
+  if (length > 4)
+    {
+      sum_get_unaligned_32(b, k);
+      length -= 4;
+      k += 4;
+    }
+
+  if (length == 4)
+    c += (unsigned)k[3]<<24;
+  if (length >= 3)
+    c += (unsigned)k[2]<<16;
+  if (length >= 2)
+    c += (unsigned)k[1]<<8;
+  c += k[0];
+  jhash_final(a, b, c);
+  return c;
+}
+
+#define UINTSZ sizeof (unsigned int)
+
+#ifdef WORDS_BIGENDIAN
+/* The ifs are ordered from the first byte in memory to the last.  */
+#define sum_up_to_nul(r, p, plen, flag)   \
+  do {                                    \
+    unsigned int val = 0;                 \
+    size_t pn = (plen);                   \
+    size_t n = pn < UINTSZ ? pn : UINTSZ; \
+    memcpy (&val, (p), n);                \
+    if ((val & 0xFF000000) == 0)          \
+      flag = 1;                           \
+    else if ((val & 0xFF0000) == 0)       \
+      r += val & ~0xFFFF, flag = 1;       \
+    else if ((val & 0xFF00) == 0)         \
+      r += val & ~0xFF, flag = 1;         \
+    else                                  \
+      r += val, flag = (val & 0xFF) == 0; \
+  } while (0)
+#else
+/* First detect the presence of zeroes.  If there is none, we can
+   sum the 4 bytes directly.  Otherwise, the ifs are ordered as in the
+   big endian case, from the first byte in memory to the last.  */
+#define sum_up_to_nul(r, p, plen, flag)              \
+  do {                                               \
+    unsigned int val = 0;                            \
+    size_t pn = (plen);                              \
+    size_t n = pn < UINTSZ ? pn : UINTSZ;            \
+    memcpy (&val, (p), n);                           \
+    flag = ((val - 0x01010101) & ~val) & 0x80808080; \
+    if (!flag)                                       \
+      r += val;                                      \
+    else if (val & 0xFF)                             \
+      {                                              \
+        if ((val & 0xFF00) == 0)                     \
+          r += val & 0xFF;                           \
+        else if ((val & 0xFF0000) == 0)              \
+          r += val & 0xFFFF;                         \
+        else                                         \
+          r += val;                                  \
+      }                                              \
+  } while (0)
+#endif
+
+unsigned int
+jhash_string(unsigned const char *k)
+{
+  unsigned int a, b, c;
+  unsigned int have_nul = 0;
+  unsigned const char *start = k;
+  size_t klen = strlen ((const char*)k);
+
+  /* Set up the internal state */
+  a = b = c = JHASH_INITVAL;
+
+  /* All but the last block: affect some 32 bits of (a,b,c) */
+  for (;;) {
+    sum_up_to_nul(a, k, klen, have_nul);
+    if (have_nul)
+      break;
+    k += UINTSZ;
+    assert (klen >= UINTSZ);
+    klen -= UINTSZ;
+
+    sum_up_to_nul(b, k, klen, have_nul);
+    if (have_nul)
+      break;
+    k += UINTSZ;
+    assert (klen >= UINTSZ);
+    klen -= UINTSZ;
+
+    sum_up_to_nul(c, k, klen, have_nul);
+    if (have_nul)
+      break;
+    k += UINTSZ;
+    assert (klen >= UINTSZ);
+    klen -= UINTSZ;
+    jhash_mix(a, b, c);
+  }
+
+  jhash_final(a, b, c);
+  return c + (unsigned) (k - start);
+}
diff --git a/src/hash.h b/src/hash.h
new file mode 100644 (file)
index 0000000..667d650
--- /dev/null
@@ -0,0 +1,234 @@
+/* hash.h -- decls for hash table
+Copyright (C) 1995, 1999, 2002, 2010 Free Software Foundation, Inc.
+Written by Greg McGary <gkm@gnu.org> <greg@mcgary.org>
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _hash_h_
+#define _hash_h_
+
+#include <stdio.h>
+#include <ctype.h>
+
+#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
+# if !defined __GLIBC__ || !defined __P
+#  undef       __P
+#  define __P(protos)  protos
+# endif
+#else /* Not C++ or ANSI C.  */
+# undef        __P
+# define __P(protos)   ()
+/* We can get away without defining 'const' here only because in this file
+   it is used only inside the prototype for 'fnmatch', which is elided in
+   non-ANSI C where 'const' is problematical.  */
+#endif /* C++ or ANSI C.  */
+
+typedef unsigned long (*hash_func_t) __P((void const *key));
+typedef int (*hash_cmp_func_t) __P((void const *x, void const *y));
+typedef void (*hash_map_func_t) __P((void const *item));
+typedef void (*hash_map_arg_func_t) __P((void const *item, void *arg));
+
+struct hash_table
+{
+  void **ht_vec;
+  hash_func_t ht_hash_1;       /* primary hash function */
+  hash_func_t ht_hash_2;       /* secondary hash function */
+  hash_cmp_func_t ht_compare;  /* comparison function */
+  unsigned long ht_size;       /* total number of slots (power of 2) */
+  unsigned long ht_capacity;   /* usable slots, limited by loading-factor */
+  unsigned long ht_fill;       /* items in table */
+  unsigned long ht_empty_slots;        /* empty slots not including deleted slots */
+  unsigned long ht_collisions; /* # of failed calls to comparison function */
+  unsigned long ht_lookups;    /* # of queries */
+  unsigned int ht_rehashes;    /* # of times we've expanded table */
+};
+
+typedef int (*qsort_cmp_t) __P((void const *, void const *));
+
+void hash_init __P((struct hash_table *ht, unsigned long size,
+                   hash_func_t hash_1, hash_func_t hash_2, hash_cmp_func_t hash_cmp));
+void hash_load __P((struct hash_table *ht, void *item_table,
+                   unsigned long cardinality, unsigned long size));
+void **hash_find_slot __P((struct hash_table *ht, void const *key));
+void *hash_find_item __P((struct hash_table *ht, void const *key));
+void *hash_insert __P((struct hash_table *ht, const void *item));
+void *hash_insert_at __P((struct hash_table *ht, const void *item, void const *slot));
+void *hash_delete __P((struct hash_table *ht, void const *item));
+void *hash_delete_at __P((struct hash_table *ht, void const *slot));
+void hash_delete_items __P((struct hash_table *ht));
+void hash_free_items __P((struct hash_table *ht));
+void hash_free __P((struct hash_table *ht, int free_items));
+void hash_map __P((struct hash_table *ht, hash_map_func_t map));
+void hash_map_arg __P((struct hash_table *ht, hash_map_arg_func_t map, void *arg));
+void hash_print_stats __P((struct hash_table *ht, FILE *out_FILE));
+void **hash_dump __P((struct hash_table *ht, void **vector_0, qsort_cmp_t compare));
+
+extern unsigned jhash(unsigned char const *key, int n);
+extern unsigned jhash_string(unsigned char const *key);
+
+extern void *hash_deleted_item;
+#define HASH_VACANT(item) ((item) == 0 || (void *) (item) == hash_deleted_item)
+
+\f
+/* hash and comparison macros for case-sensitive string keys. */
+
+/* Due to the strcache, it's not uncommon for the string pointers to
+   be identical.  Take advantage of that to short-circuit string compares.  */
+
+#define STRING_HASH_1(KEY, RESULT) do { \
+  unsigned char const *_key_ = (unsigned char const *) (KEY); \
+  (RESULT) += jhash_string(_key_); \
+} while (0)
+#define return_STRING_HASH_1(KEY) do { \
+  unsigned long _result_ = 0; \
+  STRING_HASH_1 ((KEY), _result_); \
+  return _result_; \
+} while (0)
+
+/* No need for a second hash because jhash already provides
+   pretty good results.  However, do evaluate the arguments
+   to avoid warnings.  */
+#define STRING_HASH_2(KEY, RESULT) do { \
+  (void)(KEY); \
+} while (0)
+#define return_STRING_HASH_2(KEY) do { \
+  unsigned long _result_ = 0; \
+  STRING_HASH_2 ((KEY), _result_); \
+  return _result_; \
+} while (0)
+
+#define STRING_COMPARE(X, Y, RESULT) do { \
+    RESULT = (X) == (Y) ? 0 : strcmp ((X), (Y)); \
+} while (0)
+#define return_STRING_COMPARE(X, Y) do { \
+  return (X) == (Y) ? 0 : strcmp ((X), (Y)); \
+} while (0)
+
+
+#define STRING_N_HASH_1(KEY, N, RESULT) do { \
+  unsigned char const *_key_ = (unsigned char const *) (KEY); \
+  (RESULT) += jhash(_key_, N); \
+} while (0)
+
+#define return_STRING_N_HASH_1(KEY, N) do { \
+  unsigned long _result_ = 0; \
+  STRING_N_HASH_1 ((KEY), (N), _result_); \
+  return _result_; \
+} while (0)
+
+/* No need for a second hash because jhash already provides
+   pretty good results.  However, do evaluate the arguments
+   to avoid warnings.  */
+#define STRING_N_HASH_2(KEY, N, RESULT) do { \
+  (void)(KEY); \
+  (void)(N); \
+} while (0)
+
+#define return_STRING_N_HASH_2(KEY, N) do { \
+  unsigned long _result_ = 0; \
+  STRING_N_HASH_2 ((KEY), (N), _result_); \
+  return _result_; \
+} while (0)
+
+#define STRING_N_COMPARE(X, Y, N, RESULT) do { \
+  RESULT = (X) == (Y) ? 0 : memcmp ((X), (Y), (N)); \
+} while (0)
+#define return_STRING_N_COMPARE(X, Y, N) do { \
+  return (X) == (Y) ? 0 : memcmp ((X), (Y), (N)); \
+} while (0)
+
+#ifdef HAVE_CASE_INSENSITIVE_FS
+
+/* hash and comparison macros for case-insensitive string _key_s. */
+
+#define ISTRING_HASH_1(KEY, RESULT) do { \
+  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
+  while (*++_key_) \
+    (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0xf)); \
+} while (0)
+#define return_ISTRING_HASH_1(KEY) do { \
+  unsigned long _result_ = 0; \
+  ISTRING_HASH_1 ((KEY), _result_); \
+  return _result_; \
+} while (0)
+
+#define ISTRING_HASH_2(KEY, RESULT) do { \
+  unsigned char const *_key_ = (unsigned char const *) (KEY) - 1; \
+  while (*++_key_) \
+    (RESULT) += ((isupper (*_key_) ? tolower (*_key_) : *_key_) << (_key_[1] & 0x7)); \
+} while (0)
+#define return_ISTRING_HASH_2(KEY) do { \
+  unsigned long _result_ = 0; \
+  ISTRING_HASH_2 ((KEY), _result_); \
+  return _result_; \
+} while (0)
+
+#define ISTRING_COMPARE(X, Y, RESULT) do { \
+  RESULT = (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \
+} while (0)
+#define return_ISTRING_COMPARE(X, Y) do { \
+  return (X) == (Y) ? 0 : strcasecmp ((X), (Y)); \
+} while (0)
+
+#else
+
+#define ISTRING_HASH_1(KEY, RESULT) STRING_HASH_1 ((KEY), (RESULT))
+#define return_ISTRING_HASH_1(KEY) return_STRING_HASH_1 (KEY)
+
+#define ISTRING_HASH_2(KEY, RESULT) STRING_HASH_2 ((KEY), (RESULT))
+#define return_ISTRING_HASH_2(KEY) return_STRING_HASH_2 (KEY)
+
+#define ISTRING_COMPARE(X, Y, RESULT) STRING_COMPARE ((X), (Y), (RESULT))
+#define return_ISTRING_COMPARE(X, Y) return_STRING_COMPARE ((X), (Y))
+
+#endif
+
+/* hash and comparison macros for integer _key_s. */
+
+#define INTEGER_HASH_1(KEY, RESULT) do { \
+  (RESULT) += ((unsigned long)(KEY)); \
+} while (0)
+#define return_INTEGER_HASH_1(KEY) do { \
+  unsigned long _result_ = 0; \
+  INTEGER_HASH_1 ((KEY), _result_); \
+  return _result_; \
+} while (0)
+
+#define INTEGER_HASH_2(KEY, RESULT) do { \
+  (RESULT) += ~((unsigned long)(KEY)); \
+} while (0)
+#define return_INTEGER_HASH_2(KEY) do { \
+  unsigned long _result_ = 0; \
+  INTEGER_HASH_2 ((KEY), _result_); \
+  return _result_; \
+} while (0)
+
+#define INTEGER_COMPARE(X, Y, RESULT) do { \
+  (RESULT) = X - Y; \
+} while (0)
+#define return_INTEGER_COMPARE(X, Y) do { \
+  int _result_; \
+  INTEGER_COMPARE (X, Y, _result_); \
+  return _result_; \
+} while (0)
+
+/* hash and comparison macros for address keys. */
+
+#define ADDRESS_HASH_1(KEY, RESULT) INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3, (RESULT))
+#define ADDRESS_HASH_2(KEY, RESULT) INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3, (RESULT))
+#define ADDRESS_COMPARE(X, Y, RESULT) INTEGER_COMPARE ((X), (Y), (RESULT))
+#define return_ADDRESS_HASH_1(KEY) return_INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3)
+#define return_ADDRESS_HASH_2(KEY) return_INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3)
+#define return_ADDRESS_COMPARE(X, Y) return_INTEGER_COMPARE ((X), (Y))
+
+#endif /* not _hash_h_ */
diff --git a/src/implicit.c b/src/implicit.c
new file mode 100644 (file)
index 0000000..b281a17
--- /dev/null
@@ -0,0 +1,1017 @@
+/* Implicit rule searching for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "rule.h"
+#include "dep.h"
+#include "debug.h"
+#include "variable.h"
+#include "job.h"      /* struct child, used inside commands.h */
+#include "commands.h" /* set_file_variables */
+
+static int pattern_search (struct file *file, int archive,
+                           unsigned int depth, unsigned int recursions);
+\f
+/* For a FILE which has no commands specified, try to figure out some
+   from the implicit pattern rules.
+   Returns 1 if a suitable implicit rule was found,
+   after modifying FILE to contain the appropriate commands and deps,
+   or returns 0 if no implicit rule was found.  */
+
+int
+try_implicit_rule (struct file *file, unsigned int depth)
+{
+  DBF (DB_IMPLICIT, _("Looking for an implicit rule for '%s'.\n"));
+
+  /* The order of these searches was previously reversed.  My logic now is
+     that since the non-archive search uses more information in the target
+     (the archive search omits the archive name), it is more specific and
+     should come first.  */
+
+  if (pattern_search (file, 0, depth, 0))
+    return 1;
+
+#ifndef NO_ARCHIVES
+  /* If this is an archive member reference, use just the
+     archive member name to search for implicit rules.  */
+  if (ar_name (file->name))
+    {
+      DBF (DB_IMPLICIT,
+           _("Looking for archive-member implicit rule for '%s'.\n"));
+      if (pattern_search (file, 1, depth, 0))
+        return 1;
+    }
+#endif
+
+  return 0;
+}
+\f
+
+/* Scans the BUFFER for the next word with whitespace as a separator.
+   Returns the pointer to the beginning of the word. LENGTH hold the
+   length of the word.  */
+
+static const char *
+get_next_word (const char *buffer, size_t *length)
+{
+  const char *p = buffer, *beg;
+  char c;
+
+  /* Skip any leading whitespace.  */
+  NEXT_TOKEN (p);
+
+  beg = p;
+  c = *(p++);
+
+  if (c == '\0')
+    return 0;
+
+
+  /* We already found the first value of "c", above.  */
+  while (1)
+    {
+      char closeparen;
+      int count;
+
+      switch (c)
+        {
+        case '\0':
+        case ' ':
+        case '\t':
+          goto done_word;
+
+        case '$':
+          c = *(p++);
+          if (c == '$')
+            break;
+
+          /* This is a variable reference, so read it to the matching
+             close paren.  */
+
+          if (c == '(')
+            closeparen = ')';
+          else if (c == '{')
+            closeparen = '}';
+          else
+            /* This is a single-letter variable reference.  */
+            break;
+
+          for (count = 0; *p != '\0'; ++p)
+            {
+              if (*p == c)
+                ++count;
+              else if (*p == closeparen && --count < 0)
+                {
+                  ++p;
+                  break;
+                }
+            }
+          break;
+
+        case '|':
+          goto done;
+
+        default:
+          break;
+        }
+
+      c = *(p++);
+    }
+ done_word:
+  --p;
+
+ done:
+  if (length)
+    *length = p - beg;
+
+  return beg;
+}
+
+/* This structure stores information about the expanded prerequisites for a
+   pattern rule.  NAME is always set to the strcache'd name of the prereq.
+   FILE and PATTERN will be set for intermediate files only.  IGNORE_MTIME is
+   copied from the prerequisite we expanded.
+ */
+struct patdeps
+  {
+    const char *name;
+    const char *pattern;
+    struct file *file;
+    unsigned int ignore_mtime : 1;
+    unsigned int ignore_automatic_vars : 1;
+  };
+
+/* This structure stores information about pattern rules that we need
+   to try.
+*/
+struct tryrule
+  {
+    struct rule *rule;
+
+    /* Stem length for this match. */
+    size_t stemlen;
+
+    /* Index of the target in this rule that matched the file. */
+    unsigned int matches;
+
+    /* Definition order of this rule. Used to implement stable sort.*/
+    unsigned int order;
+
+    /* Nonzero if the LASTSLASH logic was used in matching this rule. */
+    char checked_lastslash;
+  };
+
+int
+stemlen_compare (const void *v1, const void *v2)
+{
+  const struct tryrule *r1 = v1;
+  const struct tryrule *r2 = v2;
+  int r = (int) (r1->stemlen - r2->stemlen);
+  return r != 0 ? r : (int) (r1->order - r2->order);
+}
+
+/* Search the pattern rules for a rule with an existing dependency to make
+   FILE.  If a rule is found, the appropriate commands and deps are put in FILE
+   and 1 is returned.  If not, 0 is returned.
+
+   If ARCHIVE is nonzero, FILE->name is of the form "LIB(MEMBER)".  A rule for
+   "(MEMBER)" will be searched for, and "(MEMBER)" will not be chopped up into
+   directory and filename parts.
+
+   If an intermediate file is found by pattern search, the intermediate file
+   is set up as a target by the recursive call and is also made a dependency
+   of FILE.
+
+   DEPTH is used for debugging messages.  */
+
+static int
+pattern_search (struct file *file, int archive,
+                unsigned int depth, unsigned int recursions)
+{
+  /* Filename we are searching for a rule for.  */
+  const char *filename = archive ? strchr (file->name, '(') : file->name;
+
+  /* Length of FILENAME.  */
+  size_t namelen = strlen (filename);
+
+  /* The last slash in FILENAME (or nil if there is none).  */
+  const char *lastslash;
+
+  /* This is a file-object used as an argument in
+     recursive calls.  It never contains any data
+     except during a recursive call.  */
+  struct file *int_file = 0;
+
+  /* List of dependencies found recursively.  */
+  unsigned int max_deps = max_pattern_deps;
+  struct patdeps *deplist = xmalloc (max_deps * sizeof (struct patdeps));
+  struct patdeps *pat = deplist;
+
+  /* Names of possible dependencies are constructed in this buffer.
+     We may replace % by $(*F) for second expansion, increasing the length.  */
+  char *depname = alloca (namelen + max_pattern_dep_length + 4);
+
+  /* The start and length of the stem of FILENAME for the current rule.  */
+  const char *stem = 0;
+  size_t stemlen = 0;
+  size_t fullstemlen = 0;
+
+  /* Buffer in which we store all the rules that are possibly applicable.  */
+  struct tryrule *tryrules = xmalloc (num_pattern_rules * max_pattern_targets
+                                      * sizeof (struct tryrule));
+
+  /* Number of valid elements in TRYRULES.  */
+  unsigned int nrules;
+
+  /* The index in TRYRULES of the rule we found.  */
+  unsigned int foundrule;
+
+  /* Nonzero if should consider intermediate files as dependencies.  */
+  int intermed_ok;
+
+  /* Nonzero if we have initialized file variables for this target.  */
+  int file_vars_initialized = 0;
+
+  /* Nonzero if we have matched a pattern-rule target
+     that is not just '%'.  */
+  int specific_rule_matched = 0;
+
+  unsigned int ri;  /* uninit checks OK */
+  struct rule *rule;
+
+  char *pathdir = NULL;
+  size_t pathlen;
+
+  PATH_VAR (stem_str); /* @@ Need to get rid of stem, stemlen, etc. */
+
+#ifndef NO_ARCHIVES
+  if (archive || ar_name (filename))
+    lastslash = 0;
+  else
+#endif
+    {
+      /* Set LASTSLASH to point at the last slash in FILENAME
+         but not counting any slash at the end.  (foo/bar/ counts as
+         bar/ in directory foo/, not empty in directory foo/bar/.)  */
+      lastslash = memrchr (filename, '/', namelen - 1);
+#ifdef VMS
+      if (lastslash == NULL)
+        lastslash = strrchr (filename, ']');
+      if (lastslash == NULL)
+        lastslash = strrchr (filename, '>');
+      if (lastslash == NULL)
+        lastslash = strrchr (filename, ':');
+#endif
+#ifdef HAVE_DOS_PATHS
+      /* Handle backslashes (possibly mixed with forward slashes)
+         and the case of "d:file".  */
+      {
+        char *bslash = memrchr (filename, '\\', namelen - 1);
+        if (lastslash == 0 || bslash > lastslash)
+          lastslash = bslash;
+        if (lastslash == 0 && filename[0] && filename[1] == ':')
+          lastslash = filename + 1;
+      }
+#endif
+    }
+
+  pathlen = lastslash ? lastslash - filename + 1 : 0;
+
+  /* First see which pattern rules match this target and may be considered.
+     Put them in TRYRULES.  */
+
+  nrules = 0;
+  for (rule = pattern_rules; rule != 0; rule = rule->next)
+    {
+      unsigned int ti;
+
+      /* If the pattern rule has deps but no commands, ignore it.
+         Users cancel built-in rules by redefining them without commands.  */
+      if (rule->deps != 0 && rule->cmds == 0)
+        continue;
+
+      /* If this rule is in use by a parent pattern_search,
+         don't use it here.  */
+      if (rule->in_use)
+        {
+          DBS (DB_IMPLICIT, (_("Avoiding implicit rule recursion.\n")));
+          continue;
+        }
+
+      for (ti = 0; ti < rule->num; ++ti)
+        {
+          const char *target = rule->targets[ti];
+          const char *suffix = rule->suffixes[ti];
+          char check_lastslash;
+
+          /* Rules that can match any filename and are not terminal
+             are ignored if we're recursing, so that they cannot be
+             intermediate files.  */
+          if (recursions > 0 && target[1] == '\0' && !rule->terminal)
+            continue;
+
+          if (rule->lens[ti] > namelen)
+            /* It can't possibly match.  */
+            continue;
+
+          /* From the lengths of the filename and the pattern parts,
+             find the stem: the part of the filename that matches the %.  */
+          stem = filename + (suffix - target - 1);
+          stemlen = namelen - rule->lens[ti] + 1;
+
+          /* Set CHECK_LASTSLASH if FILENAME contains a directory
+             prefix and the target pattern does not contain a slash.  */
+
+          check_lastslash = 0;
+          if (lastslash)
+            {
+#ifdef VMS
+              check_lastslash = strpbrk (target, "/]>:") == NULL;
+#else
+              check_lastslash = strchr (target, '/') == 0;
+#endif
+#ifdef HAVE_DOS_PATHS
+              /* Didn't find it yet: check for DOS-type directories.  */
+              if (check_lastslash)
+                {
+                  char *b = strchr (target, '\\');
+                  check_lastslash = !(b || (target[0] && target[1] == ':'));
+                }
+#endif
+            }
+          if (check_lastslash)
+            {
+              /* If so, don't include the directory prefix in STEM here.  */
+              if (pathlen > stemlen)
+                continue;
+              stemlen -= pathlen;
+              stem += pathlen;
+            }
+
+          /* Check that the rule pattern matches the text before the stem.  */
+          if (check_lastslash)
+            {
+              if (stem > (lastslash + 1)
+                  && !strneq (target, lastslash + 1, stem - lastslash - 1))
+                continue;
+            }
+          else if (stem > filename
+                   && !strneq (target, filename, stem - filename))
+            continue;
+
+          /* Check that the rule pattern matches the text after the stem.
+             We could test simply use streq, but this way we compare the
+             first two characters immediately.  This saves time in the very
+             common case where the first character matches because it is a
+             period.  */
+          if (*suffix != stem[stemlen]
+              || (*suffix != '\0' && !streq (&suffix[1], &stem[stemlen + 1])))
+            continue;
+
+          /* Record if we match a rule that not all filenames will match.  */
+          if (target[1] != '\0')
+            specific_rule_matched = 1;
+
+          /* A rule with no dependencies and no commands exists solely to set
+             specific_rule_matched when it matches.  Don't try to use it.  */
+          if (rule->deps == 0 && rule->cmds == 0)
+            continue;
+
+          /* Record this rule in TRYRULES and the index of the matching
+             target in MATCHES.  If several targets of the same rule match,
+             that rule will be in TRYRULES more than once.  */
+          tryrules[nrules].rule = rule;
+          tryrules[nrules].matches = ti;
+          tryrules[nrules].stemlen = stemlen + (check_lastslash ? pathlen : 0);
+          tryrules[nrules].order = nrules;
+          tryrules[nrules].checked_lastslash = check_lastslash;
+          ++nrules;
+        }
+    }
+
+  /* Bail out early if we haven't found any rules. */
+  if (nrules == 0)
+    goto done;
+
+  /* Sort the rules to place matches with the shortest stem first. This
+     way the most specific rules will be tried first. */
+  if (nrules > 1)
+    qsort (tryrules, nrules, sizeof (struct tryrule), stemlen_compare);
+
+  /* If we have found a matching rule that won't match all filenames,
+     retroactively reject any non-"terminal" rules that do always match.  */
+  if (specific_rule_matched)
+    for (ri = 0; ri < nrules; ++ri)
+      if (!tryrules[ri].rule->terminal)
+        {
+          unsigned int j;
+          for (j = 0; j < tryrules[ri].rule->num; ++j)
+            if (tryrules[ri].rule->targets[j][1] == '\0')
+              {
+                tryrules[ri].rule = 0;
+                break;
+              }
+        }
+
+  /* Try each rule once without intermediate files, then once with them.  */
+  for (intermed_ok = 0; intermed_ok < 2; ++intermed_ok)
+    {
+      pat = deplist;
+
+      /* Try each pattern rule till we find one that applies.  If it does,
+         expand its dependencies (as substituted) and chain them in DEPS.  */
+      for (ri = 0; ri < nrules; ri++)
+        {
+          struct dep *dep;
+          char check_lastslash;
+          unsigned int failed = 0;
+          int file_variables_set = 0;
+          unsigned int deps_found = 0;
+          /* NPTR points to the part of the prereq we haven't processed.  */
+          const char *nptr = 0;
+          int order_only = 0;
+          unsigned int matches;
+
+          rule = tryrules[ri].rule;
+
+          /* RULE is nil when we discover that a rule, already placed in
+             TRYRULES, should not be applied.  */
+          if (rule == 0)
+            continue;
+
+          /* Reject any terminal rules if we're looking to make intermediate
+             files.  */
+          if (intermed_ok && rule->terminal)
+            continue;
+
+          /* From the lengths of the filename and the matching pattern parts,
+             find the stem: the part of the filename that matches the %.  */
+          matches = tryrules[ri].matches;
+          stem = filename + (rule->suffixes[matches]
+                             - rule->targets[matches]) - 1;
+          stemlen = (namelen - rule->lens[matches]) + 1;
+          check_lastslash = tryrules[ri].checked_lastslash;
+          if (check_lastslash)
+            {
+              stem += pathlen;
+              stemlen -= pathlen;
+
+              /* We need to add the directory prefix, so set it up.  */
+              if (! pathdir)
+                {
+                  pathdir = alloca (pathlen + 1);
+                  memcpy (pathdir, filename, pathlen);
+                  pathdir[pathlen] = '\0';
+                }
+            }
+
+          if (stemlen + (check_lastslash ? pathlen : 0) > GET_PATH_MAX)
+            {
+              DBS (DB_IMPLICIT, (_("Stem too long: '%s%.*s'.\n"),
+                                 check_lastslash ? pathdir : "",
+                                 (int) stemlen, stem));
+              continue;
+            }
+
+          DBS (DB_IMPLICIT, (_("Trying pattern rule with stem '%.*s'.\n"),
+                             (int) stemlen, stem));
+
+          if (!check_lastslash)
+            {
+              memcpy (stem_str, stem, stemlen);
+              stem_str[stemlen] = '\0';
+            }
+          else
+            {
+              /* We want to prepend the directory from
+                 the original FILENAME onto the stem.  */
+              memcpy (stem_str, filename, pathlen);
+              memcpy (stem_str + pathlen, stem, stemlen);
+              stem_str[pathlen + stemlen] = '\0';
+            }
+
+          /* If there are no prerequisites, then this rule matches.  */
+          if (rule->deps == 0)
+            break;
+
+          /* Temporary assign STEM to file->stem (needed to set file
+             variables below).   */
+          file->stem = stem_str;
+
+          /* Mark this rule as in use so a recursive pattern_search won't try
+             to use it.  */
+          rule->in_use = 1;
+
+          /* Try each prerequisite; see if it exists or can be created.  We'll
+             build a list of prereq info in DEPLIST.  Due to 2nd expansion we
+             may have to process multiple prereqs for a single dep entry.  */
+
+          pat = deplist;
+          dep = rule->deps;
+          nptr = dep_name (dep);
+          while (1)
+            {
+              struct dep *dl, *d;
+              char *p;
+
+              /* If we're out of name to parse, start the next prereq.  */
+              if (! nptr)
+                {
+                  dep = dep->next;
+                  if (dep == 0)
+                    break;
+                  nptr = dep_name (dep);
+                }
+
+              /* If we don't need a second expansion, just replace the %.  */
+              if (! dep->need_2nd_expansion)
+                {
+                  p = strchr (nptr, '%');
+                  if (p == 0)
+                    strcpy (depname, nptr);
+                  else
+                    {
+                      char *o = depname;
+                      if (check_lastslash)
+                        {
+                          memcpy (o, filename, pathlen);
+                          o += pathlen;
+                        }
+                      memcpy (o, nptr, p - nptr);
+                      o += p - nptr;
+                      memcpy (o, stem, stemlen);
+                      o += stemlen;
+                      strcpy (o, p + 1);
+                    }
+
+                  /* Parse the expanded string.  It might have wildcards.  */
+                  p = depname;
+                  dl = PARSE_FILE_SEQ (&p, struct dep, MAP_NUL, NULL, PARSEFS_ONEWORD);
+                  for (d = dl; d != NULL; d = d->next)
+                    {
+                      ++deps_found;
+                      d->ignore_mtime = dep->ignore_mtime;
+                      d->ignore_automatic_vars = dep->ignore_automatic_vars;
+                    }
+
+                  /* We've used up this dep, so next time get a new one.  */
+                  nptr = 0;
+                }
+
+              /* We have to perform second expansion on this prereq.  In an
+                 ideal world we would take the dependency line, substitute the
+                 stem, re-expand the whole line and chop it into individual
+                 prerequisites.  Unfortunately this won't work because of the
+                 "check_lastslash" twist.  Instead, we will have to go word by
+                 word, taking $()'s into account.  For each word we will
+                 substitute the stem, re-expand, chop it up, and, if
+                 check_lastslash != 0, add the directory part to each
+                 resulting prerequisite.  */
+              else
+                {
+                  int add_dir = 0;
+                  size_t len;
+                  struct dep **dptr;
+
+                  nptr = get_next_word (nptr, &len);
+                  if (nptr == 0)
+                    continue;
+
+                  /* See this is a transition to order-only prereqs.  */
+                  if (! order_only && len == 1 && nptr[0] == '|')
+                    {
+                      order_only = 1;
+                      nptr += len;
+                      continue;
+                    }
+
+                  /* If the dependency name has %, substitute the stem.  If we
+                     just replace % with the stem value then later, when we do
+                     the 2nd expansion, we will re-expand this stem value
+                     again.  This is not good if you have certain characters
+                     in your stem (like $).
+
+                     Instead, we will replace % with $* or $(*F) and allow the
+                     second expansion to take care of it for us.  This way
+                     (since $* and $(*F) are simple variables) there won't be
+                     additional re-expansion of the stem.  */
+
+                  p = lindex (nptr, nptr + len, '%');
+                  if (p == 0)
+                    {
+                      memcpy (depname, nptr, len);
+                      depname[len] = '\0';
+                    }
+                  else
+                    {
+                      size_t i = p - nptr;
+                      char *o = depname;
+                      memcpy (o, nptr, i);
+                      o += i;
+                      if (check_lastslash)
+                        {
+                          add_dir = 1;
+                          memcpy (o, "$(*F)", 5);
+                          o += 5;
+                        }
+                      else
+                        {
+                          memcpy (o, "$*", 2);
+                          o += 2;
+                        }
+                      memcpy (o, p + 1, len - i - 1);
+                      o[len - i - 1] = '\0';
+                    }
+
+                  /* Set up for the next word.  */
+                  nptr += len;
+
+                  /* Initialize and set file variables if we haven't already
+                     done so. */
+                  if (!file_vars_initialized)
+                    {
+                      initialize_file_variables (file, 0);
+                      set_file_variables (file);
+                      file_vars_initialized = 1;
+                    }
+                  /* Update the stem value in $* for this rule.  */
+                  else if (!file_variables_set)
+                    {
+                      define_variable_for_file (
+                        "*", 1, file->stem, o_automatic, 0, file);
+                      file_variables_set = 1;
+                    }
+
+                  /* Perform the 2nd expansion.  */
+                  p = variable_expand_for_file (depname, file);
+                  dptr = &dl;
+
+                  /* Parse the results into a deps list.  */
+                  do
+                    {
+                      /* Parse the expanded string. */
+                      struct dep *dp = PARSE_FILE_SEQ (&p, struct dep,
+                                                       order_only ? MAP_NUL : MAP_PIPE,
+                                                       add_dir ? pathdir : NULL, PARSEFS_NONE);
+                      *dptr = dp;
+
+                      for (d = dp; d != NULL; d = d->next)
+                        {
+                          ++deps_found;
+                          if (order_only)
+                            d->ignore_mtime = 1;
+                          dptr = &d->next;
+                        }
+
+                      /* If we stopped due to an order-only token, note it.  */
+                      if (*p == '|')
+                        {
+                          order_only = 1;
+                          ++p;
+                        }
+                    }
+                  while (*p != '\0');
+                }
+
+              /* If there are more than max_pattern_deps prerequisites (due to
+                 2nd expansion), reset it and realloc the arrays.  */
+
+              if (deps_found > max_deps)
+                {
+                  size_t l = pat - deplist;
+                  /* This might have changed due to recursion.  */
+                  max_pattern_deps = MAX(max_pattern_deps, deps_found);
+                  max_deps = max_pattern_deps;
+                  deplist = xrealloc (deplist,
+                                      max_deps * sizeof (struct patdeps));
+                  pat = deplist + l;
+                }
+
+              /* Go through the nameseq and handle each as a prereq name.  */
+              for (d = dl; d != 0; d = d->next)
+                {
+                  struct dep *expl_d;
+                  int is_rule = d->name == dep_name (dep);
+
+                  if (file_impossible_p (d->name))
+                    {
+                      /* If this prereq has already been ruled "impossible",
+                         then the rule fails.  Don't bother trying it on the
+                         second pass either since we know that will fail.  */
+                      DBS (DB_IMPLICIT,
+                           (is_rule
+                            ? _("Rejecting impossible rule prerequisite '%s'.\n")
+                            : _("Rejecting impossible implicit prerequisite '%s'.\n"),
+                            d->name));
+                      tryrules[ri].rule = 0;
+
+                      failed = 1;
+                      break;
+                    }
+
+                  memset (pat, '\0', sizeof (struct patdeps));
+                  pat->ignore_mtime = d->ignore_mtime;
+                  pat->ignore_automatic_vars = d->ignore_automatic_vars;
+
+                  DBS (DB_IMPLICIT,
+                       (is_rule
+                        ? _("Trying rule prerequisite '%s'.\n")
+                        : _("Trying implicit prerequisite '%s'.\n"), d->name));
+
+                  /* If this prereq is also explicitly mentioned for FILE,
+                     skip all tests below since it must be built no matter
+                     which implicit rule we choose. */
+
+                  for (expl_d = file->deps; expl_d != 0; expl_d = expl_d->next)
+                    if (streq (dep_name (expl_d), d->name))
+                      break;
+                  if (expl_d != 0)
+                    {
+                      (pat++)->name = d->name;
+                      continue;
+                    }
+
+                  /* The DEP->changed flag says that this dependency resides
+                     in a nonexistent directory.  So we normally can skip
+                     looking for the file.  However, if CHECK_LASTSLASH is
+                     set, then the dependency file we are actually looking for
+                     is in a different directory (the one gotten by prepending
+                     FILENAME's directory), so it might actually exist.  */
+
+                  /* @@ dep->changed check is disabled. */
+                  if (lookup_file (d->name) != 0
+                      /*|| ((!dep->changed || check_lastslash) && */
+                      || file_exists_p (d->name))
+                    {
+                      (pat++)->name = d->name;
+                      continue;
+                    }
+
+                  /* This code, given FILENAME = "lib/foo.o", dependency name
+                     "lib/foo.c", and VPATH=src, searches for
+                     "src/lib/foo.c".  */
+                  {
+                    const char *vname = vpath_search (d->name, 0, NULL, NULL);
+                    if (vname)
+                      {
+                        DBS (DB_IMPLICIT,
+                             (_("Found prerequisite '%s' as VPATH '%s'\n"),
+                              d->name, vname));
+                        (pat++)->name = d->name;
+                        continue;
+                      }
+                  }
+
+                  /* We could not find the file in any place we should look.
+                     Try to make this dependency as an intermediate file, but
+                     only on the second pass.  */
+
+                  if (intermed_ok)
+                    {
+                      DBS (DB_IMPLICIT,
+                           (_("Looking for a rule with intermediate file '%s'.\n"),
+                            d->name));
+
+                      if (int_file == 0)
+                        int_file = alloca (sizeof (struct file));
+                      memset (int_file, '\0', sizeof (struct file));
+                      int_file->name = d->name;
+
+                      if (pattern_search (int_file,
+                                          0,
+                                          depth + 1,
+                                          recursions + 1))
+                        {
+                          pat->pattern = int_file->name;
+                          int_file->name = d->name;
+                          pat->file = int_file;
+                          int_file = 0;
+                          (pat++)->name = d->name;
+                          continue;
+                        }
+
+                      /* If we have tried to find P as an intermediate file
+                         and failed, mark that name as impossible so we won't
+                         go through the search again later.  */
+                      if (int_file->variables)
+                        free_variable_set (int_file->variables);
+                      if (int_file->pat_variables)
+                        free_variable_set (int_file->pat_variables);
+                      file_impossible (d->name);
+                    }
+
+                  /* A dependency of this rule does not exist. Therefore, this
+                     rule fails.  */
+                  failed = 1;
+                  break;
+                }
+
+              /* Free the ns chain.  */
+              free_dep_chain (dl);
+
+              if (failed)
+                break;
+            }
+
+          /* Reset the stem in FILE. */
+
+          file->stem = 0;
+
+          /* This rule is no longer 'in use' for recursive searches.  */
+          rule->in_use = 0;
+
+          if (! failed)
+            /* This pattern rule does apply.  Stop looking for one.  */
+            break;
+
+          /* This pattern rule does not apply.  Keep looking.  */
+        }
+
+      /* If we found an applicable rule without intermediate files, don't try
+         with them.  */
+      if (ri < nrules)
+        break;
+
+      rule = 0;
+    }
+
+  /* RULE is nil if the loop went through the list but everything failed.  */
+  if (rule == 0)
+    goto done;
+
+  foundrule = ri;
+
+  /* If we are recursing, store the pattern that matched FILENAME in
+     FILE->name for use in upper levels.  */
+
+  if (recursions > 0)
+    /* Kludge-o-matic */
+    file->name = rule->targets[tryrules[foundrule].matches];
+
+  /* DEPLIST lists the prerequisites for the rule we found.  This includes the
+     intermediate files, if any.  Convert them into entries on the deps-chain
+     of FILE.  */
+
+  while (pat-- > deplist)
+    {
+      struct dep *dep;
+      const char *s;
+
+      if (pat->file != 0)
+        {
+          /* If we need to use an intermediate file, make sure it is entered
+             as a target, with the info that was found for it in the recursive
+             pattern_search call.  We know that the intermediate file did not
+             already exist as a target; therefore we can assume that the deps
+             and cmds of F below are null before we change them.  */
+
+          struct file *imf = pat->file;
+          struct file *f = lookup_file (imf->name);
+
+          /* We don't want to delete an intermediate file that happened
+             to be a prerequisite of some (other) target. Mark it as
+             secondary.  We don't want it to be precious as that disables
+             DELETE_ON_ERROR etc.  */
+          if (f != 0)
+            f->secondary = 1;
+          else
+            f = enter_file (imf->name);
+
+          f->deps = imf->deps;
+          f->cmds = imf->cmds;
+          f->stem = imf->stem;
+          f->variables = imf->variables;
+          f->pat_variables = imf->pat_variables;
+          f->pat_searched = imf->pat_searched;
+          f->also_make = imf->also_make;
+          f->is_target = 1;
+          f->intermediate = 1;
+          f->tried_implicit = 1;
+
+          imf = lookup_file (pat->pattern);
+          if (imf != 0 && imf->precious)
+            f->precious = 1;
+
+          for (dep = f->deps; dep != 0; dep = dep->next)
+            {
+              dep->file = enter_file (dep->name);
+              dep->name = 0;
+              dep->file->tried_implicit |= dep->changed;
+            }
+        }
+
+      dep = alloc_dep ();
+      dep->ignore_mtime = pat->ignore_mtime;
+      dep->ignore_automatic_vars = pat->ignore_automatic_vars;
+      s = strcache_add (pat->name);
+      if (recursions)
+        dep->name = s;
+      else
+        {
+          dep->file = lookup_file (s);
+          if (dep->file == 0)
+            dep->file = enter_file (s);
+        }
+
+      if (pat->file == 0 && tryrules[foundrule].rule->terminal)
+        {
+          /* If the file actually existed (was not an intermediate file), and
+             the rule that found it was a terminal one, then we want to mark
+             the found file so that it will not have implicit rule search done
+             for it.  If we are not entering a 'struct file' for it now, we
+             indicate this with the 'changed' flag.  */
+          if (dep->file == 0)
+            dep->changed = 1;
+          else
+            dep->file->tried_implicit = 1;
+        }
+
+      dep->next = file->deps;
+      file->deps = dep;
+    }
+
+  if (!tryrules[foundrule].checked_lastslash)
+    {
+      /* Always allocate new storage, since STEM might be on the stack for an
+         intermediate file.  */
+      file->stem = strcache_add_len (stem, stemlen);
+      fullstemlen = stemlen;
+    }
+  else
+    {
+      /* We want to prepend the directory from
+         the original FILENAME onto the stem.  */
+      fullstemlen = pathlen + stemlen;
+      memcpy (stem_str, filename, pathlen);
+      memcpy (stem_str + pathlen, stem, stemlen);
+      stem_str[fullstemlen] = '\0';
+      file->stem = strcache_add (stem_str);
+    }
+
+  file->cmds = rule->cmds;
+  file->is_target = 1;
+
+  /* Set precious flag. */
+  {
+    struct file *f = lookup_file (rule->targets[tryrules[foundrule].matches]);
+    if (f && f->precious)
+      file->precious = 1;
+  }
+
+  /* If this rule builds other targets, too, put the others into FILE's
+     'also_make' member.  */
+
+  if (rule->num > 1)
+    for (ri = 0; ri < rule->num; ++ri)
+      if (ri != tryrules[foundrule].matches)
+        {
+          char *nm = alloca (rule->lens[ri] + fullstemlen + 1);
+          char *p = nm;
+          struct file *f;
+          struct dep *new = alloc_dep ();
+
+          /* GKM FIMXE: handle '|' here too */
+          memcpy (p, rule->targets[ri],
+                  rule->suffixes[ri] - rule->targets[ri] - 1);
+          p += rule->suffixes[ri] - rule->targets[ri] - 1;
+          memcpy (p, file->stem, fullstemlen);
+          p += fullstemlen;
+          memcpy (p, rule->suffixes[ri],
+                  rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1);
+          new->name = strcache_add (nm);
+          new->file = enter_file (new->name);
+          new->next = file->also_make;
+
+          /* Set precious flag. */
+          f = lookup_file (rule->targets[ri]);
+          if (f && f->precious)
+            new->file->precious = 1;
+
+          /* Set the is_target flag so that this file is not treated as
+             intermediate by the pattern rule search algorithm and
+             file_exists_p cannot pick it up yet.  */
+          new->file->is_target = 1;
+
+          file->also_make = new;
+        }
+
+ done:
+  free (tryrules);
+  free (deplist);
+
+  return rule != 0;
+}
diff --git a/src/job.c b/src/job.c
new file mode 100644 (file)
index 0000000..ae1f18b
--- /dev/null
+++ b/src/job.c
@@ -0,0 +1,3738 @@
+/* Job execution and handling for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+#include <string.h>
+
+#include "job.h"
+#include "debug.h"
+#include "filedef.h"
+#include "commands.h"
+#include "variable.h"
+#include "os.h"
+
+/* Default shell to use.  */
+#ifdef WINDOWS32
+# ifdef HAVE_STRINGS_H
+#  include <strings.h> /* for strcasecmp, strncasecmp */
+# endif
+# include <windows.h>
+
+const char *default_shell = "sh.exe";
+int no_default_sh_exe = 1;
+int batch_mode_shell = 1;
+HANDLE main_thread;
+
+#elif defined (_AMIGA)
+
+const char *default_shell = "";
+extern int MyExecute (char **);
+int batch_mode_shell = 0;
+
+#elif defined (__MSDOS__)
+
+/* The default shell is a pointer so we can change it if Makefile
+   says so.  It is without an explicit path so we get a chance
+   to search the $PATH for it (since MSDOS doesn't have standard
+   directories we could trust).  */
+const char *default_shell = "command.com";
+int batch_mode_shell = 0;
+
+#elif defined (__EMX__)
+
+const char *default_shell = "/bin/sh";
+int batch_mode_shell = 0;
+
+#elif defined (VMS)
+
+# include <descrip.h>
+# include <stsdef.h>
+const char *default_shell = "";
+int batch_mode_shell = 0;
+
+#define strsignal vms_strsignal
+char * vms_strsignal (int status);
+
+#ifndef C_FACILITY_NO
+# define C_FACILITY_NO 0x350000
+#endif
+#ifndef VMS_POSIX_EXIT_MASK
+# define VMS_POSIX_EXIT_MASK (C_FACILITY_NO | 0xA000)
+#endif
+
+#else
+
+const char *default_shell = "/bin/sh";
+int batch_mode_shell = 0;
+
+#endif
+
+#ifdef __MSDOS__
+# include <process.h>
+static int execute_by_shell;
+static int dos_pid = 123;
+int dos_status;
+int dos_command_running;
+#endif /* __MSDOS__ */
+
+#ifdef _AMIGA
+# include <proto/dos.h>
+static int amiga_pid = 123;
+static int amiga_status;
+static char amiga_bname[32];
+static int amiga_batch_file;
+#endif /* Amiga.  */
+
+#ifdef VMS
+# ifndef __GNUC__
+#   include <processes.h>
+# endif
+# include <starlet.h>
+# include <lib$routines.h>
+static void vmsWaitForChildren (int *);
+#endif
+
+#ifdef WINDOWS32
+# include <windows.h>
+# include <io.h>
+# include <process.h>
+# include "sub_proc.h"
+# include "w32err.h"
+# include "pathstuff.h"
+# define WAIT_NOHANG 1
+#endif /* WINDOWS32 */
+
+#ifdef __EMX__
+# include <process.h>
+#endif
+
+#if defined (HAVE_SYS_WAIT_H) || defined (HAVE_UNION_WAIT)
+# include <sys/wait.h>
+#endif
+
+#ifdef HAVE_WAITPID
+# define WAIT_NOHANG(status)    waitpid (-1, (status), WNOHANG)
+#else   /* Don't have waitpid.  */
+# ifdef HAVE_WAIT3
+#  ifndef wait3
+extern int wait3 ();
+#  endif
+#  define WAIT_NOHANG(status)   wait3 ((status), WNOHANG, (struct rusage *) 0)
+# endif /* Have wait3.  */
+#endif /* Have waitpid.  */
+
+#ifdef USE_POSIX_SPAWN
+# include <spawn.h>
+# include "findprog.h"
+#endif
+
+#if !defined (wait) && !defined (POSIX)
+int wait ();
+#endif
+
+#ifndef HAVE_UNION_WAIT
+
+# define WAIT_T int
+
+# ifndef WTERMSIG
+#  define WTERMSIG(x) ((x) & 0x7f)
+# endif
+# ifndef WCOREDUMP
+#  define WCOREDUMP(x) ((x) & 0x80)
+# endif
+# ifndef WEXITSTATUS
+#  define WEXITSTATUS(x) (((x) >> 8) & 0xff)
+# endif
+# ifndef WIFSIGNALED
+#  define WIFSIGNALED(x) (WTERMSIG (x) != 0)
+# endif
+# ifndef WIFEXITED
+#  define WIFEXITED(x) (WTERMSIG (x) == 0)
+# endif
+
+#else   /* Have 'union wait'.  */
+
+# define WAIT_T union wait
+# ifndef WTERMSIG
+#  define WTERMSIG(x) ((x).w_termsig)
+# endif
+# ifndef WCOREDUMP
+#  define WCOREDUMP(x) ((x).w_coredump)
+# endif
+# ifndef WEXITSTATUS
+#  define WEXITSTATUS(x) ((x).w_retcode)
+# endif
+# ifndef WIFSIGNALED
+#  define WIFSIGNALED(x) (WTERMSIG(x) != 0)
+# endif
+# ifndef WIFEXITED
+#  define WIFEXITED(x) (WTERMSIG(x) == 0)
+# endif
+
+#endif  /* Don't have 'union wait'.  */
+
+#if !defined(HAVE_UNISTD_H) && !defined(WINDOWS32)
+int dup2 ();
+int execve ();
+void _exit ();
+# ifndef VMS
+int geteuid ();
+int getegid ();
+int setgid ();
+int getgid ();
+# endif
+#endif
+
+/* Different systems have different requirements for pid_t.
+   Plus we have to support gettext string translation... Argh.  */
+static const char *
+pid2str (pid_t pid)
+{
+  static char pidstring[100];
+#if defined(WINDOWS32) && (__GNUC__ > 3 || _MSC_VER > 1300)
+  /* %Id is only needed for 64-builds, which were not supported by
+      older versions of Windows compilers.  */
+  sprintf (pidstring, "%Id", pid);
+#else
+  sprintf (pidstring, "%lu", (unsigned long) pid);
+#endif
+  return pidstring;
+}
+
+#ifndef HAVE_GETLOADAVG
+int getloadavg (double loadavg[], int nelem);
+#endif
+
+static void free_child (struct child *);
+static void start_job_command (struct child *child);
+static int load_too_high (void);
+static int job_next_command (struct child *);
+static int start_waiting_job (struct child *);
+\f
+/* Chain of all live (or recently deceased) children.  */
+
+struct child *children = 0;
+
+/* Number of children currently running.  */
+
+unsigned int job_slots_used = 0;
+
+/* Nonzero if the 'good' standard input is in use.  */
+
+static int good_stdin_used = 0;
+
+/* Chain of children waiting to run until the load average goes down.  */
+
+static struct child *waiting_jobs = 0;
+
+/* Non-zero if we use a *real* shell (always so on Unix).  */
+
+int unixy_shell = 1;
+
+/* Number of jobs started in the current second.  */
+
+unsigned long job_counter = 0;
+
+/* Number of jobserver tokens this instance is currently using.  */
+
+unsigned int jobserver_tokens = 0;
+\f
+
+#ifdef WINDOWS32
+/*
+ * The macro which references this function is defined in makeint.h.
+ */
+int
+w32_kill (pid_t pid, int sig)
+{
+  return ((process_kill ((HANDLE)pid, sig) == TRUE) ? 0 : -1);
+}
+
+/* This function creates a temporary file name with an extension specified
+ * by the unixy arg.
+ * Return an xmalloc'ed string of a newly created temp file and its
+ * file descriptor, or die.  */
+static char *
+create_batch_file (char const *base, int unixy, int *fd)
+{
+  const char *const ext = unixy ? "sh" : "bat";
+  const char *error_string = NULL;
+  char temp_path[MAXPATHLEN]; /* need to know its length */
+  unsigned path_size = GetTempPath (sizeof temp_path, temp_path);
+  int path_is_dot = 0;
+  /* The following variable is static so we won't try to reuse a name
+     that was generated a little while ago, because that file might
+     not be on disk yet, since we use FILE_ATTRIBUTE_TEMPORARY below,
+     which tells the OS it doesn't need to flush the cache to disk.
+     If the file is not yet on disk, we might think the name is
+     available, while it really isn't.  This happens in parallel
+     builds, where Make doesn't wait for one job to finish before it
+     launches the next one.  */
+  static unsigned uniq = 0;
+  static int second_loop = 0;
+  const size_t sizemax = strlen (base) + strlen (ext) + 10;
+
+  if (path_size == 0)
+    {
+      path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
+      path_is_dot = 1;
+    }
+
+  ++uniq;
+  if (uniq >= 0x10000 && !second_loop)
+    {
+      /* If we already had 64K batch files in this
+         process, make a second loop through the numbers,
+         looking for free slots, i.e. files that were
+         deleted in the meantime.  */
+      second_loop = 1;
+      uniq = 1;
+    }
+  while (path_size > 0 &&
+         path_size + sizemax < sizeof temp_path &&
+         !(uniq >= 0x10000 && second_loop))
+    {
+      unsigned size = sprintf (temp_path + path_size,
+                               "%s%s-%x.%s",
+                               temp_path[path_size - 1] == '\\' ? "" : "\\",
+                               base, uniq, ext);
+      HANDLE h = CreateFile (temp_path,  /* file name */
+                             GENERIC_READ | GENERIC_WRITE, /* desired access */
+                             0,                            /* no share mode */
+                             NULL,                         /* default security attributes */
+                             CREATE_NEW,                   /* creation disposition */
+                             FILE_ATTRIBUTE_NORMAL |       /* flags and attributes */
+                             FILE_ATTRIBUTE_TEMPORARY,     /* we'll delete it */
+                             NULL);                        /* no template file */
+
+      if (h == INVALID_HANDLE_VALUE)
+        {
+          const DWORD er = GetLastError ();
+
+          if (er == ERROR_FILE_EXISTS || er == ERROR_ALREADY_EXISTS)
+            {
+              ++uniq;
+              if (uniq == 0x10000 && !second_loop)
+                {
+                  second_loop = 1;
+                  uniq = 1;
+                }
+            }
+
+          /* the temporary path is not guaranteed to exist */
+          else if (path_is_dot == 0)
+            {
+              path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
+              path_is_dot = 1;
+            }
+
+          else
+            {
+              error_string = map_windows32_error_to_string (er);
+              break;
+            }
+        }
+      else
+        {
+          const unsigned final_size = path_size + size + 1;
+          char *const path = xmalloc (final_size);
+          memcpy (path, temp_path, final_size);
+          *fd = _open_osfhandle ((intptr_t)h, 0);
+          if (unixy)
+            {
+              char *p;
+              int ch;
+              for (p = path; (ch = *p) != 0; ++p)
+                if (ch == '\\')
+                  *p = '/';
+            }
+          return path; /* good return */
+        }
+    }
+
+  *fd = -1;
+  if (error_string == NULL)
+    error_string = _("Cannot create a temporary file\n");
+  O (fatal, NILF, error_string);
+
+  /* not reached */
+  return NULL;
+}
+#endif /* WINDOWS32 */
+
+#ifdef __EMX__
+/* returns whether path is assumed to be a unix like shell. */
+int
+_is_unixy_shell (const char *path)
+{
+  /* list of non unix shells */
+  const char *known_os2shells[] = {
+    "cmd.exe",
+    "cmd",
+    "4os2.exe",
+    "4os2",
+    "4dos.exe",
+    "4dos",
+    "command.com",
+    "command",
+    NULL
+  };
+
+  /* find the rightmost '/' or '\\' */
+  const char *name = strrchr (path, '/');
+  const char *p = strrchr (path, '\\');
+  unsigned i;
+
+  if (name && p)    /* take the max */
+    name = (name > p) ? name : p;
+  else if (p)       /* name must be 0 */
+    name = p;
+  else if (!name)   /* name and p must be 0 */
+    name = path;
+
+  if (*name == '/' || *name == '\\') name++;
+
+  i = 0;
+  while (known_os2shells[i] != NULL)
+    {
+      if (strcasecmp (name, known_os2shells[i]) == 0)
+        return 0; /* not a unix shell */
+      i++;
+    }
+
+  /* in doubt assume a unix like shell */
+  return 1;
+}
+#endif /* __EMX__ */
+
+/* determines whether path looks to be a Bourne-like shell. */
+int
+is_bourne_compatible_shell (const char *path)
+{
+  /* List of known POSIX (or POSIX-ish) shells.  */
+  static const char *unix_shells[] = {
+    "sh",
+    "bash",
+    "ksh",
+    "rksh",
+    "zsh",
+    "ash",
+    "dash",
+    NULL
+  };
+  const char **s;
+
+  /* find the rightmost '/' or '\\' */
+  const char *name = strrchr (path, '/');
+  char *p = strrchr (path, '\\');
+
+  if (name && p)    /* take the max */
+    name = (name > p) ? name : p;
+  else if (p)       /* name must be 0 */
+    name = p;
+  else if (!name)   /* name and p must be 0 */
+    name = path;
+
+  if (*name == '/' || *name == '\\')
+    ++name;
+
+  /* this should be able to deal with extensions on Windows-like systems */
+  for (s = unix_shells; *s != NULL; ++s)
+    {
+#if defined(WINDOWS32) || defined(__MSDOS__)
+      size_t len = strlen (*s);
+      if ((strlen (name) >= len && STOP_SET (name[len], MAP_DOT|MAP_NUL))
+          && strncasecmp (name, *s, len) == 0)
+#else
+      if (strcmp (name, *s) == 0)
+#endif
+        return 1; /* a known unix-style shell */
+    }
+
+  /* if not on the list, assume it's not a Bourne-like shell */
+  return 0;
+}
+
+#ifdef POSIX
+extern sigset_t fatal_signal_set;
+
+static void
+block_sigs ()
+{
+  sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0);
+}
+
+static void
+unblock_sigs ()
+{
+  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, (sigset_t *) 0);
+}
+
+void
+unblock_all_sigs ()
+{
+  sigset_t empty;
+  sigemptyset (&empty);
+  sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0);
+}
+
+#elif defined(HAVE_SIGSETMASK)
+
+extern int fatal_signal_mask;
+
+static void
+block_sigs ()
+{
+  sigblock (fatal_signal_mask);
+}
+
+static void
+unblock_sigs ()
+{
+  sigsetmask (siggetmask (0) & ~fatal_signal_mask)
+}
+
+void
+unblock_all_sigs ()
+{
+  sigsetmask (0);
+}
+
+#else
+
+#define block_sigs()
+#define unblock_sigs()
+
+void
+unblock_all_sigs ()
+{
+}
+
+#endif
+\f
+/* Write an error message describing the exit status given in
+   EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME.
+   Append "(ignored)" if IGNORED is nonzero.  */
+
+static void
+child_error (struct child *child,
+             int exit_code, int exit_sig, int coredump, int ignored)
+{
+  const char *pre = "*** ";
+  const char *post = "";
+  const char *dump = "";
+  const struct file *f = child->file;
+  const floc *flocp = &f->cmds->fileinfo;
+  const char *nm;
+  size_t l;
+
+  if (ignored && run_silent)
+    return;
+
+  if (exit_sig && coredump)
+    dump = _(" (core dumped)");
+
+  if (ignored)
+    {
+      pre = "";
+      post = _(" (ignored)");
+    }
+
+  if (! flocp->filenm)
+    nm = _("<builtin>");
+  else
+    {
+      char *a = alloca (strlen (flocp->filenm) + 6 + INTSTR_LENGTH + 1);
+      sprintf (a, "%s:%lu", flocp->filenm, flocp->lineno + flocp->offset);
+      nm = a;
+    }
+
+  l = strlen (pre) + strlen (nm) + strlen (f->name) + strlen (post);
+
+  OUTPUT_SET (&child->output);
+
+  show_goal_error ();
+
+  if (exit_sig == 0)
+    error (NILF, l + INTSTR_LENGTH,
+           _("%s[%s: %s] Error %d%s"), pre, nm, f->name, exit_code, post);
+  else
+    {
+      const char *s = strsignal (exit_sig);
+      error (NILF, l + strlen (s) + strlen (dump),
+             "%s[%s: %s] %s%s%s", pre, nm, f->name, s, dump, post);
+    }
+
+  OUTPUT_UNSET ();
+}
+\f
+
+/* Handle a dead child.  This handler may or may not ever be installed.
+
+   If we're using the jobserver feature without pselect(), we need it.
+   First, installing it ensures the read will interrupt on SIGCHLD.  Second,
+   we close the dup'd read FD to ensure we don't enter another blocking read
+   without reaping all the dead children.  In this case we don't need the
+   dead_children count.
+
+   If we don't have either waitpid or wait3, then make is unreliable, but we
+   use the dead_children count to reap children as best we can.  */
+
+static unsigned int dead_children = 0;
+
+RETSIGTYPE
+child_handler (int sig UNUSED)
+{
+  ++dead_children;
+
+  jobserver_signal ();
+
+#ifdef __EMX__
+  /* The signal handler must called only once! */
+  signal (SIGCHLD, SIG_DFL);
+#endif
+}
+
+extern pid_t shell_function_pid;
+
+/* Reap all dead children, storing the returned status and the new command
+   state ('cs_finished') in the 'file' member of the 'struct child' for the
+   dead child, and removing the child from the chain.  In addition, if BLOCK
+   nonzero, we block in this function until we've reaped at least one
+   complete child, waiting for it to die if necessary.  If ERR is nonzero,
+   print an error message first.  */
+
+void
+reap_children (int block, int err)
+{
+#ifndef WINDOWS32
+  WAIT_T status;
+#endif
+  /* Initially, assume we have some.  */
+  int reap_more = 1;
+
+#ifdef WAIT_NOHANG
+# define REAP_MORE reap_more
+#else
+# define REAP_MORE dead_children
+#endif
+
+  /* As long as:
+
+       We have at least one child outstanding OR a shell function in progress,
+         AND
+       We're blocking for a complete child OR there are more children to reap
+
+     we'll keep reaping children.  */
+
+  while ((children != 0 || shell_function_pid != 0)
+         && (block || REAP_MORE))
+    {
+      unsigned int remote = 0;
+      pid_t pid;
+      int exit_code, exit_sig, coredump;
+      struct child *lastc, *c;
+      int child_failed;
+      int any_remote, any_local;
+      int dontcare;
+
+      if (err && block)
+        {
+          static int printed = 0;
+
+          /* We might block for a while, so let the user know why.
+             Only print this message once no matter how many jobs are left.  */
+          fflush (stdout);
+          if (!printed)
+            O (error, NILF, _("*** Waiting for unfinished jobs...."));
+          printed = 1;
+        }
+
+      /* We have one less dead child to reap.  As noted in
+         child_handler() above, this count is completely unimportant for
+         all modern, POSIX-y systems that support wait3() or waitpid().
+         The rest of this comment below applies only to early, broken
+         pre-POSIX systems.  We keep the count only because... it's there...
+
+         The test and decrement are not atomic; if it is compiled into:
+                register = dead_children - 1;
+                dead_children = register;
+         a SIGCHLD could come between the two instructions.
+         child_handler increments dead_children.
+         The second instruction here would lose that increment.  But the
+         only effect of dead_children being wrong is that we might wait
+         longer than necessary to reap a child, and lose some parallelism;
+         and we might print the "Waiting for unfinished jobs" message above
+         when not necessary.  */
+
+      if (dead_children > 0)
+        --dead_children;
+
+      any_remote = 0;
+      any_local = shell_function_pid != 0;
+      lastc = 0;
+      for (c = children; c != 0; lastc = c, c = c->next)
+        {
+          any_remote |= c->remote;
+          any_local |= ! c->remote;
+
+          /* If pid < 0, this child never even started.  Handle it.  */
+          if (c->pid < 0)
+            {
+              exit_sig = 0;
+              coredump = 0;
+              /* According to POSIX, 127 is used for command not found.  */
+              exit_code = 127;
+              goto process_child;
+            }
+
+          DB (DB_JOBS, (_("Live child %p (%s) PID %s %s\n"),
+                        c, c->file->name, pid2str (c->pid),
+                        c->remote ? _(" (remote)") : ""));
+#ifdef VMS
+          break;
+#endif
+        }
+
+      /* First, check for remote children.  */
+      if (any_remote)
+        pid = remote_status (&exit_code, &exit_sig, &coredump, 0);
+      else
+        pid = 0;
+
+      if (pid > 0)
+        /* We got a remote child.  */
+        remote = 1;
+      else if (pid < 0)
+        {
+          /* A remote status command failed miserably.  Punt.  */
+#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32)
+        remote_status_lose:
+#endif
+          pfatal_with_name ("remote_status");
+        }
+      else
+        {
+          /* No remote children.  Check for local children.  */
+#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32)
+          if (any_local)
+            {
+#ifdef VMS
+              /* Todo: This needs more untangling multi-process support */
+              /* Just do single child process support now */
+              vmsWaitForChildren (&status);
+              pid = c->pid;
+
+              /* VMS failure status can not be fully translated */
+              status = $VMS_STATUS_SUCCESS (c->cstatus) ? 0 : (1 << 8);
+
+              /* A Posix failure can be exactly translated */
+              if ((c->cstatus & VMS_POSIX_EXIT_MASK) == VMS_POSIX_EXIT_MASK)
+                status = (c->cstatus >> 3 & 255) << 8;
+#else
+#ifdef WAIT_NOHANG
+              if (!block)
+                pid = WAIT_NOHANG (&status);
+              else
+#endif
+                EINTRLOOP (pid, wait (&status));
+#endif /* !VMS */
+            }
+          else
+            pid = 0;
+
+          if (pid < 0)
+            {
+              /* The wait*() failed miserably.  Punt.  */
+              pfatal_with_name ("wait");
+            }
+          else if (pid > 0)
+            {
+              /* We got a child exit; chop the status word up.  */
+              exit_code = WEXITSTATUS (status);
+              exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0;
+              coredump = WCOREDUMP (status);
+            }
+          else
+            {
+              /* No local children are dead.  */
+              reap_more = 0;
+
+              if (!block || !any_remote)
+                break;
+
+              /* Now try a blocking wait for a remote child.  */
+              pid = remote_status (&exit_code, &exit_sig, &coredump, 1);
+              if (pid < 0)
+                goto remote_status_lose;
+              else if (pid == 0)
+                /* No remote children either.  Finally give up.  */
+                break;
+
+              /* We got a remote child.  */
+              remote = 1;
+            }
+#endif /* !__MSDOS__, !Amiga, !WINDOWS32.  */
+
+#ifdef __MSDOS__
+          /* Life is very different on MSDOS.  */
+          pid = dos_pid - 1;
+          status = dos_status;
+          exit_code = WEXITSTATUS (status);
+          if (exit_code == 0xff)
+            exit_code = -1;
+          exit_sig = WIFSIGNALED (status) ? WTERMSIG (status) : 0;
+          coredump = 0;
+#endif /* __MSDOS__ */
+#ifdef _AMIGA
+          /* Same on Amiga */
+          pid = amiga_pid - 1;
+          status = amiga_status;
+          exit_code = amiga_status;
+          exit_sig = 0;
+          coredump = 0;
+#endif /* _AMIGA */
+#ifdef WINDOWS32
+          {
+            HANDLE hPID;
+            HANDLE hcTID, hcPID;
+            DWORD dwWaitStatus = 0;
+            exit_code = 0;
+            exit_sig = 0;
+            coredump = 0;
+
+            /* Record the thread ID of the main process, so that we
+               could suspend it in the signal handler.  */
+            if (!main_thread)
+              {
+                hcTID = GetCurrentThread ();
+                hcPID = GetCurrentProcess ();
+                if (!DuplicateHandle (hcPID, hcTID, hcPID, &main_thread, 0,
+                                      FALSE, DUPLICATE_SAME_ACCESS))
+                  {
+                    DWORD e = GetLastError ();
+                    fprintf (stderr,
+                             "Determine main thread ID (Error %ld: %s)\n",
+                             e, map_windows32_error_to_string (e));
+                  }
+                else
+                  DB (DB_VERBOSE, ("Main thread handle = %p\n", main_thread));
+              }
+
+            /* wait for anything to finish */
+            hPID = process_wait_for_any (block, &dwWaitStatus);
+            if (hPID)
+              {
+                /* was an error found on this process? */
+                int werr = process_last_err (hPID);
+
+                /* get exit data */
+                exit_code = process_exit_code (hPID);
+
+                /* the extra tests of exit_code are here to prevent
+                   map_windows32_error_to_string from calling 'fatal',
+                   which will then call reap_children again */
+                if (werr && exit_code > 0 && exit_code < WSABASEERR)
+                  fprintf (stderr, "make (e=%d): %s", exit_code,
+                           map_windows32_error_to_string (exit_code));
+
+                /* signal */
+                exit_sig = process_signal (hPID);
+
+                /* cleanup process */
+                process_cleanup (hPID);
+
+                coredump = 0;
+              }
+            else if (dwWaitStatus == WAIT_FAILED)
+              {
+                /* The WaitForMultipleObjects() failed miserably.  Punt.  */
+                pfatal_with_name ("WaitForMultipleObjects");
+              }
+            else if (dwWaitStatus == WAIT_TIMEOUT)
+              {
+                /* No child processes are finished.  Give up waiting. */
+                reap_more = 0;
+                break;
+              }
+
+            pid = (pid_t) hPID;
+          }
+#endif /* WINDOWS32 */
+        }
+
+      /* Check if this is the child of the 'shell' function.  */
+      if (!remote && pid == shell_function_pid)
+        {
+          shell_completed (exit_code, exit_sig);
+          break;
+        }
+
+      /* Search for a child matching the deceased one.  */
+      lastc = 0;
+      for (c = children; c != 0; lastc = c, c = c->next)
+        if (c->pid == pid && c->remote == remote)
+          break;
+
+      if (c == 0)
+        /* An unknown child died.
+           Ignore it; it was inherited from our invoker.  */
+        continue;
+
+      DB (DB_JOBS, (exit_sig == 0 && exit_code == 0
+                    ? _("Reaping winning child %p PID %s %s\n")
+                    : _("Reaping losing child %p PID %s %s\n"),
+                    c, pid2str (c->pid), c->remote ? _(" (remote)") : ""));
+
+      /* If we have started jobs in this second, remove one.  */
+      if (job_counter)
+        --job_counter;
+
+    process_child:
+
+#if defined(USE_POSIX_SPAWN)
+      /* Some versions of posix_spawn() do not detect errors such as command
+         not found until after they fork.  In that case they will exit with a
+         code of 127.  Try to detect that and provide a useful error message.
+         Otherwise we'll just show the error below, as normal.  */
+      if (exit_sig == 0 && exit_code == 127 && c->cmd_name)
+        {
+          const char *e = NULL;
+          struct stat st;
+          int r;
+
+          /* There are various ways that this will show a different error than
+             fork/exec.  To really get the right error we'd have to fall back
+             to fork/exec but I don't want to bother with that.  Just do the
+             best we can.  */
+
+          EINTRLOOP(r, stat(c->cmd_name, &st));
+          if (r < 0)
+            e = strerror (errno);
+          else if (S_ISDIR(st.st_mode) || !(st.st_mode & S_IXUSR))
+            e = strerror (EACCES);
+          else if (st.st_size == 0)
+            e = strerror (ENOEXEC);
+
+          if (e)
+            OSS(error, NILF, "%s: %s", c->cmd_name, e);
+        }
+#endif
+
+      /* Determine the failure status: 0 for success, 1 for updating target in
+         question mode, 2 for anything else.  */
+      if (exit_sig == 0 && exit_code == 0)
+        child_failed = MAKE_SUCCESS;
+      else if (exit_sig == 0 && exit_code == 1 && question_flag && c->recursive)
+        child_failed = MAKE_TROUBLE;
+      else
+        child_failed = MAKE_FAILURE;
+
+      if (c->sh_batch_file)
+        {
+          int rm_status;
+
+          DB (DB_JOBS, (_("Cleaning up temp batch file %s\n"),
+                        c->sh_batch_file));
+
+          errno = 0;
+          rm_status = remove (c->sh_batch_file);
+          if (rm_status)
+            DB (DB_JOBS, (_("Cleaning up temp batch file %s failed (%d)\n"),
+                          c->sh_batch_file, errno));
+
+          /* all done with memory */
+          free (c->sh_batch_file);
+          c->sh_batch_file = NULL;
+        }
+
+      /* If this child had the good stdin, say it is now free.  */
+      if (c->good_stdin)
+        good_stdin_used = 0;
+
+      dontcare = c->dontcare;
+
+      if (child_failed && !c->noerror && !ignore_errors_flag)
+        {
+          /* The commands failed.  Write an error message,
+             delete non-precious targets, and abort.  */
+          static int delete_on_error = -1;
+
+          if (!dontcare && child_failed == MAKE_FAILURE)
+            child_error (c, exit_code, exit_sig, coredump, 0);
+
+          c->file->update_status = child_failed == MAKE_FAILURE ? us_failed : us_question;
+          if (delete_on_error == -1)
+            {
+              struct file *f = lookup_file (".DELETE_ON_ERROR");
+              delete_on_error = f != 0 && f->is_target;
+            }
+          if (exit_sig != 0 || delete_on_error)
+            delete_child_targets (c);
+        }
+      else
+        {
+          if (child_failed)
+            {
+              /* The commands failed, but we don't care.  */
+              child_error (c, exit_code, exit_sig, coredump, 1);
+              child_failed = 0;
+            }
+
+          /* If there are more commands to run, try to start them.  */
+          if (job_next_command (c))
+            {
+              if (handling_fatal_signal)
+                {
+                  /* Never start new commands while we are dying.
+                     Since there are more commands that wanted to be run,
+                     the target was not completely remade.  So we treat
+                     this as if a command had failed.  */
+                  c->file->update_status = us_failed;
+                }
+              else
+                {
+#ifndef NO_OUTPUT_SYNC
+                  /* If we're sync'ing per line, write the previous line's
+                     output before starting the next one.  */
+                  if (output_sync == OUTPUT_SYNC_LINE)
+                    output_dump (&c->output);
+#endif
+                  /* Check again whether to start remotely.
+                     Whether or not we want to changes over time.
+                     Also, start_remote_job may need state set up
+                     by start_remote_job_p.  */
+                  c->remote = start_remote_job_p (0);
+                  start_job_command (c);
+                  /* Fatal signals are left blocked in case we were
+                     about to put that child on the chain.  But it is
+                     already there, so it is safe for a fatal signal to
+                     arrive now; it will clean up this child's targets.  */
+                  unblock_sigs ();
+                  if (c->file->command_state == cs_running)
+                    /* We successfully started the new command.
+                       Loop to reap more children.  */
+                    continue;
+                }
+
+              if (c->file->update_status != us_success)
+                /* We failed to start the commands.  */
+                delete_child_targets (c);
+            }
+          else
+            /* There are no more commands.  We got through them all
+               without an unignored error.  Now the target has been
+               successfully updated.  */
+            c->file->update_status = us_success;
+        }
+
+      /* When we get here, all the commands for c->file are finished.  */
+
+#ifndef NO_OUTPUT_SYNC
+      /* Synchronize any remaining parallel output.  */
+      output_dump (&c->output);
+#endif
+
+      /* At this point c->file->update_status is success or failed.  But
+         c->file->command_state is still cs_running if all the commands
+         ran; notice_finished_file looks for cs_running to tell it that
+         it's interesting to check the file's modtime again now.  */
+
+      if (! handling_fatal_signal)
+        /* Notice if the target of the commands has been changed.
+           This also propagates its values for command_state and
+           update_status to its also_make files.  */
+        notice_finished_file (c->file);
+
+      /* Block fatal signals while frobnicating the list, so that
+         children and job_slots_used are always consistent.  Otherwise
+         a fatal signal arriving after the child is off the chain and
+         before job_slots_used is decremented would believe a child was
+         live and call reap_children again.  */
+      block_sigs ();
+
+      if (c->pid > 0)
+        {
+          DB (DB_JOBS, (_("Removing child %p PID %s%s from chain.\n"),
+                        c, pid2str (c->pid), c->remote ? _(" (remote)") : ""));
+        }
+
+      /* There is now another slot open.  */
+      if (job_slots_used > 0)
+        job_slots_used -= c->jobslot;
+
+      /* Remove the child from the chain and free it.  */
+      if (lastc == 0)
+        children = c->next;
+      else
+        lastc->next = c->next;
+
+      free_child (c);
+
+      unblock_sigs ();
+
+      /* If the job failed, and the -k flag was not given, die,
+         unless we are already in the process of dying.  */
+      if (!err && child_failed && !dontcare && !keep_going_flag &&
+          /* fatal_error_signal will die with the right signal.  */
+          !handling_fatal_signal)
+        die (child_failed);
+
+      /* Only block for one child.  */
+      block = 0;
+    }
+
+  return;
+}
+\f
+/* Free the storage allocated for CHILD.  */
+
+static void
+free_child (struct child *child)
+{
+  output_close (&child->output);
+
+  if (!jobserver_tokens)
+    ONS (fatal, NILF, "INTERNAL: Freeing child %p (%s) but no tokens left!\n",
+         child, child->file->name);
+
+  /* If we're using the jobserver and this child is not the only outstanding
+     job, put a token back into the pipe for it.  */
+
+  if (jobserver_enabled () && jobserver_tokens > 1)
+    {
+      jobserver_release (1);
+      DB (DB_JOBS, (_("Released token for child %p (%s).\n"),
+                    child, child->file->name));
+    }
+
+  --jobserver_tokens;
+
+  if (handling_fatal_signal) /* Don't bother free'ing if about to die.  */
+    return;
+
+  if (child->command_lines != 0)
+    {
+      unsigned int i;
+      for (i = 0; i < child->file->cmds->ncommand_lines; ++i)
+        free (child->command_lines[i]);
+      free (child->command_lines);
+    }
+
+  if (child->environment != 0)
+    {
+      char **ep = child->environment;
+      while (*ep != 0)
+        free (*ep++);
+      free (child->environment);
+    }
+
+  free (child->cmd_name);
+  free (child);
+}
+\f
+
+/* Start a job to run the commands specified in CHILD.
+   CHILD is updated to reflect the commands and ID of the child process.
+
+   NOTE: On return fatal signals are blocked!  The caller is responsible
+   for calling 'unblock_sigs', once the new child is safely on the chain so
+   it can be cleaned up in the event of a fatal signal.  */
+
+static void
+start_job_command (struct child *child)
+{
+  int flags;
+  char *p;
+#ifdef VMS
+# define FREE_ARGV(_a)
+  char *argv;
+#else
+# define FREE_ARGV(_a) do{ if (_a) { free ((_a)[0]); free (_a); } }while(0)
+  char **argv;
+#endif
+
+  /* If we have a completely empty commandset, stop now.  */
+  if (!child->command_ptr)
+    goto next_command;
+
+  /* Combine the flags parsed for the line itself with
+     the flags specified globally for this target.  */
+  flags = (child->file->command_flags
+           | child->file->cmds->lines_flags[child->command_line - 1]);
+
+  p = child->command_ptr;
+  child->noerror = ((flags & COMMANDS_NOERROR) != 0);
+
+  while (*p != '\0')
+    {
+      if (*p == '@')
+        flags |= COMMANDS_SILENT;
+      else if (*p == '+')
+        flags |= COMMANDS_RECURSE;
+      else if (*p == '-')
+        child->noerror = 1;
+      /* Don't skip newlines.  */
+      else if (!ISBLANK (*p))
+        break;
+      ++p;
+    }
+
+  child->recursive = ((flags & COMMANDS_RECURSE) != 0);
+
+  /* Update the file's command flags with any new ones we found.  We only
+     keep the COMMANDS_RECURSE setting.  Even this isn't 100% correct; we are
+     now marking more commands recursive than should be in the case of
+     multiline define/endef scripts where only one line is marked "+".  In
+     order to really fix this, we'll have to keep a lines_flags for every
+     actual line, after expansion.  */
+  child->file->cmds->lines_flags[child->command_line - 1] |= flags & COMMANDS_RECURSE;
+
+  /* POSIX requires that a recipe prefix after a backslash-newline should
+     be ignored.  Remove it now so the output is correct.  */
+  {
+    char prefix = child->file->cmds->recipe_prefix;
+    char *p1, *p2;
+    p1 = p2 = p;
+    while (*p1 != '\0')
+      {
+        *(p2++) = *p1;
+        if (p1[0] == '\n' && p1[1] == prefix)
+          ++p1;
+        ++p1;
+      }
+    *p2 = *p1;
+  }
+
+  /* Figure out an argument list from this command line.  */
+  {
+    char *end = 0;
+#ifdef VMS
+    /* Skip any leading whitespace */
+    while (*p)
+      {
+        if (!ISSPACE (*p))
+          {
+            if (*p != '\\')
+              break;
+            if ((p[1] != '\n') && (p[1] != 'n') && (p[1] != 't'))
+              break;
+          }
+        p++;
+      }
+
+    argv = p;
+    /* Please note, for VMS argv is a string (not an array of strings) which
+       contains the complete command line, which for multi-line variables
+       still includes the newlines.  So detect newlines and set 'end' (which
+       is used for child->command_ptr) instead of (re-)writing
+       construct_command_argv */
+    if (!one_shell)
+      {
+        char *s = p;
+        int instring = 0;
+        while (*s)
+          {
+            if (*s == '"')
+              instring = !instring;
+            else if (*s == '\\' && !instring && *(s+1) != 0)
+              s++;
+            else if (*s == '\n' && !instring)
+              {
+                end = s;
+                break;
+              }
+            ++s;
+          }
+      }
+#else
+    argv = construct_command_argv (p, &end, child->file,
+                                   child->file->cmds->lines_flags[child->command_line - 1],
+                                   &child->sh_batch_file);
+#endif
+    if (end == NULL)
+      child->command_ptr = NULL;
+    else
+      {
+        *end++ = '\0';
+        child->command_ptr = end;
+      }
+  }
+
+  /* If -q was given, say that updating 'failed' if there was any text on the
+     command line, or 'succeeded' otherwise.  The exit status of 1 tells the
+     user that -q is saying 'something to do'; the exit status for a random
+     error is 2.  */
+  if (argv != 0 && question_flag && !(flags & COMMANDS_RECURSE))
+    {
+      FREE_ARGV (argv);
+#ifdef VMS
+      /* On VMS, argv[0] can be a null string here */
+      if (argv[0] != 0)
+        {
+#endif
+          child->file->update_status = us_question;
+          notice_finished_file (child->file);
+          return;
+#ifdef VMS
+        }
+#endif
+    }
+
+  if (touch_flag && !(flags & COMMANDS_RECURSE))
+    {
+      /* Go on to the next command.  It might be the recursive one.
+         We construct ARGV only to find the end of the command line.  */
+      FREE_ARGV (argv);
+      argv = 0;
+    }
+
+  if (argv == 0)
+    {
+    next_command:
+#ifdef __MSDOS__
+      execute_by_shell = 0;   /* in case construct_command_argv sets it */
+#endif
+      /* This line has no commands.  Go to the next.  */
+      if (job_next_command (child))
+        start_job_command (child);
+      else
+        {
+          /* No more commands.  Make sure we're "running"; we might not be if
+             (e.g.) all commands were skipped due to -n.  */
+          set_command_state (child->file, cs_running);
+          child->file->update_status = us_success;
+          notice_finished_file (child->file);
+        }
+
+      OUTPUT_UNSET();
+      return;
+    }
+
+  /* Are we going to synchronize this command's output?  Do so if either we're
+     in SYNC_RECURSE mode or this command is not recursive.  We'll also check
+     output_sync separately below in case it changes due to error.  */
+  child->output.syncout = output_sync && (output_sync == OUTPUT_SYNC_RECURSE
+                                          || !(flags & COMMANDS_RECURSE));
+
+  OUTPUT_SET (&child->output);
+
+#ifndef NO_OUTPUT_SYNC
+  if (! child->output.syncout)
+    /* We don't want to sync this command: to avoid misordered
+       output ensure any already-synced content is written.  */
+    output_dump (&child->output);
+#endif
+
+  /* Print the command if appropriate.  */
+  if (just_print_flag || trace_flag
+      || (!(flags & COMMANDS_SILENT) && !run_silent))
+    OS (message, 0, "%s", p);
+
+  /* Tell update_goal_chain that a command has been started on behalf of
+     this target.  It is important that this happens here and not in
+     reap_children (where we used to do it), because reap_children might be
+     reaping children from a different target.  We want this increment to
+     guaranteedly indicate that a command was started for the dependency
+     chain (i.e., update_file recursion chain) we are processing.  */
+
+  ++commands_started;
+
+  /* Optimize an empty command.  People use this for timestamp rules,
+     so avoid forking a useless shell.  Do this after we increment
+     commands_started so make still treats this special case as if it
+     performed some action (makes a difference as to what messages are
+     printed, etc.  */
+
+#if !defined(VMS) && !defined(_AMIGA)
+  if (
+#if defined __MSDOS__ || defined (__EMX__)
+      unixy_shell       /* the test is complicated and we already did it */
+#else
+      (argv[0] && is_bourne_compatible_shell (argv[0]))
+#endif
+      && (argv[1] && argv[1][0] == '-'
+        &&
+            ((argv[1][1] == 'c' && argv[1][2] == '\0')
+          ||
+             (argv[1][1] == 'e' && argv[1][2] == 'c' && argv[1][3] == '\0')))
+      && (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0')
+      && argv[3] == NULL)
+    {
+      FREE_ARGV (argv);
+      goto next_command;
+    }
+#endif  /* !VMS && !_AMIGA */
+
+  /* If -n was given, recurse to get the next line in the sequence.  */
+
+  if (just_print_flag && !(flags & COMMANDS_RECURSE))
+    {
+      FREE_ARGV (argv);
+      goto next_command;
+    }
+
+  /* We're sure we're going to invoke a command: set up the output.  */
+  output_start ();
+
+  /* Flush the output streams so they won't have things written twice.  */
+
+  fflush (stdout);
+  fflush (stderr);
+
+  /* Decide whether to give this child the 'good' standard input
+     (one that points to the terminal or whatever), or the 'bad' one
+     that points to the read side of a broken pipe.  */
+
+  child->good_stdin = !good_stdin_used;
+  if (child->good_stdin)
+    good_stdin_used = 1;
+
+  child->deleted = 0;
+
+#ifndef _AMIGA
+  /* Set up the environment for the child.  */
+  if (child->environment == 0)
+    child->environment = target_environment (child->file);
+#endif
+
+#if !defined(__MSDOS__) && !defined(_AMIGA) && !defined(WINDOWS32)
+
+#ifndef VMS
+  /* start_waiting_job has set CHILD->remote if we can start a remote job.  */
+  if (child->remote)
+    {
+      int is_remote, used_stdin;
+      pid_t id;
+      if (start_remote_job (argv, child->environment,
+                            child->good_stdin ? 0 : get_bad_stdin (),
+                            &is_remote, &id, &used_stdin))
+        /* Don't give up; remote execution may fail for various reasons.  If
+           so, simply run the job locally.  */
+        goto run_local;
+      else
+        {
+          if (child->good_stdin && !used_stdin)
+            {
+              child->good_stdin = 0;
+              good_stdin_used = 0;
+            }
+          child->remote = is_remote;
+          child->pid = id;
+        }
+    }
+  else
+#endif /* !VMS */
+    {
+      /* Fork the child process.  */
+
+      char **parent_environ;
+
+    run_local:
+      block_sigs ();
+
+      child->remote = 0;
+
+#ifdef VMS
+      child->pid = child_execute_job ((struct childbase *)child, 1, argv);
+
+#else
+
+      parent_environ = environ;
+
+      jobserver_pre_child (flags & COMMANDS_RECURSE);
+
+      child->pid = child_execute_job ((struct childbase *)child,
+                                      child->good_stdin, argv);
+
+      environ = parent_environ; /* Restore value child may have clobbered.  */
+      jobserver_post_child (flags & COMMANDS_RECURSE);
+
+#endif /* !VMS */
+    }
+
+#else   /* __MSDOS__ or Amiga or WINDOWS32 */
+#ifdef __MSDOS__
+  {
+    int proc_return;
+
+    block_sigs ();
+    dos_status = 0;
+
+    /* We call 'system' to do the job of the SHELL, since stock DOS
+       shell is too dumb.  Our 'system' knows how to handle long
+       command lines even if pipes/redirection is needed; it will only
+       call COMMAND.COM when its internal commands are used.  */
+    if (execute_by_shell)
+      {
+        char *cmdline = argv[0];
+        /* We don't have a way to pass environment to 'system',
+           so we need to save and restore ours, sigh...  */
+        char **parent_environ = environ;
+
+        environ = child->environment;
+
+        /* If we have a *real* shell, tell 'system' to call
+           it to do everything for us.  */
+        if (unixy_shell)
+          {
+            /* A *real* shell on MSDOS may not support long
+               command lines the DJGPP way, so we must use 'system'.  */
+            cmdline = argv[2];  /* get past "shell -c" */
+          }
+
+        dos_command_running = 1;
+        proc_return = system (cmdline);
+        environ = parent_environ;
+        execute_by_shell = 0;   /* for the next time */
+      }
+    else
+      {
+        dos_command_running = 1;
+        proc_return = spawnvpe (P_WAIT, argv[0], argv, child->environment);
+      }
+
+    /* Need to unblock signals before turning off
+       dos_command_running, so that child's signals
+       will be treated as such (see fatal_error_signal).  */
+    unblock_sigs ();
+    dos_command_running = 0;
+
+    /* If the child got a signal, dos_status has its
+       high 8 bits set, so be careful not to alter them.  */
+    if (proc_return == -1)
+      dos_status |= 0xff;
+    else
+      dos_status |= (proc_return & 0xff);
+    ++dead_children;
+    child->pid = dos_pid++;
+  }
+#endif /* __MSDOS__ */
+#ifdef _AMIGA
+  amiga_status = MyExecute (argv);
+
+  ++dead_children;
+  child->pid = amiga_pid++;
+  if (amiga_batch_file)
+  {
+     amiga_batch_file = 0;
+     DeleteFile (amiga_bname);        /* Ignore errors.  */
+  }
+#endif  /* Amiga */
+#ifdef WINDOWS32
+  {
+      HANDLE hPID;
+      char* arg0;
+      int outfd = FD_STDOUT;
+      int errfd = FD_STDERR;
+
+      /* make UNC paths safe for CreateProcess -- backslash format */
+      arg0 = argv[0];
+      if (arg0 && arg0[0] == '/' && arg0[1] == '/')
+        for ( ; arg0 && *arg0; arg0++)
+          if (*arg0 == '/')
+            *arg0 = '\\';
+
+      /* make sure CreateProcess() has Path it needs */
+      sync_Path_environment ();
+
+#ifndef NO_OUTPUT_SYNC
+      /* Divert child output if output_sync in use.  */
+      if (child->output.syncout)
+        {
+          if (child->output.out >= 0)
+            outfd = child->output.out;
+          if (child->output.err >= 0)
+            errfd = child->output.err;
+        }
+#else
+      outfd = errfd = -1;
+#endif
+      hPID = process_easy (argv, child->environment, outfd, errfd);
+
+      if (hPID != INVALID_HANDLE_VALUE)
+        child->pid = (pid_t) hPID;
+      else
+        {
+          int i;
+          unblock_sigs ();
+          fprintf (stderr,
+                   _("process_easy() failed to launch process (e=%ld)\n"),
+                   process_last_err (hPID));
+          for (i = 0; argv[i]; i++)
+            fprintf (stderr, "%s ", argv[i]);
+          fprintf (stderr, _("\nCounted %d args in failed launch\n"), i);
+          child->pid = -1;
+        }
+  }
+#endif /* WINDOWS32 */
+#endif  /* __MSDOS__ or Amiga or WINDOWS32 */
+
+  /* Bump the number of jobs started in this second.  */
+  if (child->pid >= 0)
+    ++job_counter;
+
+  /* Set the state to running.  */
+  set_command_state (child->file, cs_running);
+
+  /* Free the storage used by the child's argument list.  */
+  FREE_ARGV (argv);
+
+  OUTPUT_UNSET();
+
+#undef FREE_ARGV
+}
+
+/* Try to start a child running.
+   Returns nonzero if the child was started (and maybe finished), or zero if
+   the load was too high and the child was put on the 'waiting_jobs' chain.  */
+
+static int
+start_waiting_job (struct child *c)
+{
+  struct file *f = c->file;
+
+  /* If we can start a job remotely, we always want to, and don't care about
+     the local load average.  We record that the job should be started
+     remotely in C->remote for start_job_command to test.  */
+
+  c->remote = start_remote_job_p (1);
+
+  /* If we are running at least one job already and the load average
+     is too high, make this one wait.  */
+  if (!c->remote
+      && ((job_slots_used > 0 && load_too_high ())
+#ifdef WINDOWS32
+          || process_table_full ()
+#endif
+          ))
+    {
+      /* Put this child on the chain of children waiting for the load average
+         to go down.  */
+      set_command_state (f, cs_running);
+      c->next = waiting_jobs;
+      waiting_jobs = c;
+      return 0;
+    }
+
+  /* Start the first command; reap_children will run later command lines.  */
+  start_job_command (c);
+
+  switch (f->command_state)
+    {
+    case cs_running:
+      c->next = children;
+      if (c->pid > 0)
+        {
+          DB (DB_JOBS, (_("Putting child %p (%s) PID %s%s on the chain.\n"),
+                        c, c->file->name, pid2str (c->pid),
+                        c->remote ? _(" (remote)") : ""));
+          /* One more job slot is in use.  */
+          ++job_slots_used;
+          assert (c->jobslot == 0);
+          c->jobslot = 1;
+        }
+      children = c;
+      unblock_sigs ();
+      break;
+
+    case cs_not_started:
+      /* All the command lines turned out to be empty.  */
+      f->update_status = us_success;
+      /* FALLTHROUGH */
+
+    case cs_finished:
+      notice_finished_file (f);
+      free_child (c);
+      break;
+
+    default:
+      assert (f->command_state == cs_finished);
+      break;
+    }
+
+  return 1;
+}
+
+/* Create a 'struct child' for FILE and start its commands running.  */
+
+void
+new_job (struct file *file)
+{
+  struct commands *cmds = file->cmds;
+  struct child *c;
+  char **lines;
+  unsigned int i;
+
+  /* Let any previously decided-upon jobs that are waiting
+     for the load to go down start before this new one.  */
+  start_waiting_jobs ();
+
+  /* Reap any children that might have finished recently.  */
+  reap_children (0, 0);
+
+  /* Chop the commands up into lines if they aren't already.  */
+  chop_commands (cmds);
+
+  /* Start the command sequence, record it in a new
+     'struct child', and add that to the chain.  */
+
+  c = xcalloc (sizeof (struct child));
+  output_init (&c->output);
+
+  c->file = file;
+  c->sh_batch_file = NULL;
+
+  /* Cache dontcare flag because file->dontcare can be changed once we
+     return. Check dontcare inheritance mechanism for details.  */
+  c->dontcare = file->dontcare;
+
+  /* Start saving output in case the expansion uses $(info ...) etc.  */
+  OUTPUT_SET (&c->output);
+
+  /* Expand the command lines and store the results in LINES.  */
+  lines = xmalloc (cmds->ncommand_lines * sizeof (char *));
+  for (i = 0; i < cmds->ncommand_lines; ++i)
+    {
+      /* Collapse backslash-newline combinations that are inside variable
+         or function references.  These are left alone by the parser so
+         that they will appear in the echoing of commands (where they look
+         nice); and collapsed by construct_command_argv when it tokenizes.
+         But letting them survive inside function invocations loses because
+         we don't want the functions to see them as part of the text.  */
+
+      char *in, *out, *ref;
+
+      /* IN points to where in the line we are scanning.
+         OUT points to where in the line we are writing.
+         When we collapse a backslash-newline combination,
+         IN gets ahead of OUT.  */
+
+      in = out = cmds->command_lines[i];
+      while ((ref = strchr (in, '$')) != 0)
+        {
+          ++ref;                /* Move past the $.  */
+
+          if (out != in)
+            /* Copy the text between the end of the last chunk
+               we processed (where IN points) and the new chunk
+               we are about to process (where REF points).  */
+            memmove (out, in, ref - in);
+
+          /* Move both pointers past the boring stuff.  */
+          out += ref - in;
+          in = ref;
+
+          if (*ref == '(' || *ref == '{')
+            {
+              char openparen = *ref;
+              char closeparen = openparen == '(' ? ')' : '}';
+              char *outref;
+              int count;
+              char *p;
+
+              *out++ = *in++;   /* Copy OPENPAREN.  */
+              outref = out;
+              /* IN now points past the opening paren or brace.
+                 Count parens or braces until it is matched.  */
+              count = 0;
+              while (*in != '\0')
+                {
+                  if (*in == closeparen && --count < 0)
+                    break;
+                  else if (*in == '\\' && in[1] == '\n')
+                    {
+                      /* We have found a backslash-newline inside a
+                         variable or function reference.  Eat it and
+                         any following whitespace.  */
+
+                      int quoted = 0;
+                      for (p = in - 1; p > ref && *p == '\\'; --p)
+                        quoted = !quoted;
+
+                      if (quoted)
+                        /* There were two or more backslashes, so this is
+                           not really a continuation line.  We don't collapse
+                           the quoting backslashes here as is done in
+                           collapse_continuations, because the line will
+                           be collapsed again after expansion.  */
+                        *out++ = *in++;
+                      else
+                        {
+                          /* Skip the backslash, newline, and whitespace.  */
+                          in += 2;
+                          NEXT_TOKEN (in);
+
+                          /* Discard any preceding whitespace that has
+                             already been written to the output.  */
+                          while (out > outref && ISBLANK (out[-1]))
+                            --out;
+
+                          /* Replace it all with a single space.  */
+                          *out++ = ' ';
+                        }
+                    }
+                  else
+                    {
+                      if (*in == openparen)
+                        ++count;
+
+                      *out++ = *in++;
+                    }
+                }
+            }
+        }
+
+      /* There are no more references in this line to worry about.
+         Copy the remaining uninteresting text to the output.  */
+      if (out != in)
+        memmove (out, in, strlen (in) + 1);
+
+      /* Finally, expand the line.  */
+      cmds->fileinfo.offset = i;
+      lines[i] = allocated_variable_expand_for_file (cmds->command_lines[i],
+                                                     file);
+    }
+
+  cmds->fileinfo.offset = 0;
+  c->command_lines = lines;
+
+  /* Fetch the first command line to be run.  */
+  job_next_command (c);
+
+  /* Wait for a job slot to be freed up.  If we allow an infinite number
+     don't bother; also job_slots will == 0 if we're using the jobserver.  */
+
+  if (job_slots != 0)
+    while (job_slots_used == job_slots)
+      reap_children (1, 0);
+
+#ifdef MAKE_JOBSERVER
+  /* If we are controlling multiple jobs make sure we have a token before
+     starting the child. */
+
+  /* This can be inefficient.  There's a decent chance that this job won't
+     actually have to run any subprocesses: the command script may be empty
+     or otherwise optimized away.  It would be nice if we could defer
+     obtaining a token until just before we need it, in start_job_command.
+     To do that we'd need to keep track of whether we'd already obtained a
+     token (since start_job_command is called for each line of the job, not
+     just once).  Also more thought needs to go into the entire algorithm;
+     this is where the old parallel job code waits, so...  */
+
+  else if (jobserver_enabled ())
+    while (1)
+      {
+        int got_token;
+
+        DB (DB_JOBS, ("Need a job token; we %shave children\n",
+                      children ? "" : "don't "));
+
+        /* If we don't already have a job started, use our "free" token.  */
+        if (!jobserver_tokens)
+          break;
+
+        /* Prepare for jobserver token acquisition.  */
+        jobserver_pre_acquire ();
+
+        /* Reap anything that's currently waiting.  */
+        reap_children (0, 0);
+
+        /* Kick off any jobs we have waiting for an opportunity that
+           can run now (i.e., waiting for load). */
+        start_waiting_jobs ();
+
+        /* If our "free" slot is available, use it; we don't need a token.  */
+        if (!jobserver_tokens)
+          break;
+
+        /* There must be at least one child already, or we have no business
+           waiting for a token. */
+        if (!children)
+          O (fatal, NILF, "INTERNAL: no children as we go to sleep on read\n");
+
+        /* Get a token.  */
+        got_token = jobserver_acquire (waiting_jobs != NULL);
+
+        /* If we got one, we're done here.  */
+        if (got_token == 1)
+          {
+            DB (DB_JOBS, (_("Obtained token for child %p (%s).\n"),
+                          c, c->file->name));
+            break;
+          }
+      }
+#endif
+
+  ++jobserver_tokens;
+
+  /* Trace the build.
+     Use message here so that changes to working directories are logged.  */
+  if (trace_flag)
+    {
+      char *newer = allocated_variable_expand_for_file ("$?", c->file);
+      const char *nm;
+
+      if (! cmds->fileinfo.filenm)
+        nm = _("<builtin>");
+      else
+        {
+          char *n = alloca (strlen (cmds->fileinfo.filenm) + 1 + 11 + 1);
+          sprintf (n, "%s:%lu", cmds->fileinfo.filenm, cmds->fileinfo.lineno);
+          nm = n;
+        }
+
+      if (newer[0] == '\0')
+        OSS (message, 0,
+             _("%s: target '%s' does not exist"), nm, c->file->name);
+      else
+        OSSS (message, 0,
+              _("%s: update target '%s' due to: %s"), nm, c->file->name, newer);
+
+      free (newer);
+    }
+
+  /* The job is now primed.  Start it running.
+     (This will notice if there is in fact no recipe.)  */
+  start_waiting_job (c);
+
+  if (job_slots == 1 || not_parallel)
+    /* Since there is only one job slot, make things run linearly.
+       Wait for the child to die, setting the state to 'cs_finished'.  */
+    while (file->command_state == cs_running)
+      reap_children (1, 0);
+
+  OUTPUT_UNSET ();
+  return;
+}
+\f
+/* Move CHILD's pointers to the next command for it to execute.
+   Returns nonzero if there is another command.  */
+
+static int
+job_next_command (struct child *child)
+{
+  while (child->command_ptr == 0 || *child->command_ptr == '\0')
+    {
+      /* There are no more lines in the expansion of this line.  */
+      if (child->command_line == child->file->cmds->ncommand_lines)
+        {
+          /* There are no more lines to be expanded.  */
+          child->command_ptr = 0;
+          child->file->cmds->fileinfo.offset = 0;
+          return 0;
+        }
+      else
+        /* Get the next line to run.  */
+        child->command_ptr = child->command_lines[child->command_line++];
+    }
+
+  child->file->cmds->fileinfo.offset = child->command_line - 1;
+  return 1;
+}
+
+/* Determine if the load average on the system is too high to start a new job.
+
+   On systems which provide /proc/loadavg (e.g., Linux), we use an idea
+   provided by Sven C. Dack <sven.c.dack@sky.com>: retrieve the current number
+   of processes the kernel is running and, if it's greater than the requested
+   load we don't allow another job to start.  We allow a job to start with
+   equal processes since one of those will be for make itself, which will then
+   pause waiting for jobs to clear.
+
+   Otherwise, we obtain the system load average and compare that.
+
+   The system load average is only recomputed once every N (N>=1) seconds.
+   However, a very parallel make can easily start tens or even hundreds of
+   jobs in a second, which brings the system to its knees for a while until
+   that first batch of jobs clears out.
+
+   To avoid this we use a weighted algorithm to try to account for jobs which
+   have been started since the last second, and guess what the load average
+   would be now if it were computed.
+
+   This algorithm was provided by Thomas Riedl <thomas.riedl@siemens.com>,
+   based on load average being recomputed once per second, which is
+   (apparently) how Solaris operates.  Linux recomputes only once every 5
+   seconds, but Linux is handled by the /proc/loadavg algorithm above.
+
+   Thomas writes:
+
+!      calculate something load-oid and add to the observed sys.load,
+!      so that latter can catch up:
+!      - every job started increases jobctr;
+!      - every dying job decreases a positive jobctr;
+!      - the jobctr value gets zeroed every change of seconds,
+!        after its value*weight_b is stored into the 'backlog' value last_sec
+!      - weight_a times the sum of jobctr and last_sec gets
+!        added to the observed sys.load.
+!
+!      The two weights have been tried out on 24 and 48 proc. Sun Solaris-9
+!      machines, using a several-thousand-jobs-mix of cpp, cc, cxx and smallish
+!      sub-shelled commands (rm, echo, sed...) for tests.
+!      lowering the 'direct influence' factor weight_a (e.g. to 0.1)
+!      resulted in significant excession of the load limit, raising it
+!      (e.g. to 0.5) took bad to small, fast-executing jobs and didn't
+!      reach the limit in most test cases.
+!
+!      lowering the 'history influence' weight_b (e.g. to 0.1) resulted in
+!      exceeding the limit for longer-running stuff (compile jobs in
+!      the .5 to 1.5 sec. range),raising it (e.g. to 0.5) overrepresented
+!      small jobs' effects.
+
+ */
+
+#define LOAD_WEIGHT_A           0.25
+#define LOAD_WEIGHT_B           0.25
+
+static int
+load_too_high (void)
+{
+#if defined(__MSDOS__) || defined(VMS) || defined(_AMIGA) || defined(__riscos__)
+  return 1;
+#else
+  static double last_sec;
+  static time_t last_now;
+
+  /* This is disabled by default for now, because it will behave badly if the
+     user gives a value > the number of cores; in that situation the load will
+     never be exceeded, this function always returns false, and we'll start
+     all the jobs.  Also, it's not quite right to limit jobs to the number of
+     cores not busy since a job takes some time to start etc.  Maybe that's
+     OK, I'm not sure exactly how to handle that, but for sure we need to
+     clamp this value at the number of cores before this can be enabled.
+   */
+#define PROC_FD_INIT -1
+  static int proc_fd = PROC_FD_INIT;
+
+  double load, guess;
+  time_t now;
+
+#ifdef WINDOWS32
+  /* sub_proc.c is limited in the number of objects it can wait for. */
+  if (process_table_full ())
+    return 1;
+#endif
+
+  if (max_load_average < 0)
+    return 0;
+
+  /* If we haven't tried to open /proc/loadavg, try now.  */
+#define LOADAVG "/proc/loadavg"
+  if (proc_fd == -2)
+    {
+      EINTRLOOP (proc_fd, open (LOADAVG, O_RDONLY));
+      if (proc_fd < 0)
+        DB (DB_JOBS, ("Using system load detection method.\n"));
+      else
+        {
+          DB (DB_JOBS, ("Using " LOADAVG " load detection method.\n"));
+          fd_noinherit (proc_fd);
+        }
+    }
+
+  /* Try to read /proc/loadavg if we managed to open it.  */
+  if (proc_fd >= 0)
+    {
+      int r;
+
+      EINTRLOOP (r, lseek (proc_fd, 0, SEEK_SET));
+      if (r >= 0)
+        {
+#define PROC_LOADAVG_SIZE 64
+          char avg[PROC_LOADAVG_SIZE+1];
+
+          EINTRLOOP (r, read (proc_fd, avg, PROC_LOADAVG_SIZE));
+          if (r >= 0)
+            {
+              const char *p;
+
+              /* The syntax of /proc/loadavg is:
+                    <1m> <5m> <15m> <running>/<total> <pid>
+                 The load is considered too high if there are more jobs
+                 running than the requested average.  */
+
+              avg[r] = '\0';
+              p = strchr (avg, ' ');
+              if (p)
+                p = strchr (p+1, ' ');
+              if (p)
+                p = strchr (p+1, ' ');
+
+              if (p && ISDIGIT(p[1]))
+                {
+                  int cnt = atoi (p+1);
+                  DB (DB_JOBS, ("Running: system = %d / make = %u (max requested = %f)\n",
+                                cnt, job_slots_used, max_load_average));
+                  return (double)cnt > max_load_average;
+                }
+
+              DB (DB_JOBS, ("Failed to parse " LOADAVG ": %s\n", avg));
+            }
+        }
+
+      /* If we got here, something went wrong.  Give up on this method.  */
+      if (r < 0)
+        DB (DB_JOBS, ("Failed to read " LOADAVG ": %s\n", strerror (errno)));
+
+      close (proc_fd);
+      proc_fd = -1;
+    }
+
+  /* Find the real system load average.  */
+  make_access ();
+  if (getloadavg (&load, 1) != 1)
+    {
+      static int lossage = -1;
+      /* Complain only once for the same error.  */
+      if (lossage == -1 || errno != lossage)
+        {
+          if (errno == 0)
+            /* An errno value of zero means getloadavg is just unsupported.  */
+            O (error, NILF,
+               _("cannot enforce load limits on this operating system"));
+          else
+            perror_with_name (_("cannot enforce load limit: "), "getloadavg");
+        }
+      lossage = errno;
+      load = 0;
+    }
+  user_access ();
+
+  /* If we're in a new second zero the counter and correct the backlog
+     value.  Only keep the backlog for one extra second; after that it's 0.  */
+  now = time (NULL);
+  if (last_now < now)
+    {
+      if (last_now == now - 1)
+        last_sec = LOAD_WEIGHT_B * job_counter;
+      else
+        last_sec = 0.0;
+
+      job_counter = 0;
+      last_now = now;
+    }
+
+  /* Try to guess what the load would be right now.  */
+  guess = load + (LOAD_WEIGHT_A * (job_counter + last_sec));
+
+  DB (DB_JOBS, ("Estimated system load = %f (actual = %f) (max requested = %f)\n",
+                guess, load, max_load_average));
+
+  return guess >= max_load_average;
+#endif
+}
+
+/* Start jobs that are waiting for the load to be lower.  */
+
+void
+start_waiting_jobs (void)
+{
+  struct child *job;
+
+  if (waiting_jobs == 0)
+    return;
+
+  do
+    {
+      /* Check for recently deceased descendants.  */
+      reap_children (0, 0);
+
+      /* Take a job off the waiting list.  */
+      job = waiting_jobs;
+      waiting_jobs = job->next;
+
+      /* Try to start that job.  We break out of the loop as soon
+         as start_waiting_job puts one back on the waiting list.  */
+    }
+  while (start_waiting_job (job) && waiting_jobs != 0);
+
+  return;
+}
+\f
+#ifndef WINDOWS32
+
+/* EMX: Start a child process. This function returns the new pid.  */
+# if defined __EMX__
+pid_t
+child_execute_job (struct childbase *child, int good_stdin, char **argv)
+{
+  pid_t pid;
+  int fdin = good_stdin ? FD_STDIN : get_bad_stdin ();
+  int fdout = FD_STDOUT;
+  int fderr = FD_STDERR;
+  int save_fdin = -1;
+  int save_fdout = -1;
+  int save_fderr = -1;
+
+  /* Divert child output if we want to capture output.  */
+  if (child->output.syncout)
+    {
+      if (child->output.out >= 0)
+        fdout = child->output.out;
+      if (child->output.err >= 0)
+        fderr = child->output.err;
+    }
+
+  /* For each FD which needs to be redirected first make a dup of the standard
+     FD to save and mark it close on exec so our child won't see it.  Then
+     dup2() the standard FD to the redirect FD, and also mark the redirect FD
+     as close on exec. */
+  if (fdin != FD_STDIN)
+    {
+      save_fdin = dup (FD_STDIN);
+      if (save_fdin < 0)
+        O (fatal, NILF, _("no more file handles: could not duplicate stdin\n"));
+      fd_noinherit (save_fdin);
+
+      dup2 (fdin, FD_STDIN);
+      fd_noinherit (fdin);
+    }
+
+  if (fdout != FD_STDOUT)
+    {
+      save_fdout = dup (FD_STDOUT);
+      if (save_fdout < 0)
+        O (fatal, NILF,
+           _("no more file handles: could not duplicate stdout\n"));
+      fd_noinherit (save_fdout);
+
+      dup2 (fdout, FD_STDOUT);
+      fd_noinherit (fdout);
+    }
+
+  if (fderr != FD_STDERR)
+    {
+      if (fderr != fdout)
+        {
+          save_fderr = dup (FD_STDERR);
+          if (save_fderr < 0)
+            O (fatal, NILF,
+               _("no more file handles: could not duplicate stderr\n"));
+          fd_noinherit (save_fderr);
+        }
+
+      dup2 (fderr, FD_STDERR);
+      fd_noinherit (fderr);
+    }
+
+  /* Run the command.  */
+  pid = exec_command (argv, child->environment);
+
+  /* Restore stdout/stdin/stderr of the parent and close temporary FDs.  */
+  if (save_fdin >= 0)
+    {
+      if (dup2 (save_fdin, FD_STDIN) != FD_STDIN)
+        O (fatal, NILF, _("Could not restore stdin\n"));
+      else
+        close (save_fdin);
+    }
+
+  if (save_fdout >= 0)
+    {
+      if (dup2 (save_fdout, FD_STDOUT) != FD_STDOUT)
+        O (fatal, NILF, _("Could not restore stdout\n"));
+      else
+        close (save_fdout);
+    }
+
+  if (save_fderr >= 0)
+    {
+      if (dup2 (save_fderr, FD_STDERR) != FD_STDERR)
+        O (fatal, NILF, _("Could not restore stderr\n"));
+      else
+        close (save_fderr);
+    }
+
+  if (pid < 0)
+    OSS (error, NILF, "%s: %s", argv[0], strerror (errno));
+
+  return pid;
+}
+
+#elif !defined (_AMIGA) && !defined (__MSDOS__) && !defined (VMS)
+
+/* POSIX:
+   Create a child process executing the command in ARGV.
+   Returns the PID or -1.  */
+pid_t
+child_execute_job (struct childbase *child, int good_stdin, char **argv)
+{
+  const int fdin = good_stdin ? FD_STDIN : get_bad_stdin ();
+  int fdout = FD_STDOUT;
+  int fderr = FD_STDERR;
+  pid_t pid;
+  int r;
+#if defined(USE_POSIX_SPAWN)
+  char *cmd;
+  posix_spawnattr_t attr;
+  posix_spawn_file_actions_t fa;
+  short flags = 0;
+#endif
+
+  /* Divert child output if we want to capture it.  */
+  if (child->output.syncout)
+    {
+      if (child->output.out >= 0)
+        fdout = child->output.out;
+      if (child->output.err >= 0)
+        fderr = child->output.err;
+    }
+
+#if !defined(USE_POSIX_SPAWN)
+
+  pid = vfork();
+  if (pid != 0)
+    return pid;
+
+  /* We are the child.  */
+  unblock_all_sigs ();
+
+#ifdef SET_STACK_SIZE
+  /* Reset limits, if necessary.  */
+  if (stack_limit.rlim_cur)
+    setrlimit (RLIMIT_STACK, &stack_limit);
+#endif
+
+  /* For any redirected FD, dup2() it to the standard FD.
+     They are all marked close-on-exec already.  */
+  if (fdin >= 0 && fdin != FD_STDIN)
+    EINTRLOOP (r, dup2 (fdin, FD_STDIN));
+  if (fdout != FD_STDOUT)
+    EINTRLOOP (r, dup2 (fdout, FD_STDOUT));
+  if (fderr != FD_STDERR)
+    EINTRLOOP (r, dup2 (fderr, FD_STDERR));
+
+  /* Run the command.  */
+  exec_command (argv, child->environment);
+
+#else /* USE_POSIX_SPAWN */
+
+  if ((r = posix_spawnattr_init (&attr)) != 0)
+    goto done;
+
+  if ((r = posix_spawn_file_actions_init (&fa)) != 0)
+    {
+      posix_spawnattr_destroy (&attr);
+      goto done;
+    }
+
+  /* Unblock all signals.  */
+#ifdef HAVE_POSIX_SPAWNATTR_SETSIGMASK
+  {
+    sigset_t mask;
+    sigemptyset (&mask);
+    r = posix_spawnattr_setsigmask (&attr, &mask);
+    if (r != 0)
+      goto cleanup;
+    flags |= POSIX_SPAWN_SETSIGMASK;
+  }
+#endif /* have posix_spawnattr_setsigmask() */
+
+  /* USEVFORK can give significant speedup on systems where it's available.  */
+#ifdef POSIX_SPAWN_USEVFORK
+  flags |= POSIX_SPAWN_USEVFORK;
+#endif
+
+  /* For any redirected FD, dup2() it to the standard FD.
+     They are all marked close-on-exec already.  */
+  if (fdin >= 0 && fdin != FD_STDIN)
+    if ((r = posix_spawn_file_actions_adddup2 (&fa, fdin, FD_STDIN)) != 0)
+      goto cleanup;
+  if (fdout != FD_STDOUT)
+    if ((r = posix_spawn_file_actions_adddup2 (&fa, fdout, FD_STDOUT)) != 0)
+      goto cleanup;
+  if (fderr != FD_STDERR)
+    if ((r = posix_spawn_file_actions_adddup2 (&fa, fderr, FD_STDERR)) != 0)
+      goto cleanup;
+
+  /* Be the user, permanently.  */
+  flags |= POSIX_SPAWN_RESETIDS;
+
+  /* Apply the spawn flags.  */
+  if ((r = posix_spawnattr_setflags (&attr, flags)) != 0)
+    goto cleanup;
+
+  /* Look up the program on the child's PATH, if needed.  */
+  {
+    const char *p = NULL;
+    char **pp;
+
+    for (pp = child->environment; *pp != NULL; ++pp)
+      if ((*pp)[0] == 'P' && (*pp)[1] == 'A' && (*pp)[2] == 'T'
+          && (*pp)[3] == 'H' &&(*pp)[4] == '=')
+        {
+          p = (*pp) + 5;
+          break;
+        }
+
+    cmd = (char *)find_in_given_path (argv[0], p, 0);
+  }
+
+  if (!cmd)
+    {
+      r = errno;
+      goto cleanup;
+    }
+
+  /* Start the program.  */
+  while ((r = posix_spawn (&pid, cmd, &fa, &attr, argv,
+                           child->environment)) == EINTR)
+    ;
+
+  /* posix_spawn() doesn't provide sh fallback like exec() does; implement
+     it here.  POSIX doesn't specify the path to sh so use the default.  */
+
+  if (r == ENOEXEC)
+    {
+      char **nargv;
+      char **pp;
+      size_t l = 0;
+
+      for (pp = argv; *pp != NULL; ++pp)
+        ++l;
+
+      nargv = xmalloc (sizeof (char *) * (l + 3));
+      nargv[0] = (char *)default_shell;
+      nargv[1] = cmd;
+      memcpy (&nargv[2], &argv[1], sizeof (char *) * l);
+
+      while ((r = posix_spawn (&pid, nargv[0], &fa, &attr, nargv,
+                               child->environment)) == EINTR)
+        ;
+
+      free (nargv);
+    }
+
+  if (r == 0)
+    {
+      /* Spawn succeeded but may fail later: remember the command.  */
+      free (child->cmd_name);
+      if (cmd != argv[0])
+        child->cmd_name = cmd;
+      else
+        child->cmd_name = xstrdup(cmd);
+    }
+
+ cleanup:
+  posix_spawn_file_actions_destroy (&fa);
+  posix_spawnattr_destroy (&attr);
+
+ done:
+  if (r != 0)
+    pid = -1;
+
+#endif /* USE_POSIX_SPAWN */
+
+  if (pid < 0)
+    OSS (error, NILF, "%s: %s", argv[0], strerror (r));
+
+  return pid;
+}
+#endif /* !AMIGA && !__MSDOS__ && !VMS */
+#endif /* !WINDOWS32 */
+\f
+#ifndef _AMIGA
+/* Replace the current process with one running the command in ARGV,
+   with environment ENVP.  This function does not return.  */
+
+/* EMX: This function returns the pid of the child process.  */
+# ifdef __EMX__
+pid_t
+# else
+void
+# endif
+exec_command (char **argv, char **envp)
+{
+#ifdef VMS
+  /* to work around a problem with signals and execve: ignore them */
+#ifdef SIGCHLD
+  signal (SIGCHLD,SIG_IGN);
+#endif
+  /* Run the program.  */
+  execve (argv[0], argv, envp);
+  OSS (error, NILF, "%s: %s", argv[0], strerror (errno));
+  _exit (EXIT_FAILURE);
+#else
+#ifdef WINDOWS32
+  HANDLE hPID;
+  HANDLE hWaitPID;
+  int exit_code = EXIT_FAILURE;
+
+  /* make sure CreateProcess() has Path it needs */
+  sync_Path_environment ();
+
+  /* launch command */
+  hPID = process_easy (argv, envp, -1, -1);
+
+  /* make sure launch ok */
+  if (hPID == INVALID_HANDLE_VALUE)
+    {
+      int i;
+      fprintf (stderr, _("process_easy() failed to launch process (e=%ld)\n"),
+               process_last_err (hPID));
+      for (i = 0; argv[i]; i++)
+          fprintf (stderr, "%s ", argv[i]);
+      fprintf (stderr, _("\nCounted %d args in failed launch\n"), i);
+      exit (EXIT_FAILURE);
+    }
+
+  /* wait and reap last child */
+  hWaitPID = process_wait_for_any (1, 0);
+  while (hWaitPID)
+    {
+      /* was an error found on this process? */
+      int err = process_last_err (hWaitPID);
+
+      /* get exit data */
+      exit_code = process_exit_code (hWaitPID);
+
+      if (err)
+          fprintf (stderr, "make (e=%d, rc=%d): %s",
+                   err, exit_code, map_windows32_error_to_string (err));
+
+      /* cleanup process */
+      process_cleanup (hWaitPID);
+
+      /* expect to find only last pid, warn about other pids reaped */
+      if (hWaitPID == hPID)
+          break;
+      else
+        {
+          char *pidstr = xstrdup (pid2str ((pid_t)hWaitPID));
+
+          fprintf (stderr,
+                   _("make reaped child pid %s, still waiting for pid %s\n"),
+                   pidstr, pid2str ((pid_t)hPID));
+          free (pidstr);
+        }
+    }
+
+  /* return child's exit code as our exit code */
+  exit (exit_code);
+
+#else  /* !WINDOWS32 */
+
+# ifdef __EMX__
+  pid_t pid;
+# endif
+
+  /* Be the user, permanently.  */
+  child_access ();
+
+# ifdef __EMX__
+  /* Run the program.  */
+  pid = spawnvpe (P_NOWAIT, argv[0], argv, envp);
+  if (pid >= 0)
+    return pid;
+
+  /* the file might have a strange shell extension */
+  if (errno == ENOENT)
+    errno = ENOEXEC;
+
+# else
+  /* Run the program.  */
+  environ = envp;
+  execvp (argv[0], argv);
+
+# endif /* !__EMX__ */
+
+  switch (errno)
+    {
+    case ENOENT:
+      OSS (error, NILF, "%s: %s", argv[0], strerror (errno));
+      break;
+    case ENOEXEC:
+      {
+        /* The file was not a program.  Try it as a shell script.  */
+        const char *shell;
+        char **new_argv;
+        int argc;
+        int i=1;
+
+# ifdef __EMX__
+        /* Do not use $SHELL from the environment */
+        struct variable *p = lookup_variable ("SHELL", 5);
+        if (p)
+          shell = p->value;
+        else
+          shell = 0;
+# else
+        shell = getenv ("SHELL");
+# endif
+        if (shell == 0)
+          shell = default_shell;
+
+        argc = 1;
+        while (argv[argc] != 0)
+          ++argc;
+
+# ifdef __EMX__
+        if (!unixy_shell)
+          ++argc;
+# endif
+
+        new_argv = alloca ((1 + argc + 1) * sizeof (char *));
+        new_argv[0] = (char *)shell;
+
+# ifdef __EMX__
+        if (!unixy_shell)
+          {
+            new_argv[1] = "/c";
+            ++i;
+            --argc;
+          }
+# endif
+
+        new_argv[i] = argv[0];
+        while (argc > 0)
+          {
+            new_argv[i + argc] = argv[argc];
+            --argc;
+          }
+
+# ifdef __EMX__
+        pid = spawnvpe (P_NOWAIT, shell, new_argv, envp);
+        if (pid >= 0)
+          break;
+# else
+        execvp (shell, new_argv);
+# endif
+        OSS (error, NILF, "%s: %s", new_argv[0], strerror (errno));
+        break;
+      }
+
+# ifdef __EMX__
+    case EINVAL:
+      /* this nasty error was driving me nuts :-( */
+      O (error, NILF, _("spawnvpe: environment space might be exhausted"));
+      /* FALLTHROUGH */
+# endif
+
+    default:
+      OSS (error, NILF, "%s: %s", argv[0], strerror (errno));
+      break;
+    }
+
+# ifdef __EMX__
+  return pid;
+# else
+  _exit (127);
+# endif
+#endif /* !WINDOWS32 */
+#endif /* !VMS */
+}
+#else /* On Amiga */
+void
+exec_command (char **argv)
+{
+  MyExecute (argv);
+}
+
+void clean_tmp (void)
+{
+  DeleteFile (amiga_bname);
+}
+
+#endif /* On Amiga */
+\f
+#ifndef VMS
+/* Figure out the argument list necessary to run LINE as a command.  Try to
+   avoid using a shell.  This routine handles only ' quoting, and " quoting
+   when no backslash, $ or ' characters are seen in the quotes.  Starting
+   quotes may be escaped with a backslash.  If any of the characters in
+   sh_chars is seen, or any of the builtin commands listed in sh_cmds
+   is the first word of a line, the shell is used.
+
+   If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
+   If *RESTP is NULL, newlines will be ignored.
+
+   SHELL is the shell to use, or nil to use the default shell.
+   IFS is the value of $IFS, or nil (meaning the default).
+
+   FLAGS is the value of lines_flags for this command line.  It is
+   used in the WINDOWS32 port to check whether + or $(MAKE) were found
+   in this command line, in which case the effect of just_print_flag
+   is overridden.  */
+
+static char **
+construct_command_argv_internal (char *line, char **restp, const char *shell,
+                                 const char *shellflags, const char *ifs,
+                                 int flags, char **batch_filename UNUSED)
+{
+#ifdef __MSDOS__
+  /* MSDOS supports both the stock DOS shell and ports of Unixy shells.
+     We call 'system' for anything that requires ''slow'' processing,
+     because DOS shells are too dumb.  When $SHELL points to a real
+     (unix-style) shell, 'system' just calls it to do everything.  When
+     $SHELL points to a DOS shell, 'system' does most of the work
+     internally, calling the shell only for its internal commands.
+     However, it looks on the $PATH first, so you can e.g. have an
+     external command named 'mkdir'.
+
+     Since we call 'system', certain characters and commands below are
+     actually not specific to COMMAND.COM, but to the DJGPP implementation
+     of 'system'.  In particular:
+
+       The shell wildcard characters are in DOS_CHARS because they will
+       not be expanded if we call the child via 'spawnXX'.
+
+       The ';' is in DOS_CHARS, because our 'system' knows how to run
+       multiple commands on a single line.
+
+       DOS_CHARS also include characters special to 4DOS/NDOS, so we
+       won't have to tell one from another and have one more set of
+       commands and special characters.  */
+  static const char *sh_chars_dos = "*?[];|<>%^&()";
+  static const char *sh_cmds_dos[] =
+    { "break", "call", "cd", "chcp", "chdir", "cls", "copy", "ctty", "date",
+      "del", "dir", "echo", "erase", "exit", "for", "goto", "if", "md",
+      "mkdir", "path", "pause", "prompt", "rd", "rmdir", "rem", "ren",
+      "rename", "set", "shift", "time", "type", "ver", "verify", "vol", ":",
+      0 };
+
+  static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^";
+  static const char *sh_cmds_sh[] =
+    { "cd", "echo", "eval", "exec", "exit", "login", "logout", "set", "umask",
+      "wait", "while", "for", "case", "if", ":", ".", "break", "continue",
+      "export", "read", "readonly", "shift", "times", "trap", "switch",
+      "unset", "ulimit", "command", 0 };
+
+  const char *sh_chars;
+  const char **sh_cmds;
+
+#elif defined (__EMX__)
+  static const char *sh_chars_dos = "*?[];|<>%^&()";
+  static const char *sh_cmds_dos[] =
+    { "break", "call", "cd", "chcp", "chdir", "cls", "copy", "ctty", "date",
+      "del", "dir", "echo", "erase", "exit", "for", "goto", "if", "md",
+      "mkdir", "path", "pause", "prompt", "rd", "rmdir", "rem", "ren",
+      "rename", "set", "shift", "time", "type", "ver", "verify", "vol", ":",
+      0 };
+
+  static const char *sh_chars_os2 = "*?[];|<>%^()\"'&";
+  static const char *sh_cmds_os2[] =
+    { "call", "cd", "chcp", "chdir", "cls", "copy", "date", "del", "detach",
+      "dir", "echo", "endlocal", "erase", "exit", "for", "goto", "if", "keys",
+      "md", "mkdir", "move", "path", "pause", "prompt", "rd", "rem", "ren",
+      "rename", "rmdir", "set", "setlocal", "shift", "start", "time", "type",
+      "ver", "verify", "vol", ":", 0 };
+
+  static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^~'";
+  static const char *sh_cmds_sh[] =
+    { "echo", "cd", "eval", "exec", "exit", "login", "logout", "set", "umask",
+      "wait", "while", "for", "case", "if", ":", ".", "break", "continue",
+      "export", "read", "readonly", "shift", "times", "trap", "switch",
+      "unset", "command", 0 };
+
+  const char *sh_chars;
+  const char **sh_cmds;
+
+#elif defined (_AMIGA)
+  static const char *sh_chars = "#;\"|<>()?*$`";
+  static const char *sh_cmds[] =
+    { "cd", "eval", "if", "delete", "echo", "copy", "rename", "set", "setenv",
+      "date", "makedir", "skip", "else", "endif", "path", "prompt", "unset",
+      "unsetenv", "version", "command", 0 };
+
+#elif defined (WINDOWS32)
+  /* We used to have a double quote (") in sh_chars_dos[] below, but
+     that caused any command line with quoted file names be run
+     through a temporary batch file, which introduces command-line
+     limit of 4K charcaters imposed by cmd.exe.  Since CreateProcess
+     can handle quoted file names just fine, removing the quote lifts
+     the limit from a very frequent use case, because using quoted
+     file names is commonplace on MS-Windows.  */
+  static const char *sh_chars_dos = "|&<>";
+  static const char *sh_cmds_dos[] =
+    { "assoc", "break", "call", "cd", "chcp", "chdir", "cls", "color", "copy",
+      "ctty", "date", "del", "dir", "echo", "echo.", "endlocal", "erase",
+      "exit", "for", "ftype", "goto", "if", "if", "md", "mkdir", "move",
+      "path", "pause", "prompt", "rd", "rem", "ren", "rename", "rmdir",
+      "set", "setlocal", "shift", "time", "title", "type", "ver", "verify",
+      "vol", ":", 0 };
+
+  static const char *sh_chars_sh = "#;\"*?[]&|<>(){}$`^";
+  static const char *sh_cmds_sh[] =
+    { "cd", "eval", "exec", "exit", "login", "logout", "set", "umask", "wait",
+      "while", "for", "case", "if", ":", ".", "break", "continue", "export",
+      "read", "readonly", "shift", "times", "trap", "switch", "test", "command",
+#ifdef BATCH_MODE_ONLY_SHELL
+      "echo",
+#endif
+      0 };
+
+  const char *sh_chars;
+  const char **sh_cmds;
+#elif defined(__riscos__)
+  static const char *sh_chars = "";
+  static const char *sh_cmds[] = { 0 };
+#else  /* must be UNIX-ish */
+  static const char *sh_chars = "#;\"*?[]&|<>(){}$`^~!";
+  static const char *sh_cmds[] =
+    { ".", ":", "alias", "bg", "break", "case", "cd", "command", "continue",
+      "eval", "exec", "exit", "export", "fc", "fg", "for", "getopts", "hash",
+      "if", "jobs", "login", "logout", "read", "readonly", "return", "set",
+      "shift", "test", "times", "trap", "type", "ulimit", "umask", "unalias",
+      "unset", "wait", "while", 0 };
+
+# ifdef HAVE_DOS_PATHS
+  /* This is required if the MSYS/Cygwin ports (which do not define
+     WINDOWS32) are compiled with HAVE_DOS_PATHS defined, which uses
+     sh_chars_sh directly (see below).  The value must be identical
+     to that of sh_chars immediately above.  */
+  static const char *sh_chars_sh =  "#;\"*?[]&|<>(){}$`^~!";
+# endif  /* HAVE_DOS_PATHS */
+#endif
+  size_t i;
+  char *p;
+#ifndef NDEBUG
+  char *end;
+#endif
+  char *ap;
+  const char *cap;
+  const char *cp;
+  int instring, word_has_equals, seen_nonequals, last_argument_was_empty;
+  char **new_argv = 0;
+  char *argstr = 0;
+#ifdef WINDOWS32
+  int slow_flag = 0;
+
+  if (!unixy_shell)
+    {
+      sh_cmds = sh_cmds_dos;
+      sh_chars = sh_chars_dos;
+    }
+  else
+    {
+      sh_cmds = sh_cmds_sh;
+      sh_chars = sh_chars_sh;
+    }
+#endif /* WINDOWS32 */
+
+  if (restp != NULL)
+    *restp = NULL;
+
+  /* Make sure not to bother processing an empty line but stop at newline.  */
+  while (ISBLANK (*line))
+    ++line;
+  if (*line == '\0')
+    return 0;
+
+  if (shellflags == 0)
+    shellflags = posix_pedantic ? "-ec" : "-c";
+
+  /* See if it is safe to parse commands internally.  */
+  if (shell == 0)
+    shell = default_shell;
+#ifdef WINDOWS32
+  else if (strcmp (shell, default_shell))
+  {
+    char *s1 = _fullpath (NULL, shell, 0);
+    char *s2 = _fullpath (NULL, default_shell, 0);
+
+    slow_flag = strcmp ((s1 ? s1 : ""), (s2 ? s2 : ""));
+
+    free (s1);
+    free (s2);
+  }
+  if (slow_flag)
+    goto slow;
+#else  /* not WINDOWS32 */
+#if defined (__MSDOS__) || defined (__EMX__)
+  else if (strcasecmp (shell, default_shell))
+    {
+      extern int _is_unixy_shell (const char *_path);
+
+      DB (DB_BASIC, (_("$SHELL changed (was '%s', now '%s')\n"),
+                     default_shell, shell));
+      unixy_shell = _is_unixy_shell (shell);
+      /* we must allocate a copy of shell: construct_command_argv() will free
+       * shell after this function returns.  */
+      default_shell = xstrdup (shell);
+    }
+  if (unixy_shell)
+    {
+      sh_chars = sh_chars_sh;
+      sh_cmds  = sh_cmds_sh;
+    }
+  else
+    {
+      sh_chars = sh_chars_dos;
+      sh_cmds  = sh_cmds_dos;
+# ifdef __EMX__
+      if (_osmode == OS2_MODE)
+        {
+          sh_chars = sh_chars_os2;
+          sh_cmds = sh_cmds_os2;
+        }
+# endif
+    }
+#else  /* !__MSDOS__ */
+  else if (strcmp (shell, default_shell))
+    goto slow;
+#endif /* !__MSDOS__ && !__EMX__ */
+#endif /* not WINDOWS32 */
+
+  if (ifs)
+    for (cap = ifs; *cap != '\0'; ++cap)
+      if (*cap != ' ' && *cap != '\t' && *cap != '\n')
+        goto slow;
+
+  if (shellflags)
+    if (shellflags[0] != '-'
+        || ((shellflags[1] != 'c' || shellflags[2] != '\0')
+            && (shellflags[1] != 'e' || shellflags[2] != 'c' || shellflags[3] != '\0')))
+      goto slow;
+
+  i = strlen (line) + 1;
+
+  /* More than 1 arg per character is impossible.  */
+  new_argv = xmalloc (i * sizeof (char *));
+
+  /* All the args can fit in a buffer as big as LINE is.   */
+  ap = new_argv[0] = argstr = xmalloc (i);
+#ifndef NDEBUG
+  end = ap + i;
+#endif
+
+  /* I is how many complete arguments have been found.  */
+  i = 0;
+  instring = word_has_equals = seen_nonequals = last_argument_was_empty = 0;
+  for (p = line; *p != '\0'; ++p)
+    {
+      assert (ap <= end);
+
+      if (instring)
+        {
+          /* Inside a string, just copy any char except a closing quote
+             or a backslash-newline combination.  */
+          if (*p == instring)
+            {
+              instring = 0;
+              if (ap == new_argv[0] || *(ap-1) == '\0')
+                last_argument_was_empty = 1;
+            }
+          else if (*p == '\\' && p[1] == '\n')
+            {
+              /* Backslash-newline is handled differently depending on what
+                 kind of string we're in: inside single-quoted strings you
+                 keep them; in double-quoted strings they disappear.  For
+                 DOS/Windows/OS2, if we don't have a POSIX shell, we keep the
+                 pre-POSIX behavior of removing the backslash-newline.  */
+              if (instring == '"'
+#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32)
+                  || !unixy_shell
+#endif
+                  )
+                ++p;
+              else
+                {
+                  *(ap++) = *(p++);
+                  *(ap++) = *p;
+                }
+            }
+          else if (*p == '\n' && restp != NULL)
+            {
+              /* End of the command line.  */
+              *restp = p;
+              goto end_of_line;
+            }
+          /* Backslash, $, and ` are special inside double quotes.
+             If we see any of those, punt.
+             But on MSDOS, if we use COMMAND.COM, double and single
+             quotes have the same effect.  */
+          else if (instring == '"' && strchr ("\\$`", *p) != 0 && unixy_shell)
+            goto slow;
+#ifdef WINDOWS32
+          /* Quoted wildcard characters must be passed quoted to the
+             command, so give up the fast route.  */
+          else if (instring == '"' && strchr ("*?", *p) != 0 && !unixy_shell)
+            goto slow;
+          else if (instring == '"' && strncmp (p, "\\\"", 2) == 0)
+            *ap++ = *++p;
+#endif
+          else
+            *ap++ = *p;
+        }
+      else if (strchr (sh_chars, *p) != 0)
+        /* Not inside a string, but it's a special char.  */
+        goto slow;
+      else if (one_shell && *p == '\n')
+        /* In .ONESHELL mode \n is a separator like ; or && */
+        goto slow;
+#ifdef  __MSDOS__
+      else if (*p == '.' && p[1] == '.' && p[2] == '.' && p[3] != '.')
+        /* '...' is a wildcard in DJGPP.  */
+        goto slow;
+#endif
+      else
+        /* Not a special char.  */
+        switch (*p)
+          {
+          case '=':
+            /* Equals is a special character in leading words before the
+               first word with no equals sign in it.  This is not the case
+               with sh -k, but we never get here when using nonstandard
+               shell flags.  */
+            if (! seen_nonequals && unixy_shell)
+              goto slow;
+            word_has_equals = 1;
+            *ap++ = '=';
+            break;
+
+          case '\\':
+            /* Backslash-newline has special case handling, ref POSIX.
+               We're in the fastpath, so emulate what the shell would do.  */
+            if (p[1] == '\n')
+              {
+                /* Throw out the backslash and newline.  */
+                ++p;
+
+                /* At the beginning of the argument, skip any whitespace other
+                   than newline before the start of the next word.  */
+                if (ap == new_argv[i])
+                  while (ISBLANK (p[1]))
+                    ++p;
+              }
+#ifdef WINDOWS32
+            /* Backslash before whitespace is not special if our shell
+               is not Unixy.  */
+            else if (ISSPACE (p[1]) && !unixy_shell)
+              {
+                *ap++ = *p;
+                break;
+              }
+#endif
+            else if (p[1] != '\0')
+              {
+#ifdef HAVE_DOS_PATHS
+                /* Only remove backslashes before characters special to Unixy
+                   shells.  All other backslashes are copied verbatim, since
+                   they are probably DOS-style directory separators.  This
+                   still leaves a small window for problems, but at least it
+                   should work for the vast majority of naive users.  */
+
+#ifdef __MSDOS__
+                /* A dot is only special as part of the "..."
+                   wildcard.  */
+                if (strneq (p + 1, ".\\.\\.", 5))
+                  {
+                    *ap++ = '.';
+                    *ap++ = '.';
+                    p += 4;
+                  }
+                else
+#endif
+                  if (p[1] != '\\' && p[1] != '\''
+                      && !ISSPACE (p[1])
+                      && strchr (sh_chars_sh, p[1]) == 0)
+                    /* back up one notch, to copy the backslash */
+                    --p;
+#endif  /* HAVE_DOS_PATHS */
+
+                /* Copy and skip the following char.  */
+                *ap++ = *++p;
+              }
+            break;
+
+          case '\'':
+          case '"':
+            instring = *p;
+            break;
+
+          case '\n':
+            if (restp != NULL)
+              {
+                /* End of the command line.  */
+                *restp = p;
+                goto end_of_line;
+              }
+            else
+              /* Newlines are not special.  */
+              *ap++ = '\n';
+            break;
+
+          case ' ':
+          case '\t':
+            /* We have the end of an argument.
+               Terminate the text of the argument.  */
+            *ap++ = '\0';
+            new_argv[++i] = ap;
+            last_argument_was_empty = 0;
+
+            /* Update SEEN_NONEQUALS, which tells us if every word
+               heretofore has contained an '='.  */
+            seen_nonequals |= ! word_has_equals;
+            if (word_has_equals && ! seen_nonequals)
+              /* An '=' in a word before the first
+                 word without one is magical.  */
+              goto slow;
+            word_has_equals = 0; /* Prepare for the next word.  */
+
+            /* If this argument is the command name,
+               see if it is a built-in shell command.
+               If so, have the shell handle it.  */
+            if (i == 1)
+              {
+                int j;
+                for (j = 0; sh_cmds[j] != 0; ++j)
+                  {
+                    if (streq (sh_cmds[j], new_argv[0]))
+                      goto slow;
+#if defined(__EMX__) || defined(WINDOWS32)
+                    /* Non-Unix shells are case insensitive.  */
+                    if (!unixy_shell
+                        && strcasecmp (sh_cmds[j], new_argv[0]) == 0)
+                      goto slow;
+#endif
+                  }
+              }
+
+            /* Skip whitespace chars, but not newlines.  */
+            while (ISBLANK (p[1]))
+              ++p;
+            break;
+
+          default:
+            *ap++ = *p;
+            break;
+          }
+    }
+ end_of_line:
+
+  if (instring)
+    /* Let the shell deal with an unterminated quote.  */
+    goto slow;
+
+  /* Terminate the last argument and the argument list.  */
+
+  *ap = '\0';
+  if (new_argv[i][0] != '\0' || last_argument_was_empty)
+    ++i;
+  new_argv[i] = 0;
+
+  if (i == 1)
+    {
+      int j;
+      for (j = 0; sh_cmds[j] != 0; ++j)
+        if (streq (sh_cmds[j], new_argv[0]))
+          goto slow;
+    }
+
+  if (new_argv[0] == 0)
+    {
+      /* Line was empty.  */
+      free (argstr);
+      free (new_argv);
+      return 0;
+    }
+
+  return new_argv;
+
+ slow:;
+  /* We must use the shell.  */
+
+  if (new_argv != 0)
+    {
+      /* Free the old argument list we were working on.  */
+      free (argstr);
+      free (new_argv);
+    }
+
+#ifdef __MSDOS__
+  execute_by_shell = 1; /* actually, call 'system' if shell isn't unixy */
+#endif
+
+#ifdef _AMIGA
+  {
+    char *ptr;
+    char *buffer;
+    char *dptr;
+
+    buffer = xmalloc (strlen (line)+1);
+
+    ptr = line;
+    for (dptr=buffer; *ptr; )
+    {
+      if (*ptr == '\\' && ptr[1] == '\n')
+        ptr += 2;
+      else if (*ptr == '@') /* Kludge: multiline commands */
+      {
+        ptr += 2;
+        *dptr++ = '\n';
+      }
+      else
+        *dptr++ = *ptr++;
+    }
+    *dptr = 0;
+
+    new_argv = xmalloc (2 * sizeof (char *));
+    new_argv[0] = buffer;
+    new_argv[1] = 0;
+  }
+#else   /* Not Amiga  */
+#ifdef WINDOWS32
+  /*
+   * Not eating this whitespace caused things like
+   *
+   *    sh -c "\n"
+   *
+   * which gave the shell fits. I think we have to eat
+   * whitespace here, but this code should be considered
+   * suspicious if things start failing....
+   */
+
+  /* Make sure not to bother processing an empty line.  */
+  NEXT_TOKEN (line);
+  if (*line == '\0')
+    return 0;
+#endif /* WINDOWS32 */
+
+  {
+    /* SHELL may be a multi-word command.  Construct a command line
+       "$(SHELL) $(.SHELLFLAGS) LINE", with all special chars in LINE escaped.
+       Then recurse, expanding this command line to get the final
+       argument list.  */
+
+    char *new_line;
+    size_t shell_len = strlen (shell);
+    size_t line_len = strlen (line);
+    size_t sflags_len = shellflags ? strlen (shellflags) : 0;
+#ifdef WINDOWS32
+    char *command_ptr = NULL; /* used for batch_mode_shell mode */
+#endif
+
+# ifdef __EMX__ /* is this necessary? */
+    if (!unixy_shell && shellflags)
+      shellflags[0] = '/'; /* "/c" */
+# endif
+
+    /* In .ONESHELL mode we are allowed to throw the entire current
+        recipe string at a single shell and trust that the user
+        has configured the shell and shell flags, and formatted
+        the string, appropriately. */
+    if (one_shell)
+      {
+        /* If the shell is Bourne compatible, we must remove and ignore
+           interior special chars [@+-] because they're meaningless to
+           the shell itself. If, however, we're in .ONESHELL mode and
+           have changed SHELL to something non-standard, we should
+           leave those alone because they could be part of the
+           script. In this case we must also leave in place
+           any leading [@+-] for the same reason.  */
+
+        /* Remove and ignore interior prefix chars [@+-] because they're
+             meaningless given a single shell. */
+#if defined __MSDOS__ || defined (__EMX__)
+        if (unixy_shell)     /* the test is complicated and we already did it */
+#else
+        if (is_bourne_compatible_shell (shell)
+#ifdef WINDOWS32
+            /* If we didn't find any sh.exe, don't behave is if we did!  */
+            && !no_default_sh_exe
+#endif
+            )
+#endif
+          {
+            const char *f = line;
+            char *t = line;
+
+            /* Copy the recipe, removing and ignoring interior prefix chars
+               [@+-]: they're meaningless in .ONESHELL mode.  */
+            while (f[0] != '\0')
+              {
+                int esc = 0;
+
+                /* This is the start of a new recipe line.  Skip whitespace
+                   and prefix characters but not newlines.  */
+                while (ISBLANK (*f) || *f == '-' || *f == '@' || *f == '+')
+                  ++f;
+
+                /* Copy until we get to the next logical recipe line.  */
+                while (*f != '\0')
+                  {
+                    *(t++) = *(f++);
+                    if (f[-1] == '\\')
+                      esc = !esc;
+                    else
+                      {
+                        /* On unescaped newline, we're done with this line.  */
+                        if (f[-1] == '\n' && ! esc)
+                          break;
+
+                        /* Something else: reset the escape sequence.  */
+                        esc = 0;
+                      }
+                  }
+              }
+            *t = '\0';
+          }
+#ifdef WINDOWS32
+        else    /* non-Posix shell (cmd.exe etc.) */
+          {
+            const char *f = line;
+            char *t = line;
+            char *tstart = t;
+            int temp_fd;
+            FILE* batch = NULL;
+            int id = GetCurrentProcessId ();
+            PATH_VAR(fbuf);
+
+            /* Generate a file name for the temporary batch file.  */
+            sprintf (fbuf, "make%d", id);
+            *batch_filename = create_batch_file (fbuf, 0, &temp_fd);
+            DB (DB_JOBS, (_("Creating temporary batch file %s\n"),
+                          *batch_filename));
+
+            /* Create a FILE object for the batch file, and write to it the
+               commands to be executed.  Put the batch file in TEXT mode.  */
+            _setmode (temp_fd, _O_TEXT);
+            batch = _fdopen (temp_fd, "wt");
+            fputs ("@echo off\n", batch);
+            DB (DB_JOBS, (_("Batch file contents:\n\t@echo off\n")));
+
+            /* Copy the recipe, removing and ignoring interior prefix chars
+               [@+-]: they're meaningless in .ONESHELL mode.  */
+            while (*f != '\0')
+              {
+                /* This is the start of a new recipe line.  Skip whitespace
+                   and prefix characters but not newlines.  */
+                while (ISBLANK (*f) || *f == '-' || *f == '@' || *f == '+')
+                  ++f;
+
+                /* Copy until we get to the next logical recipe line.  */
+                while (*f != '\0')
+                  {
+                    /* Remove the escaped newlines in the command, and the
+                       blanks that follow them.  Windows shells cannot handle
+                       escaped newlines.  */
+                    if (*f == '\\' && f[1] == '\n')
+                      {
+                        f += 2;
+                        while (ISBLANK (*f))
+                          ++f;
+                      }
+                    *(t++) = *(f++);
+                    /* On an unescaped newline, we're done with this
+                       line.  */
+                    if (f[-1] == '\n')
+                      break;
+                  }
+                /* Write another line into the batch file.  */
+                if (t > tstart)
+                  {
+                    char c = *t;
+                    *t = '\0';
+                    fputs (tstart, batch);
+                    DB (DB_JOBS, ("\t%s", tstart));
+                    tstart = t;
+                    *t = c;
+                  }
+              }
+            DB (DB_JOBS, ("\n"));
+            fclose (batch);
+
+            /* Create an argv list for the shell command line that
+               will run the batch file.  */
+            new_argv = xmalloc (2 * sizeof (char *));
+            new_argv[0] = xstrdup (*batch_filename);
+            new_argv[1] = NULL;
+            return new_argv;
+          }
+#endif /* WINDOWS32 */
+        /* Create an argv list for the shell command line.  */
+        {
+          int n = 0;
+
+          new_argv = xmalloc ((4 + sflags_len/2) * sizeof (char *));
+          new_argv[n++] = xstrdup (shell);
+
+          /* Chop up the shellflags (if any) and assign them.  */
+          if (! shellflags)
+            new_argv[n++] = xstrdup ("");
+          else
+            {
+              const char *s = shellflags;
+              char *t;
+              size_t len;
+              while ((t = find_next_token (&s, &len)) != 0)
+                new_argv[n++] = xstrndup (t, len);
+            }
+
+          /* Set the command to invoke.  */
+          new_argv[n++] = line;
+          new_argv[n++] = NULL;
+        }
+        return new_argv;
+      }
+
+    new_line = xmalloc ((shell_len*2) + 1 + sflags_len + 1
+                        + (line_len*2) + 1);
+    ap = new_line;
+    /* Copy SHELL, escaping any characters special to the shell.  If
+       we don't escape them, construct_command_argv_internal will
+       recursively call itself ad nauseam, or until stack overflow,
+       whichever happens first.  */
+    for (cp = shell; *cp != '\0'; ++cp)
+      {
+        if (strchr (sh_chars, *cp) != 0)
+          *(ap++) = '\\';
+        *(ap++) = *cp;
+      }
+    *(ap++) = ' ';
+    if (shellflags)
+      memcpy (ap, shellflags, sflags_len);
+    ap += sflags_len;
+    *(ap++) = ' ';
+#ifdef WINDOWS32
+    command_ptr = ap;
+#endif
+    for (p = line; *p != '\0'; ++p)
+      {
+        if (restp != NULL && *p == '\n')
+          {
+            *restp = p;
+            break;
+          }
+        else if (*p == '\\' && p[1] == '\n')
+          {
+            /* POSIX says we keep the backslash-newline.  If we don't have a
+               POSIX shell on DOS/Windows/OS2, mimic the pre-POSIX behavior
+               and remove the backslash/newline.  */
+#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32)
+# define PRESERVE_BSNL  unixy_shell
+#else
+# define PRESERVE_BSNL  1
+#endif
+            if (PRESERVE_BSNL)
+              {
+                *(ap++) = '\\';
+                /* Only non-batch execution needs another backslash,
+                   because it will be passed through a recursive
+                   invocation of this function.  */
+                if (!batch_mode_shell)
+                  *(ap++) = '\\';
+                *(ap++) = '\n';
+              }
+            ++p;
+            continue;
+          }
+
+        /* DOS shells don't know about backslash-escaping.  */
+        if (unixy_shell && !batch_mode_shell &&
+            (*p == '\\' || *p == '\'' || *p == '"'
+             || ISSPACE (*p)
+             || strchr (sh_chars, *p) != 0))
+          *ap++ = '\\';
+#ifdef __MSDOS__
+        else if (unixy_shell && strneq (p, "...", 3))
+          {
+            /* The case of '...' wildcard again.  */
+            strcpy (ap, "\\.\\.\\");
+            ap += 5;
+            p  += 2;
+          }
+#endif
+        *ap++ = *p;
+      }
+    if (ap == new_line + shell_len + sflags_len + 2)
+      {
+        /* Line was empty.  */
+        free (new_line);
+        return 0;
+      }
+    *ap = '\0';
+
+#ifdef WINDOWS32
+    /* Some shells do not work well when invoked as 'sh -c xxx' to run a
+       command line (e.g. Cygnus GNUWIN32 sh.exe on WIN32 systems).  In these
+       cases, run commands via a script file.  */
+    if (just_print_flag && !(flags & COMMANDS_RECURSE))
+      {
+        /* Need to allocate new_argv, although it's unused, because
+           start_job_command will want to free it and its 0'th element.  */
+        new_argv = xmalloc (2 * sizeof (char *));
+        new_argv[0] = xstrdup ("");
+        new_argv[1] = NULL;
+      }
+    else if ((no_default_sh_exe || batch_mode_shell) && batch_filename)
+      {
+        int temp_fd;
+        FILE* batch = NULL;
+        int id = GetCurrentProcessId ();
+        PATH_VAR (fbuf);
+
+        /* create a file name */
+        sprintf (fbuf, "make%d", id);
+        *batch_filename = create_batch_file (fbuf, unixy_shell, &temp_fd);
+
+        DB (DB_JOBS, (_("Creating temporary batch file %s\n"),
+                      *batch_filename));
+
+        /* Create a FILE object for the batch file, and write to it the
+           commands to be executed.  Put the batch file in TEXT mode.  */
+        _setmode (temp_fd, _O_TEXT);
+        batch = _fdopen (temp_fd, "wt");
+        if (!unixy_shell)
+          fputs ("@echo off\n", batch);
+        fputs (command_ptr, batch);
+        fputc ('\n', batch);
+        fclose (batch);
+        DB (DB_JOBS, (_("Batch file contents:%s\n\t%s\n"),
+                      !unixy_shell ? "\n\t@echo off" : "", command_ptr));
+
+        /* create argv */
+        new_argv = xmalloc (3 * sizeof (char *));
+        if (unixy_shell)
+          {
+            new_argv[0] = xstrdup (shell);
+            new_argv[1] = *batch_filename; /* only argv[0] gets freed later */
+          }
+        else
+          {
+            new_argv[0] = xstrdup (*batch_filename);
+            new_argv[1] = NULL;
+          }
+        new_argv[2] = NULL;
+      }
+    else
+#endif /* WINDOWS32 */
+
+    if (unixy_shell)
+      new_argv = construct_command_argv_internal (new_line, 0, 0, 0, 0,
+                                                  flags, 0);
+
+#ifdef __EMX__
+    else if (!unixy_shell)
+      {
+        /* new_line is local, must not be freed therefore
+           We use line here instead of new_line because we run the shell
+           manually.  */
+        size_t line_len = strlen (line);
+        char *p = new_line;
+        char *q = new_line;
+        memcpy (new_line, line, line_len + 1);
+        /* Replace all backslash-newline combination and also following tabs.
+           Important: stop at the first '\n' because that's what the loop above
+           did. The next line starting at restp[0] will be executed during the
+           next call of this function. */
+        while (*q != '\0' && *q != '\n')
+          {
+            if (q[0] == '\\' && q[1] == '\n')
+              q += 2; /* remove '\\' and '\n' */
+            else
+              *p++ = *q++;
+          }
+        *p = '\0';
+
+# ifndef NO_CMD_DEFAULT
+        if (strnicmp (new_line, "echo", 4) == 0
+            && (new_line[4] == ' ' || new_line[4] == '\t'))
+          {
+            /* the builtin echo command: handle it separately */
+            size_t echo_len = line_len - 5;
+            char *echo_line = new_line + 5;
+
+            /* special case: echo 'x="y"'
+               cmd works this way: a string is printed as is, i.e., no quotes
+               are removed. But autoconf uses a command like echo 'x="y"' to
+               determine whether make works. autoconf expects the output x="y"
+               so we will do exactly that.
+               Note: if we do not allow cmd to be the default shell
+               we do not need this kind of voodoo */
+            if (echo_line[0] == '\''
+                && echo_line[echo_len - 1] == '\''
+                && strncmp (echo_line + 1, "ac_maketemp=",
+                            strlen ("ac_maketemp=")) == 0)
+              {
+                /* remove the enclosing quotes */
+                memmove (echo_line, echo_line + 1, echo_len - 2);
+                echo_line[echo_len - 2] = '\0';
+              }
+          }
+# endif
+
+        {
+          /* Let the shell decide what to do. Put the command line into the
+             2nd command line argument and hope for the best ;-)  */
+          size_t sh_len = strlen (shell);
+
+          /* exactly 3 arguments + NULL */
+          new_argv = xmalloc (4 * sizeof (char *));
+          /* Exactly strlen(shell) + strlen("/c") + strlen(line) + 3 times
+             the trailing '\0' */
+          new_argv[0] = xmalloc (sh_len + line_len + 5);
+          memcpy (new_argv[0], shell, sh_len + 1);
+          new_argv[1] = new_argv[0] + sh_len + 1;
+          memcpy (new_argv[1], "/c", 3);
+          new_argv[2] = new_argv[1] + 3;
+          memcpy (new_argv[2], new_line, line_len + 1);
+          new_argv[3] = NULL;
+        }
+      }
+#elif defined(__MSDOS__)
+    else
+      {
+        /* With MSDOS shells, we must construct the command line here
+           instead of recursively calling ourselves, because we
+           cannot backslash-escape the special characters (see above).  */
+        new_argv = xmalloc (sizeof (char *));
+        line_len = strlen (new_line) - shell_len - sflags_len - 2;
+        new_argv[0] = xmalloc (line_len + 1);
+        strncpy (new_argv[0],
+                 new_line + shell_len + sflags_len + 2, line_len);
+        new_argv[0][line_len] = '\0';
+      }
+#else
+    else
+      fatal (NILF, CSTRLEN (__FILE__) + INTSTR_LENGTH,
+             _("%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"),
+            __FILE__, __LINE__);
+#endif
+
+    free (new_line);
+  }
+#endif  /* ! AMIGA */
+
+  return new_argv;
+}
+#endif /* !VMS */
+
+/* Figure out the argument list necessary to run LINE as a command.  Try to
+   avoid using a shell.  This routine handles only ' quoting, and " quoting
+   when no backslash, $ or ' characters are seen in the quotes.  Starting
+   quotes may be escaped with a backslash.  If any of the characters in
+   sh_chars is seen, or any of the builtin commands listed in sh_cmds
+   is the first word of a line, the shell is used.
+
+   If RESTP is not NULL, *RESTP is set to point to the first newline in LINE.
+   If *RESTP is NULL, newlines will be ignored.
+
+   FILE is the target whose commands these are.  It is used for
+   variable expansion for $(SHELL) and $(IFS).  */
+
+char **
+construct_command_argv (char *line, char **restp, struct file *file,
+                        int cmd_flags, char **batch_filename)
+{
+  char *shell, *ifs, *shellflags;
+  char **argv;
+
+  {
+    /* Turn off --warn-undefined-variables while we expand SHELL and IFS.  */
+    int save = warn_undefined_variables_flag;
+    warn_undefined_variables_flag = 0;
+
+    shell = allocated_variable_expand_for_file ("$(SHELL)", file);
+#ifdef WINDOWS32
+    /*
+     * Convert to forward slashes so that construct_command_argv_internal()
+     * is not confused.
+     */
+    if (shell)
+      {
+        char *p = w32ify (shell, 0);
+        strcpy (shell, p);
+      }
+#endif
+#ifdef __EMX__
+    {
+      static const char *unixroot = NULL;
+      static const char *last_shell = "";
+      static int init = 0;
+      if (init == 0)
+        {
+          unixroot = getenv ("UNIXROOT");
+          /* unixroot must be NULL or not empty */
+          if (unixroot && unixroot[0] == '\0') unixroot = NULL;
+          init = 1;
+        }
+
+      /* if we have an unixroot drive and if shell is not default_shell
+         (which means it's either cmd.exe or the test has already been
+         performed) and if shell is an absolute path without drive letter,
+         try whether it exists e.g.: if "/bin/sh" does not exist use
+         "$UNIXROOT/bin/sh" instead.  */
+      if (unixroot && shell && strcmp (shell, last_shell) != 0
+          && (shell[0] == '/' || shell[0] == '\\'))
+        {
+          /* trying a new shell, check whether it exists */
+          size_t size = strlen (shell);
+          char *buf = xmalloc (size + 7);
+          memcpy (buf, shell, size);
+          memcpy (buf + size, ".exe", 5); /* including the trailing '\0' */
+          if (access (shell, F_OK) != 0 && access (buf, F_OK) != 0)
+            {
+              /* try the same for the unixroot drive */
+              memmove (buf + 2, buf, size + 5);
+              buf[0] = unixroot[0];
+              buf[1] = unixroot[1];
+              if (access (buf, F_OK) == 0)
+                /* we have found a shell! */
+                /* free(shell); */
+                shell = buf;
+              else
+                free (buf);
+            }
+          else
+            free (buf);
+        }
+    }
+#endif /* __EMX__ */
+
+    shellflags = allocated_variable_expand_for_file ("$(.SHELLFLAGS)", file);
+    ifs = allocated_variable_expand_for_file ("$(IFS)", file);
+
+    warn_undefined_variables_flag = save;
+  }
+
+  argv = construct_command_argv_internal (line, restp, shell, shellflags, ifs,
+                                          cmd_flags, batch_filename);
+
+  free (shell);
+  free (shellflags);
+  free (ifs);
+
+  return argv;
+}
+\f
+#if !defined(HAVE_DUP2) && !defined(_AMIGA)
+int
+dup2 (int old, int new)
+{
+  int fd;
+
+  (void) close (new);
+  EINTRLOOP (fd, dup (old));
+  if (fd != new)
+    {
+      (void) close (fd);
+      errno = EMFILE;
+      return -1;
+    }
+
+  return fd;
+}
+#endif /* !HAVE_DUP2 && !_AMIGA */
+
+/* On VMS systems, include special VMS functions.  */
+
+#ifdef VMS
+#include "vmsjobs.c"
+#endif
diff --git a/src/job.h b/src/job.h
new file mode 100644 (file)
index 0000000..ee290fb
--- /dev/null
+++ b/src/job.h
@@ -0,0 +1,93 @@
+/* Definitions for managing subprocesses in GNU Make.
+Copyright (C) 1992-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "output.h"
+
+/* Structure describing a running or dead child process.  */
+
+#ifdef VMS
+#define VMSCHILD                                                        \
+    char *comname;              /* Temporary command file name */       \
+    int efn;                    /* Completion event flag number */      \
+    int cstatus;                /* Completion status */                 \
+    int vms_launch_status;      /* non-zero if lib$spawn, etc failed */
+#else
+#define VMSCHILD
+#endif
+
+#define CHILDBASE                                               \
+    char *cmd_name;       /* Alloced copy of command run.  */   \
+    char **environment;   /* Environment for commands. */       \
+    VMSCHILD                                                    \
+    struct output output  /* Output for this child.  */
+
+
+struct childbase
+  {
+    CHILDBASE;
+  };
+
+struct child
+  {
+    CHILDBASE;
+
+    struct child *next;         /* Link in the chain.  */
+
+    struct file *file;          /* File being remade.  */
+
+    char *sh_batch_file;        /* Script file for shell commands */
+    char **command_lines;       /* Array of variable-expanded cmd lines.  */
+    char *command_ptr;          /* Ptr into command_lines[command_line].  */
+
+    unsigned int  command_line; /* Index into command_lines.  */
+
+    pid_t pid;                  /* Child process's ID number.  */
+
+    unsigned int  remote:1;     /* Nonzero if executing remotely.  */
+    unsigned int  noerror:1;    /* Nonzero if commands contained a '-'.  */
+    unsigned int  good_stdin:1; /* Nonzero if this child has a good stdin.  */
+    unsigned int  deleted:1;    /* Nonzero if targets have been deleted.  */
+    unsigned int  recursive:1;  /* Nonzero for recursive command ('+' etc.)  */
+    unsigned int  jobslot:1;    /* Nonzero if it's reserved a job slot.  */
+    unsigned int  dontcare:1;   /* Saved dontcare flag.  */
+  };
+
+extern struct child *children;
+
+/* A signal handler for SIGCHLD, if needed.  */
+RETSIGTYPE child_handler (int sig);
+int is_bourne_compatible_shell(const char *path);
+void new_job (struct file *file);
+void reap_children (int block, int err);
+void start_waiting_jobs (void);
+
+char **construct_command_argv (char *line, char **restp, struct file *file,
+                               int cmd_flags, char** batch_file);
+
+pid_t child_execute_job (struct childbase *child, int good_stdin, char **argv);
+
+#ifdef _AMIGA
+void exec_command (char **argv) NORETURN;
+#elif defined(__EMX__)
+int exec_command (char **argv, char **envp);
+#else
+void exec_command (char **argv, char **envp) NORETURN;
+#endif
+
+void unblock_all_sigs (void);
+
+extern unsigned int job_slots_used;
+extern unsigned int jobserver_tokens;
diff --git a/src/load.c b/src/load.c
new file mode 100644 (file)
index 0000000..27f5899
--- /dev/null
@@ -0,0 +1,267 @@
+/* Loading dynamic objects for GNU Make.
+Copyright (C) 2012-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#if MAKE_LOAD
+
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <errno.h>
+
+#define SYMBOL_EXTENSION        "_gmk_setup"
+
+#include "debug.h"
+#include "filedef.h"
+#include "variable.h"
+
+/* Tru64 V4.0 does not have this flag */
+#ifndef RTLD_GLOBAL
+# define RTLD_GLOBAL 0
+#endif
+
+struct load_list
+  {
+    struct load_list *next;
+    const char *name;
+    void *dlp;
+  };
+
+static struct load_list *loaded_syms = NULL;
+
+static load_func_t
+load_object (const floc *flocp, int noerror, const char *ldname,
+             const char *symname)
+{
+  static void *global_dl = NULL;
+  load_func_t symp;
+
+  if (! global_dl)
+    {
+      global_dl = dlopen (NULL, RTLD_NOW|RTLD_GLOBAL);
+      if (! global_dl)
+        {
+          const char *err = dlerror ();
+          OS (fatal, flocp, _("Failed to open global symbol table: %s"), err);
+        }
+    }
+
+  symp = (load_func_t) dlsym (global_dl, symname);
+  if (! symp)
+    {
+      struct load_list *new;
+      void *dlp = NULL;
+
+    /* If the path has no "/", try the current directory first.  */
+      if (! strchr (ldname, '/')
+#ifdef HAVE_DOS_PATHS
+          && ! strchr (ldname, '\\')
+#endif
+         )
+        dlp = dlopen (concat (2, "./", ldname), RTLD_LAZY|RTLD_GLOBAL);
+
+      /* If we haven't opened it yet, try the default search path.  */
+      if (! dlp)
+        dlp = dlopen (ldname, RTLD_LAZY|RTLD_GLOBAL);
+
+      /* Still no?  Then fail.  */
+      if (! dlp)
+        {
+          const char *err = dlerror ();
+          if (noerror)
+            DB (DB_BASIC, ("%s", err));
+          else
+            OS (error, flocp, "%s", err);
+          return NULL;
+        }
+
+      /* Assert that the GPL license symbol is defined.  */
+      symp = (load_func_t) dlsym (dlp, "plugin_is_GPL_compatible");
+      if (! symp)
+        OS (fatal, flocp,
+             _("Loaded object %s is not declared to be GPL compatible"),
+             ldname);
+
+      symp = (load_func_t) dlsym (dlp, symname);
+      if (! symp)
+        {
+          const char *err = dlerror ();
+          OSSS (fatal, flocp, _("Failed to load symbol %s from %s: %s"),
+                symname, ldname, err);
+        }
+
+      /* Add this symbol to a trivial lookup table.  This is not efficient but
+         it's highly unlikely we'll be loading lots of objects, and we only
+         need it to look them up on unload, if we rebuild them.  */
+      new = xmalloc (sizeof (struct load_list));
+      new->name = xstrdup (ldname);
+      new->dlp = dlp;
+      new->next = loaded_syms;
+      loaded_syms = new;
+    }
+
+  return symp;
+}
+
+int
+load_file (const floc *flocp, const char **ldname, int noerror)
+{
+  size_t nmlen = strlen (*ldname);
+  char *new = alloca (nmlen + CSTRLEN (SYMBOL_EXTENSION) + 1);
+  char *symname = NULL;
+  char *loaded;
+  const char *fp;
+  int r;
+  load_func_t symp;
+
+  /* Break the input into an object file name and a symbol name.  If no symbol
+     name was provided, compute one from the object file name.  */
+  fp = strchr (*ldname, '(');
+  if (fp)
+    {
+      const char *ep;
+
+      /* There's an open paren, so see if there's a close paren: if so use
+         that as the symbol name.  We can't have whitespace: it would have
+         been chopped up before this function is called.  */
+      ep = strchr (fp+1, ')');
+      if (ep && ep[1] == '\0')
+        {
+          size_t l = fp - *ldname;;
+
+          ++fp;
+          if (fp == ep)
+            OS (fatal, flocp, _("Empty symbol name for load: %s"), *ldname);
+
+          /* Make a copy of the ldname part.  */
+          memcpy (new, *ldname, l);
+          new[l] = '\0';
+          *ldname = new;
+          nmlen = l;
+
+          /* Make a copy of the symbol name part.  */
+          symname = new + l + 1;
+          memcpy (symname, fp, ep - fp);
+          symname[ep - fp] = '\0';
+        }
+    }
+
+  /* Add this name to the string cache so it can be reused later.  */
+  *ldname = strcache_add (*ldname);
+
+  /* If this object has been loaded, we're done.  */
+  loaded = allocated_variable_expand ("$(.LOADED)");
+  fp = strstr (loaded, *ldname);
+  r = fp && (fp==loaded || fp[-1]==' ') && (fp[nmlen]=='\0' || fp[nmlen]==' ');
+  if (r)
+    goto exit;
+
+  /* If we didn't find a symbol name yet, construct it from the ldname.  */
+  if (! symname)
+    {
+      char *p = new;
+
+      fp = strrchr (*ldname, '/');
+#ifdef HAVE_DOS_PATHS
+      if (fp)
+        {
+          const char *fp2 = strchr (fp, '\\');
+
+          if (fp2 > fp)
+            fp = fp2;
+        }
+      else
+        fp = strrchr (*ldname, '\\');
+      /* The (improbable) case of d:foo.  */
+      if (fp && *fp && fp[1] == ':')
+        fp++;
+#endif
+      if (!fp)
+        fp = *ldname;
+      else
+        ++fp;
+      while (isalnum (*fp) || *fp == '_')
+        *(p++) = *(fp++);
+      strcpy (p, SYMBOL_EXTENSION);
+      symname = new;
+    }
+
+  DB (DB_VERBOSE, (_("Loading symbol %s from %s\n"), symname, *ldname));
+
+  /* Load it!  */
+  symp = load_object (flocp, noerror, *ldname, symname);
+  if (! symp)
+    return 0;
+
+  /* Invoke the symbol.  */
+  r = (*symp) (flocp);
+
+  /* If it succeeded, add the load file to the loaded variable.  */
+  if (r > 0)
+    {
+      size_t loadlen = strlen (loaded);
+      char *newval = alloca (loadlen + strlen (*ldname) + 2);
+      /* Don't add a space if it's empty.  */
+      if (loadlen)
+        {
+          memcpy (newval, loaded, loadlen);
+          newval[loadlen++] = ' ';
+        }
+      strcpy (&newval[loadlen], *ldname);
+      do_variable_definition (flocp, ".LOADED", newval, o_default, f_simple, 0);
+    }
+
+ exit:
+  free (loaded);
+  return r;
+}
+
+void
+unload_file (const char *name)
+{
+  struct load_list *d;
+
+  for (d = loaded_syms; d != NULL; d = d->next)
+    if (streq (d->name, name) && d->dlp)
+      {
+        if (dlclose (d->dlp))
+          perror_with_name ("dlclose: ", d->name);
+        d->dlp = NULL;
+        break;
+      }
+}
+
+#else
+
+int
+load_file (const floc *flocp, const char **ldname UNUSED, int noerror)
+{
+  if (! noerror)
+    O (fatal, flocp,
+       _("The 'load' operation is not supported on this platform."));
+
+  return 0;
+}
+
+void
+unload_file (const char *name UNUSED)
+{
+  O (fatal, NILF, "INTERNAL: Cannot unload when load is not supported!");
+}
+
+#endif  /* MAKE_LOAD */
diff --git a/src/loadapi.c b/src/loadapi.c
new file mode 100644 (file)
index 0000000..4914b2d
--- /dev/null
@@ -0,0 +1,82 @@
+/* API for GNU Make dynamic objects.
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include "filedef.h"
+#include "variable.h"
+#include "dep.h"
+
+/* Allocate a buffer in our context, so we can free it.  */
+char *
+gmk_alloc (unsigned int len)
+{
+  return xmalloc (len);
+}
+
+/* Free a buffer returned by gmk_expand().  */
+void
+gmk_free (char *s)
+{
+  free (s);
+}
+
+/* Evaluate a buffer as make syntax.
+   Ideally eval_buffer() will take const char *, but not yet.  */
+void
+gmk_eval (const char *buffer, const gmk_floc *gfloc)
+{
+  /* Preserve existing variable buffer context.  */
+  char *pbuf;
+  size_t plen;
+  char *s;
+  floc fl;
+  floc *flp;
+
+  if (gfloc)
+    {
+      fl.filenm = gfloc->filenm;
+      fl.lineno = gfloc->lineno;
+      fl.offset = 0;
+      flp = &fl;
+    }
+  else
+    flp = NULL;
+
+  install_variable_buffer (&pbuf, &plen);
+
+  s = xstrdup (buffer);
+  eval_buffer (s, flp);
+  free (s);
+
+  restore_variable_buffer (pbuf, plen);
+}
+
+/* Expand a string and return an allocated buffer.
+   Caller must call gmk_free() with this buffer.  */
+char *
+gmk_expand (const char *ref)
+{
+  return allocated_variable_expand (ref);
+}
+
+/* Register a function to be called from makefiles.  */
+void
+gmk_add_function (const char *name, gmk_func_ptr func,
+                  unsigned int min, unsigned int max, unsigned int flags)
+{
+  define_new_function (reading_file, name, min, max, flags, func);
+}
diff --git a/src/main.c b/src/main.c
new file mode 100644 (file)
index 0000000..78a27d7
--- /dev/null
@@ -0,0 +1,3510 @@
+/* Argument parsing and main program of GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "os.h"
+#include "filedef.h"
+#include "dep.h"
+#include "variable.h"
+#include "job.h"
+#include "commands.h"
+#include "rule.h"
+#include "debug.h"
+#include "getopt.h"
+
+#include <assert.h>
+#ifdef _AMIGA
+# include <dos/dos.h>
+# include <proto/dos.h>
+#endif
+#ifdef WINDOWS32
+# include <windows.h>
+# include <io.h>
+#ifdef HAVE_STRINGS_H
+# include <strings.h>  /* for strcasecmp */
+#endif
+# include "pathstuff.h"
+# include "sub_proc.h"
+# include "w32err.h"
+#endif
+#ifdef __EMX__
+# include <sys/types.h>
+# include <sys/wait.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef _AMIGA
+int __stack = 20000; /* Make sure we have 20K of stack space */
+#endif
+#ifdef VMS
+int vms_use_mcr_command = 0;
+int vms_always_use_cmd_file = 0;
+int vms_gnv_shell = 0;
+int vms_legacy_behavior = 0;
+int vms_comma_separator = 0;
+int vms_unix_simulation = 0;
+int vms_report_unix_paths = 0;
+
+/* Evaluates if a VMS environment option is set, only look at first character */
+static int
+get_vms_env_flag (const char *name, int default_value)
+{
+char * value;
+char x;
+
+  value = getenv (name);
+  if (value == NULL)
+    return default_value;
+
+  x = toupper (value[0]);
+  switch (x)
+    {
+    case '1':
+    case 'T':
+    case 'E':
+      return 1;
+      break;
+    case '0':
+    case 'F':
+    case 'D':
+      return 0;
+    }
+}
+#endif
+
+#if defined HAVE_WAITPID || defined HAVE_WAIT3
+# define HAVE_WAIT_NOHANG
+#endif
+
+#ifndef HAVE_UNISTD_H
+int chdir ();
+#endif
+#ifndef STDC_HEADERS
+# ifndef sun                    /* Sun has an incorrect decl in a header.  */
+void exit (int) NORETURN;
+# endif
+double atof ();
+#endif
+
+static void clean_jobserver (int status);
+static void print_data_base (void);
+static void print_version (void);
+static void decode_switches (int argc, const char **argv, int env);
+static void decode_env_switches (const char *envar, size_t len);
+static struct variable *define_makeflags (int all, int makefile);
+static char *quote_for_env (char *out, const char *in);
+static void initialize_global_hash_tables (void);
+
+\f
+/* The structure that describes an accepted command switch.  */
+
+struct command_switch
+  {
+    int c;                      /* The switch character.  */
+
+    enum                        /* Type of the value.  */
+      {
+        flag,                   /* Turn int flag on.  */
+        flag_off,               /* Turn int flag off.  */
+        string,                 /* One string per invocation.  */
+        strlist,                /* One string per switch.  */
+        filename,               /* A string containing a file name.  */
+        positive_int,           /* A positive integer.  */
+        floating,               /* A floating-point number (double).  */
+        ignore                  /* Ignored.  */
+      } type;
+
+    void *value_ptr;    /* Pointer to the value-holding variable.  */
+
+    unsigned int env:1;         /* Can come from MAKEFLAGS.  */
+    unsigned int toenv:1;       /* Should be put in MAKEFLAGS.  */
+    unsigned int no_makefile:1; /* Don't propagate when remaking makefiles.  */
+
+    const void *noarg_value;    /* Pointer to value used if no arg given.  */
+    const void *default_value;  /* Pointer to default value.  */
+
+    const char *long_name;      /* Long option name.  */
+  };
+
+/* True if C is a switch value that corresponds to a short option.  */
+
+#define short_option(c) ((c) <= CHAR_MAX)
+
+/* The structure used to hold the list of strings given
+   in command switches of a type that takes strlist arguments.  */
+
+struct stringlist
+  {
+    const char **list;  /* Nil-terminated list of strings.  */
+    unsigned int idx;   /* Index into above.  */
+    unsigned int max;   /* Number of pointers allocated.  */
+  };
+
+
+/* The recognized command switches.  */
+
+/* Nonzero means do extra verification (that may slow things down).  */
+
+int verify_flag;
+
+/* Nonzero means do not print commands to be executed (-s).  */
+
+static int silent_flag;
+static const int default_silent_flag = 0;
+
+/* Nonzero means either -s was given, or .SILENT-with-no-deps was seen.  */
+
+int run_silent = 0;
+
+/* Nonzero means just touch the files
+   that would appear to need remaking (-t)  */
+
+int touch_flag;
+
+/* Nonzero means just print what commands would need to be executed,
+   don't actually execute them (-n).  */
+
+int just_print_flag;
+
+/* Print debugging info (--debug).  */
+
+static struct stringlist *db_flags = 0;
+static int debug_flag = 0;
+
+int db_level = 0;
+
+/* Synchronize output (--output-sync).  */
+
+char *output_sync_option = 0;
+
+/* Environment variables override makefile definitions.  */
+
+int env_overrides = 0;
+
+/* Nonzero means ignore status codes returned by commands
+   executed to remake files.  Just treat them all as successful (-i).  */
+
+int ignore_errors_flag = 0;
+
+/* Nonzero means don't remake anything, just print the data base
+   that results from reading the makefile (-p).  */
+
+int print_data_base_flag = 0;
+
+/* Nonzero means don't remake anything; just return a nonzero status
+   if the specified targets are not up to date (-q).  */
+
+int question_flag = 0;
+
+/* Nonzero means do not use any of the builtin rules (-r) / variables (-R).  */
+
+int no_builtin_rules_flag = 0;
+int no_builtin_variables_flag = 0;
+
+/* Nonzero means keep going even if remaking some file fails (-k).  */
+
+int keep_going_flag;
+static const int default_keep_going_flag = 0;
+
+/* Nonzero means check symlink mtimes.  */
+
+int check_symlink_flag = 0;
+
+/* Nonzero means print directory before starting and when done (-w).  */
+
+int print_directory_flag = 0;
+
+/* Nonzero means ignore print_directory_flag and never print the directory.
+   This is necessary because print_directory_flag is set implicitly.  */
+
+int inhibit_print_directory_flag = 0;
+
+/* Nonzero means print version information.  */
+
+int print_version_flag = 0;
+
+/* List of makefiles given with -f switches.  */
+
+static struct stringlist *makefiles = 0;
+
+/* Size of the stack when we started.  */
+
+#ifdef SET_STACK_SIZE
+struct rlimit stack_limit;
+#endif
+
+
+/* Number of job slots for parallelism.  */
+
+unsigned int job_slots;
+
+#define INVALID_JOB_SLOTS (-1)
+static unsigned int master_job_slots = 0;
+static int arg_job_slots = INVALID_JOB_SLOTS;
+
+static const int default_job_slots = INVALID_JOB_SLOTS;
+
+/* Value of job_slots that means no limit.  */
+
+static const int inf_jobs = 0;
+
+/* Authorization for the jobserver.  */
+
+static char *jobserver_auth = NULL;
+
+/* Handle for the mutex used on Windows to synchronize output of our
+   children under -O.  */
+
+char *sync_mutex = NULL;
+
+/* Maximum load average at which multiple jobs will be run.
+   Negative values mean unlimited, while zero means limit to
+   zero load (which could be useful to start infinite jobs remotely
+   but one at a time locally).  */
+double max_load_average = -1.0;
+double default_load_average = -1.0;
+
+/* List of directories given with -C switches.  */
+
+static struct stringlist *directories = 0;
+
+/* List of include directories given with -I switches.  */
+
+static struct stringlist *include_directories = 0;
+
+/* List of files given with -o switches.  */
+
+static struct stringlist *old_files = 0;
+
+/* List of files given with -W switches.  */
+
+static struct stringlist *new_files = 0;
+
+/* List of strings to be eval'd.  */
+static struct stringlist *eval_strings = 0;
+
+/* If nonzero, we should just print usage and exit.  */
+
+static int print_usage_flag = 0;
+
+/* If nonzero, we should print a warning message
+   for each reference to an undefined variable.  */
+
+int warn_undefined_variables_flag;
+
+/* If nonzero, always build all targets, regardless of whether
+   they appear out of date or not.  */
+
+static int always_make_set = 0;
+int always_make_flag = 0;
+
+/* If nonzero, we're in the "try to rebuild makefiles" phase.  */
+
+int rebuilding_makefiles = 0;
+
+/* Remember the original value of the SHELL variable, from the environment.  */
+
+struct variable shell_var;
+
+/* This character introduces a command: it's the first char on the line.  */
+
+char cmd_prefix = '\t';
+
+\f
+/* The usage output.  We write it this way to make life easier for the
+   translators, especially those trying to translate to right-to-left
+   languages like Hebrew.  */
+
+static const char *const usage[] =
+  {
+    N_("Options:\n"),
+    N_("\
+  -b, -m                      Ignored for compatibility.\n"),
+    N_("\
+  -B, --always-make           Unconditionally make all targets.\n"),
+    N_("\
+  -C DIRECTORY, --directory=DIRECTORY\n\
+                              Change to DIRECTORY before doing anything.\n"),
+    N_("\
+  -d                          Print lots of debugging information.\n"),
+    N_("\
+  --debug[=FLAGS]             Print various types of debugging information.\n"),
+    N_("\
+  -e, --environment-overrides\n\
+                              Environment variables override makefiles.\n"),
+    N_("\
+  -E STRING, --eval=STRING    Evaluate STRING as a makefile statement.\n"),
+    N_("\
+  -f FILE, --file=FILE, --makefile=FILE\n\
+                              Read FILE as a makefile.\n"),
+    N_("\
+  -h, --help                  Print this message and exit.\n"),
+    N_("\
+  -i, --ignore-errors         Ignore errors from recipes.\n"),
+    N_("\
+  -I DIRECTORY, --include-dir=DIRECTORY\n\
+                              Search DIRECTORY for included makefiles.\n"),
+    N_("\
+  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.\n"),
+    N_("\
+  -k, --keep-going            Keep going when some targets can't be made.\n"),
+    N_("\
+  -l [N], --load-average[=N], --max-load[=N]\n\
+                              Don't start multiple jobs unless load is below N.\n"),
+    N_("\
+  -L, --check-symlink-times   Use the latest mtime between symlinks and target.\n"),
+    N_("\
+  -n, --just-print, --dry-run, --recon\n\
+                              Don't actually run any recipe; just print them.\n"),
+    N_("\
+  -o FILE, --old-file=FILE, --assume-old=FILE\n\
+                              Consider FILE to be very old and don't remake it.\n"),
+    N_("\
+  -O[TYPE], --output-sync[=TYPE]\n\
+                              Synchronize output of parallel jobs by TYPE.\n"),
+    N_("\
+  -p, --print-data-base       Print make's internal database.\n"),
+    N_("\
+  -q, --question              Run no recipe; exit status says if up to date.\n"),
+    N_("\
+  -r, --no-builtin-rules      Disable the built-in implicit rules.\n"),
+    N_("\
+  -R, --no-builtin-variables  Disable the built-in variable settings.\n"),
+    N_("\
+  -s, --silent, --quiet       Don't echo recipes.\n"),
+    N_("\
+  --no-silent                 Echo recipes (disable --silent mode).\n"),
+    N_("\
+  -S, --no-keep-going, --stop\n\
+                              Turns off -k.\n"),
+    N_("\
+  -t, --touch                 Touch targets instead of remaking them.\n"),
+    N_("\
+  --trace                     Print tracing information.\n"),
+    N_("\
+  -v, --version               Print the version number of make and exit.\n"),
+    N_("\
+  -w, --print-directory       Print the current directory.\n"),
+    N_("\
+  --no-print-directory        Turn off -w, even if it was turned on implicitly.\n"),
+    N_("\
+  -W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE\n\
+                              Consider FILE to be infinitely new.\n"),
+    N_("\
+  --warn-undefined-variables  Warn when an undefined variable is referenced.\n"),
+    NULL
+  };
+
+/* The table of command switches.
+   Order matters here: this is the order MAKEFLAGS will be constructed.
+   So be sure all simple flags (single char, no argument) come first.  */
+
+static const struct command_switch switches[] =
+  {
+    { 'b', ignore, 0, 0, 0, 0, 0, 0, 0 },
+    { 'B', flag, &always_make_set, 1, 1, 0, 0, 0, "always-make" },
+    { 'd', flag, &debug_flag, 1, 1, 0, 0, 0, 0 },
+    { 'e', flag, &env_overrides, 1, 1, 0, 0, 0, "environment-overrides", },
+    { 'E', strlist, &eval_strings, 1, 0, 0, 0, 0, "eval" },
+    { 'h', flag, &print_usage_flag, 0, 0, 0, 0, 0, "help" },
+    { 'i', flag, &ignore_errors_flag, 1, 1, 0, 0, 0, "ignore-errors" },
+    { 'k', flag, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
+      "keep-going" },
+    { 'L', flag, &check_symlink_flag, 1, 1, 0, 0, 0, "check-symlink-times" },
+    { 'm', ignore, 0, 0, 0, 0, 0, 0, 0 },
+    { 'n', flag, &just_print_flag, 1, 1, 1, 0, 0, "just-print" },
+    { 'p', flag, &print_data_base_flag, 1, 1, 0, 0, 0, "print-data-base" },
+    { 'q', flag, &question_flag, 1, 1, 1, 0, 0, "question" },
+    { 'r', flag, &no_builtin_rules_flag, 1, 1, 0, 0, 0, "no-builtin-rules" },
+    { 'R', flag, &no_builtin_variables_flag, 1, 1, 0, 0, 0,
+      "no-builtin-variables" },
+    { 's', flag, &silent_flag, 1, 1, 0, 0, &default_silent_flag, "silent" },
+    { 'S', flag_off, &keep_going_flag, 1, 1, 0, 0, &default_keep_going_flag,
+      "no-keep-going" },
+    { 't', flag, &touch_flag, 1, 1, 1, 0, 0, "touch" },
+    { 'v', flag, &print_version_flag, 1, 1, 0, 0, 0, "version" },
+    { 'w', flag, &print_directory_flag, 1, 1, 0, 0, 0, "print-directory" },
+
+    /* These options take arguments.  */
+    { 'C', filename, &directories, 0, 0, 0, 0, 0, "directory" },
+    { 'f', filename, &makefiles, 0, 0, 0, 0, 0, "file" },
+    { 'I', filename, &include_directories, 1, 1, 0, 0, 0,
+      "include-dir" },
+    { 'j', positive_int, &arg_job_slots, 1, 1, 0, &inf_jobs, &default_job_slots,
+      "jobs" },
+    { 'l', floating, &max_load_average, 1, 1, 0, &default_load_average,
+      &default_load_average, "load-average" },
+    { 'o', filename, &old_files, 0, 0, 0, 0, 0, "old-file" },
+    { 'O', string, &output_sync_option, 1, 1, 0, "target", 0, "output-sync" },
+    { 'W', filename, &new_files, 0, 0, 0, 0, 0, "what-if" },
+
+    /* These are long-style options.  */
+    { CHAR_MAX+1, strlist, &db_flags, 1, 1, 0, "basic", 0, "debug" },
+    { CHAR_MAX+2, string, &jobserver_auth, 1, 1, 0, 0, 0, "jobserver-auth" },
+    { CHAR_MAX+3, flag, &trace_flag, 1, 1, 0, 0, 0, "trace" },
+    { CHAR_MAX+4, flag, &inhibit_print_directory_flag, 1, 1, 0, 0, 0,
+      "no-print-directory" },
+    { CHAR_MAX+5, flag, &warn_undefined_variables_flag, 1, 1, 0, 0, 0,
+      "warn-undefined-variables" },
+    { CHAR_MAX+7, string, &sync_mutex, 1, 1, 0, 0, 0, "sync-mutex" },
+    { CHAR_MAX+8, flag_off, &silent_flag, 1, 1, 0, 0, &default_silent_flag, "no-silent" },
+    { CHAR_MAX+9, string, &jobserver_auth, 1, 0, 0, 0, 0, "jobserver-fds" },
+    { 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+  };
+
+/* Secondary long names for options.  */
+
+static struct option long_option_aliases[] =
+  {
+    { "quiet",          no_argument,            0, 's' },
+    { "stop",           no_argument,            0, 'S' },
+    { "new-file",       required_argument,      0, 'W' },
+    { "assume-new",     required_argument,      0, 'W' },
+    { "assume-old",     required_argument,      0, 'o' },
+    { "max-load",       optional_argument,      0, 'l' },
+    { "dry-run",        no_argument,            0, 'n' },
+    { "recon",          no_argument,            0, 'n' },
+    { "makefile",       required_argument,      0, 'f' },
+  };
+
+/* List of goal targets.  */
+
+static struct goaldep *goals, *lastgoal;
+
+/* List of variables which were defined on the command line
+   (or, equivalently, in MAKEFLAGS).  */
+
+struct command_variable
+  {
+    struct command_variable *next;
+    struct variable *variable;
+  };
+static struct command_variable *command_variables;
+\f
+/* The name we were invoked with.  */
+
+const char *program;
+
+/* Our current directory before processing any -C options.  */
+
+char *directory_before_chdir;
+
+/* Our current directory after processing all -C options.  */
+
+char *starting_directory;
+
+/* Value of the MAKELEVEL variable at startup (or 0).  */
+
+unsigned int makelevel;
+
+/* Pointer to the value of the .DEFAULT_GOAL special variable.
+   The value will be the name of the goal to remake if the command line
+   does not override it.  It can be set by the makefile, or else it's
+   the first target defined in the makefile whose name does not start
+   with '.'.  */
+
+struct variable * default_goal_var;
+
+/* Pointer to structure for the file .DEFAULT
+   whose commands are used for any file that has none of its own.
+   This is zero if the makefiles do not define .DEFAULT.  */
+
+struct file *default_file;
+
+/* Nonzero if we have seen the magic '.POSIX' target.
+   This turns on pedantic compliance with POSIX.2.  */
+
+int posix_pedantic;
+
+/* Nonzero if we have seen the '.SECONDEXPANSION' target.
+   This turns on secondary expansion of prerequisites.  */
+
+int second_expansion;
+
+/* Nonzero if we have seen the '.ONESHELL' target.
+   This causes the entire recipe to be handed to SHELL
+   as a single string, potentially containing newlines.  */
+
+int one_shell;
+
+/* One of OUTPUT_SYNC_* if the "--output-sync" option was given.  This
+   attempts to synchronize the output of parallel jobs such that the results
+   of each job stay together.  */
+
+int output_sync = OUTPUT_SYNC_NONE;
+
+/* Nonzero if the "--trace" option was given.  */
+
+int trace_flag = 0;
+
+/* Nonzero if we have seen the '.NOTPARALLEL' target.
+   This turns off parallel builds for this invocation of make.  */
+
+int not_parallel;
+
+/* Nonzero if some rule detected clock skew; we keep track so (a) we only
+   print one warning about it during the run, and (b) we can print a final
+   warning at the end of the run. */
+
+int clock_skew_detected;
+
+/* Map of possible stop characters for searching strings.  */
+#ifndef UCHAR_MAX
+# define UCHAR_MAX 255
+#endif
+unsigned short stopchar_map[UCHAR_MAX + 1] = {0};
+
+/* If output-sync is enabled we'll collect all the output generated due to
+   options, while reading makefiles, etc.  */
+
+struct output make_sync;
+
+\f
+/* Mask of signals that are being caught with fatal_error_signal.  */
+
+#if defined(POSIX)
+sigset_t fatal_signal_set;
+#elif defined(HAVE_SIGSETMASK)
+int fatal_signal_mask;
+#endif
+
+#if !HAVE_DECL_BSD_SIGNAL && !defined bsd_signal
+# if !defined HAVE_SIGACTION
+#  define bsd_signal signal
+# else
+typedef RETSIGTYPE (*bsd_signal_ret_t) (int);
+
+static bsd_signal_ret_t
+bsd_signal (int sig, bsd_signal_ret_t func)
+{
+  struct sigaction act, oact;
+  act.sa_handler = func;
+  act.sa_flags = SA_RESTART;
+  sigemptyset (&act.sa_mask);
+  sigaddset (&act.sa_mask, sig);
+  if (sigaction (sig, &act, &oact) != 0)
+    return SIG_ERR;
+  return oact.sa_handler;
+}
+# endif
+#endif
+
+static void
+initialize_global_hash_tables (void)
+{
+  init_hash_global_variable_set ();
+  strcache_init ();
+  init_hash_files ();
+  hash_init_directories ();
+  hash_init_function_table ();
+}
+
+/* This character map locate stop chars when parsing GNU makefiles.
+   Each element is true if we should stop parsing on that character.  */
+
+static void
+initialize_stopchar_map (void)
+{
+  int i;
+
+  stopchar_map[(int)'\0'] = MAP_NUL;
+  stopchar_map[(int)'#'] = MAP_COMMENT;
+  stopchar_map[(int)';'] = MAP_SEMI;
+  stopchar_map[(int)'='] = MAP_EQUALS;
+  stopchar_map[(int)':'] = MAP_COLON;
+  stopchar_map[(int)'|'] = MAP_PIPE;
+  stopchar_map[(int)'.'] = MAP_DOT | MAP_USERFUNC;
+  stopchar_map[(int)','] = MAP_COMMA;
+  stopchar_map[(int)'('] = MAP_VARSEP;
+  stopchar_map[(int)'{'] = MAP_VARSEP;
+  stopchar_map[(int)'}'] = MAP_VARSEP;
+  stopchar_map[(int)')'] = MAP_VARSEP;
+  stopchar_map[(int)'$'] = MAP_VARIABLE;
+
+  stopchar_map[(int)'-'] = MAP_USERFUNC;
+  stopchar_map[(int)'_'] = MAP_USERFUNC;
+
+  stopchar_map[(int)' '] = MAP_BLANK;
+  stopchar_map[(int)'\t'] = MAP_BLANK;
+
+  stopchar_map[(int)'/'] = MAP_DIRSEP;
+#if defined(VMS)
+  stopchar_map[(int)':'] |= MAP_DIRSEP;
+  stopchar_map[(int)']'] |= MAP_DIRSEP;
+  stopchar_map[(int)'>'] |= MAP_DIRSEP;
+#elif defined(HAVE_DOS_PATHS)
+  stopchar_map[(int)'\\'] |= MAP_DIRSEP;
+#endif
+
+  for (i = 1; i <= UCHAR_MAX; ++i)
+    {
+      if (isspace (i) && NONE_SET (stopchar_map[i], MAP_BLANK))
+        /* Don't mark blank characters as newline characters.  */
+        stopchar_map[i] |= MAP_NEWLINE;
+      else if (isalnum (i))
+        stopchar_map[i] |= MAP_USERFUNC;
+    }
+}
+
+static const char *
+expand_command_line_file (const char *name)
+{
+  const char *cp;
+  char *expanded = 0;
+
+  if (name[0] == '\0')
+    O (fatal, NILF, _("empty string invalid as file name"));
+
+  if (name[0] == '~')
+    {
+      expanded = tilde_expand (name);
+      if (expanded && expanded[0] != '\0')
+        name = expanded;
+    }
+
+  /* This is also done in parse_file_seq, so this is redundant
+     for names read from makefiles.  It is here for names passed
+     on the command line.  */
+  while (name[0] == '.' && name[1] == '/')
+    {
+      name += 2;
+      while (name[0] == '/')
+        /* Skip following slashes: ".//foo" is "foo", not "/foo".  */
+        ++name;
+    }
+
+  if (name[0] == '\0')
+    {
+      /* Nothing else but one or more "./", maybe plus slashes!  */
+      name = "./";
+    }
+
+  cp = strcache_add (name);
+
+  free (expanded);
+
+  return cp;
+}
+
+/* Toggle -d on receipt of SIGUSR1.  */
+
+#ifdef SIGUSR1
+static RETSIGTYPE
+debug_signal_handler (int sig UNUSED)
+{
+  db_level = db_level ? DB_NONE : DB_BASIC;
+}
+#endif
+
+static void
+decode_debug_flags (void)
+{
+  const char **pp;
+
+  if (debug_flag)
+    db_level = DB_ALL;
+
+  if (db_flags)
+    for (pp=db_flags->list; *pp; ++pp)
+      {
+        const char *p = *pp;
+
+        while (1)
+          {
+            switch (tolower (p[0]))
+              {
+              case 'a':
+                db_level |= DB_ALL;
+                break;
+              case 'b':
+                db_level |= DB_BASIC;
+                break;
+              case 'i':
+                db_level |= DB_BASIC | DB_IMPLICIT;
+                break;
+              case 'j':
+                db_level |= DB_JOBS;
+                break;
+              case 'm':
+                db_level |= DB_BASIC | DB_MAKEFILES;
+                break;
+              case 'n':
+                db_level = 0;
+                break;
+              case 'v':
+                db_level |= DB_BASIC | DB_VERBOSE;
+                break;
+              default:
+                OS (fatal, NILF,
+                    _("unknown debug level specification '%s'"), p);
+              }
+
+            while (*(++p) != '\0')
+              if (*p == ',' || *p == ' ')
+                {
+                  ++p;
+                  break;
+                }
+
+            if (*p == '\0')
+              break;
+          }
+      }
+
+  if (db_level)
+    verify_flag = 1;
+
+  if (! db_level)
+    debug_flag = 0;
+}
+
+static void
+decode_output_sync_flags (void)
+{
+#ifdef NO_OUTPUT_SYNC
+  output_sync = OUTPUT_SYNC_NONE;
+#else
+  if (output_sync_option)
+    {
+      if (streq (output_sync_option, "none"))
+        output_sync = OUTPUT_SYNC_NONE;
+      else if (streq (output_sync_option, "line"))
+        output_sync = OUTPUT_SYNC_LINE;
+      else if (streq (output_sync_option, "target"))
+        output_sync = OUTPUT_SYNC_TARGET;
+      else if (streq (output_sync_option, "recurse"))
+        output_sync = OUTPUT_SYNC_RECURSE;
+      else
+        OS (fatal, NILF,
+            _("unknown output-sync type '%s'"), output_sync_option);
+    }
+
+  if (sync_mutex)
+    RECORD_SYNC_MUTEX (sync_mutex);
+#endif
+}
+
+#ifdef WINDOWS32
+
+#ifndef NO_OUTPUT_SYNC
+
+/* This is called from start_job_command when it detects that
+   output_sync option is in effect.  The handle to the synchronization
+   mutex is passed, as a string, to sub-makes via the --sync-mutex
+   command-line argument.  */
+void
+prepare_mutex_handle_string (sync_handle_t handle)
+{
+  if (!sync_mutex)
+    {
+      /* Prepare the mutex handle string for our children.  */
+      /* 2 hex digits per byte + 2 characters for "0x" + null.  */
+      sync_mutex = xmalloc ((2 * sizeof (sync_handle_t)) + 2 + 1);
+      sprintf (sync_mutex, "0x%Ix", handle);
+      define_makeflags (1, 0);
+    }
+}
+
+#endif  /* NO_OUTPUT_SYNC */
+
+/*
+ * HANDLE runtime exceptions by avoiding a requestor on the GUI. Capture
+ * exception and print it to stderr instead.
+ *
+ * If ! DB_VERBOSE, just print a simple message and exit.
+ * If DB_VERBOSE, print a more verbose message.
+ * If compiled for DEBUG, let exception pass through to GUI so that
+ *   debuggers can attach.
+ */
+LONG WINAPI
+handle_runtime_exceptions (struct _EXCEPTION_POINTERS *exinfo)
+{
+  PEXCEPTION_RECORD exrec = exinfo->ExceptionRecord;
+  LPSTR cmdline = GetCommandLine ();
+  LPSTR prg = strtok (cmdline, " ");
+  CHAR errmsg[1024];
+#ifdef USE_EVENT_LOG
+  HANDLE hEventSource;
+  LPTSTR lpszStrings[1];
+#endif
+
+  if (! ISDB (DB_VERBOSE))
+    {
+      sprintf (errmsg,
+               _("%s: Interrupt/Exception caught (code = 0x%lx, addr = 0x%p)\n"),
+               prg, exrec->ExceptionCode, exrec->ExceptionAddress);
+      fprintf (stderr, errmsg);
+      exit (255);
+    }
+
+  sprintf (errmsg,
+           _("\nUnhandled exception filter called from program %s\nExceptionCode = %lx\nExceptionFlags = %lx\nExceptionAddress = 0x%p\n"),
+           prg, exrec->ExceptionCode, exrec->ExceptionFlags,
+           exrec->ExceptionAddress);
+
+  if (exrec->ExceptionCode == EXCEPTION_ACCESS_VIOLATION
+      && exrec->NumberParameters >= 2)
+    sprintf (&errmsg[strlen(errmsg)],
+             (exrec->ExceptionInformation[0]
+              ? _("Access violation: write operation at address 0x%p\n")
+              : _("Access violation: read operation at address 0x%p\n")),
+             (PVOID)exrec->ExceptionInformation[1]);
+
+  /* turn this on if we want to put stuff in the event log too */
+#ifdef USE_EVENT_LOG
+  hEventSource = RegisterEventSource (NULL, "GNU Make");
+  lpszStrings[0] = errmsg;
+
+  if (hEventSource != NULL)
+    {
+      ReportEvent (hEventSource,         /* handle of event source */
+                   EVENTLOG_ERROR_TYPE,  /* event type */
+                   0,                    /* event category */
+                   0,                    /* event ID */
+                   NULL,                 /* current user's SID */
+                   1,                    /* strings in lpszStrings */
+                   0,                    /* no bytes of raw data */
+                   lpszStrings,          /* array of error strings */
+                   NULL);                /* no raw data */
+
+      (VOID) DeregisterEventSource (hEventSource);
+    }
+#endif
+
+  /* Write the error to stderr too */
+  fprintf (stderr, errmsg);
+
+#ifdef DEBUG
+  return EXCEPTION_CONTINUE_SEARCH;
+#else
+  exit (255);
+  return (255); /* not reached */
+#endif
+}
+
+/*
+ * On WIN32 systems we don't have the luxury of a /bin directory that
+ * is mapped globally to every drive mounted to the system. Since make could
+ * be invoked from any drive, and we don't want to propagate /bin/sh
+ * to every single drive. Allow ourselves a chance to search for
+ * a value for default shell here (if the default path does not exist).
+ */
+
+int
+find_and_set_default_shell (const char *token)
+{
+  int sh_found = 0;
+  char *atoken = 0;
+  const char *search_token;
+  const char *tokend;
+  PATH_VAR(sh_path);
+  extern const char *default_shell;
+
+  if (!token)
+    search_token = default_shell;
+  else
+    search_token = atoken = xstrdup (token);
+
+  /* If the user explicitly requests the DOS cmd shell, obey that request.
+     However, make sure that's what they really want by requiring the value
+     of SHELL either equal, or have a final path element of, "cmd" or
+     "cmd.exe" case-insensitive.  */
+  tokend = search_token + strlen (search_token) - 3;
+  if (((tokend == search_token
+        || (tokend > search_token
+            && (tokend[-1] == '/' || tokend[-1] == '\\')))
+       && !strcasecmp (tokend, "cmd"))
+      || ((tokend - 4 == search_token
+           || (tokend - 4 > search_token
+               && (tokend[-5] == '/' || tokend[-5] == '\\')))
+          && !strcasecmp (tokend - 4, "cmd.exe")))
+    {
+      batch_mode_shell = 1;
+      unixy_shell = 0;
+      sprintf (sh_path, "%s", search_token);
+      default_shell = xstrdup (w32ify (sh_path, 0));
+      DB (DB_VERBOSE, (_("find_and_set_shell() setting default_shell = %s\n"),
+                       default_shell));
+      sh_found = 1;
+    }
+  else if (!no_default_sh_exe
+           && (token == NULL || !strcmp (search_token, default_shell)))
+    {
+      /* no new information, path already set or known */
+      sh_found = 1;
+    }
+  else if (_access (search_token, 0) == 0)
+    {
+      /* search token path was found */
+      sprintf (sh_path, "%s", search_token);
+      default_shell = xstrdup (w32ify (sh_path, 0));
+      DB (DB_VERBOSE, (_("find_and_set_shell() setting default_shell = %s\n"),
+                       default_shell));
+      sh_found = 1;
+    }
+  else
+    {
+      char *p;
+      struct variable *v = lookup_variable (STRING_SIZE_TUPLE ("PATH"));
+
+      /* Search Path for shell */
+      if (v && v->value)
+        {
+          char *ep;
+
+          p  = v->value;
+          ep = strchr (p, PATH_SEPARATOR_CHAR);
+
+          while (ep && *ep)
+            {
+              *ep = '\0';
+
+              sprintf (sh_path, "%s/%s", p, search_token);
+              if (_access (sh_path, 0) == 0)
+                {
+                  default_shell = xstrdup (w32ify (sh_path, 0));
+                  sh_found = 1;
+                  *ep = PATH_SEPARATOR_CHAR;
+
+                  /* terminate loop */
+                  p += strlen (p);
+                }
+              else
+                {
+                  *ep = PATH_SEPARATOR_CHAR;
+                  p = ++ep;
+                }
+
+              ep = strchr (p, PATH_SEPARATOR_CHAR);
+            }
+
+          /* be sure to check last element of Path */
+          if (p && *p)
+            {
+              sprintf (sh_path, "%s/%s", p, search_token);
+              if (_access (sh_path, 0) == 0)
+                {
+                  default_shell = xstrdup (w32ify (sh_path, 0));
+                  sh_found = 1;
+                }
+            }
+
+          if (sh_found)
+            DB (DB_VERBOSE,
+                (_("find_and_set_shell() path search set default_shell = %s\n"),
+                 default_shell));
+        }
+    }
+
+  /* naive test */
+  if (!unixy_shell && sh_found
+      && (strstr (default_shell, "sh") || strstr (default_shell, "SH")))
+    {
+      unixy_shell = 1;
+      batch_mode_shell = 0;
+    }
+
+#ifdef BATCH_MODE_ONLY_SHELL
+  batch_mode_shell = 1;
+#endif
+
+  free (atoken);
+
+  return (sh_found);
+}
+#endif  /* WINDOWS32 */
+
+#ifdef __MSDOS__
+static void
+msdos_return_to_initial_directory (void)
+{
+  if (directory_before_chdir)
+    chdir (directory_before_chdir);
+}
+#endif  /* __MSDOS__ */
+
+static void
+reset_jobserver (void)
+{
+  jobserver_clear ();
+  free (jobserver_auth);
+  jobserver_auth = NULL;
+}
+
+#ifdef _AMIGA
+int
+main (int argc, char **argv)
+#else
+int
+main (int argc, char **argv, char **envp)
+#endif
+{
+  static char *stdin_nm = 0;
+  int makefile_status = MAKE_SUCCESS;
+  struct goaldep *read_files;
+  PATH_VAR (current_directory);
+  unsigned int restarts = 0;
+  unsigned int syncing = 0;
+  int argv_slots;
+#ifdef WINDOWS32
+  const char *unix_path = NULL;
+  const char *windows32_path = NULL;
+
+  SetUnhandledExceptionFilter (handle_runtime_exceptions);
+
+  /* start off assuming we have no shell */
+  unixy_shell = 0;
+  no_default_sh_exe = 1;
+#endif
+
+  /* Useful for attaching debuggers, etc.  */
+  SPIN ("main-entry");
+
+  output_init (&make_sync);
+
+  initialize_stopchar_map();
+
+#ifdef SET_STACK_SIZE
+ /* Get rid of any avoidable limit on stack size.  */
+  {
+    struct rlimit rlim;
+
+    /* Set the stack limit huge so that alloca does not fail.  */
+    if (getrlimit (RLIMIT_STACK, &rlim) == 0
+        && rlim.rlim_cur > 0 && rlim.rlim_cur < rlim.rlim_max)
+      {
+        stack_limit = rlim;
+        rlim.rlim_cur = rlim.rlim_max;
+        setrlimit (RLIMIT_STACK, &rlim);
+      }
+    else
+      stack_limit.rlim_cur = 0;
+  }
+#endif
+
+  /* Needed for OS/2 */
+  initialize_main (&argc, &argv);
+
+#ifdef MAKE_MAINTAINER_MODE
+  /* In maintainer mode we always enable verification.  */
+  verify_flag = 1;
+#endif
+
+#if defined (__MSDOS__) && !defined (_POSIX_SOURCE)
+  /* Request the most powerful version of 'system', to
+     make up for the dumb default shell.  */
+  __system_flags = (__system_redirect
+                    | __system_use_shell
+                    | __system_allow_multiple_cmds
+                    | __system_allow_long_cmds
+                    | __system_handle_null_commands
+                    | __system_emulate_chdir);
+
+#endif
+
+  /* Set up gettext/internationalization support.  */
+  setlocale (LC_ALL, "");
+  /* The cast to void shuts up compiler warnings on systems that
+     disable NLS.  */
+  (void)bindtextdomain (PACKAGE, LOCALEDIR);
+  (void)textdomain (PACKAGE);
+
+#ifdef  POSIX
+  sigemptyset (&fatal_signal_set);
+#define ADD_SIG(sig)    sigaddset (&fatal_signal_set, sig)
+#else
+#ifdef  HAVE_SIGSETMASK
+  fatal_signal_mask = 0;
+#define ADD_SIG(sig)    fatal_signal_mask |= sigmask (sig)
+#else
+#define ADD_SIG(sig)    (void)sig
+#endif
+#endif
+
+#define FATAL_SIG(sig)                                                        \
+  if (bsd_signal (sig, fatal_error_signal) == SIG_IGN)                        \
+    bsd_signal (sig, SIG_IGN);                                                \
+  else                                                                        \
+    ADD_SIG (sig);
+
+#ifdef SIGHUP
+  FATAL_SIG (SIGHUP);
+#endif
+#ifdef SIGQUIT
+  FATAL_SIG (SIGQUIT);
+#endif
+  FATAL_SIG (SIGINT);
+  FATAL_SIG (SIGTERM);
+
+#ifdef __MSDOS__
+  /* Windows 9X delivers FP exceptions in child programs to their
+     parent!  We don't want Make to die when a child divides by zero,
+     so we work around that lossage by catching SIGFPE.  */
+  FATAL_SIG (SIGFPE);
+#endif
+
+#ifdef  SIGDANGER
+  FATAL_SIG (SIGDANGER);
+#endif
+#ifdef SIGXCPU
+  FATAL_SIG (SIGXCPU);
+#endif
+#ifdef SIGXFSZ
+  FATAL_SIG (SIGXFSZ);
+#endif
+
+#undef  FATAL_SIG
+
+  /* Do not ignore the child-death signal.  This must be done before
+     any children could possibly be created; otherwise, the wait
+     functions won't work on systems with the SVR4 ECHILD brain
+     damage, if our invoker is ignoring this signal.  */
+
+#ifdef HAVE_WAIT_NOHANG
+# if defined SIGCHLD
+  (void) bsd_signal (SIGCHLD, SIG_DFL);
+# endif
+# if defined SIGCLD && SIGCLD != SIGCHLD
+  (void) bsd_signal (SIGCLD, SIG_DFL);
+# endif
+#endif
+
+  output_init (NULL);
+
+  /* Figure out where this program lives.  */
+
+  if (argv[0] == 0)
+    argv[0] = (char *)"";
+  if (argv[0][0] == '\0')
+    program = "make";
+  else
+    {
+#if defined(HAVE_DOS_PATHS)
+      const char* start = argv[0];
+
+      /* Skip an initial drive specifier if present.  */
+      if (isalpha ((unsigned char)start[0]) && start[1] == ':')
+        start += 2;
+
+      if (start[0] == '\0')
+        program = "make";
+      else
+        {
+          program = start + strlen (start);
+          while (program > start && ! STOP_SET (program[-1], MAP_DIRSEP))
+            --program;
+
+          /* Remove the .exe extension if present.  */
+          {
+            size_t len = strlen (program);
+            if (len > 4 && streq (&program[len - 4], ".exe"))
+              program = xstrndup (program, len - 4);
+          }
+        }
+#elif defined(VMS)
+      set_program_name (argv[0]);
+      program = program_name;
+      {
+        const char *shell;
+        char pwdbuf[256];
+        char *pwd;
+        shell = getenv ("SHELL");
+        if (shell != NULL)
+          vms_gnv_shell = 1;
+
+        /* Need to know if CRTL set to report UNIX paths.  Use getcwd as
+           it works on all versions of VMS. */
+        pwd = getcwd(pwdbuf, 256);
+        if (pwd[0] == '/')
+          vms_report_unix_paths = 1;
+
+        vms_use_mcr_command = get_vms_env_flag ("GNV$MAKE_USE_MCR", 0);
+
+        vms_always_use_cmd_file = get_vms_env_flag ("GNV$MAKE_USE_CMD_FILE", 0);
+
+        /* Legacy behavior is on VMS is older behavior that needed to be
+           changed to be compatible with standard make behavior.
+           For now only completely disable when running under a Bash shell.
+           TODO: Update VMS built in recipes and macros to not need this
+           behavior, at which time the default may change. */
+        vms_legacy_behavior = get_vms_env_flag ("GNV$MAKE_OLD_VMS",
+                                                !vms_gnv_shell);
+
+        /* VMS was changed to use a comma separator in the past, but that is
+           incompatible with built in functions that expect space separated
+           lists.  Allow this to be selectively turned off. */
+        vms_comma_separator = get_vms_env_flag ("GNV$MAKE_COMMA",
+                                                vms_legacy_behavior);
+
+        /* Some Posix shell syntax options are incompatible with VMS syntax.
+           VMS requires double quotes for strings and escapes quotes
+           differently.  When this option is active, VMS will try
+           to simulate Posix shell simulations instead of using
+           VMS DCL behavior. */
+        vms_unix_simulation = get_vms_env_flag ("GNV$MAKE_SHELL_SIM",
+                                                !vms_legacy_behavior);
+
+      }
+      if (need_vms_symbol () && !vms_use_mcr_command)
+        create_foreign_command (program_name, argv[0]);
+#else
+      program = strrchr (argv[0], '/');
+      if (program == 0)
+        program = argv[0];
+      else
+        ++program;
+#endif
+    }
+
+  /* Set up to access user data (files).  */
+  user_access ();
+
+  initialize_global_hash_tables ();
+
+  /* Figure out where we are.  */
+
+#ifdef WINDOWS32
+  if (getcwd_fs (current_directory, GET_PATH_MAX) == 0)
+#else
+  if (getcwd (current_directory, GET_PATH_MAX) == 0)
+#endif
+    {
+#ifdef  HAVE_GETCWD
+      perror_with_name ("getcwd", "");
+#else
+      OS (error, NILF, "getwd: %s", current_directory);
+#endif
+      current_directory[0] = '\0';
+      directory_before_chdir = 0;
+    }
+  else
+    directory_before_chdir = xstrdup (current_directory);
+
+#ifdef  __MSDOS__
+  /* Make sure we will return to the initial directory, come what may.  */
+  atexit (msdos_return_to_initial_directory);
+#endif
+
+  /* Initialize the special variables.  */
+  define_variable_cname (".VARIABLES", "", o_default, 0)->special = 1;
+  /* define_variable_cname (".TARGETS", "", o_default, 0)->special = 1; */
+  define_variable_cname (".RECIPEPREFIX", "", o_default, 0)->special = 1;
+  define_variable_cname (".SHELLFLAGS", "-c", o_default, 0);
+  define_variable_cname (".LOADED", "", o_default, 0);
+
+  /* Set up .FEATURES
+     Use a separate variable because define_variable_cname() is a macro and
+     some compilers (MSVC) don't like conditionals in macros.  */
+  {
+    const char *features = "target-specific order-only second-expansion"
+                           " else-if shortest-stem undefine oneshell nocomment"
+                           " grouped-target extra-prereqs"
+#ifndef NO_ARCHIVES
+                           " archives"
+#endif
+#ifdef MAKE_JOBSERVER
+                           " jobserver"
+#endif
+#ifndef NO_OUTPUT_SYNC
+                           " output-sync"
+#endif
+#ifdef MAKE_SYMLINKS
+                           " check-symlink"
+#endif
+#ifdef HAVE_GUILE
+                           " guile"
+#endif
+#ifdef MAKE_LOAD
+                           " load"
+#endif
+#ifdef MAKE_MAINTAINER_MODE
+                           " maintainer"
+#endif
+                           ;
+
+    define_variable_cname (".FEATURES", features, o_default, 0);
+  }
+
+  /* Configure GNU Guile support */
+  guile_gmake_setup (NILF);
+
+  /* Read in variables from the environment.  It is important that this be
+     done before $(MAKE) is figured out so its definitions will not be
+     from the environment.  */
+
+#ifndef _AMIGA
+  {
+    unsigned int i;
+
+    for (i = 0; envp[i] != 0; ++i)
+      {
+        struct variable *v;
+        const char *ep = envp[i];
+        /* By default, export all variables culled from the environment.  */
+        enum variable_export export = v_export;
+        size_t len;
+
+        while (! STOP_SET (*ep, MAP_EQUALS))
+          ++ep;
+
+        /* If there's no equals sign it's a malformed environment.  Ignore.  */
+        if (*ep == '\0')
+          continue;
+
+#ifdef WINDOWS32
+        if (!unix_path && strneq (envp[i], "PATH=", 5))
+          unix_path = ep+1;
+        else if (!strnicmp (envp[i], "Path=", 5))
+          {
+            if (!windows32_path)
+              windows32_path = ep+1;
+            /* PATH gets defined after the loop exits.  */
+            continue;
+          }
+#endif
+
+        /* Length of the variable name, and skip the '='.  */
+        len = ep++ - envp[i];
+
+        /* If this is MAKE_RESTARTS, check to see if the "already printed
+           the enter statement" flag is set.  */
+        if (len == 13 && strneq (envp[i], "MAKE_RESTARTS", 13))
+          {
+            if (*ep == '-')
+              {
+                OUTPUT_TRACED ();
+                ++ep;
+              }
+            restarts = (unsigned int) atoi (ep);
+            export = v_noexport;
+          }
+
+        v = define_variable (envp[i], len, ep, o_env, 1);
+
+        /* POSIX says the value of SHELL set in the makefile won't change the
+           value of SHELL given to subprocesses.  */
+        if (streq (v->name, "SHELL"))
+          {
+#ifndef __MSDOS__
+            export = v_noexport;
+#endif
+            shell_var.name = xstrdup ("SHELL");
+            shell_var.length = 5;
+            shell_var.value = xstrdup (ep);
+          }
+
+        v->export = export;
+      }
+  }
+#ifdef WINDOWS32
+    /* If we didn't find a correctly spelled PATH we define PATH as
+     * either the first misspelled value or an empty string
+     */
+    if (!unix_path)
+      define_variable_cname ("PATH", windows32_path ? windows32_path : "",
+                             o_env, 1)->export = v_export;
+#endif
+#else /* For Amiga, read the ENV: device, ignoring all dirs */
+    {
+        BPTR env, file, old;
+        char buffer[1024];
+        int len;
+        __aligned struct FileInfoBlock fib;
+
+        env = Lock ("ENV:", ACCESS_READ);
+        if (env)
+          {
+            old = CurrentDir (DupLock (env));
+            Examine (env, &fib);
+
+            while (ExNext (env, &fib))
+              {
+                if (fib.fib_DirEntryType < 0) /* File */
+                  {
+                    /* Define an empty variable. It will be filled in
+                       variable_lookup(). Makes startup quite a bit faster. */
+                    define_variable (fib.fib_FileName,
+                                     strlen (fib.fib_FileName),
+                                     "", o_env, 1)->export = v_export;
+                  }
+              }
+            UnLock (env);
+            UnLock (CurrentDir (old));
+          }
+    }
+#endif
+
+  /* Decode the switches.  */
+  decode_env_switches (STRING_SIZE_TUPLE ("GNUMAKEFLAGS"));
+
+  /* Clear GNUMAKEFLAGS to avoid duplication.  */
+  define_variable_cname ("GNUMAKEFLAGS", "", o_env, 0);
+
+  decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS"));
+
+#if 0
+  /* People write things like:
+        MFLAGS="CC=gcc -pipe" "CFLAGS=-g"
+     and we set the -p, -i and -e switches.  Doesn't seem quite right.  */
+  decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS"));
+#endif
+
+  /* In output sync mode we need to sync any output generated by reading the
+     makefiles, such as in $(info ...) or stderr from $(shell ...) etc.  */
+
+  syncing = make_sync.syncout = (output_sync == OUTPUT_SYNC_LINE
+                                 || output_sync == OUTPUT_SYNC_TARGET);
+  OUTPUT_SET (&make_sync);
+
+  /* Parse the command line options.  Remember the job slots set this way.  */
+  {
+    int env_slots = arg_job_slots;
+    arg_job_slots = INVALID_JOB_SLOTS;
+
+    decode_switches (argc, (const char **)argv, 0);
+    argv_slots = arg_job_slots;
+
+    if (arg_job_slots == INVALID_JOB_SLOTS)
+      arg_job_slots = env_slots;
+  }
+
+  /* Set a variable specifying whether stdout/stdin is hooked to a TTY.  */
+#ifdef HAVE_ISATTY
+  if (isatty (fileno (stdout)))
+    if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMOUT")))
+      {
+        const char *tty = TTYNAME (fileno (stdout));
+        define_variable_cname ("MAKE_TERMOUT", tty ? tty : DEFAULT_TTYNAME,
+                               o_default, 0)->export = v_export;
+      }
+  if (isatty (fileno (stderr)))
+    if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMERR")))
+      {
+        const char *tty = TTYNAME (fileno (stderr));
+        define_variable_cname ("MAKE_TERMERR", tty ? tty : DEFAULT_TTYNAME,
+                               o_default, 0)->export = v_export;
+      }
+#endif
+
+  /* Reset in case the switches changed our minds.  */
+  syncing = (output_sync == OUTPUT_SYNC_LINE
+             || output_sync == OUTPUT_SYNC_TARGET);
+
+  if (make_sync.syncout && ! syncing)
+    output_close (&make_sync);
+
+  make_sync.syncout = syncing;
+  OUTPUT_SET (&make_sync);
+
+  /* Figure out the level of recursion.  */
+  {
+    struct variable *v = lookup_variable (STRING_SIZE_TUPLE (MAKELEVEL_NAME));
+    if (v && v->value[0] != '\0' && v->value[0] != '-')
+      makelevel = (unsigned int) atoi (v->value);
+    else
+      makelevel = 0;
+  }
+
+  /* Set always_make_flag if -B was given and we've not restarted already.  */
+  always_make_flag = always_make_set && (restarts == 0);
+
+  /* Print version information, and exit.  */
+  if (print_version_flag)
+    {
+      print_version ();
+      die (MAKE_SUCCESS);
+    }
+
+  if (ISDB (DB_BASIC))
+    print_version ();
+
+#ifndef VMS
+  /* Set the "MAKE_COMMAND" variable to the name we were invoked with.
+     (If it is a relative pathname with a slash, prepend our directory name
+     so the result will run the same program regardless of the current dir.
+     If it is a name with no slash, we can only hope that PATH did not
+     find it in the current directory.)  */
+#ifdef WINDOWS32
+  /*
+   * Convert from backslashes to forward slashes for
+   * programs like sh which don't like them. Shouldn't
+   * matter if the path is one way or the other for
+   * CreateProcess().
+   */
+  if (strpbrk (argv[0], "/:\\") || strstr (argv[0], "..")
+      || strneq (argv[0], "//", 2))
+    argv[0] = xstrdup (w32ify (argv[0], 1));
+#else /* WINDOWS32 */
+#if defined (__MSDOS__) || defined (__EMX__)
+  if (strchr (argv[0], '\\'))
+    {
+      char *p;
+
+      argv[0] = xstrdup (argv[0]);
+      for (p = argv[0]; *p; p++)
+        if (*p == '\\')
+          *p = '/';
+    }
+  /* If argv[0] is not in absolute form, prepend the current
+     directory.  This can happen when Make is invoked by another DJGPP
+     program that uses a non-absolute name.  */
+  if (current_directory[0] != '\0'
+      && argv[0] != 0
+      && (argv[0][0] != '/' && (argv[0][0] == '\0' || argv[0][1] != ':'))
+# ifdef __EMX__
+      /* do not prepend cwd if argv[0] contains no '/', e.g. "make" */
+      && (strchr (argv[0], '/') != 0 || strchr (argv[0], '\\') != 0)
+# endif
+      )
+    argv[0] = xstrdup (concat (3, current_directory, "/", argv[0]));
+#else  /* !__MSDOS__ */
+  if (current_directory[0] != '\0'
+      && argv[0] != 0 && argv[0][0] != '/' && strchr (argv[0], '/') != 0
+#ifdef HAVE_DOS_PATHS
+      && (argv[0][0] != '\\' && (!argv[0][0] || argv[0][1] != ':'))
+      && strchr (argv[0], '\\') != 0
+#endif
+      )
+    argv[0] = xstrdup (concat (3, current_directory, "/", argv[0]));
+#endif /* !__MSDOS__ */
+#endif /* WINDOWS32 */
+#endif
+
+  /* We may move, but until we do, here we are.  */
+  starting_directory = current_directory;
+
+  /* Validate the arg_job_slots configuration before we define MAKEFLAGS so
+     users get an accurate value in their makefiles.
+     At this point arg_job_slots is the argv setting, if there is one, else
+     the MAKEFLAGS env setting, if there is one.  */
+
+  if (jobserver_auth)
+    {
+      /* We're a child in an existing jobserver group.  */
+      if (argv_slots == INVALID_JOB_SLOTS)
+        {
+          /* There's no -j option on the command line: check authorization.  */
+          if (jobserver_parse_auth (jobserver_auth))
+            {
+              /* Success!  Use the jobserver.  */
+              goto job_setup_complete;
+            }
+
+          /* Oops: we have jobserver-auth but it's invalid :(.  */
+          O (error, NILF, _("warning: jobserver unavailable: using -j1.  Add '+' to parent make rule."));
+          arg_job_slots = 1;
+        }
+
+      /* The user provided a -j setting on the command line so use it: we're
+         the master make of a new jobserver group.  */
+      else if (!restarts)
+        ON (error, NILF,
+            _("warning: -j%d forced in submake: resetting jobserver mode."),
+            argv_slots);
+
+      /* We can't use our parent's jobserver, so reset.  */
+      reset_jobserver ();
+    }
+
+ job_setup_complete:
+
+  /* The extra indirection through $(MAKE_COMMAND) is done
+     for hysterical raisins.  */
+
+#ifdef VMS
+  if (vms_use_mcr_command)
+    define_variable_cname ("MAKE_COMMAND", vms_command (argv[0]), o_default, 0);
+  else
+    define_variable_cname ("MAKE_COMMAND", program, o_default, 0);
+#else
+  define_variable_cname ("MAKE_COMMAND", argv[0], o_default, 0);
+#endif
+  define_variable_cname ("MAKE", "$(MAKE_COMMAND)", o_default, 1);
+
+  if (command_variables != 0)
+    {
+      struct command_variable *cv;
+      struct variable *v;
+      size_t len = 0;
+      char *value, *p;
+
+      /* Figure out how much space will be taken up by the command-line
+         variable definitions.  */
+      for (cv = command_variables; cv != 0; cv = cv->next)
+        {
+          v = cv->variable;
+          len += 2 * strlen (v->name);
+          if (! v->recursive)
+            ++len;
+          ++len;
+          len += 2 * strlen (v->value);
+          ++len;
+        }
+
+      /* Now allocate a buffer big enough and fill it.  */
+      p = value = alloca (len);
+      for (cv = command_variables; cv != 0; cv = cv->next)
+        {
+          v = cv->variable;
+          p = quote_for_env (p, v->name);
+          if (! v->recursive)
+            *p++ = ':';
+          *p++ = '=';
+          p = quote_for_env (p, v->value);
+          *p++ = ' ';
+        }
+      p[-1] = '\0';             /* Kill the final space and terminate.  */
+
+      /* Define an unchangeable variable with a name that no POSIX.2
+         makefile could validly use for its own variable.  */
+      define_variable_cname ("-*-command-variables-*-", value, o_automatic, 0);
+
+      /* Define the variable; this will not override any user definition.
+         Normally a reference to this variable is written into the value of
+         MAKEFLAGS, allowing the user to override this value to affect the
+         exported value of MAKEFLAGS.  In POSIX-pedantic mode, we cannot
+         allow the user's setting of MAKEOVERRIDES to affect MAKEFLAGS, so
+         a reference to this hidden variable is written instead. */
+      define_variable_cname ("MAKEOVERRIDES", "${-*-command-variables-*-}",
+                             o_env, 1);
+#ifdef VMS
+      vms_export_dcl_symbol ("MAKEOVERRIDES", "${-*-command-variables-*-}");
+#endif
+    }
+
+  /* If there were -C flags, move ourselves about.  */
+  if (directories != 0)
+    {
+      unsigned int i;
+      for (i = 0; directories->list[i] != 0; ++i)
+        {
+          const char *dir = directories->list[i];
+#ifdef WINDOWS32
+          /* WINDOWS32 chdir() doesn't work if the directory has a trailing '/'
+             But allow -C/ just in case someone wants that.  */
+          {
+            char *p = (char *)dir + strlen (dir) - 1;
+            while (p > dir && (p[0] == '/' || p[0] == '\\'))
+              --p;
+            p[1] = '\0';
+          }
+#endif
+          if (chdir (dir) < 0)
+            pfatal_with_name (dir);
+        }
+    }
+
+#ifdef WINDOWS32
+  /*
+   * THIS BLOCK OF CODE MUST COME AFTER chdir() CALL ABOVE IN ORDER
+   * TO NOT CONFUSE THE DEPENDENCY CHECKING CODE IN implicit.c.
+   *
+   * The functions in dir.c can incorrectly cache information for "."
+   * before we have changed directory and this can cause file
+   * lookups to fail because the current directory (.) was pointing
+   * at the wrong place when it was first evaluated.
+   */
+   no_default_sh_exe = !find_and_set_default_shell (NULL);
+#endif /* WINDOWS32 */
+
+  /* Except under -s, always do -w in sub-makes and under -C.  */
+  if (!silent_flag && (directories != 0 || makelevel > 0))
+    print_directory_flag = 1;
+
+  /* Let the user disable that with --no-print-directory.  */
+  if (inhibit_print_directory_flag)
+    print_directory_flag = 0;
+
+  /* If -R was given, set -r too (doesn't make sense otherwise!)  */
+  if (no_builtin_variables_flag)
+    no_builtin_rules_flag = 1;
+
+  /* Construct the list of include directories to search.  */
+
+  construct_include_path (include_directories == 0
+                          ? 0 : include_directories->list);
+
+  /* If we chdir'ed, figure out where we are now.  */
+  if (directories)
+    {
+#ifdef WINDOWS32
+      if (getcwd_fs (current_directory, GET_PATH_MAX) == 0)
+#else
+      if (getcwd (current_directory, GET_PATH_MAX) == 0)
+#endif
+        {
+#ifdef  HAVE_GETCWD
+          perror_with_name ("getcwd", "");
+#else
+          OS (error, NILF, "getwd: %s", current_directory);
+#endif
+          starting_directory = 0;
+        }
+      else
+        starting_directory = current_directory;
+    }
+
+  define_variable_cname ("CURDIR", current_directory, o_file, 0);
+
+  /* Read any stdin makefiles into temporary files.  */
+
+  if (makefiles != 0)
+    {
+      unsigned int i;
+      for (i = 0; i < makefiles->idx; ++i)
+        if (makefiles->list[i][0] == '-' && makefiles->list[i][1] == '\0')
+          {
+            /* This makefile is standard input.  Since we may re-exec
+               and thus re-read the makefiles, we read standard input
+               into a temporary file and read from that.  */
+            FILE *outfile;
+            char *template;
+            const char *tmpdir;
+
+            if (stdin_nm)
+              O (fatal, NILF,
+                 _("Makefile from standard input specified twice."));
+
+#ifdef VMS
+# define DEFAULT_TMPDIR     "/sys$scratch/"
+#else
+# ifdef P_tmpdir
+#  define DEFAULT_TMPDIR    P_tmpdir
+# else
+#  define DEFAULT_TMPDIR    "/tmp"
+# endif
+#endif
+#define DEFAULT_TMPFILE     "GmXXXXXX"
+
+            if (((tmpdir = getenv ("TMPDIR")) == NULL || *tmpdir == '\0')
+#if defined (__MSDOS__) || defined (WINDOWS32) || defined (__EMX__)
+                /* These are also used commonly on these platforms.  */
+                && ((tmpdir = getenv ("TEMP")) == NULL || *tmpdir == '\0')
+                && ((tmpdir = getenv ("TMP")) == NULL || *tmpdir == '\0')
+#endif
+               )
+              tmpdir = DEFAULT_TMPDIR;
+
+            template = alloca (strlen (tmpdir) + CSTRLEN (DEFAULT_TMPFILE) + 2);
+            strcpy (template, tmpdir);
+
+#ifdef HAVE_DOS_PATHS
+            if (strchr ("/\\", template[strlen (template) - 1]) == NULL)
+              strcat (template, "/");
+#else
+# ifndef VMS
+            if (template[strlen (template) - 1] != '/')
+              strcat (template, "/");
+# endif /* !VMS */
+#endif /* !HAVE_DOS_PATHS */
+
+            strcat (template, DEFAULT_TMPFILE);
+            outfile = get_tmpfile (&stdin_nm, template);
+            if (outfile == 0)
+              pfatal_with_name (_("fopen (temporary file)"));
+            while (!feof (stdin) && ! ferror (stdin))
+              {
+                char buf[2048];
+                size_t n = fread (buf, 1, sizeof (buf), stdin);
+                if (n > 0 && fwrite (buf, 1, n, outfile) != n)
+                  pfatal_with_name (_("fwrite (temporary file)"));
+              }
+            fclose (outfile);
+
+            /* Replace the name that read_all_makefiles will
+               see with the name of the temporary file.  */
+            makefiles->list[i] = strcache_add (stdin_nm);
+
+            /* Make sure the temporary file will not be remade.  */
+            {
+              struct file *f = enter_file (strcache_add (stdin_nm));
+              f->updated = 1;
+              f->update_status = us_success;
+              f->command_state = cs_finished;
+              /* Can't be intermediate, or it'll be removed too early for
+                 make re-exec.  */
+              f->intermediate = 0;
+              f->dontcare = 0;
+            }
+          }
+    }
+
+#ifndef __EMX__ /* Don't use a SIGCHLD handler for OS/2 */
+#if !defined(HAVE_WAIT_NOHANG) || defined(MAKE_JOBSERVER)
+  /* Set up to handle children dying.  This must be done before
+     reading in the makefiles so that 'shell' function calls will work.
+
+     If we don't have a hanging wait we have to fall back to old, broken
+     functionality here and rely on the signal handler and counting
+     children.
+
+     If we're using the jobs pipe we need a signal handler so that SIGCHLD is
+     not ignored; we need it to interrupt the read(2) of the jobserver pipe if
+     we're waiting for a token.
+
+     If none of these are true, we don't need a signal handler at all.  */
+  {
+# if defined SIGCHLD
+    bsd_signal (SIGCHLD, child_handler);
+# endif
+# if defined SIGCLD && SIGCLD != SIGCHLD
+    bsd_signal (SIGCLD, child_handler);
+# endif
+  }
+
+#ifdef HAVE_PSELECT
+  /* If we have pselect() then we need to block SIGCHLD so it's deferred.  */
+  {
+    sigset_t block;
+    sigemptyset (&block);
+    sigaddset (&block, SIGCHLD);
+    if (sigprocmask (SIG_SETMASK, &block, NULL) < 0)
+      pfatal_with_name ("sigprocmask(SIG_SETMASK, SIGCHLD)");
+  }
+#endif
+
+#endif
+#endif
+
+  /* Let the user send us SIGUSR1 to toggle the -d flag during the run.  */
+#ifdef SIGUSR1
+  bsd_signal (SIGUSR1, debug_signal_handler);
+#endif
+
+  /* Define the initial list of suffixes for old-style rules.  */
+  set_default_suffixes ();
+
+  /* Define the file rules for the built-in suffix rules.  These will later
+     be converted into pattern rules.  We used to do this in
+     install_default_implicit_rules, but since that happens after reading
+     makefiles, it results in the built-in pattern rules taking precedence
+     over makefile-specified suffix rules, which is wrong.  */
+  install_default_suffix_rules ();
+
+  /* Define some internal and special variables.  */
+  define_automatic_variables ();
+
+  /* Set up the MAKEFLAGS and MFLAGS variables for makefiles to see.
+     Initialize it to be exported but allow the makefile to reset it.  */
+  define_makeflags (0, 0)->export = v_export;
+
+  /* Define the default variables.  */
+  define_default_variables ();
+
+  default_file = enter_file (strcache_add (".DEFAULT"));
+
+  default_goal_var = define_variable_cname (".DEFAULT_GOAL", "", o_file, 0);
+
+  /* Evaluate all strings provided with --eval.
+     Also set up the $(-*-eval-flags-*-) variable.  */
+
+  if (eval_strings)
+    {
+      char *p, *value;
+      unsigned int i;
+      size_t len = (CSTRLEN ("--eval=") + 1) * eval_strings->idx;
+
+      for (i = 0; i < eval_strings->idx; ++i)
+        {
+          p = xstrdup (eval_strings->list[i]);
+          len += 2 * strlen (p);
+          eval_buffer (p, NULL);
+          free (p);
+        }
+
+      p = value = alloca (len);
+      for (i = 0; i < eval_strings->idx; ++i)
+        {
+          strcpy (p, "--eval=");
+          p += CSTRLEN ("--eval=");
+          p = quote_for_env (p, eval_strings->list[i]);
+          *(p++) = ' ';
+        }
+      p[-1] = '\0';
+
+      define_variable_cname ("-*-eval-flags-*-", value, o_automatic, 0);
+    }
+
+  /* Read all the makefiles.  */
+
+  read_files = read_all_makefiles (makefiles == 0 ? 0 : makefiles->list);
+
+#ifdef WINDOWS32
+  /* look one last time after reading all Makefiles */
+  if (no_default_sh_exe)
+    no_default_sh_exe = !find_and_set_default_shell (NULL);
+#endif /* WINDOWS32 */
+
+#if defined (__MSDOS__) || defined (__EMX__) || defined (VMS)
+  /* We need to know what kind of shell we will be using.  */
+  {
+    extern int _is_unixy_shell (const char *_path);
+    struct variable *shv = lookup_variable (STRING_SIZE_TUPLE ("SHELL"));
+    extern int unixy_shell;
+    extern const char *default_shell;
+
+    if (shv && *shv->value)
+      {
+        char *shell_path = recursively_expand (shv);
+
+        if (shell_path && _is_unixy_shell (shell_path))
+          unixy_shell = 1;
+        else
+          unixy_shell = 0;
+        if (shell_path)
+          default_shell = shell_path;
+      }
+  }
+#endif /* __MSDOS__ || __EMX__ */
+
+  {
+    int old_builtin_rules_flag = no_builtin_rules_flag;
+    int old_builtin_variables_flag = no_builtin_variables_flag;
+    int old_arg_job_slots = arg_job_slots;
+
+    arg_job_slots = INVALID_JOB_SLOTS;
+
+    /* Decode switches again, for variables set by the makefile.  */
+    decode_env_switches (STRING_SIZE_TUPLE ("GNUMAKEFLAGS"));
+
+    /* Clear GNUMAKEFLAGS to avoid duplication.  */
+    define_variable_cname ("GNUMAKEFLAGS", "", o_override, 0);
+
+    decode_env_switches (STRING_SIZE_TUPLE ("MAKEFLAGS"));
+#if 0
+    decode_env_switches (STRING_SIZE_TUPLE ("MFLAGS"));
+#endif
+
+    /* If -j is not set in the makefile, or it was set on the command line,
+       reset to use the previous value.  */
+    if (arg_job_slots == INVALID_JOB_SLOTS || argv_slots != INVALID_JOB_SLOTS)
+      arg_job_slots = old_arg_job_slots;
+
+    else if (jobserver_auth)
+      {
+        /* Makefile MAKEFLAGS set -j, but we already have a jobserver.
+           Make us the master of a new jobserver group.  */
+        if (!restarts)
+          ON (error, NILF,
+              _("warning: -j%d forced in makefile: resetting jobserver mode."),
+              arg_job_slots);
+
+        /* We can't use our parent's jobserver, so reset.  */
+        reset_jobserver ();
+      }
+
+    /* Reset in case the switches changed our mind.  */
+    syncing = (output_sync == OUTPUT_SYNC_LINE
+               || output_sync == OUTPUT_SYNC_TARGET);
+
+    if (make_sync.syncout && ! syncing)
+      output_close (&make_sync);
+
+    make_sync.syncout = syncing;
+    OUTPUT_SET (&make_sync);
+
+    /* If we've disabled builtin rules, get rid of them.  */
+    if (no_builtin_rules_flag && ! old_builtin_rules_flag)
+      {
+        if (suffix_file->builtin)
+          {
+            free_dep_chain (suffix_file->deps);
+            suffix_file->deps = 0;
+          }
+        define_variable_cname ("SUFFIXES", "", o_default, 0);
+      }
+
+    /* If we've disabled builtin variables, get rid of them.  */
+    if (no_builtin_variables_flag && ! old_builtin_variables_flag)
+      undefine_default_variables ();
+  }
+
+  /* Final jobserver configuration.
+
+     If we have jobserver_auth then we are a client in an existing jobserver
+     group, that's already been verified OK above.  If we don't have
+     jobserver_auth and jobserver is enabled, then start a new jobserver.
+
+     arg_job_slots = INVALID_JOB_SLOTS if we don't want -j in MAKEFLAGS
+
+     arg_job_slots = # of jobs of parallelism
+
+     job_slots = 0 for no limits on jobs, or when limiting via jobserver.
+
+     job_slots = 1 for standard non-parallel mode.
+
+     job_slots >1 for old-style parallelism without jobservers.  */
+
+  if (jobserver_auth)
+    job_slots = 0;
+  else if (arg_job_slots == INVALID_JOB_SLOTS)
+    job_slots = 1;
+  else
+    job_slots = arg_job_slots;
+
+#if defined (__MSDOS__) || defined (__EMX__) || defined (VMS)
+  if (job_slots != 1
+# ifdef __EMX__
+      && _osmode != OS2_MODE /* turn off -j if we are in DOS mode */
+# endif
+      )
+    {
+      O (error, NILF,
+         _("Parallel jobs (-j) are not supported on this platform."));
+      O (error, NILF, _("Resetting to single job (-j1) mode."));
+      arg_job_slots = INVALID_JOB_SLOTS;
+      job_slots = 1;
+    }
+#endif
+
+  /* If we have >1 slot at this point, then we're a top-level make.
+     Set up the jobserver.
+
+     Every make assumes that it always has one job it can run.  For the
+     submakes it's the token they were given by their parent.  For the top
+     make, we just subtract one from the number the user wants.  */
+
+  if (job_slots > 1 && jobserver_setup (job_slots - 1))
+    {
+      /* Fill in the jobserver_auth for our children.  */
+      jobserver_auth = jobserver_get_auth ();
+
+      if (jobserver_auth)
+        {
+          /* We're using the jobserver so set job_slots to 0.  */
+          master_job_slots = job_slots;
+          job_slots = 0;
+        }
+    }
+
+  /* If we're not using parallel jobs, then we don't need output sync.
+     This is so people can enable output sync in GNUMAKEFLAGS or similar, but
+     not have it take effect unless parallel builds are enabled.  */
+  if (syncing && job_slots == 1)
+    {
+      OUTPUT_UNSET ();
+      output_close (&make_sync);
+      syncing = 0;
+      output_sync = OUTPUT_SYNC_NONE;
+    }
+
+#ifndef MAKE_SYMLINKS
+  if (check_symlink_flag)
+    {
+      O (error, NILF, _("Symbolic links not supported: disabling -L."));
+      check_symlink_flag = 0;
+    }
+#endif
+
+  /* Set up MAKEFLAGS and MFLAGS again, so they will be right.  */
+
+  define_makeflags (1, 0);
+
+  /* Make each 'struct goaldep' point at the 'struct file' for the file
+     depended on.  Also do magic for special targets.  */
+
+  snap_deps ();
+
+  /* Convert old-style suffix rules to pattern rules.  It is important to
+     do this before installing the built-in pattern rules below, so that
+     makefile-specified suffix rules take precedence over built-in pattern
+     rules.  */
+
+  convert_to_pattern ();
+
+  /* Install the default implicit pattern rules.
+     This used to be done before reading the makefiles.
+     But in that case, built-in pattern rules were in the chain
+     before user-defined ones, so they matched first.  */
+
+  install_default_implicit_rules ();
+
+  /* Compute implicit rule limits and do magic for pattern rules.  */
+
+  snap_implicit_rules ();
+
+  /* Construct the listings of directories in VPATH lists.  */
+
+  build_vpath_lists ();
+
+  /* Mark files given with -o flags as very old and as having been updated
+     already, and files given with -W flags as brand new (time-stamp as far
+     as possible into the future).  If restarts is set we'll do -W later.  */
+
+  if (old_files != 0)
+    {
+      const char **p;
+      for (p = old_files->list; *p != 0; ++p)
+        {
+          struct file *f = enter_file (*p);
+          f->last_mtime = f->mtime_before_update = OLD_MTIME;
+          f->updated = 1;
+          f->update_status = us_success;
+          f->command_state = cs_finished;
+        }
+    }
+
+  if (!restarts && new_files != 0)
+    {
+      const char **p;
+      for (p = new_files->list; *p != 0; ++p)
+        {
+          struct file *f = enter_file (*p);
+          f->last_mtime = f->mtime_before_update = NEW_MTIME;
+        }
+    }
+
+  /* Initialize the remote job module.  */
+  remote_setup ();
+
+  /* Dump any output we've collected.  */
+
+  OUTPUT_UNSET ();
+  output_close (&make_sync);
+
+  if (read_files)
+    {
+      /* Update any makefiles if necessary.  */
+
+      FILE_TIMESTAMP *makefile_mtimes;
+      char **aargv = NULL;
+      const char **nargv;
+      int nargc;
+      enum update_status status;
+
+      DB (DB_BASIC, (_("Updating makefiles....\n")));
+
+      {
+        struct goaldep *d;
+        unsigned int num_mkfiles = 0;
+        for (d = read_files; d != NULL; d = d->next)
+          ++num_mkfiles;
+
+        makefile_mtimes = alloca (num_mkfiles * sizeof (FILE_TIMESTAMP));
+      }
+
+      /* Remove any makefiles we don't want to try to update.  Record the
+         current modtimes of the others so we can compare them later.  */
+      {
+        struct goaldep *d = read_files;
+        struct goaldep *last = NULL;
+        unsigned int mm_idx = 0;
+
+        while (d != 0)
+          {
+            struct file *f;
+
+            for (f = d->file->double_colon; f != NULL; f = f->prev)
+              if (f->deps == 0 && f->cmds != 0)
+                break;
+
+            if (f)
+              {
+                /* This makefile is a :: target with commands, but no
+                   dependencies.  So, it will always be remade.  This might
+                   well cause an infinite loop, so don't try to remake it.
+                   (This will only happen if your makefiles are written
+                   exceptionally stupidly; but if you work for Athena, that's
+                   how you write your makefiles.)  */
+
+                DB (DB_VERBOSE,
+                    (_("Makefile '%s' might loop; not remaking it.\n"),
+                     f->name));
+
+                if (last)
+                  last->next = d->next;
+                else
+                  read_files = d->next;
+
+                /* Free the storage.  */
+                free_goaldep (d);
+
+                d = last ? last->next : read_files;
+              }
+            else
+              {
+                makefile_mtimes[mm_idx++] = file_mtime_no_search (d->file);
+                last = d;
+                d = d->next;
+              }
+          }
+      }
+
+      /* Set up 'MAKEFLAGS' specially while remaking makefiles.  */
+      define_makeflags (1, 1);
+
+      {
+        int orig_db_level = db_level;
+
+        if (! ISDB (DB_MAKEFILES))
+          db_level = DB_NONE;
+
+        rebuilding_makefiles = 1;
+        status = update_goal_chain (read_files);
+        rebuilding_makefiles = 0;
+
+        db_level = orig_db_level;
+      }
+
+      switch (status)
+        {
+        case us_question:
+          /* The only way this can happen is if the user specified -q and asked
+             for one of the makefiles to be remade as a target on the command
+             line.  Since we're not actually updating anything with -q we can
+             treat this as "did nothing".  */
+
+        case us_none:
+          /* Did nothing.  */
+          break;
+
+        case us_failed:
+          /* Failed to update.  Figure out if we care.  */
+          {
+            /* Nonzero if any makefile was successfully remade.  */
+            int any_remade = 0;
+            /* Nonzero if any makefile we care about failed
+               in updating or could not be found at all.  */
+            int any_failed = 0;
+            unsigned int i;
+            struct goaldep *d;
+
+            for (i = 0, d = read_files; d != 0; ++i, d = d->next)
+              {
+                if (d->file->updated)
+                  {
+                    /* This makefile was updated.  */
+                    if (d->file->update_status == us_success)
+                      {
+                        /* It was successfully updated.  */
+                        any_remade |= (file_mtime_no_search (d->file)
+                                       != makefile_mtimes[i]);
+                      }
+                    else if (! (d->flags & RM_DONTCARE))
+                      {
+                        FILE_TIMESTAMP mtime;
+                        /* The update failed and this makefile was not
+                           from the MAKEFILES variable, so we care.  */
+                        OS (error, NILF, _("Failed to remake makefile '%s'."),
+                            d->file->name);
+                        mtime = file_mtime_no_search (d->file);
+                        any_remade |= (mtime != NONEXISTENT_MTIME
+                                       && mtime != makefile_mtimes[i]);
+                        makefile_status = MAKE_FAILURE;
+                      }
+                  }
+                else
+                  /* This makefile was not found at all.  */
+                  if (! (d->flags & RM_DONTCARE))
+                    {
+                      const char *dnm = dep_name (d);
+                      size_t l = strlen (dnm);
+
+                      /* This is a makefile we care about.  See how much.  */
+                      if (d->flags & RM_INCLUDED)
+                        /* An included makefile.  We don't need to die, but we
+                           do want to complain.  */
+                        error (NILF, l,
+                               _("Included makefile '%s' was not found."), dnm);
+                      else
+                        {
+                          /* A normal makefile.  We must die later.  */
+                          error (NILF, l,
+                                 _("Makefile '%s' was not found"), dnm);
+                          any_failed = 1;
+                        }
+                    }
+              }
+
+            if (any_remade)
+              goto re_exec;
+            if (any_failed)
+              die (MAKE_FAILURE);
+            break;
+          }
+
+        case us_success:
+        re_exec:
+          /* Updated successfully.  Re-exec ourselves.  */
+
+          remove_intermediates (0);
+
+          if (print_data_base_flag)
+            print_data_base ();
+
+          clean_jobserver (0);
+
+          if (makefiles != 0)
+            {
+              /* These names might have changed.  */
+              int i, j = 0;
+              for (i = 1; i < argc; ++i)
+                if (strneq (argv[i], "-f", 2)) /* XXX */
+                  {
+                    if (argv[i][2] == '\0')
+                      /* This cast is OK since we never modify argv.  */
+                      argv[++i] = (char *) makefiles->list[j];
+                    else
+                      argv[i] = xstrdup (concat (2, "-f", makefiles->list[j]));
+                    ++j;
+                  }
+            }
+
+          /* Add -o option for the stdin temporary file, if necessary.  */
+          nargc = argc;
+          if (stdin_nm)
+            {
+              void *m = xmalloc ((nargc + 2) * sizeof (char *));
+              aargv = m;
+              memcpy (aargv, argv, argc * sizeof (char *));
+              aargv[nargc++] = xstrdup (concat (2, "-o", stdin_nm));
+              aargv[nargc] = 0;
+              nargv = m;
+            }
+          else
+            nargv = (const char**)argv;
+
+          if (directories != 0 && directories->idx > 0)
+            {
+              int bad = 1;
+              if (directory_before_chdir != 0)
+                {
+                  if (chdir (directory_before_chdir) < 0)
+                      perror_with_name ("chdir", "");
+                  else
+                    bad = 0;
+                }
+              if (bad)
+                O (fatal, NILF,
+                   _("Couldn't change back to original directory."));
+            }
+
+          ++restarts;
+
+          if (ISDB (DB_BASIC))
+            {
+              const char **p;
+              printf (_("Re-executing[%u]:"), restarts);
+              for (p = nargv; *p != 0; ++p)
+                printf (" %s", *p);
+              putchar ('\n');
+              fflush (stdout);
+            }
+
+#ifndef _AMIGA
+          {
+            char **p;
+            for (p = environ; *p != 0; ++p)
+              {
+                if (strneq (*p, MAKELEVEL_NAME "=", MAKELEVEL_LENGTH+1))
+                  {
+                    *p = alloca (40);
+                    sprintf (*p, "%s=%u", MAKELEVEL_NAME, makelevel);
+#ifdef VMS
+                    vms_putenv_symbol (*p);
+#endif
+                  }
+                else if (strneq (*p, "MAKE_RESTARTS=", CSTRLEN ("MAKE_RESTARTS=")))
+                  {
+                    *p = alloca (40);
+                    sprintf (*p, "MAKE_RESTARTS=%s%u",
+                             OUTPUT_IS_TRACED () ? "-" : "", restarts);
+                    restarts = 0;
+                  }
+              }
+          }
+#else /* AMIGA */
+          {
+            char buffer[256];
+
+            sprintf (buffer, "%u", makelevel);
+            SetVar (MAKELEVEL_NAME, buffer, -1, GVF_GLOBAL_ONLY);
+
+            sprintf (buffer, "%s%u", OUTPUT_IS_TRACED () ? "-" : "", restarts);
+            SetVar ("MAKE_RESTARTS", buffer, -1, GVF_GLOBAL_ONLY);
+            restarts = 0;
+          }
+#endif
+
+          /* If we didn't set the restarts variable yet, add it.  */
+          if (restarts)
+            {
+              char *b = alloca (40);
+              sprintf (b, "MAKE_RESTARTS=%s%u",
+                       OUTPUT_IS_TRACED () ? "-" : "", restarts);
+              putenv (b);
+            }
+
+          fflush (stdout);
+          fflush (stderr);
+
+          /* The exec'd "child" will be another make, of course.  */
+          jobserver_pre_child(1);
+
+#ifdef _AMIGA
+          exec_command (nargv);
+          exit (0);
+#elif defined (__EMX__)
+          {
+            /* It is not possible to use execve() here because this
+               would cause the parent process to be terminated with
+               exit code 0 before the child process has been terminated.
+               Therefore it may be the best solution simply to spawn the
+               child process including all file handles and to wait for its
+               termination. */
+            pid_t pid;
+            int r;
+            struct childbase child;
+            child.cmd_name = NULL;
+            child.output.syncout = 0;
+            child.environment = environ;
+
+            pid = child_execute_job (&child, 1, nargv);
+
+            /* is this loop really necessary? */
+            do {
+              pid = wait (&r);
+            } while (pid <= 0);
+            /* use the exit code of the child process */
+            exit (WIFEXITED(r) ? WEXITSTATUS(r) : EXIT_FAILURE);
+          }
+#else
+#ifdef SET_STACK_SIZE
+          /* Reset limits, if necessary.  */
+          if (stack_limit.rlim_cur)
+            setrlimit (RLIMIT_STACK, &stack_limit);
+#endif
+          exec_command ((char **)nargv, environ);
+#endif
+
+          /* We shouldn't get here but just in case.  */
+          jobserver_post_child(1);
+          free (aargv);
+          break;
+        }
+    }
+
+  /* Set up 'MAKEFLAGS' again for the normal targets.  */
+  define_makeflags (1, 0);
+
+  /* Set always_make_flag if -B was given.  */
+  always_make_flag = always_make_set;
+
+  /* If restarts is set we haven't set up -W files yet, so do that now.  */
+  if (restarts && new_files != 0)
+    {
+      const char **p;
+      for (p = new_files->list; *p != 0; ++p)
+        {
+          struct file *f = enter_file (*p);
+          f->last_mtime = f->mtime_before_update = NEW_MTIME;
+        }
+    }
+
+  /* If there is a temp file from reading a makefile from stdin, get rid of
+     it now.  */
+  if (stdin_nm && unlink (stdin_nm) < 0 && errno != ENOENT)
+    perror_with_name (_("unlink (temporary file): "), stdin_nm);
+
+  /* If there were no command-line goals, use the default.  */
+  if (goals == 0)
+    {
+      char *p;
+
+      if (default_goal_var->recursive)
+        p = variable_expand (default_goal_var->value);
+      else
+        {
+          p = variable_buffer_output (variable_buffer, default_goal_var->value,
+                                      strlen (default_goal_var->value));
+          *p = '\0';
+          p = variable_buffer;
+        }
+
+      if (*p != '\0')
+        {
+          struct file *f = lookup_file (p);
+
+          /* If .DEFAULT_GOAL is a non-existent target, enter it into the
+             table and let the standard logic sort it out. */
+          if (f == 0)
+            {
+              struct nameseq *ns;
+
+              ns = PARSE_SIMPLE_SEQ (&p, struct nameseq);
+              if (ns)
+                {
+                  /* .DEFAULT_GOAL should contain one target. */
+                  if (ns->next != 0)
+                    O (fatal, NILF,
+                       _(".DEFAULT_GOAL contains more than one target"));
+
+                  f = enter_file (strcache_add (ns->name));
+
+                  ns->name = 0; /* It was reused by enter_file(). */
+                  free_ns_chain (ns);
+                }
+            }
+
+          if (f)
+            {
+              goals = alloc_goaldep ();
+              goals->file = f;
+            }
+        }
+    }
+  else
+    lastgoal->next = 0;
+
+
+  if (!goals)
+    {
+      struct variable *v = lookup_variable (STRING_SIZE_TUPLE ("MAKEFILE_LIST"));
+      if (v && v->value && v->value[0] != '\0')
+        O (fatal, NILF, _("No targets"));
+
+      O (fatal, NILF, _("No targets specified and no makefile found"));
+    }
+
+  /* Update the goals.  */
+
+  DB (DB_BASIC, (_("Updating goal targets....\n")));
+
+  {
+    switch (update_goal_chain (goals))
+    {
+      case us_none:
+        /* Nothing happened.  */
+        /* FALLTHROUGH */
+      case us_success:
+        /* Keep the previous result.  */
+        break;
+      case us_question:
+        /* We are under -q and would run some commands.  */
+        makefile_status = MAKE_TROUBLE;
+        break;
+      case us_failed:
+        /* Updating failed.  POSIX.2 specifies exit status >1 for this; */
+        makefile_status = MAKE_FAILURE;
+        break;
+    }
+
+    /* If we detected some clock skew, generate one last warning */
+    if (clock_skew_detected)
+      O (error, NILF,
+         _("warning:  Clock skew detected.  Your build may be incomplete."));
+
+    /* Exit.  */
+    die (makefile_status);
+  }
+
+  /* NOTREACHED */
+  exit (MAKE_SUCCESS);
+}
+\f
+/* Parsing of arguments, decoding of switches.  */
+
+static char options[1 + sizeof (switches) / sizeof (switches[0]) * 3];
+static struct option long_options[(sizeof (switches) / sizeof (switches[0])) +
+                                  (sizeof (long_option_aliases) /
+                                   sizeof (long_option_aliases[0]))];
+
+/* Fill in the string and vector for getopt.  */
+static void
+init_switches (void)
+{
+  char *p;
+  unsigned int c;
+  unsigned int i;
+
+  if (options[0] != '\0')
+    /* Already done.  */
+    return;
+
+  p = options;
+
+  /* Return switch and non-switch args in order, regardless of
+     POSIXLY_CORRECT.  Non-switch args are returned as option 1.  */
+  *p++ = '-';
+
+  for (i = 0; switches[i].c != '\0'; ++i)
+    {
+      long_options[i].name = (char *) (switches[i].long_name == 0 ? "" :
+                                       switches[i].long_name);
+      long_options[i].flag = 0;
+      long_options[i].val = switches[i].c;
+      if (short_option (switches[i].c))
+        *p++ = (char) switches[i].c;
+      switch (switches[i].type)
+        {
+        case flag:
+        case flag_off:
+        case ignore:
+          long_options[i].has_arg = no_argument;
+          break;
+
+        case string:
+        case strlist:
+        case filename:
+        case positive_int:
+        case floating:
+          if (short_option (switches[i].c))
+            *p++ = ':';
+          if (switches[i].noarg_value != 0)
+            {
+              if (short_option (switches[i].c))
+                *p++ = ':';
+              long_options[i].has_arg = optional_argument;
+            }
+          else
+            long_options[i].has_arg = required_argument;
+          break;
+        }
+    }
+  *p = '\0';
+  for (c = 0; c < (sizeof (long_option_aliases) /
+                   sizeof (long_option_aliases[0]));
+       ++c)
+    long_options[i++] = long_option_aliases[c];
+  long_options[i].name = 0;
+}
+
+
+/* Non-option argument.  It might be a variable definition.  */
+static void
+handle_non_switch_argument (const char *arg, int env)
+{
+  struct variable *v;
+
+  if (arg[0] == '-' && arg[1] == '\0')
+    /* Ignore plain '-' for compatibility.  */
+    return;
+
+#ifdef VMS
+  {
+    /* VMS DCL quoting can result in foo="bar baz" showing up here.
+       Need to remove the double quotes from the value. */
+    char * eq_ptr;
+    char * new_arg;
+    eq_ptr = strchr (arg, '=');
+    if ((eq_ptr != NULL) && (eq_ptr[1] == '"'))
+      {
+         int len;
+         int seg1;
+         int seg2;
+         len = strlen(arg);
+         new_arg = alloca(len);
+         seg1 = eq_ptr - arg + 1;
+         strncpy(new_arg, arg, (seg1));
+         seg2 = len - seg1 - 1;
+         strncpy(&new_arg[seg1], &eq_ptr[2], seg2);
+         new_arg[seg1 + seg2] = 0;
+         if (new_arg[seg1 + seg2 - 1] == '"')
+           new_arg[seg1 + seg2 - 1] = 0;
+         arg = new_arg;
+      }
+  }
+#endif
+  v = try_variable_definition (0, arg, o_command, 0);
+  if (v != 0)
+    {
+      /* It is indeed a variable definition.  If we don't already have this
+         one, record a pointer to the variable for later use in
+         define_makeflags.  */
+      struct command_variable *cv;
+
+      for (cv = command_variables; cv != 0; cv = cv->next)
+        if (cv->variable == v)
+          break;
+
+      if (! cv)
+        {
+          cv = xmalloc (sizeof (*cv));
+          cv->variable = v;
+          cv->next = command_variables;
+          command_variables = cv;
+        }
+    }
+  else if (! env)
+    {
+      /* Not an option or variable definition; it must be a goal
+         target!  Enter it as a file and add it to the dep chain of
+         goals.  */
+      struct file *f = enter_file (strcache_add (expand_command_line_file (arg)));
+      f->cmd_target = 1;
+
+      if (goals == 0)
+        {
+          goals = alloc_goaldep ();
+          lastgoal = goals;
+        }
+      else
+        {
+          lastgoal->next = alloc_goaldep ();
+          lastgoal = lastgoal->next;
+        }
+
+      lastgoal->file = f;
+
+      {
+        /* Add this target name to the MAKECMDGOALS variable. */
+        struct variable *gv;
+        const char *value;
+
+        gv = lookup_variable (STRING_SIZE_TUPLE ("MAKECMDGOALS"));
+        if (gv == 0)
+          value = f->name;
+        else
+          {
+            /* Paste the old and new values together */
+            size_t oldlen, newlen;
+            char *vp;
+
+            oldlen = strlen (gv->value);
+            newlen = strlen (f->name);
+            vp = alloca (oldlen + 1 + newlen + 1);
+            memcpy (vp, gv->value, oldlen);
+            vp[oldlen] = ' ';
+            memcpy (&vp[oldlen + 1], f->name, newlen + 1);
+            value = vp;
+          }
+        define_variable_cname ("MAKECMDGOALS", value, o_default, 0);
+      }
+    }
+}
+
+/* Print a nice usage method.  */
+
+static void
+print_usage (int bad)
+{
+  const char *const *cpp;
+  FILE *usageto;
+
+  if (print_version_flag)
+    print_version ();
+
+  usageto = bad ? stderr : stdout;
+
+  fprintf (usageto, _("Usage: %s [options] [target] ...\n"), program);
+
+  for (cpp = usage; *cpp; ++cpp)
+    fputs (_(*cpp), usageto);
+
+  if (!remote_description || *remote_description == '\0')
+    fprintf (usageto, _("\nThis program built for %s\n"), make_host);
+  else
+    fprintf (usageto, _("\nThis program built for %s (%s)\n"),
+             make_host, remote_description);
+
+  fprintf (usageto, _("Report bugs to <bug-make@gnu.org>\n"));
+}
+
+/* Decode switches from ARGC and ARGV.
+   They came from the environment if ENV is nonzero.  */
+
+static void
+decode_switches (int argc, const char **argv, int env)
+{
+  int bad = 0;
+  const struct command_switch *cs;
+  struct stringlist *sl;
+  int c;
+
+  /* getopt does most of the parsing for us.
+     First, get its vectors set up.  */
+
+  init_switches ();
+
+  /* Let getopt produce error messages for the command line,
+     but not for options from the environment.  */
+  opterr = !env;
+  /* Reset getopt's state.  */
+  optind = 0;
+
+  while (optind < argc)
+    {
+      const char *coptarg;
+
+      /* Parse the next argument.  */
+      c = getopt_long (argc, (char*const*)argv, options, long_options, NULL);
+      coptarg = optarg;
+      if (c == EOF)
+        /* End of arguments, or "--" marker seen.  */
+        break;
+      else if (c == 1)
+        /* An argument not starting with a dash.  */
+        handle_non_switch_argument (coptarg, env);
+      else if (c == '?')
+        /* Bad option.  We will print a usage message and die later.
+           But continue to parse the other options so the user can
+           see all he did wrong.  */
+        bad = 1;
+      else
+        for (cs = switches; cs->c != '\0'; ++cs)
+          if (cs->c == c)
+            {
+              /* Whether or not we will actually do anything with
+                 this switch.  We test this individually inside the
+                 switch below rather than just once outside it, so that
+                 options which are to be ignored still consume args.  */
+              int doit = !env || cs->env;
+
+              switch (cs->type)
+                {
+                default:
+                  abort ();
+
+                case ignore:
+                  break;
+
+                case flag:
+                case flag_off:
+                  if (doit)
+                    *(int *) cs->value_ptr = cs->type == flag;
+                  break;
+
+                case string:
+                case strlist:
+                case filename:
+                  if (!doit)
+                    break;
+
+                  if (! coptarg)
+                    coptarg = xstrdup (cs->noarg_value);
+                  else if (*coptarg == '\0')
+                    {
+                      char opt[2] = "c";
+                      const char *op = opt;
+
+                      if (short_option (cs->c))
+                        opt[0] = (char) cs->c;
+                      else
+                        op = cs->long_name;
+
+                      error (NILF, strlen (op),
+                             _("the '%s%s' option requires a non-empty string argument"),
+                             short_option (cs->c) ? "-" : "--", op);
+                      bad = 1;
+                      break;
+                    }
+
+                  if (cs->type == string)
+                    {
+                      char **val = (char **)cs->value_ptr;
+                      free (*val);
+                      *val = xstrdup (coptarg);
+                      break;
+                    }
+
+                  sl = *(struct stringlist **) cs->value_ptr;
+                  if (sl == 0)
+                    {
+                      sl = xmalloc (sizeof (struct stringlist));
+                      sl->max = 5;
+                      sl->idx = 0;
+                      sl->list = xmalloc (5 * sizeof (char *));
+                      *(struct stringlist **) cs->value_ptr = sl;
+                    }
+                  else if (sl->idx == sl->max - 1)
+                    {
+                      sl->max += 5;
+                      /* MSVC erroneously warns without a cast here.  */
+                      sl->list = xrealloc ((void *)sl->list,
+                                           sl->max * sizeof (char *));
+                    }
+                  if (cs->type == filename)
+                    sl->list[sl->idx++] = expand_command_line_file (coptarg);
+                  else
+                    sl->list[sl->idx++] = xstrdup (coptarg);
+                  sl->list[sl->idx] = 0;
+                  break;
+
+                case positive_int:
+                  /* See if we have an option argument; if we do require that
+                     it's all digits, not something like "10foo".  */
+                  if (coptarg == 0 && argc > optind)
+                    {
+                      const char *cp;
+                      for (cp=argv[optind]; ISDIGIT (cp[0]); ++cp)
+                        ;
+                      if (cp[0] == '\0')
+                        coptarg = argv[optind++];
+                    }
+
+                  if (!doit)
+                    break;
+
+                  if (coptarg)
+                    {
+                      int i = atoi (coptarg);
+                      const char *cp;
+
+                      /* Yes, I realize we're repeating this in some cases.  */
+                      for (cp = coptarg; ISDIGIT (cp[0]); ++cp)
+                        ;
+
+                      if (i < 1 || cp[0] != '\0')
+                        {
+                          error (NILF, 0,
+                                 _("the '-%c' option requires a positive integer argument"),
+                                 cs->c);
+                          bad = 1;
+                        }
+                      else
+                        *(unsigned int *) cs->value_ptr = i;
+                    }
+                  else
+                    *(unsigned int *) cs->value_ptr
+                      = *(unsigned int *) cs->noarg_value;
+                  break;
+
+                case floating:
+                  if (coptarg == 0 && optind < argc
+                      && (ISDIGIT (argv[optind][0]) || argv[optind][0] == '.'))
+                    coptarg = argv[optind++];
+
+                  if (doit)
+                    *(double *) cs->value_ptr
+                      = (coptarg != 0 ? atof (coptarg)
+                         : *(double *) cs->noarg_value);
+
+                  break;
+                }
+
+              /* We've found the switch.  Stop looking.  */
+              break;
+            }
+    }
+
+  /* There are no more options according to getting getopt, but there may
+     be some arguments left.  Since we have asked for non-option arguments
+     to be returned in order, this only happens when there is a "--"
+     argument to prevent later arguments from being options.  */
+  while (optind < argc)
+    handle_non_switch_argument (argv[optind++], env);
+
+  if (!env && (bad || print_usage_flag))
+    {
+      print_usage (bad);
+      die (bad ? MAKE_FAILURE : MAKE_SUCCESS);
+    }
+
+  /* If there are any options that need to be decoded do it now.  */
+  decode_debug_flags ();
+  decode_output_sync_flags ();
+
+  /* Perform any special switch handling.  */
+  run_silent = silent_flag;
+}
+
+/* Decode switches from environment variable ENVAR (which is LEN chars long).
+   We do this by chopping the value into a vector of words, prepending a
+   dash to the first word if it lacks one, and passing the vector to
+   decode_switches.  */
+
+static void
+decode_env_switches (const char *envar, size_t len)
+{
+  char *varref = alloca (2 + len + 2);
+  char *value, *p, *buf;
+  int argc;
+  const char **argv;
+
+  /* Get the variable's value.  */
+  varref[0] = '$';
+  varref[1] = '(';
+  memcpy (&varref[2], envar, len);
+  varref[2 + len] = ')';
+  varref[2 + len + 1] = '\0';
+  value = variable_expand (varref);
+
+  /* Skip whitespace, and check for an empty value.  */
+  NEXT_TOKEN (value);
+  len = strlen (value);
+  if (len == 0)
+    return;
+
+  /* Allocate a vector that is definitely big enough.  */
+  argv = alloca ((1 + len + 1) * sizeof (char *));
+
+  /* getopt will look at the arguments starting at ARGV[1].
+     Prepend a spacer word.  */
+  argv[0] = 0;
+  argc = 1;
+
+  /* We need a buffer to copy the value into while we split it into words
+     and unquote it.  Set up in case we need to prepend a dash later.  */
+  buf = alloca (1 + len + 1);
+  buf[0] = '-';
+  p = buf+1;
+  argv[argc] = p;
+  while (*value != '\0')
+    {
+      if (*value == '\\' && value[1] != '\0')
+        ++value;                /* Skip the backslash.  */
+      else if (ISBLANK (*value))
+        {
+          /* End of the word.  */
+          *p++ = '\0';
+          argv[++argc] = p;
+          do
+            ++value;
+          while (ISBLANK (*value));
+          continue;
+        }
+      *p++ = *value++;
+    }
+  *p = '\0';
+  argv[++argc] = 0;
+  assert (p < buf + len + 2);
+
+  if (argv[1][0] != '-' && strchr (argv[1], '=') == 0)
+    /* The first word doesn't start with a dash and isn't a variable
+       definition, so add a dash.  */
+    argv[1] = buf;
+
+  /* Parse those words.  */
+  decode_switches (argc, argv, 1);
+}
+\f
+/* Quote the string IN so that it will be interpreted as a single word with
+   no magic by decode_env_switches; also double dollar signs to avoid
+   variable expansion in make itself.  Write the result into OUT, returning
+   the address of the next character to be written.
+   Allocating space for OUT twice the length of IN is always sufficient.  */
+
+static char *
+quote_for_env (char *out, const char *in)
+{
+  while (*in != '\0')
+    {
+      if (*in == '$')
+        *out++ = '$';
+      else if (ISBLANK (*in) || *in == '\\')
+        *out++ = '\\';
+      *out++ = *in++;
+    }
+
+  return out;
+}
+
+/* Define the MAKEFLAGS and MFLAGS variables to reflect the settings of the
+   command switches.  Include options with args if ALL is nonzero.
+   Don't include options with the 'no_makefile' flag set if MAKEFILE.  */
+
+static struct variable *
+define_makeflags (int all, int makefile)
+{
+  const char ref[] = "MAKEOVERRIDES";
+  const char posixref[] = "-*-command-variables-*-";
+  const char evalref[] = "$(-*-eval-flags-*-)";
+  const struct command_switch *cs;
+  char *flagstring;
+  char *p;
+
+  /* We will construct a linked list of 'struct flag's describing
+     all the flags which need to go in MAKEFLAGS.  Then, once we
+     know how many there are and their lengths, we can put them all
+     together in a string.  */
+
+  struct flag
+    {
+      struct flag *next;
+      const struct command_switch *cs;
+      const char *arg;
+    };
+  struct flag *flags = 0;
+  struct flag *last = 0;
+  size_t flagslen = 0;
+#define ADD_FLAG(ARG, LEN) \
+  do {                                                                        \
+    struct flag *new = alloca (sizeof (struct flag));                         \
+    new->cs = cs;                                                             \
+    new->arg = (ARG);                                                         \
+    new->next = 0;                                                            \
+    if (! flags)                                                              \
+      flags = new;                                                            \
+    else                                                                      \
+      last->next = new;                                                       \
+    last = new;                                                               \
+    if (new->arg == 0)                                                        \
+      /* Just a single flag letter: " -x"  */                                 \
+      flagslen += 3;                                                          \
+    else                                                                      \
+      /* " -xfoo", plus space to escape "foo".  */                            \
+      flagslen += 1 + 1 + 1 + (3 * (LEN));                                    \
+    if (!short_option (cs->c))                                                \
+      /* This switch has no single-letter version, so we use the long.  */    \
+      flagslen += 2 + strlen (cs->long_name);                                 \
+  } while (0)
+
+  for (cs = switches; cs->c != '\0'; ++cs)
+    if (cs->toenv && (!makefile || !cs->no_makefile))
+      switch (cs->type)
+        {
+        case ignore:
+          break;
+
+        case flag:
+        case flag_off:
+          if ((!*(int *) cs->value_ptr) == (cs->type == flag_off)
+              && (cs->default_value == 0
+                  || *(int *) cs->value_ptr != *(int *) cs->default_value))
+            ADD_FLAG (0, 0);
+          break;
+
+        case positive_int:
+          if (all)
+            {
+              if ((cs->default_value != 0
+                   && (*(unsigned int *) cs->value_ptr
+                       == *(unsigned int *) cs->default_value)))
+                break;
+              else if (cs->noarg_value != 0
+                       && (*(unsigned int *) cs->value_ptr ==
+                           *(unsigned int *) cs->noarg_value))
+                ADD_FLAG ("", 0); /* Optional value omitted; see below.  */
+              else
+                {
+                  char *buf = alloca (30);
+                  sprintf (buf, "%u", *(unsigned int *) cs->value_ptr);
+                  ADD_FLAG (buf, strlen (buf));
+                }
+            }
+          break;
+
+        case floating:
+          if (all)
+            {
+              if (cs->default_value != 0
+                  && (*(double *) cs->value_ptr
+                      == *(double *) cs->default_value))
+                break;
+              else if (cs->noarg_value != 0
+                       && (*(double *) cs->value_ptr
+                           == *(double *) cs->noarg_value))
+                ADD_FLAG ("", 0); /* Optional value omitted; see below.  */
+              else
+                {
+                  char *buf = alloca (100);
+                  sprintf (buf, "%g", *(double *) cs->value_ptr);
+                  ADD_FLAG (buf, strlen (buf));
+                }
+            }
+          break;
+
+        case string:
+          if (all)
+            {
+              p = *((char **)cs->value_ptr);
+              if (p)
+                ADD_FLAG (p, strlen (p));
+            }
+          break;
+
+        case filename:
+        case strlist:
+          if (all)
+            {
+              struct stringlist *sl = *(struct stringlist **) cs->value_ptr;
+              if (sl != 0)
+                {
+                  unsigned int i;
+                  for (i = 0; i < sl->idx; ++i)
+                    ADD_FLAG (sl->list[i], strlen (sl->list[i]));
+                }
+            }
+          break;
+
+        default:
+          abort ();
+        }
+
+#undef  ADD_FLAG
+
+  /* Four more for the possible " -- ", plus variable references.  */
+  flagslen += 4 + CSTRLEN (posixref) + 4 + CSTRLEN (evalref) + 4;
+
+  /* Construct the value in FLAGSTRING.
+     We allocate enough space for a preceding dash and trailing null.  */
+  flagstring = alloca (1 + flagslen + 1);
+  memset (flagstring, '\0', 1 + flagslen + 1);
+  p = flagstring;
+
+  /* Start with a dash, for MFLAGS.  */
+  *p++ = '-';
+
+  /* Add simple options as a group.  */
+  while (flags != 0 && !flags->arg && short_option (flags->cs->c))
+    {
+      *p++ = (char) flags->cs->c;
+      flags = flags->next;
+    }
+
+  /* Now add more complex flags: ones with options and/or long names.  */
+  while (flags)
+    {
+      *p++ = ' ';
+      *p++ = '-';
+
+      /* Add the flag letter or name to the string.  */
+      if (short_option (flags->cs->c))
+        *p++ = (char) flags->cs->c;
+      else
+        {
+          /* Long options require a double-dash.  */
+          *p++ = '-';
+          strcpy (p, flags->cs->long_name);
+          p += strlen (p);
+        }
+      /* An omitted optional argument has an ARG of "".  */
+      if (flags->arg && flags->arg[0] != '\0')
+        {
+          if (!short_option (flags->cs->c))
+            /* Long options require '='.  */
+            *p++ = '=';
+          p = quote_for_env (p, flags->arg);
+        }
+      flags = flags->next;
+    }
+
+  /* If no flags at all, get rid of the initial dash.  */
+  if (p == &flagstring[1])
+    {
+      flagstring[0] = '\0';
+      p = flagstring;
+    }
+
+  /* Define MFLAGS before appending variable definitions.  Omit an initial
+     empty dash.  Since MFLAGS is not parsed for flags, there is no reason to
+     override any makefile redefinition.  */
+  define_variable_cname ("MFLAGS",
+                         flagstring + (flagstring[0] == '-' && flagstring[1] == ' ' ? 2 : 0),
+                         o_env, 1);
+
+  /* Write a reference to -*-eval-flags-*-, which contains all the --eval
+     flag options.  */
+  if (eval_strings)
+    {
+      *p++ = ' ';
+      memcpy (p, evalref, CSTRLEN (evalref));
+      p += CSTRLEN (evalref);
+    }
+
+  if (all)
+    {
+      /* If there are any overrides to add, write a reference to
+         $(MAKEOVERRIDES), which contains command-line variable definitions.
+         Separate the variables from the switches with a "--" arg.  */
+
+      const char *r = posix_pedantic ? posixref : ref;
+      size_t l = strlen (r);
+      struct variable *v = lookup_variable (r, l);
+
+      if (v && v->value && v->value[0] != '\0')
+        {
+          strcpy (p, " -- ");
+          p += 4;
+
+          *(p++) = '$';
+          *(p++) = '(';
+          memcpy (p, r, l);
+          p += l;
+          *(p++) = ')';
+        }
+    }
+
+  /* If there is a leading dash, omit it.  */
+  if (flagstring[0] == '-')
+    ++flagstring;
+
+  /* This used to use o_env, but that lost when a makefile defined MAKEFLAGS.
+     Makefiles set MAKEFLAGS to add switches, but we still want to redefine
+     its value with the full set of switches.  Then we used o_file, but that
+     lost when users added -e, causing a previous MAKEFLAGS env. var. to take
+     precedence over the new one.  Of course, an override or command
+     definition will still take precedence.  */
+  return define_variable_cname ("MAKEFLAGS", flagstring,
+                                env_overrides ? o_env_override : o_file, 1);
+}
+\f
+/* Print version information.  */
+
+static void
+print_version (void)
+{
+  static int printed_version = 0;
+
+  const char *precede = print_data_base_flag ? "# " : "";
+
+  if (printed_version)
+    /* Do it only once.  */
+    return;
+
+  printf ("%sGNU Make %s\n", precede, version_string);
+
+  if (!remote_description || *remote_description == '\0')
+    printf (_("%sBuilt for %s\n"), precede, make_host);
+  else
+    printf (_("%sBuilt for %s (%s)\n"),
+            precede, make_host, remote_description);
+
+  /* Print this untranslated.  The coding standards recommend translating the
+     (C) to the copyright symbol, but this string is going to change every
+     year, and none of the rest of it should be translated (including the
+     word "Copyright"), so it hardly seems worth it.  */
+
+  printf ("%sCopyright (C) 1988-2020 Free Software Foundation, Inc.\n",
+          precede);
+
+  printf (_("%sLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n\
+%sThis is free software: you are free to change and redistribute it.\n\
+%sThere is NO WARRANTY, to the extent permitted by law.\n"),
+            precede, precede, precede);
+
+  printed_version = 1;
+
+  /* Flush stdout so the user doesn't have to wait to see the
+     version information while make thinks about things.  */
+  fflush (stdout);
+}
+
+/* Print a bunch of information about this and that.  */
+
+static void
+print_data_base (void)
+{
+  time_t when = time ((time_t *) 0);
+
+  print_version ();
+
+  printf (_("\n# Make data base, printed on %s"), ctime (&when));
+
+  print_variable_data_base ();
+  print_dir_data_base ();
+  print_rule_data_base ();
+  print_file_data_base ();
+  print_vpath_data_base ();
+  strcache_print_stats ("#");
+
+  when = time ((time_t *) 0);
+  printf (_("\n# Finished Make data base on %s\n"), ctime (&when));
+}
+
+static void
+clean_jobserver (int status)
+{
+  /* Sanity: have we written all our jobserver tokens back?  If our
+     exit status is 2 that means some kind of syntax error; we might not
+     have written all our tokens so do that now.  If tokens are left
+     after any other error code, that's bad.  */
+
+  if (jobserver_enabled() && jobserver_tokens)
+    {
+      if (status != 2)
+        ON (error, NILF,
+            "INTERNAL: Exiting with %u jobserver tokens (should be 0)!",
+            jobserver_tokens);
+      else
+        /* Don't write back the "free" token */
+        while (--jobserver_tokens)
+          jobserver_release (0);
+    }
+
+
+  /* Sanity: If we're the master, were all the tokens written back?  */
+
+  if (master_job_slots)
+    {
+      /* We didn't write one for ourself, so start at 1.  */
+      unsigned int tokens = 1 + jobserver_acquire_all ();
+
+      if (tokens != master_job_slots)
+        ONN (error, NILF,
+             "INTERNAL: Exiting with %u jobserver tokens available; should be %u!",
+             tokens, master_job_slots);
+
+      reset_jobserver ();
+    }
+}
+\f
+/* Exit with STATUS, cleaning up as necessary.  */
+
+void
+die (int status)
+{
+  static char dying = 0;
+
+  if (!dying)
+    {
+      int err;
+
+      dying = 1;
+
+      if (print_version_flag)
+        print_version ();
+
+      /* Wait for children to die.  */
+      err = (status != 0);
+      while (job_slots_used > 0)
+        reap_children (1, err);
+
+      /* Let the remote job module clean up its state.  */
+      remote_cleanup ();
+
+      /* Remove the intermediate files.  */
+      remove_intermediates (0);
+
+      if (print_data_base_flag)
+        print_data_base ();
+
+      if (verify_flag)
+        verify_file_data_base ();
+
+      clean_jobserver (status);
+
+      if (output_context)
+        {
+          /* die() might be called in a recipe output context due to an
+             $(error ...) function.  */
+          output_close (output_context);
+
+          if (output_context != &make_sync)
+            output_close (&make_sync);
+
+          OUTPUT_UNSET ();
+        }
+
+      output_close (NULL);
+
+      /* Try to move back to the original directory.  This is essential on
+         MS-DOS (where there is really only one process), and on Unix it
+         puts core files in the original directory instead of the -C
+         directory.  Must wait until after remove_intermediates(), or unlinks
+         of relative pathnames fail.  */
+      if (directory_before_chdir != 0)
+        {
+          /* If it fails we don't care: shut up GCC.  */
+          int _x UNUSED;
+          _x = chdir (directory_before_chdir);
+        }
+    }
+
+  exit (status);
+}
diff --git a/src/makeint.h b/src/makeint.h
new file mode 100644 (file)
index 0000000..c428a36
--- /dev/null
@@ -0,0 +1,808 @@
+/* Miscellaneous global declarations and portability cruft for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* We use <config.h> instead of "config.h" so that a compilation
+   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
+   (which it would do because makeint.h was found in $srcdir).  */
+#include <config.h>
+#undef  HAVE_CONFIG_H
+#define HAVE_CONFIG_H 1
+
+/* Specify we want GNU source code.  This must be defined before any
+   system headers are included.  */
+
+#define _GNU_SOURCE 1
+
+/* AIX requires this to be the first thing in the file.  */
+#if HAVE_ALLOCA_H
+# include <alloca.h>
+#else
+# ifdef _AIX
+ #pragma alloca
+# else
+#  if !defined(__GNUC__) && !defined(WINDOWS32)
+#   ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#   endif
+#  endif
+# endif
+#endif
+
+/* Disable assert() unless we're a maintainer.
+   Some asserts are compute-intensive.  */
+#ifndef MAKE_MAINTAINER_MODE
+# define NDEBUG 1
+#endif
+
+/* Include the externally-visible content.
+   Be sure to use the local one, and not one installed on the system.
+   Define GMK_BUILDING_MAKE for proper selection of dllexport/dllimport
+   declarations for MS-Windows.  */
+#ifdef WINDOWS32
+# define GMK_BUILDING_MAKE
+#endif
+#include "gnumake.h"
+
+#ifdef  CRAY
+/* This must happen before #include <signal.h> so
+   that the declaration therein is changed.  */
+# define signal bsdsignal
+#endif
+
+/* If we're compiling for the dmalloc debugger, turn off string inlining.  */
+#if defined(HAVE_DMALLOC_H) && defined(__GNUC__)
+# define __NO_STRING_INLINES
+#endif
+
+#include <stddef.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <stdio.h>
+#include <ctype.h>
+
+#ifdef HAVE_SYS_TIMEB_H
+/* SCO 3.2 "devsys 4.2" has a prototype for 'ftime' in <time.h> that bombs
+   unless <sys/timeb.h> has been included first.  */
+# include <sys/timeb.h>
+#endif
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include <errno.h>
+
+#ifndef errno
+extern int errno;
+#endif
+
+#ifdef __VMS
+/* In strict ANSI mode, VMS compilers should not be defining the
+   VMS macro.  Define it here instead of a bulk edit for the correct code.
+ */
+# ifndef VMS
+#  define VMS
+# endif
+#endif
+
+#ifdef  HAVE_UNISTD_H
+# include <unistd.h>
+/* Ultrix's unistd.h always defines _POSIX_VERSION, but you only get
+   POSIX.1 behavior with 'cc -YPOSIX', which predefines POSIX itself!  */
+# if defined (_POSIX_VERSION) && !defined (ultrix) && !defined (VMS)
+#  define POSIX 1
+# endif
+#endif
+
+/* Some systems define _POSIX_VERSION but are not really POSIX.1.  */
+#if (defined (butterfly) || defined (__arm) || (defined (__mips) && defined (_SYSTYPE_SVR3)) || (defined (sequent) && defined (i386)))
+# undef POSIX
+#endif
+
+#if !defined (POSIX) && defined (_AIX) && defined (_POSIX_SOURCE)
+# define POSIX 1
+#endif
+
+#ifndef RETSIGTYPE
+# define RETSIGTYPE     void
+#endif
+
+#ifndef sigmask
+# define sigmask(sig)   (1 << ((sig) - 1))
+#endif
+
+#ifndef HAVE_SA_RESTART
+# define SA_RESTART 0
+#endif
+
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+
+#ifdef  HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#ifdef  HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#ifndef PATH_MAX
+# ifndef POSIX
+#  define PATH_MAX      MAXPATHLEN
+# endif
+#endif
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+
+#ifdef  PATH_MAX
+# define GET_PATH_MAX   PATH_MAX
+# define PATH_VAR(var)  char var[PATH_MAX+1]
+#else
+# define NEED_GET_PATH_MAX 1
+# define GET_PATH_MAX   (get_path_max ())
+# define PATH_VAR(var)  char *var = alloca (GET_PATH_MAX+1)
+unsigned int get_path_max (void);
+#endif
+
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+#ifndef USHRT_MAX
+# define USHRT_MAX 65535
+#endif
+
+/* Nonzero if the integer type T is signed.
+   Use <= to avoid GCC warnings about always-false expressions.  */
+#define INTEGER_TYPE_SIGNED(t) ((t) -1 <= 0)
+
+/* The minimum and maximum values for the integer type T.
+   Use ~ (t) 0, not -1, for portability to 1's complement hosts.  */
+#define INTEGER_TYPE_MINIMUM(t) \
+  (! INTEGER_TYPE_SIGNED (t) ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))
+#define INTEGER_TYPE_MAXIMUM(t) (~ (t) 0 - INTEGER_TYPE_MINIMUM (t))
+
+#ifndef CHAR_MAX
+# define CHAR_MAX INTEGER_TYPE_MAXIMUM (char)
+#endif
+
+#ifdef STAT_MACROS_BROKEN
+# ifdef S_ISREG
+#  undef S_ISREG
+# endif
+# ifdef S_ISDIR
+#  undef S_ISDIR
+# endif
+#endif  /* STAT_MACROS_BROKEN.  */
+
+#ifndef S_ISREG
+# define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
+#endif
+#ifndef S_ISDIR
+# define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
+#endif
+
+#ifdef VMS
+# include <fcntl.h>
+# include <types.h>
+# include <unixlib.h>
+# include <unixio.h>
+# include <perror.h>
+/* Needed to use alloca on VMS.  */
+# include <builtins.h>
+
+extern int vms_use_mcr_command;
+extern int vms_always_use_cmd_file;
+extern int vms_gnv_shell;
+extern int vms_comma_separator;
+extern int vms_legacy_behavior;
+extern int vms_unix_simulation;
+#endif
+
+#if !defined(__attribute__) && (__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__)
+/* Don't use __attribute__ if it's not supported.  */
+# define ATTRIBUTE(x)
+#else
+# define ATTRIBUTE(x) __attribute__ (x)
+#endif
+
+/* The __-protected variants of 'format' and 'printf' attributes
+   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __format__ format
+# define __printf__ printf
+#endif
+
+#define UNUSED   ATTRIBUTE ((unused))
+#define NORETURN ATTRIBUTE ((noreturn))
+
+#if defined (STDC_HEADERS) || defined (__GNU_LIBRARY__)
+# include <stdlib.h>
+# include <string.h>
+# define ANSI_STRING 1
+#else   /* No standard headers.  */
+# ifdef HAVE_STRING_H
+#  include <string.h>
+#  define ANSI_STRING 1
+# else
+#  include <strings.h>
+# endif
+# ifdef HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# else
+void *malloc (int);
+void *realloc (void *, int);
+void free (void *);
+
+void abort (void) NORETURN;
+void exit (int) NORETURN;
+# endif /* HAVE_STDLIB_H.  */
+
+#endif /* Standard headers.  */
+
+/* These should be in stdlib.h.  Make sure we have them.  */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+#ifndef  ANSI_STRING
+
+/* SCO Xenix has a buggy macro definition in <string.h>.  */
+#undef  strerror
+#if !defined(__DECC)
+char *strerror (int errnum);
+#endif
+
+#endif  /* !ANSI_STRING.  */
+#undef  ANSI_STRING
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#define FILE_TIMESTAMP uintmax_t
+
+#if !defined(HAVE_STRSIGNAL)
+char *strsignal (int signum);
+#endif
+
+#if !defined(HAVE_UMASK)
+typedef int mode_t;
+extern mode_t umask (mode_t);
+#endif
+
+/* ISDIGIT offers the following features:
+   - Its arg may be any int or unsigned int; it need not be an unsigned char.
+   - It's guaranteed to evaluate its argument exactly once.
+      NOTE!  Make relies on this behavior, don't change it!
+   - It's typically faster.
+   POSIX 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
+   only '0' through '9' are digits.  Prefer ISDIGIT to isdigit() unless
+   it's important to use the locale's definition of 'digit' even when the
+   host does not conform to POSIX.  */
+#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
+
+/* Test if two strings are equal. Is this worthwhile?  Should be profiled.  */
+#define streq(a, b) \
+   ((a) == (b) || \
+    (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1))))
+
+/* Test if two strings are equal, but match case-insensitively on systems
+   which have case-insensitive filesystems.  Should only be used for
+   filenames!  */
+#ifdef HAVE_CASE_INSENSITIVE_FS
+# define patheq(a, b) \
+    ((a) == (b) \
+     || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \
+         && (*(a) == '\0' || !strcasecmp ((a) + 1, (b) + 1))))
+#else
+# define patheq(a, b) streq(a, b)
+#endif
+
+#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0)
+
+#if defined(ENUM_BITFIELDS) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+# define ENUM_BITFIELD(bits)    :bits
+#else
+# define ENUM_BITFIELD(bits)
+#endif
+
+/* Handle gettext and locales.  */
+
+#if HAVE_LOCALE_H
+# include <locale.h>
+#else
+# define setlocale(category, locale)
+#endif
+
+#include <gettext.h>
+
+#define _(msgid)            gettext (msgid)
+#define N_(msgid)           gettext_noop (msgid)
+#define S_(msg1,msg2,num)   ngettext (msg1,msg2,num)
+
+/* This is needed for getcwd() and chdir(), on some W32 systems.  */
+#if defined(HAVE_DIRECT_H)
+# include <direct.h>
+#endif
+
+#ifdef WINDOWS32
+# include <fcntl.h>
+# include <malloc.h>
+# define pipe(_p)        _pipe((_p), 512, O_BINARY)
+# define kill(_pid,_sig) w32_kill((_pid),(_sig))
+/* MSVC and Watcom C don't have ftruncate.  */
+# if defined(_MSC_VER) || defined(__WATCOMC__)
+#  define ftruncate(_fd,_len) _chsize(_fd,_len)
+# endif
+/* MinGW64 doesn't have _S_ISDIR.  */
+# ifndef _S_ISDIR
+#  define _S_ISDIR(m)  S_ISDIR(m)
+# endif
+
+void sync_Path_environment (void);
+int w32_kill (pid_t pid, int sig);
+int find_and_set_default_shell (const char *token);
+
+/* indicates whether or not we have Bourne shell */
+extern int no_default_sh_exe;
+
+/* is default_shell unixy? */
+extern int unixy_shell;
+
+/* We don't have a preferred fixed value for LOCALEDIR.  */
+# ifndef LOCALEDIR
+#  define LOCALEDIR NULL
+# endif
+
+/* Include only the minimal stuff from windows.h.   */
+# define WIN32_LEAN_AND_MEAN
+#endif  /* WINDOWS32 */
+
+#define ANY_SET(_v,_m)  (((_v)&(_m)) != 0)
+#define NONE_SET(_v,_m) (! ANY_SET ((_v),(_m)))
+
+#define MAP_NUL         0x0001
+#define MAP_BLANK       0x0002
+#define MAP_NEWLINE     0x0004
+#define MAP_COMMENT     0x0008
+#define MAP_SEMI        0x0010
+#define MAP_EQUALS      0x0020
+#define MAP_COLON       0x0040
+#define MAP_VARSEP      0x0080
+#define MAP_PIPE        0x0100
+#define MAP_DOT         0x0200
+#define MAP_COMMA       0x0400
+
+/* These are the valid characters for a user-defined function.  */
+#define MAP_USERFUNC    0x2000
+/* This means not only a '$', but skip the variable reference.  */
+#define MAP_VARIABLE    0x4000
+/* The set of characters which are directory separators is OS-specific.  */
+#define MAP_DIRSEP      0x8000
+
+#ifdef VMS
+# define MAP_VMSCOMMA   MAP_COMMA
+#else
+# define MAP_VMSCOMMA   0x0000
+#endif
+
+#define MAP_SPACE       (MAP_BLANK|MAP_NEWLINE)
+
+/* Handle other OSs.
+   To overcome an issue parsing paths in a DOS/Windows environment when
+   built in a unix based environment, override the PATH_SEPARATOR_CHAR
+   definition unless being built for Cygwin. */
+#if defined(HAVE_DOS_PATHS) && !defined(__CYGWIN__)
+# undef PATH_SEPARATOR_CHAR
+# define PATH_SEPARATOR_CHAR ';'
+# define MAP_PATHSEP    MAP_SEMI
+#elif !defined(PATH_SEPARATOR_CHAR)
+# if defined (VMS)
+#  define PATH_SEPARATOR_CHAR (vms_comma_separator ? ',' : ':')
+#  define MAP_PATHSEP    (vms_comma_separator ? MAP_COMMA : MAP_SEMI)
+# else
+#  define PATH_SEPARATOR_CHAR ':'
+#  define MAP_PATHSEP    MAP_COLON
+# endif
+#elif PATH_SEPARATOR_CHAR == ':'
+# define MAP_PATHSEP     MAP_COLON
+#elif PATH_SEPARATOR_CHAR == ';'
+# define MAP_PATHSEP     MAP_SEMI
+#elif PATH_SEPARATOR_CHAR == ','
+# define MAP_PATHSEP     MAP_COMMA
+#else
+# error "Unknown PATH_SEPARATOR_CHAR"
+#endif
+
+#define STOP_SET(_v,_m) ANY_SET(stopchar_map[(unsigned char)(_v)],(_m))
+
+#define ISBLANK(c)      STOP_SET((c),MAP_BLANK)
+#define ISSPACE(c)      STOP_SET((c),MAP_SPACE)
+#define NEXT_TOKEN(s)   while (ISSPACE (*(s))) ++(s)
+#define END_OF_TOKEN(s) while (! STOP_SET (*(s), MAP_SPACE|MAP_NUL)) ++(s)
+
+/* We can't run setrlimit when using posix_spawn.  */
+#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) && !defined(USE_POSIX_SPAWN)
+# define SET_STACK_SIZE
+#endif
+#ifdef SET_STACK_SIZE
+# include <sys/resource.h>
+extern struct rlimit stack_limit;
+#endif
+
+#include <glob.h>
+
+#define NILF ((floc *)0)
+
+#define CSTRLEN(_s)           (sizeof (_s)-1)
+#define STRING_SIZE_TUPLE(_s) (_s), CSTRLEN(_s)
+
+/* The number of bytes needed to represent the largest integer as a string.  */
+#define INTSTR_LENGTH         CSTRLEN ("18446744073709551616")
+
+#define DEFAULT_TTYNAME "true"
+#ifdef HAVE_TTYNAME
+# define TTYNAME(_f) ttyname (_f)
+#else
+# define TTYNAME(_f) DEFAULT_TTYNAME
+#endif
+
+\f
+
+/* Specify the location of elements read from makefiles.  */
+typedef struct
+  {
+    const char *filenm;
+    unsigned long lineno;
+    unsigned long offset;
+  } floc;
+
+const char *concat (unsigned int, ...);
+void message (int prefix, size_t length, const char *fmt, ...)
+              ATTRIBUTE ((__format__ (__printf__, 3, 4)));
+void error (const floc *flocp, size_t length, const char *fmt, ...)
+            ATTRIBUTE ((__format__ (__printf__, 3, 4)));
+void fatal (const floc *flocp, size_t length, const char *fmt, ...)
+            ATTRIBUTE ((noreturn, __format__ (__printf__, 3, 4)));
+void out_of_memory () NORETURN;
+
+/* When adding macros to this list be sure to update the value of
+   XGETTEXT_OPTIONS in the po/Makevars file.  */
+#define O(_t,_a,_f)           _t((_a), 0, (_f))
+#define OS(_t,_a,_f,_s)       _t((_a), strlen (_s), (_f), (_s))
+#define OSS(_t,_a,_f,_s1,_s2) _t((_a), strlen (_s1) + strlen (_s2), \
+                                 (_f), (_s1), (_s2))
+#define OSSS(_t,_a,_f,_s1,_s2,_s3) _t((_a), strlen (_s1) + strlen (_s2) + strlen (_s3), \
+                                      (_f), (_s1), (_s2), (_s3))
+#define ON(_t,_a,_f,_n)       _t((_a), INTSTR_LENGTH, (_f), (_n))
+#define ONN(_t,_a,_f,_n1,_n2) _t((_a), INTSTR_LENGTH*2, (_f), (_n1), (_n2))
+
+#define OSN(_t,_a,_f,_s,_n)   _t((_a), strlen (_s) + INTSTR_LENGTH, \
+                                 (_f), (_s), (_n))
+#define ONS(_t,_a,_f,_n,_s)   _t((_a), INTSTR_LENGTH + strlen (_s), \
+                                 (_f), (_n), (_s))
+
+void die (int) NORETURN;
+void pfatal_with_name (const char *) NORETURN;
+void perror_with_name (const char *, const char *);
+#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
+void *xmalloc (size_t);
+void *xcalloc (size_t);
+void *xrealloc (void *, size_t);
+char *xstrdup (const char *);
+char *xstrndup (const char *, size_t);
+char *find_next_token (const char **, size_t *);
+char *next_token (const char *);
+char *end_of_token (const char *);
+void collapse_continuations (char *);
+char *lindex (const char *, const char *, int);
+int alpha_compare (const void *, const void *);
+void print_spaces (unsigned int);
+char *find_percent (char *);
+const char *find_percent_cached (const char **);
+FILE *get_tmpfile (char **, const char *);
+ssize_t writebuf (int, const void *, size_t);
+ssize_t readbuf (int, void *, size_t);
+
+#ifndef HAVE_MEMRCHR
+void *memrchr(const void *, int, size_t);
+#endif
+
+#ifndef NO_ARCHIVES
+int ar_name (const char *);
+void ar_parse_name (const char *, char **, char **);
+int ar_touch (const char *);
+time_t ar_member_date (const char *);
+
+typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated,
+                                      long int hdrpos, long int datapos,
+                                      long int size, long int date, int uid,
+                                      int gid, unsigned int mode,
+                                      const void *arg);
+
+long int ar_scan (const char *archive, ar_member_func_t function, const void *arg);
+int ar_name_equal (const char *name, const char *mem, int truncated);
+#ifndef VMS
+int ar_member_touch (const char *arname, const char *memname);
+#endif
+#endif
+
+int dir_file_exists_p (const char *, const char *);
+int file_exists_p (const char *);
+int file_impossible_p (const char *);
+void file_impossible (const char *);
+const char *dir_name (const char *);
+void print_dir_data_base (void);
+void dir_setup_glob (glob_t *);
+void hash_init_directories (void);
+
+void define_default_variables (void);
+void undefine_default_variables (void);
+void set_default_suffixes (void);
+void install_default_suffix_rules (void);
+void install_default_implicit_rules (void);
+
+void build_vpath_lists (void);
+void construct_vpath_list (char *pattern, char *dirpath);
+const char *vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr,
+                          unsigned int* vpath_index, unsigned int* path_index);
+int gpath_search (const char *file, size_t len);
+
+void construct_include_path (const char **arg_dirs);
+
+void user_access (void);
+void make_access (void);
+void child_access (void);
+
+char *strip_whitespace (const char **begpp, const char **endpp);
+
+void show_goal_error (void);
+
+/* String caching  */
+void strcache_init (void);
+void strcache_print_stats (const char *prefix);
+int strcache_iscached (const char *str);
+const char *strcache_add (const char *str);
+const char *strcache_add_len (const char *str, size_t len);
+
+/* Guile support  */
+int guile_gmake_setup (const floc *flocp);
+
+/* Loadable object support.  Sets to the strcached name of the loaded file.  */
+typedef int (*load_func_t)(const floc *flocp);
+int load_file (const floc *flocp, const char **filename, int noerror);
+void unload_file (const char *name);
+
+/* Maintainer mode support */
+#ifdef MAKE_MAINTAINER_MODE
+# define SPIN(_s) spin (_s)
+void spin (const char* suffix);
+#else
+# define SPIN(_s)
+#endif
+
+/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION,
+   because such systems often declare them in header files anyway.  */
+
+#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32)
+
+long int atol ();
+# ifndef VMS
+long int lseek ();
+# endif
+
+# ifdef  HAVE_GETCWD
+#  if !defined(VMS) && !defined(__DECC)
+char *getcwd ();
+#  endif
+# else
+char *getwd ();
+#  define getcwd(buf, len)       getwd (buf)
+# endif
+
+#endif  /* Not GNU C library or POSIX.  */
+
+#if !HAVE_STRCASECMP
+# if HAVE_STRICMP
+#  define strcasecmp stricmp
+# elif HAVE_STRCMPI
+#  define strcasecmp strcmpi
+# else
+/* Create our own, in misc.c */
+int strcasecmp (const char *s1, const char *s2);
+# endif
+#endif
+
+#if !HAVE_STRNCASECMP
+# if HAVE_STRNICMP
+#  define strncasecmp strnicmp
+# elif HAVE_STRNCMPI
+#  define strncasecmp strncmpi
+# else
+/* Create our own, in misc.c */
+int strncasecmp (const char *s1, const char *s2, int n);
+# endif
+#endif
+
+#define OUTPUT_SYNC_NONE    0
+#define OUTPUT_SYNC_LINE    1
+#define OUTPUT_SYNC_TARGET  2
+#define OUTPUT_SYNC_RECURSE 3
+
+/* Non-GNU systems may not declare this in unistd.h.  */
+extern char **environ;
+
+extern const floc *reading_file;
+extern const floc **expanding_var;
+
+extern unsigned short stopchar_map[];
+
+extern int just_print_flag, run_silent, ignore_errors_flag, keep_going_flag;
+extern int print_data_base_flag, question_flag, touch_flag, always_make_flag;
+extern int env_overrides, no_builtin_rules_flag, no_builtin_variables_flag;
+extern int print_version_flag, print_directory_flag, check_symlink_flag;
+extern int warn_undefined_variables_flag, trace_flag, posix_pedantic;
+extern int not_parallel, second_expansion, clock_skew_detected;
+extern int rebuilding_makefiles, one_shell, output_sync, verify_flag;
+
+extern const char *default_shell;
+
+/* can we run commands via 'sh -c xxx' or must we use batch files? */
+extern int batch_mode_shell;
+
+/* Resetting the command script introduction prefix character.  */
+#define RECIPEPREFIX_NAME          ".RECIPEPREFIX"
+#define RECIPEPREFIX_DEFAULT       '\t'
+extern char cmd_prefix;
+
+extern unsigned int job_slots;
+extern double max_load_average;
+
+extern const char *program;
+
+#ifdef VMS
+const char *vms_command (const char *argv0);
+const char *vms_progname (const char *argv0);
+
+void vms_exit (int);
+# define _exit(foo) vms_exit(foo)
+# define exit(foo) vms_exit(foo)
+
+extern char *program_name;
+
+void
+set_program_name (const char *arv0);
+
+int
+need_vms_symbol (void);
+
+int
+create_foreign_command (const char *command, const char *image);
+
+int
+vms_export_dcl_symbol (const char *name, const char *value);
+
+int
+vms_putenv_symbol (const char *string);
+
+void
+vms_restore_symbol (const char *string);
+
+#endif
+
+void remote_setup (void);
+void remote_cleanup (void);
+int start_remote_job_p (int);
+int start_remote_job (char **, char **, int, int *, pid_t *, int *);
+int remote_status (int *, int *, int *, int);
+void block_remote_children (void);
+void unblock_remote_children (void);
+int remote_kill (pid_t id, int sig);
+void print_variable_data_base (void);
+void print_vpath_data_base (void);
+
+extern char *starting_directory;
+extern unsigned int makelevel;
+extern char *version_string, *remote_description, *make_host;
+
+extern unsigned int commands_started;
+
+extern int handling_fatal_signal;
+
+#ifndef MIN
+#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b))
+#endif
+#ifndef MAX
+#define MAX(_a,_b) ((_a)>(_b)?(_a):(_b))
+#endif
+
+#define MAKE_SUCCESS 0
+#define MAKE_TROUBLE 1
+#define MAKE_FAILURE 2
+
+/* Set up heap debugging library dmalloc.  */
+
+#ifdef HAVE_DMALLOC_H
+#include <dmalloc.h>
+#endif
+
+#ifndef initialize_main
+# ifdef __EMX__
+#  define initialize_main(pargc, pargv) \
+                          { _wildcard(pargc, pargv); _response(pargc, pargv); }
+# else
+#  define initialize_main(pargc, pargv)
+# endif
+#endif
+
+#ifdef __EMX__
+# if !defined chdir
+#  define chdir _chdir2
+# endif
+# if !defined getcwd
+#  define getcwd _getcwd2
+# endif
+
+/* NO_CHDIR2 causes make not to use _chdir2() and _getcwd2() instead of
+   chdir() and getcwd(). This avoids some error messages for the
+   make testsuite but restricts the drive letter support. */
+# ifdef NO_CHDIR2
+#  warning NO_CHDIR2: usage of drive letters restricted
+#  undef chdir
+#  undef getcwd
+# endif
+#endif
+
+#ifndef initialize_main
+# define initialize_main(pargc, pargv)
+#endif
+
+
+/* Some systems (like Solaris, PTX, etc.) do not support the SA_RESTART flag
+   properly according to POSIX.  So, we try to wrap common system calls with
+   checks for EINTR.  Note that there are still plenty of system calls that
+   can fail with EINTR but this, reportedly, gets the vast majority of
+   failure cases.  If you still experience failures you'll need to either get
+   a system where SA_RESTART works, or you need to avoid -j.  */
+
+#define EINTRLOOP(_v,_c)   while (((_v)=_c)==-1 && errno==EINTR)
+
+/* While system calls that return integers are pretty consistent about
+   returning -1 on failure and setting errno in that case, functions that
+   return pointers are not always so well behaved.  Sometimes they return
+   NULL for expected behavior: one good example is readdir() which returns
+   NULL at the end of the directory--and _doesn't_ reset errno.  So, we have
+   to do it ourselves here.  */
+
+#define ENULLLOOP(_v,_c)   do { errno = 0; (_v) = _c; } \
+                           while((_v)==0 && errno==EINTR)
diff --git a/src/misc.c b/src/misc.c
new file mode 100644 (file)
index 0000000..de19e37
--- /dev/null
@@ -0,0 +1,847 @@
+/* Miscellaneous generic support functions for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "dep.h"
+#include "debug.h"
+
+/* GNU make no longer supports pre-ANSI89 environments.  */
+
+#include <stdarg.h>
+
+#ifdef WINDOWS32
+# include <windows.h>
+# include <io.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#else
+# include <sys/file.h>
+#endif
+
+/* Compare strings *S1 and *S2.
+   Return negative if the first is less, positive if it is greater,
+   zero if they are equal.  */
+
+int
+alpha_compare (const void *v1, const void *v2)
+{
+  const char *s1 = *((char **)v1);
+  const char *s2 = *((char **)v2);
+
+  if (*s1 != *s2)
+    return *s1 - *s2;
+  return strcmp (s1, s2);
+}
+\f
+/* Discard each backslash-newline combination from LINE.
+   Backslash-backslash-newline combinations become backslash-newlines.
+   This is done by copying the text at LINE into itself.  */
+
+void
+collapse_continuations (char *line)
+{
+  char *out = line;
+  char *in = line;
+  char *q;
+
+  q = strchr(in, '\n');
+  if (q == 0)
+    return;
+
+  do
+    {
+      char *p = q;
+      int i;
+      size_t out_line_length;
+
+      if (q > line && q[-1] == '\\')
+        {
+          /* Search for more backslashes.  */
+          i = -2;
+          while (&p[i] >= line && p[i] == '\\')
+            --i;
+          ++i;
+        }
+      else
+        i = 0;
+
+      /* The number of backslashes is now -I, keep half of them.  */
+      out_line_length = (p - in) + i - i/2;
+      if (out != in)
+        memmove (out, in, out_line_length);
+      out += out_line_length;
+
+      /* When advancing IN, skip the newline too.  */
+      in = q + 1;
+
+      if (i & 1)
+        {
+          /* Backslash/newline handling:
+             In traditional GNU make all trailing whitespace, consecutive
+             backslash/newlines, and any leading non-newline whitespace on the
+             next line is reduced to a single space.
+             In POSIX, each backslash/newline and is replaced by a space.  */
+          while (ISBLANK (*in))
+            ++in;
+          if (! posix_pedantic)
+            while (out > line && ISBLANK (out[-1]))
+              --out;
+          *out++ = ' ';
+        }
+      else
+        {
+          /* If the newline isn't quoted, put it in the output.  */
+          *out++ = '\n';
+        }
+
+      q = strchr(in, '\n');
+    }
+  while (q);
+
+  memmove(out, in, strlen(in) + 1);
+}
+\f
+/* Print N spaces (used in debug for target-depth).  */
+
+void
+print_spaces (unsigned int n)
+{
+  while (n-- > 0)
+    putchar (' ');
+}
+
+\f
+/* Return a string whose contents concatenate the NUM strings provided
+   This string lives in static, re-used memory.  */
+
+const char *
+concat (unsigned int num, ...)
+{
+  static size_t rlen = 0;
+  static char *result = NULL;
+  size_t ri = 0;
+  va_list args;
+
+  va_start (args, num);
+
+  while (num-- > 0)
+    {
+      const char *s = va_arg (args, const char *);
+      size_t l = xstrlen (s);
+
+      if (l == 0)
+        continue;
+
+      if (ri + l > rlen)
+        {
+          rlen = ((rlen ? rlen : 60) + l) * 2;
+          result = xrealloc (result, rlen);
+        }
+
+      memcpy (result + ri, s, l);
+      ri += l;
+    }
+
+  va_end (args);
+
+  /* Get some more memory if we don't have enough space for the
+     terminating '\0'.   */
+  if (ri == rlen)
+    {
+      rlen = (rlen ? rlen : 60) * 2;
+      result = xrealloc (result, rlen);
+    }
+
+  result[ri] = '\0';
+
+  return result;
+}
+\f
+/* Like malloc but get fatal error if memory is exhausted.  */
+/* Don't bother if we're using dmalloc; it provides these for us.  */
+
+#ifndef HAVE_DMALLOC_H
+
+#undef xmalloc
+#undef xcalloc
+#undef xrealloc
+#undef xstrdup
+
+void *
+xmalloc (size_t size)
+{
+  /* Make sure we don't allocate 0, for pre-ISO implementations.  */
+  void *result = malloc (size ? size : 1);
+  if (result == 0)
+    out_of_memory ();
+  return result;
+}
+
+
+void *
+xcalloc (size_t size)
+{
+  /* Make sure we don't allocate 0, for pre-ISO implementations.  */
+  void *result = calloc (size ? size : 1, 1);
+  if (result == 0)
+    out_of_memory ();
+  return result;
+}
+
+
+void *
+xrealloc (void *ptr, size_t size)
+{
+  void *result;
+
+  /* Some older implementations of realloc() don't conform to ISO.  */
+  if (! size)
+    size = 1;
+  result = ptr ? realloc (ptr, size) : malloc (size);
+  if (result == 0)
+    out_of_memory ();
+  return result;
+}
+
+
+char *
+xstrdup (const char *ptr)
+{
+  char *result;
+
+#ifdef HAVE_STRDUP
+  result = strdup (ptr);
+#else
+  result = malloc (strlen (ptr) + 1);
+#endif
+
+  if (result == 0)
+    out_of_memory ();
+
+#ifdef HAVE_STRDUP
+  return result;
+#else
+  return strcpy (result, ptr);
+#endif
+}
+
+#endif  /* HAVE_DMALLOC_H */
+
+char *
+xstrndup (const char *str, size_t length)
+{
+  char *result;
+
+#ifdef HAVE_STRNDUP
+  result = strndup (str, length);
+  if (result == 0)
+    out_of_memory ();
+#else
+  result = xmalloc (length + 1);
+  if (length > 0)
+    strncpy (result, str, length);
+  result[length] = '\0';
+#endif
+
+  return result;
+}
+
+#ifndef HAVE_MEMRCHR
+void *
+memrchr(const void* str, int ch, size_t len)
+{
+  const char* sp = str;
+  const char* cp = sp;
+
+  if (len == 0)
+    return NULL;
+
+  cp += len - 1;
+
+  while (cp[0] != ch)
+    {
+      if (cp == sp)
+        return NULL;
+      --cp;
+    }
+
+  return (void*)cp;
+}
+#endif
+
+\f
+
+/* Limited INDEX:
+   Search through the string STRING, which ends at LIMIT, for the character C.
+   Returns a pointer to the first occurrence, or nil if none is found.
+   Like INDEX except that the string searched ends where specified
+   instead of at the first null.  */
+
+char *
+lindex (const char *s, const char *limit, int c)
+{
+  while (s < limit)
+    if (*s++ == c)
+      return (char *)(s - 1);
+
+  return 0;
+}
+\f
+/* Return the address of the first whitespace or null in the string S.  */
+
+char *
+end_of_token (const char *s)
+{
+  END_OF_TOKEN (s);
+  return (char *)s;
+}
+
+/* Return the address of the first nonwhitespace or null in the string S.  */
+
+char *
+next_token (const char *s)
+{
+  NEXT_TOKEN (s);
+  return (char *)s;
+}
+
+/* Find the next token in PTR; return the address of it, and store the length
+   of the token into *LENGTHPTR if LENGTHPTR is not nil.  Set *PTR to the end
+   of the token, so this function can be called repeatedly in a loop.  */
+
+char *
+find_next_token (const char **ptr, size_t *lengthptr)
+{
+  const char *p = next_token (*ptr);
+
+  if (*p == '\0')
+    return 0;
+
+  *ptr = end_of_token (p);
+  if (lengthptr != 0)
+    *lengthptr = *ptr - p;
+
+  return (char *)p;
+}
+\f
+/* Write a BUFFER of size LEN to file descriptor FD.
+   Retry short writes from EINTR.  Return LEN, or -1 on error.  */
+ssize_t
+writebuf (int fd, const void *buffer, size_t len)
+{
+  const char *msg = buffer;
+  size_t l = len;
+  while (l)
+    {
+      ssize_t r;
+
+      EINTRLOOP (r, write (fd, msg, l));
+      if (r < 0)
+        return r;
+
+      l -= r;
+      msg += r;
+    }
+
+  return (ssize_t)len;
+}
+
+/* Read until we get LEN bytes from file descriptor FD, into BUFFER.
+   Retry short reads on EINTR.  If we get an error, return it.
+   Return 0 at EOF.  */
+ssize_t
+readbuf (int fd, void *buffer, size_t len)
+{
+  char *msg = buffer;
+  while (len)
+    {
+      ssize_t r;
+
+      EINTRLOOP (r, read (fd, msg, len));
+      if (r < 0)
+        return r;
+      if (r == 0)
+        break;
+
+      len -= r;
+      msg += r;
+    }
+
+  return (ssize_t)(msg - (char*)buffer);
+}
+\f
+
+/* Copy a chain of 'struct dep'.  For 2nd expansion deps, dup the name.  */
+
+struct dep *
+copy_dep_chain (const struct dep *d)
+{
+  struct dep *firstnew = 0;
+  struct dep *lastnew = 0;
+
+  while (d != 0)
+    {
+      struct dep *c = xmalloc (sizeof (struct dep));
+      memcpy (c, d, sizeof (struct dep));
+
+      if (c->need_2nd_expansion)
+        c->name = xstrdup (c->name);
+
+      c->next = 0;
+      if (firstnew == 0)
+        firstnew = lastnew = c;
+      else
+        lastnew = lastnew->next = c;
+
+      d = d->next;
+    }
+
+  return firstnew;
+}
+
+/* Free a chain of struct nameseq.
+   For struct dep chains use free_dep_chain.  */
+
+void
+free_ns_chain (struct nameseq *ns)
+{
+  while (ns != 0)
+    {
+      struct nameseq *t = ns;
+      ns = ns->next;
+      free_ns (t);
+    }
+}
+\f
+
+#ifdef MAKE_MAINTAINER_MODE
+
+void
+spin (const char* type)
+{
+  char filenm[256];
+  struct stat dummy;
+
+  sprintf (filenm, ".make-spin-%s", type);
+
+  if (stat (filenm, &dummy) == 0)
+    {
+      fprintf (stderr, "SPIN on %s\n", filenm);
+      do
+#ifdef WINDOWS32
+        Sleep (1000);
+#else
+        sleep (1);
+#endif
+      while (stat (filenm, &dummy) == 0);
+    }
+}
+
+#endif
+
+\f
+
+/* Provide support for temporary files.  */
+
+#ifndef HAVE_STDLIB_H
+# ifdef HAVE_MKSTEMP
+int mkstemp (char *template);
+# else
+char *mktemp (char *template);
+# endif
+#endif
+
+#ifndef HAVE_UMASK
+mode_t
+umask (mode_t mask)
+{
+  return 0;
+}
+#endif
+
+FILE *
+get_tmpfile (char **name, const char *template)
+{
+  FILE *file;
+#ifdef HAVE_FDOPEN
+  int fd;
+#endif
+
+  /* Preserve the current umask, and set a restrictive one for temp files.  */
+  mode_t mask = umask (0077);
+
+#if defined(HAVE_MKSTEMP) || defined(HAVE_MKTEMP)
+# define TEMPLATE_LEN   strlen (template)
+#else
+# define TEMPLATE_LEN   L_tmpnam
+#endif
+  *name = xmalloc (TEMPLATE_LEN + 1);
+  strcpy (*name, template);
+
+#if defined(HAVE_MKSTEMP) && defined(HAVE_FDOPEN)
+  /* It's safest to use mkstemp(), if we can.  */
+  EINTRLOOP (fd, mkstemp (*name));
+  if (fd == -1)
+    file = NULL;
+  else
+    file = fdopen (fd, "w");
+#else
+# ifdef HAVE_MKTEMP
+  (void) mktemp (*name);
+# else
+  (void) tmpnam (*name);
+# endif
+
+# ifdef HAVE_FDOPEN
+  /* Can't use mkstemp(), but guard against a race condition.  */
+  EINTRLOOP (fd, open (*name, O_CREAT|O_EXCL|O_WRONLY, 0600));
+  if (fd == -1)
+    return 0;
+  file = fdopen (fd, "w");
+# else
+  /* Not secure, but what can we do?  */
+  file = fopen (*name, "w");
+# endif
+#endif
+
+  umask (mask);
+
+  return file;
+}
+\f
+
+#if !HAVE_STRCASECMP && !HAVE_STRICMP && !HAVE_STRCMPI
+/* If we don't have strcasecmp() (from POSIX), or anything that can substitute
+   for it, define our own version.  */
+
+int
+strcasecmp (const char *s1, const char *s2)
+{
+  while (1)
+    {
+      int c1 = (int) *(s1++);
+      int c2 = (int) *(s2++);
+
+      if (isalpha (c1))
+        c1 = tolower (c1);
+      if (isalpha (c2))
+        c2 = tolower (c2);
+
+      if (c1 != '\0' && c1 == c2)
+        continue;
+
+      return (c1 - c2);
+    }
+}
+#endif
+
+#if !HAVE_STRNCASECMP && !HAVE_STRNICMP && !HAVE_STRNCMPI
+/* If we don't have strncasecmp() (from POSIX), or anything that can
+   substitute for it, define our own version.  */
+
+int
+strncasecmp (const char *s1, const char *s2, int n)
+{
+  while (n-- > 0)
+    {
+      int c1 = (int) *(s1++);
+      int c2 = (int) *(s2++);
+
+      if (isalpha (c1))
+        c1 = tolower (c1);
+      if (isalpha (c2))
+        c2 = tolower (c2);
+
+      if (c1 != '\0' && c1 == c2)
+        continue;
+
+      return (c1 - c2);
+    }
+
+  return 0;
+}
+#endif
+\f
+#ifdef  GETLOADAVG_PRIVILEGED
+
+#ifdef POSIX
+
+/* Hopefully if a system says it's POSIX.1 and has the setuid and setgid
+   functions, they work as POSIX.1 says.  Some systems (Alpha OSF/1 1.2,
+   for example) which claim to be POSIX.1 also have the BSD setreuid and
+   setregid functions, but they don't work as in BSD and only the POSIX.1
+   way works.  */
+
+#undef HAVE_SETREUID
+#undef HAVE_SETREGID
+
+#else   /* Not POSIX.  */
+
+/* Some POSIX.1 systems have the seteuid and setegid functions.  In a
+   POSIX-like system, they are the best thing to use.  However, some
+   non-POSIX systems have them too but they do not work in the POSIX style
+   and we must use setreuid and setregid instead.  */
+
+#undef HAVE_SETEUID
+#undef HAVE_SETEGID
+
+#endif  /* POSIX.  */
+
+#ifndef HAVE_UNISTD_H
+extern int getuid (), getgid (), geteuid (), getegid ();
+extern int setuid (), setgid ();
+#ifdef HAVE_SETEUID
+extern int seteuid ();
+#else
+#ifdef  HAVE_SETREUID
+extern int setreuid ();
+#endif  /* Have setreuid.  */
+#endif  /* Have seteuid.  */
+#ifdef HAVE_SETEGID
+extern int setegid ();
+#else
+#ifdef  HAVE_SETREGID
+extern int setregid ();
+#endif  /* Have setregid.  */
+#endif  /* Have setegid.  */
+#endif  /* No <unistd.h>.  */
+
+/* Keep track of the user and group IDs for user- and make- access.  */
+static int user_uid = -1, user_gid = -1, make_uid = -1, make_gid = -1;
+#define access_inited   (user_uid != -1)
+static enum { make, user } current_access;
+
+
+/* Under -d, write a message describing the current IDs.  */
+
+static void
+log_access (const char *flavor)
+{
+  if (! ISDB (DB_JOBS))
+    return;
+
+  /* All the other debugging messages go to stdout,
+     but we write this one to stderr because it might be
+     run in a child fork whose stdout is piped.  */
+
+  fprintf (stderr, _("%s: user %lu (real %lu), group %lu (real %lu)\n"),
+           flavor, (unsigned long) geteuid (), (unsigned long) getuid (),
+           (unsigned long) getegid (), (unsigned long) getgid ());
+  fflush (stderr);
+}
+
+
+static void
+init_access (void)
+{
+#ifndef VMS
+  user_uid = getuid ();
+  user_gid = getgid ();
+
+  make_uid = geteuid ();
+  make_gid = getegid ();
+
+  /* Do these ever fail?  */
+  if (user_uid == -1 || user_gid == -1 || make_uid == -1 || make_gid == -1)
+    pfatal_with_name ("get{e}[gu]id");
+
+  log_access (_("Initialized access"));
+
+  current_access = make;
+#endif
+}
+
+#endif  /* GETLOADAVG_PRIVILEGED */
+
+/* Give the process appropriate permissions for access to
+   user data (i.e., to stat files, or to spawn a child process).  */
+void
+user_access (void)
+{
+#ifdef  GETLOADAVG_PRIVILEGED
+
+  if (!access_inited)
+    init_access ();
+
+  if (current_access == user)
+    return;
+
+  /* We are in "make access" mode.  This means that the effective user and
+     group IDs are those of make (if it was installed setuid or setgid).
+     We now want to set the effective user and group IDs to the real IDs,
+     which are the IDs of the process that exec'd make.  */
+
+#ifdef  HAVE_SETEUID
+
+  /* Modern systems have the seteuid/setegid calls which set only the
+     effective IDs, which is ideal.  */
+
+  if (seteuid (user_uid) < 0)
+    pfatal_with_name ("user_access: seteuid");
+
+#else   /* Not HAVE_SETEUID.  */
+
+#ifndef HAVE_SETREUID
+
+  /* System V has only the setuid/setgid calls to set user/group IDs.
+     There is an effective ID, which can be set by setuid/setgid.
+     It can be set (unless you are root) only to either what it already is
+     (returned by geteuid/getegid, now in make_uid/make_gid),
+     the real ID (return by getuid/getgid, now in user_uid/user_gid),
+     or the saved set ID (what the effective ID was before this set-ID
+     executable (make) was exec'd).  */
+
+  if (setuid (user_uid) < 0)
+    pfatal_with_name ("user_access: setuid");
+
+#else   /* HAVE_SETREUID.  */
+
+  /* In 4BSD, the setreuid/setregid calls set both the real and effective IDs.
+     They may be set to themselves or each other.  So you have two alternatives
+     at any one time.  If you use setuid/setgid, the effective will be set to
+     the real, leaving only one alternative.  Using setreuid/setregid, however,
+     you can toggle between your two alternatives by swapping the values in a
+     single setreuid or setregid call.  */
+
+  if (setreuid (make_uid, user_uid) < 0)
+    pfatal_with_name ("user_access: setreuid");
+
+#endif  /* Not HAVE_SETREUID.  */
+#endif  /* HAVE_SETEUID.  */
+
+#ifdef  HAVE_SETEGID
+  if (setegid (user_gid) < 0)
+    pfatal_with_name ("user_access: setegid");
+#else
+#ifndef HAVE_SETREGID
+  if (setgid (user_gid) < 0)
+    pfatal_with_name ("user_access: setgid");
+#else
+  if (setregid (make_gid, user_gid) < 0)
+    pfatal_with_name ("user_access: setregid");
+#endif
+#endif
+
+  current_access = user;
+
+  log_access (_("User access"));
+
+#endif  /* GETLOADAVG_PRIVILEGED */
+}
+
+/* Give the process appropriate permissions for access to
+   make data (i.e., the load average).  */
+void
+make_access (void)
+{
+#ifdef  GETLOADAVG_PRIVILEGED
+
+  if (!access_inited)
+    init_access ();
+
+  if (current_access == make)
+    return;
+
+  /* See comments in user_access, above.  */
+
+#ifdef  HAVE_SETEUID
+  if (seteuid (make_uid) < 0)
+    pfatal_with_name ("make_access: seteuid");
+#else
+#ifndef HAVE_SETREUID
+  if (setuid (make_uid) < 0)
+    pfatal_with_name ("make_access: setuid");
+#else
+  if (setreuid (user_uid, make_uid) < 0)
+    pfatal_with_name ("make_access: setreuid");
+#endif
+#endif
+
+#ifdef  HAVE_SETEGID
+  if (setegid (make_gid) < 0)
+    pfatal_with_name ("make_access: setegid");
+#else
+#ifndef HAVE_SETREGID
+  if (setgid (make_gid) < 0)
+    pfatal_with_name ("make_access: setgid");
+#else
+  if (setregid (user_gid, make_gid) < 0)
+    pfatal_with_name ("make_access: setregid");
+#endif
+#endif
+
+  current_access = make;
+
+  log_access (_("Make access"));
+
+#endif  /* GETLOADAVG_PRIVILEGED */
+}
+
+/* Give the process appropriate permissions for a child process.
+   This is like user_access, but you can't get back to make_access.  */
+void
+child_access (void)
+{
+#ifdef  GETLOADAVG_PRIVILEGED
+
+  if (!access_inited)
+    abort ();
+
+  /* Set both the real and effective UID and GID to the user's.
+     They cannot be changed back to make's.  */
+
+#ifndef HAVE_SETREUID
+  if (setuid (user_uid) < 0)
+    pfatal_with_name ("child_access: setuid");
+#else
+  if (setreuid (user_uid, user_uid) < 0)
+    pfatal_with_name ("child_access: setreuid");
+#endif
+
+#ifndef HAVE_SETREGID
+  if (setgid (user_gid) < 0)
+    pfatal_with_name ("child_access: setgid");
+#else
+  if (setregid (user_gid, user_gid) < 0)
+    pfatal_with_name ("child_access: setregid");
+#endif
+
+  log_access (_("Child access"));
+
+#endif  /* GETLOADAVG_PRIVILEGED */
+}
+
+#ifdef NEED_GET_PATH_MAX
+unsigned int
+get_path_max (void)
+{
+  static unsigned int value;
+
+  if (value == 0)
+    {
+      long int x = pathconf ("/", _PC_PATH_MAX);
+      if (x > 0)
+        value = x;
+      else
+        return MAXPATHLEN;
+    }
+
+  return value;
+}
+#endif
diff --git a/src/os.h b/src/os.h
new file mode 100644 (file)
index 0000000..e7bf37a
--- /dev/null
+++ b/src/os.h
@@ -0,0 +1,93 @@
+/* Declarations for operating system interfaces for GNU Make.
+Copyright (C) 2016-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* This section provides OS-specific functions to support the jobserver.  */
+
+#ifdef MAKE_JOBSERVER
+
+/* Returns 1 if the jobserver is enabled, else 0.  */
+unsigned int jobserver_enabled (void);
+
+/* Called in the master instance to set up the jobserver initially.  */
+unsigned int jobserver_setup (int job_slots);
+
+/* Called in a child instance to connect to the jobserver.  */
+unsigned int jobserver_parse_auth (const char* auth);
+
+/* Returns an allocated buffer used to pass to child instances.  */
+char *jobserver_get_auth (void);
+
+/* Clear this instance's jobserver configuration.  */
+void jobserver_clear (void);
+
+/* Recover all the jobserver tokens and return the number we got.  */
+unsigned int jobserver_acquire_all (void);
+
+/* Release a jobserver token.  If it fails and is_fatal is 1, fatal.  */
+void jobserver_release (int is_fatal);
+
+/* Notify the jobserver that a child exited.  */
+void jobserver_signal (void);
+
+/* Get ready to start a non-recursive child.  */
+void jobserver_pre_child (int);
+
+/* Complete starting a non-recursive child.  */
+void jobserver_post_child (int);
+
+/* Set up to acquire a new token.  */
+void jobserver_pre_acquire (void);
+
+/* Wait until we can acquire a jobserver token.
+   TIMEOUT is 1 if we have other jobs waiting for the load to go down;
+   in this case we won't wait forever, so we can check the load.
+   Returns 1 if we got a token, or 0 if we stopped waiting due to a child
+   exiting or a timeout.    */
+unsigned int jobserver_acquire (int timeout);
+
+#else
+
+#define jobserver_enabled()         (0)
+#define jobserver_setup(_slots)     (0)
+#define jobserver_parse_auth(_auth) (0)
+#define jobserver_get_auth()        (NULL)
+#define jobserver_clear()           (void)(0)
+#define jobserver_release(_fatal)   (void)(0)
+#define jobserver_acquire_all()     (0)
+#define jobserver_signal()          (void)(0)
+#define jobserver_pre_child(_r)     (void)(0)
+#define jobserver_post_child(_r)    (void)(0)
+#define jobserver_pre_acquire()     (void)(0)
+#define jobserver_acquire(_tmout)   (0)
+
+#endif
+
+/* Create a "bad" file descriptor for stdin when parallel jobs are run.  */
+#if defined(VMS) || defined(WINDOWS32) || defined(_AMIGA) || defined(__MSDOS__)
+# define get_bad_stdin() (-1)
+#else
+int get_bad_stdin (void);
+#endif
+
+/* Set a file descriptor to close/not close in a subprocess.  */
+#if defined(VMS) || defined(_AMIGA) || defined(__MSDOS__)
+# define fd_inherit(_i)   0
+# define fd_noinherit(_i) 0
+#else
+void fd_inherit (int);
+void fd_noinherit (int);
+#endif
diff --git a/src/output.c b/src/output.c
new file mode 100644 (file)
index 0000000..2211749
--- /dev/null
@@ -0,0 +1,682 @@
+/* Output to stdout / stderr for GNU make
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "os.h"
+#include "output.h"
+
+/* GNU make no longer supports pre-ANSI89 environments.  */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdarg.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#else
+# include <sys/file.h>
+#endif
+
+#ifdef WINDOWS32
+# include <windows.h>
+# include <io.h>
+# include "sub_proc.h"
+#endif /* WINDOWS32 */
+
+struct output *output_context = NULL;
+unsigned int stdio_traced = 0;
+
+#define OUTPUT_NONE (-1)
+
+#define OUTPUT_ISSET(_out) ((_out)->out >= 0 || (_out)->err >= 0)
+
+#ifdef HAVE_FCNTL_H
+# define STREAM_OK(_s) ((fcntl (fileno (_s), F_GETFD) != -1) || (errno != EBADF))
+#else
+# define STREAM_OK(_s) 1
+#endif
+
+/* Write a string to the current STDOUT or STDERR.  */
+static void
+_outputs (struct output *out, int is_err, const char *msg)
+{
+  if (! out || ! out->syncout)
+    {
+      FILE *f = is_err ? stderr : stdout;
+      fputs (msg, f);
+      fflush (f);
+    }
+  else
+    {
+      int fd = is_err ? out->err : out->out;
+      size_t len = strlen (msg);
+      int r;
+      EINTRLOOP (r, lseek (fd, 0, SEEK_END));
+      writebuf (fd, msg, len);
+    }
+}
+\f
+/* Write a message indicating that we've just entered or
+   left (according to ENTERING) the current directory.  */
+
+static int
+log_working_directory (int entering)
+{
+  static char *buf = NULL;
+  static size_t len = 0;
+  size_t need;
+  const char *fmt;
+  char *p;
+
+  /* Get enough space for the longest possible output.  */
+  need = strlen (program) + INTSTR_LENGTH + 2 + 1;
+  if (starting_directory)
+    need += strlen (starting_directory);
+
+  /* Use entire sentences to give the translators a fighting chance.  */
+  if (makelevel == 0)
+    if (starting_directory == 0)
+      if (entering)
+        fmt = _("%s: Entering an unknown directory\n");
+      else
+        fmt = _("%s: Leaving an unknown directory\n");
+    else
+      if (entering)
+        fmt = _("%s: Entering directory '%s'\n");
+      else
+        fmt = _("%s: Leaving directory '%s'\n");
+  else
+    if (starting_directory == 0)
+      if (entering)
+        fmt = _("%s[%u]: Entering an unknown directory\n");
+      else
+        fmt = _("%s[%u]: Leaving an unknown directory\n");
+    else
+      if (entering)
+        fmt = _("%s[%u]: Entering directory '%s'\n");
+      else
+        fmt = _("%s[%u]: Leaving directory '%s'\n");
+
+  need += strlen (fmt);
+
+  if (need > len)
+    {
+      buf = xrealloc (buf, need);
+      len = need;
+    }
+
+  p = buf;
+  if (print_data_base_flag)
+    {
+      *(p++) = '#';
+      *(p++) = ' ';
+    }
+
+  if (makelevel == 0)
+    if (starting_directory == 0)
+      sprintf (p, fmt , program);
+    else
+      sprintf (p, fmt, program, starting_directory);
+  else if (starting_directory == 0)
+    sprintf (p, fmt, program, makelevel);
+  else
+    sprintf (p, fmt, program, makelevel, starting_directory);
+
+  _outputs (NULL, 0, buf);
+
+  return 1;
+}
+
+/* Set a file descriptor to be in O_APPEND mode.
+   If it fails, just ignore it.  */
+
+static void
+set_append_mode (int fd)
+{
+#if defined(F_GETFL) && defined(F_SETFL) && defined(O_APPEND)
+  int flags = fcntl (fd, F_GETFL, 0);
+  if (flags >= 0)
+    {
+      int r;
+      EINTRLOOP(r, fcntl (fd, F_SETFL, flags | O_APPEND));
+    }
+#endif
+}
+\f
+
+#ifndef NO_OUTPUT_SYNC
+
+/* Semaphore for use in -j mode with output_sync. */
+static sync_handle_t sync_handle = -1;
+
+#define FD_NOT_EMPTY(_f) ((_f) != OUTPUT_NONE && lseek ((_f), 0, SEEK_END) > 0)
+
+/* Set up the sync handle.  Disables output_sync on error.  */
+static int
+sync_init (void)
+{
+  int combined_output = 0;
+
+#ifdef WINDOWS32
+  if ((!STREAM_OK (stdout) && !STREAM_OK (stderr))
+      || (sync_handle = create_mutex ()) == -1)
+    {
+      perror_with_name ("output-sync suppressed: ", "stderr");
+      output_sync = 0;
+    }
+  else
+    {
+      combined_output = same_stream (stdout, stderr);
+      prepare_mutex_handle_string (sync_handle);
+    }
+
+#else
+  if (STREAM_OK (stdout))
+    {
+      struct stat stbuf_o, stbuf_e;
+
+      sync_handle = fileno (stdout);
+      combined_output = (fstat (fileno (stdout), &stbuf_o) == 0
+                         && fstat (fileno (stderr), &stbuf_e) == 0
+                         && stbuf_o.st_dev == stbuf_e.st_dev
+                         && stbuf_o.st_ino == stbuf_e.st_ino);
+    }
+  else if (STREAM_OK (stderr))
+    sync_handle = fileno (stderr);
+  else
+    {
+      perror_with_name ("output-sync suppressed: ", "stderr");
+      output_sync = 0;
+    }
+#endif
+
+  return combined_output;
+}
+
+/* Support routine for output_sync() */
+static void
+pump_from_tmp (int from, FILE *to)
+{
+  static char buffer[8192];
+
+#ifdef WINDOWS32
+  int prev_mode;
+
+  /* "from" is opened by open_tmpfd, which does it in binary mode, so
+     we need the mode of "to" to match that.  */
+  prev_mode = _setmode (fileno (to), _O_BINARY);
+#endif
+
+  if (lseek (from, 0, SEEK_SET) == -1)
+    perror ("lseek()");
+
+  while (1)
+    {
+      int len;
+      EINTRLOOP (len, read (from, buffer, sizeof (buffer)));
+      if (len < 0)
+        perror ("read()");
+      if (len <= 0)
+        break;
+      if (fwrite (buffer, len, 1, to) < 1)
+        {
+          perror ("fwrite()");
+          break;
+        }
+      fflush (to);
+    }
+
+#ifdef WINDOWS32
+  /* Switch "to" back to its original mode, so that log messages by
+     Make have the same EOL format as without --output-sync.  */
+  _setmode (fileno (to), prev_mode);
+#endif
+}
+
+/* Obtain the lock for writing output.  */
+static void *
+acquire_semaphore (void)
+{
+  static struct flock fl;
+
+  fl.l_type = F_WRLCK;
+  fl.l_whence = SEEK_SET;
+  fl.l_start = 0;
+  fl.l_len = 1;
+  if (fcntl (sync_handle, F_SETLKW, &fl) != -1)
+    return &fl;
+  perror ("fcntl()");
+  return NULL;
+}
+
+/* Release the lock for writing output.  */
+static void
+release_semaphore (void *sem)
+{
+  struct flock *flp = (struct flock *)sem;
+  flp->l_type = F_UNLCK;
+  if (fcntl (sync_handle, F_SETLKW, flp) == -1)
+    perror ("fcntl()");
+}
+
+/* Returns a file descriptor to a temporary file.  The file is automatically
+   closed/deleted on exit.  Don't use a FILE* stream.  */
+int
+output_tmpfd (void)
+{
+  mode_t mask = umask (0077);
+  int fd = -1;
+  FILE *tfile = tmpfile ();
+
+  if (! tfile)
+    pfatal_with_name ("tmpfile");
+
+  /* Create a duplicate so we can close the stream.  */
+  fd = dup (fileno (tfile));
+  if (fd < 0)
+    pfatal_with_name ("dup");
+
+  fclose (tfile);
+
+  set_append_mode (fd);
+
+  umask (mask);
+
+  return fd;
+}
+
+/* Adds file descriptors to the child structure to support output_sync; one
+   for stdout and one for stderr as long as they are open.  If stdout and
+   stderr share a device they can share a temp file too.
+   Will reset output_sync on error.  */
+static void
+setup_tmpfile (struct output *out)
+{
+  /* Is make's stdout going to the same place as stderr?  */
+  static int combined_output = -1;
+
+  if (combined_output < 0)
+    combined_output = sync_init ();
+
+  if (STREAM_OK (stdout))
+    {
+      int fd = output_tmpfd ();
+      if (fd < 0)
+        goto error;
+      fd_noinherit (fd);
+      out->out = fd;
+    }
+
+  if (STREAM_OK (stderr))
+    {
+      if (out->out != OUTPUT_NONE && combined_output)
+        out->err = out->out;
+      else
+        {
+          int fd = output_tmpfd ();
+          if (fd < 0)
+            goto error;
+          fd_noinherit (fd);
+          out->err = fd;
+        }
+    }
+
+  return;
+
+  /* If we failed to create a temp file, disable output sync going forward.  */
+ error:
+  output_close (out);
+  output_sync = OUTPUT_SYNC_NONE;
+}
+
+/* Synchronize the output of jobs in -j mode to keep the results of
+   each job together. This is done by holding the results in temp files,
+   one for stdout and potentially another for stderr, and only releasing
+   them to "real" stdout/stderr when a semaphore can be obtained. */
+
+void
+output_dump (struct output *out)
+{
+  int outfd_not_empty = FD_NOT_EMPTY (out->out);
+  int errfd_not_empty = FD_NOT_EMPTY (out->err);
+
+  if (outfd_not_empty || errfd_not_empty)
+    {
+      int traced = 0;
+
+      /* Try to acquire the semaphore.  If it fails, dump the output
+         unsynchronized; still better than silently discarding it.
+         We want to keep this lock for as little time as possible.  */
+      void *sem = acquire_semaphore ();
+
+      /* Log the working directory for this dump.  */
+      if (print_directory_flag && output_sync != OUTPUT_SYNC_RECURSE)
+        traced = log_working_directory (1);
+
+      if (outfd_not_empty)
+        pump_from_tmp (out->out, stdout);
+      if (errfd_not_empty && out->err != out->out)
+        pump_from_tmp (out->err, stderr);
+
+      if (traced)
+        log_working_directory (0);
+
+      /* Exit the critical section.  */
+      if (sem)
+        release_semaphore (sem);
+
+      /* Truncate and reset the output, in case we use it again.  */
+      if (out->out != OUTPUT_NONE)
+        {
+          int e;
+          lseek (out->out, 0, SEEK_SET);
+          EINTRLOOP (e, ftruncate (out->out, 0));
+        }
+      if (out->err != OUTPUT_NONE && out->err != out->out)
+        {
+          int e;
+          lseek (out->err, 0, SEEK_SET);
+          EINTRLOOP (e, ftruncate (out->err, 0));
+        }
+    }
+}
+#endif /* NO_OUTPUT_SYNC */
+\f
+
+/* This code is stolen from gnulib.
+   If/when we abandon the requirement to work with K&R compilers, we can
+   remove this (and perhaps other parts of GNU make!) and migrate to using
+   gnulib directly.
+
+   This is called only through atexit(), which means die() has already been
+   invoked.  So, call exit() here directly.  Apparently that works...?
+*/
+
+/* Close standard output, exiting with status 'exit_failure' on failure.
+   If a program writes *anything* to stdout, that program should close
+   stdout and make sure that it succeeds before exiting.  Otherwise,
+   suppose that you go to the extreme of checking the return status
+   of every function that does an explicit write to stdout.  The last
+   printf can succeed in writing to the internal stream buffer, and yet
+   the fclose(stdout) could still fail (due e.g., to a disk full error)
+   when it tries to write out that buffered data.  Thus, you would be
+   left with an incomplete output file and the offending program would
+   exit successfully.  Even calling fflush is not always sufficient,
+   since some file systems (NFS and CODA) buffer written/flushed data
+   until an actual close call.
+
+   Besides, it's wasteful to check the return value from every call
+   that writes to stdout -- just let the internal stream state record
+   the failure.  That's what the ferror test is checking below.
+
+   It's important to detect such failures and exit nonzero because many
+   tools (most notably 'make' and other build-management systems) depend
+   on being able to detect failure in other tools via their exit status.  */
+
+static void
+close_stdout (void)
+{
+  int prev_fail = ferror (stdout);
+  int fclose_fail = fclose (stdout);
+
+  if (prev_fail || fclose_fail)
+    {
+      if (fclose_fail)
+        perror_with_name (_("write error: stdout"), "");
+      else
+        O (error, NILF, _("write error: stdout"));
+      exit (MAKE_TROUBLE);
+    }
+}
+\f
+
+void
+output_init (struct output *out)
+{
+  if (out)
+    {
+      out->out = out->err = OUTPUT_NONE;
+      out->syncout = !!output_sync;
+      return;
+    }
+
+  /* Configure this instance of make.  Be sure stdout is line-buffered.  */
+
+#ifdef HAVE_SETVBUF
+# ifdef SETVBUF_REVERSED
+  setvbuf (stdout, _IOLBF, xmalloc (BUFSIZ), BUFSIZ);
+# else  /* setvbuf not reversed.  */
+  /* Some buggy systems lose if we pass 0 instead of allocating ourselves.  */
+  setvbuf (stdout, 0, _IOLBF, BUFSIZ);
+# endif /* setvbuf reversed.  */
+#elif HAVE_SETLINEBUF
+  setlinebuf (stdout);
+#endif  /* setlinebuf missing.  */
+
+  /* Force stdout/stderr into append mode.  This ensures parallel jobs won't
+     lose output due to overlapping writes.  */
+  set_append_mode (fileno (stdout));
+  set_append_mode (fileno (stderr));
+
+#ifdef HAVE_ATEXIT
+  if (STREAM_OK (stdout))
+    atexit (close_stdout);
+#endif
+}
+
+void
+output_close (struct output *out)
+{
+  if (! out)
+    {
+      if (stdio_traced)
+        log_working_directory (0);
+      return;
+    }
+
+#ifndef NO_OUTPUT_SYNC
+  output_dump (out);
+#endif
+
+  if (out->out >= 0)
+    close (out->out);
+  if (out->err >= 0 && out->err != out->out)
+    close (out->err);
+
+  output_init (out);
+}
+
+/* We're about to generate output: be sure it's set up.  */
+void
+output_start (void)
+{
+#ifndef NO_OUTPUT_SYNC
+  /* If we're syncing output make sure the temporary file is set up.  */
+  if (output_context && output_context->syncout)
+    if (! OUTPUT_ISSET(output_context))
+      setup_tmpfile (output_context);
+#endif
+
+  /* If we're not syncing this output per-line or per-target, make sure we emit
+     the "Entering..." message where appropriate.  */
+  if (output_sync == OUTPUT_SYNC_NONE || output_sync == OUTPUT_SYNC_RECURSE)
+    if (! stdio_traced && print_directory_flag)
+      stdio_traced = log_working_directory (1);
+}
+
+void
+outputs (int is_err, const char *msg)
+{
+  if (! msg || *msg == '\0')
+    return;
+
+  output_start ();
+
+  _outputs (output_context, is_err, msg);
+}
+\f
+
+static struct fmtstring
+  {
+    char *buffer;
+    size_t size;
+  } fmtbuf = { NULL, 0 };
+
+static char *
+get_buffer (size_t need)
+{
+  /* Make sure we have room.  NEED includes space for \0.  */
+  if (need > fmtbuf.size)
+    {
+      fmtbuf.size += need * 2;
+      fmtbuf.buffer = xrealloc (fmtbuf.buffer, fmtbuf.size);
+    }
+
+  fmtbuf.buffer[need-1] = '\0';
+
+  return fmtbuf.buffer;
+}
+
+/* Print a message on stdout.  */
+
+void
+message (int prefix, size_t len, const char *fmt, ...)
+{
+  va_list args;
+  char *p;
+
+  len += strlen (fmt) + strlen (program) + INTSTR_LENGTH + 4 + 1 + 1;
+  p = get_buffer (len);
+
+  if (prefix)
+    {
+      if (makelevel == 0)
+        sprintf (p, "%s: ", program);
+      else
+        sprintf (p, "%s[%u]: ", program, makelevel);
+      p += strlen (p);
+    }
+
+  va_start (args, fmt);
+  vsprintf (p, fmt, args);
+  va_end (args);
+
+  strcat (p, "\n");
+
+  assert (fmtbuf.buffer[len-1] == '\0');
+  outputs (0, fmtbuf.buffer);
+}
+
+/* Print an error message.  */
+
+void
+error (const floc *flocp, size_t len, const char *fmt, ...)
+{
+  va_list args;
+  char *p;
+
+  len += (strlen (fmt) + strlen (program)
+          + (flocp && flocp->filenm ? strlen (flocp->filenm) : 0)
+          + INTSTR_LENGTH + 4 + 1 + 1);
+  p = get_buffer (len);
+
+  if (flocp && flocp->filenm)
+    sprintf (p, "%s:%lu: ", flocp->filenm, flocp->lineno + flocp->offset);
+  else if (makelevel == 0)
+    sprintf (p, "%s: ", program);
+  else
+    sprintf (p, "%s[%u]: ", program, makelevel);
+  p += strlen (p);
+
+  va_start (args, fmt);
+  vsprintf (p, fmt, args);
+  va_end (args);
+
+  strcat (p, "\n");
+
+  assert (fmtbuf.buffer[len-1] == '\0');
+  outputs (1, fmtbuf.buffer);
+}
+
+/* Print an error message and exit.  */
+
+void
+fatal (const floc *flocp, size_t len, const char *fmt, ...)
+{
+  va_list args;
+  const char *stop = _(".  Stop.\n");
+  char *p;
+
+  len += (strlen (fmt) + strlen (program)
+          + (flocp && flocp->filenm ? strlen (flocp->filenm) : 0)
+          + INTSTR_LENGTH + 8 + strlen (stop) + 1);
+  p = get_buffer (len);
+
+  if (flocp && flocp->filenm)
+    sprintf (p, "%s:%lu: *** ", flocp->filenm, flocp->lineno + flocp->offset);
+  else if (makelevel == 0)
+    sprintf (p, "%s: *** ", program);
+  else
+    sprintf (p, "%s[%u]: *** ", program, makelevel);
+  p += strlen (p);
+
+  va_start (args, fmt);
+  vsprintf (p, fmt, args);
+  va_end (args);
+
+  strcat (p, stop);
+
+  assert (fmtbuf.buffer[len-1] == '\0');
+  outputs (1, fmtbuf.buffer);
+
+  die (MAKE_FAILURE);
+}
+
+/* Print an error message from errno.  */
+
+void
+perror_with_name (const char *str, const char *name)
+{
+  const char *err = strerror (errno);
+  OSSS (error, NILF, _("%s%s: %s"), str, name, err);
+}
+
+/* Print an error message from errno and exit.  */
+
+void
+pfatal_with_name (const char *name)
+{
+  const char *err = strerror (errno);
+  OSS (fatal, NILF, _("%s: %s"), name, err);
+
+  /* NOTREACHED */
+}
+
+/* Print a message about out of memory (not using more heap) and exit.
+   Our goal here is to be sure we don't try to allocate more memory, which
+   means we don't want to use string translations or normal cleanup.  */
+
+void
+out_of_memory ()
+{
+  writebuf (FD_STDOUT, program, strlen (program));
+  writebuf (FD_STDOUT, STRING_SIZE_TUPLE (": *** virtual memory exhausted\n"));
+  exit (MAKE_FAILURE);
+}
diff --git a/src/output.h b/src/output.h
new file mode 100644 (file)
index 0000000..a506505
--- /dev/null
@@ -0,0 +1,106 @@
+/* Output to stdout / stderr for GNU make
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+struct output
+  {
+    int out;
+    int err;
+    unsigned int syncout:1;     /* True if we want to synchronize output.  */
+ };
+
+extern struct output *output_context;
+extern unsigned int stdio_traced;
+
+#define FD_STDIN  (fileno (stdin))
+#define FD_STDOUT (fileno (stdout))
+#define FD_STDERR (fileno (stderr))
+
+#define OUTPUT_SET(_new)    do{ output_context = (_new)->syncout ? (_new) : NULL; }while(0)
+#define OUTPUT_UNSET()      do{ output_context = NULL; }while(0)
+
+#define OUTPUT_TRACED()     do{ stdio_traced = 1; }while(0)
+#define OUTPUT_IS_TRACED()  (!!stdio_traced)
+
+/* Write a buffer directly to the given file descriptor.
+   This handles errors etc.  */
+int output_write (int fd, const void *buffer, size_t len);
+
+/* Initialize and close a child output structure: if NULL do this program's
+   output (this should only be done once).  */
+void output_init (struct output *out);
+void output_close (struct output *out);
+
+/* In situations where output may be about to be displayed but we're not
+   sure if we've set it up yet, call this.  */
+void output_start (void);
+
+/* Show a message on stdout or stderr.  Will start the output if needed.  */
+void outputs (int is_err, const char *msg);
+
+#if defined(HAVE_FCNTL_H)
+# include <fcntl.h>
+#elif defined(HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif
+
+#ifdef NO_OUTPUT_SYNC
+# define RECORD_SYNC_MUTEX(m) \
+    O (error, NILF,                                                    \
+       _("-O[TYPE] (--output-sync[=TYPE]) is not configured for this build."));
+#else
+int output_tmpfd (void);
+/* Dump any child output content to stdout, and reset it.  */
+void output_dump (struct output *out);
+
+# ifdef WINDOWS32
+/* For emulations in w32/compat/posixfcn.c.  */
+#  define F_GETFD 1
+#  define F_SETLKW 2
+/* Implementation note: None of the values of l_type below can be zero
+   -- they are compared with a static instance of the struct, so zero
+   means unknown/invalid, see w32/compat/posixfcn.c. */
+#  define F_WRLCK 1
+#  define F_UNLCK 2
+
+struct flock
+  {
+    short l_type;
+    short l_whence;
+    off_t l_start;
+    off_t l_len;
+    pid_t l_pid;
+  };
+
+/* This type is actually a HANDLE, but we want to avoid including
+   windows.h as much as possible.  */
+typedef intptr_t sync_handle_t;
+
+/* Public functions emulated/provided in posixfcn.c.  */
+int fcntl (intptr_t fd, int cmd, ...);
+intptr_t create_mutex (void);
+int same_stream (FILE *f1, FILE *f2);
+
+#  define RECORD_SYNC_MUTEX(m) record_sync_mutex(m)
+void record_sync_mutex (const char *str);
+void prepare_mutex_handle_string (intptr_t hdl);
+# else  /* !WINDOWS32 */
+
+typedef int sync_handle_t;      /* file descriptor */
+
+#  define RECORD_SYNC_MUTEX(m) (void)(m)
+
+# endif
+#endif  /* !NO_OUTPUT_SYNC */
diff --git a/src/posixos.c b/src/posixos.c
new file mode 100644 (file)
index 0000000..525f292
--- /dev/null
@@ -0,0 +1,512 @@
+/* POSIX-based operating system interface for GNU Make.
+Copyright (C) 2016-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <stdio.h>
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#elif defined(HAVE_SYS_FILE_H)
+# include <sys/file.h>
+#endif
+
+#if defined(HAVE_PSELECT) && defined(HAVE_SYS_SELECT_H)
+# include <sys/select.h>
+#endif
+
+#include "debug.h"
+#include "job.h"
+#include "os.h"
+
+#ifdef MAKE_JOBSERVER
+
+/* This section provides OS-specific functions to support the jobserver.  */
+
+/* These track the state of the jobserver pipe.  Passed to child instances.  */
+static int job_fds[2] = { -1, -1 };
+
+/* Used to signal read() that a SIGCHLD happened.  Always CLOEXEC.
+   If we use pselect() this will never be created and always -1.
+ */
+static int job_rfd = -1;
+
+/* Token written to the pipe (could be any character...)  */
+static char token = '+';
+
+static int
+make_job_rfd (void)
+{
+#ifdef HAVE_PSELECT
+  /* Pretend we succeeded.  */
+  return 0;
+#else
+  EINTRLOOP (job_rfd, dup (job_fds[0]));
+  if (job_rfd >= 0)
+    fd_noinherit (job_rfd);
+
+  return job_rfd;
+#endif
+}
+
+static void
+set_blocking (int fd, int blocking)
+{
+  /* If we're not using pselect() don't change the blocking.  */
+#ifdef HAVE_PSELECT
+  int flags;
+  EINTRLOOP (flags, fcntl (fd, F_GETFL));
+  if (flags >= 0)
+    {
+      int r;
+      flags = blocking ? (flags & ~O_NONBLOCK) : (flags | O_NONBLOCK);
+      EINTRLOOP (r, fcntl (fd, F_SETFL, flags));
+      if (r < 0)
+        pfatal_with_name ("fcntl(O_NONBLOCK)");
+    }
+#endif
+}
+
+unsigned int
+jobserver_setup (int slots)
+{
+  int r;
+
+  EINTRLOOP (r, pipe (job_fds));
+  if (r < 0)
+    pfatal_with_name (_("creating jobs pipe"));
+
+  /* By default we don't send the job pipe FDs to our children.
+     See jobserver_pre_child() and jobserver_post_child().  */
+  fd_noinherit (job_fds[0]);
+  fd_noinherit (job_fds[1]);
+
+  if (make_job_rfd () < 0)
+    pfatal_with_name (_("duping jobs pipe"));
+
+  while (slots--)
+    {
+      EINTRLOOP (r, write (job_fds[1], &token, 1));
+      if (r != 1)
+        pfatal_with_name (_("init jobserver pipe"));
+    }
+
+  /* When using pselect() we want the read to be non-blocking.  */
+  set_blocking (job_fds[0], 0);
+
+  return 1;
+}
+
+unsigned int
+jobserver_parse_auth (const char *auth)
+{
+  /* Given the command-line parameter, parse it.  */
+  if (sscanf (auth, "%d,%d", &job_fds[0], &job_fds[1]) != 2)
+    OS (fatal, NILF,
+        _("internal error: invalid --jobserver-auth string '%s'"), auth);
+
+  DB (DB_JOBS,
+      (_("Jobserver client (fds %d,%d)\n"), job_fds[0], job_fds[1]));
+
+#ifdef HAVE_FCNTL_H
+# define FD_OK(_f) (fcntl ((_f), F_GETFD) != -1)
+#else
+# define FD_OK(_f) 1
+#endif
+
+  /* Make sure our pipeline is valid, and (possibly) create a duplicate pipe,
+     that will be closed in the SIGCHLD handler.  If this fails with EBADF,
+     the parent has closed the pipe on us because it didn't think we were a
+     submake.  If so, warn and default to -j1.  */
+
+  if (!FD_OK (job_fds[0]) || !FD_OK (job_fds[1]) || make_job_rfd () < 0)
+    {
+      if (errno != EBADF)
+        pfatal_with_name (_("jobserver pipeline"));
+
+      job_fds[0] = job_fds[1] = -1;
+
+      return 0;
+    }
+
+  /* When using pselect() we want the read to be non-blocking.  */
+  set_blocking (job_fds[0], 0);
+
+  return 1;
+}
+
+char *
+jobserver_get_auth (void)
+{
+  char *auth = xmalloc ((INTSTR_LENGTH * 2) + 2);
+  sprintf (auth, "%d,%d", job_fds[0], job_fds[1]);
+  return auth;
+}
+
+unsigned int
+jobserver_enabled (void)
+{
+  return job_fds[0] >= 0;
+}
+
+void
+jobserver_clear (void)
+{
+  if (job_fds[0] >= 0)
+    close (job_fds[0]);
+  if (job_fds[1] >= 0)
+    close (job_fds[1]);
+  if (job_rfd >= 0)
+    close (job_rfd);
+
+  job_fds[0] = job_fds[1] = job_rfd = -1;
+}
+
+void
+jobserver_release (int is_fatal)
+{
+  int r;
+  EINTRLOOP (r, write (job_fds[1], &token, 1));
+  if (r != 1)
+    {
+      if (is_fatal)
+        pfatal_with_name (_("write jobserver"));
+      perror_with_name ("write", "");
+    }
+}
+
+unsigned int
+jobserver_acquire_all (void)
+{
+  unsigned int tokens = 0;
+
+  /* Use blocking reads to wait for all outstanding jobs.  */
+  set_blocking (job_fds[0], 1);
+
+  /* Close the write side, so the read() won't hang forever.  */
+  close (job_fds[1]);
+  job_fds[1] = -1;
+
+  while (1)
+    {
+      char intake;
+      int r;
+      EINTRLOOP (r, read (job_fds[0], &intake, 1));
+      if (r != 1)
+        return tokens;
+      ++tokens;
+    }
+}
+
+/* Prepare the jobserver to start a child process.  */
+void
+jobserver_pre_child (int recursive)
+{
+  if (recursive && job_fds[0] >= 0)
+    {
+      fd_inherit (job_fds[0]);
+      fd_inherit (job_fds[1]);
+    }
+}
+
+/* Reconfigure the jobserver after starting a child process.  */
+void
+jobserver_post_child (int recursive)
+{
+  if (recursive && job_fds[0] >= 0)
+    {
+      fd_noinherit (job_fds[0]);
+      fd_noinherit (job_fds[1]);
+    }
+}
+
+void
+jobserver_signal (void)
+{
+  if (job_rfd >= 0)
+    {
+      close (job_rfd);
+      job_rfd = -1;
+    }
+}
+
+void
+jobserver_pre_acquire (void)
+{
+  /* Make sure we have a dup'd FD.  */
+  if (job_rfd < 0 && job_fds[0] >= 0 && make_job_rfd () < 0)
+    pfatal_with_name (_("duping jobs pipe"));
+}
+
+#ifdef HAVE_PSELECT
+
+/* Use pselect() to atomically wait for both a signal and a file descriptor.
+   It also provides a timeout facility so we don't need to use SIGALRM.
+
+   This method relies on the fact that SIGCHLD will be blocked everywhere,
+   and only unblocked (atomically) within the pselect() call, so we can
+   never miss a SIGCHLD.
+ */
+unsigned int
+jobserver_acquire (int timeout)
+{
+  struct timespec spec;
+  struct timespec *specp = NULL;
+  sigset_t empty;
+
+  sigemptyset (&empty);
+
+  if (timeout)
+    {
+      /* Alarm after one second (is this too granular?)  */
+      spec.tv_sec = 1;
+      spec.tv_nsec = 0;
+      specp = &spec;
+    }
+
+  while (1)
+    {
+      fd_set readfds;
+      int r;
+      char intake;
+
+      FD_ZERO (&readfds);
+      FD_SET (job_fds[0], &readfds);
+
+      r = pselect (job_fds[0]+1, &readfds, NULL, NULL, specp, &empty);
+      if (r < 0)
+        switch (errno)
+          {
+          case EINTR:
+            /* SIGCHLD will show up as an EINTR.  */
+            return 0;
+
+          case EBADF:
+            /* Someone closed the jobs pipe.
+               That shouldn't happen but if it does we're done.  */
+              O (fatal, NILF, _("job server shut down"));
+
+          default:
+            pfatal_with_name (_("pselect jobs pipe"));
+          }
+
+      if (r == 0)
+        /* Timeout.  */
+        return 0;
+
+      /* The read FD is ready: read it!  This is non-blocking.  */
+      EINTRLOOP (r, read (job_fds[0], &intake, 1));
+
+      if (r < 0)
+        {
+          /* Someone sniped our token!  Try again.  */
+          if (errno == EAGAIN)
+            continue;
+
+          pfatal_with_name (_("read jobs pipe"));
+        }
+
+      /* read() should never return 0: only the master make can reap all the
+         tokens and close the write side...??  */
+      return r > 0;
+    }
+}
+
+#else
+
+/* This method uses a "traditional" UNIX model for waiting on both a signal
+   and a file descriptor.  However, it's complex and since we have a SIGCHLD
+   handler installed we need to check ALL system calls for EINTR: painful!
+
+   Read a token.  As long as there's no token available we'll block.  We
+   enable interruptible system calls before the read(2) so that if we get a
+   SIGCHLD while we're waiting, we'll return with EINTR and we can process the
+   death(s) and return tokens to the free pool.
+
+   Once we return from the read, we immediately reinstate restartable system
+   calls.  This allows us to not worry about checking for EINTR on all the
+   other system calls in the program.
+
+   There is one other twist: there is a span between the time reap_children()
+   does its last check for dead children and the time the read(2) call is
+   entered, below, where if a child dies we won't notice.  This is extremely
+   serious as it could cause us to deadlock, given the right set of events.
+
+   To avoid this, we do the following: before we reap_children(), we dup(2)
+   the read FD on the jobserver pipe.  The read(2) call below uses that new
+   FD.  In the signal handler, we close that FD.  That way, if a child dies
+   during the section mentioned above, the read(2) will be invoked with an
+   invalid FD and will return immediately with EBADF.  */
+
+static RETSIGTYPE
+job_noop (int sig UNUSED)
+{
+}
+
+/* Set the child handler action flags to FLAGS.  */
+static void
+set_child_handler_action_flags (int set_handler, int set_alarm)
+{
+  struct sigaction sa;
+
+#ifdef __EMX__
+  /* The child handler must be turned off here.  */
+  signal (SIGCHLD, SIG_DFL);
+#endif
+
+  memset (&sa, '\0', sizeof sa);
+  sa.sa_handler = child_handler;
+  sa.sa_flags = set_handler ? 0 : SA_RESTART;
+
+#if defined SIGCHLD
+  if (sigaction (SIGCHLD, &sa, NULL) < 0)
+    pfatal_with_name ("sigaction: SIGCHLD");
+#endif
+
+#if defined SIGCLD && SIGCLD != SIGCHLD
+  if (sigaction (SIGCLD, &sa, NULL) < 0)
+    pfatal_with_name ("sigaction: SIGCLD");
+#endif
+
+#if defined SIGALRM
+  if (set_alarm)
+    {
+      /* If we're about to enter the read(), set an alarm to wake up in a
+         second so we can check if the load has dropped and we can start more
+         work.  On the way out, turn off the alarm and set SIG_DFL.  */
+      if (set_handler)
+        {
+          sa.sa_handler = job_noop;
+          sa.sa_flags = 0;
+          if (sigaction (SIGALRM, &sa, NULL) < 0)
+            pfatal_with_name ("sigaction: SIGALRM");
+          alarm (1);
+        }
+      else
+        {
+          alarm (0);
+          sa.sa_handler = SIG_DFL;
+          sa.sa_flags = 0;
+          if (sigaction (SIGALRM, &sa, NULL) < 0)
+            pfatal_with_name ("sigaction: SIGALRM");
+        }
+    }
+#endif
+}
+
+unsigned int
+jobserver_acquire (int timeout)
+{
+  char intake;
+  int got_token;
+  int saved_errno;
+
+  /* Set interruptible system calls, and read() for a job token.  */
+  set_child_handler_action_flags (1, timeout);
+
+  EINTRLOOP (got_token, read (job_rfd, &intake, 1));
+  saved_errno = errno;
+
+  set_child_handler_action_flags (0, timeout);
+
+  if (got_token == 1)
+    return 1;
+
+  /* If the error _wasn't_ expected (EINTR or EBADF), fatal.  Otherwise,
+     go back and reap_children(), and try again.  */
+  errno = saved_errno;
+
+  if (errno != EINTR && errno != EBADF)
+    pfatal_with_name (_("read jobs pipe"));
+
+  if (errno == EBADF)
+    DB (DB_JOBS, ("Read returned EBADF.\n"));
+
+  return 0;
+}
+
+#endif /* HAVE_PSELECT */
+
+#endif /* MAKE_JOBSERVER */
+
+/* Create a "bad" file descriptor for stdin when parallel jobs are run.  */
+int
+get_bad_stdin (void)
+{
+  static int bad_stdin = -1;
+
+  /* Set up a bad standard input that reads from a broken pipe.  */
+
+  if (bad_stdin == -1)
+    {
+      /* Make a file descriptor that is the read end of a broken pipe.
+         This will be used for some children's standard inputs.  */
+      int pd[2];
+      if (pipe (pd) == 0)
+        {
+          /* Close the write side.  */
+          (void) close (pd[1]);
+          /* Save the read side.  */
+          bad_stdin = pd[0];
+
+          /* Set the descriptor to close on exec, so it does not litter any
+             child's descriptor table.  When it is dup2'd onto descriptor 0,
+             that descriptor will not close on exec.  */
+          fd_noinherit (bad_stdin);
+        }
+    }
+
+  return bad_stdin;
+}
+
+/* Set file descriptors to be inherited / not inherited by subprocesses.  */
+
+#if !defined(F_SETFD) || !defined(F_GETFD)
+void fd_inherit (int fd) {}
+void fd_noinherit (int fd) {}
+
+#else
+
+# ifndef FD_CLOEXEC
+#  define FD_CLOEXEC 1
+# endif
+
+void
+fd_inherit (int fd)
+{
+  int flags;
+  EINTRLOOP (flags, fcntl (fd, F_GETFD));
+  if (flags >= 0)
+    {
+      int r;
+      flags &= ~FD_CLOEXEC;
+      EINTRLOOP (r, fcntl (fd, F_SETFD, flags));
+    }
+}
+
+void
+fd_noinherit (int fd)
+{
+    int flags;
+    EINTRLOOP(flags, fcntl(fd, F_GETFD));
+    if (flags >= 0)
+      {
+        int r;
+        flags |= FD_CLOEXEC;
+        EINTRLOOP(r, fcntl(fd, F_SETFD, flags));
+      }
+}
+#endif
diff --git a/src/read.c b/src/read.c
new file mode 100644 (file)
index 0000000..fa197fb
--- /dev/null
@@ -0,0 +1,3471 @@
+/* Reading and parsing of makefiles for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+
+#include "filedef.h"
+#include "dep.h"
+#include "job.h"
+#include "os.h"
+#include "commands.h"
+#include "variable.h"
+#include "rule.h"
+#include "debug.h"
+#include "hash.h"
+
+
+#ifdef WINDOWS32
+#include <windows.h>
+#include "sub_proc.h"
+#else  /* !WINDOWS32 */
+#ifndef _AMIGA
+#ifndef VMS
+#include <pwd.h>
+#else
+struct passwd *getpwnam (char *name);
+#endif
+#endif
+#endif /* !WINDOWS32 */
+
+/* A 'struct ebuffer' controls the origin of the makefile we are currently
+   eval'ing.
+*/
+
+struct ebuffer
+  {
+    char *buffer;       /* Start of the current line in the buffer.  */
+    char *bufnext;      /* Start of the next line in the buffer.  */
+    char *bufstart;     /* Start of the entire buffer.  */
+    size_t size;        /* Malloc'd size of buffer. */
+    FILE *fp;           /* File, or NULL if this is an internal buffer.  */
+    floc floc;          /* Info on the file in fp (if any).  */
+  };
+
+/* Track the modifiers we can have on variable assignments */
+
+struct vmodifiers
+  {
+    unsigned int assign_v:1;
+    unsigned int define_v:1;
+    unsigned int undefine_v:1;
+    unsigned int export_v:1;
+    unsigned int override_v:1;
+    unsigned int private_v:1;
+  };
+
+/* Types of "words" that can be read in a makefile.  */
+enum make_word_type
+  {
+     w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon,
+     w_varassign, w_ampcolon, w_ampdcolon
+  };
+
+
+/* A 'struct conditionals' contains the information describing
+   all the active conditionals in a makefile.
+
+   The global variable 'conditionals' contains the conditionals
+   information for the current makefile.  It is initialized from
+   the static structure 'toplevel_conditionals' and is later changed
+   to new structures for included makefiles.  */
+
+struct conditionals
+  {
+    unsigned int if_cmds;       /* Depth of conditional nesting.  */
+    unsigned int allocated;     /* Elts allocated in following arrays.  */
+    char *ignoring;             /* Are we ignoring or interpreting?
+                                   0=interpreting, 1=not yet interpreted,
+                                   2=already interpreted */
+    char *seen_else;            /* Have we already seen an 'else'?  */
+  };
+
+static struct conditionals toplevel_conditionals;
+static struct conditionals *conditionals = &toplevel_conditionals;
+
+
+/* Default directories to search for include files in  */
+
+static const char *default_include_directories[] =
+  {
+#if defined(WINDOWS32) && !defined(INCLUDEDIR)
+/* This completely up to the user when they install MSVC or other packages.
+   This is defined as a placeholder.  */
+# define INCLUDEDIR "."
+#endif
+    INCLUDEDIR,
+#ifndef _AMIGA
+    "/usr/gnu/include",
+    "/usr/local/include",
+    "/usr/include",
+#endif
+    0
+  };
+
+/* List of directories to search for include files in  */
+
+static const char **include_directories;
+
+/* Maximum length of an element of the above.  */
+
+static size_t max_incl_len;
+
+/* The filename and pointer to line number of the
+   makefile currently being read in.  */
+
+const floc *reading_file = 0;
+
+/* The chain of files read by read_all_makefiles.  */
+
+static struct goaldep *read_files = 0;
+
+static struct goaldep *eval_makefile (const char *filename, unsigned short flags);
+static void eval (struct ebuffer *buffer, int flags);
+
+static long readline (struct ebuffer *ebuf);
+static void do_undefine (char *name, enum variable_origin origin,
+                         struct ebuffer *ebuf);
+static struct variable *do_define (char *name, enum variable_origin origin,
+                                   struct ebuffer *ebuf);
+static int conditional_line (char *line, size_t len, const floc *flocp);
+static void record_files (struct nameseq *filenames, int are_also_makes,
+                          const char *pattern,
+                          const char *pattern_percent, char *depstr,
+                          unsigned int cmds_started, char *commands,
+                          size_t commands_idx, int two_colon,
+                          char prefix, const floc *flocp);
+static void record_target_var (struct nameseq *filenames, char *defn,
+                               enum variable_origin origin,
+                               struct vmodifiers *vmod,
+                               const floc *flocp);
+static enum make_word_type get_next_mword (char *buffer,
+                                           char **startp, size_t *length);
+static void remove_comments (char *line);
+static char *find_map_unquote (char *string, int map);
+static char *find_char_unquote (char *string, int stop);
+static char *unescape_char (char *string, int c);
+
+
+/* Compare a word, both length and contents.
+   P must point to the word to be tested, and WLEN must be the length.
+*/
+#define word1eq(s)      (wlen == CSTRLEN (s) && strneq (s, p, CSTRLEN (s)))
+
+\f
+/* Read in all the makefiles and return a chain of targets to rebuild.  */
+
+struct goaldep *
+read_all_makefiles (const char **makefiles)
+{
+  unsigned int num_makefiles = 0;
+
+  /* Create *_LIST variables, to hold the makefiles, targets, and variables
+     we will be reading. */
+
+  define_variable_cname ("MAKEFILE_LIST", "", o_file, 0);
+
+  DB (DB_BASIC, (_("Reading makefiles...\n")));
+
+  /* If there's a non-null variable MAKEFILES, its value is a list of
+     files to read first thing.  But don't let it prevent reading the
+     default makefiles and don't let the default goal come from there.  */
+
+  {
+    char *value;
+    char *name, *p;
+    size_t length;
+
+    {
+      /* Turn off --warn-undefined-variables while we expand MAKEFILES.  */
+      int save = warn_undefined_variables_flag;
+      warn_undefined_variables_flag = 0;
+
+      value = allocated_variable_expand ("$(MAKEFILES)");
+
+      warn_undefined_variables_flag = save;
+    }
+
+    /* Set NAME to the start of next token and LENGTH to its length.
+       MAKEFILES is updated for finding remaining tokens.  */
+    p = value;
+
+    while ((name = find_next_token ((const char **)&p, &length)) != 0)
+      {
+        if (*p != '\0')
+          *p++ = '\0';
+        eval_makefile (strcache_add (name), RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE);
+      }
+
+    free (value);
+  }
+
+  /* Read makefiles specified with -f switches.  */
+
+  if (makefiles != 0)
+    while (*makefiles != 0)
+      {
+        struct goaldep *d = eval_makefile (*makefiles, 0);
+
+        if (errno)
+          perror_with_name ("", *makefiles);
+
+        /* Reuse the storage allocated for the read_file.  */
+        *makefiles = dep_name (d);
+        ++num_makefiles;
+        ++makefiles;
+      }
+
+  /* If there were no -f switches, try the default names.  */
+
+  if (num_makefiles == 0)
+    {
+      static const char *default_makefiles[] =
+#ifdef VMS
+        /* all lower case since readdir() (the vms version) 'lowercasifies' */
+        /* TODO: Above is not always true, this needs more work */
+        { "makefile.vms", "gnumakefile", "makefile", 0 };
+#else
+#ifdef _AMIGA
+        { "GNUmakefile", "Makefile", "SMakefile", 0 };
+#else /* !Amiga && !VMS */
+#ifdef WINDOWS32
+        { "GNUmakefile", "makefile", "Makefile", "makefile.mak", 0 };
+#else /* !Amiga && !VMS && !WINDOWS32 */
+        { "GNUmakefile", "makefile", "Makefile", 0 };
+#endif /* !Amiga && !VMS && !WINDOWS32 */
+#endif /* AMIGA */
+#endif /* VMS */
+      const char **p = default_makefiles;
+      while (*p != 0 && !file_exists_p (*p))
+        ++p;
+
+      if (*p != 0)
+        {
+          eval_makefile (*p, 0);
+          if (errno)
+            perror_with_name ("", *p);
+        }
+      else
+        {
+          /* No default makefile was found.  Add the default makefiles to the
+             'read_files' chain so they will be updated if possible.  */
+          struct goaldep *tail = read_files;
+          /* Add them to the tail, after any MAKEFILES variable makefiles.  */
+          while (tail != 0 && tail->next != 0)
+            tail = tail->next;
+          for (p = default_makefiles; *p != 0; ++p)
+            {
+              struct goaldep *d = alloc_goaldep ();
+              d->file = enter_file (strcache_add (*p));
+              /* Tell update_goal_chain to bail out as soon as this file is
+                 made, and main not to die if we can't make this file.  */
+              d->flags = RM_DONTCARE;
+              if (tail == 0)
+                read_files = d;
+              else
+                tail->next = d;
+              tail = d;
+            }
+          if (tail != 0)
+            tail->next = 0;
+        }
+    }
+
+  return read_files;
+}
+\f
+/* Install a new conditional and return the previous one.  */
+
+static struct conditionals *
+install_conditionals (struct conditionals *new)
+{
+  struct conditionals *save = conditionals;
+
+  memset (new, '\0', sizeof (*new));
+  conditionals = new;
+
+  return save;
+}
+
+/* Free the current conditionals and reinstate a saved one.  */
+
+static void
+restore_conditionals (struct conditionals *saved)
+{
+  /* Free any space allocated by conditional_line.  */
+  free (conditionals->ignoring);
+  free (conditionals->seen_else);
+
+  /* Restore state.  */
+  conditionals = saved;
+}
+\f
+static struct goaldep *
+eval_makefile (const char *filename, unsigned short flags)
+{
+  struct goaldep *deps;
+  struct ebuffer ebuf;
+  const floc *curfile;
+  char *expanded = 0;
+
+  /* Create a new goaldep entry.  */
+  deps = alloc_goaldep ();
+  deps->next = read_files;
+  read_files = deps;
+
+  ebuf.floc.filenm = filename; /* Use the original file name.  */
+  ebuf.floc.lineno = 1;
+  ebuf.floc.offset = 0;
+
+  if (ISDB (DB_VERBOSE))
+    {
+      printf (_("Reading makefile '%s'"), filename);
+      if (flags & RM_NO_DEFAULT_GOAL)
+        printf (_(" (no default goal)"));
+      if (flags & RM_INCLUDED)
+        printf (_(" (search path)"));
+      if (flags & RM_DONTCARE)
+        printf (_(" (don't care)"));
+      if (flags & RM_NO_TILDE)
+        printf (_(" (no ~ expansion)"));
+      puts ("...");
+    }
+
+  /* First, get a stream to read.  */
+
+  /* Expand ~ in FILENAME unless it came from 'include',
+     in which case it was already done.  */
+  if (!(flags & RM_NO_TILDE) && filename[0] == '~')
+    {
+      expanded = tilde_expand (filename);
+      if (expanded != 0)
+        filename = expanded;
+    }
+
+  errno = 0;
+  ENULLLOOP (ebuf.fp, fopen (filename, "r"));
+  deps->error = errno;
+
+  /* Check for unrecoverable errors: out of mem or FILE slots.  */
+  switch (deps->error)
+    {
+#ifdef EMFILE
+    case EMFILE:
+#endif
+#ifdef ENFILE
+    case ENFILE:
+#endif
+    case ENOMEM:
+      {
+        const char *err = strerror (deps->error);
+        OS (fatal, reading_file, "%s", err);
+      }
+    }
+
+  /* If the makefile wasn't found and it's either a makefile from
+     the 'MAKEFILES' variable or an included makefile,
+     search the included makefile search path for this makefile.  */
+  if (ebuf.fp == 0 && (flags & RM_INCLUDED) && *filename != '/')
+    {
+      unsigned int i;
+      for (i = 0; include_directories[i] != 0; ++i)
+        {
+          const char *included = concat (3, include_directories[i],
+                                         "/", filename);
+          ebuf.fp = fopen (included, "r");
+          if (ebuf.fp)
+            {
+              filename = included;
+              break;
+            }
+        }
+    }
+
+  /* Enter the final name for this makefile as a goaldep.  */
+  filename = strcache_add (filename);
+  deps->file = lookup_file (filename);
+  if (deps->file == 0)
+    deps->file = enter_file (filename);
+  filename = deps->file->name;
+  deps->flags = flags;
+
+  free (expanded);
+
+  if (ebuf.fp == 0)
+    {
+      /* The makefile can't be read at all, give up entirely.
+         If we did some searching errno has the error from the last attempt,
+         rather from FILENAME itself: recover the more accurate one.  */
+      errno = deps->error;
+      deps->file->last_mtime = NONEXISTENT_MTIME;
+      return deps;
+    }
+
+  /* Success; clear errno.  */
+  deps->error = 0;
+
+  /* Avoid leaking the makefile to children.  */
+  fd_noinherit (fileno (ebuf.fp));
+
+  /* Add this makefile to the list. */
+  do_variable_definition (&ebuf.floc, "MAKEFILE_LIST", filename, o_file,
+                          f_append_value, 0);
+
+  /* Evaluate the makefile */
+
+  ebuf.size = 200;
+  ebuf.buffer = ebuf.bufnext = ebuf.bufstart = xmalloc (ebuf.size);
+
+  curfile = reading_file;
+  reading_file = &ebuf.floc;
+
+  eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL));
+
+  reading_file = curfile;
+
+  fclose (ebuf.fp);
+
+  free (ebuf.bufstart);
+  alloca (0);
+
+  errno = 0;
+  return deps;
+}
+
+void
+eval_buffer (char *buffer, const floc *flocp)
+{
+  struct ebuffer ebuf;
+  struct conditionals *saved;
+  struct conditionals new;
+  const floc *curfile;
+
+  /* Evaluate the buffer */
+
+  ebuf.size = strlen (buffer);
+  ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer;
+  ebuf.fp = NULL;
+
+  if (flocp)
+    ebuf.floc = *flocp;
+  else if (reading_file)
+    ebuf.floc = *reading_file;
+  else
+    {
+      ebuf.floc.filenm = NULL;
+      ebuf.floc.lineno = 1;
+      ebuf.floc.offset = 0;
+    }
+
+  curfile = reading_file;
+  reading_file = &ebuf.floc;
+
+  saved = install_conditionals (&new);
+
+  eval (&ebuf, 1);
+
+  restore_conditionals (saved);
+
+  reading_file = curfile;
+
+  alloca (0);
+}
+\f
+/* Check LINE to see if it's a variable assignment or undefine.
+
+   It might use one of the modifiers "export", "override", "private", or it
+   might be one of the conditional tokens like "ifdef", "include", etc.
+
+   If it's not a variable assignment or undefine, VMOD.V_ASSIGN is 0.
+   Returns LINE.
+
+   Returns a pointer to the first non-modifier character, and sets VMOD
+   based on the modifiers found if any, plus V_ASSIGN is 1.
+ */
+static char *
+parse_var_assignment (const char *line, struct vmodifiers *vmod)
+{
+  const char *p;
+  memset (vmod, '\0', sizeof (*vmod));
+
+  /* Find the start of the next token.  If there isn't one we're done.  */
+  NEXT_TOKEN (line);
+  if (*line == '\0')
+    return (char *) line;
+
+  p = line;
+  while (1)
+    {
+      size_t wlen;
+      const char *p2;
+      struct variable v;
+
+      p2 = parse_variable_definition (p, &v);
+
+      /* If this is a variable assignment, we're done.  */
+      if (p2)
+        break;
+
+      /* It's not a variable; see if it's a modifier.  */
+      p2 = end_of_token (p);
+      wlen = p2 - p;
+
+      if (word1eq ("export"))
+        vmod->export_v = 1;
+      else if (word1eq ("override"))
+        vmod->override_v = 1;
+      else if (word1eq ("private"))
+        vmod->private_v = 1;
+      else if (word1eq ("define"))
+        {
+          /* We can't have modifiers after 'define' */
+          vmod->define_v = 1;
+          p = next_token (p2);
+          break;
+        }
+      else if (word1eq ("undefine"))
+        {
+          /* We can't have modifiers after 'undefine' */
+          vmod->undefine_v = 1;
+          p = next_token (p2);
+          break;
+        }
+      else
+        /* Not a variable or modifier: this is not a variable assignment.  */
+        return (char *) line;
+
+      /* It was a modifier.  Try the next word.  */
+      p = next_token (p2);
+      if (*p == '\0')
+        return (char *) line;
+    }
+
+  /* Found a variable assignment or undefine.  */
+  vmod->assign_v = 1;
+  return (char *)p;
+}
+\f
+
+/* Read file FILENAME as a makefile and add its contents to the data base.
+
+   SET_DEFAULT is true if we are allowed to set the default goal.  */
+
+static void
+eval (struct ebuffer *ebuf, int set_default)
+{
+  char *collapsed = 0;
+  size_t collapsed_length = 0;
+  size_t commands_len = 200;
+  char *commands;
+  size_t commands_idx = 0;
+  unsigned int cmds_started, tgts_started;
+  int ignoring = 0, in_ignored_define = 0;
+  int no_targets = 0;           /* Set when reading a rule without targets.  */
+  int also_make_targets = 0;    /* Set when reading grouped targets. */
+  struct nameseq *filenames = 0;
+  char *depstr = 0;
+  long nlines = 0;
+  int two_colon = 0;
+  char prefix = cmd_prefix;
+  const char *pattern = 0;
+  const char *pattern_percent;
+  floc *fstart;
+  floc fi;
+
+#define record_waiting_files()                                                \
+  do                                                                          \
+    {                                                                         \
+      if (filenames != 0)                                                     \
+        {                                                                     \
+          fi.lineno = tgts_started;                                           \
+          fi.offset = 0;                                                      \
+          record_files (filenames, also_make_targets, pattern,                \
+                        pattern_percent, depstr,                              \
+                        cmds_started, commands, commands_idx, two_colon,      \
+                        prefix, &fi);                                         \
+          filenames = 0;                                                      \
+        }                                                                     \
+      commands_idx = 0;                                                       \
+      no_targets = 0;                                                         \
+      pattern = 0;                                                            \
+      also_make_targets = 0;                                                  \
+    } while (0)
+
+  pattern_percent = 0;
+  cmds_started = tgts_started = 1;
+
+  fstart = &ebuf->floc;
+  fi.filenm = ebuf->floc.filenm;
+
+  /* Loop over lines in the file.
+     The strategy is to accumulate target names in FILENAMES, dependencies
+     in DEPS and commands in COMMANDS.  These are used to define a rule
+     when the start of the next rule (or eof) is encountered.
+
+     When you see a "continue" in the loop below, that means we are moving on
+     to the next line.  If you see record_waiting_files(), then the statement
+     we are parsing also finishes the previous rule.  */
+
+  commands = xmalloc (200);
+
+  while (1)
+    {
+      size_t linelen;
+      char *line;
+      size_t wlen;
+      char *p;
+      char *p2;
+      struct vmodifiers vmod;
+
+      /* At the top of this loop, we are starting a brand new line.  */
+      /* Grab the next line to be evaluated */
+      ebuf->floc.lineno += nlines;
+      nlines = readline (ebuf);
+
+      /* If there is nothing left to eval, we're done.  */
+      if (nlines < 0)
+        break;
+
+      line = ebuf->buffer;
+
+      /* If this is the first line, check for a UTF-8 BOM and skip it.  */
+      if (ebuf->floc.lineno == 1)
+        {
+          unsigned char *ul = (unsigned char *) line;
+          if (ul[0] == 0xEF && ul[1] == 0xBB && ul[2] == 0xBF)
+            {
+              line += 3;
+              if (ISDB(DB_BASIC))
+                {
+                  if (ebuf->floc.filenm)
+                    printf (_("Skipping UTF-8 BOM in makefile '%s'\n"),
+                            ebuf->floc.filenm);
+                  else
+                    printf (_("Skipping UTF-8 BOM in makefile buffer\n"));
+                }
+            }
+        }
+      /* If this line is empty, skip it.  */
+      if (line[0] == '\0')
+        continue;
+
+      linelen = strlen (line);
+
+      /* Check for a shell command line first.
+         If it is not one, we can stop treating cmd_prefix specially.  */
+      if (line[0] == cmd_prefix)
+        {
+          if (no_targets)
+            /* Ignore the commands in a rule with no targets.  */
+            continue;
+
+          /* If there is no preceding rule line, don't treat this line
+             as a command, even though it begins with a recipe prefix.
+             SunOS 4 make appears to behave this way.  */
+
+          if (filenames != 0)
+            {
+              if (ignoring)
+                /* Yep, this is a shell command, and we don't care.  */
+                continue;
+
+              if (commands_idx == 0)
+                cmds_started = ebuf->floc.lineno;
+
+              /* Append this command line to the line being accumulated.
+                 Skip the initial command prefix character.  */
+              if (linelen + commands_idx > commands_len)
+                {
+                  commands_len = (linelen + commands_idx) * 2;
+                  commands = xrealloc (commands, commands_len);
+                }
+              memcpy (&commands[commands_idx], line + 1, linelen - 1);
+              commands_idx += linelen - 1;
+              commands[commands_idx++] = '\n';
+              continue;
+            }
+        }
+
+      /* This line is not a shell command line.  Don't worry about whitespace.
+         Get more space if we need it; we don't need to preserve the current
+         contents of the buffer.  */
+
+      if (collapsed_length < linelen+1)
+        {
+          collapsed_length = linelen+1;
+          free (collapsed);
+          /* Don't need xrealloc: we don't need to preserve the content.  */
+          collapsed = xmalloc (collapsed_length);
+        }
+      strcpy (collapsed, line);
+      /* Collapse continuation lines.  */
+      collapse_continuations (collapsed);
+      remove_comments (collapsed);
+
+      /* Get rid if starting space (including formfeed, vtab, etc.)  */
+      p = collapsed;
+      NEXT_TOKEN (p);
+
+      /* See if this is a variable assignment.  We need to do this early, to
+         allow variables with names like 'ifdef', 'export', 'private', etc.  */
+      p = parse_var_assignment (p, &vmod);
+      if (vmod.assign_v)
+        {
+          struct variable *v;
+          enum variable_origin origin = vmod.override_v ? o_override : o_file;
+
+          /* If we're ignoring then we're done now.  */
+          if (ignoring)
+            {
+              if (vmod.define_v)
+                in_ignored_define = 1;
+              continue;
+            }
+
+          /* Variable assignment ends the previous rule.  */
+          record_waiting_files ();
+
+          if (vmod.undefine_v)
+          {
+            do_undefine (p, origin, ebuf);
+            continue;
+          }
+          else if (vmod.define_v)
+            v = do_define (p, origin, ebuf);
+          else
+            v = try_variable_definition (fstart, p, origin, 0);
+
+          assert (v != NULL);
+
+          if (vmod.export_v)
+            v->export = v_export;
+          if (vmod.private_v)
+            v->private_var = 1;
+
+          /* This line has been dealt with.  */
+          continue;
+        }
+
+      /* If this line is completely empty, ignore it.  */
+      if (*p == '\0')
+        continue;
+
+      p2 = end_of_token (p);
+      wlen = p2 - p;
+      NEXT_TOKEN (p2);
+
+      /* If we're in an ignored define, skip this line (but maybe get out).  */
+      if (in_ignored_define)
+        {
+          /* See if this is an endef line (plus optional comment).  */
+          if (word1eq ("endef") && STOP_SET (*p2, MAP_COMMENT|MAP_NUL))
+            in_ignored_define = 0;
+
+          continue;
+        }
+
+      /* Check for conditional state changes.  */
+      {
+        int i = conditional_line (p, wlen, fstart);
+        if (i != -2)
+          {
+            if (i == -1)
+              O (fatal, fstart, _("invalid syntax in conditional"));
+
+            ignoring = i;
+            continue;
+          }
+      }
+
+      /* Nothing to see here... move along.  */
+      if (ignoring)
+        continue;
+
+      /* Manage the "export" keyword used outside of variable assignment
+         as well as "unexport".  */
+      if (word1eq ("export") || word1eq ("unexport"))
+        {
+          int exporting = *p == 'u' ? 0 : 1;
+
+          /* Export/unexport ends the previous rule.  */
+          record_waiting_files ();
+
+          /* (un)export by itself causes everything to be (un)exported. */
+          if (*p2 == '\0')
+            export_all_variables = exporting;
+          else
+            {
+              size_t l;
+              const char *cp;
+              char *ap;
+
+              /* Expand the line so we can use indirect and constructed
+                 variable names in an (un)export command.  */
+              cp = ap = allocated_variable_expand (p2);
+
+              for (p = find_next_token (&cp, &l); p != 0;
+                   p = find_next_token (&cp, &l))
+                {
+                  struct variable *v = lookup_variable (p, l);
+                  if (v == 0)
+                    v = define_variable_global (p, l, "", o_file, 0, fstart);
+                  v->export = exporting ? v_export : v_noexport;
+                }
+
+              free (ap);
+            }
+          continue;
+        }
+
+      /* Handle the special syntax for vpath.  */
+      if (word1eq ("vpath"))
+        {
+          const char *cp;
+          char *vpat;
+          size_t l;
+
+          /* vpath ends the previous rule.  */
+          record_waiting_files ();
+
+          cp = variable_expand (p2);
+          p = find_next_token (&cp, &l);
+          if (p != 0)
+            {
+              vpat = xstrndup (p, l);
+              p = find_next_token (&cp, &l);
+              /* No searchpath means remove all previous
+                 selective VPATH's with the same pattern.  */
+            }
+          else
+            /* No pattern means remove all previous selective VPATH's.  */
+            vpat = 0;
+          construct_vpath_list (vpat, p);
+          free (vpat);
+
+          continue;
+        }
+
+      /* Handle include and variants.  */
+      if (word1eq ("include") || word1eq ("-include") || word1eq ("sinclude"))
+        {
+          /* We have found an 'include' line specifying a nested
+             makefile to be read at this point.  */
+          struct conditionals *save;
+          struct conditionals new_conditionals;
+          struct nameseq *files;
+          /* "-include" (vs "include") says no error if the file does not
+             exist.  "sinclude" is an alias for this from SGI.  */
+          int noerror = (p[0] != 'i');
+
+          /* Include ends the previous rule.  */
+          record_waiting_files ();
+
+          p = allocated_variable_expand (p2);
+
+          /* If no filenames, it's a no-op.  */
+          if (*p == '\0')
+            {
+              free (p);
+              continue;
+            }
+
+          /* Parse the list of file names.  Don't expand archive references!  */
+          p2 = p;
+          files = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_NUL, NULL,
+                                  PARSEFS_NOAR);
+          free (p);
+
+          /* Save the state of conditionals and start
+             the included makefile with a clean slate.  */
+          save = install_conditionals (&new_conditionals);
+
+          /* Record the rules that are waiting so they will determine
+             the default goal before those in the included makefile.  */
+          record_waiting_files ();
+
+          /* Read each included makefile.  */
+          while (files != 0)
+            {
+              struct nameseq *next = files->next;
+              unsigned short flags = (RM_INCLUDED | RM_NO_TILDE
+                                      | (noerror ? RM_DONTCARE : 0)
+                                      | (set_default ? 0 : RM_NO_DEFAULT_GOAL));
+
+              struct goaldep *d = eval_makefile (files->name, flags);
+
+              if (errno)
+                d->floc = *fstart;
+
+              free_ns (files);
+              files = next;
+            }
+
+          /* Restore conditional state.  */
+          restore_conditionals (save);
+
+          continue;
+        }
+
+      /* Handle the load operations.  */
+      if (word1eq ("load") || word1eq ("-load"))
+        {
+          /* A 'load' line specifies a dynamic object to load.  */
+          struct nameseq *files;
+          int noerror = (p[0] == '-');
+
+          /* Load ends the previous rule.  */
+          record_waiting_files ();
+
+          p = allocated_variable_expand (p2);
+
+          /* If no filenames, it's a no-op.  */
+          if (*p == '\0')
+            {
+              free (p);
+              continue;
+            }
+
+          /* Parse the list of file names.
+             Don't expand archive references or strip "./"  */
+          p2 = p;
+          files = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_NUL, NULL,
+                                  PARSEFS_NOAR);
+          free (p);
+
+          /* Load each file.  */
+          while (files != 0)
+            {
+              struct nameseq *next = files->next;
+              const char *name = files->name;
+              struct goaldep *deps;
+              int r;
+
+              /* Load the file.  0 means failure.  */
+              r = load_file (&ebuf->floc, &name, noerror);
+              if (! r && ! noerror)
+                OS (fatal, &ebuf->floc, _("%s: failed to load"), name);
+
+              free_ns (files);
+              files = next;
+
+              /* Return of -1 means a special load: don't rebuild it.  */
+              if (r == -1)
+                continue;
+
+              /* It succeeded, so add it to the list "to be rebuilt".  */
+              deps = alloc_goaldep ();
+              deps->next = read_files;
+              read_files = deps;
+              deps->file = lookup_file (name);
+              if (deps->file == 0)
+                deps->file = enter_file (name);
+              deps->file->loaded = 1;
+            }
+
+          continue;
+        }
+
+      /* This line starts with a tab but was not caught above because there
+         was no preceding target, and the line might have been usable as a
+         variable definition.  But now we know it is definitely lossage.  */
+      if (line[0] == cmd_prefix)
+        O (fatal, fstart, _("recipe commences before first target"));
+
+      /* This line describes some target files.  This is complicated by
+         the existence of target-specific variables, because we can't
+         expand the entire line until we know if we have one or not.  So
+         we expand the line word by word until we find the first ':',
+         then check to see if it's a target-specific variable.
+
+         In this algorithm, 'lb_next' will point to the beginning of the
+         unexpanded parts of the input buffer, while 'p2' points to the
+         parts of the expanded buffer we haven't searched yet. */
+
+      {
+        enum make_word_type wtype;
+        char *cmdleft, *semip, *lb_next;
+        size_t plen = 0;
+        char *colonp;
+        const char *end, *beg; /* Helpers for whitespace stripping. */
+
+        /* Record the previous rule.  */
+
+        record_waiting_files ();
+        tgts_started = fstart->lineno;
+
+        /* Search the line for an unquoted ; that is not after an
+           unquoted #.  */
+        cmdleft = find_map_unquote (line, MAP_SEMI|MAP_COMMENT|MAP_VARIABLE);
+        if (cmdleft != 0 && *cmdleft == '#')
+          {
+            /* We found a comment before a semicolon.  */
+            *cmdleft = '\0';
+            cmdleft = 0;
+          }
+        else if (cmdleft != 0)
+          /* Found one.  Cut the line short there before expanding it.  */
+          *(cmdleft++) = '\0';
+        semip = cmdleft;
+
+        collapse_continuations (line);
+
+        /* We can't expand the entire line, since if it's a per-target
+           variable we don't want to expand it.  So, walk from the
+           beginning, expanding as we go, and looking for "interesting"
+           chars.  The first word is always expandable.  */
+        wtype = get_next_mword (line, &lb_next, &wlen);
+        switch (wtype)
+          {
+          case w_eol:
+            if (cmdleft != 0)
+              O (fatal, fstart, _("missing rule before recipe"));
+            /* This line contained something but turned out to be nothing
+               but whitespace (a comment?).  */
+            continue;
+
+          case w_colon:
+          case w_dcolon:
+          case w_ampcolon:
+          case w_ampdcolon:
+            /* We accept and ignore rules without targets for
+               compatibility with SunOS 4 make.  */
+            no_targets = 1;
+            continue;
+
+          default:
+            break;
+          }
+
+        p2 = variable_expand_string (NULL, lb_next, wlen);
+
+        while (1)
+          {
+            lb_next += wlen;
+            if (cmdleft == 0)
+              {
+                /* Look for a semicolon in the expanded line.  */
+                cmdleft = find_char_unquote (p2, ';');
+
+                if (cmdleft != 0)
+                  {
+                    size_t p2_off = p2 - variable_buffer;
+                    size_t cmd_off = cmdleft - variable_buffer;
+                    char *pend = p2 + strlen (p2);
+
+                    /* Append any remnants of lb, then cut the line short
+                       at the semicolon.  */
+                    *cmdleft = '\0';
+
+                    /* One school of thought says that you shouldn't expand
+                       here, but merely copy, since now you're beyond a ";"
+                       and into a command script.  However, the old parser
+                       expanded the whole line, so we continue that for
+                       backwards-compatibility.  Also, it wouldn't be
+                       entirely consistent, since we do an unconditional
+                       expand below once we know we don't have a
+                       target-specific variable. */
+                    variable_expand_string (pend, lb_next, SIZE_MAX);
+                    lb_next += strlen (lb_next);
+                    p2 = variable_buffer + p2_off;
+                    cmdleft = variable_buffer + cmd_off + 1;
+                  }
+              }
+
+            colonp = find_char_unquote (p2, ':');
+
+#ifdef HAVE_DOS_PATHS
+            if (colonp > p2)
+              /* The drive spec brain-damage strikes again...
+                 Note that the only separators of targets in this context are
+                 whitespace and a left paren.  If others are possible, add them
+                 to the string in the call to strchr.  */
+              while (colonp && (colonp[1] == '/' || colonp[1] == '\\') &&
+                     isalpha ((unsigned char) colonp[-1]) &&
+                     (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0))
+                colonp = find_char_unquote (colonp + 1, ':');
+#endif
+
+            if (colonp)
+              {
+                /* If the previous character is '&', back up before '&:' */
+                if (colonp > p2 && colonp[-1] == '&')
+                  --colonp;
+
+                break;
+              }
+
+            wtype = get_next_mword (lb_next, &lb_next, &wlen);
+            if (wtype == w_eol)
+              break;
+
+            p2 += strlen (p2);
+            *(p2++) = ' ';
+            p2 = variable_expand_string (p2, lb_next, wlen);
+            /* We don't need to worry about cmdleft here, because if it was
+               found in the variable_buffer the entire buffer has already
+               been expanded... we'll never get here.  */
+          }
+
+        p2 = next_token (variable_buffer);
+
+        /* If the word we're looking at is EOL, see if there's _anything_
+           on the line.  If not, a variable expanded to nothing, so ignore
+           it.  If so, we can't parse this line so punt.  */
+        if (wtype == w_eol)
+          {
+            if (*p2 == '\0')
+              continue;
+
+            /* There's no need to be ivory-tower about this: check for
+               one of the most common bugs found in makefiles...  */
+            if (cmd_prefix == '\t' && strneq (line, "        ", 8))
+              O (fatal, fstart, _("missing separator (did you mean TAB instead of 8 spaces?)"));
+            else
+              O (fatal, fstart, _("missing separator"));
+          }
+
+        {
+          char save = *colonp;
+
+          /* If we have &:, it specifies that the targets are understood to be
+             updated/created together by a single invocation of the recipe. */
+          if (save == '&')
+            also_make_targets = 1;
+
+          /* Make the colon the end-of-string so we know where to stop
+             looking for targets.  Start there again once we're done.  */
+          *colonp = '\0';
+          filenames = PARSE_SIMPLE_SEQ (&p2, struct nameseq);
+          *colonp = save;
+          p2 = colonp + (save == '&');
+        }
+
+        if (!filenames)
+          {
+            /* We accept and ignore rules without targets for
+               compatibility with SunOS 4 make.  */
+            no_targets = 1;
+            continue;
+          }
+        /* This should never be possible; we handled it above.  */
+        assert (*p2 != '\0');
+        ++p2;
+
+        /* Is this a one-colon or two-colon entry?  */
+        two_colon = *p2 == ':';
+        if (two_colon)
+          p2++;
+
+        /* Test to see if it's a target-specific variable.  Copy the rest
+           of the buffer over, possibly temporarily (we'll expand it later
+           if it's not a target-specific variable).  PLEN saves the length
+           of the unparsed section of p2, for later.  */
+        if (*lb_next != '\0')
+          {
+            size_t l = p2 - variable_buffer;
+            plen = strlen (p2);
+            variable_buffer_output (p2+plen, lb_next, strlen (lb_next)+1);
+            p2 = variable_buffer + l;
+          }
+
+        p2 = parse_var_assignment (p2, &vmod);
+        if (vmod.assign_v)
+          {
+            /* If there was a semicolon found, add it back, plus anything
+               after it.  */
+            if (semip)
+              {
+                size_t l = p2 - variable_buffer;
+                *(--semip) = ';';
+                collapse_continuations (semip);
+                variable_buffer_output (p2 + strlen (p2),
+                                        semip, strlen (semip)+1);
+                p2 = variable_buffer + l;
+              }
+            record_target_var (filenames, p2,
+                               vmod.override_v ? o_override : o_file,
+                               &vmod, fstart);
+            filenames = 0;
+            continue;
+          }
+
+        /* This is a normal target, _not_ a target-specific variable.
+           Unquote any = in the dependency list.  */
+        find_char_unquote (lb_next, '=');
+
+        /* Remember the command prefix for this target.  */
+        prefix = cmd_prefix;
+
+        /* We have some targets, so don't ignore the following commands.  */
+        no_targets = 0;
+
+        /* Expand the dependencies, etc.  */
+        if (*lb_next != '\0')
+          {
+            size_t l = p2 - variable_buffer;
+            variable_expand_string (p2 + plen, lb_next, SIZE_MAX);
+            p2 = variable_buffer + l;
+
+            /* Look for a semicolon in the expanded line.  */
+            if (cmdleft == 0)
+              {
+                cmdleft = find_char_unquote (p2, ';');
+                if (cmdleft != 0)
+                  *(cmdleft++) = '\0';
+              }
+          }
+
+        /* Is this a static pattern rule: 'target: %targ: %dep; ...'?  */
+        p = strchr (p2, ':');
+        while (p != 0 && p[-1] == '\\')
+          {
+            char *q = &p[-1];
+            int backslash = 0;
+            while (*q-- == '\\')
+              backslash = !backslash;
+            if (backslash)
+              p = strchr (p + 1, ':');
+            else
+              break;
+          }
+#ifdef _AMIGA
+        /* Here, the situation is quite complicated. Let's have a look
+           at a couple of targets:
+
+           install: dev:make
+
+           dev:make: make
+
+           dev:make:: xyz
+
+           The rule is that it's only a target, if there are TWO :'s
+           OR a space around the :.
+        */
+        if (p && !(ISSPACE (p[1]) || !p[1] || ISSPACE (p[-1])))
+          p = 0;
+#endif
+#ifdef HAVE_DOS_PATHS
+        {
+          int check_again;
+          do {
+            check_again = 0;
+            /* For DOS-style paths, skip a "C:\..." or a "C:/..." */
+            if (p != 0 && (p[1] == '\\' || p[1] == '/') &&
+                isalpha ((unsigned char)p[-1]) &&
+                (p == p2 + 1 || strchr (" \t:(", p[-2]) != 0)) {
+              p = strchr (p + 1, ':');
+              check_again = 1;
+            }
+          } while (check_again);
+        }
+#endif
+        if (p != 0)
+          {
+            struct nameseq *target;
+            target = PARSE_FILE_SEQ (&p2, struct nameseq, MAP_COLON, NULL,
+                                     PARSEFS_NOGLOB);
+            ++p2;
+            if (target == 0)
+              O (fatal, fstart, _("missing target pattern"));
+            else if (target->next != 0)
+              O (fatal, fstart, _("multiple target patterns"));
+            pattern_percent = find_percent_cached (&target->name);
+            pattern = target->name;
+            if (pattern_percent == 0)
+              O (fatal, fstart, _("target pattern contains no '%%'"));
+            free_ns (target);
+          }
+        else
+          pattern = 0;
+
+        /* Strip leading and trailing whitespaces. */
+        beg = p2;
+        end = beg + strlen (beg) - 1;
+        strip_whitespace (&beg, &end);
+
+        /* Put all the prerequisites here; they'll be parsed later.  */
+        if (beg <= end && *beg != '\0')
+          depstr = xstrndup (beg, end - beg + 1);
+        else
+          depstr = 0;
+
+        commands_idx = 0;
+        if (cmdleft != 0)
+          {
+            /* Semicolon means rest of line is a command.  */
+            size_t l = strlen (cmdleft);
+
+            cmds_started = fstart->lineno;
+
+            /* Add this command line to the buffer.  */
+            if (l + 2 > commands_len)
+              {
+                commands_len = (l + 2) * 2;
+                commands = xrealloc (commands, commands_len);
+              }
+            memcpy (commands, cmdleft, l);
+            commands_idx += l;
+            commands[commands_idx++] = '\n';
+          }
+
+        /* Determine if this target should be made default. We used to do
+           this in record_files() but because of the delayed target recording
+           and because preprocessor directives are legal in target's commands
+           it is too late. Consider this fragment for example:
+
+           foo:
+
+           ifeq ($(.DEFAULT_GOAL),foo)
+              ...
+           endif
+
+           Because the target is not recorded until after ifeq directive is
+           evaluated the .DEFAULT_GOAL does not contain foo yet as one
+           would expect. Because of this we have to move the logic here.  */
+
+        if (set_default && default_goal_var->value[0] == '\0')
+          {
+            struct dep *d;
+            struct nameseq *t = filenames;
+
+            for (; t != 0; t = t->next)
+              {
+                int reject = 0;
+                const char *name = t->name;
+
+                /* We have nothing to do if this is an implicit rule. */
+                if (strchr (name, '%') != 0)
+                  break;
+
+                /* See if this target's name does not start with a '.',
+                   unless it contains a slash.  */
+                if (*name == '.' && strchr (name, '/') == 0
+#ifdef HAVE_DOS_PATHS
+                    && strchr (name, '\\') == 0
+#endif
+                    )
+                  continue;
+
+
+                /* If this file is a suffix, don't let it be
+                   the default goal file.  */
+                for (d = suffix_file->deps; d != 0; d = d->next)
+                  {
+                    struct dep *d2;
+                    if (*dep_name (d) != '.' && streq (name, dep_name (d)))
+                      {
+                        reject = 1;
+                        break;
+                      }
+                    for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
+                      {
+                        size_t l = strlen (dep_name (d2));
+                        if (!strneq (name, dep_name (d2), l))
+                          continue;
+                        if (streq (name + l, dep_name (d)))
+                          {
+                            reject = 1;
+                            break;
+                          }
+                      }
+
+                    if (reject)
+                      break;
+                  }
+
+                if (!reject)
+                  {
+                    define_variable_global (".DEFAULT_GOAL", 13, t->name,
+                                            o_file, 0, NILF);
+                    break;
+                  }
+              }
+          }
+      }
+    }
+
+#undef word1eq
+
+  if (conditionals->if_cmds)
+    O (fatal, fstart, _("missing 'endif'"));
+
+  /* At eof, record the last rule.  */
+  record_waiting_files ();
+
+  free (collapsed);
+  free (commands);
+}
+\f
+
+/* Remove comments from LINE.
+   This will also remove backslashes that escape things.
+   It ignores comment characters that appear inside variable references.  */
+
+static void
+remove_comments (char *line)
+{
+  char *comment;
+
+  comment = find_map_unquote (line, MAP_COMMENT|MAP_VARIABLE);
+
+  if (comment != 0)
+    /* Cut off the line at the #.  */
+    *comment = '\0';
+}
+
+/* Execute a 'undefine' directive.
+   The undefine line has already been read, and NAME is the name of
+   the variable to be undefined. */
+
+static void
+do_undefine (char *name, enum variable_origin origin, struct ebuffer *ebuf)
+{
+  char *p, *var;
+
+  /* Expand the variable name and find the beginning (NAME) and end.  */
+  var = allocated_variable_expand (name);
+  name = next_token (var);
+  if (*name == '\0')
+    O (fatal, &ebuf->floc, _("empty variable name"));
+  p = name + strlen (name) - 1;
+  while (p > name && ISBLANK (*p))
+    --p;
+  p[1] = '\0';
+
+  undefine_variable_global (name, p - name + 1, origin);
+  free (var);
+}
+
+/* Execute a 'define' directive.
+   The first line has already been read, and NAME is the name of
+   the variable to be defined.  The following lines remain to be read.  */
+
+static struct variable *
+do_define (char *name, enum variable_origin origin, struct ebuffer *ebuf)
+{
+  struct variable *v;
+  struct variable var;
+  floc defstart;
+  int nlevels = 1;
+  size_t length = 100;
+  char *definition = xmalloc (length);
+  size_t idx = 0;
+  char *p, *n;
+
+  defstart = ebuf->floc;
+
+  p = parse_variable_definition (name, &var);
+  if (p == NULL)
+    /* No assignment token, so assume recursive.  */
+    var.flavor = f_recursive;
+  else
+    {
+      if (var.value[0] != '\0')
+        O (error, &defstart, _("extraneous text after 'define' directive"));
+
+      /* Chop the string before the assignment token to get the name.  */
+      var.name[var.length] = '\0';
+    }
+
+  /* Expand the variable name and find the beginning (NAME) and end.  */
+  n = allocated_variable_expand (name);
+  name = next_token (n);
+  if (name[0] == '\0')
+    O (fatal, &defstart, _("empty variable name"));
+  p = name + strlen (name) - 1;
+  while (p > name && ISBLANK (*p))
+    --p;
+  p[1] = '\0';
+
+  /* Now read the value of the variable.  */
+  while (1)
+    {
+      size_t len;
+      char *line;
+      long nlines = readline (ebuf);
+
+      /* If there is nothing left to be eval'd, there's no 'endef'!!  */
+      if (nlines < 0)
+        O (fatal, &defstart, _("missing 'endef', unterminated 'define'"));
+
+      ebuf->floc.lineno += nlines;
+      line = ebuf->buffer;
+
+      collapse_continuations (line);
+
+      /* If the line doesn't begin with a tab, test to see if it introduces
+         another define, or ends one.  Stop if we find an 'endef' */
+      if (line[0] != cmd_prefix)
+        {
+          p = next_token (line);
+          len = strlen (p);
+
+          /* If this is another 'define', increment the level count.  */
+          if ((len == 6 || (len > 6 && ISBLANK (p[6])))
+              && strneq (p, "define", 6))
+            ++nlevels;
+
+          /* If this is an 'endef', decrement the count.  If it's now 0,
+             we've found the last one.  */
+          else if ((len == 5 || (len > 5 && ISBLANK (p[5])))
+                   && strneq (p, "endef", 5))
+            {
+              p += 5;
+              remove_comments (p);
+              if (*(next_token (p)) != '\0')
+                O (error, &ebuf->floc,
+                   _("extraneous text after 'endef' directive"));
+
+              if (--nlevels == 0)
+                break;
+            }
+        }
+
+      /* Add this line to the variable definition.  */
+      len = strlen (line);
+      if (idx + len + 1 > length)
+        {
+          length = (idx + len) * 2;
+          definition = xrealloc (definition, length + 1);
+        }
+
+      memcpy (&definition[idx], line, len);
+      idx += len;
+      /* Separate lines with a newline.  */
+      definition[idx++] = '\n';
+    }
+
+  /* We've got what we need; define the variable.  */
+  if (idx == 0)
+    definition[0] = '\0';
+  else
+    definition[idx - 1] = '\0';
+
+  v = do_variable_definition (&defstart, name,
+                              definition, origin, var.flavor, 0);
+  free (definition);
+  free (n);
+  return (v);
+}
+\f
+/* Interpret conditional commands "ifdef", "ifndef", "ifeq",
+   "ifneq", "else" and "endif".
+   LINE is the input line, with the command as its first word.
+
+   FILENAME and LINENO are the filename and line number in the
+   current makefile.  They are used for error messages.
+
+   Value is -2 if the line is not a conditional at all,
+   -1 if the line is an invalid conditional,
+   0 if following text should be interpreted,
+   1 if following text should be ignored.  */
+
+static int
+conditional_line (char *line, size_t len, const floc *flocp)
+{
+  const char *cmdname;
+  enum { c_ifdef, c_ifndef, c_ifeq, c_ifneq, c_else, c_endif } cmdtype;
+  unsigned int i;
+  unsigned int o;
+
+  /* Compare a word, both length and contents. */
+#define word1eq(s)      (len == CSTRLEN (s) && strneq (s, line, CSTRLEN (s)))
+#define chkword(s, t)   if (word1eq (s)) { cmdtype = (t); cmdname = (s); }
+
+  /* Make sure this line is a conditional.  */
+  chkword ("ifdef", c_ifdef)
+  else chkword ("ifndef", c_ifndef)
+  else chkword ("ifeq", c_ifeq)
+  else chkword ("ifneq", c_ifneq)
+  else chkword ("else", c_else)
+  else chkword ("endif", c_endif)
+  else
+    return -2;
+
+  /* Found one: skip past it and any whitespace after it.  */
+  line += len;
+  NEXT_TOKEN (line);
+
+#define EXTRATEXT() OS (error, flocp, _("extraneous text after '%s' directive"), cmdname)
+#define EXTRACMD()  OS (fatal, flocp, _("extraneous '%s'"), cmdname)
+
+  /* An 'endif' cannot contain extra text, and reduces the if-depth by 1  */
+  if (cmdtype == c_endif)
+    {
+      if (*line != '\0')
+        EXTRATEXT ();
+
+      if (!conditionals->if_cmds)
+        EXTRACMD ();
+
+      --conditionals->if_cmds;
+
+      goto DONE;
+    }
+
+  /* An 'else' statement can either be simple, or it can have another
+     conditional after it.  */
+  if (cmdtype == c_else)
+    {
+      const char *p;
+
+      if (!conditionals->if_cmds)
+        EXTRACMD ();
+
+      o = conditionals->if_cmds - 1;
+
+      if (conditionals->seen_else[o])
+        O (fatal, flocp, _("only one 'else' per conditional"));
+
+      /* Change the state of ignorance.  */
+      switch (conditionals->ignoring[o])
+        {
+          case 0:
+            /* We've just been interpreting.  Never do it again.  */
+            conditionals->ignoring[o] = 2;
+            break;
+          case 1:
+            /* We've never interpreted yet.  Maybe this time!  */
+            conditionals->ignoring[o] = 0;
+            break;
+        }
+
+      /* It's a simple 'else'.  */
+      if (*line == '\0')
+        {
+          conditionals->seen_else[o] = 1;
+          goto DONE;
+        }
+
+      /* The 'else' has extra text.  That text must be another conditional
+         and cannot be an 'else' or 'endif'.  */
+
+      /* Find the length of the next word.  */
+      for (p = line+1; ! STOP_SET (*p, MAP_SPACE|MAP_NUL); ++p)
+        ;
+      len = p - line;
+
+      /* If it's 'else' or 'endif' or an illegal conditional, fail.  */
+      if (word1eq ("else") || word1eq ("endif")
+          || conditional_line (line, len, flocp) < 0)
+        EXTRATEXT ();
+      else
+        {
+          /* conditional_line() created a new level of conditional.
+             Raise it back to this level.  */
+          if (conditionals->ignoring[o] < 2)
+            conditionals->ignoring[o] = conditionals->ignoring[o+1];
+          --conditionals->if_cmds;
+        }
+
+      goto DONE;
+    }
+
+  if (conditionals->allocated == 0)
+    {
+      conditionals->allocated = 5;
+      conditionals->ignoring = xmalloc (conditionals->allocated);
+      conditionals->seen_else = xmalloc (conditionals->allocated);
+    }
+
+  o = conditionals->if_cmds++;
+  if (conditionals->if_cmds > conditionals->allocated)
+    {
+      conditionals->allocated += 5;
+      conditionals->ignoring = xrealloc (conditionals->ignoring,
+                                         conditionals->allocated);
+      conditionals->seen_else = xrealloc (conditionals->seen_else,
+                                          conditionals->allocated);
+    }
+
+  /* Record that we have seen an 'if...' but no 'else' so far.  */
+  conditionals->seen_else[o] = 0;
+
+  /* Search through the stack to see if we're already ignoring.  */
+  for (i = 0; i < o; ++i)
+    if (conditionals->ignoring[i])
+      {
+        /* We are already ignoring, so just push a level to match the next
+           "else" or "endif", and keep ignoring.  We don't want to expand
+           variables in the condition.  */
+        conditionals->ignoring[o] = 1;
+        return 1;
+      }
+
+  if (cmdtype == c_ifdef || cmdtype == c_ifndef)
+    {
+      size_t l;
+      char *var;
+      struct variable *v;
+      char *p;
+
+      /* Expand the thing we're looking up, so we can use indirect and
+         constructed variable names.  */
+      var = allocated_variable_expand (line);
+
+      /* Make sure there's only one variable name to test.  */
+      p = end_of_token (var);
+      l = p - var;
+      NEXT_TOKEN (p);
+      if (*p != '\0')
+        return -1;
+
+      var[l] = '\0';
+      v = lookup_variable (var, l);
+
+      conditionals->ignoring[o] =
+        ((v != 0 && *v->value != '\0') == (cmdtype == c_ifndef));
+
+      free (var);
+    }
+  else
+    {
+      /* "ifeq" or "ifneq".  */
+      char *s1, *s2;
+      size_t l;
+      char termin = *line == '(' ? ',' : *line;
+
+      if (termin != ',' && termin != '"' && termin != '\'')
+        return -1;
+
+      s1 = ++line;
+      /* Find the end of the first string.  */
+      if (termin == ',')
+        {
+          int count = 0;
+          for (; *line != '\0'; ++line)
+            if (*line == '(')
+              ++count;
+            else if (*line == ')')
+              --count;
+            else if (*line == ',' && count <= 0)
+              break;
+        }
+      else
+        while (*line != '\0' && *line != termin)
+          ++line;
+
+      if (*line == '\0')
+        return -1;
+
+      if (termin == ',')
+        {
+          /* Strip blanks after the first string.  */
+          char *p = line++;
+          while (ISBLANK (p[-1]))
+            --p;
+          *p = '\0';
+        }
+      else
+        *line++ = '\0';
+
+      s2 = variable_expand (s1);
+      /* We must allocate a new copy of the expanded string because
+         variable_expand re-uses the same buffer.  */
+      l = strlen (s2);
+      s1 = alloca (l + 1);
+      memcpy (s1, s2, l + 1);
+
+      if (termin != ',')
+        /* Find the start of the second string.  */
+        NEXT_TOKEN (line);
+
+      termin = termin == ',' ? ')' : *line;
+      if (termin != ')' && termin != '"' && termin != '\'')
+        return -1;
+
+      /* Find the end of the second string.  */
+      if (termin == ')')
+        {
+          int count = 0;
+          s2 = next_token (line);
+          for (line = s2; *line != '\0'; ++line)
+            {
+              if (*line == '(')
+                ++count;
+              else if (*line == ')')
+                {
+                  if (count <= 0)
+                    break;
+                  else
+                    --count;
+                }
+            }
+        }
+      else
+        {
+          ++line;
+          s2 = line;
+          while (*line != '\0' && *line != termin)
+            ++line;
+        }
+
+      if (*line == '\0')
+        return -1;
+
+      *(line++) = '\0';
+      NEXT_TOKEN (line);
+      if (*line != '\0')
+        EXTRATEXT ();
+
+      s2 = variable_expand (s2);
+      conditionals->ignoring[o] = (streq (s1, s2) == (cmdtype == c_ifneq));
+    }
+
+ DONE:
+  /* Search through the stack to see if we're ignoring.  */
+  for (i = 0; i < conditionals->if_cmds; ++i)
+    if (conditionals->ignoring[i])
+      return 1;
+  return 0;
+}
+\f
+
+/* Record target-specific variable values for files FILENAMES.
+   TWO_COLON is nonzero if a double colon was used.
+
+   The links of FILENAMES are freed, and so are any names in it
+   that are not incorporated into other data structures.
+
+   If the target is a pattern, add the variable to the pattern-specific
+   variable value list.  */
+
+static void
+record_target_var (struct nameseq *filenames, char *defn,
+                   enum variable_origin origin, struct vmodifiers *vmod,
+                   const floc *flocp)
+{
+  struct nameseq *nextf;
+  struct variable_set_list *global;
+
+  global = current_variable_set_list;
+
+  /* If the variable is an append version, store that but treat it as a
+     normal recursive variable.  */
+
+  for (; filenames != 0; filenames = nextf)
+    {
+      struct variable *v;
+      const char *name = filenames->name;
+      const char *percent;
+      struct pattern_var *p;
+
+      nextf = filenames->next;
+      free_ns (filenames);
+
+      /* If it's a pattern target, then add it to the pattern-specific
+         variable list.  */
+      percent = find_percent_cached (&name);
+      if (percent)
+        {
+          /* Get a reference for this pattern-specific variable struct.  */
+          p = create_pattern_var (name, percent);
+          p->variable.fileinfo = *flocp;
+          /* I don't think this can fail since we already determined it was a
+             variable definition.  */
+          v = assign_variable_definition (&p->variable, defn);
+          assert (v != 0);
+
+          v->origin = origin;
+          if (v->flavor == f_simple)
+            v->value = allocated_variable_expand (v->value);
+          else
+            v->value = xstrdup (v->value);
+        }
+      else
+        {
+          struct file *f;
+
+          /* Get a file reference for this file, and initialize it.
+             We don't want to just call enter_file() because that allocates a
+             new entry if the file is a double-colon, which we don't want in
+             this situation.  */
+          f = lookup_file (name);
+          if (!f)
+            f = enter_file (strcache_add (name));
+          else if (f->double_colon)
+            f = f->double_colon;
+
+          initialize_file_variables (f, 1);
+
+          current_variable_set_list = f->variables;
+          v = try_variable_definition (flocp, defn, origin, 1);
+          if (!v)
+            O (fatal, flocp, _("Malformed target-specific variable definition"));
+          current_variable_set_list = global;
+        }
+
+      /* Set up the variable to be *-specific.  */
+      v->per_target = 1;
+      v->private_var = vmod->private_v;
+      v->export = vmod->export_v ? v_export : v_default;
+
+      /* If it's not an override, check to see if there was a command-line
+         setting.  If so, reset the value.  */
+      if (v->origin != o_override)
+        {
+          struct variable *gv;
+          size_t len = strlen (v->name);
+
+          gv = lookup_variable (v->name, len);
+          if (gv && v != gv
+              && (gv->origin == o_env_override || gv->origin == o_command))
+            {
+              free (v->value);
+              v->value = xstrdup (gv->value);
+              v->origin = gv->origin;
+              v->recursive = gv->recursive;
+              v->append = 0;
+            }
+        }
+    }
+}
+\f
+/* Record a description line for files FILENAMES,
+   with dependencies DEPS, commands to execute described
+   by COMMANDS and COMMANDS_IDX, coming from FILENAME:COMMANDS_STARTED.
+   TWO_COLON is nonzero if a double colon was used.
+   If not nil, PATTERN is the '%' pattern to make this
+   a static pattern rule, and PATTERN_PERCENT is a pointer
+   to the '%' within it.
+
+   The links of FILENAMES are freed, and so are any names in it
+   that are not incorporated into other data structures.  */
+
+static void
+record_files (struct nameseq *filenames, int are_also_makes,
+              const char *pattern,
+              const char *pattern_percent, char *depstr,
+              unsigned int cmds_started, char *commands,
+              size_t commands_idx, int two_colon,
+              char prefix, const floc *flocp)
+{
+  struct commands *cmds;
+  struct dep *deps;
+  struct dep *also_make = NULL;
+  const char *implicit_percent;
+  const char *name;
+
+  /* If we've already snapped deps, that means we're in an eval being
+     resolved after the makefiles have been read in.  We can't add more rules
+     at this time, since they won't get snapped and we'll get core dumps.
+     See Savannah bug # 12124.  */
+  if (snapped_deps)
+    O (fatal, flocp, _("prerequisites cannot be defined in recipes"));
+
+  /* Determine if this is a pattern rule or not.  */
+  name = filenames->name;
+  implicit_percent = find_percent_cached (&name);
+
+  /* If there's a recipe, set up a struct for it.  */
+  if (commands_idx > 0)
+    {
+      cmds = xmalloc (sizeof (struct commands));
+      cmds->fileinfo.filenm = flocp->filenm;
+      cmds->fileinfo.lineno = cmds_started;
+      cmds->fileinfo.offset = 0;
+      cmds->commands = xstrndup (commands, commands_idx);
+      cmds->command_lines = 0;
+      cmds->recipe_prefix = prefix;
+    }
+  else if (are_also_makes)
+    O (fatal, flocp, _("grouped targets must provide a recipe"));
+  else
+     cmds = NULL;
+
+  /* If there's a prereq string then parse it--unless it's eligible for 2nd
+     expansion: if so, snap_deps() will do it.  */
+  if (depstr == 0)
+    deps = 0;
+  else
+    {
+      depstr = unescape_char (depstr, ':');
+      if (second_expansion && strchr (depstr, '$'))
+        {
+          deps = alloc_dep ();
+          deps->name = depstr;
+          deps->need_2nd_expansion = 1;
+          deps->staticpattern = pattern != 0;
+        }
+      else
+        {
+          deps = split_prereqs (depstr);
+          free (depstr);
+
+          /* We'll enter static pattern prereqs later when we have the stem.
+             We don't want to enter pattern rules at all so that we don't
+             think that they ought to exist (make manual "Implicit Rule Search
+             Algorithm", item 5c).  */
+          if (! pattern && ! implicit_percent)
+            deps = enter_prereqs (deps, NULL);
+        }
+    }
+
+  /* For implicit rules, _all_ the targets must have a pattern.  That means we
+     can test the first one to see if we're working with an implicit rule; if
+     so we handle it specially. */
+
+  if (implicit_percent)
+    {
+      struct nameseq *nextf;
+      const char **targets, **target_pats;
+      unsigned short c;
+
+      if (pattern != 0)
+        O (fatal, flocp, _("mixed implicit and static pattern rules"));
+
+      /* Count the targets to create an array of target names.
+         We already have the first one.  */
+      nextf = filenames->next;
+      free_ns (filenames);
+      filenames = nextf;
+
+      for (c = 1; nextf; ++c, nextf = nextf->next)
+        ;
+      targets = xmalloc (c * sizeof (const char *));
+      target_pats = xmalloc (c * sizeof (const char *));
+
+      targets[0] = name;
+      target_pats[0] = implicit_percent;
+
+      c = 1;
+      while (filenames)
+        {
+          name = filenames->name;
+          implicit_percent = find_percent_cached (&name);
+
+          if (implicit_percent == 0)
+            O (fatal, flocp, _("mixed implicit and normal rules"));
+
+          targets[c] = name;
+          target_pats[c] = implicit_percent;
+          ++c;
+
+          nextf = filenames->next;
+          free_ns (filenames);
+          filenames = nextf;
+        }
+
+      create_pattern_rule (targets, target_pats, c, two_colon, deps, cmds, 1);
+
+      return;
+    }
+
+
+  /* Walk through each target and create it in the database.
+     We already set up the first target, above.  */
+  while (1)
+    {
+      struct nameseq *nextf = filenames->next;
+      struct file *f;
+      struct dep *this = 0;
+
+      free_ns (filenames);
+
+      /* Check for special targets.  Do it here instead of, say, snap_deps()
+         so that we can immediately use the value.  */
+      if (!posix_pedantic && streq (name, ".POSIX"))
+        {
+          posix_pedantic = 1;
+          define_variable_cname (".SHELLFLAGS", "-ec", o_default, 0);
+          /* These default values are based on IEEE Std 1003.1-2008.
+             It requires '-O 1' for [CF]FLAGS, but GCC doesn't allow space
+             between -O and the number so omit it here.  */
+          define_variable_cname ("ARFLAGS", "-rv", o_default, 0);
+          define_variable_cname ("CC", "c99", o_default, 0);
+          define_variable_cname ("CFLAGS", "-O1", o_default, 0);
+          define_variable_cname ("FC", "fort77", o_default, 0);
+          define_variable_cname ("FFLAGS", "-O1", o_default, 0);
+          define_variable_cname ("SCCSGETFLAGS", "-s", o_default, 0);
+        }
+      else if (!second_expansion && streq (name, ".SECONDEXPANSION"))
+        second_expansion = 1;
+#if !defined (__MSDOS__) && !defined (__EMX__)
+      else if (!one_shell && streq (name, ".ONESHELL"))
+        one_shell = 1;
+#endif
+
+      /* If this is a static pattern rule:
+         'targets: target%pattern: prereq%pattern; recipe',
+         make sure the pattern matches this target name.  */
+      if (pattern && !pattern_matches (pattern, pattern_percent, name))
+        OS (error, flocp,
+            _("target '%s' doesn't match the target pattern"), name);
+      else if (deps)
+        /* If there are multiple targets, copy the chain DEPS for all but the
+           last one.  It is not safe for the same deps to go in more than one
+           place in the database.  */
+        this = nextf != 0 ? copy_dep_chain (deps) : deps;
+
+      /* Find or create an entry in the file database for this target.  */
+      if (!two_colon)
+        {
+          /* Single-colon.  Combine this rule with the file's existing record,
+             if any.  */
+          f = enter_file (strcache_add (name));
+          if (f->double_colon)
+            OS (fatal, flocp,
+                _("target file '%s' has both : and :: entries"), f->name);
+
+          /* If CMDS == F->CMDS, this target was listed in this rule
+             more than once.  Just give a warning since this is harmless.  */
+          if (cmds != 0 && cmds == f->cmds)
+            OS (error, flocp,
+                _("target '%s' given more than once in the same rule"),
+                f->name);
+
+          /* Check for two single-colon entries both with commands.
+             Check is_target so that we don't lose on files such as .c.o
+             whose commands were preinitialized.  */
+          else if (cmds != 0 && f->cmds != 0 && f->is_target)
+            {
+              size_t l = strlen (f->name);
+              error (&cmds->fileinfo, l,
+                     _("warning: overriding recipe for target '%s'"),
+                     f->name);
+              error (&f->cmds->fileinfo, l,
+                     _("warning: ignoring old recipe for target '%s'"),
+                     f->name);
+            }
+
+          /* Defining .DEFAULT with no deps or cmds clears it.  */
+          if (f == default_file && this == 0 && cmds == 0)
+            f->cmds = 0;
+          if (cmds != 0)
+            f->cmds = cmds;
+
+          /* Defining .SUFFIXES with no dependencies clears out the list of
+             suffixes.  */
+          if (f == suffix_file && this == 0)
+            {
+              free_dep_chain (f->deps);
+              f->deps = 0;
+            }
+        }
+      else
+        {
+          /* Double-colon.  Make a new record even if there already is one.  */
+          f = lookup_file (name);
+
+          /* Check for both : and :: rules.  Check is_target so we don't lose
+             on default suffix rules or makefiles.  */
+          if (f != 0 && f->is_target && !f->double_colon)
+            OS (fatal, flocp,
+                _("target file '%s' has both : and :: entries"), f->name);
+
+          f = enter_file (strcache_add (name));
+          /* If there was an existing entry and it was a double-colon entry,
+             enter_file will have returned a new one, making it the prev
+             pointer of the old one, and setting its double_colon pointer to
+             the first one.  */
+          if (f->double_colon == 0)
+            /* This is the first entry for this name, so we must set its
+               double_colon pointer to itself.  */
+            f->double_colon = f;
+
+          f->cmds = cmds;
+        }
+
+      if (are_also_makes)
+        {
+          struct dep *also = alloc_dep();
+          also->name = f->name;
+          also->file = f;
+          also->next = also_make;
+          also_make = also;
+        }
+
+      f->is_target = 1;
+
+      /* If this is a static pattern rule, set the stem to the part of its
+         name that matched the '%' in the pattern, so you can use $* in the
+         commands.  If we didn't do it before, enter the prereqs now.  */
+      if (pattern)
+        {
+          static const char *percent = "%";
+          char *buffer = variable_expand ("");
+          char *o = patsubst_expand_pat (buffer, name, pattern, percent,
+                                         pattern_percent+1, percent+1);
+          f->stem = strcache_add_len (buffer, o - buffer);
+          if (this)
+            {
+              if (! this->need_2nd_expansion)
+                this = enter_prereqs (this, f->stem);
+              else
+                this->stem = f->stem;
+            }
+        }
+
+      /* Add the dependencies to this file entry.  */
+      if (this != 0)
+        {
+          /* Add the file's old deps and the new ones in THIS together.  */
+          if (f->deps == 0)
+            f->deps = this;
+          else if (cmds != 0)
+            {
+              struct dep *d = this;
+
+              /* If this rule has commands, put these deps first.  */
+              while (d->next != 0)
+                d = d->next;
+
+              d->next = f->deps;
+              f->deps = this;
+            }
+          else
+            {
+              struct dep *d = f->deps;
+
+              /* A rule without commands: put its prereqs at the end.  */
+              while (d->next != 0)
+                d = d->next;
+
+              d->next = this;
+            }
+        }
+
+      name = f->name;
+
+      /* All done!  Set up for the next one.  */
+      if (nextf == 0)
+        break;
+
+      filenames = nextf;
+
+      /* Reduce escaped percents.  If there are any unescaped it's an error  */
+      name = filenames->name;
+      if (find_percent_cached (&name))
+        O (error, flocp,
+           _("*** mixed implicit and normal rules: deprecated syntax"));
+    }
+
+  /* If there are also-makes, then populate a copy of the also-make list into
+     each one. For the last file, we take our original also_make list instead
+     wastefully copying it one more time and freeing it.  */
+  {
+    struct dep *i;
+
+    for (i = also_make; i != NULL; i = i->next)
+      {
+        struct file *f = i->file;
+        struct dep *cpy = i->next ? copy_dep_chain (also_make) : also_make;
+
+        if (f->also_make)
+          {
+            OS (error, &cmds->fileinfo,
+                _("warning: overriding group membership for target '%s'"),
+                f->name);
+            free_dep_chain (f->also_make);
+          }
+
+        f->also_make = cpy;
+      }
+    }
+}
+\f
+/* Search STRING for an unquoted STOPMAP.
+   Backslashes quote elements from STOPMAP and backslash.
+   Quoting backslashes are removed from STRING by compacting it into itself.
+   Returns a pointer to the first unquoted STOPCHAR if there is one, or nil if
+   there are none.
+
+   If MAP_VARIABLE is set, then the complete contents of variable references
+   are skipped, even if the contain STOPMAP characters.  */
+
+static char *
+find_map_unquote (char *string, int stopmap)
+{
+  size_t string_len = 0;
+  char *p = string;
+
+  /* Always stop on NUL.  */
+  stopmap |= MAP_NUL;
+
+  while (1)
+    {
+      while (! STOP_SET (*p, stopmap))
+        ++p;
+
+      if (*p == '\0')
+        break;
+
+      /* If we stopped due to a variable reference, skip over its contents.  */
+      if (*p == '$')
+        {
+          char openparen = p[1];
+
+          /* Check if '$' is the last character in the string.  */
+          if (openparen == '\0')
+            break;
+
+          p += 2;
+
+          /* Skip the contents of a non-quoted, multi-char variable ref.  */
+          if (openparen == '(' || openparen == '{')
+            {
+              unsigned int pcount = 1;
+              char closeparen = (openparen == '(' ? ')' : '}');
+
+              while (*p)
+                {
+                  if (*p == openparen)
+                    ++pcount;
+                  else if (*p == closeparen)
+                    if (--pcount == 0)
+                      {
+                        ++p;
+                        break;
+                      }
+                  ++p;
+                }
+            }
+
+          /* Skipped the variable reference: look for STOPCHARS again.  */
+          continue;
+        }
+
+      if (p > string && p[-1] == '\\')
+        {
+          /* Search for more backslashes.  */
+          int i = -2;
+          while (&p[i] >= string && p[i] == '\\')
+            --i;
+          ++i;
+          /* Only compute the length if really needed.  */
+          if (string_len == 0)
+            string_len = strlen (string);
+          /* The number of backslashes is now -I.
+             Copy P over itself to swallow half of them.  */
+          memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1);
+          p += i/2;
+          if (i % 2 == 0)
+            /* All the backslashes quoted each other; the STOPCHAR was
+               unquoted.  */
+            return p;
+
+          /* The STOPCHAR was quoted by a backslash.  Look for another.  */
+        }
+      else
+        /* No backslash in sight.  */
+        return p;
+    }
+
+  /* Never hit a STOPCHAR or blank (with BLANK nonzero).  */
+  return 0;
+}
+
+static char *
+find_char_unquote (char *string, int stop)
+{
+  size_t string_len = 0;
+  char *p = string;
+
+  while (1)
+    {
+      p = strchr(p, stop);
+
+      if (!p)
+        return NULL;
+
+      if (p > string && p[-1] == '\\')
+        {
+          /* Search for more backslashes.  */
+          int i = -2;
+          while (&p[i] >= string && p[i] == '\\')
+            --i;
+          ++i;
+          /* Only compute the length if really needed.  */
+          if (string_len == 0)
+            string_len = strlen (string);
+          /* The number of backslashes is now -I.
+             Copy P over itself to swallow half of them.  */
+          memmove (&p[i], &p[i/2], (string_len - (p - string)) - (i/2) + 1);
+          p += i/2;
+          if (i % 2 == 0)
+            /* All the backslashes quoted each other; the STOPCHAR was
+               unquoted.  */
+            return p;
+
+          /* The STOPCHAR was quoted by a backslash.  Look for another.  */
+        }
+      else
+        /* No backslash in sight.  */
+        return p;
+    }
+}
+
+/* Unescape a character in a string.  The string is compressed onto itself.  */
+
+static char *
+unescape_char (char *string, int c)
+{
+  char *p = string;
+  char *s = string;
+
+  while (*s != '\0')
+    {
+      if (*s == '\\')
+        {
+          char *e = s;
+          size_t l;
+
+          /* We found a backslash.  See if it's escaping our character.  */
+          while (*e == '\\')
+            ++e;
+          l = e - s;
+
+          if (*e != c || l%2 == 0)
+            {
+              /* It's not; just take it all without unescaping.  */
+              memmove (p, s, l);
+              p += l;
+
+              /* If we hit the end of the string, we're done.  */
+              if (*e == '\0')
+                break;
+            }
+          else if (l > 1)
+            {
+              /* It is, and there's >1 backslash.  Take half of them.  */
+              l /= 2;
+              memmove (p, s, l);
+              p += l;
+            }
+
+          s = e;
+        }
+
+      *(p++) = *(s++);
+    }
+
+  *p = '\0';
+  return string;
+}
+
+/* Search PATTERN for an unquoted % and handle quoting.  */
+
+char *
+find_percent (char *pattern)
+{
+  return find_char_unquote (pattern, '%');
+}
+
+/* Search STRING for an unquoted % and handle quoting.  Returns a pointer to
+   the % or NULL if no % was found.
+   This version is used with strings in the string cache: if there's a need to
+   modify the string a new version will be added to the string cache and
+   *STRING will be set to that.  */
+
+const char *
+find_percent_cached (const char **string)
+{
+  const char *p = *string;
+  char *new = 0;
+  size_t slen = 0;
+
+  /* If the first char is a % return now.  This lets us avoid extra tests
+     inside the loop.  */
+  if (*p == '%')
+    return p;
+
+  while (1)
+    {
+      p = strchr(p, '%');
+
+      if (!p)
+        break;
+
+      /* See if this % is escaped with a backslash; if not we're done.  */
+      if (p[-1] != '\\')
+        break;
+
+      {
+        /* Search for more backslashes.  */
+        char *pv;
+        int i = -2;
+
+        while (&p[i] >= *string && p[i] == '\\')
+          --i;
+        ++i;
+
+        /* At this point we know we'll need to allocate a new string.
+           Make a copy if we haven't yet done so.  */
+        if (! new)
+          {
+            slen = strlen (*string);
+            new = alloca (slen + 1);
+            memcpy (new, *string, slen + 1);
+            p = new + (p - *string);
+            *string = new;
+          }
+
+        /* At this point *string, p, and new all point into the same string.
+           Get a non-const version of p so we can modify new.  */
+        pv = new + (p - *string);
+
+        /* The number of backslashes is now -I.
+           Copy P over itself to swallow half of them.  */
+        memmove (&pv[i], &pv[i/2], (slen - (pv - new)) - (i/2) + 1);
+        p += i/2;
+
+        /* If the backslashes quoted each other; the % was unquoted.  */
+        if (i % 2 == 0)
+          break;
+      }
+    }
+
+  /* If we had to change STRING, add it to the strcache.  */
+  if (new)
+    {
+      *string = strcache_add (*string);
+      if (p)
+        p = *string + (p - new);
+    }
+
+  /* If we didn't find a %, return NULL.  Otherwise return a ptr to it.  */
+  return p;
+}
+\f
+/* Find the next line of text in an eval buffer, combining continuation lines
+   into one line.
+   Return the number of actual lines read (> 1 if continuation lines).
+   Returns -1 if there's nothing left in the buffer.
+
+   After this function, ebuf->buffer points to the first character of the
+   line we just found.
+ */
+
+/* Read a line of text from a STRING.
+   Since we aren't really reading from a file, don't bother with linenumbers.
+ */
+
+static long
+readstring (struct ebuffer *ebuf)
+{
+  char *eol;
+
+  /* If there is nothing left in this buffer, return 0.  */
+  if (ebuf->bufnext >= ebuf->bufstart + ebuf->size)
+    return -1;
+
+  /* Set up a new starting point for the buffer, and find the end of the
+     next logical line (taking into account backslash/newline pairs).  */
+
+  eol = ebuf->buffer = ebuf->bufnext;
+
+  while (1)
+    {
+      int backslash = 0;
+      const char *bol = eol;
+      const char *p;
+
+      /* Find the next newline.  At EOS, stop.  */
+      p = eol = strchr (eol , '\n');
+      if (!eol)
+        {
+          ebuf->bufnext = ebuf->bufstart + ebuf->size + 1;
+          return 0;
+        }
+
+      /* Found a newline; if it's escaped continue; else we're done.  */
+      while (p > bol && *(--p) == '\\')
+        backslash = !backslash;
+      if (!backslash)
+        break;
+      ++eol;
+    }
+
+  /* Overwrite the newline char.  */
+  *eol = '\0';
+  ebuf->bufnext = eol+1;
+
+  return 0;
+}
+
+static long
+readline (struct ebuffer *ebuf)
+{
+  char *p;
+  char *end;
+  char *start;
+  long nlines = 0;
+
+  /* The behaviors between string and stream buffers are different enough to
+     warrant different functions.  Do the Right Thing.  */
+
+  if (!ebuf->fp)
+    return readstring (ebuf);
+
+  /* When reading from a file, we always start over at the beginning of the
+     buffer for each new line.  */
+
+  p = start = ebuf->bufstart;
+  end = p + ebuf->size;
+  *p = '\0';
+
+  while (fgets (p, (int) (end - p), ebuf->fp) != 0)
+    {
+      char *p2;
+      size_t len;
+      int backslash;
+
+      len = strlen (p);
+      if (len == 0)
+        {
+          /* This only happens when the first thing on the line is a '\0'.
+             It is a pretty hopeless case, but (wonder of wonders) Athena
+             lossage strikes again!  (xmkmf puts NULs in its makefiles.)
+             There is nothing really to be done; we synthesize a newline so
+             the following line doesn't appear to be part of this line.  */
+          O (error, &ebuf->floc,
+             _("warning: NUL character seen; rest of line ignored"));
+          p[0] = '\n';
+          len = 1;
+        }
+
+      /* Jump past the text we just read.  */
+      p += len;
+
+      /* If the last char isn't a newline, the whole line didn't fit into the
+         buffer.  Get some more buffer and try again.  */
+      if (p[-1] != '\n')
+        goto more_buffer;
+
+      /* We got a newline, so add one to the count of lines.  */
+      ++nlines;
+
+#if !defined(WINDOWS32) && !defined(__MSDOS__) && !defined(__EMX__)
+      /* Check to see if the line was really ended with CRLF; if so ignore
+         the CR.  */
+      if ((p - start) > 1 && p[-2] == '\r')
+        {
+          --p;
+          memmove (p-1, p, strlen (p) + 1);
+        }
+#endif
+
+      backslash = 0;
+      for (p2 = p - 2; p2 >= start; --p2)
+        {
+          if (*p2 != '\\')
+            break;
+          backslash = !backslash;
+        }
+
+      if (!backslash)
+        {
+          p[-1] = '\0';
+          break;
+        }
+
+      /* It was a backslash/newline combo.  If we have more space, read
+         another line.  */
+      if (end - p >= 80)
+        continue;
+
+      /* We need more space at the end of our buffer, so realloc it.
+         Make sure to preserve the current offset of p.  */
+    more_buffer:
+      {
+        size_t off = p - start;
+        ebuf->size *= 2;
+        start = ebuf->buffer = ebuf->bufstart = xrealloc (start, ebuf->size);
+        p = start + off;
+        end = start + ebuf->size;
+        *p = '\0';
+      }
+    }
+
+  if (ferror (ebuf->fp))
+    pfatal_with_name (ebuf->floc.filenm);
+
+  /* If we found some lines, return how many.
+     If we didn't, but we did find _something_, that indicates we read the last
+     line of a file with no final newline; return 1.
+     If we read nothing, we're at EOF; return -1.  */
+
+  return nlines ? nlines : p == ebuf->bufstart ? -1 : 1;
+}
+\f
+/* Parse the next "makefile word" from the input buffer, and return info
+   about it.
+
+   A "makefile word" is one of:
+
+     w_bogus        Should never happen
+     w_eol          End of input
+     w_static       A static word; cannot be expanded
+     w_variable     A word containing one or more variables/functions
+     w_colon        A colon
+     w_dcolon       A double-colon
+     w_ampcolon     An ampersand-colon (&:) token
+     w_ampdcolon    An ampersand-double-colon (&::) token
+     w_semicolon    A semicolon
+     w_varassign    A variable assignment operator (=, :=, ::=, +=, ?=, or !=)
+
+   Note that this function is only used when reading certain parts of the
+   makefile.  Don't use it where special rules hold sway (RHS of a variable,
+   in a command list, etc.)  */
+
+static enum make_word_type
+get_next_mword (char *buffer, char **startp, size_t *length)
+{
+  enum make_word_type wtype;
+  char *p = buffer, *beg;
+  char c;
+
+  /* Skip any leading whitespace.  */
+  while (ISBLANK (*p))
+    ++p;
+
+  beg = p;
+  c = *(p++);
+
+  /* Look at the start of the word to see if it's simple.  */
+  switch (c)
+    {
+    case '\0':
+      wtype = w_eol;
+      goto done;
+
+    case ';':
+      wtype = w_semicolon;
+      goto done;
+
+    case '=':
+      wtype = w_varassign;
+      goto done;
+
+    case ':':
+      if (*p == '=')
+        {
+          ++p;
+          wtype = w_varassign; /* := */
+        }
+      else if (*p == ':')
+        {
+          ++p;
+          if (p[1] == '=')
+            {
+              ++p;
+              wtype = w_varassign; /* ::= */
+            }
+          else
+            wtype = w_dcolon;
+        }
+      else
+        wtype = w_colon;
+      goto done;
+
+    case '&':
+      if (*p == ':')
+        {
+          ++p;
+          if (*p != ':')
+            wtype = w_ampcolon; /* &: */
+          else
+            {
+              ++p;
+              wtype = w_ampdcolon; /* &:: */
+            }
+          goto done;
+        }
+      break;
+
+    case '+':
+    case '?':
+    case '!':
+      if (*p == '=')
+        {
+          ++p;
+          wtype = w_varassign; /* += or ?= or != */
+          goto done;
+        }
+      break;
+
+    default:
+      break;
+    }
+
+  /* This is some non-operator word.  A word consists of the longest
+     string of characters that doesn't contain whitespace, one of [:=#],
+     or [?+!]=, or &:.  */
+
+  /* We start out assuming a static word; if we see a variable we'll
+     adjust our assumptions then.  */
+  wtype = w_static;
+
+  /* We already found the first value of "c", above.  */
+  while (1)
+    {
+      char closeparen;
+      int count;
+
+      switch (c)
+        {
+        case '\0':
+        case ' ':
+        case '\t':
+        case '=':
+          goto done_word;
+
+        case ':':
+#ifdef HAVE_DOS_PATHS
+          /* A word CAN include a colon in its drive spec.  The drive
+             spec is allowed either at the beginning of a word, or as part
+             of the archive member name, like in "libfoo.a(d:/foo/bar.o)".  */
+          if ((p - beg == 2 || (p - beg > 2 && p[-3] == '('))
+              && isalpha ((unsigned char)p[-2]))
+            break;
+#endif
+          goto done_word;
+
+        case '$':
+          c = *(p++);
+          if (c == '$')
+            break;
+          if (c == '\0')
+            goto done_word;
+
+          /* This is a variable reference, so note that it's expandable.
+             Then read it to the matching close paren.  */
+          wtype = w_variable;
+
+          if (c == '(')
+            closeparen = ')';
+          else if (c == '{')
+            closeparen = '}';
+          else
+            /* This is a single-letter variable reference.  */
+            break;
+
+          for (count=0; *p != '\0'; ++p)
+            {
+              if (*p == c)
+                ++count;
+              else if (*p == closeparen && --count < 0)
+                {
+                  ++p;
+                  break;
+                }
+            }
+          break;
+
+        case '?':
+        case '+':
+          if (*p == '=')
+            goto done_word;
+          break;
+
+        case '\\':
+          switch (*p)
+            {
+            case ':':
+            case ';':
+            case '=':
+            case '\\':
+              ++p;
+              break;
+            }
+          break;
+
+        case '&':
+          if (*p == ':')
+            goto done_word;
+          break;
+
+        default:
+          break;
+        }
+
+      c = *(p++);
+    }
+ done_word:
+  --p;
+
+ done:
+  if (startp)
+    *startp = beg;
+  if (length)
+    *length = p - beg;
+  return wtype;
+}
+\f
+/* Construct the list of include directories
+   from the arguments and the default list.  */
+
+void
+construct_include_path (const char **arg_dirs)
+{
+#ifdef VAXC             /* just don't ask ... */
+  stat_t stbuf;
+#else
+  struct stat stbuf;
+#endif
+  const char **dirs;
+  const char **cpp;
+  size_t idx;
+
+  /* Compute the number of pointers we need in the table.  */
+  idx = sizeof (default_include_directories) / sizeof (const char *);
+  if (arg_dirs)
+    for (cpp = arg_dirs; *cpp != 0; ++cpp)
+      ++idx;
+
+#ifdef  __MSDOS__
+  /* Add one for $DJDIR.  */
+  ++idx;
+#endif
+
+  dirs = xmalloc (idx * sizeof (const char *));
+
+  idx = 0;
+  max_incl_len = 0;
+
+  /* First consider any dirs specified with -I switches.
+     Ignore any that don't exist.  Remember the maximum string length.  */
+
+  if (arg_dirs)
+    while (*arg_dirs != 0)
+      {
+        const char *dir = *(arg_dirs++);
+        char *expanded = 0;
+        int e;
+
+        if (dir[0] == '~')
+          {
+            expanded = tilde_expand (dir);
+            if (expanded != 0)
+              dir = expanded;
+          }
+
+        EINTRLOOP (e, stat (dir, &stbuf));
+        if (e == 0 && S_ISDIR (stbuf.st_mode))
+          {
+            size_t len = strlen (dir);
+            /* If dir name is written with trailing slashes, discard them.  */
+            while (len > 1 && dir[len - 1] == '/')
+              --len;
+            if (len > max_incl_len)
+              max_incl_len = len;
+            dirs[idx++] = strcache_add_len (dir, len);
+          }
+
+        free (expanded);
+      }
+
+  /* Now add the standard default dirs at the end.  */
+
+#ifdef  __MSDOS__
+  {
+    /* The environment variable $DJDIR holds the root of the DJGPP directory
+       tree; add ${DJDIR}/include.  */
+    struct variable *djdir = lookup_variable ("DJDIR", 5);
+
+    if (djdir)
+      {
+        size_t len = strlen (djdir->value) + 8;
+        char *defdir = alloca (len + 1);
+
+        strcat (strcpy (defdir, djdir->value), "/include");
+        dirs[idx++] = strcache_add (defdir);
+
+        if (len > max_incl_len)
+          max_incl_len = len;
+      }
+  }
+#endif
+
+  for (cpp = default_include_directories; *cpp != 0; ++cpp)
+    {
+      int e;
+
+      EINTRLOOP (e, stat (*cpp, &stbuf));
+      if (e == 0 && S_ISDIR (stbuf.st_mode))
+        {
+          size_t len = strlen (*cpp);
+          /* If dir name is written with trailing slashes, discard them.  */
+          while (len > 1 && (*cpp)[len - 1] == '/')
+            --len;
+          if (len > max_incl_len)
+            max_incl_len = len;
+          dirs[idx++] = strcache_add_len (*cpp, len);
+        }
+    }
+
+  dirs[idx] = 0;
+
+  /* Now add each dir to the .INCLUDE_DIRS variable.  */
+
+  for (cpp = dirs; *cpp != 0; ++cpp)
+    do_variable_definition (NILF, ".INCLUDE_DIRS", *cpp,
+                            o_default, f_append, 0);
+
+  include_directories = dirs;
+}
+\f
+/* Expand ~ or ~USER at the beginning of NAME.
+   Return a newly malloc'd string or 0.  */
+
+char *
+tilde_expand (const char *name)
+{
+#ifndef VMS
+  if (name[1] == '/' || name[1] == '\0')
+    {
+      char *home_dir;
+      int is_variable;
+
+      {
+        /* Turn off --warn-undefined-variables while we expand HOME.  */
+        int save = warn_undefined_variables_flag;
+        warn_undefined_variables_flag = 0;
+
+        home_dir = allocated_variable_expand ("$(HOME)");
+
+        warn_undefined_variables_flag = save;
+      }
+
+      is_variable = home_dir[0] != '\0';
+      if (!is_variable)
+        {
+          free (home_dir);
+          home_dir = getenv ("HOME");
+        }
+# if !defined(_AMIGA) && !defined(WINDOWS32)
+      if (home_dir == 0 || home_dir[0] == '\0')
+        {
+          char *logname = getlogin ();
+          home_dir = 0;
+          if (logname != 0)
+            {
+              struct passwd *p = getpwnam (logname);
+              if (p != 0)
+                home_dir = p->pw_dir;
+            }
+        }
+# endif /* !AMIGA && !WINDOWS32 */
+      if (home_dir != 0)
+        {
+          char *new = xstrdup (concat (2, home_dir, name + 1));
+          if (is_variable)
+            free (home_dir);
+          return new;
+        }
+    }
+# if !defined(_AMIGA) && !defined(WINDOWS32)
+  else
+    {
+      struct passwd *pwent;
+      char *userend = strchr (name + 1, '/');
+      if (userend != 0)
+        *userend = '\0';
+      pwent = getpwnam (name + 1);
+      if (pwent != 0)
+        {
+          if (userend == 0)
+            return xstrdup (pwent->pw_dir);
+          else
+            return xstrdup (concat (3, pwent->pw_dir, "/", userend + 1));
+        }
+      else if (userend != 0)
+        *userend = '/';
+    }
+# endif /* !AMIGA && !WINDOWS32 */
+#endif /* !VMS */
+  return 0;
+}
+\f
+/* Parse a string into a sequence of filenames represented as a chain of
+   struct nameseq's and return that chain.  Optionally expand the strings via
+   glob().
+
+   The string is passed as STRINGP, the address of a string pointer.
+   The string pointer is updated to point at the first character
+   not parsed, which either is a null char or equals STOPMAP.
+
+   SIZE is how large (in bytes) each element in the new chain should be.
+   This is useful if we want them actually to be other structures
+   that have room for additional info.
+
+   STOPMAP is a map of characters that tell us to stop parsing.
+
+   PREFIX, if non-null, is added to the beginning of each filename.
+
+   FLAGS allows one or more of the following bitflags to be set:
+        PARSEFS_NOSTRIP - Do no strip './'s off the beginning
+        PARSEFS_NOAR    - Do not check filenames for archive references
+        PARSEFS_NOGLOB  - Do not expand globbing characters
+        PARSEFS_EXISTS  - Only return globbed files that actually exist
+                          (cannot also set NOGLOB)
+        PARSEFS_NOCACHE - Do not add filenames to the strcache (caller frees)
+  */
+
+void *
+parse_file_seq (char **stringp, size_t size, int stopmap,
+                const char *prefix, int flags)
+{
+  /* tmp points to tmpbuf after the prefix, if any.
+     tp is the end of the buffer. */
+  static char *tmpbuf = NULL;
+
+  int cachep = NONE_SET (flags, PARSEFS_NOCACHE);
+
+  struct nameseq *new = 0;
+  struct nameseq **newp = &new;
+#define NEWELT(_n)  do { \
+                        const char *__n = (_n); \
+                        *newp = xcalloc (size); \
+                        (*newp)->name = (cachep ? strcache_add (__n) : xstrdup (__n)); \
+                        newp = &(*newp)->next; \
+                    } while(0)
+
+  char *p;
+  glob_t gl;
+  char *tp;
+  int findmap = stopmap|MAP_VMSCOMMA|MAP_NUL;
+
+  if (NONE_SET (flags, PARSEFS_ONEWORD))
+    findmap |= MAP_BLANK;
+
+  /* Always stop on NUL.  */
+  stopmap |= MAP_NUL;
+
+  if (size < sizeof (struct nameseq))
+    size = sizeof (struct nameseq);
+
+  if (NONE_SET (flags, PARSEFS_NOGLOB))
+    dir_setup_glob (&gl);
+
+  /* Get enough temporary space to construct the largest possible target.  */
+  {
+    static size_t tmpbuf_len = 0;
+    size_t l = strlen (*stringp) + 1;
+    if (l > tmpbuf_len)
+      {
+        tmpbuf = xrealloc (tmpbuf, l);
+        tmpbuf_len = l;
+      }
+  }
+  tp = tmpbuf;
+
+  /* Parse STRING.  P will always point to the end of the parsed content.  */
+  p = *stringp;
+  while (1)
+    {
+      const char *name;
+      const char **nlist = 0;
+      char *tildep = 0;
+      int globme = 1;
+#ifndef NO_ARCHIVES
+      char *arname = 0;
+      char *memname = 0;
+#endif
+      char *s;
+      size_t nlen;
+      int tot, i;
+
+      /* Skip whitespace; at the end of the string or STOPCHAR we're done.  */
+      NEXT_TOKEN (p);
+      if (STOP_SET (*p, stopmap))
+        break;
+
+      /* There are names left, so find the end of the next name.
+         Throughout this iteration S points to the start.  */
+      s = p;
+      p = find_map_unquote (p, findmap);
+
+#ifdef VMS
+        /* convert comma separated list to space separated */
+      if (p && *p == ',')
+        *p =' ';
+#endif
+#ifdef _AMIGA
+      /* If we stopped due to a device name, skip it.  */
+      if (p && p != s+1 && p[0] == ':')
+        p = find_map_unquote (p+1, findmap);
+#endif
+#ifdef HAVE_DOS_PATHS
+      /* If we stopped due to a drive specifier, skip it.
+         Tokens separated by spaces are treated as separate paths since make
+         doesn't allow path names with spaces.  */
+      if (p && p == s+1 && p[0] == ':'
+          && isalpha ((unsigned char)s[0]) && STOP_SET (p[1], MAP_DIRSEP))
+        p = find_map_unquote (p+1, findmap);
+#endif
+
+      if (!p)
+        p = s + strlen (s);
+
+      /* Strip leading "this directory" references.  */
+      if (NONE_SET (flags, PARSEFS_NOSTRIP))
+#ifdef VMS
+        /* Skip leading '[]'s. should only be one set or bug somwhere else */
+        if (p - s > 2 && s[0] == '[' && s[1] == ']')
+            s += 2;
+        /* Skip leading '<>'s. should only be one set or bug somwhere else */
+        if (p - s > 2 && s[0] == '<' && s[1] == '>')
+            s += 2;
+#endif
+        /* Skip leading './'s.  */
+        while (p - s > 2 && s[0] == '.' && s[1] == '/')
+          {
+            /* Skip "./" and all following slashes.  */
+            s += 2;
+            while (*s == '/')
+              ++s;
+          }
+
+      /* Extract the filename just found, and skip it.
+         Set NAME to the string, and NLEN to its length.  */
+
+      if (s == p)
+        {
+        /* The name was stripped to empty ("./"). */
+#if defined(_AMIGA)
+          /* PDS-- This cannot be right!! */
+          tp[0] = '\0';
+          nlen = 0;
+#else
+          tp[0] = '.';
+          tp[1] = '/';
+          tp[2] = '\0';
+          nlen = 2;
+#endif
+        }
+      else
+        {
+#ifdef VMS
+/* VMS filenames can have a ':' in them but they have to be '\'ed but we need
+ *  to remove this '\' before we can use the filename.
+ * xstrdup called because S may be read-only string constant.
+ */
+          char *n = tp;
+          while (s < p)
+            {
+              if (s[0] == '\\' && s[1] == ':')
+                ++s;
+              *(n++) = *(s++);
+            }
+          n[0] = '\0';
+          nlen = strlen (tp);
+#else
+          nlen = p - s;
+          memcpy (tp, s, nlen);
+          tp[nlen] = '\0';
+#endif
+        }
+
+      /* At this point, TP points to the element and NLEN is its length.  */
+
+#ifndef NO_ARCHIVES
+      /* If this is the start of an archive group that isn't complete, set up
+         to add the archive prefix for future files.  A file list like:
+         "libf.a(x.o y.o z.o)" needs to be expanded as:
+         "libf.a(x.o) libf.a(y.o) libf.a(z.o)"
+
+         TP == TMP means we're not already in an archive group.  Ignore
+         something starting with '(', as that cannot actually be an
+         archive-member reference (and treating it as such results in an empty
+         file name, which causes much lossage).  Also if it ends in ")" then
+         it's a complete reference so we don't need to treat it specially.
+
+         Finally, note that archive groups must end with ')' as the last
+         character, so ensure there's some word ending like that before
+         considering this an archive group.  */
+      if (NONE_SET (flags, PARSEFS_NOAR)
+          && tp == tmpbuf && tp[0] != '(' && tp[nlen-1] != ')')
+        {
+          char *n = strchr (tp, '(');
+          if (n)
+            {
+              /* This looks like the first element in an open archive group.
+                 A valid group MUST have ')' as the last character.  */
+              const char *e = p;
+              do
+                {
+                  const char *o = e;
+                  NEXT_TOKEN (e);
+                  /* Find the end of this word.  We don't want to unquote and
+                     we don't care about quoting since we're looking for the
+                     last char in the word. */
+                  while (! STOP_SET (*e, findmap))
+                    ++e;
+                  /* If we didn't move, we're done now.  */
+                  if (e == o)
+                    break;
+                  if (e[-1] == ')')
+                    {
+                      /* Found the end, so this is the first element in an
+                         open archive group.  It looks like "lib(mem".
+                         Reset TP past the open paren.  */
+                      nlen -= (n + 1) - tp;
+                      tp = n + 1;
+
+                      /* We can stop looking now.  */
+                      break;
+                    }
+                }
+              while (*e != '\0');
+
+              /* If we have just "lib(", part of something like "lib( a b)",
+                 go to the next item.  */
+              if (! nlen)
+                continue;
+            }
+        }
+
+      /* If we are inside an archive group, make sure it has an end.  */
+      if (tp > tmpbuf)
+        {
+          if (tp[nlen-1] == ')')
+            {
+              /* This is the natural end; reset TP.  */
+              tp = tmpbuf;
+
+              /* This is just ")", something like "lib(a b )": skip it.  */
+              if (nlen == 1)
+                continue;
+            }
+          else
+            {
+              /* Not the end, so add a "fake" end.  */
+              tp[nlen++] = ')';
+              tp[nlen] = '\0';
+            }
+        }
+#endif
+
+      /* If we're not globbing we're done: add it to the end of the chain.
+         Go to the next item in the string.  */
+      if (ANY_SET (flags, PARSEFS_NOGLOB))
+        {
+          NEWELT (concat (2, prefix, tmpbuf));
+          continue;
+        }
+
+      /* If we get here we know we're doing glob expansion.
+         TP is a string in tmpbuf.  NLEN is no longer used.
+         We may need to do more work: after this NAME will be set.  */
+      name = tmpbuf;
+
+      /* Expand tilde if applicable.  */
+      if (tmpbuf[0] == '~')
+        {
+          tildep = tilde_expand (tmpbuf);
+          if (tildep != 0)
+            name = tildep;
+        }
+
+#ifndef NO_ARCHIVES
+      /* If NAME is an archive member reference replace it with the archive
+         file name, and save the member name in MEMNAME.  We will glob on the
+         archive name and then reattach MEMNAME later.  */
+      if (NONE_SET (flags, PARSEFS_NOAR) && ar_name (name))
+        {
+          ar_parse_name (name, &arname, &memname);
+          name = arname;
+        }
+#endif /* !NO_ARCHIVES */
+
+      /* glob() is expensive: don't call it unless we need to.  */
+      if (NONE_SET (flags, PARSEFS_EXISTS) && strpbrk (name, "?*[") == NULL)
+        {
+          globme = 0;
+          tot = 1;
+          nlist = &name;
+        }
+      else
+        switch (glob (name, GLOB_ALTDIRFUNC, NULL, &gl))
+          {
+          case GLOB_NOSPACE:
+            out_of_memory ();
+
+          case 0:
+            /* Success.  */
+            tot = gl.gl_pathc;
+            nlist = (const char **)gl.gl_pathv;
+            break;
+
+          case GLOB_NOMATCH:
+            /* If we want only existing items, skip this one.  */
+            if (ANY_SET (flags, PARSEFS_EXISTS))
+              {
+                tot = 0;
+                break;
+              }
+            /* FALLTHROUGH */
+
+          default:
+            /* By default keep this name.  */
+            tot = 1;
+            nlist = &name;
+            break;
+          }
+
+      /* For each matched element, add it to the list.  */
+      for (i = 0; i < tot; ++i)
+#ifndef NO_ARCHIVES
+        if (memname != 0)
+          {
+            /* Try to glob on MEMNAME within the archive.  */
+            struct nameseq *found = ar_glob (nlist[i], memname, size);
+            if (! found)
+              /* No matches.  Use MEMNAME as-is.  */
+              NEWELT (concat (5, prefix, nlist[i], "(", memname, ")"));
+            else
+              {
+                /* We got a chain of items.  Attach them.  */
+                if (*newp)
+                  (*newp)->next = found;
+                else
+                  *newp = found;
+
+                /* Find and set the new end.  Massage names if necessary.  */
+                while (1)
+                  {
+                    if (! cachep)
+                      found->name = xstrdup (concat (2, prefix, name));
+                    else if (prefix)
+                      found->name = strcache_add (concat (2, prefix, name));
+
+                    if (found->next == 0)
+                      break;
+
+                    found = found->next;
+                  }
+                newp = &found->next;
+              }
+          }
+        else
+#endif /* !NO_ARCHIVES */
+          NEWELT (concat (2, prefix, nlist[i]));
+
+      if (globme)
+        globfree (&gl);
+
+#ifndef NO_ARCHIVES
+      free (arname);
+#endif
+
+      free (tildep);
+    }
+
+  *stringp = p;
+  return new;
+}
diff --git a/src/remake.c b/src/remake.c
new file mode 100644 (file)
index 0000000..fb237c5
--- /dev/null
@@ -0,0 +1,1755 @@
+/* Basic dependency engine for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "job.h"
+#include "commands.h"
+#include "dep.h"
+#include "variable.h"
+#include "debug.h"
+
+#include <assert.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#include <sys/file.h>
+#endif
+
+#ifdef VMS
+#include <starlet.h>
+#endif
+#ifdef WINDOWS32
+#include <io.h>
+#endif
+
+
+/* The test for circular dependencies is based on the 'updating' bit in
+   'struct file'.  However, double colon targets have separate 'struct
+   file's; make sure we always use the base of the double colon chain. */
+
+#define start_updating(_f)  (((_f)->double_colon ? (_f)->double_colon : (_f))\
+                             ->updating = 1)
+#define finish_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\
+                             ->updating = 0)
+#define is_updating(_f)     (((_f)->double_colon ? (_f)->double_colon : (_f))\
+                             ->updating)
+
+
+/* Incremented when a command is started (under -n, when one would be).  */
+unsigned int commands_started = 0;
+
+/* Set to the goal dependency.  Mostly needed for remaking makefiles.  */
+static struct goaldep *goal_list;
+static struct dep *goal_dep;
+
+/* Current value for pruning the scan of the goal chain.
+   All files start with considered == 0.  */
+static unsigned int considered = 0;
+
+static enum update_status update_file (struct file *file, unsigned int depth);
+static enum update_status update_file_1 (struct file *file, unsigned int depth);
+static enum update_status check_dep (struct file *file, unsigned int depth,
+                                     FILE_TIMESTAMP this_mtime, int *must_make);
+static enum update_status touch_file (struct file *file);
+static void remake_file (struct file *file);
+static FILE_TIMESTAMP name_mtime (const char *name);
+static const char *library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr);
+
+\f
+/* Remake all the goals in the 'struct dep' chain GOALS.  Return -1 if nothing
+   was done, 0 if all goals were updated successfully, or 1 if a goal failed.
+
+   If rebuilding_makefiles is nonzero, these goals are makefiles, so -t, -q,
+   and -n should be disabled for them unless they were also command-line
+   targets, and we should only make one goal at a time and return as soon as
+   one goal whose 'changed' member is nonzero is successfully made.  */
+
+enum update_status
+update_goal_chain (struct goaldep *goaldeps)
+{
+  int t = touch_flag, q = question_flag, n = just_print_flag;
+  enum update_status status = us_none;
+
+  /* Duplicate the chain so we can remove things from it.  */
+
+  struct dep *goals = copy_dep_chain ((struct dep *)goaldeps);
+
+  goal_list = rebuilding_makefiles ? goaldeps : NULL;
+
+#define MTIME(file) (rebuilding_makefiles ? file_mtime_no_search (file) \
+                     : file_mtime (file))
+
+  /* Start a fresh batch of consideration.  */
+  ++considered;
+
+  /* Update all the goals until they are all finished.  */
+
+  while (goals != 0)
+    {
+      struct dep *g, *lastgoal;
+
+      /* Start jobs that are waiting for the load to go down.  */
+
+      start_waiting_jobs ();
+
+      /* Wait for a child to die.  */
+
+      reap_children (1, 0);
+
+      lastgoal = 0;
+      g = goals;
+      while (g != 0)
+        {
+          /* Iterate over all double-colon entries for this file.  */
+          struct file *file;
+          int stop = 0, any_not_updated = 0;
+
+          goal_dep = g;
+
+          for (file = g->file->double_colon ? g->file->double_colon : g->file;
+               file != NULL;
+               file = file->prev)
+            {
+              unsigned int ocommands_started;
+              enum update_status fail;
+
+              file->dontcare = ANY_SET (g->flags, RM_DONTCARE);
+
+              check_renamed (file);
+              if (rebuilding_makefiles)
+                {
+                  if (file->cmd_target)
+                    {
+                      touch_flag = t;
+                      question_flag = q;
+                      just_print_flag = n;
+                    }
+                  else
+                    touch_flag = question_flag = just_print_flag = 0;
+                }
+
+              /* Save the old value of 'commands_started' so we can compare
+                 later.  It will be incremented when any commands are
+                 actually run.  */
+              ocommands_started = commands_started;
+
+              fail = update_file (file, rebuilding_makefiles ? 1 : 0);
+              check_renamed (file);
+
+              /* Set the goal's 'changed' flag if any commands were started
+                 by calling update_file above.  We check this flag below to
+                 decide when to give an "up to date" diagnostic.  */
+              if (commands_started > ocommands_started)
+                g->changed = 1;
+
+              stop = 0;
+              if ((fail || file->updated) && status < us_question)
+                {
+                  /* We updated this goal.  Update STATUS and decide whether
+                     to stop.  */
+                  if (file->update_status)
+                    {
+                      /* Updating failed, or -q triggered.  The STATUS value
+                         tells our caller which.  */
+                      status = file->update_status;
+                      /* If -q just triggered, stop immediately.  It doesn't
+                         matter how much more we run, since we already know
+                         the answer to return.  */
+                      stop = (question_flag && !keep_going_flag
+                              && !rebuilding_makefiles);
+                    }
+                  else
+                    {
+                      FILE_TIMESTAMP mtime = MTIME (file);
+                      check_renamed (file);
+
+                      if (file->updated && g->changed &&
+                           mtime != file->mtime_before_update)
+                        {
+                          /* Updating was done.  If this is a makefile and
+                             just_print_flag or question_flag is set (meaning
+                             -n or -q was given and this file was specified
+                             as a command-line target), don't change STATUS.
+                             If STATUS is changed, we will get re-exec'd, and
+                             enter an infinite loop.  */
+                          if (!rebuilding_makefiles
+                              || (!just_print_flag && !question_flag))
+                            status = us_success;
+                          if (rebuilding_makefiles && file->dontcare)
+                            /* This is a default makefile; stop remaking.  */
+                            stop = 1;
+                        }
+                    }
+                }
+
+              /* Keep track if any double-colon entry is not finished.
+                 When they are all finished, the goal is finished.  */
+              any_not_updated |= !file->updated;
+
+              file->dontcare = 0;
+
+              if (stop)
+                break;
+            }
+
+          /* Reset FILE since it is null at the end of the loop.  */
+          file = g->file;
+
+          if (stop || !any_not_updated)
+            {
+              /* If we have found nothing whatever to do for the goal,
+                 print a message saying nothing needs doing.  */
+
+              if (!rebuilding_makefiles
+                  /* If the update_status is success, we updated successfully
+                     or not at all.  G->changed will have been set above if
+                     any commands were actually started for this goal.  */
+                  && file->update_status == us_success && !g->changed
+                  /* Never give a message under -s or -q.  */
+                  && !run_silent && !question_flag)
+                OS (message, 1, ((file->phony || file->cmds == 0)
+                                 ? _("Nothing to be done for '%s'.")
+                                 : _("'%s' is up to date.")),
+                    file->name);
+
+              /* This goal is finished.  Remove it from the chain.  */
+              if (lastgoal == 0)
+                goals = g->next;
+              else
+                lastgoal->next = g->next;
+
+              /* Free the storage.  */
+              free (g);
+
+              g = lastgoal == 0 ? goals : lastgoal->next;
+
+              if (stop)
+                break;
+            }
+          else
+            {
+              lastgoal = g;
+              g = g->next;
+            }
+        }
+
+      /* If we reached the end of the dependency graph update CONSIDERED
+         for the next pass.  */
+      if (g == 0)
+        ++considered;
+    }
+
+  if (rebuilding_makefiles)
+    {
+      touch_flag = t;
+      question_flag = q;
+      just_print_flag = n;
+    }
+
+  return status;
+}
+\f
+/* If we're rebuilding an included makefile that failed, and we care
+   about errors, show an error message the first time.  */
+
+void
+show_goal_error (void)
+{
+  struct goaldep *goal;
+
+  if ((goal_dep->flags & (RM_INCLUDED|RM_DONTCARE)) != RM_INCLUDED)
+    return;
+
+  for (goal = goal_list; goal; goal = goal->next)
+    if (goal_dep->file == goal->file)
+      {
+        if (goal->error)
+          {
+            OSS (error, &goal->floc, "%s: %s",
+                 goal->file->name, strerror ((int)goal->error));
+            goal->error = 0;
+          }
+        return;
+      }
+}
+\f
+/* If FILE is not up to date, execute the commands for it.
+   Return 0 if successful, non-0 if unsuccessful;
+   but with some flag settings, just call 'exit' if unsuccessful.
+
+   DEPTH is the depth in recursions of this function.
+   We increment it during the consideration of our dependencies,
+   then decrement it again after finding out whether this file
+   is out of date.
+
+   If there are multiple double-colon entries for FILE,
+   each is considered in turn.  */
+
+static enum update_status
+update_file (struct file *file, unsigned int depth)
+{
+  enum update_status status = us_success;
+  struct file *f;
+
+  f = file->double_colon ? file->double_colon : file;
+
+  /* Prune the dependency graph: if we've already been here on _this_
+     pass through the dependency graph, we don't have to go any further.
+     We won't reap_children until we start the next pass, so no state
+     change is possible below here until then.  */
+  if (f->considered == considered)
+    {
+      /* Check for the case where a target has been tried and failed but
+         the diagnostics haven't been issued. If we need the diagnostics
+         then we will have to continue. */
+      if (!(f->updated && f->update_status > us_none
+            && !f->dontcare && f->no_diag))
+        {
+          DBF (DB_VERBOSE, _("Pruning file '%s'.\n"));
+          return f->command_state == cs_finished ? f->update_status : us_success;
+        }
+    }
+
+  /* This loop runs until we start commands for a double colon rule, or until
+     the chain is exhausted. */
+  for (; f != 0; f = f->prev)
+    {
+      enum update_status new;
+
+      f->considered = considered;
+
+      new = update_file_1 (f, depth);
+      check_renamed (f);
+
+      /* Clean up any alloca() used during the update.  */
+      alloca (0);
+
+      /* If we got an error, don't bother with double_colon etc.  */
+      if (new && !keep_going_flag)
+        return new;
+
+      if (f->command_state == cs_running
+          || f->command_state == cs_deps_running)
+        /* Don't run other :: rules for this target until
+           this rule is finished.  */
+        return us_success;
+
+      if (new > status)
+        status = new;
+    }
+
+  return status;
+}
+\f
+/* Show a message stating the target failed to build.  */
+
+static void
+complain (struct file *file)
+{
+  /* If this file has no_diag set then it means we tried to update it
+     before in the dontcare mode and failed. The target that actually
+     failed is not necessarily this file but could be one of its direct
+     or indirect dependencies. So traverse this file's dependencies and
+     find the one that actually caused the failure. */
+
+  struct dep *d;
+
+  for (d = file->deps; d != 0; d = d->next)
+    {
+      if (d->file->updated && d->file->update_status > us_none && file->no_diag)
+        {
+          complain (d->file);
+          break;
+        }
+    }
+
+  if (d == 0)
+    {
+      show_goal_error ();
+
+      /* Didn't find any dependencies to complain about. */
+      if (file->parent)
+        {
+          size_t l = strlen (file->name) + strlen (file->parent->name) + 4;
+          const char *m = _("%sNo rule to make target '%s', needed by '%s'%s");
+
+          if (!keep_going_flag)
+            fatal (NILF, l, m, "", file->name, file->parent->name, "");
+
+          error (NILF, l, m, "*** ", file->name, file->parent->name, ".");
+        }
+      else
+        {
+          size_t l = strlen (file->name) + 4;
+          const char *m = _("%sNo rule to make target '%s'%s");
+
+          if (!keep_going_flag)
+            fatal (NILF, l, m, "", file->name, "");
+
+          error (NILF, l, m, "*** ", file->name, ".");
+        }
+
+      file->no_diag = 0;
+    }
+}
+
+/* Consider a single 'struct file' and update it as appropriate.
+   Return 0 on success, or non-0 on failure.  */
+
+static enum update_status
+update_file_1 (struct file *file, unsigned int depth)
+{
+  enum update_status dep_status = us_success;
+  FILE_TIMESTAMP this_mtime;
+  int noexist, must_make, deps_changed;
+  struct file *ofile;
+  struct dep *d, *ad;
+  struct dep amake;
+  int running = 0;
+
+  DBF (DB_VERBOSE, _("Considering target file '%s'.\n"));
+
+  if (file->updated)
+    {
+      if (file->update_status > us_none)
+        {
+          DBF (DB_VERBOSE,
+               _("Recently tried and failed to update file '%s'.\n"));
+
+          /* If the file we tried to make is marked no_diag then no message
+             was printed about it when it failed during the makefile rebuild.
+             If we're trying to build it again in the normal rebuild, print a
+             message now.  */
+          if (file->no_diag && !file->dontcare)
+              complain (file);
+
+          return file->update_status;
+        }
+
+      DBF (DB_VERBOSE, _("File '%s' was considered already.\n"));
+      return 0;
+    }
+
+  switch (file->command_state)
+    {
+    case cs_not_started:
+    case cs_deps_running:
+      break;
+    case cs_running:
+      DBF (DB_VERBOSE, _("Still updating file '%s'.\n"));
+      return 0;
+    case cs_finished:
+      DBF (DB_VERBOSE, _("Finished updating file '%s'.\n"));
+      return file->update_status;
+    default:
+      abort ();
+    }
+
+  /* Determine whether the diagnostics will be issued should this update
+     fail. */
+  file->no_diag = file->dontcare;
+
+  ++depth;
+
+  /* Notice recursive update of the same file.  */
+  start_updating (file);
+
+  /* We might change file if we find a different one via vpath;
+     remember this one to turn off updating.  */
+  ofile = file;
+
+  /* Looking at the file's modtime beforehand allows the possibility
+     that its name may be changed by a VPATH search, and thus it may
+     not need an implicit rule.  If this were not done, the file
+     might get implicit commands that apply to its initial name, only
+     to have that name replaced with another found by VPATH search.  */
+
+  this_mtime = file_mtime (file);
+  check_renamed (file);
+  noexist = this_mtime == NONEXISTENT_MTIME;
+  if (noexist)
+    DBF (DB_BASIC, _("File '%s' does not exist.\n"));
+  else if (ORDINARY_MTIME_MIN <= this_mtime && this_mtime <= ORDINARY_MTIME_MAX
+           && file->low_resolution_time)
+    {
+      /* Avoid spurious rebuilds due to low resolution time stamps.  */
+      int ns = FILE_TIMESTAMP_NS (this_mtime);
+      if (ns != 0)
+        OS (error, NILF,
+            _("*** Warning: .LOW_RESOLUTION_TIME file '%s' has a high resolution time stamp"),
+            file->name);
+      this_mtime += FILE_TIMESTAMPS_PER_S - 1 - ns;
+    }
+
+  must_make = noexist;
+
+  /* If file was specified as a target with no commands,
+     come up with some default commands.  */
+
+  if (!file->phony && file->cmds == 0 && !file->tried_implicit)
+    {
+      if (try_implicit_rule (file, depth))
+        DBF (DB_IMPLICIT, _("Found an implicit rule for '%s'.\n"));
+      else
+        DBF (DB_IMPLICIT, _("No implicit rule found for '%s'.\n"));
+      file->tried_implicit = 1;
+    }
+  if (file->cmds == 0 && !file->is_target
+      && default_file != 0 && default_file->cmds != 0)
+    {
+      DBF (DB_IMPLICIT, _("Using default recipe for '%s'.\n"));
+      file->cmds = default_file->cmds;
+    }
+
+  /* Update all non-intermediate files we depend on, if necessary, and see
+     whether any of them is more recent than this file.  We need to walk our
+     deps, AND the deps of any also_make targets to ensure everything happens
+     in the correct order.  */
+
+  amake.file = file;
+  amake.next = file->also_make;
+  ad = &amake;
+  while (ad)
+    {
+      struct dep *lastd = 0;
+
+      /* Find the deps we're scanning */
+      d = ad->file->deps;
+      ad = ad->next;
+
+      while (d)
+        {
+          enum update_status new;
+          FILE_TIMESTAMP mtime;
+          int maybe_make;
+          int dontcare = 0;
+
+          check_renamed (d->file);
+
+          mtime = file_mtime (d->file);
+          check_renamed (d->file);
+
+          if (is_updating (d->file))
+            {
+              OSS (error, NILF, _("Circular %s <- %s dependency dropped."),
+                   file->name, d->file->name);
+              /* We cannot free D here because our the caller will still have
+                 a reference to it when we were called recursively via
+                 check_dep below.  */
+              if (lastd == 0)
+                file->deps = d->next;
+              else
+                lastd->next = d->next;
+              d = d->next;
+              continue;
+            }
+
+          d->file->parent = file;
+          maybe_make = must_make;
+
+          /* Inherit dontcare flag from our parent. */
+          if (rebuilding_makefiles)
+            {
+              dontcare = d->file->dontcare;
+              d->file->dontcare = file->dontcare;
+            }
+
+          new = check_dep (d->file, depth, this_mtime, &maybe_make);
+          if (new > dep_status)
+            dep_status = new;
+
+          /* Restore original dontcare flag. */
+          if (rebuilding_makefiles)
+            d->file->dontcare = dontcare;
+
+          if (! d->ignore_mtime)
+            must_make = maybe_make;
+
+          check_renamed (d->file);
+
+          {
+            struct file *f = d->file;
+            if (f->double_colon)
+              f = f->double_colon;
+            do
+              {
+                running |= (f->command_state == cs_running
+                            || f->command_state == cs_deps_running);
+                f = f->prev;
+              }
+            while (f != 0);
+          }
+
+          if (dep_status && !keep_going_flag)
+            break;
+
+          if (!running)
+            /* The prereq is considered changed if the timestamp has changed
+               while it was built, OR it doesn't exist.  */
+            d->changed = ((file_mtime (d->file) != mtime)
+                          || (mtime == NONEXISTENT_MTIME));
+
+          lastd = d;
+          d = d->next;
+        }
+    }
+
+  /* Now we know whether this target needs updating.
+     If it does, update all the intermediate files we depend on.  */
+
+  if (must_make || always_make_flag)
+    {
+      for (d = file->deps; d != 0; d = d->next)
+        if (d->file->intermediate)
+          {
+            enum update_status new;
+            int dontcare = 0;
+
+            FILE_TIMESTAMP mtime = file_mtime (d->file);
+            check_renamed (d->file);
+            d->file->parent = file;
+
+            /* Inherit dontcare flag from our parent. */
+            if (rebuilding_makefiles)
+              {
+                dontcare = d->file->dontcare;
+                d->file->dontcare = file->dontcare;
+              }
+
+            /* We may have already considered this file, when we didn't know
+               we'd need to update it.  Force update_file() to consider it and
+               not prune it.  */
+            d->file->considered = 0;
+
+            new = update_file (d->file, depth);
+            if (new > dep_status)
+              dep_status = new;
+
+            /* Restore original dontcare flag. */
+            if (rebuilding_makefiles)
+              d->file->dontcare = dontcare;
+
+            check_renamed (d->file);
+
+            {
+              struct file *f = d->file;
+              if (f->double_colon)
+                f = f->double_colon;
+              do
+                {
+                  running |= (f->command_state == cs_running
+                              || f->command_state == cs_deps_running);
+                  f = f->prev;
+                }
+              while (f != 0);
+            }
+
+            if (dep_status && !keep_going_flag)
+              break;
+
+            if (!running)
+              d->changed = ((file->phony && file->cmds != 0)
+                            || file_mtime (d->file) != mtime);
+          }
+    }
+
+  finish_updating (file);
+  finish_updating (ofile);
+
+  DBF (DB_VERBOSE, _("Finished prerequisites of target file '%s'.\n"));
+
+  if (running)
+    {
+      set_command_state (file, cs_deps_running);
+      --depth;
+      DBF (DB_VERBOSE, _("The prerequisites of '%s' are being made.\n"));
+      return 0;
+    }
+
+  /* If any dependency failed, give up now.  */
+
+  if (dep_status)
+    {
+      /* I'm not sure if we can't just assign dep_status...  */
+      file->update_status = dep_status == us_none ? us_failed : dep_status;
+      notice_finished_file (file);
+
+      --depth;
+
+      DBF (DB_VERBOSE, _("Giving up on target file '%s'.\n"));
+
+      if (depth == 0 && keep_going_flag
+          && !just_print_flag && !question_flag)
+        OS (error, NILF,
+            _("Target '%s' not remade because of errors."), file->name);
+
+      return dep_status;
+    }
+
+  if (file->command_state == cs_deps_running)
+    /* The commands for some deps were running on the last iteration, but
+       they have finished now.  Reset the command_state to not_started to
+       simplify later bookkeeping.  It is important that we do this only
+       when the prior state was cs_deps_running, because that prior state
+       was definitely propagated to FILE's also_make's by set_command_state
+       (called above), but in another state an also_make may have
+       independently changed to finished state, and we would confuse that
+       file's bookkeeping (updated, but not_started is bogus state).  */
+    set_command_state (file, cs_not_started);
+
+  /* Now record which prerequisites are more
+     recent than this file, so we can define $?.  */
+
+  deps_changed = 0;
+  for (d = file->deps; d != 0; d = d->next)
+    {
+      FILE_TIMESTAMP d_mtime = file_mtime (d->file);
+      check_renamed (d->file);
+
+      if (! d->ignore_mtime)
+        {
+#if 1
+          /* %%% In version 4, remove this code completely to
+           implement not remaking deps if their deps are newer
+           than their parents.  */
+          if (d_mtime == NONEXISTENT_MTIME && !d->file->intermediate)
+            /* We must remake if this dep does not
+               exist and is not intermediate.  */
+            must_make = 1;
+#endif
+
+          /* Set DEPS_CHANGED if this dep actually changed.  */
+          deps_changed |= d->changed;
+        }
+
+      /* Set D->changed if either this dep actually changed,
+         or its dependent, FILE, is older or does not exist.  */
+      d->changed |= noexist || d_mtime > this_mtime;
+
+      if (!noexist && ISDB (DB_BASIC|DB_VERBOSE))
+        {
+          const char *fmt = 0;
+
+          if (d->ignore_mtime)
+            {
+              if (ISDB (DB_VERBOSE))
+                fmt = _("Prerequisite '%s' is order-only for target '%s'.\n");
+            }
+          else if (d_mtime == NONEXISTENT_MTIME)
+            {
+              if (ISDB (DB_BASIC))
+                fmt = _("Prerequisite '%s' of target '%s' does not exist.\n");
+            }
+          else if (d->changed)
+            {
+              if (ISDB (DB_BASIC))
+                fmt = _("Prerequisite '%s' is newer than target '%s'.\n");
+            }
+          else if (ISDB (DB_VERBOSE))
+            fmt = _("Prerequisite '%s' is older than target '%s'.\n");
+
+          if (fmt)
+            {
+              print_spaces (depth);
+              printf (fmt, dep_name (d), file->name);
+              fflush (stdout);
+            }
+        }
+    }
+
+  /* Here depth returns to the value it had when we were called.  */
+  depth--;
+
+  if (file->double_colon && file->deps == 0)
+    {
+      must_make = 1;
+      DBF (DB_BASIC,
+           _("Target '%s' is double-colon and has no prerequisites.\n"));
+    }
+  else if (!noexist && file->is_target && !deps_changed && file->cmds == 0
+           && !always_make_flag)
+    {
+      must_make = 0;
+      DBF (DB_VERBOSE,
+           _("No recipe for '%s' and no prerequisites actually changed.\n"));
+    }
+  else if (!must_make && file->cmds != 0 && always_make_flag)
+    {
+      must_make = 1;
+      DBF (DB_VERBOSE, _("Making '%s' due to always-make flag.\n"));
+    }
+
+  if (!must_make)
+    {
+      if (ISDB (DB_VERBOSE))
+        {
+          print_spaces (depth);
+          printf (_("No need to remake target '%s'"), file->name);
+          if (!streq (file->name, file->hname))
+              printf (_("; using VPATH name '%s'"), file->hname);
+          puts (".");
+          fflush (stdout);
+        }
+
+      notice_finished_file (file);
+
+      /* Since we don't need to remake the file, convert it to use the
+         VPATH filename if we found one.  hfile will be either the
+         local name if no VPATH or the VPATH name if one was found.  */
+
+      while (file)
+        {
+          file->name = file->hname;
+          file = file->prev;
+        }
+
+      return 0;
+    }
+
+  DBF (DB_BASIC, _("Must remake target '%s'.\n"));
+
+  /* It needs to be remade.  If it's VPATH and not reset via GPATH, toss the
+     VPATH.  */
+  if (!streq (file->name, file->hname))
+    {
+      DB (DB_BASIC, (_("  Ignoring VPATH name '%s'.\n"), file->hname));
+      file->ignore_vpath = 1;
+    }
+
+  /* Now, take appropriate actions to remake the file.  */
+  remake_file (file);
+
+  if (file->command_state != cs_finished)
+    {
+      DBF (DB_VERBOSE, _("Recipe of '%s' is being run.\n"));
+      return 0;
+    }
+
+  switch (file->update_status)
+    {
+    case us_failed:
+      DBF (DB_BASIC, _("Failed to remake target file '%s'.\n"));
+      break;
+    case us_success:
+      DBF (DB_BASIC, _("Successfully remade target file '%s'.\n"));
+      break;
+    case us_question:
+      DBF (DB_BASIC, _("Target file '%s' needs to be remade under -q.\n"));
+      break;
+    case us_none:
+      break;
+    }
+
+  file->updated = 1;
+  return file->update_status;
+}
+\f
+/* Set FILE's 'updated' flag and re-check its mtime and the mtime's of all
+   files listed in its 'also_make' member.  Under -t, this function also
+   touches FILE.
+
+   On return, FILE->update_status will no longer be us_none if it was.  */
+
+void
+notice_finished_file (struct file *file)
+{
+  struct dep *d;
+  int ran = file->command_state == cs_running;
+  int touched = 0;
+
+  file->command_state = cs_finished;
+  file->updated = 1;
+
+  if (touch_flag
+      /* The update status will be:
+           us_success   if 0 or more commands (+ or ${MAKE}) were run and won;
+           us_none      if this target was not remade;
+           >us_none     if some commands were run and lost.
+         We touch the target if it has commands which either were not run
+         or won when they ran (i.e. status is 0).  */
+      && file->update_status == us_success)
+    {
+      if (file->cmds != 0 && file->cmds->any_recurse)
+        {
+          /* If all the command lines were recursive,
+             we don't want to do the touching.  */
+          unsigned int i;
+          for (i = 0; i < file->cmds->ncommand_lines; ++i)
+            if (!(file->cmds->lines_flags[i] & COMMANDS_RECURSE))
+              goto have_nonrecursing;
+        }
+      else
+        {
+        have_nonrecursing:
+          if (file->phony)
+            file->update_status = us_success;
+          /* According to POSIX, -t doesn't affect targets with no cmds.  */
+          else if (file->cmds != 0)
+            {
+              /* Should set file's modification date and do nothing else.  */
+              file->update_status = touch_file (file);
+
+              /* Pretend we ran a real touch command, to suppress the
+                 "'foo' is up to date" message.  */
+              commands_started++;
+
+              /* Request for the timestamp to be updated (and distributed
+                 to the double-colon entries). Simply setting ran=1 would
+                 almost have done the trick, but messes up with the also_make
+                 updating logic below.  */
+              touched = 1;
+            }
+        }
+    }
+
+  if (file->mtime_before_update == UNKNOWN_MTIME)
+    file->mtime_before_update = file->last_mtime;
+
+  if ((ran && !file->phony) || touched)
+    {
+      int i = 0;
+
+      /* If -n, -t, or -q and all the commands are recursive, we ran them so
+         really check the target's mtime again.  Otherwise, assume the target
+         would have been updated. */
+
+      if ((question_flag || just_print_flag || touch_flag) && file->cmds)
+        {
+          for (i = file->cmds->ncommand_lines; i > 0; --i)
+            if (! (file->cmds->lines_flags[i-1] & COMMANDS_RECURSE))
+              break;
+        }
+
+      /* If there were no commands at all, it's always new. */
+
+      else if (file->is_target && file->cmds == 0)
+        i = 1;
+
+      file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME;
+    }
+
+  if (file->double_colon)
+    {
+      /* If this is a double colon rule and it is the last one to be
+         updated, propagate the change of modification time to all the
+         double-colon entries for this file.
+
+         We do it on the last update because it is important to handle
+         individual entries as separate rules with separate timestamps
+         while they are treated as targets and then as one rule with the
+         unified timestamp when they are considered as a prerequisite
+         of some target.  */
+
+      struct file *f;
+      FILE_TIMESTAMP max_mtime = file->last_mtime;
+
+      /* Check that all rules were updated and at the same time find
+         the max timestamp.  We assume UNKNOWN_MTIME is newer then
+         any other value.  */
+      for (f = file->double_colon; f != 0 && f->updated; f = f->prev)
+        if (max_mtime != UNKNOWN_MTIME
+            && (f->last_mtime == UNKNOWN_MTIME || f->last_mtime > max_mtime))
+          max_mtime = f->last_mtime;
+
+      if (f == 0)
+        for (f = file->double_colon; f != 0; f = f->prev)
+          f->last_mtime = max_mtime;
+    }
+
+  if (ran && file->update_status != us_none)
+    /* We actually tried to update FILE, which has
+       updated its also_make's as well (if it worked).
+       If it didn't work, it wouldn't work again for them.
+       So mark them as updated with the same status.  */
+    for (d = file->also_make; d != 0; d = d->next)
+      {
+        d->file->command_state = cs_finished;
+        d->file->updated = 1;
+        d->file->update_status = file->update_status;
+
+        if (ran && !d->file->phony)
+          /* Fetch the new modification time.
+             We do this instead of just invalidating the cached time
+             so that a vpath_search can happen.  Otherwise, it would
+             never be done because the target is already updated.  */
+          f_mtime (d->file, 0);
+      }
+  else if (file->update_status == us_none)
+    /* Nothing was done for FILE, but it needed nothing done.
+       So mark it now as "succeeded".  */
+    file->update_status = us_success;
+}
+\f
+/* Check whether another file (whose mtime is THIS_MTIME) needs updating on
+   account of a dependency which is file FILE.  If it does, store 1 in
+   *MUST_MAKE_PTR.  In the process, update any non-intermediate files that
+   FILE depends on (including FILE itself).  Return nonzero if any updating
+   failed.  */
+
+static enum update_status
+check_dep (struct file *file, unsigned int depth,
+           FILE_TIMESTAMP this_mtime, int *must_make_ptr)
+{
+  struct file *ofile;
+  struct dep *d;
+  enum update_status dep_status = us_success;
+
+  ++depth;
+  start_updating (file);
+
+  /* We might change file if we find a different one via vpath;
+     remember this one to turn off updating.  */
+  ofile = file;
+
+  if (file->phony || !file->intermediate)
+    {
+      /* If this is a non-intermediate file, update it and record whether it
+         is newer than THIS_MTIME.  */
+      FILE_TIMESTAMP mtime;
+      dep_status = update_file (file, depth);
+      check_renamed (file);
+      mtime = file_mtime (file);
+      check_renamed (file);
+      if (mtime == NONEXISTENT_MTIME || mtime > this_mtime)
+        *must_make_ptr = 1;
+    }
+  else
+    {
+      /* FILE is an intermediate file.  */
+      FILE_TIMESTAMP mtime;
+
+      if (!file->phony && file->cmds == 0 && !file->tried_implicit)
+        {
+          if (try_implicit_rule (file, depth))
+            DBF (DB_IMPLICIT, _("Found an implicit rule for '%s'.\n"));
+          else
+            DBF (DB_IMPLICIT, _("No implicit rule found for '%s'.\n"));
+          file->tried_implicit = 1;
+        }
+      if (file->cmds == 0 && !file->is_target
+          && default_file != 0 && default_file->cmds != 0)
+        {
+          DBF (DB_IMPLICIT, _("Using default commands for '%s'.\n"));
+          file->cmds = default_file->cmds;
+        }
+
+      check_renamed (file);
+      mtime = file_mtime (file);
+      check_renamed (file);
+      if (mtime != NONEXISTENT_MTIME && mtime > this_mtime)
+        /* If the intermediate file actually exists and is newer, then we
+           should remake from it.  */
+        *must_make_ptr = 1;
+      else
+        {
+          /* Otherwise, update all non-intermediate files we depend on, if
+             necessary, and see whether any of them is more recent than the
+             file on whose behalf we are checking.  */
+          struct dep *ld;
+          int deps_running = 0;
+
+          /* If this target is not running, set it's state so that we check it
+             fresh.  It could be it was checked as part of an order-only
+             prerequisite and so wasn't rebuilt then, but should be now.  */
+          if (file->command_state != cs_running)
+            {
+              /* If the target was waiting for a dependency it has to be
+                 reconsidered, as that dependency might have finished.  */
+              if (file->command_state == cs_deps_running)
+                file->considered = 0;
+
+              set_command_state (file, cs_not_started);
+            }
+
+          ld = 0;
+          d = file->deps;
+          while (d != 0)
+            {
+              enum update_status new;
+              int maybe_make;
+
+              if (is_updating (d->file))
+                {
+                  OSS (error, NILF, _("Circular %s <- %s dependency dropped."),
+                       file->name, d->file->name);
+                  if (ld == 0)
+                    {
+                      file->deps = d->next;
+                      free_dep (d);
+                      d = file->deps;
+                    }
+                  else
+                    {
+                      ld->next = d->next;
+                      free_dep (d);
+                      d = ld->next;
+                    }
+                  continue;
+                }
+
+              d->file->parent = file;
+              maybe_make = *must_make_ptr;
+              new = check_dep (d->file, depth, this_mtime, &maybe_make);
+              if (new > dep_status)
+                dep_status = new;
+
+              if (! d->ignore_mtime)
+                *must_make_ptr = maybe_make;
+              check_renamed (d->file);
+              if (dep_status && !keep_going_flag)
+                break;
+
+              if (d->file->command_state == cs_running
+                  || d->file->command_state == cs_deps_running)
+                deps_running = 1;
+
+              ld = d;
+              d = d->next;
+            }
+
+          if (deps_running)
+            /* Record that some of FILE's deps are still being made.
+               This tells the upper levels to wait on processing it until the
+               commands are finished.  */
+            set_command_state (file, cs_deps_running);
+        }
+    }
+
+  finish_updating (file);
+  finish_updating (ofile);
+
+  return dep_status;
+}
+\f
+/* Touch FILE.  Return us_success if successful, us_failed if not.  */
+
+#define TOUCH_ERROR(call) do{ perror_with_name ((call), file->name);    \
+                              return us_failed; }while(0)
+
+static enum update_status
+touch_file (struct file *file)
+{
+  if (!run_silent)
+    OS (message, 0, "touch %s", file->name);
+
+  /* Print-only (-n) takes precedence over touch (-t).  */
+  if (just_print_flag)
+    return us_success;
+
+#ifndef NO_ARCHIVES
+  if (ar_name (file->name))
+    return ar_touch (file->name) ? us_failed : us_success;
+  else
+#endif
+    {
+      int fd;
+
+      EINTRLOOP (fd, open (file->name, O_RDWR | O_CREAT, 0666));
+      if (fd < 0)
+        TOUCH_ERROR ("touch: open: ");
+      else
+        {
+          struct stat statbuf;
+          char buf = 'x';
+          int e;
+
+          EINTRLOOP (e, fstat (fd, &statbuf));
+          if (e < 0)
+            TOUCH_ERROR ("touch: fstat: ");
+          /* Rewrite character 0 same as it already is.  */
+          EINTRLOOP (e, read (fd, &buf, 1));
+          if (e < 0)
+            TOUCH_ERROR ("touch: read: ");
+          {
+            off_t o;
+            EINTRLOOP (o, lseek (fd, 0L, 0));
+            if (o < 0L)
+              TOUCH_ERROR ("touch: lseek: ");
+          }
+          EINTRLOOP (e, write (fd, &buf, 1));
+          if (e < 0)
+            TOUCH_ERROR ("touch: write: ");
+
+          /* If file length was 0, we just changed it, so change it back.  */
+          if (statbuf.st_size == 0)
+            {
+              (void) close (fd);
+              EINTRLOOP (fd, open (file->name, O_RDWR | O_TRUNC, 0666));
+              if (fd < 0)
+                TOUCH_ERROR ("touch: open: ");
+            }
+          (void) close (fd);
+        }
+    }
+
+  return us_success;
+}
+\f
+/* Having checked and updated the dependencies of FILE,
+   do whatever is appropriate to remake FILE itself.
+   Return the status from executing FILE's commands.  */
+
+static void
+remake_file (struct file *file)
+{
+  if (file->cmds == 0)
+    {
+      if (file->phony)
+        /* Phony target.  Pretend it succeeded.  */
+        file->update_status = us_success;
+      else if (file->is_target)
+        /* This is a nonexistent target file we cannot make.
+           Pretend it was successfully remade.  */
+        file->update_status = us_success;
+      else
+        {
+          /* This is a dependency file we cannot remake.  Fail.  */
+          if (!rebuilding_makefiles || !file->dontcare)
+            complain (file);
+          file->update_status = us_failed;
+        }
+    }
+  else
+    {
+      chop_commands (file->cmds);
+
+      /* The normal case: start some commands.  */
+      if (!touch_flag || file->cmds->any_recurse)
+        {
+          execute_file_commands (file);
+          return;
+        }
+
+      /* This tells notice_finished_file it is ok to touch the file.  */
+      file->update_status = us_success;
+    }
+
+  /* This does the touching under -t.  */
+  notice_finished_file (file);
+}
+\f
+/* Return the mtime of a file, given a 'struct file'.
+   Caches the time in the struct file to avoid excess stat calls.
+
+   If the file is not found, and SEARCH is nonzero, VPATH searching and
+   replacement is done.  If that fails, a library (-lLIBNAME) is tried and
+   the library's actual name (/lib/libLIBNAME.a, etc.) is substituted into
+   FILE.  */
+
+FILE_TIMESTAMP
+f_mtime (struct file *file, int search)
+{
+  FILE_TIMESTAMP mtime;
+  unsigned int propagate_timestamp;
+
+  /* File's mtime is not known; must get it from the system.  */
+
+#ifndef NO_ARCHIVES
+  if (ar_name (file->name))
+    {
+      /* This file is an archive-member reference.  */
+
+      char *arname, *memname;
+      struct file *arfile;
+      time_t member_date;
+
+      /* Find the archive's name.  */
+      ar_parse_name (file->name, &arname, &memname);
+
+      /* Find the modification time of the archive itself.
+         Also allow for its name to be changed via VPATH search.  */
+      arfile = lookup_file (arname);
+      if (arfile == 0)
+        arfile = enter_file (strcache_add (arname));
+      mtime = f_mtime (arfile, search);
+      check_renamed (arfile);
+      if (search && strcmp (arfile->hname, arname))
+        {
+          /* The archive's name has changed.
+             Change the archive-member reference accordingly.  */
+
+          char *name;
+          size_t arlen, memlen;
+
+          arlen = strlen (arfile->hname);
+          memlen = strlen (memname);
+
+          name = alloca (arlen + 1 + memlen + 2);
+          memcpy (name, arfile->hname, arlen);
+          name[arlen] = '(';
+          memcpy (name + arlen + 1, memname, memlen);
+          name[arlen + 1 + memlen] = ')';
+          name[arlen + 1 + memlen + 1] = '\0';
+
+          /* If the archive was found with GPATH, make the change permanent;
+             otherwise defer it until later.  */
+          if (arfile->name == arfile->hname)
+            rename_file (file, strcache_add (name));
+          else
+            rehash_file (file, strcache_add (name));
+          check_renamed (file);
+        }
+
+      free (arname);
+
+      file->low_resolution_time = 1;
+
+      if (mtime == NONEXISTENT_MTIME)
+        /* The archive doesn't exist, so its members don't exist either.  */
+        return NONEXISTENT_MTIME;
+
+      member_date = ar_member_date (file->hname);
+      mtime = (member_date == (time_t) -1
+               ? NONEXISTENT_MTIME
+               : file_timestamp_cons (file->hname, member_date, 0));
+    }
+  else
+#endif
+    {
+      mtime = name_mtime (file->name);
+
+      if (mtime == NONEXISTENT_MTIME && search && !file->ignore_vpath)
+        {
+          /* If name_mtime failed, search VPATH.  */
+          const char *name = vpath_search (file->name, &mtime, NULL, NULL);
+          if (name
+              /* Last resort, is it a library (-lxxx)?  */
+              || (file->name[0] == '-' && file->name[1] == 'l'
+                  && (name = library_search (file->name, &mtime)) != 0))
+            {
+              size_t name_len;
+
+              if (mtime != UNKNOWN_MTIME)
+                /* vpath_search and library_search store UNKNOWN_MTIME
+                   if they didn't need to do a stat call for their work.  */
+                file->last_mtime = mtime;
+
+              /* If we found it in VPATH, see if it's in GPATH too; if so,
+                 change the name right now; if not, defer until after the
+                 dependencies are updated. */
+#ifndef VMS
+              name_len = strlen (name) - strlen (file->name) - 1;
+#else
+              name_len = strlen (name) - strlen (file->name);
+              if (name[name_len - 1] == '/')
+                  name_len--;
+#endif
+              if (gpath_search (name, name_len))
+                {
+                  rename_file (file, name);
+                  check_renamed (file);
+                  return file_mtime (file);
+                }
+
+              rehash_file (file, name);
+              check_renamed (file);
+              /* If the result of a vpath search is -o or -W, preserve it.
+                 Otherwise, find the mtime of the resulting file.  */
+              if (mtime != OLD_MTIME && mtime != NEW_MTIME)
+                mtime = name_mtime (name);
+            }
+        }
+    }
+
+  /* Files can have bogus timestamps that nothing newly made will be
+     "newer" than.  Updating their dependents could just result in loops.
+     So notify the user of the anomaly with a warning.
+
+     We only need to do this once, for now. */
+
+  if (!clock_skew_detected
+      && mtime != NONEXISTENT_MTIME && mtime != NEW_MTIME
+      && !file->updated)
+    {
+      static FILE_TIMESTAMP adjusted_now;
+
+      FILE_TIMESTAMP adjusted_mtime = mtime;
+
+#if defined(WINDOWS32) || defined(__MSDOS__)
+      /* Experimentation has shown that FAT filesystems can set file times
+         up to 3 seconds into the future!  Play it safe.  */
+
+#define FAT_ADJ_OFFSET  (FILE_TIMESTAMP) 3
+
+      FILE_TIMESTAMP adjustment = FAT_ADJ_OFFSET << FILE_TIMESTAMP_LO_BITS;
+      if (ORDINARY_MTIME_MIN + adjustment <= adjusted_mtime)
+        adjusted_mtime -= adjustment;
+#elif defined(__EMX__)
+      /* FAT filesystems round time to the nearest even second!
+         Allow for any file (NTFS or FAT) to perhaps suffer from this
+         brain damage.  */
+      FILE_TIMESTAMP adjustment = (((FILE_TIMESTAMP_S (adjusted_mtime) & 1) == 0
+                     && FILE_TIMESTAMP_NS (adjusted_mtime) == 0)
+                    ? (FILE_TIMESTAMP) 1 << FILE_TIMESTAMP_LO_BITS
+                    : 0);
+#endif
+
+      /* If the file's time appears to be in the future, update our
+         concept of the present and try once more.  */
+      if (adjusted_now < adjusted_mtime)
+        {
+          int resolution;
+          FILE_TIMESTAMP now = file_timestamp_now (&resolution);
+          adjusted_now = now + (resolution - 1);
+          if (adjusted_now < adjusted_mtime)
+            {
+              double from_now =
+                (FILE_TIMESTAMP_S (mtime) - FILE_TIMESTAMP_S (now)
+                 + ((FILE_TIMESTAMP_NS (mtime) - FILE_TIMESTAMP_NS (now))
+                    / 1e9));
+              char from_now_string[100];
+
+              if (from_now >= 99 && from_now <= ULONG_MAX)
+                sprintf (from_now_string, "%lu", (unsigned long) from_now);
+              else
+                sprintf (from_now_string, "%.2g", from_now);
+              OSS (error, NILF,
+                   _("Warning: File '%s' has modification time %s s in the future"),
+                   file->name, from_now_string);
+              clock_skew_detected = 1;
+            }
+        }
+    }
+
+  /* Store the mtime into all the entries for this file for which it is safe
+     to do so: avoid propagating timestamps to double-colon rules that haven't
+     been examined so they're run or not based on the pre-update timestamp.  */
+  if (file->double_colon)
+    file = file->double_colon;
+
+  propagate_timestamp = file->updated;
+  do
+    {
+      /* If this file is not implicit but it is intermediate then it was
+         made so by the .INTERMEDIATE target.  If this file has never
+         been built by us but was found now, it existed before make
+         started.  So, turn off the intermediate bit so make doesn't
+         delete it, since it didn't create it.  */
+      if (mtime != NONEXISTENT_MTIME && file->command_state == cs_not_started
+          && !file->tried_implicit && file->intermediate)
+        file->intermediate = 0;
+
+      if (file->updated == propagate_timestamp)
+        file->last_mtime = mtime;
+      file = file->prev;
+    }
+  while (file != 0);
+
+  return mtime;
+}
+
+
+/* Return the mtime of the file or archive-member reference NAME.  */
+
+/* First, we check with stat().  If the file does not exist, then we return
+   NONEXISTENT_MTIME.  If it does, and the symlink check flag is set, then
+   examine each indirection of the symlink and find the newest mtime.
+   This causes one duplicate stat() when -L is being used, but the code is
+   much cleaner.  */
+
+static FILE_TIMESTAMP
+name_mtime (const char *name)
+{
+  FILE_TIMESTAMP mtime;
+  struct stat st;
+  int e;
+
+#if defined(WINDOWS32)
+  {
+    char tem[MAXPATHLEN], *tstart, *tend;
+    const char *p = name + strlen (name);
+
+    /* Remove any trailing slashes and "."/"..".  MS-Windows stat
+       fails on valid directories if NAME ends in a slash, and we need
+       to emulate the Posix behavior where stat on "foo/" or "foo/."
+       succeeds ONLY if "foo" is a directory. */
+    if (p > name)
+      {
+        memcpy (tem, name, p - name + 1);
+        tstart = tem;
+        if (tstart[1] == ':')
+          tstart += 2;
+        tend = tem + (p - name - 1);
+        if (*tend == '.' && tend > tstart)
+          tend--;
+        if (*tend == '.' && tend > tstart)
+          tend--;
+        for ( ; tend > tstart && (*tend == '/' || *tend == '\\'); tend--)
+          *tend = '\0';
+      }
+    else
+      {
+        tem[0] = '\0';
+        tend = &tem[0];
+      }
+
+    e = stat (tem, &st);
+    if (e == 0 && !_S_ISDIR (st.st_mode) && tend < tem + (p - name - 1))
+      {
+        errno = ENOTDIR;
+        e = -1;
+      }
+  }
+#else
+  EINTRLOOP (e, stat (name, &st));
+#endif
+  if (e == 0)
+    mtime = FILE_TIMESTAMP_STAT_MODTIME (name, st);
+  else if (errno == ENOENT || errno == ENOTDIR)
+    mtime = NONEXISTENT_MTIME;
+  else
+    {
+      perror_with_name ("stat: ", name);
+      return NONEXISTENT_MTIME;
+    }
+
+  /* If we get here we either found it, or it doesn't exist.
+     If it doesn't exist see if we can use a symlink mtime instead.  */
+
+#ifdef MAKE_SYMLINKS
+#ifndef S_ISLNK
+# define S_ISLNK(_m)     (((_m)&S_IFMT)==S_IFLNK)
+#endif
+  if (check_symlink_flag && strlen (name) <= GET_PATH_MAX)
+    {
+      PATH_VAR (lpath);
+
+      /* Check each symbolic link segment (if any).  Find the latest mtime
+         amongst all of them (and the target file of course).
+         Note that we have already successfully dereferenced all the links
+         above.  So, if we run into any error trying to lstat(), or
+         readlink(), or whatever, something bizarre-o happened.  Just give up
+         and use whatever mtime we've already computed at that point.  */
+      strcpy (lpath, name);
+      while (1)
+        {
+          FILE_TIMESTAMP ltime;
+          PATH_VAR (lbuf);
+          long llen;
+          char *p;
+
+          EINTRLOOP (e, lstat (lpath, &st));
+          if (e)
+            {
+              /* Just take what we have so far.  */
+              if (errno != ENOENT && errno != ENOTDIR)
+                perror_with_name ("lstat: ", lpath);
+              break;
+            }
+
+          /* If this is not a symlink, we're done (we started with the real
+             file's mtime so we don't need to test it again).  */
+          if (!S_ISLNK (st.st_mode))
+            break;
+
+          /* If this mtime is newer than what we had, keep the new one.  */
+          ltime = FILE_TIMESTAMP_STAT_MODTIME (lpath, st);
+          if (ltime > mtime)
+            mtime = ltime;
+
+          /* Set up to check the file pointed to by this link.  */
+          EINTRLOOP (llen, readlink (lpath, lbuf, GET_PATH_MAX));
+          if (llen < 0)
+            {
+              /* Eh?  Just take what we have.  */
+              perror_with_name ("readlink: ", lpath);
+              break;
+            }
+          lbuf[llen] = '\0';
+
+          /* If the target is fully-qualified or the source is just a
+             filename, then the new path is the target.  Otherwise it's the
+             source directory plus the target.  */
+          if (lbuf[0] == '/' || (p = strrchr (lpath, '/')) == NULL)
+            strcpy (lpath, lbuf);
+          else if ((p - lpath) + llen + 2 > GET_PATH_MAX)
+            /* Eh?  Path too long!  Again, just go with what we have.  */
+            break;
+          else
+            /* Create the next step in the symlink chain.  */
+            strcpy (p+1, lbuf);
+        }
+    }
+#endif
+
+  return mtime;
+}
+
+
+/* Search for a library file specified as -lLIBNAME, searching for a
+   suitable library file in the system library directories and the VPATH
+   directories.  */
+
+static const char *
+library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr)
+{
+  static const char *dirs[] =
+    {
+#ifndef _AMIGA
+      "/lib",
+      "/usr/lib",
+#endif
+#if defined(WINDOWS32) && !defined(LIBDIR)
+/*
+ * This is completely up to the user at product install time. Just define
+ * a placeholder.
+ */
+#define LIBDIR "."
+#endif
+      LIBDIR,                   /* Defined by configuration.  */
+      0
+    };
+
+  const char *file = 0;
+  char *libpatterns;
+  FILE_TIMESTAMP mtime;
+
+  /* Loop variables for the libpatterns value.  */
+  char *p;
+  const char *p2;
+  size_t len;
+  size_t liblen;
+
+  /* Information about the earliest (in the vpath sequence) match.  */
+  unsigned int best_vpath = 0, best_path = 0;
+
+  const char **dp;
+
+  libpatterns = xstrdup (variable_expand ("$(.LIBPATTERNS)"));
+
+  /* Skip the '-l'.  */
+  lib += 2;
+  liblen = strlen (lib);
+
+  /* Loop through all the patterns in .LIBPATTERNS, and search on each one.
+     To implement the linker-compatible behavior we have to search through
+     all entries in .LIBPATTERNS and choose the "earliest" one.  */
+  p2 = libpatterns;
+  while ((p = find_next_token (&p2, &len)) != 0)
+    {
+      static char *buf = NULL;
+      static size_t buflen = 0;
+      static size_t libdir_maxlen = 0;
+      static unsigned int std_dirs = 0;
+      char *libbuf = variable_expand ("");
+
+      /* Expand the pattern using LIB as a replacement.  */
+      {
+        char c = p[len];
+        char *p3, *p4;
+
+        p[len] = '\0';
+        p3 = find_percent (p);
+        if (!p3)
+          {
+            /* Give a warning if there is no pattern.  */
+            OS (error, NILF,
+                _(".LIBPATTERNS element '%s' is not a pattern"), p);
+            p[len] = c;
+            continue;
+          }
+        p4 = variable_buffer_output (libbuf, p, p3-p);
+        p4 = variable_buffer_output (p4, lib, liblen);
+        p4 = variable_buffer_output (p4, p3+1, len - (p3-p));
+        p[len] = c;
+      }
+
+      /* Look first for 'libNAME.a' in the current directory.  */
+      mtime = name_mtime (libbuf);
+      if (mtime != NONEXISTENT_MTIME)
+        {
+          if (mtime_ptr != 0)
+            *mtime_ptr = mtime;
+          file = strcache_add (libbuf);
+          /* This by definition will have the best index, so stop now.  */
+          break;
+        }
+
+      /* Now try VPATH search on that.  */
+
+      {
+        unsigned int vpath_index, path_index;
+        const char* f = vpath_search (libbuf, mtime_ptr ? &mtime : NULL,
+                                      &vpath_index, &path_index);
+        if (f)
+          {
+            /* If we have a better match, record it.  */
+            if (file == 0 ||
+                vpath_index < best_vpath ||
+                (vpath_index == best_vpath && path_index < best_path))
+              {
+                file = f;
+                best_vpath = vpath_index;
+                best_path = path_index;
+
+                if (mtime_ptr != 0)
+                  *mtime_ptr = mtime;
+              }
+          }
+      }
+
+      /* Now try the standard set of directories.  */
+
+      if (!buflen)
+        {
+          for (dp = dirs; *dp != 0; ++dp)
+            {
+              size_t l = strlen (*dp);
+              if (l > libdir_maxlen)
+                libdir_maxlen = l;
+              std_dirs++;
+            }
+          buflen = strlen (libbuf);
+          buf = xmalloc (libdir_maxlen + buflen + 2);
+        }
+      else if (buflen < strlen (libbuf))
+        {
+          buflen = strlen (libbuf);
+          buf = xrealloc (buf, libdir_maxlen + buflen + 2);
+        }
+
+      {
+        /* Use the last std_dirs index for standard directories. This
+           was it will always be greater than the VPATH index.  */
+        unsigned int vpath_index = ~((unsigned int)0) - std_dirs;
+
+        for (dp = dirs; *dp != 0; ++dp)
+          {
+            sprintf (buf, "%s/%s", *dp, libbuf);
+            mtime = name_mtime (buf);
+            if (mtime != NONEXISTENT_MTIME)
+              {
+                if (file == 0 || vpath_index < best_vpath)
+                  {
+                    file = strcache_add (buf);
+                    best_vpath = vpath_index;
+
+                    if (mtime_ptr != 0)
+                      *mtime_ptr = mtime;
+                  }
+              }
+
+            vpath_index++;
+          }
+      }
+
+    }
+
+  free (libpatterns);
+  return file;
+}
diff --git a/src/remote-cstms.c b/src/remote-cstms.c
new file mode 100644 (file)
index 0000000..e336928
--- /dev/null
@@ -0,0 +1,300 @@
+/* GNU Make remote job exportation interface to the Customs daemon.
+   THIS CODE IS NOT SUPPORTED BY THE GNU PROJECT.
+   Please do not send bug reports or questions about it to
+   the Make maintainers.
+
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "commands.h"
+#include "job.h"
+#include "debug.h"
+
+#include <sys/time.h>
+#include <netdb.h>
+
+#include "customs.h"
+
+char *remote_description = "Customs";
+
+/* File name of the Customs 'export' client command.
+   A full path name can be used to avoid some path-searching overhead.  */
+#define EXPORT_COMMAND  "/usr/local/bin/export"
+
+/* ExportPermit gotten by start_remote_job_p, and used by start_remote_job.  */
+static ExportPermit permit;
+
+/* Normalized path name of the current directory.  */
+static char *normalized_cwd;
+
+/* Call once at startup even if no commands are run.  */
+
+void
+remote_setup (void)
+{
+}
+
+/* Called before exit.  */
+
+void
+remote_cleanup (void)
+{
+}
+\f
+/* Return nonzero if the next job should be done remotely.  */
+
+int
+start_remote_job_p (int first_p)
+{
+  static int inited = 0;
+  int status;
+  int njobs;
+
+  if (!inited)
+    {
+      /* Allow the user to turn off job exportation (useful while he is
+         debugging Customs, for example).  */
+      if (getenv ("GNU_MAKE_NO_CUSTOMS") != 0)
+        {
+          inited = -1;
+          return 0;
+        }
+
+      /* For secure Customs, make is installed setuid root and
+         Customs requires a privileged source port be used.  */
+      make_access ();
+
+      if (ISDB (DB_JOBS))
+        Rpc_Debug (1);
+
+      /* Ping the daemon once to see if it is there.  */
+      inited = Customs_Ping () == RPC_SUCCESS ? 1 : -1;
+
+      /* Return to normal user access.  */
+      user_access ();
+
+      if (starting_directory == 0)
+        /* main couldn't figure it out.  */
+        inited = -1;
+      else
+        {
+          /* Normalize the current directory path name to something
+             that should work on all machines exported to.  */
+
+          normalized_cwd = xmalloc (GET_PATH_MAX);
+          strcpy (normalized_cwd, starting_directory);
+          if (Customs_NormPath (normalized_cwd, GET_PATH_MAX) < 0)
+            /* Path normalization failure means using Customs
+               won't work, but it's not really an error.  */
+            inited = -1;
+        }
+    }
+
+  if (inited < 0)
+    return 0;
+
+  njobs = job_slots_used;
+  if (!first_p)
+    njobs -= 1;         /* correction for being called from reap_children() */
+
+  /* the first job should run locally, or, if the -l flag is given, we use
+     that as clue as to how many local jobs should be scheduled locally */
+  if (max_load_average < 0 && njobs == 0 || njobs < max_load_average)
+     return 0;
+
+  status = Customs_Host (EXPORT_SAME, &permit);
+  if (status != RPC_SUCCESS)
+    {
+      DB (DB_JOBS, (_("Customs won't export: %s\n"),
+                    Rpc_ErrorMessage (status)));
+      return 0;
+    }
+
+  return !CUSTOMS_FAIL (&permit.addr);
+}
+\f
+/* Start a remote job running the command in ARGV, with environment from
+   ENVP.  It gets standard input from STDIN_FD.  On failure, return
+   nonzero.  On success, return zero, and set *USED_STDIN to nonzero if it
+   will actually use STDIN_FD, zero if not, set *ID_PTR to a unique
+   identification, and set *IS_REMOTE to nonzero if the job is remote, zero
+   if it is local (meaning *ID_PTR is a process ID).  */
+
+int
+start_remote_job (char **argv, char **envp, int stdin_fd,
+                  int *is_remote, pid_t *id_ptr, int *used_stdin)
+{
+  char waybill[MAX_DATA_SIZE], msg[128];
+  struct hostent *host;
+  struct timeval timeout;
+  struct sockaddr_in sin;
+  int len;
+  int retsock, retport, sock;
+  Rpc_Stat status;
+  pid_t pid;
+
+  /* Create the return socket.  */
+  retsock = Rpc_UdpCreate (True, 0);
+  if (retsock < 0)
+    {
+      O (error, NILF, "exporting: Couldn't create return socket.");
+      return 1;
+    }
+
+  /* Get the return socket's port number.  */
+  len = sizeof (sin);
+  if (getsockname (retsock, (struct sockaddr *) &sin, &len) < 0)
+    {
+      (void) close (retsock);
+      perror_with_name ("exporting: ", "getsockname");
+      return 1;
+    }
+  retport = sin.sin_port;
+
+  /* Create the TCP socket for talking to the remote child.  */
+  sock = Rpc_TcpCreate (False, 0);
+
+  /* Create a WayBill to give to the server.  */
+  len = Customs_MakeWayBill (&permit, normalized_cwd, argv[0], argv,
+                             envp, retport, waybill);
+
+  /* Modify the waybill as if the remote child had done 'child_access ()'.  */
+  {
+    WayBill *wb = (WayBill *) waybill;
+    wb->ruid = wb->euid;
+    wb->rgid = wb->egid;
+  }
+
+  /* Send the request to the server, timing out in 20 seconds.  */
+  timeout.tv_usec = 0;
+  timeout.tv_sec = 20;
+  sin.sin_family = AF_INET;
+  sin.sin_port = htons (Customs_Port ());
+  sin.sin_addr = permit.addr;
+  status = Rpc_Call (sock, &sin, (Rpc_Proc) CUSTOMS_IMPORT,
+                     len, (Rpc_Opaque) waybill,
+                     sizeof (msg), (Rpc_Opaque) msg,
+                     1, &timeout);
+
+  host = gethostbyaddr ((char *)&permit.addr, sizeof(permit.addr), AF_INET);
+
+  {
+    const char *hnm = host ? host->h_name : inet_ntoa (permit.addr);
+    size_t hlen = strlen (hnm);
+
+    if (status != RPC_SUCCESS)
+      {
+        const char *err = Rpc_ErrorMessage (status);
+        (void) close (retsock);
+        (void) close (sock);
+        error (NILF, hlen + strlen (err),
+               "exporting to %s: %s", hnm, err);
+        return 1;
+      }
+    else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0')
+      {
+        (void) close (retsock);
+        (void) close (sock);
+        error (NILF, hlen + strlen (msg), "exporting to %s: %s", hnm, msg);
+        return 1;
+      }
+    else
+      {
+        error (NILF, hlen + INTSTR_LENGTH,
+               "*** exported to %s (id %u)", hnm, permit.id);
+      }
+
+    fflush (stdout);
+    fflush (stderr);
+  }
+
+  pid = vfork ();
+  if (pid < 0)
+    {
+      /* The fork failed!  */
+      perror_with_name ("fork", "");
+      return 1;
+    }
+  else if (pid == 0)
+    {
+      /* Child side.  Run 'export' to handle the connection.  */
+      static char sock_buf[20], retsock_buf[20], id_buf[20];
+      static char *new_argv[6] =
+        { EXPORT_COMMAND, "-id", sock_buf, retsock_buf, id_buf, 0 };
+
+      /* Set up the arguments.  */
+      (void) sprintf (sock_buf, "%d", sock);
+      (void) sprintf (retsock_buf, "%d", retsock);
+      (void) sprintf (id_buf, "%x", permit.id);
+
+      /* Get the right stdin.  */
+      if (stdin_fd != 0)
+        (void) dup2 (stdin_fd, 0);
+
+      /* Unblock signals in the child.  */
+      unblock_all_sigs ();
+
+      /* Run the command.  */
+      exec_command (new_argv, envp);
+    }
+
+  /* Parent side.  Return the 'export' process's ID.  */
+  (void) close (retsock);
+  (void) close (sock);
+  *is_remote = 0;
+  *id_ptr = pid;
+  *used_stdin = 1;
+  return 0;
+}
+\f
+/* Get the status of a dead remote child.  Block waiting for one to die
+   if BLOCK is nonzero.  Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR
+   to the termination signal or zero if it exited normally, and *COREDUMP_PTR
+   nonzero if it dumped core.  Return the ID of the child that died,
+   0 if we would have to block and !BLOCK, or < 0 if there were none.  */
+
+int
+remote_status (int *exit_code_ptr, int *signal_ptr, int *coredump_ptr,
+               int block)
+{
+  return -1;
+}
+
+/* Block asynchronous notification of remote child death.
+   If this notification is done by raising the child termination
+   signal, do not block that signal.  */
+void
+block_remote_children (void)
+{
+  return;
+}
+
+/* Restore asynchronous notification of remote child death.
+   If this is done by raising the child termination signal,
+   do not unblock that signal.  */
+void
+unblock_remote_children (void)
+{
+  return;
+}
+
+/* Send signal SIG to child ID.  Return 0 if successful, -1 if not.  */
+int
+remote_kill (pid_t id, int sig)
+{
+  return -1;
+}
diff --git a/src/remote-stub.c b/src/remote-stub.c
new file mode 100644 (file)
index 0000000..05ab336
--- /dev/null
@@ -0,0 +1,99 @@
+/* Template for the remote job exportation interface to GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "job.h"
+#include "commands.h"
+
+
+char *remote_description = 0;
+
+/* Call once at startup even if no commands are run.  */
+
+void
+remote_setup (void)
+{
+}
+
+/* Called before exit.  */
+
+void
+remote_cleanup (void)
+{
+}
+\f
+/* Return nonzero if the next job should be done remotely.  */
+
+int
+start_remote_job_p (int first_p UNUSED)
+{
+  return 0;
+}
+\f
+/* Start a remote job running the command in ARGV,
+   with environment from ENVP.  It gets standard input from STDIN_FD.  On
+   failure, return nonzero.  On success, return zero, and set *USED_STDIN
+   to nonzero if it will actually use STDIN_FD, zero if not, set *ID_PTR to
+   a unique identification, and set *IS_REMOTE to zero if the job is local,
+   nonzero if it is remote (meaning *ID_PTR is a process ID).  */
+
+int
+start_remote_job (char **argv UNUSED, char **envp UNUSED, int stdin_fd UNUSED,
+                  int *is_remote UNUSED, pid_t *id_ptr UNUSED,
+                  int *used_stdin UNUSED)
+{
+  return -1;
+}
+\f
+/* Get the status of a dead remote child.  Block waiting for one to die
+   if BLOCK is nonzero.  Set *EXIT_CODE_PTR to the exit status, *SIGNAL_PTR
+   to the termination signal or zero if it exited normally, and *COREDUMP_PTR
+   nonzero if it dumped core.  Return the ID of the child that died,
+   0 if we would have to block and !BLOCK, or < 0 if there were none.  */
+
+int
+remote_status (int *exit_code_ptr UNUSED, int *signal_ptr UNUSED,
+               int *coredump_ptr UNUSED, int block UNUSED)
+{
+  errno = ECHILD;
+  return -1;
+}
+
+/* Block asynchronous notification of remote child death.
+   If this notification is done by raising the child termination
+   signal, do not block that signal.  */
+void
+block_remote_children (void)
+{
+  return;
+}
+
+/* Restore asynchronous notification of remote child death.
+   If this is done by raising the child termination signal,
+   do not unblock that signal.  */
+void
+unblock_remote_children (void)
+{
+  return;
+}
+
+/* Send signal SIG to child ID.  Return 0 if successful, -1 if not.  */
+int
+remote_kill (pid_t id UNUSED, int sig UNUSED)
+{
+  return -1;
+}
diff --git a/src/rule.c b/src/rule.c
new file mode 100644 (file)
index 0000000..7efca58
--- /dev/null
@@ -0,0 +1,560 @@
+/* Pattern and suffix rule internals for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+
+#include "filedef.h"
+#include "dep.h"
+#include "job.h"
+#include "commands.h"
+#include "variable.h"
+#include "rule.h"
+
+static void freerule (struct rule *rule, struct rule *lastrule);
+\f
+/* Chain of all pattern rules.  */
+
+struct rule *pattern_rules;
+
+/* Pointer to last rule in the chain, so we can add onto the end.  */
+
+struct rule *last_pattern_rule;
+
+/* Number of rules in the chain.  */
+
+unsigned int num_pattern_rules;
+
+/* Maximum number of target patterns of any pattern rule.  */
+
+unsigned int max_pattern_targets;
+
+/* Maximum number of dependencies of any pattern rule.  */
+
+unsigned int max_pattern_deps;
+
+/* Maximum length of the name of a dependencies of any pattern rule.  */
+
+size_t max_pattern_dep_length;
+
+/* Pointer to structure for the file .SUFFIXES
+   whose dependencies are the suffixes to be searched.  */
+
+struct file *suffix_file;
+
+/* Maximum length of a suffix.  */
+
+static size_t maxsuffix;
+\f
+/* Compute the maximum dependency length and maximum number of dependencies of
+   all implicit rules.  Also sets the subdir flag for a rule when appropriate,
+   possibly removing the rule completely when appropriate.
+
+   Add any global EXTRA_PREREQS here as well.  */
+
+void
+snap_implicit_rules (void)
+{
+  char *name = NULL;
+  size_t namelen = 0;
+  struct rule *rule;
+  struct dep *dep;
+  struct dep *prereqs = expand_extra_prereqs (lookup_variable (STRING_SIZE_TUPLE(".EXTRA_PREREQS")));
+  unsigned int pre_deps = 0;
+
+  max_pattern_dep_length = 0;
+
+  for (dep = prereqs; dep; dep = dep->next)
+    {
+      size_t l = strlen (dep_name (dep));
+      if (l > max_pattern_dep_length)
+        max_pattern_dep_length = l;
+      ++pre_deps;
+    }
+
+  num_pattern_rules = max_pattern_targets = max_pattern_deps = 0;
+
+  for (rule = pattern_rules; rule; rule = rule->next)
+    {
+      unsigned int ndeps = pre_deps;
+      struct dep *lastdep = NULL;
+
+      ++num_pattern_rules;
+
+      if (rule->num > max_pattern_targets)
+        max_pattern_targets = rule->num;
+
+      for (dep = rule->deps; dep != 0; dep = dep->next)
+        {
+          const char *dname = dep_name (dep);
+          size_t len = strlen (dname);
+
+#ifdef VMS
+          const char *p = strrchr (dname, ']');
+          const char *p2;
+          if (p == 0)
+            p = strrchr (dname, ':');
+          p2 = p ? strchr (p, '%') : 0;
+#else
+          const char *p = strrchr (dname, '/');
+          const char *p2 = p ? strchr (p, '%') : 0;
+#endif
+          ndeps++;
+
+          if (len > max_pattern_dep_length)
+            max_pattern_dep_length = len;
+
+          if (!dep->next)
+            lastdep = dep;
+
+          if (p2)
+            {
+              /* There is a slash before the % in the dep name.
+                 Extract the directory name.  */
+              if (p == dname)
+                ++p;
+              if ((size_t) (p - dname) > namelen)
+                {
+                  namelen = p - dname;
+                  name = xrealloc (name, namelen + 1);
+                }
+              memcpy (name, dname, p - dname);
+              name[p - dname] = '\0';
+
+              /* In the deps of an implicit rule the 'changed' flag
+                 actually indicates that the dependency is in a
+                 nonexistent subdirectory.  */
+
+              dep->changed = !dir_file_exists_p (name, "");
+            }
+          else
+            /* This dependency does not reside in a subdirectory.  */
+            dep->changed = 0;
+        }
+
+      if (prereqs)
+        {
+          if (lastdep)
+            lastdep->next = copy_dep_chain (prereqs);
+          else
+            rule->deps = copy_dep_chain (prereqs);
+        }
+
+      if (ndeps > max_pattern_deps)
+        max_pattern_deps = ndeps;
+    }
+
+  free (name);
+  free_dep_chain (prereqs);
+}
+\f
+/* Create a pattern rule from a suffix rule.
+   TARGET is the target suffix; SOURCE is the source suffix.
+   CMDS are the commands.
+   If TARGET is nil, it means the target pattern should be '(%.o)'.
+   If SOURCE is nil, it means there should be no deps.  */
+
+static void
+convert_suffix_rule (const char *target, const char *source,
+                     struct commands *cmds)
+{
+  const char **names, **percents;
+  struct dep *deps;
+
+  names = xmalloc (sizeof (const char *));
+  percents = xmalloc (sizeof (const char *));
+
+  if (target == 0)
+    {
+      /* Special case: TARGET being nil means we are defining a '.X.a' suffix
+         rule; the target pattern is always '(%.o)'.  */
+#ifdef VMS
+      *names = strcache_add_len ("(%.obj)", 7);
+#else
+      *names = strcache_add_len ("(%.o)", 5);
+#endif
+      *percents = *names + 1;
+    }
+  else
+    {
+      /* Construct the target name.  */
+      size_t len = strlen (target);
+      char *p = alloca (1 + len + 1);
+      p[0] = '%';
+      memcpy (p + 1, target, len + 1);
+      *names = strcache_add_len (p, len + 1);
+      *percents = *names;
+    }
+
+  if (source == 0)
+    deps = 0;
+  else
+    {
+      /* Construct the dependency name.  */
+      size_t len = strlen (source);
+      char *p = alloca (1 + len + 1);
+      p[0] = '%';
+      memcpy (p + 1, source, len + 1);
+      deps = alloc_dep ();
+      deps->name = strcache_add_len (p, len + 1);
+    }
+
+  create_pattern_rule (names, percents, 1, 0, deps, cmds, 0);
+}
+
+/* Convert old-style suffix rules to pattern rules.
+   All rules for the suffixes on the .SUFFIXES list are converted and added to
+   the chain of pattern rules.  */
+
+void
+convert_to_pattern (void)
+{
+  struct dep *d, *d2;
+  char *rulename;
+
+  /* We will compute every potential suffix rule (.x.y) from the list of
+     suffixes in the .SUFFIXES target's dependencies and see if it exists.
+     First find the longest of the suffixes.  */
+
+  maxsuffix = 0;
+  for (d = suffix_file->deps; d != 0; d = d->next)
+    {
+      size_t l = strlen (dep_name (d));
+      if (l > maxsuffix)
+        maxsuffix = l;
+    }
+
+  /* Space to construct the suffix rule target name.  */
+  rulename = alloca ((maxsuffix * 2) + 1);
+
+  for (d = suffix_file->deps; d != 0; d = d->next)
+    {
+      size_t slen;
+
+      /* Make a rule that is just the suffix, with no deps or commands.
+         This rule exists solely to disqualify match-anything rules.  */
+      convert_suffix_rule (dep_name (d), 0, 0);
+
+      if (d->file->cmds != 0)
+        /* Record a pattern for this suffix's null-suffix rule.  */
+        convert_suffix_rule ("", dep_name (d), d->file->cmds);
+
+      /* Add every other suffix to this one and see if it exists as a
+         two-suffix rule.  */
+      slen = strlen (dep_name (d));
+      memcpy (rulename, dep_name (d), slen);
+
+      for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next)
+        {
+          struct file *f;
+          size_t s2len;
+
+          s2len = strlen (dep_name (d2));
+
+          /* Can't build something from itself.  */
+          if (slen == s2len && streq (dep_name (d), dep_name (d2)))
+            continue;
+
+          memcpy (rulename + slen, dep_name (d2), s2len + 1);
+          f = lookup_file (rulename);
+
+          /* No target, or no commands: it can't be a suffix rule.  */
+          if (f == 0 || f->cmds == 0)
+            continue;
+
+          /* POSIX says that suffix rules can't have prerequisites.
+             In POSIX mode, don't make this a suffix rule.  Previous versions
+             of GNU make did treat this as a suffix rule and ignored the
+             prerequisites, which is bad.  In the future we'll do the same as
+             POSIX, but for now preserve the old behavior and warn about it.  */
+          if (f->deps != 0)
+            {
+              if (posix_pedantic)
+                continue;
+              error (&f->cmds->fileinfo, 0,
+                     _("warning: ignoring prerequisites on suffix rule definition"));
+            }
+
+          if (s2len == 2 && rulename[slen] == '.' && rulename[slen + 1] == 'a')
+            /* A suffix rule '.X.a:' generates the pattern rule '(%.o): %.X'.
+               It also generates a normal '%.a: %.X' rule below.  */
+            convert_suffix_rule (NULL, /* Indicates '(%.o)'.  */
+                                 dep_name (d),
+                                 f->cmds);
+
+          /* The suffix rule '.X.Y:' is converted
+             to the pattern rule '%.Y: %.X'.  */
+          convert_suffix_rule (dep_name (d2), dep_name (d), f->cmds);
+        }
+    }
+}
+
+
+/* Install the pattern rule RULE (whose fields have been filled in) at the end
+   of the list (so that any rules previously defined will take precedence).
+   If this rule duplicates a previous one (identical target and dependencies),
+   the old one is replaced if OVERRIDE is nonzero, otherwise this new one is
+   thrown out.  When an old rule is replaced, the new one is put at the end of
+   the list.  Return nonzero if RULE is used; zero if not.  */
+
+static int
+new_pattern_rule (struct rule *rule, int override)
+{
+  struct rule *r, *lastrule;
+  unsigned int i, j;
+
+  rule->in_use = 0;
+  rule->terminal = 0;
+
+  rule->next = 0;
+
+  /* Search for an identical rule.  */
+  lastrule = 0;
+  for (r = pattern_rules; r != 0; lastrule = r, r = r->next)
+    for (i = 0; i < rule->num; ++i)
+      {
+        for (j = 0; j < r->num; ++j)
+          if (!streq (rule->targets[i], r->targets[j]))
+            break;
+        /* If all the targets matched...  */
+        if (j == r->num)
+          {
+            struct dep *d, *d2;
+            for (d = rule->deps, d2 = r->deps;
+                 d != 0 && d2 != 0; d = d->next, d2 = d2->next)
+              if (!streq (dep_name (d), dep_name (d2)))
+                break;
+            if (d == 0 && d2 == 0)
+              {
+                /* All the dependencies matched.  */
+                if (override)
+                  {
+                    /* Remove the old rule.  */
+                    freerule (r, lastrule);
+                    /* Install the new one.  */
+                    if (pattern_rules == 0)
+                      pattern_rules = rule;
+                    else
+                      last_pattern_rule->next = rule;
+                    last_pattern_rule = rule;
+
+                    /* We got one.  Stop looking.  */
+                    goto matched;
+                  }
+                else
+                  {
+                    /* The old rule stays intact.  Destroy the new one.  */
+                    freerule (rule, (struct rule *) 0);
+                    return 0;
+                  }
+              }
+          }
+      }
+
+ matched:;
+
+  if (r == 0)
+    {
+      /* There was no rule to replace.  */
+      if (pattern_rules == 0)
+        pattern_rules = rule;
+      else
+        last_pattern_rule->next = rule;
+      last_pattern_rule = rule;
+    }
+
+  return 1;
+}
+
+
+/* Install an implicit pattern rule based on the three text strings
+   in the structure P points to.  These strings come from one of
+   the arrays of default implicit pattern rules.
+   TERMINAL specifies what the 'terminal' field of the rule should be.  */
+
+void
+install_pattern_rule (struct pspec *p, int terminal)
+{
+  struct rule *r;
+  const char *ptr;
+
+  r = xmalloc (sizeof (struct rule));
+
+  r->num = 1;
+  r->targets = xmalloc (sizeof (const char *));
+  r->suffixes = xmalloc (sizeof (const char *));
+  r->lens = xmalloc (sizeof (unsigned int));
+
+  r->lens[0] = (unsigned int) strlen (p->target);
+  r->targets[0] = p->target;
+  r->suffixes[0] = find_percent_cached (&r->targets[0]);
+  assert (r->suffixes[0] != NULL);
+  ++r->suffixes[0];
+
+  ptr = p->dep;
+  r->deps = PARSE_SIMPLE_SEQ ((char **)&ptr, struct dep);
+
+  if (new_pattern_rule (r, 0))
+    {
+      r->terminal = terminal ? 1 : 0;
+      r->cmds = xmalloc (sizeof (struct commands));
+      r->cmds->fileinfo.filenm = 0;
+      r->cmds->fileinfo.lineno = 0;
+      r->cmds->fileinfo.offset = 0;
+      /* These will all be string literals, but we malloc space for them
+         anyway because somebody might want to free them later.  */
+      r->cmds->commands = xstrdup (p->commands);
+      r->cmds->command_lines = 0;
+      r->cmds->recipe_prefix = RECIPEPREFIX_DEFAULT;
+    }
+}
+
+
+/* Free all the storage used in RULE and take it out of the
+   pattern_rules chain.  LASTRULE is the rule whose next pointer
+   points to RULE.  */
+
+static void
+freerule (struct rule *rule, struct rule *lastrule)
+{
+  struct rule *next = rule->next;
+
+  free_dep_chain (rule->deps);
+
+  /* MSVC erroneously warns without a cast here.  */
+  free ((void *)rule->targets);
+  free ((void *)rule->suffixes);
+  free (rule->lens);
+
+  /* We can't free the storage for the commands because there
+     are ways that they could be in more than one place:
+       * If the commands came from a suffix rule, they could also be in
+       the 'struct file's for other suffix rules or plain targets given
+       on the same makefile line.
+       * If two suffixes that together make a two-suffix rule were each
+       given twice in the .SUFFIXES list, and in the proper order, two
+       identical pattern rules would be created and the second one would
+       be discarded here, but both would contain the same 'struct commands'
+       pointer from the 'struct file' for the suffix rule.  */
+
+  free (rule);
+
+  if (pattern_rules == rule)
+    if (lastrule != 0)
+      abort ();
+    else
+      pattern_rules = next;
+  else if (lastrule != 0)
+    lastrule->next = next;
+  if (last_pattern_rule == rule)
+    last_pattern_rule = lastrule;
+}
+\f
+/* Create a new pattern rule with the targets in the nil-terminated array
+   TARGETS.  TARGET_PERCENTS is an array of pointers to the % in each element
+   of TARGETS.  N is the number of items in the array (not counting the nil
+   element).  The new rule has dependencies DEPS and commands from COMMANDS.
+   It is a terminal rule if TERMINAL is nonzero.  This rule overrides
+   identical rules with different commands if OVERRIDE is nonzero.
+
+   The storage for TARGETS and its elements and TARGET_PERCENTS is used and
+   must not be freed until the rule is destroyed.  */
+
+void
+create_pattern_rule (const char **targets, const char **target_percents,
+                     unsigned short n, int terminal, struct dep *deps,
+                     struct commands *commands, int override)
+{
+  unsigned int i;
+  struct rule *r = xmalloc (sizeof (struct rule));
+
+  r->num = n;
+  r->cmds = commands;
+  r->deps = deps;
+  r->targets = targets;
+  r->suffixes = target_percents;
+  r->lens = xmalloc (n * sizeof (unsigned int));
+
+  for (i = 0; i < n; ++i)
+    {
+      r->lens[i] = (unsigned int) strlen (targets[i]);
+      assert (r->suffixes[i] != NULL);
+      ++r->suffixes[i];
+    }
+
+  if (new_pattern_rule (r, override))
+    r->terminal = terminal ? 1 : 0;
+}
+\f
+/* Print the data base of rules.  */
+
+static void                     /* Useful to call from gdb.  */
+print_rule (struct rule *r)
+{
+  unsigned int i;
+
+  for (i = 0; i < r->num; ++i)
+    {
+      fputs (r->targets[i], stdout);
+      putchar ((i + 1 == r->num) ? ':' : ' ');
+    }
+  if (r->terminal)
+    putchar (':');
+
+  print_prereqs (r->deps);
+
+  if (r->cmds != 0)
+    print_commands (r->cmds);
+}
+
+void
+print_rule_data_base (void)
+{
+  unsigned int rules, terminal;
+  struct rule *r;
+
+  puts (_("\n# Implicit Rules"));
+
+  rules = terminal = 0;
+  for (r = pattern_rules; r != 0; r = r->next)
+    {
+      ++rules;
+
+      putchar ('\n');
+      print_rule (r);
+
+      if (r->terminal)
+        ++terminal;
+    }
+
+  if (rules == 0)
+    puts (_("\n# No implicit rules."));
+  else
+    {
+      printf (_("\n# %u implicit rules, %u (%.1f%%) terminal."),
+              rules, terminal, (double) terminal / (double) rules * 100.0);
+    }
+
+  if (num_pattern_rules != rules)
+    {
+      /* This can happen if a fatal error was detected while reading the
+         makefiles and thus count_implicit_rule_limits wasn't called yet.  */
+      if (num_pattern_rules != 0)
+        ONN (fatal, NILF, _("BUG: num_pattern_rules is wrong!  %u != %u"),
+             num_pattern_rules, rules);
+    }
+}
diff --git a/src/rule.h b/src/rule.h
new file mode 100644 (file)
index 0000000..120a682
--- /dev/null
@@ -0,0 +1,57 @@
+/* Definitions for using pattern rules in GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Structure used for pattern (implicit) rules.  */
+
+struct rule
+  {
+    struct rule *next;
+    const char **targets;       /* Targets of the rule.  */
+    unsigned int *lens;         /* Lengths of each target.  */
+    const char **suffixes;      /* Suffixes (after '%') of each target.  */
+    struct dep *deps;           /* Dependencies of the rule.  */
+    struct commands *cmds;      /* Commands to execute.  */
+    unsigned short num;         /* Number of targets.  */
+    char terminal;              /* If terminal (double-colon).  */
+    char in_use;                /* If in use by a parent pattern_search.  */
+  };
+
+/* For calling install_pattern_rule.  */
+struct pspec
+  {
+    const char *target, *dep, *commands;
+  };
+
+
+extern struct rule *pattern_rules;
+extern struct rule *last_pattern_rule;
+extern unsigned int num_pattern_rules;
+
+extern unsigned int max_pattern_deps;
+extern unsigned int max_pattern_targets;
+extern size_t max_pattern_dep_length;
+
+extern struct file *suffix_file;
+
+
+void snap_implicit_rules (void);
+void convert_to_pattern (void);
+void install_pattern_rule (struct pspec *p, int terminal);
+void create_pattern_rule (const char **targets, const char **target_percents,
+                          unsigned short num, int terminal, struct dep *deps,
+                          struct commands *commands, int override);
+void print_rule_data_base (void);
diff --git a/src/signame.c b/src/signame.c
new file mode 100644 (file)
index 0000000..77bae3b
--- /dev/null
@@ -0,0 +1,254 @@
+/* Convert between signal names and numbers.
+Copyright (C) 1990-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+/* If the system provides strsignal, we don't need it. */
+
+#if !HAVE_STRSIGNAL
+
+/* If the system provides sys_siglist, we'll use that.
+   Otherwise create our own.
+ */
+
+#if !HAVE_DECL_SYS_SIGLIST
+
+/* Some systems do not define NSIG in <signal.h>.  */
+#ifndef NSIG
+#ifdef  _NSIG
+#define NSIG    _NSIG
+#else
+#define NSIG    32
+#endif
+#endif
+
+/* There is too much variation in Sys V signal numbers and names, so
+   we must initialize them at runtime.  */
+
+static const char *undoc;
+
+static const char *sys_siglist[NSIG];
+
+/* Table of abbreviations for signals.  Note:  A given number can
+   appear more than once with different abbreviations.  */
+#define SIG_TABLE_SIZE  (NSIG*2)
+
+typedef struct
+  {
+    int number;
+    const char *abbrev;
+  } num_abbrev;
+
+static num_abbrev sig_table[SIG_TABLE_SIZE];
+
+/* Number of elements of sig_table used.  */
+static int sig_table_nelts = 0;
+
+/* Enter signal number NUMBER into the tables with ABBREV and NAME.  */
+
+static void
+init_sig (int number, const char *abbrev, const char *name)
+{
+  /* If this value is ever greater than NSIG it seems like it'd be a bug in
+     the system headers, but... better safe than sorry.  We know, for
+     example, that this isn't always true on VMS.  */
+
+  if (number >= 0 && number < NSIG)
+    sys_siglist[number] = name;
+
+  if (sig_table_nelts < SIG_TABLE_SIZE)
+    {
+      sig_table[sig_table_nelts].number = number;
+      sig_table[sig_table_nelts++].abbrev = abbrev;
+    }
+}
+
+static int
+signame_init (void)
+{
+  int i;
+
+  undoc = xstrdup (_("unknown signal"));
+
+  /* Initialize signal names.  */
+  for (i = 0; i < NSIG; i++)
+    sys_siglist[i] = undoc;
+
+  /* Initialize signal names.  */
+#if defined (SIGHUP)
+  init_sig (SIGHUP, "HUP", _("Hangup"));
+#endif
+#if defined (SIGINT)
+  init_sig (SIGINT, "INT", _("Interrupt"));
+#endif
+#if defined (SIGQUIT)
+  init_sig (SIGQUIT, "QUIT", _("Quit"));
+#endif
+#if defined (SIGILL)
+  init_sig (SIGILL, "ILL", _("Illegal Instruction"));
+#endif
+#if defined (SIGTRAP)
+  init_sig (SIGTRAP, "TRAP", _("Trace/breakpoint trap"));
+#endif
+  /* If SIGIOT == SIGABRT, we want to print it as SIGABRT because
+     SIGABRT is in ANSI and POSIX.1 and SIGIOT isn't.  */
+#if defined (SIGABRT)
+  init_sig (SIGABRT, "ABRT", _("Aborted"));
+#endif
+#if defined (SIGIOT)
+  init_sig (SIGIOT, "IOT", _("IOT trap"));
+#endif
+#if defined (SIGEMT)
+  init_sig (SIGEMT, "EMT", _("EMT trap"));
+#endif
+#if defined (SIGFPE)
+  init_sig (SIGFPE, "FPE", _("Floating point exception"));
+#endif
+#if defined (SIGKILL)
+  init_sig (SIGKILL, "KILL", _("Killed"));
+#endif
+#if defined (SIGBUS)
+  init_sig (SIGBUS, "BUS", _("Bus error"));
+#endif
+#if defined (SIGSEGV)
+  init_sig (SIGSEGV, "SEGV", _("Segmentation fault"));
+#endif
+#if defined (SIGSYS)
+  init_sig (SIGSYS, "SYS", _("Bad system call"));
+#endif
+#if defined (SIGPIPE)
+  init_sig (SIGPIPE, "PIPE", _("Broken pipe"));
+#endif
+#if defined (SIGALRM)
+  init_sig (SIGALRM, "ALRM", _("Alarm clock"));
+#endif
+#if defined (SIGTERM)
+  init_sig (SIGTERM, "TERM", _("Terminated"));
+#endif
+#if defined (SIGUSR1)
+  init_sig (SIGUSR1, "USR1", _("User defined signal 1"));
+#endif
+#if defined (SIGUSR2)
+  init_sig (SIGUSR2, "USR2", _("User defined signal 2"));
+#endif
+  /* If SIGCLD == SIGCHLD, we want to print it as SIGCHLD because that
+     is what is in POSIX.1.  */
+#if defined (SIGCHLD)
+  init_sig (SIGCHLD, "CHLD", _("Child exited"));
+#endif
+#if defined (SIGCLD)
+  init_sig (SIGCLD, "CLD", _("Child exited"));
+#endif
+#if defined (SIGPWR)
+  init_sig (SIGPWR, "PWR", _("Power failure"));
+#endif
+#if defined (SIGTSTP)
+  init_sig (SIGTSTP, "TSTP", _("Stopped"));
+#endif
+#if defined (SIGTTIN)
+  init_sig (SIGTTIN, "TTIN", _("Stopped (tty input)"));
+#endif
+#if defined (SIGTTOU)
+  init_sig (SIGTTOU, "TTOU", _("Stopped (tty output)"));
+#endif
+#if defined (SIGSTOP)
+  init_sig (SIGSTOP, "STOP", _("Stopped (signal)"));
+#endif
+#if defined (SIGXCPU)
+  init_sig (SIGXCPU, "XCPU", _("CPU time limit exceeded"));
+#endif
+#if defined (SIGXFSZ)
+  init_sig (SIGXFSZ, "XFSZ", _("File size limit exceeded"));
+#endif
+#if defined (SIGVTALRM)
+  init_sig (SIGVTALRM, "VTALRM", _("Virtual timer expired"));
+#endif
+#if defined (SIGPROF)
+  init_sig (SIGPROF, "PROF", _("Profiling timer expired"));
+#endif
+#if defined (SIGWINCH)
+  /* "Window size changed" might be more accurate, but even if that
+     is all that it means now, perhaps in the future it will be
+     extended to cover other kinds of window changes.  */
+  init_sig (SIGWINCH, "WINCH", _("Window changed"));
+#endif
+#if defined (SIGCONT)
+  init_sig (SIGCONT, "CONT", _("Continued"));
+#endif
+#if defined (SIGURG)
+  init_sig (SIGURG, "URG", _("Urgent I/O condition"));
+#endif
+#if defined (SIGIO)
+  /* "I/O pending" has also been suggested.  A disadvantage is that signal
+     only happens when the process has asked for it, not every time I/O is
+     pending.  Another disadvantage is the confusion from giving it a
+     different name than under Unix.  */
+  init_sig (SIGIO, "IO", _("I/O possible"));
+#endif
+#if defined (SIGWIND)
+  init_sig (SIGWIND, "WIND", _("SIGWIND"));
+#endif
+#if defined (SIGPHONE)
+  init_sig (SIGPHONE, "PHONE", _("SIGPHONE"));
+#endif
+#if defined (SIGPOLL)
+  init_sig (SIGPOLL, "POLL", _("I/O possible"));
+#endif
+#if defined (SIGLOST)
+  init_sig (SIGLOST, "LOST", _("Resource lost"));
+#endif
+#if defined (SIGDANGER)
+  init_sig (SIGDANGER, "DANGER", _("Danger signal"));
+#endif
+#if defined (SIGINFO)
+  init_sig (SIGINFO, "INFO", _("Information request"));
+#endif
+#if defined (SIGNOFP)
+  init_sig (SIGNOFP, "NOFP", _("Floating point co-processor not available"));
+#endif
+
+  return 1;
+}
+
+#endif  /* HAVE_DECL_SYS_SIGLIST */
+
+
+char *
+strsignal (int sig)
+{
+  static char buf[] = "Signal 12345678901234567890";
+
+#if ! HAVE_DECL_SYS_SIGLIST
+# if HAVE_DECL__SYS_SIGLIST
+#  define sys_siglist _sys_siglist
+# elif HAVE_DECL___SYS_SIGLIST
+#  define sys_siglist __sys_siglist
+# else
+  static int sig_initted = 0;
+
+  if (!sig_initted)
+    sig_initted = signame_init ();
+# endif
+#endif
+
+  if (sig > 0 && sig < NSIG)
+    return (char *) sys_siglist[sig];
+
+  sprintf (buf, "Signal %d", sig);
+  return buf;
+}
+
+#endif  /* HAVE_STRSIGNAL */
diff --git a/src/strcache.c b/src/strcache.c
new file mode 100644 (file)
index 0000000..cee9d09
--- /dev/null
@@ -0,0 +1,330 @@
+/* Constant string caching for GNU Make.
+Copyright (C) 2006-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <stddef.h>
+#include <assert.h>
+
+#include "hash.h"
+
+/* A string cached here will never be freed, so we don't need to worry about
+   reference counting.  We just store the string, and then remember it in a
+   hash so it can be looked up again. */
+
+typedef unsigned short int sc_buflen_t;
+
+struct strcache {
+  struct strcache *next;    /* The next block of strings.  Must be first!  */
+  sc_buflen_t end;          /* Offset to the beginning of free space.  */
+  sc_buflen_t bytesfree;    /* Free space left in this buffer.  */
+  sc_buflen_t count;        /* # of strings in this buffer (for stats).  */
+  char buffer[1];           /* The buffer comes after this.  */
+};
+
+/* The size (in bytes) of each cache buffer.
+   Try to pick something that will map well into the heap.
+   This must be able to be represented by a short int (<=65535).  */
+#define CACHE_BUFFER_BASE       (8192)
+#define CACHE_BUFFER_ALLOC(_s)  ((_s) - (2 * sizeof (size_t)))
+#define CACHE_BUFFER_OFFSET     (offsetof (struct strcache, buffer))
+#define CACHE_BUFFER_SIZE(_s)   (CACHE_BUFFER_ALLOC(_s) - CACHE_BUFFER_OFFSET)
+#define BUFSIZE                 CACHE_BUFFER_SIZE (CACHE_BUFFER_BASE)
+
+static struct strcache *strcache = NULL;
+static struct strcache *fullcache = NULL;
+
+static unsigned long total_buffers = 0;
+static unsigned long total_strings = 0;
+static unsigned long total_size = 0;
+
+/* Add a new buffer to the cache.  Add it at the front to reduce search time.
+   This can also increase the overhead, since it's less likely that older
+   buffers will be filled in.  However, GNU make has so many smaller strings
+   that this doesn't seem to be much of an issue in practice.
+ */
+static struct strcache *
+new_cache (struct strcache **head, sc_buflen_t buflen)
+{
+  struct strcache *new = xmalloc (buflen + CACHE_BUFFER_OFFSET);
+  new->end = 0;
+  new->count = 0;
+  new->bytesfree = buflen;
+
+  new->next = *head;
+  *head = new;
+
+  ++total_buffers;
+  return new;
+}
+
+static const char *
+copy_string (struct strcache *sp, const char *str, sc_buflen_t len)
+{
+  /* Add the string to this cache.  */
+  char *res = &sp->buffer[sp->end];
+
+  memmove (res, str, len);
+  res[len++] = '\0';
+  sp->end += len;
+  sp->bytesfree -= len;
+  ++sp->count;
+
+  return res;
+}
+
+static const char *
+add_string (const char *str, sc_buflen_t len)
+{
+  const char *res;
+  struct strcache *sp;
+  struct strcache **spp = &strcache;
+  /* We need space for the nul char.  */
+  sc_buflen_t sz = len + 1;
+
+  ++total_strings;
+  total_size += sz;
+
+  /* If the string we want is too large to fit into a single buffer, then
+     no existing cache is large enough.  Add it directly to the fullcache.  */
+  if (sz > BUFSIZE)
+    {
+      sp = new_cache (&fullcache, sz);
+      return copy_string (sp, str, len);
+    }
+
+  /* Find the first cache with enough free space.  */
+  for (; *spp != NULL; spp = &(*spp)->next)
+    if ((*spp)->bytesfree > sz)
+      break;
+  sp = *spp;
+
+  /* If nothing is big enough, make a new cache at the front.  */
+  if (sp == NULL)
+    {
+      sp = new_cache (&strcache, BUFSIZE);
+      spp = &strcache;
+    }
+
+  /* Add the string to this cache.  */
+  res = copy_string (sp, str, len);
+
+  /* If the amount free in this cache is less than the average string size,
+     consider it full and move it to the full list.  */
+  if (total_strings > 20 && sp->bytesfree < (total_size / total_strings) + 1)
+    {
+      *spp = sp->next;
+      sp->next = fullcache;
+      fullcache = sp;
+    }
+
+  return res;
+}
+
+/* For strings too large for the strcache, we just save them in a list.  */
+struct hugestring {
+  struct hugestring *next;  /* The next string.  */
+  char buffer[1];           /* The string.  */
+};
+
+static struct hugestring *hugestrings = NULL;
+
+static const char *
+add_hugestring (const char *str, size_t len)
+{
+  struct hugestring *new = xmalloc (sizeof (struct hugestring) + len);
+  memcpy (new->buffer, str, len);
+  new->buffer[len] = '\0';
+
+  new->next = hugestrings;
+  hugestrings = new;
+
+  return new->buffer;
+}
+
+/* Hash table of strings in the cache.  */
+
+static unsigned long
+str_hash_1 (const void *key)
+{
+  return_ISTRING_HASH_1 ((const char *) key);
+}
+
+static unsigned long
+str_hash_2 (const void *key)
+{
+  return_ISTRING_HASH_2 ((const char *) key);
+}
+
+static int
+str_hash_cmp (const void *x, const void *y)
+{
+  return_ISTRING_COMPARE ((const char *) x, (const char *) y);
+}
+
+static struct hash_table strings;
+static unsigned long total_adds = 0;
+
+static const char *
+add_hash (const char *str, size_t len)
+{
+  char *const *slot;
+  const char *key;
+
+  /* If it's too large for the string cache, just copy it.
+     We don't bother trying to match these.  */
+  if (len > USHRT_MAX - 1)
+    return add_hugestring (str, len);
+
+  /* Look up the string in the hash.  If it's there, return it.  */
+  slot = (char *const *) hash_find_slot (&strings, str);
+  key = *slot;
+
+  /* Count the total number of add operations we performed.  */
+  ++total_adds;
+
+  if (!HASH_VACANT (key))
+    return key;
+
+  /* Not there yet so add it to a buffer, then into the hash table.  */
+  key = add_string (str, (sc_buflen_t)len);
+  hash_insert_at (&strings, key, slot);
+  return key;
+}
+
+/* Returns true if the string is in the cache; false if not.  */
+int
+strcache_iscached (const char *str)
+{
+  struct strcache *sp;
+
+  for (sp = strcache; sp != 0; sp = sp->next)
+    if (str >= sp->buffer && str < sp->buffer + sp->end)
+      return 1;
+  for (sp = fullcache; sp != 0; sp = sp->next)
+    if (str >= sp->buffer && str < sp->buffer + sp->end)
+      return 1;
+
+  {
+    struct hugestring *hp;
+    for (hp = hugestrings; hp != 0; hp = hp->next)
+      if (str == hp->buffer)
+        return 1;
+  }
+
+  return 0;
+}
+
+/* If the string is already in the cache, return a pointer to the cached
+   version.  If not, add it then return a pointer to the cached version.
+   Note we do NOT take control of the string passed in.  */
+const char *
+strcache_add (const char *str)
+{
+  return add_hash (str, strlen (str));
+}
+
+const char *
+strcache_add_len (const char *str, size_t len)
+{
+  /* If we're not given a nul-terminated string we have to create one, because
+     the hashing functions expect it.  */
+  if (str[len] != '\0')
+    {
+      char *key = alloca (len + 1);
+      memcpy (key, str, len);
+      key[len] = '\0';
+      str = key;
+    }
+
+  return add_hash (str, len);
+}
+
+void
+strcache_init (void)
+{
+  hash_init (&strings, 8000, str_hash_1, str_hash_2, str_hash_cmp);
+}
+
+
+/* Generate some stats output.  */
+
+void
+strcache_print_stats (const char *prefix)
+{
+  const struct strcache *sp;
+  unsigned long numbuffs = 0, fullbuffs = 0;
+  unsigned long totfree = 0, maxfree = 0, minfree = BUFSIZE;
+
+  if (! strcache)
+    {
+      printf (_("\n%s No strcache buffers\n"), prefix);
+      return;
+    }
+
+  /* Count the first buffer separately since it's not full.  */
+  for (sp = strcache->next; sp != NULL; sp = sp->next)
+    {
+      sc_buflen_t bf = sp->bytesfree;
+
+      totfree += bf;
+      maxfree = (bf > maxfree ? bf : maxfree);
+      minfree = (bf < minfree ? bf : minfree);
+
+      ++numbuffs;
+    }
+  for (sp = fullcache; sp != NULL; sp = sp->next)
+    {
+      sc_buflen_t bf = sp->bytesfree;
+
+      totfree += bf;
+      maxfree = (bf > maxfree ? bf : maxfree);
+      minfree = (bf < minfree ? bf : minfree);
+
+      ++numbuffs;
+      ++fullbuffs;
+    }
+
+  /* Make sure we didn't lose any buffers.  */
+  assert (total_buffers == numbuffs + 1);
+
+  printf (_("\n%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu B\n"),
+          prefix, numbuffs + 1, fullbuffs, total_strings, total_size,
+          (total_size / total_strings));
+
+  printf (_("%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %u B\n"),
+          prefix, (sc_buflen_t)BUFSIZE, strcache->end, strcache->count,
+          (unsigned int) (strcache->end / strcache->count));
+
+  if (numbuffs)
+    {
+      /* Show information about non-current buffers.  */
+      unsigned long sz = total_size - strcache->end;
+      unsigned long cnt = total_strings - strcache->count;
+      sc_buflen_t avgfree = (sc_buflen_t) (totfree / numbuffs);
+
+      printf (_("%s other used: total = %lu B / count = %lu / avg = %lu B\n"),
+              prefix, sz, cnt, sz / cnt);
+
+      printf (_("%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"),
+              prefix, totfree, maxfree, minfree, avgfree);
+    }
+
+  printf (_("\n%s strcache performance: lookups = %lu / hit rate = %lu%%\n"),
+          prefix, total_adds, (long unsigned)(100.0 * (total_adds - total_strings) / total_adds));
+  fputs (_("# hash-table stats:\n# "), stdout);
+  hash_print_stats (&strings, stdout);
+}
diff --git a/src/variable.c b/src/variable.c
new file mode 100644 (file)
index 0000000..e379622
--- /dev/null
@@ -0,0 +1,1826 @@
+/* Internals of variables for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <assert.h>
+
+#include "filedef.h"
+#include "dep.h"
+#include "job.h"
+#include "commands.h"
+#include "variable.h"
+#include "rule.h"
+#ifdef WINDOWS32
+#include "pathstuff.h"
+#endif
+#include "hash.h"
+
+/* Incremented every time we add or remove a global variable.  */
+static unsigned long variable_changenum;
+
+/* Chain of all pattern-specific variables.  */
+
+static struct pattern_var *pattern_vars;
+
+/* Pointer to the last struct in the pack of a specific size, from 1 to 255.*/
+
+static struct pattern_var *last_pattern_vars[256];
+
+/* Create a new pattern-specific variable struct. The new variable is
+   inserted into the PATTERN_VARS list in the shortest patterns first
+   order to support the shortest stem matching (the variables are
+   matched in the reverse order so the ones with the longest pattern
+   will be considered first). Variables with the same pattern length
+   are inserted in the definition order. */
+
+struct pattern_var *
+create_pattern_var (const char *target, const char *suffix)
+{
+  size_t len = strlen (target);
+  struct pattern_var *p = xcalloc (sizeof (struct pattern_var));
+
+  if (pattern_vars != 0)
+    {
+      if (len < 256 && last_pattern_vars[len] != 0)
+        {
+          p->next = last_pattern_vars[len]->next;
+          last_pattern_vars[len]->next = p;
+        }
+      else
+        {
+          /* Find the position where we can insert this variable. */
+          struct pattern_var **v;
+
+          for (v = &pattern_vars; ; v = &(*v)->next)
+            {
+              /* Insert at the end of the pack so that patterns with the
+                 same length appear in the order they were defined .*/
+
+              if (*v == 0 || (*v)->len > len)
+                {
+                  p->next = *v;
+                  *v = p;
+                  break;
+                }
+            }
+        }
+    }
+  else
+    {
+      pattern_vars = p;
+      p->next = 0;
+    }
+
+  p->target = target;
+  p->len = len;
+  p->suffix = suffix + 1;
+
+  if (len < 256)
+    last_pattern_vars[len] = p;
+
+  return p;
+}
+
+/* Look up a target in the pattern-specific variable list.  */
+
+static struct pattern_var *
+lookup_pattern_var (struct pattern_var *start, const char *target)
+{
+  struct pattern_var *p;
+  size_t targlen = strlen (target);
+
+  for (p = start ? start->next : pattern_vars; p != 0; p = p->next)
+    {
+      const char *stem;
+      size_t stemlen;
+
+      if (p->len > targlen)
+        /* It can't possibly match.  */
+        continue;
+
+      /* From the lengths of the filename and the pattern parts,
+         find the stem: the part of the filename that matches the %.  */
+      stem = target + (p->suffix - p->target - 1);
+      stemlen = targlen - p->len + 1;
+
+      /* Compare the text in the pattern before the stem, if any.  */
+      if (stem > target && !strneq (p->target, target, stem - target))
+        continue;
+
+      /* Compare the text in the pattern after the stem, if any.
+         We could test simply using streq, but this way we compare the
+         first two characters immediately.  This saves time in the very
+         common case where the first character matches because it is a
+         period.  */
+      if (*p->suffix == stem[stemlen]
+          && (*p->suffix == '\0' || streq (&p->suffix[1], &stem[stemlen+1])))
+        break;
+    }
+
+  return p;
+}
+\f
+/* Hash table of all global variable definitions.  */
+
+static unsigned long
+variable_hash_1 (const void *keyv)
+{
+  struct variable const *key = (struct variable const *) keyv;
+  return_STRING_N_HASH_1 (key->name, key->length);
+}
+
+static unsigned long
+variable_hash_2 (const void *keyv)
+{
+  struct variable const *key = (struct variable const *) keyv;
+  return_STRING_N_HASH_2 (key->name, key->length);
+}
+
+static int
+variable_hash_cmp (const void *xv, const void *yv)
+{
+  struct variable const *x = (struct variable const *) xv;
+  struct variable const *y = (struct variable const *) yv;
+  int result = x->length - y->length;
+  if (result)
+    return result;
+  return_STRING_N_COMPARE (x->name, y->name, x->length);
+}
+
+#ifndef VARIABLE_BUCKETS
+#define VARIABLE_BUCKETS                523
+#endif
+#ifndef PERFILE_VARIABLE_BUCKETS
+#define PERFILE_VARIABLE_BUCKETS        23
+#endif
+#ifndef SMALL_SCOPE_VARIABLE_BUCKETS
+#define SMALL_SCOPE_VARIABLE_BUCKETS    13
+#endif
+
+static struct variable_set global_variable_set;
+static struct variable_set_list global_setlist
+  = { 0, &global_variable_set, 0 };
+struct variable_set_list *current_variable_set_list = &global_setlist;
+\f
+/* Implement variables.  */
+
+void
+init_hash_global_variable_set (void)
+{
+  hash_init (&global_variable_set.table, VARIABLE_BUCKETS,
+             variable_hash_1, variable_hash_2, variable_hash_cmp);
+}
+
+/* Define variable named NAME with value VALUE in SET.  VALUE is copied.
+   LENGTH is the length of NAME, which does not need to be null-terminated.
+   ORIGIN specifies the origin of the variable (makefile, command line
+   or environment).
+   If RECURSIVE is nonzero a flag is set in the variable saying
+   that it should be recursively re-expanded.  */
+
+struct variable *
+define_variable_in_set (const char *name, size_t length,
+                        const char *value, enum variable_origin origin,
+                        int recursive, struct variable_set *set,
+                        const floc *flocp)
+{
+  struct variable *v;
+  struct variable **var_slot;
+  struct variable var_key;
+
+  if (set == NULL)
+    set = &global_variable_set;
+
+  var_key.name = (char *) name;
+  var_key.length = (unsigned int) length;
+  var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
+  v = *var_slot;
+
+#ifdef VMS
+  /* VMS does not populate envp[] with DCL symbols and logical names which
+     historically are mapped to environent variables.
+     If the variable is not yet defined, then we need to check if getenv()
+     can find it.  Do not do this for origin == o_env to avoid infinte
+     recursion */
+  if (HASH_VACANT (v) && (origin != o_env))
+    {
+      struct variable * vms_variable;
+      char * vname = alloca (length + 1);
+      char * vvalue;
+
+      strncpy (vname, name, length);
+      vvalue = getenv(vname);
+
+      /* Values starting with '$' are probably foreign commands.
+         We want to treat them as Shell aliases and not look them up here */
+      if ((vvalue != NULL) && (vvalue[0] != '$'))
+        {
+          vms_variable =  lookup_variable(name, length);
+          /* Refresh the slot */
+          var_slot = (struct variable **) hash_find_slot (&set->table,
+                                                          &var_key);
+          v = *var_slot;
+        }
+    }
+#endif
+
+  if (env_overrides && origin == o_env)
+    origin = o_env_override;
+
+  if (! HASH_VACANT (v))
+    {
+      if (env_overrides && v->origin == o_env)
+        /* V came from in the environment.  Since it was defined
+           before the switches were parsed, it wasn't affected by -e.  */
+        v->origin = o_env_override;
+
+      /* A variable of this name is already defined.
+         If the old definition is from a stronger source
+         than this one, don't redefine it.  */
+      if ((int) origin >= (int) v->origin)
+        {
+          free (v->value);
+          v->value = xstrdup (value);
+          if (flocp != 0)
+            v->fileinfo = *flocp;
+          else
+            v->fileinfo.filenm = 0;
+          v->origin = origin;
+          v->recursive = recursive;
+        }
+      return v;
+    }
+
+  /* Create a new variable definition and add it to the hash table.  */
+
+  v = xcalloc (sizeof (struct variable));
+  v->name = xstrndup (name, length);
+  v->length = (unsigned int) length;
+  hash_insert_at (&set->table, v, var_slot);
+  if (set == &global_variable_set)
+    ++variable_changenum;
+
+  v->value = xstrdup (value);
+  if (flocp != 0)
+    v->fileinfo = *flocp;
+  v->origin = origin;
+  v->recursive = recursive;
+
+  v->export = v_default;
+  v->exportable = 1;
+  if (*name != '_' && (*name < 'A' || *name > 'Z')
+      && (*name < 'a' || *name > 'z'))
+    v->exportable = 0;
+  else
+    {
+      for (++name; *name != '\0'; ++name)
+        if (*name != '_' && (*name < 'a' || *name > 'z')
+            && (*name < 'A' || *name > 'Z') && !ISDIGIT(*name))
+          break;
+
+      if (*name != '\0')
+        v->exportable = 0;
+    }
+
+  return v;
+}
+\f
+
+/* Undefine variable named NAME in SET. LENGTH is the length of NAME, which
+   does not need to be null-terminated. ORIGIN specifies the origin of the
+   variable (makefile, command line or environment). */
+
+static void
+free_variable_name_and_value (const void *item)
+{
+  struct variable *v = (struct variable *) item;
+  free (v->name);
+  free (v->value);
+}
+
+void
+free_variable_set (struct variable_set_list *list)
+{
+  hash_map (&list->set->table, free_variable_name_and_value);
+  hash_free (&list->set->table, 1);
+  free (list->set);
+  free (list);
+}
+
+void
+undefine_variable_in_set (const char *name, size_t length,
+                          enum variable_origin origin,
+                          struct variable_set *set)
+{
+  struct variable *v;
+  struct variable **var_slot;
+  struct variable var_key;
+
+  if (set == NULL)
+    set = &global_variable_set;
+
+  var_key.name = (char *) name;
+  var_key.length = (unsigned int) length;
+  var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
+
+  if (env_overrides && origin == o_env)
+    origin = o_env_override;
+
+  v = *var_slot;
+  if (! HASH_VACANT (v))
+    {
+      if (env_overrides && v->origin == o_env)
+        /* V came from in the environment.  Since it was defined
+           before the switches were parsed, it wasn't affected by -e.  */
+        v->origin = o_env_override;
+
+      /* Undefine only if this undefinition is from an equal or stronger
+         source than the variable definition.  */
+      if ((int) origin >= (int) v->origin)
+        {
+          hash_delete_at (&set->table, var_slot);
+          free_variable_name_and_value (v);
+          free (v);
+          if (set == &global_variable_set)
+            ++variable_changenum;
+        }
+    }
+}
+
+/* If the variable passed in is "special", handle its special nature.
+   Currently there are two such variables, both used for introspection:
+   .VARIABLES expands to a list of all the variables defined in this instance
+   of make.
+   .TARGETS expands to a list of all the targets defined in this
+   instance of make.
+   Returns the variable reference passed in.  */
+
+#define EXPANSION_INCREMENT(_l)  ((((_l) / 500) + 1) * 500)
+
+static struct variable *
+lookup_special_var (struct variable *var)
+{
+  static unsigned long last_changenum = 0;
+
+
+  /* This one actually turns out to be very hard, due to the way the parser
+     records targets.  The way it works is that target information is collected
+     internally until make knows the target is completely specified.  It unitl
+     it sees that some new construct (a new target or variable) is defined that
+     it knows the previous one is done.  In short, this means that if you do
+     this:
+
+       all:
+
+       TARGS := $(.TARGETS)
+
+     then $(TARGS) won't contain "all", because it's not until after the
+     variable is created that the previous target is completed.
+
+     Changing this would be a major pain.  I think a less complex way to do it
+     would be to pre-define the target files as soon as the first line is
+     parsed, then come back and do the rest of the definition as now.  That
+     would allow $(.TARGETS) to be correct without a major change to the way
+     the parser works.
+
+  if (streq (var->name, ".TARGETS"))
+    var->value = build_target_list (var->value);
+  else
+  */
+
+  if (variable_changenum != last_changenum && streq (var->name, ".VARIABLES"))
+    {
+      size_t max = EXPANSION_INCREMENT (strlen (var->value));
+      size_t len;
+      char *p;
+      struct variable **vp = (struct variable **) global_variable_set.table.ht_vec;
+      struct variable **end = &vp[global_variable_set.table.ht_size];
+
+      /* Make sure we have at least MAX bytes in the allocated buffer.  */
+      var->value = xrealloc (var->value, max);
+
+      /* Walk through the hash of variables, constructing a list of names.  */
+      p = var->value;
+      len = 0;
+      for (; vp < end; ++vp)
+        if (!HASH_VACANT (*vp))
+          {
+            struct variable *v = *vp;
+            int l = v->length;
+
+            len += l + 1;
+            if (len > max)
+              {
+                size_t off = p - var->value;
+
+                max += EXPANSION_INCREMENT (l + 1);
+                var->value = xrealloc (var->value, max);
+                p = &var->value[off];
+              }
+
+            memcpy (p, v->name, l);
+            p += l;
+            *(p++) = ' ';
+          }
+      *(p-1) = '\0';
+
+      /* Remember the current variable change number.  */
+      last_changenum = variable_changenum;
+    }
+
+  return var;
+}
+
+\f
+/* Lookup a variable whose name is a string starting at NAME
+   and with LENGTH chars.  NAME need not be null-terminated.
+   Returns address of the 'struct variable' containing all info
+   on the variable, or nil if no such variable is defined.  */
+
+struct variable *
+lookup_variable (const char *name, size_t length)
+{
+  const struct variable_set_list *setlist;
+  struct variable var_key;
+  int is_parent = 0;
+
+  var_key.name = (char *) name;
+  var_key.length = (unsigned int) length;
+
+  for (setlist = current_variable_set_list;
+       setlist != 0; setlist = setlist->next)
+    {
+      const struct variable_set *set = setlist->set;
+      struct variable *v;
+
+      v = (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
+      if (v && (!is_parent || !v->private_var))
+        return v->special ? lookup_special_var (v) : v;
+
+      is_parent |= setlist->next_is_parent;
+    }
+
+#ifdef VMS
+  /* VMS does not populate envp[] with DCL symbols and logical names which
+     historically are mapped to enviroment varables and returned by getenv() */
+  {
+    char *vname = alloca (length + 1);
+    char *value;
+    strncpy (vname, name, length);
+    vname[length] = 0;
+    value = getenv (vname);
+    if (value != 0)
+      {
+        char *sptr;
+        int scnt;
+
+        sptr = value;
+        scnt = 0;
+
+        while ((sptr = strchr (sptr, '$')))
+          {
+            scnt++;
+            sptr++;
+          }
+
+        if (scnt > 0)
+          {
+            char *nvalue;
+            char *nptr;
+
+            nvalue = alloca (strlen (value) + scnt + 1);
+            sptr = value;
+            nptr = nvalue;
+
+            while (*sptr)
+              {
+                if (*sptr == '$')
+                  {
+                    *nptr++ = '$';
+                    *nptr++ = '$';
+                  }
+                else
+                  {
+                    *nptr++ = *sptr;
+                  }
+                sptr++;
+              }
+
+            *nptr = '\0';
+            return define_variable (vname, length, nvalue, o_env, 1);
+
+          }
+
+        return define_variable (vname, length, value, o_env, 1);
+      }
+  }
+#endif /* VMS */
+
+  return 0;
+}
+\f
+/* Lookup a variable whose name is a string starting at NAME
+   and with LENGTH chars in set SET.  NAME need not be null-terminated.
+   Returns address of the 'struct variable' containing all info
+   on the variable, or nil if no such variable is defined.  */
+
+struct variable *
+lookup_variable_in_set (const char *name, size_t length,
+                        const struct variable_set *set)
+{
+  struct variable var_key;
+
+  var_key.name = (char *) name;
+  var_key.length = (unsigned int) length;
+
+  return (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
+}
+\f
+/* Initialize FILE's variable set list.  If FILE already has a variable set
+   list, the topmost variable set is left intact, but the the rest of the
+   chain is replaced with FILE->parent's setlist.  If FILE is a double-colon
+   rule, then we will use the "root" double-colon target's variable set as the
+   parent of FILE's variable set.
+
+   If we're READING a makefile, don't do the pattern variable search now,
+   since the pattern variable might not have been defined yet.  */
+
+void
+initialize_file_variables (struct file *file, int reading)
+{
+  struct variable_set_list *l = file->variables;
+
+  if (l == 0)
+    {
+      l = (struct variable_set_list *)
+        xmalloc (sizeof (struct variable_set_list));
+      l->set = xmalloc (sizeof (struct variable_set));
+      hash_init (&l->set->table, PERFILE_VARIABLE_BUCKETS,
+                 variable_hash_1, variable_hash_2, variable_hash_cmp);
+      file->variables = l;
+    }
+
+  /* If this is a double-colon, then our "parent" is the "root" target for
+     this double-colon rule.  Since that rule has the same name, parent,
+     etc. we can just use its variables as the "next" for ours.  */
+
+  if (file->double_colon && file->double_colon != file)
+    {
+      initialize_file_variables (file->double_colon, reading);
+      l->next = file->double_colon->variables;
+      l->next_is_parent = 0;
+      return;
+    }
+
+  if (file->parent == 0)
+    l->next = &global_setlist;
+  else
+    {
+      initialize_file_variables (file->parent, reading);
+      l->next = file->parent->variables;
+    }
+  l->next_is_parent = 1;
+
+  /* If we're not reading makefiles and we haven't looked yet, see if
+     we can find pattern variables for this target.  */
+
+  if (!reading && !file->pat_searched)
+    {
+      struct pattern_var *p;
+
+      p = lookup_pattern_var (0, file->name);
+      if (p != 0)
+        {
+          struct variable_set_list *global = current_variable_set_list;
+
+          /* We found at least one.  Set up a new variable set to accumulate
+             all the pattern variables that match this target.  */
+
+          file->pat_variables = create_new_variable_set ();
+          current_variable_set_list = file->pat_variables;
+
+          do
+            {
+              /* We found one, so insert it into the set.  */
+
+              struct variable *v;
+
+              if (p->variable.flavor == f_simple)
+                {
+                  v = define_variable_loc (
+                    p->variable.name, strlen (p->variable.name),
+                    p->variable.value, p->variable.origin,
+                    0, &p->variable.fileinfo);
+
+                  v->flavor = f_simple;
+                }
+              else
+                {
+                  v = do_variable_definition (
+                    &p->variable.fileinfo, p->variable.name,
+                    p->variable.value, p->variable.origin,
+                    p->variable.flavor, 1);
+                }
+
+              /* Also mark it as a per-target and copy export status. */
+              v->per_target = p->variable.per_target;
+              v->export = p->variable.export;
+              v->private_var = p->variable.private_var;
+            }
+          while ((p = lookup_pattern_var (p, file->name)) != 0);
+
+          current_variable_set_list = global;
+        }
+      file->pat_searched = 1;
+    }
+
+  /* If we have a pattern variable match, set it up.  */
+
+  if (file->pat_variables != 0)
+    {
+      file->pat_variables->next = l->next;
+      file->pat_variables->next_is_parent = l->next_is_parent;
+      l->next = file->pat_variables;
+      l->next_is_parent = 0;
+    }
+}
+\f
+/* Pop the top set off the current variable set list,
+   and free all its storage.  */
+
+struct variable_set_list *
+create_new_variable_set (void)
+{
+  struct variable_set_list *setlist;
+  struct variable_set *set;
+
+  set = xmalloc (sizeof (struct variable_set));
+  hash_init (&set->table, SMALL_SCOPE_VARIABLE_BUCKETS,
+             variable_hash_1, variable_hash_2, variable_hash_cmp);
+
+  setlist = (struct variable_set_list *)
+    xmalloc (sizeof (struct variable_set_list));
+  setlist->set = set;
+  setlist->next = current_variable_set_list;
+  setlist->next_is_parent = 0;
+
+  return setlist;
+}
+
+/* Create a new variable set and push it on the current setlist.
+   If we're pushing a global scope (that is, the current scope is the global
+   scope) then we need to "push" it the other way: file variable sets point
+   directly to the global_setlist so we need to replace that with the new one.
+ */
+
+struct variable_set_list *
+push_new_variable_scope (void)
+{
+  current_variable_set_list = create_new_variable_set ();
+  if (current_variable_set_list->next == &global_setlist)
+    {
+      /* It was the global, so instead of new -> &global we want to replace
+         &global with the new one and have &global -> new, with current still
+         pointing to &global  */
+      struct variable_set *set = current_variable_set_list->set;
+      current_variable_set_list->set = global_setlist.set;
+      global_setlist.set = set;
+      current_variable_set_list->next = global_setlist.next;
+      global_setlist.next = current_variable_set_list;
+      current_variable_set_list = &global_setlist;
+    }
+  return (current_variable_set_list);
+}
+
+void
+pop_variable_scope (void)
+{
+  struct variable_set_list *setlist;
+  struct variable_set *set;
+
+  /* Can't call this if there's no scope to pop!  */
+  assert (current_variable_set_list->next != NULL);
+
+  if (current_variable_set_list != &global_setlist)
+    {
+      /* We're not pointing to the global setlist, so pop this one.  */
+      setlist = current_variable_set_list;
+      set = setlist->set;
+      current_variable_set_list = setlist->next;
+    }
+  else
+    {
+      /* This set is the one in the global_setlist, but there is another global
+         set beyond that.  We want to copy that set to global_setlist, then
+         delete what used to be in global_setlist.  */
+      setlist = global_setlist.next;
+      set = global_setlist.set;
+      global_setlist.set = setlist->set;
+      global_setlist.next = setlist->next;
+      global_setlist.next_is_parent = setlist->next_is_parent;
+    }
+
+  /* Free the one we no longer need.  */
+  free (setlist);
+  hash_map (&set->table, free_variable_name_and_value);
+  hash_free (&set->table, 1);
+  free (set);
+}
+\f
+/* Merge FROM_SET into TO_SET, freeing unused storage in FROM_SET.  */
+
+static void
+merge_variable_sets (struct variable_set *to_set,
+                     struct variable_set *from_set)
+{
+  struct variable **from_var_slot = (struct variable **) from_set->table.ht_vec;
+  struct variable **from_var_end = from_var_slot + from_set->table.ht_size;
+
+  int inc = to_set == &global_variable_set ? 1 : 0;
+
+  for ( ; from_var_slot < from_var_end; from_var_slot++)
+    if (! HASH_VACANT (*from_var_slot))
+      {
+        struct variable *from_var = *from_var_slot;
+        struct variable **to_var_slot
+          = (struct variable **) hash_find_slot (&to_set->table, *from_var_slot);
+        if (HASH_VACANT (*to_var_slot))
+          {
+            hash_insert_at (&to_set->table, from_var, to_var_slot);
+            variable_changenum += inc;
+          }
+        else
+          {
+            /* GKM FIXME: delete in from_set->table */
+            free (from_var->value);
+            free (from_var);
+          }
+      }
+}
+
+/* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1.  */
+
+void
+merge_variable_set_lists (struct variable_set_list **setlist0,
+                          struct variable_set_list *setlist1)
+{
+  struct variable_set_list *to = *setlist0;
+  struct variable_set_list *last0 = 0;
+
+  /* If there's nothing to merge, stop now.  */
+  if (!setlist1 || setlist1 == &global_setlist)
+    return;
+
+  if (to)
+    {
+      /* These loops rely on the fact that all setlists terminate with the
+         global setlist (before NULL).  If not, arguably we SHOULD die.  */
+
+      /* Make sure that setlist1 is not already a subset of setlist0.  */
+      while (to != &global_setlist)
+        {
+          if (to == setlist1)
+            return;
+          to = to->next;
+        }
+
+      to = *setlist0;
+      while (setlist1 != &global_setlist && to != &global_setlist)
+        {
+          struct variable_set_list *from = setlist1;
+          setlist1 = setlist1->next;
+
+          merge_variable_sets (to->set, from->set);
+
+          last0 = to;
+          to = to->next;
+        }
+    }
+
+  if (setlist1 != &global_setlist)
+    {
+      if (last0 == 0)
+        *setlist0 = setlist1;
+      else
+        last0->next = setlist1;
+    }
+}
+\f
+/* Define the automatic variables, and record the addresses
+   of their structures so we can change their values quickly.  */
+
+void
+define_automatic_variables (void)
+{
+  struct variable *v;
+  char buf[200];
+
+  sprintf (buf, "%u", makelevel);
+  define_variable_cname (MAKELEVEL_NAME, buf, o_env, 0);
+
+  sprintf (buf, "%s%s%s",
+           version_string,
+           (remote_description == 0 || remote_description[0] == '\0')
+           ? "" : "-",
+           (remote_description == 0 || remote_description[0] == '\0')
+           ? "" : remote_description);
+  define_variable_cname ("MAKE_VERSION", buf, o_default, 0);
+  define_variable_cname ("MAKE_HOST", make_host, o_default, 0);
+
+#ifdef  __MSDOS__
+  /* Allow to specify a special shell just for Make,
+     and use $COMSPEC as the default $SHELL when appropriate.  */
+  {
+    static char shell_str[] = "SHELL";
+    const int shlen = sizeof (shell_str) - 1;
+    struct variable *mshp = lookup_variable ("MAKESHELL", 9);
+    struct variable *comp = lookup_variable ("COMSPEC", 7);
+
+    /* $(MAKESHELL) overrides $(SHELL) even if -e is in effect.  */
+    if (mshp)
+      (void) define_variable (shell_str, shlen,
+                              mshp->value, o_env_override, 0);
+    else if (comp)
+      {
+        /* $(COMSPEC) shouldn't override $(SHELL).  */
+        struct variable *shp = lookup_variable (shell_str, shlen);
+
+        if (!shp)
+          (void) define_variable (shell_str, shlen, comp->value, o_env, 0);
+      }
+  }
+#elif defined(__EMX__)
+  {
+    static char shell_str[] = "SHELL";
+    const int shlen = sizeof (shell_str) - 1;
+    struct variable *shell = lookup_variable (shell_str, shlen);
+    struct variable *replace = lookup_variable ("MAKESHELL", 9);
+
+    /* if $MAKESHELL is defined in the environment assume o_env_override */
+    if (replace && *replace->value && replace->origin == o_env)
+      replace->origin = o_env_override;
+
+    /* if $MAKESHELL is not defined use $SHELL but only if the variable
+       did not come from the environment */
+    if (!replace || !*replace->value)
+      if (shell && *shell->value && (shell->origin == o_env
+          || shell->origin == o_env_override))
+        {
+          /* overwrite whatever we got from the environment */
+          free (shell->value);
+          shell->value = xstrdup (default_shell);
+          shell->origin = o_default;
+        }
+
+    /* Some people do not like cmd to be used as the default
+       if $SHELL is not defined in the Makefile.
+       With -DNO_CMD_DEFAULT you can turn off this behaviour */
+# ifndef NO_CMD_DEFAULT
+    /* otherwise use $COMSPEC */
+    if (!replace || !*replace->value)
+      replace = lookup_variable ("COMSPEC", 7);
+
+    /* otherwise use $OS2_SHELL */
+    if (!replace || !*replace->value)
+      replace = lookup_variable ("OS2_SHELL", 9);
+# else
+#   warning NO_CMD_DEFAULT: GNU make will not use CMD.EXE as default shell
+# endif
+
+    if (replace && *replace->value)
+      /* overwrite $SHELL */
+      (void) define_variable (shell_str, shlen, replace->value,
+                              replace->origin, 0);
+    else
+      /* provide a definition if there is none */
+      (void) define_variable (shell_str, shlen, default_shell,
+                              o_default, 0);
+  }
+
+#endif
+
+  /* This won't override any definition, but it will provide one if there
+     isn't one there.  */
+  v = define_variable_cname ("SHELL", default_shell, o_default, 0);
+#ifdef __MSDOS__
+  v->export = v_export;  /*  Export always SHELL.  */
+#endif
+
+  /* On MSDOS we do use SHELL from environment, since it isn't a standard
+     environment variable on MSDOS, so whoever sets it, does that on purpose.
+     On OS/2 we do not use SHELL from environment but we have already handled
+     that problem above. */
+#if !defined(__MSDOS__) && !defined(__EMX__)
+  /* Don't let SHELL come from the environment.  */
+  if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override)
+    {
+      free (v->value);
+      v->origin = o_file;
+      v->value = xstrdup (default_shell);
+    }
+#endif
+
+  /* Make sure MAKEFILES gets exported if it is set.  */
+  v = define_variable_cname ("MAKEFILES", "", o_default, 0);
+  v->export = v_ifset;
+
+  /* Define the magic D and F variables in terms of
+     the automatic variables they are variations of.  */
+
+#if defined(__MSDOS__) || defined(WINDOWS32)
+  /* For consistency, remove the trailing backslash as well as slash.  */
+  define_variable_cname ("@D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $@)))",
+                         o_automatic, 1);
+  define_variable_cname ("%D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $%)))",
+                         o_automatic, 1);
+  define_variable_cname ("*D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $*)))",
+                         o_automatic, 1);
+  define_variable_cname ("<D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $<)))",
+                         o_automatic, 1);
+  define_variable_cname ("?D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $?)))",
+                         o_automatic, 1);
+  define_variable_cname ("^D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $^)))",
+                         o_automatic, 1);
+  define_variable_cname ("+D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $+)))",
+                         o_automatic, 1);
+#else  /* not __MSDOS__, not WINDOWS32 */
+  define_variable_cname ("@D", "$(patsubst %/,%,$(dir $@))", o_automatic, 1);
+  define_variable_cname ("%D", "$(patsubst %/,%,$(dir $%))", o_automatic, 1);
+  define_variable_cname ("*D", "$(patsubst %/,%,$(dir $*))", o_automatic, 1);
+  define_variable_cname ("<D", "$(patsubst %/,%,$(dir $<))", o_automatic, 1);
+  define_variable_cname ("?D", "$(patsubst %/,%,$(dir $?))", o_automatic, 1);
+  define_variable_cname ("^D", "$(patsubst %/,%,$(dir $^))", o_automatic, 1);
+  define_variable_cname ("+D", "$(patsubst %/,%,$(dir $+))", o_automatic, 1);
+#endif
+  define_variable_cname ("@F", "$(notdir $@)", o_automatic, 1);
+  define_variable_cname ("%F", "$(notdir $%)", o_automatic, 1);
+  define_variable_cname ("*F", "$(notdir $*)", o_automatic, 1);
+  define_variable_cname ("<F", "$(notdir $<)", o_automatic, 1);
+  define_variable_cname ("?F", "$(notdir $?)", o_automatic, 1);
+  define_variable_cname ("^F", "$(notdir $^)", o_automatic, 1);
+  define_variable_cname ("+F", "$(notdir $+)", o_automatic, 1);
+}
+\f
+int export_all_variables;
+
+/* Create a new environment for FILE's commands.
+   If FILE is nil, this is for the 'shell' function.
+   The child's MAKELEVEL variable is incremented.  */
+
+char **
+target_environment (struct file *file)
+{
+  struct variable_set_list *set_list;
+  struct variable_set_list *s;
+  struct hash_table table;
+  struct variable **v_slot;
+  struct variable **v_end;
+  struct variable makelevel_key;
+  char **result_0;
+  char **result;
+
+  if (file == 0)
+    set_list = current_variable_set_list;
+  else
+    set_list = file->variables;
+
+  hash_init (&table, VARIABLE_BUCKETS,
+             variable_hash_1, variable_hash_2, variable_hash_cmp);
+
+  /* Run through all the variable sets in the list,
+     accumulating variables in TABLE.  */
+  for (s = set_list; s != 0; s = s->next)
+    {
+      struct variable_set *set = s->set;
+      v_slot = (struct variable **) set->table.ht_vec;
+      v_end = v_slot + set->table.ht_size;
+      for ( ; v_slot < v_end; v_slot++)
+        if (! HASH_VACANT (*v_slot))
+          {
+            struct variable **new_slot;
+            struct variable *v = *v_slot;
+
+            /* If this is a per-target variable and it hasn't been touched
+               already then look up the global version and take its export
+               value.  */
+            if (v->per_target && v->export == v_default)
+              {
+                struct variable *gv;
+
+                gv = lookup_variable_in_set (v->name, strlen (v->name),
+                                             &global_variable_set);
+                if (gv)
+                  v->export = gv->export;
+              }
+
+            switch (v->export)
+              {
+              case v_default:
+                if (v->origin == o_default || v->origin == o_automatic)
+                  /* Only export default variables by explicit request.  */
+                  continue;
+
+                /* The variable doesn't have a name that can be exported.  */
+                if (! v->exportable)
+                  continue;
+
+                if (! export_all_variables
+                    && v->origin != o_command
+                    && v->origin != o_env && v->origin != o_env_override)
+                  continue;
+                break;
+
+              case v_export:
+                break;
+
+              case v_noexport:
+                {
+                  /* If this is the SHELL variable and it's not exported,
+                     then add the value from our original environment, if
+                     the original environment defined a value for SHELL.  */
+                  if (streq (v->name, "SHELL") && shell_var.value)
+                    {
+                      v = &shell_var;
+                      break;
+                    }
+                  continue;
+                }
+
+              case v_ifset:
+                if (v->origin == o_default)
+                  continue;
+                break;
+              }
+
+            new_slot = (struct variable **) hash_find_slot (&table, v);
+            if (HASH_VACANT (*new_slot))
+              hash_insert_at (&table, v, new_slot);
+          }
+    }
+
+  makelevel_key.name = (char *)MAKELEVEL_NAME;
+  makelevel_key.length = MAKELEVEL_LENGTH;
+  hash_delete (&table, &makelevel_key);
+
+  result = result_0 = xmalloc ((table.ht_fill + 2) * sizeof (char *));
+
+  v_slot = (struct variable **) table.ht_vec;
+  v_end = v_slot + table.ht_size;
+  for ( ; v_slot < v_end; v_slot++)
+    if (! HASH_VACANT (*v_slot))
+      {
+        struct variable *v = *v_slot;
+
+        /* If V is recursively expanded and didn't come from the environment,
+           expand its value.  If it came from the environment, it should
+           go back into the environment unchanged.  */
+        if (v->recursive
+            && v->origin != o_env && v->origin != o_env_override)
+          {
+            char *value = recursively_expand_for_file (v, file);
+#ifdef WINDOWS32
+            if (strcmp (v->name, "Path") == 0 ||
+                strcmp (v->name, "PATH") == 0)
+              convert_Path_to_windows32 (value, ';');
+#endif
+            *result++ = xstrdup (concat (3, v->name, "=", value));
+            free (value);
+          }
+        else
+          {
+#ifdef WINDOWS32
+            if (strcmp (v->name, "Path") == 0 ||
+                strcmp (v->name, "PATH") == 0)
+              convert_Path_to_windows32 (v->value, ';');
+#endif
+            *result++ = xstrdup (concat (3, v->name, "=", v->value));
+          }
+      }
+
+  *result = xmalloc (100);
+  sprintf (*result, "%s=%u", MAKELEVEL_NAME, makelevel + 1);
+  *++result = 0;
+
+  hash_free (&table, 0);
+
+  return result_0;
+}
+\f
+static struct variable *
+set_special_var (struct variable *var)
+{
+  if (streq (var->name, RECIPEPREFIX_NAME))
+    {
+      /* The user is resetting the command introduction prefix.  This has to
+         happen immediately, so that subsequent rules are interpreted
+         properly.  */
+      cmd_prefix = var->value[0]=='\0' ? RECIPEPREFIX_DEFAULT : var->value[0];
+    }
+
+  return var;
+}
+\f
+/* Given a string, shell-execute it and return a malloc'ed string of the
+ * result. This removes only ONE newline (if any) at the end, for maximum
+ * compatibility with the *BSD makes.  If it fails, returns NULL. */
+
+static char *
+shell_result (const char *p)
+{
+  char *buf;
+  size_t len;
+  char *args[2];
+  char *result;
+
+  install_variable_buffer (&buf, &len);
+
+  args[0] = (char *) p;
+  args[1] = NULL;
+  variable_buffer_output (func_shell_base (variable_buffer, args, 0), "\0", 1);
+  result = strdup (variable_buffer);
+
+  restore_variable_buffer (buf, len);
+  return result;
+}
+\f
+/* Given a variable, a value, and a flavor, define the variable.
+   See the try_variable_definition() function for details on the parameters. */
+
+struct variable *
+do_variable_definition (const floc *flocp, const char *varname,
+                        const char *value, enum variable_origin origin,
+                        enum variable_flavor flavor, int target_var)
+{
+  const char *p;
+  char *alloc_value = NULL;
+  struct variable *v;
+  int append = 0;
+  int conditional = 0;
+
+  /* Calculate the variable's new value in VALUE.  */
+
+  switch (flavor)
+    {
+    default:
+    case f_bogus:
+      /* Should not be possible.  */
+      abort ();
+    case f_simple:
+      /* A simple variable definition "var := value".  Expand the value.
+         We have to allocate memory since otherwise it'll clobber the
+         variable buffer, and we may still need that if we're looking at a
+         target-specific variable.  */
+      p = alloc_value = allocated_variable_expand (value);
+      break;
+    case f_shell:
+      {
+        /* A shell definition "var != value".  Expand value, pass it to
+           the shell, and store the result in recursively-expanded var. */
+        char *q = allocated_variable_expand (value);
+        p = alloc_value = shell_result (q);
+        free (q);
+        flavor = f_recursive;
+        break;
+      }
+    case f_conditional:
+      /* A conditional variable definition "var ?= value".
+         The value is set IFF the variable is not defined yet. */
+      v = lookup_variable (varname, strlen (varname));
+      if (v)
+        goto done;
+
+      conditional = 1;
+      flavor = f_recursive;
+      /* FALLTHROUGH */
+    case f_recursive:
+      /* A recursive variable definition "var = value".
+         The value is used verbatim.  */
+      p = value;
+      break;
+    case f_append:
+    case f_append_value:
+      {
+        /* If we have += but we're in a target variable context, we want to
+           append only with other variables in the context of this target.  */
+        if (target_var)
+          {
+            append = 1;
+            v = lookup_variable_in_set (varname, strlen (varname),
+                                        current_variable_set_list->set);
+
+            /* Don't append from the global set if a previous non-appending
+               target-specific variable definition exists. */
+            if (v && !v->append)
+              append = 0;
+          }
+        else
+          v = lookup_variable (varname, strlen (varname));
+
+        if (v == 0)
+          {
+            /* There was no old value.
+               This becomes a normal recursive definition.  */
+            p = value;
+            flavor = f_recursive;
+          }
+        else
+          {
+            /* Paste the old and new values together in VALUE.  */
+
+            size_t oldlen, vallen;
+            const char *val;
+            char *tp = NULL;
+
+            val = value;
+            if (v->recursive)
+              /* The previous definition of the variable was recursive.
+                 The new value is the unexpanded old and new values.  */
+              flavor = f_recursive;
+            else if (flavor != f_append_value)
+              /* The previous definition of the variable was simple.
+                 The new value comes from the old value, which was expanded
+                 when it was set; and from the expanded new value.  Allocate
+                 memory for the expansion as we may still need the rest of the
+                 buffer if we're looking at a target-specific variable.  */
+              val = tp = allocated_variable_expand (val);
+
+            /* If the new value is empty, nothing to do.  */
+            vallen = strlen (val);
+            if (!vallen)
+              {
+                alloc_value = tp;
+                goto done;
+              }
+
+            oldlen = strlen (v->value);
+            p = alloc_value = xmalloc (oldlen + 1 + vallen + 1);
+
+            if (oldlen)
+              {
+                memcpy (alloc_value, v->value, oldlen);
+                alloc_value[oldlen] = ' ';
+                ++oldlen;
+              }
+
+            memcpy (&alloc_value[oldlen], val, vallen + 1);
+
+            free (tp);
+          }
+        break;
+      }
+    }
+
+#ifdef __MSDOS__
+  /* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but
+     non-Unix systems don't conform to this default configuration (in
+     fact, most of them don't even have '/bin').  On the other hand,
+     $SHELL in the environment, if set, points to the real pathname of
+     the shell.
+     Therefore, we generally won't let lines like "SHELL=/bin/sh" from
+     the Makefile override $SHELL from the environment.  But first, we
+     look for the basename of the shell in the directory where SHELL=
+     points, and along the $PATH; if it is found in any of these places,
+     we define $SHELL to be the actual pathname of the shell.  Thus, if
+     you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on
+     your $PATH, then SHELL=/usr/local/bin/bash will have the effect of
+     defining SHELL to be "d:/unix/bash.exe".  */
+  if ((origin == o_file || origin == o_override)
+      && strcmp (varname, "SHELL") == 0)
+    {
+      PATH_VAR (shellpath);
+      extern char * __dosexec_find_on_path (const char *, char *[], char *);
+
+      /* See if we can find "/bin/sh.exe", "/bin/sh.com", etc.  */
+      if (__dosexec_find_on_path (p, NULL, shellpath))
+        {
+          char *tp;
+
+          for (tp = shellpath; *tp; tp++)
+            if (*tp == '\\')
+              *tp = '/';
+
+          v = define_variable_loc (varname, strlen (varname),
+                                   shellpath, origin, flavor == f_recursive,
+                                   flocp);
+        }
+      else
+        {
+          const char *shellbase, *bslash;
+          struct variable *pathv = lookup_variable ("PATH", 4);
+          char *path_string;
+          char *fake_env[2];
+          size_t pathlen = 0;
+
+          shellbase = strrchr (p, '/');
+          bslash = strrchr (p, '\\');
+          if (!shellbase || bslash > shellbase)
+            shellbase = bslash;
+          if (!shellbase && p[1] == ':')
+            shellbase = p + 1;
+          if (shellbase)
+            shellbase++;
+          else
+            shellbase = p;
+
+          /* Search for the basename of the shell (with standard
+             executable extensions) along the $PATH.  */
+          if (pathv)
+            pathlen = strlen (pathv->value);
+          path_string = xmalloc (5 + pathlen + 2 + 1);
+          /* On MSDOS, current directory is considered as part of $PATH.  */
+          sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : "");
+          fake_env[0] = path_string;
+          fake_env[1] = 0;
+          if (__dosexec_find_on_path (shellbase, fake_env, shellpath))
+            {
+              char *tp;
+
+              for (tp = shellpath; *tp; tp++)
+                if (*tp == '\\')
+                  *tp = '/';
+
+              v = define_variable_loc (varname, strlen (varname),
+                                       shellpath, origin,
+                                       flavor == f_recursive, flocp);
+            }
+          else
+            v = lookup_variable (varname, strlen (varname));
+
+          free (path_string);
+        }
+    }
+  else
+#endif /* __MSDOS__ */
+#ifdef WINDOWS32
+  if ((origin == o_file || origin == o_override || origin == o_command)
+      && streq (varname, "SHELL"))
+    {
+      extern const char *default_shell;
+
+      /* Call shell locator function. If it returns TRUE, then
+         set no_default_sh_exe to indicate sh was found and
+         set new value for SHELL variable.  */
+
+      if (find_and_set_default_shell (p))
+        {
+          v = define_variable_in_set (varname, strlen (varname), default_shell,
+                                      origin, flavor == f_recursive,
+                                      (target_var
+                                       ? current_variable_set_list->set
+                                       : NULL),
+                                      flocp);
+          no_default_sh_exe = 0;
+        }
+      else
+        {
+          char *tp = alloc_value;
+
+          alloc_value = allocated_variable_expand (p);
+
+          if (find_and_set_default_shell (alloc_value))
+            {
+              v = define_variable_in_set (varname, strlen (varname), p,
+                                          origin, flavor == f_recursive,
+                                          (target_var
+                                           ? current_variable_set_list->set
+                                           : NULL),
+                                          flocp);
+              no_default_sh_exe = 0;
+            }
+          else
+            v = lookup_variable (varname, strlen (varname));
+
+          free (tp);
+        }
+    }
+  else
+    v = NULL;
+
+  /* If not $SHELL, or if $SHELL points to a program we didn't find,
+     just process this variable "as usual".  */
+  if (!v)
+#endif
+
+  /* If we are defining variables inside an $(eval ...), we might have a
+     different variable context pushed, not the global context (maybe we're
+     inside a $(call ...) or something.  Since this function is only ever
+     invoked in places where we want to define globally visible variables,
+     make sure we define this variable in the global set.  */
+
+  v = define_variable_in_set (varname, strlen (varname), p,
+                              origin, flavor == f_recursive,
+                              (target_var
+                               ? current_variable_set_list->set : NULL),
+                              flocp);
+  v->append = append;
+  v->conditional = conditional;
+
+ done:
+  free (alloc_value);
+  return v->special ? set_special_var (v) : v;
+}
+\f
+/* Parse P (a null-terminated string) as a variable definition.
+
+   If it is not a variable definition, return NULL and the contents of *VAR
+   are undefined, except NAME is set to the first non-space character or NIL.
+
+   If it is a variable definition, return a pointer to the char after the
+   assignment token and set the following fields (only) of *VAR:
+    name   : name of the variable (ALWAYS SET) (NOT NUL-TERMINATED!)
+    length : length of the variable name
+    value  : value of the variable (nul-terminated)
+    flavor : flavor of the variable
+   Other values in *VAR are unchanged.
+  */
+
+char *
+parse_variable_definition (const char *p, struct variable *var)
+{
+  int wspace = 0;
+  const char *e = NULL;
+
+  NEXT_TOKEN (p);
+  var->name = (char *)p;
+  var->length = 0;
+
+  while (1)
+    {
+      int c = *p++;
+
+      /* If we find a comment or EOS, it's not a variable definition.  */
+      if (STOP_SET (c, MAP_COMMENT|MAP_NUL))
+        return NULL;
+
+      if (c == '$')
+        {
+          /* This begins a variable expansion reference.  Make sure we don't
+             treat chars inside the reference as assignment tokens.  */
+          char closeparen;
+          unsigned int count;
+
+          c = *p++;
+          if (c == '(')
+            closeparen = ')';
+          else if (c == '{')
+            closeparen = '}';
+          else if (c == '\0')
+            return NULL;
+          else
+            /* '$$' or '$X'.  Either way, nothing special to do here.  */
+            continue;
+
+          /* P now points past the opening paren or brace.
+             Count parens or braces until it is matched.  */
+          for (count = 1; *p != '\0'; ++p)
+            {
+              if (*p == closeparen && --count == 0)
+                {
+                  ++p;
+                  break;
+                }
+              if (*p == c)
+                ++count;
+            }
+          continue;
+        }
+
+      /* If we find whitespace skip it, and remember we found it.  */
+      if (ISBLANK (c))
+        {
+          wspace = 1;
+          e = p - 1;
+          NEXT_TOKEN (p);
+          c = *p;
+          if (c == '\0')
+            return NULL;
+          ++p;
+        }
+
+
+      if (c == '=')
+        {
+          var->flavor = f_recursive;
+          if (! e)
+            e = p - 1;
+          break;
+        }
+
+      /* Match assignment variants (:=, +=, ?=, !=)  */
+      if (*p == '=')
+        {
+          switch (c)
+            {
+              case ':':
+                var->flavor = f_simple;
+                break;
+              case '+':
+                var->flavor = f_append;
+                break;
+              case '?':
+                var->flavor = f_conditional;
+                break;
+              case '!':
+                var->flavor = f_shell;
+                break;
+              default:
+                /* If we skipped whitespace, non-assignments means no var.  */
+                if (wspace)
+                  return NULL;
+
+                /* Might be assignment, or might be $= or #=.  Check.  */
+                continue;
+            }
+          if (! e)
+            e = p - 1;
+          ++p;
+          break;
+        }
+
+      /* Check for POSIX ::= syntax  */
+      if (c == ':')
+        {
+          /* A colon other than :=/::= is not a variable defn.  */
+          if (*p != ':' || p[1] != '=')
+            return NULL;
+
+          /* POSIX allows ::= to be the same as GNU make's := */
+          var->flavor = f_simple;
+          if (! e)
+            e = p - 1;
+          p += 2;
+          break;
+        }
+
+      /* If we skipped whitespace, non-assignments means no var.  */
+      if (wspace)
+        return NULL;
+    }
+
+  var->length = (unsigned int) (e - var->name);
+  var->value = next_token (p);
+  return (char *)p;
+}
+\f
+/* Try to interpret LINE (a null-terminated string) as a variable definition.
+
+   If LINE was recognized as a variable definition, a pointer to its 'struct
+   variable' is returned.  If LINE is not a variable definition, NULL is
+   returned.  */
+
+struct variable *
+assign_variable_definition (struct variable *v, const char *line)
+{
+  char *name;
+
+  if (!parse_variable_definition (line, v))
+    return NULL;
+
+  /* Expand the name, so "$(foo)bar = baz" works.  */
+  name = alloca (v->length + 1);
+  memcpy (name, v->name, v->length);
+  name[v->length] = '\0';
+  v->name = allocated_variable_expand (name);
+
+  if (v->name[0] == '\0')
+    O (fatal, &v->fileinfo, _("empty variable name"));
+
+  return v;
+}
+\f
+/* Try to interpret LINE (a null-terminated string) as a variable definition.
+
+   ORIGIN may be o_file, o_override, o_env, o_env_override,
+   or o_command specifying that the variable definition comes
+   from a makefile, an override directive, the environment with
+   or without the -e switch, or the command line.
+
+   See the comments for assign_variable_definition().
+
+   If LINE was recognized as a variable definition, a pointer to its 'struct
+   variable' is returned.  If LINE is not a variable definition, NULL is
+   returned.  */
+
+struct variable *
+try_variable_definition (const floc *flocp, const char *line,
+                         enum variable_origin origin, int target_var)
+{
+  struct variable v;
+  struct variable *vp;
+
+  if (flocp != 0)
+    v.fileinfo = *flocp;
+  else
+    v.fileinfo.filenm = 0;
+
+  if (!assign_variable_definition (&v, line))
+    return 0;
+
+  vp = do_variable_definition (flocp, v.name, v.value,
+                               origin, v.flavor, target_var);
+
+  free (v.name);
+
+  return vp;
+}
+\f
+/* Print information for variable V, prefixing it with PREFIX.  */
+
+static void
+print_variable (const void *item, void *arg)
+{
+  const struct variable *v = item;
+  const char *prefix = arg;
+  const char *origin;
+
+  switch (v->origin)
+    {
+    case o_automatic:
+      origin = _("automatic");
+      break;
+    case o_default:
+      origin = _("default");
+      break;
+    case o_env:
+      origin = _("environment");
+      break;
+    case o_file:
+      origin = _("makefile");
+      break;
+    case o_env_override:
+      origin = _("environment under -e");
+      break;
+    case o_command:
+      origin = _("command line");
+      break;
+    case o_override:
+      origin = _("'override' directive");
+      break;
+    case o_invalid:
+    default:
+      abort ();
+    }
+  fputs ("# ", stdout);
+  fputs (origin, stdout);
+  if (v->private_var)
+    fputs (" private", stdout);
+  if (v->fileinfo.filenm)
+    printf (_(" (from '%s', line %lu)"),
+            v->fileinfo.filenm, v->fileinfo.lineno + v->fileinfo.offset);
+  putchar ('\n');
+  fputs (prefix, stdout);
+
+  /* Is this a 'define'?  */
+  if (v->recursive && strchr (v->value, '\n') != 0)
+    printf ("define %s\n%s\nendef\n", v->name, v->value);
+  else
+    {
+      char *p;
+
+      printf ("%s %s= ", v->name, v->recursive ? v->append ? "+" : "" : ":");
+
+      /* Check if the value is just whitespace.  */
+      p = next_token (v->value);
+      if (p != v->value && *p == '\0')
+        /* All whitespace.  */
+        printf ("$(subst ,,%s)", v->value);
+      else if (v->recursive)
+        fputs (v->value, stdout);
+      else
+        /* Double up dollar signs.  */
+        for (p = v->value; *p != '\0'; ++p)
+          {
+            if (*p == '$')
+              putchar ('$');
+            putchar (*p);
+          }
+      putchar ('\n');
+    }
+}
+
+
+static void
+print_auto_variable (const void *item, void *arg)
+{
+  const struct variable *v = item;
+
+  if (v->origin == o_automatic)
+    print_variable (item, arg);
+}
+
+
+static void
+print_noauto_variable (const void *item, void *arg)
+{
+  const struct variable *v = item;
+
+  if (v->origin != o_automatic)
+    print_variable (item, arg);
+}
+
+
+/* Print all the variables in SET.  PREFIX is printed before
+   the actual variable definitions (everything else is comments).  */
+
+static void
+print_variable_set (struct variable_set *set, const char *prefix, int pauto)
+{
+  hash_map_arg (&set->table, (pauto ? print_auto_variable : print_variable),
+                (void *)prefix);
+
+  fputs (_("# variable set hash-table stats:\n"), stdout);
+  fputs ("# ", stdout);
+  hash_print_stats (&set->table, stdout);
+  putc ('\n', stdout);
+}
+
+/* Print the data base of variables.  */
+
+void
+print_variable_data_base (void)
+{
+  puts (_("\n# Variables\n"));
+
+  print_variable_set (&global_variable_set, "", 0);
+
+  puts (_("\n# Pattern-specific Variable Values"));
+
+  {
+    struct pattern_var *p;
+    unsigned int rules = 0;
+
+    for (p = pattern_vars; p != 0; p = p->next)
+      {
+        ++rules;
+        printf ("\n%s :\n", p->target);
+        print_variable (&p->variable, (void *)"# ");
+      }
+
+    if (rules == 0)
+      puts (_("\n# No pattern-specific variable values."));
+    else
+      printf (_("\n# %u pattern-specific variable values"), rules);
+  }
+}
+
+
+/* Print all the local variables of FILE.  */
+
+void
+print_file_variables (const struct file *file)
+{
+  if (file->variables != 0)
+    print_variable_set (file->variables->set, "# ", 1);
+}
+
+void
+print_target_variables (const struct file *file)
+{
+  if (file->variables != 0)
+    {
+      size_t l = strlen (file->name);
+      char *t = alloca (l + 3);
+
+      strcpy (t, file->name);
+      t[l] = ':';
+      t[l+1] = ' ';
+      t[l+2] = '\0';
+
+      hash_map_arg (&file->variables->set->table, print_noauto_variable, t);
+    }
+}
+
+#ifdef WINDOWS32
+void
+sync_Path_environment (void)
+{
+  char *path = allocated_variable_expand ("$(PATH)");
+  static char *environ_path = NULL;
+
+  if (!path)
+    return;
+
+  /* If done this before, free the previous entry before allocating new one.  */
+  free (environ_path);
+
+  /* Create something WINDOWS32 world can grok.  */
+  convert_Path_to_windows32 (path, ';');
+  environ_path = xstrdup (concat (3, "PATH", "=", path));
+  putenv (environ_path);
+  free (path);
+}
+#endif
diff --git a/src/variable.h b/src/variable.h
new file mode 100644 (file)
index 0000000..e8cba4f
--- /dev/null
@@ -0,0 +1,241 @@
+/* Definitions for using variables in GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "hash.h"
+
+/* Codes in a variable definition saying where the definition came from.
+   Increasing numeric values signify less-overridable definitions.  */
+enum variable_origin
+  {
+    o_default,          /* Variable from the default set.  */
+    o_env,              /* Variable from environment.  */
+    o_file,             /* Variable given in a makefile.  */
+    o_env_override,     /* Variable from environment, if -e.  */
+    o_command,          /* Variable given by user.  */
+    o_override,         /* Variable from an 'override' directive.  */
+    o_automatic,        /* Automatic variable -- cannot be set.  */
+    o_invalid           /* Core dump time.  */
+  };
+
+enum variable_flavor
+  {
+    f_bogus,            /* Bogus (error) */
+    f_simple,           /* Simple definition (:= or ::=) */
+    f_recursive,        /* Recursive definition (=) */
+    f_append,           /* Appending definition (+=) */
+    f_conditional,      /* Conditional definition (?=) */
+    f_shell,            /* Shell assignment (!=) */
+    f_append_value      /* Append unexpanded value */
+  };
+
+/* Structure that represents one variable definition.
+   Each bucket of the hash table is a chain of these,
+   chained through 'next'.  */
+
+#define EXP_COUNT_BITS  15      /* This gets all the bitfields into 32 bits */
+#define EXP_COUNT_MAX   ((1<<EXP_COUNT_BITS)-1)
+
+struct variable
+  {
+    char *name;                 /* Variable name.  */
+    char *value;                /* Variable value.  */
+    floc fileinfo;              /* Where the variable was defined.  */
+    unsigned int length;        /* strlen (name) */
+    unsigned int recursive:1;   /* Gets recursively re-evaluated.  */
+    unsigned int append:1;      /* Nonzero if an appending target-specific
+                                   variable.  */
+    unsigned int conditional:1; /* Nonzero if set with a ?=. */
+    unsigned int per_target:1;  /* Nonzero if a target-specific variable.  */
+    unsigned int special:1;     /* Nonzero if this is a special variable.  */
+    unsigned int exportable:1;  /* Nonzero if the variable _could_ be
+                                   exported.  */
+    unsigned int expanding:1;   /* Nonzero if currently being expanded.  */
+    unsigned int private_var:1; /* Nonzero avoids inheritance of this
+                                   target-specific variable.  */
+    unsigned int exp_count:EXP_COUNT_BITS;
+                                /* If >1, allow this many self-referential
+                                   expansions.  */
+    enum variable_flavor
+      flavor ENUM_BITFIELD (3); /* Variable flavor.  */
+    enum variable_origin
+      origin ENUM_BITFIELD (3); /* Variable origin.  */
+    enum variable_export
+      {
+        v_export,               /* Export this variable.  */
+        v_noexport,             /* Don't export this variable.  */
+        v_ifset,                /* Export it if it has a non-default value.  */
+        v_default               /* Decide in target_environment.  */
+      } export ENUM_BITFIELD (2);
+  };
+
+/* Structure that represents a variable set.  */
+
+struct variable_set
+  {
+    struct hash_table table;    /* Hash table of variables.  */
+  };
+
+/* Structure that represents a list of variable sets.  */
+
+struct variable_set_list
+  {
+    struct variable_set_list *next;     /* Link in the chain.  */
+    struct variable_set *set;           /* Variable set.  */
+    int next_is_parent;                 /* True if next is a parent target.  */
+  };
+
+/* Structure used for pattern-specific variables.  */
+
+struct pattern_var
+  {
+    struct pattern_var *next;
+    const char *suffix;
+    const char *target;
+    size_t len;
+    struct variable variable;
+  };
+
+extern char *variable_buffer;
+extern struct variable_set_list *current_variable_set_list;
+extern struct variable *default_goal_var;
+extern struct variable shell_var;
+
+/* expand.c */
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t)~(size_t)0)
+#endif
+
+char *variable_buffer_output (char *ptr, const char *string, size_t length);
+char *variable_expand (const char *line);
+char *variable_expand_for_file (const char *line, struct file *file);
+char *allocated_variable_expand_for_file (const char *line, struct file *file);
+#define allocated_variable_expand(line) \
+  allocated_variable_expand_for_file (line, (struct file *) 0)
+char *expand_argument (const char *str, const char *end);
+char *variable_expand_string (char *line, const char *string, size_t length);
+void install_variable_buffer (char **bufp, size_t *lenp);
+void restore_variable_buffer (char *buf, size_t len);
+
+/* function.c */
+int handle_function (char **op, const char **stringp);
+int pattern_matches (const char *pattern, const char *percent, const char *str);
+char *subst_expand (char *o, const char *text, const char *subst,
+                    const char *replace, size_t slen, size_t rlen,
+                    int by_word);
+char *patsubst_expand_pat (char *o, const char *text, const char *pattern,
+                           const char *replace, const char *pattern_percent,
+                           const char *replace_percent);
+char *patsubst_expand (char *o, const char *text, char *pattern, char *replace);
+char *func_shell_base (char *o, char **argv, int trim_newlines);
+void shell_completed (int exit_code, int exit_sig);
+
+/* expand.c */
+char *recursively_expand_for_file (struct variable *v, struct file *file);
+#define recursively_expand(v)   recursively_expand_for_file (v, NULL)
+
+/* variable.c */
+struct variable_set_list *create_new_variable_set (void);
+void free_variable_set (struct variable_set_list *);
+struct variable_set_list *push_new_variable_scope (void);
+void pop_variable_scope (void);
+void define_automatic_variables (void);
+void initialize_file_variables (struct file *file, int reading);
+void print_file_variables (const struct file *file);
+void print_target_variables (const struct file *file);
+void merge_variable_set_lists (struct variable_set_list **to_list,
+                               struct variable_set_list *from_list);
+struct variable *do_variable_definition (const floc *flocp,
+                                         const char *name, const char *value,
+                                         enum variable_origin origin,
+                                         enum variable_flavor flavor,
+                                         int target_var);
+char *parse_variable_definition (const char *line,
+                                 struct variable *v);
+struct variable *assign_variable_definition (struct variable *v, const char *line);
+struct variable *try_variable_definition (const floc *flocp, const char *line,
+                                          enum variable_origin origin,
+                                          int target_var);
+void init_hash_global_variable_set (void);
+void hash_init_function_table (void);
+void define_new_function(const floc *flocp, const char *name,
+                         unsigned int min, unsigned int max, unsigned int flags,
+                         gmk_func_ptr func);
+struct variable *lookup_variable (const char *name, size_t length);
+struct variable *lookup_variable_in_set (const char *name, size_t length,
+                                         const struct variable_set *set);
+
+struct variable *define_variable_in_set (const char *name, size_t length,
+                                         const char *value,
+                                         enum variable_origin origin,
+                                         int recursive,
+                                         struct variable_set *set,
+                                         const floc *flocp);
+
+/* Define a variable in the current variable set.  */
+
+#define define_variable(n,l,v,o,r) \
+          define_variable_in_set((n),(l),(v),(o),(r),\
+                                 current_variable_set_list->set,NILF)
+
+/* Define a variable with a constant name in the current variable set.  */
+
+#define define_variable_cname(n,v,o,r) \
+          define_variable_in_set((n),(sizeof (n) - 1),(v),(o),(r),\
+                                 current_variable_set_list->set,NILF)
+
+/* Define a variable with a location in the current variable set.  */
+
+#define define_variable_loc(n,l,v,o,r,f) \
+          define_variable_in_set((n),(l),(v),(o),(r),\
+                                 current_variable_set_list->set,(f))
+
+/* Define a variable with a location in the global variable set.  */
+
+#define define_variable_global(n,l,v,o,r,f) \
+          define_variable_in_set((n),(l),(v),(o),(r),NULL,(f))
+
+/* Define a variable in FILE's variable set.  */
+
+#define define_variable_for_file(n,l,v,o,r,f) \
+          define_variable_in_set((n),(l),(v),(o),(r),(f)->variables->set,NILF)
+
+void undefine_variable_in_set (const char *name, size_t length,
+                               enum variable_origin origin,
+                               struct variable_set *set);
+
+/* Remove variable from the current variable set. */
+
+#define undefine_variable_global(n,l,o) \
+          undefine_variable_in_set((n),(l),(o),NULL)
+
+/* Warn that NAME is an undefined variable.  */
+
+#define warn_undefined(n,l) do{\
+                              if (warn_undefined_variables_flag)        \
+                                error (reading_file, (l),               \
+                                       _("warning: undefined variable '%.*s'"), \
+                                       (int)(l), (n));                  \
+                              }while(0)
+
+char **target_environment (struct file *file);
+
+struct pattern_var *create_pattern_var (const char *target,
+                                        const char *suffix);
+
+extern int export_all_variables;
+
+#define MAKELEVEL_NAME "MAKELEVEL"
+#define MAKELEVEL_LENGTH (CSTRLEN (MAKELEVEL_NAME))
diff --git a/src/version.c b/src/version.c
new file mode 100644 (file)
index 0000000..36fad60
--- /dev/null
@@ -0,0 +1,33 @@
+/* Record version and build host architecture for GNU make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* We use <config.h> instead of "config.h" so that a compilation
+   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
+   (which it would do because makeint.h was found in $srcdir).  */
+#include <config.h>
+
+#ifndef MAKE_HOST
+# define MAKE_HOST "unknown"
+#endif
+
+const char *version_string = VERSION;
+const char *make_host = MAKE_HOST;
+\f
+/*
+  Local variables:
+  version-control: never
+  End:
+ */
diff --git a/src/vms_exit.c b/src/vms_exit.c
new file mode 100644 (file)
index 0000000..b54bba1
--- /dev/null
@@ -0,0 +1,95 @@
+/* vms_exit.c
+ *
+ * Wrapper for the VMS exit() command to tranlate UNIX codes to be
+ * encoded for POSIX, but also have VMS severity levels.
+ * The posix_exit() variant only sets a severity level for status code 1.
+ *
+ * Author: John E. Malmberg
+ */
+
+/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Per copyright assignment agreement with the Free Software Foundation
+   this software may be available under under other license agreements
+   and copyrights. */
+
+#include <makeint.h>
+
+#include <stsdef.h>
+void
+decc$exit (int status);
+#ifndef C_FACILITY_NO
+# define C_FACILITY_NO 0x350000
+#endif
+
+/* Lowest legal non-success VMS exit code is 8 */
+/* GNU make only defines codes 0, 1, 2 */
+/* So assume any exit code > 8 is a VMS exit code */
+
+#ifndef MAX_EXPECTED_EXIT_CODE
+# define MAX_EXPECTED_EXIT_CODE 7
+#endif
+
+/* Build a Posix Exit with VMS severity */
+void
+vms_exit (int status)
+{
+  int vms_status;
+  /* Fake the __posix_exit with severity added */
+  /* Undocumented correct way to do this. */
+  vms_status = 0;
+
+  /* The default DECC definition is not compatible with doing a POSIX_EXIT */
+  /* So fix it. */
+  if (status == EXIT_FAILURE)
+    status = MAKE_FAILURE;
+
+  /* Trivial case exit success */
+  if (status == 0)
+    decc$exit (STS$K_SUCCESS);
+
+  /* Is this a VMS status then just take it */
+  if (status > MAX_EXPECTED_EXIT_CODE)
+    {
+      /* Make sure that the message inhibit is set since message has */
+      /* already been displayed. */
+      vms_status = status | STS$M_INHIB_MSG;
+      decc$exit (vms_status);
+    }
+
+  /* Unix status codes are limited to 1 byte, so anything larger */
+  /* is a probably a VMS exit code and needs to be passed through */
+  /* A lower value can be set for a macro. */
+  /* Status 0 is always passed through as it is converted to SS$_NORMAL */
+  /* Always set the message inhibit bit */
+  vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;
+  vms_status |= (status << 3);
+
+  /* STS$K_ERROR is for status that stops makefile that a simple */
+  /* Rerun of the makefile will not fix. */
+
+  if (status == MAKE_FAILURE)
+    vms_status |= STS$K_ERROR;
+  else if (status == MAKE_TROUBLE)
+    {
+      /* Make trouble is for when make was told to do nothing and */
+      /* found that a target was not up to date.  Since a second */
+      /* of make will produce the same condition, this is of */
+      /* Error severity */
+      vms_status |= STS$K_ERROR;
+    }
+  decc$exit (vms_status);
+}
diff --git a/src/vms_export_symbol.c b/src/vms_export_symbol.c
new file mode 100644 (file)
index 0000000..9b4ed78
--- /dev/null
@@ -0,0 +1,527 @@
+/* File: vms_export_symbol.c
+ *
+ * Some programs need special environment variables deported as DCL
+ * DCL symbols.
+ */
+
+/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Per copyright assignment agreement with the Free Software Foundation
+   this software may be available under under other license agreements
+   and copyrights. */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <descrip.h>
+#include <stsdef.h>
+#include <ssdef.h>
+#include <unixlib.h>
+#include <libclidef.h>
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+struct item_list_3
+{
+  unsigned short len;
+  unsigned short code;
+  void * bufadr;
+  unsigned short * retlen;
+};
+
+
+#pragma member_alignment
+
+int
+LIB$GET_SYMBOL (const struct dsc$descriptor_s * symbol,
+                struct dsc$descriptor_s * value,
+                unsigned short * value_len,
+                const unsigned long * table);
+
+int
+LIB$SET_SYMBOL (const struct dsc$descriptor_s * symbol,
+                const struct dsc$descriptor_s * value,
+                const unsigned long * table);
+
+int
+LIB$DELETE_SYMBOL (const struct dsc$descriptor_s * symbol,
+                   const unsigned long * table);
+
+#define MAX_DCL_SYMBOL_LEN (255)
+#if __CRTL_VER >= 70302000 && !defined(__VAX)
+# define MAX_DCL_SYMBOL_VALUE (8192)
+#else
+# define MAX_DCL_SYMBOL_VALUE (1024)
+#endif
+
+struct dcl_symbol
+{
+  struct dcl_symbol * link;
+  struct dsc$descriptor_s name_desc;
+  struct dsc$descriptor_s value_desc;
+  char name[MAX_DCL_SYMBOL_LEN + 1];    /* + 1 byte for null terminator */
+  char value[MAX_DCL_SYMBOL_VALUE +1];  /* + 1 byte for null terminator */
+  char pad[3]; /* Pad structure to longword allignment */
+};
+
+static struct dcl_symbol * vms_dcl_symbol_head = NULL;
+
+/* Restore symbol state to original condition. */
+static unsigned long
+clear_dcl_symbol (struct dcl_symbol * symbol)
+{
+
+  const unsigned long symtbl = LIB$K_CLI_LOCAL_SYM;
+  int status;
+
+  if (symbol->value_desc.dsc$w_length == (unsigned short)-1)
+    status = LIB$DELETE_SYMBOL (&symbol->name_desc, &symtbl);
+  else
+    status = LIB$SET_SYMBOL (&symbol->name_desc,
+                             &symbol->value_desc, &symtbl);
+  return status;
+}
+
+
+/* Restore all exported symbols to their original conditions */
+static void
+clear_exported_symbols (void)
+{
+
+  struct dcl_symbol * symbol;
+
+  symbol = vms_dcl_symbol_head;
+
+  /* Walk the list of symbols.  This is done durring exit,
+   * so no need to free memory.
+   */
+  while (symbol != NULL)
+  {
+    clear_dcl_symbol (symbol);
+    symbol = symbol->link;
+  }
+
+}
+
+
+/* Restore the symbol back to the original value
+ * symbol name is either a plain name or of the form "symbol=name" where
+ * the name portion is ignored.
+ */
+void
+vms_restore_symbol (const char * string)
+{
+
+  struct dcl_symbol * symbol;
+  char name[MAX_DCL_SYMBOL_LEN + 1];
+  int status;
+  char * value;
+  int name_len;
+
+  symbol = vms_dcl_symbol_head;
+
+  /* Isolate the name from the value */
+  value = strchr (string, '=');
+  if (value != NULL)
+    {
+      /* Copy the name from the string */
+      name_len = (value - string);
+    }
+  else
+    name_len = strlen (string);
+
+  if (name_len > MAX_DCL_SYMBOL_LEN)
+    name_len = MAX_DCL_SYMBOL_LEN;
+
+  strncpy (name, string, name_len);
+  name[name_len] = 0;
+
+  /* Walk the list of symbols.  The saved symbol is not freed
+   * symbols are likely to be overwritten multiple times, so this
+   * saves time in saving them each time.
+   */
+  while (symbol != NULL)
+    {
+      int result;
+      result = strcmp (symbol->name, name);
+      if (result == 0)
+        {
+          clear_dcl_symbol (symbol);
+          break;
+        }
+      symbol = symbol->link;
+    }
+}
+
+int
+vms_export_dcl_symbol (const char * name, const char * value)
+{
+
+  struct dcl_symbol * symbol;
+  struct dcl_symbol * next;
+  struct dcl_symbol * link;
+  int found;
+  const unsigned long symtbl = LIB$K_CLI_LOCAL_SYM;
+  struct dsc$descriptor_s value_desc;
+  int string_len;
+  int status;
+  char new_value[MAX_DCL_SYMBOL_VALUE + 1];
+  char * dollarp;
+
+  next = vms_dcl_symbol_head;
+  link = vms_dcl_symbol_head;
+
+  /* Is symbol already exported? */
+  found = 0;
+  while ((found == 0) && (link != NULL))
+    {
+      int x;
+      found = !strncasecmp (link->name, name, MAX_DCL_SYMBOL_LEN);
+      if (found)
+        symbol = link;
+      next = link;
+      link = link->link;
+    }
+
+  /* New symbol, set it up */
+  if (found == 0)
+    {
+      symbol = malloc (sizeof (struct dcl_symbol));
+      if (symbol == NULL)
+        return SS$_INSFMEM;
+
+      /* Construct the symbol descriptor, used for both saving
+       * the old symbol and creating the new symbol.
+       */
+      symbol->name_desc.dsc$w_length = strlen (name);
+      if (symbol->name_desc.dsc$w_length > MAX_DCL_SYMBOL_LEN)
+        symbol->name_desc.dsc$w_length = MAX_DCL_SYMBOL_LEN;
+
+      strncpy (symbol->name, name, symbol->name_desc.dsc$w_length);
+      symbol->name[symbol->name_desc.dsc$w_length] = 0;
+      symbol->name_desc.dsc$a_pointer = symbol->name;
+      symbol->name_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+      symbol->name_desc.dsc$b_class = DSC$K_CLASS_S;
+
+      /* construct the value descriptor, used only for saving
+       * the old symbol.
+       */
+      symbol->value_desc.dsc$a_pointer = symbol->value;
+      symbol->value_desc.dsc$w_length = MAX_DCL_SYMBOL_VALUE;
+      symbol->value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+      symbol->value_desc.dsc$b_class = DSC$K_CLASS_S;
+    }
+
+  if (found == 0)
+    {
+      unsigned long old_symtbl;
+      unsigned short value_len;
+
+      /* Look up the symbol */
+      status = LIB$GET_SYMBOL (&symbol->name_desc, &symbol->value_desc,
+                               &value_len, &old_symtbl);
+      if (!$VMS_STATUS_SUCCESS (status))
+        value_len = (unsigned short)-1;
+      else if (old_symtbl != symtbl)
+        value_len = (unsigned short)-1;
+
+      symbol->value_desc.dsc$w_length = value_len;
+
+      /* Store it away */
+      if (value_len != (unsigned short) -1)
+        symbol->value[value_len] = 0;
+
+      /* Make sure atexit scheduled */
+      if (vms_dcl_symbol_head == NULL)
+        {
+          vms_dcl_symbol_head = symbol;
+          atexit (clear_exported_symbols);
+        }
+      else
+        {
+          /* Extend the chain */
+          next->link = symbol;
+        }
+    }
+
+  /* Create or replace a symbol */
+  value_desc.dsc$a_pointer = new_value;
+  string_len = strlen (value);
+  if (string_len > MAX_DCL_SYMBOL_VALUE)
+    string_len = MAX_DCL_SYMBOL_VALUE;
+
+  strncpy (new_value, value, string_len);
+  new_value[string_len] = 0;
+
+  /* Special handling for GNU Make.  GNU Make doubles the dollar signs
+   * in environment variables read in from getenv().  Make exports symbols
+   * with the dollar signs already doubled.  So all $$ must be converted
+   * back to $.
+   * If the first $ is not doubled, then do not convert at all.
+   */
+  dollarp = strchr (new_value, '$');
+  while (dollarp && dollarp[1] == '$')
+    {
+      int left;
+      dollarp++;
+      left = string_len - (dollarp - new_value - 1);
+      string_len--;
+      if (left > 0)
+        {
+          memmove (dollarp, &dollarp[1], left);
+          dollarp = strchr (&dollarp[1], '$');
+        }
+      else
+        {
+          /* Ended with $$, simple case */
+          dollarp[1] = 0;
+          break;
+        }
+    }
+  value_desc.dsc$w_length = string_len;
+  value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+  value_desc.dsc$b_class = DSC$K_CLASS_S;
+  status = LIB$SET_SYMBOL (&symbol->name_desc, &value_desc, &symtbl);
+  return status;
+}
+
+/* export a DCL symbol using a string in the same syntax as putenv */
+int
+vms_putenv_symbol (const char * string)
+{
+
+  char name[MAX_DCL_SYMBOL_LEN + 1];
+  int status;
+  char * value;
+  int name_len;
+
+  /* Isolate the name from the value */
+  value = strchr (string, '=');
+  if (value == NULL)
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
+  /* Copy the name from the string */
+  name_len = (value - string);
+  if (name_len > MAX_DCL_SYMBOL_LEN)
+    name_len = MAX_DCL_SYMBOL_LEN;
+
+  strncpy (name, string, name_len);
+  name[name_len] = 0;
+
+  /* Skip past the "=" */
+  value++;
+
+  /* Export the symbol */
+  status = vms_export_dcl_symbol (name, value);
+
+  /* Convert the error to Unix format */
+  if (!$VMS_STATUS_SUCCESS (status))
+    {
+      errno = EVMSERR;
+      vaxc$errno = status;
+      return -1;
+    }
+  return 0;
+}
+
+#if __CRTL_VER >= 70301000
+# define transpath_parm transpath
+#else
+static char transpath[MAX_DCL_SYMBOL_VALUE];
+#endif
+
+/* Helper callback routine for converting Unix paths to VMS */
+static int
+to_vms_action (char * vms_spec, int flag, char * transpath_parm)
+{
+  strncpy (transpath, vms_spec, MAX_DCL_SYMBOL_VALUE - 1);
+  transpath[MAX_DCL_SYMBOL_VALUE - 1] = 0;
+  return 0;
+}
+
+#ifdef __DECC
+# pragma message save
+  /* Undocumented extra parameter use triggers a ptrmismatch warning */
+# pragma message disable ptrmismatch
+#endif
+
+/* Create a foreign command only visible to children */
+int
+create_foreign_command (const char * command, const char * image)
+{
+  char vms_command[MAX_DCL_SYMBOL_VALUE + 1];
+  int status;
+
+  vms_command[0] = '$';
+  vms_command[1] = 0;
+  if (image[0] == '/')
+    {
+#if __CRTL_VER >= 70301000
+      /* Current decc$to_vms is reentrant */
+      decc$to_vms (image, to_vms_action, 0, 1, &vms_command[1]);
+#else
+      /* Older decc$to_vms is not reentrant */
+      decc$to_vms (image, to_vms_action, 0, 1);
+      strncpy (&vms_command[1], transpath, MAX_DCL_SYMBOL_VALUE - 1);
+      vms_command[MAX_DCL_SYMBOL_VALUE] = 0;
+#endif
+    }
+  else
+    {
+      strncpy (&vms_command[1], image, MAX_DCL_SYMBOL_VALUE - 1);
+      vms_command[MAX_DCL_SYMBOL_VALUE] = 0;
+    }
+  status = vms_export_dcl_symbol (command, vms_command);
+
+  return status;
+}
+#ifdef __DECC
+# pragma message restore
+#endif
+
+
+#ifdef DEBUG
+
+int
+main(int argc, char ** argv, char **env)
+{
+
+  char value[MAX_DCL_SYMBOL_VALUE +1];
+  int status = 0;
+  int putenv_status;
+  int vms_status;
+  struct dsc$descriptor_s name_desc;
+  struct dsc$descriptor_s value_desc;
+  const unsigned long symtbl = LIB$K_CLI_LOCAL_SYM;
+  unsigned short value_len;
+  unsigned long old_symtbl;
+  int result;
+  const char * vms_command = "vms_export_symbol";
+  const char * vms_image = "test_image.exe";
+  const char * vms_symbol1 = "test_symbol1";
+  const char * value1 = "test_value1";
+  const char * vms_symbol2 = "test_symbol2";
+  const char * putenv_string = "test_symbol2=value2";
+  const char * value2 = "value2";
+
+  /* Test creating a foreign command */
+  vms_status = create_foreign_command (vms_command, vms_image);
+  if (!$VMS_STATUS_SUCCESS (vms_status))
+    {
+      printf("Create foreign command failed: %d\n", vms_status);
+      status = 1;
+    }
+
+  name_desc.dsc$a_pointer = (char *)vms_command;
+  name_desc.dsc$w_length = strlen (vms_command);
+  name_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+  name_desc.dsc$b_class = DSC$K_CLASS_S;
+
+  value_desc.dsc$a_pointer = value;
+  value_desc.dsc$w_length = MAX_DCL_SYMBOL_VALUE;
+  value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+  value_desc.dsc$b_class = DSC$K_CLASS_S;
+
+  vms_status = LIB$GET_SYMBOL (&name_desc, &value_desc,
+                               &value_len, &old_symtbl);
+  if (!$VMS_STATUS_SUCCESS (vms_status))
+    {
+      printf ("lib$get_symbol for command failed: %d\n", vms_status);
+      status = 1;
+    }
+
+  value[value_len] = 0;
+  result = strncasecmp (&value[1], vms_image, value_len - 1);
+  if (result != 0)
+    {
+      printf ("create_foreign_command failed!  expected '%s', got '%s'\n",
+              vms_image, &value[1]);
+      status = 1;
+    }
+
+  /* Test exporting a symbol */
+  vms_status = vms_export_dcl_symbol (vms_symbol1, value1);
+  if (!$VMS_STATUS_SUCCESS (vms_status))
+    {
+      printf ("vms_export_dcl_symbol for command failed: %d\n", vms_status);
+      status = 1;
+    }
+
+  name_desc.dsc$a_pointer = (char *)vms_symbol1;
+  name_desc.dsc$w_length = strlen (vms_symbol1);
+  vms_status = LIB$GET_SYMBOL(&name_desc, &value_desc,
+                              &value_len, &old_symtbl);
+  if (!$VMS_STATUS_SUCCESS(vms_status))
+    {
+      printf ("lib$get_symbol for command failed: %d\n", vms_status);
+      status = 1;
+    }
+
+  value[value_len] = 0;
+  result = strncmp (value, value1, value_len);
+  if (result != 0)
+    {
+      printf ("vms_export_dcl_symbol failed!  expected '%s', got '%s'\n",
+              value1, value);
+      status = 1;
+    }
+
+  /* Test putenv for DCL symbols */
+  putenv_status = vms_putenv_symbol (putenv_string);
+  if (putenv_status != 0)
+    {
+      perror ("vms_putenv_symbol");
+      status = 1;
+    }
+
+  name_desc.dsc$a_pointer = (char *)vms_symbol2;
+  name_desc.dsc$w_length = strlen(vms_symbol2);
+  vms_status = LIB$GET_SYMBOL (&name_desc, &value_desc,
+                               &value_len, &old_symtbl);
+  if (!$VMS_STATUS_SUCCESS (vms_status))
+    {
+      printf ("lib$get_symbol for command failed: %d\n", vms_status);
+      status = 1;
+    }
+
+  value[value_len] = 0;
+  result = strncmp (value, value2, value_len);
+  if (result != 0)
+  {
+    printf ("vms_putenv_symbol failed!  expected '%s', got '%s'\n",
+            value2, value);
+    status = 1;
+  }
+
+  vms_restore_symbol (putenv_string);
+  vms_status = LIB$GET_SYMBOL (&name_desc, &value_desc,
+                               &value_len, &old_symtbl);
+  if ($VMS_STATUS_SUCCESS (vms_status))
+    {
+      printf ("lib$get_symbol for command succeeded, should have failed\n");
+      status = 1;
+    }
+
+  exit (status);
+}
+
+#endif
diff --git a/src/vms_progname.c b/src/vms_progname.c
new file mode 100644 (file)
index 0000000..95d0521
--- /dev/null
@@ -0,0 +1,463 @@
+/* File: vms_progname.c
+ *
+ * This module provides a fixup of the program name.
+ *
+ * This module is designed to be a plug in replacement for the
+ * progname module used by many GNU utilities with a few enhancements
+ * needed for GNU Make.
+ *
+ * It does not support the HAVE_DECL_PROGRAM_INVOCATION_* macros at this
+ * time.
+ *
+ * Make sure that the program_name string is set as close as possible to
+ *    what the original command was given.
+ *
+ * When run from DCL, The argv[0] element is initialized with an absolute
+ * path name.  The decc$ feature logical names can control the format
+ * of this pathname.  In some cases it causes the UNIX format name to be
+ * formatted incorrectly.
+ *
+ * This DCL provided name is usually incompatible with what is expected to
+ * be provided by Unix programs and needs to be replaced.
+ *
+ * When run from an exec() call, the argv[0] element is initialized by the
+ * program.  This name is compatible with what is expected to be provided
+ * by Unix programs and should be passed through unchanged.
+ *
+ * The DCL provided name can be detected because it always contains the
+ * device name.
+ *
+ * DCL examples:
+ *    devname:[dir]program.exe;1         Normal VMS - remove path and .EXE;n
+ *    devname:[dir]facility$program.exe;1   Facility also needs removal.
+ *    /devname/dir/program.exe
+ *    /DISK$VOLUME/dir/program.exe.1     Bug version should not be there.
+ *    /DISK$VOLUME/dir/program.          Bug Period should not be there.
+ *
+ */
+
+/* Copyright (C) 2014-2020 Free Software Foundation, Inc.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* Per copyright assignment agreement with the Free Software Foundation
+   this software may be available under under other license agreements
+   and copyrights. */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <descrip.h>
+#include <dvidef.h>
+#include <efndef.h>
+#include <fscndef.h>
+#include <stsdef.h>
+
+#ifdef USE_PROGNAME_H
+# include "progname.h"
+#endif
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+struct item_list_3
+{
+  unsigned short len;
+  unsigned short code;
+  void * bufadr;
+  unsigned short * retlen;
+};
+
+struct filescan_itmlst_2
+{
+  unsigned short length;
+  unsigned short itmcode;
+  char * component;
+};
+
+#pragma member_alignment
+
+int
+SYS$GETDVIW (unsigned long efn,
+             unsigned short chan,
+             const struct dsc$descriptor_s * devnam,
+             const struct item_list_3 * itmlst,
+             void * iosb,
+             void (* astadr)(unsigned long),
+             unsigned long astprm,
+             void * nullarg);
+
+int
+SYS$FILESCAN (const struct dsc$descriptor_s * srcstr,
+              struct filescan_itmlst_2 * valuelist,
+              unsigned long * fldflags,
+              struct dsc$descriptor_s *auxout,
+              unsigned short * retlen);
+
+/* String containing name the program is called with.
+   To be initialized by main().  */
+
+const char *program_name = NULL;
+
+static int internal_need_vms_symbol = 0;
+
+static char vms_new_nam[256];
+
+int
+need_vms_symbol (void)
+{
+  return internal_need_vms_symbol;
+}
+
+
+void
+set_program_name (const char *argv0)
+{
+  int status;
+  int result;
+
+#ifdef DEBUG
+  printf ("original argv0 = %s\n", argv0);
+#endif
+
+  /* Posix requires non-NULL argv[0] */
+  if (argv0 == NULL)
+    {
+      fputs ("A NULL argv[0] was passed through an exec system call.\n",
+             stderr);
+      abort ();
+    }
+
+  program_name = argv0;
+  result = 0;
+  internal_need_vms_symbol = 0;
+
+  /* If the path name starts with a /, then it is an absolute path         */
+  /* that may have been generated by the CRTL instead of the command name  */
+  /* If it is the device name between the slashes, then this was likely    */
+  /* from the run command and needs to be fixed up.                        */
+  /* If the DECC$POSIX_COMPLIANT_PATHNAMES is set to 2, then it is the     */
+  /* DISK$VOLUME that will be present, and it will still need to be fixed. */
+  if (argv0[0] == '/')
+    {
+      char * nextslash;
+      int length;
+      struct item_list_3 itemlist[3];
+      unsigned short dvi_iosb[4];
+      char alldevnam[64];
+      unsigned short alldevnam_len;
+      struct dsc$descriptor_s devname_dsc;
+      char diskvolnam[256];
+      unsigned short diskvolnam_len;
+
+      internal_need_vms_symbol = 1;
+
+       /* Get some information about the disk */
+      /*--------------------------------------*/
+      itemlist[0].len = (sizeof alldevnam) - 1;
+      itemlist[0].code = DVI$_ALLDEVNAM;
+      itemlist[0].bufadr = alldevnam;
+      itemlist[0].retlen = &alldevnam_len;
+      itemlist[1].len = (sizeof diskvolnam) - 1 - 5;
+      itemlist[1].code = DVI$_VOLNAM;
+      itemlist[1].bufadr = &diskvolnam[5];
+      itemlist[1].retlen = &diskvolnam_len;
+      itemlist[2].len = 0;
+      itemlist[2].code = 0;
+
+      /* Add the prefix for the volume name. */
+      /* SYS$GETDVI will append the volume name to this */
+      strcpy (diskvolnam, "DISK$");
+
+      nextslash = strchr (&argv0[1], '/');
+      if (nextslash != NULL)
+        {
+          length = nextslash - argv0 - 1;
+
+          /* Cast needed for HP C compiler diagnostic */
+          devname_dsc.dsc$a_pointer = (char *)&argv0[1];
+          devname_dsc.dsc$w_length = length;
+          devname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+          devname_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+          status = SYS$GETDVIW (EFN$C_ENF, 0, &devname_dsc, itemlist,
+                                dvi_iosb, NULL, 0, 0);
+          if (!$VMS_STATUS_SUCCESS (status))
+            {
+              /* If the sys$getdviw fails, then this path was passed by */
+              /* An exec() program and not from DCL, so do nothing */
+              /* An example is "/tmp/program" where tmp: does not exist */
+#ifdef DEBUG
+              printf ("sys$getdviw failed with status %d\n", status);
+#endif
+              result = 0;
+             }
+           else if (!$VMS_STATUS_SUCCESS (dvi_iosb[0]))
+             {
+#ifdef DEBUG
+                printf ("sys$getdviw failed with iosb %d\n", dvi_iosb[0]);
+#endif
+                result = 0;
+              }
+            else
+              {
+                char * devnam;
+                int devnam_len;
+                char argv_dev[64];
+
+                /* Null terminate the returned alldevnam */
+                alldevnam[alldevnam_len] = 0;
+                devnam = alldevnam;
+                devnam_len = alldevnam_len;
+
+                /* Need to skip past any leading underscore */
+                if (devnam[0] == '_')
+                  {
+                    devnam++;
+                    devnam_len--;
+                  }
+
+                /* And remove the trailing colon */
+                if (devnam[devnam_len - 1] == ':')
+                  {
+                    devnam_len--;
+                    devnam[devnam_len] = 0;
+                  }
+
+                /* Null terminate the returned volnam */
+                diskvolnam_len += 5;
+                diskvolnam[diskvolnam_len] = 0;
+
+                /* Check first for normal CRTL behavior */
+                if (devnam_len == length)
+                  {
+                    strncpy (vms_new_nam, &argv0[1], length);
+                    vms_new_nam[length] = 0;
+                    result = (strcasecmp (devnam, vms_new_nam) == 0);
+                  }
+
+                /* If we have not got a match, check for POSIX Compliant */
+                /* behavior.  To be more accurate, we could also check */
+                /* to see if that feature is active. */
+                if ((result == 0) && (diskvolnam_len == length))
+                  {
+                    strncpy (vms_new_nam, &argv0[1], length);
+                    vms_new_nam[length] = 0;
+                    result = (strcasecmp (diskvolnam, vms_new_nam) == 0);
+                  }
+              }
+        }
+      }
+    else
+      {
+        /* The path did not start with a slash, so it could be VMS format */
+        /* If it is vms format, it has a volume/device in it as it must   */
+        /* be an absolute path */
+        struct dsc$descriptor_s path_desc;
+        int status;
+        unsigned long field_flags;
+        struct filescan_itmlst_2 item_list[5];
+        char * volume;
+        char * name;
+        int name_len;
+        char * ext;
+
+        path_desc.dsc$a_pointer = (char *)argv0; /* cast ok */
+        path_desc.dsc$w_length = strlen (argv0);
+        path_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+        path_desc.dsc$b_class = DSC$K_CLASS_S;
+
+        /* Don't actually need to initialize anything buf itmcode */
+        /* I just do not like uninitialized input values */
+
+        /* Sanity check, this must be the same length as input */
+        item_list[0].itmcode = FSCN$_FILESPEC;
+        item_list[0].length = 0;
+        item_list[0].component = NULL;
+
+        /* If the device is present, then it if a VMS spec */
+        item_list[1].itmcode = FSCN$_DEVICE;
+        item_list[1].length = 0;
+        item_list[1].component = NULL;
+
+        /* we need the program name and type */
+        item_list[2].itmcode = FSCN$_NAME;
+        item_list[2].length = 0;
+        item_list[2].component = NULL;
+
+        item_list[3].itmcode = FSCN$_TYPE;
+        item_list[3].length = 0;
+        item_list[3].component = NULL;
+
+        /* End the list */
+        item_list[4].itmcode = 0;
+        item_list[4].length = 0;
+        item_list[4].component = NULL;
+
+        status = SYS$FILESCAN ((const struct dsc$descriptor_s *)&path_desc,
+                               item_list, &field_flags, NULL, NULL);
+
+
+        if ($VMS_STATUS_SUCCESS (status) &&
+           (item_list[0].length == path_desc.dsc$w_length) &&
+           (item_list[1].length != 0))
+          {
+
+            char * dollar;
+            int keep_ext;
+            int i;
+
+            /* We need the filescan to be successful, */
+            /* same length as input, and a volume to be present */
+            internal_need_vms_symbol = 1;
+
+            /* We will assume that we only get to this path on a version */
+            /* of VMS that does not support the EFS character set */
+
+            /* There may be a xxx$ prefix on the image name.  Linux */
+            /* programs do not handle that well, so strip the prefix */
+            name = item_list[2].component;
+            name_len = item_list[2].length;
+            dollar = strrchr (name, '$');
+            if (dollar != NULL)
+              {
+                dollar++;
+                name_len = name_len - (dollar - name);
+                name = dollar;
+              }
+
+            strncpy (vms_new_nam, name, name_len);
+            vms_new_nam[name_len] = 0;
+
+            /* Commit to using the new name */
+            program_name = vms_new_nam;
+
+            /* We only keep the extension if it is not ".exe" */
+            keep_ext = 0;
+            ext = item_list[3].component;
+
+            if (item_list[3].length != 1)
+              {
+                keep_ext = 1;
+                if (item_list[3].length == 4)
+                  {
+                    if ((ext[1] == 'e' || ext[1] == 'E') &&
+                        (ext[2] == 'x' || ext[2] == 'X') &&
+                        (ext[3] == 'e' || ext[3] == 'E'))
+                      keep_ext = 0;
+                  }
+              }
+
+            if (keep_ext == 1)
+              strncpy (&vms_new_nam[name_len], ext, item_list[3].length);
+          }
+      }
+
+    if (result)
+      {
+        char * lastslash;
+        char * dollar;
+        char * dotexe;
+        char * lastdot;
+        char * extension;
+
+        /* This means it is probably the name from a DCL command */
+        /* Find the last slash which separates the file from the */
+        /* path. */
+        lastslash = strrchr (argv0, '/');
+
+        if (lastslash != NULL) {
+            int i;
+
+            lastslash++;
+
+            /* There may be a xxx$ prefix on the image name.  Linux */
+            /* programs do not handle that well, so strip the prefix */
+            dollar = strrchr (lastslash, '$');
+
+            if (dollar != NULL) {
+                dollar++;
+                lastslash = dollar;
+            }
+
+            strcpy (vms_new_nam, lastslash);
+
+            /* In UNIX mode + EFS character set, there should not be a */
+            /* version present, as it is not possible when parsing to  */
+            /* tell if it is a version or part of the UNIX filename as */
+            /* UNIX programs use numeric extensions for many reasons.  */
+
+            lastdot = strrchr (vms_new_nam, '.');
+            if (lastdot != NULL) {
+                int i;
+
+                i = 1;
+                while (isdigit (lastdot[i])) {
+                    i++;
+                }
+                if (lastdot[i] == 0) {
+                    *lastdot = 0;
+                }
+            }
+
+            /* Find the .exe on the name (case insenstive) and toss it */
+            dotexe = strrchr (vms_new_nam, '.');
+            if (dotexe != NULL) {
+                if ((dotexe[1] == 'e' || dotexe[1] == 'E') &&
+                    (dotexe[2] == 'x' || dotexe[2] == 'X') &&
+                    (dotexe[3] == 'e' || dotexe[3] == 'E') &&
+                    (dotexe[4] == 0)) {
+
+                    *dotexe = 0;
+                } else {
+                     /* Also need to handle a null extension because of a */
+                     /* CRTL bug. */
+                     if (dotexe[1] == 0) {
+                         *dotexe = 0;
+                    }
+                }
+            }
+
+            /* Commit to new name */
+            program_name = vms_new_nam;
+
+        } else {
+            /* There is no way that the code should ever get here */
+            /* As we already verified that the '/' was present */
+            fprintf (stderr, "Sanity failure somewhere we lost a '/'\n");
+        }
+    }
+}
+
+#ifdef DEBUG
+
+int
+main (int argc, char ** argv, char **env)
+{
+
+  char command[1024];
+
+  set_program_name (argv[0]);
+
+  printf ("modified argv[0] = %s\n", program_name);
+
+  return 0;
+}
+#endif
diff --git a/src/vmsdir.h b/src/vmsdir.h
new file mode 100644 (file)
index 0000000..686d526
--- /dev/null
@@ -0,0 +1,76 @@
+/* dirent.h for vms
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef VMSDIR_H
+#define VMSDIR_H
+
+#include <rms.h>
+
+#define        MAXNAMLEN       255
+
+#ifndef __DECC
+#if !defined (__GNUC__) && !defined (__ALPHA)
+typedef unsigned long u_long;
+typedef unsigned short u_short;
+#endif
+#endif
+
+struct direct
+{
+  off_t d_off;
+  u_long d_fileno;
+  u_short d_reclen;
+  u_short d_namlen;
+  char d_name[MAXNAMLEN + 1];
+};
+
+#undef DIRSIZ
+#define DIRSIZ(dp)             \
+  (((sizeof (struct direct)    \
+     - (MAXNAMLEN+1)           \
+     + ((dp)->d_namlen+1))     \
+    + 3) & ~3)
+
+#define d_ino  d_fileno                /* compatibility */
+
+
+/*
+ * Definitions for library routines operating on directories.
+ */
+
+typedef struct DIR
+{
+  struct direct dir;
+  char d_result[MAXNAMLEN + 1];
+#if defined (__ALPHA) || defined (__DECC)
+  struct FAB fab;
+#else
+  struct fabdef fab;
+#endif
+} DIR;
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#define rewinddir(dirp)        seekdir((dirp), (long)0)
+
+DIR *opendir ();
+struct direct *readdir (DIR *dfd);
+int closedir (DIR *dfd);
+const char *vmsify (const char *name, int type);
+
+#endif /* VMSDIR_H */
diff --git a/src/vmsfunctions.c b/src/vmsfunctions.c
new file mode 100644 (file)
index 0000000..51310da
--- /dev/null
@@ -0,0 +1,226 @@
+/* VMS functions
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "debug.h"
+#include "job.h"
+
+#include <ctype.h>
+#include <string.h>
+
+#ifdef __DECC
+#include <starlet.h>
+#endif
+
+#include <rms.h>
+#include "vmsdir.h"
+
+#ifdef HAVE_VMSDIR_H
+
+DIR *
+opendir (char *dspec)
+{
+  struct DIR *dir  = xcalloc (sizeof (struct DIR));
+  struct NAM *dnam = xmalloc (sizeof (struct NAM));
+  struct FAB *dfab = &dir->fab;
+  char *searchspec = xmalloc (MAXNAMLEN + 1);
+
+  *dfab = cc$rms_fab;
+  *dnam = cc$rms_nam;
+  sprintf (searchspec, "%s*.*;", dspec);
+
+  dfab->fab$l_fna = searchspec;
+  dfab->fab$b_fns = strlen (searchspec);
+  dfab->fab$l_nam = dnam;
+
+  *dnam = cc$rms_nam;
+  dnam->nam$l_esa = searchspec;
+  dnam->nam$b_ess = MAXNAMLEN;
+
+  if (! (sys$parse (dfab) & 1))
+    {
+      free (dir);
+      free (dnam);
+      free (searchspec);
+      return (NULL);
+    }
+
+  return dir;
+}
+
+#define uppercasify(str) \
+  do \
+    { \
+      char *tmp; \
+      for (tmp = (str); *tmp != '\0'; tmp++) \
+        if (islower ((unsigned char)*tmp)) \
+          *tmp = toupper ((unsigned char)*tmp); \
+    } \
+  while (0)
+
+struct direct *
+readdir (DIR *dir)
+{
+  struct FAB *dfab = &dir->fab;
+  struct NAM *dnam = (struct NAM *)(dfab->fab$l_nam);
+  struct direct *dentry = &dir->dir;
+  int i;
+
+  memset (dentry, 0, sizeof *dentry);
+
+  dnam->nam$l_rsa = dir->d_result;
+  dnam->nam$b_rss = MAXNAMLEN;
+
+  DB (DB_VERBOSE, ("."));
+
+  if (!((i = sys$search (dfab)) & 1))
+    {
+      DB (DB_VERBOSE, (_("sys$search() failed with %d\n"), i));
+      return (NULL);
+    }
+
+  dentry->d_off = 0;
+  if (dnam->nam$w_fid == 0)
+    dentry->d_fileno = 1;
+  else
+    dentry->d_fileno = dnam->nam$w_fid[0] + (dnam->nam$w_fid[1] << 16);
+
+  dentry->d_reclen = sizeof (struct direct);
+  dentry->d_namlen = dnam->nam$b_name + dnam->nam$b_type;
+  strncpy (dentry->d_name, dnam->nam$l_name, dentry->d_namlen);
+  dentry->d_name[dentry->d_namlen] = '\0';
+
+#ifdef HAVE_CASE_INSENSITIVE_FS
+  uppercasify (dentry->d_name);
+#endif
+
+  return (dentry);
+}
+
+int
+closedir (DIR *dir)
+{
+  if (dir != NULL)
+    {
+      struct FAB *dfab = &dir->fab;
+      struct NAM *dnam = (struct NAM *)(dfab->fab$l_nam);
+      if (dnam != NULL)
+        free (dnam->nam$l_esa);
+      free (dnam);
+      free (dir);
+    }
+
+  return 0;
+}
+#endif /* compiled for OpenVMS prior to V7.x */
+
+/* Argv0 will be a full vms file specification, like
+   node$dka100:[utils.gnumake]make.exe;47
+   prefix it with "mcr " to make it a vms command, executable for DCL. */
+const char *
+vms_command(const char* argv0)
+{
+  size_t l = strlen(argv0) + 1;
+  char* s = xmalloc(l + 4);
+  memcpy(s, "mcr ", 4);
+  memcpy(s+4, argv0, l);
+  return s;
+}
+
+/* Argv0 aka argv[0] will be a full vms file specification, like
+   node$dka100:[utils.gnumake]make.exe;47, set up by the CRTL.
+   The vms progname should be ^^^^, the file name without
+   file type .exe and ;version.
+   Use sys$parse to get the name part of the file specification. That is
+   in the above example, pick up "make" and return a copy of that string.
+   If something goes wrong in sys$parse (unlikely, this is a VMS/CRTL supplied
+   file specification) or if there is an empty name part (not easy to produce,
+   but it is possible) just return "make".
+   Somes notes ...
+   NAM[L]$M_SYNCHK requests a syntax check, only.
+   NAM is for ODS2 names (shorter parts, output usually converted to UPPERCASE).
+   NAML is for ODS2/ODS5 names (longer parts, output unchanged).
+   NAM$M_NO_SHORT_UPCASE may not be available for older versions of VMS.
+   NAML is not available on older versions of VMS (NAML$C_BID not defined).
+   argv[0] on older versions of VMS (no extended parse style and no
+   CRTL feature DECC$ARGV_PARSE_STYLE) is always in lowercase. */
+const char *
+vms_progname(const char* argv0)
+{
+  int status;
+  static struct FAB fab;
+  char *progname;
+  const char *fallback = "make";
+
+#ifdef NAML$C_BID
+  static char esa[NAML$C_MAXRSS];
+  static struct NAML naml;
+#else
+  static char esa[NAM$C_MAXRSS];
+  static struct NAM nam;
+#endif
+
+  fab = cc$rms_fab;
+  fab.fab$l_fna = (char*)argv0;
+  fab.fab$b_fns = strlen(argv0);
+
+#ifdef NAML$C_BID
+  fab.fab$l_naml = &naml;
+  naml = cc$rms_naml;
+  naml.naml$l_long_expand = esa;
+  naml.naml$l_long_expand_alloc = NAML$C_MAXRSS;
+  naml.naml$b_nop = NAML$M_SYNCHK;
+  naml.naml$l_input_flags = NAML$M_NO_SHORT_OUTPUT;
+#else
+  fab.fab$l_nam = &nam;
+  nam = cc$rms_nam;
+  nam.nam$l_esa = esa;
+  nam.nam$b_ess = NAM$C_MAXRSS;
+# ifdef NAM$M_NO_SHORT_UPCASE
+  nam.nam$b_nop = NAM$M_SYNCHK | NAM$M_NO_SHORT_UPCASE;
+# else
+  nam.nam$b_nop = NAM$M_SYNCHK;
+# endif
+#endif
+
+  status = sys$parse(&fab);
+  if (!(status & 1))
+    return fallback;
+
+#ifdef NAML$C_BID
+  if (naml.naml$l_long_name_size == 0)
+    return fallback;
+  progname = xmalloc(naml.naml$l_long_name_size + 1);
+  memcpy(progname, naml.naml$l_long_name, naml.naml$l_long_name_size);
+  progname[naml.naml$l_long_name_size] = '\0';
+#else
+  if (nam.nam$b_name == 0)
+    return fallback;
+  progname = xmalloc(nam.nam$b_name + 1);
+# ifdef NAM$M_NO_SHORT_UPCASE
+  memcpy(progname, nam.nam$l_name, nam.nam$b_name);
+# else
+    {
+      int i;
+      for (i = 0; i < nam.nam$b_name; i++)
+        progname[i] = tolower(nam.nam$l_name[i]);
+    }
+# endif
+  progname[nam.nam$b_name] = '\0';
+#endif
+
+  return progname;
+}
diff --git a/src/vmsify.c b/src/vmsify.c
new file mode 100644 (file)
index 0000000..3427c7b
--- /dev/null
@@ -0,0 +1,1005 @@
+/* vmsify.c -- Module for vms <-> unix file name conversion
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Klaus Kämpf (kkaempf@progis.de)
+   of proGIS Software, Aachen, Germany */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "makeint.h"
+
+#if VMS
+#include <unixlib.h>
+#include <stdlib.h>
+#include <jpidef.h>
+#include <descrip.h>
+#include <uaidef.h>
+#include <ssdef.h>
+#include <starlet.h>
+#include <lib$routines.h>
+/* Initialize a string descriptor (struct dsc$descriptor_s) for an
+   arbitrary string.   ADDR is a pointer to the first character
+   of the string, and LEN is the length of the string. */
+
+#define INIT_DSC_S(dsc, addr, len) do { \
+  (dsc).dsc$b_dtype = DSC$K_DTYPE_T;    \
+  (dsc).dsc$b_class = DSC$K_CLASS_S;    \
+  (dsc).dsc$w_length = (len);           \
+  (dsc).dsc$a_pointer = (addr);         \
+} while (0)
+
+/* Initialize a string descriptor (struct dsc$descriptor_s) for a
+   NUL-terminated string.  S is a pointer to the string; the length
+   is determined by calling strlen(). */
+
+#define INIT_DSC_CSTRING(dsc, s) INIT_DSC_S(dsc, s, strlen(s))
+#endif
+
+/*
+  copy 'from' to 'to' up to but not including 'upto'
+  return 0 if eos on from
+  return 1 if upto found
+
+  return 'to' at last char + 1
+  return 'from' at match + 1 or eos if no match
+
+  if as_dir == 1, change all '.' to '_'
+  else change all '.' but the last to '_'
+*/
+
+static int
+copyto (char **to, const char **from, char upto, int as_dir)
+{
+  const char *s;
+
+  s = strrchr (*from, '.');
+
+  while (**from)
+    {
+      if (**from == upto)
+       {
+         do
+           {
+             (*from)++;
+           }
+         while (**from == upto);
+         return 1;
+       }
+      if (**from == '.')
+       {
+         if ((as_dir == 1)
+             || (*from != s))
+           **to = '_';
+         else
+           **to = '.';
+       }
+      else
+       {
+#ifdef HAVE_CASE_INSENSITIVE_FS
+         if (isupper ((unsigned char)**from))
+           **to = tolower ((unsigned char)**from);
+         else
+#endif
+           **to = **from;
+       }
+      (*to)++;
+      (*from)++;
+    }
+
+  return 0;
+}
+
+
+/*
+  get translation of logical name
+
+*/
+
+static char *
+trnlog (const char *name)
+{
+  int stat;
+  static char reslt[1024];
+  $DESCRIPTOR (reslt_dsc, reslt);
+  short resltlen;
+  struct dsc$descriptor_s name_dsc;
+  char *s;
+
+  /*
+   * the string isn't changed, but there is no string descriptor with
+   * "const char *dsc$a_pointer"
+   */
+  INIT_DSC_CSTRING (name_dsc, (char *)name);
+
+  stat = lib$sys_trnlog (&name_dsc, &resltlen, &reslt_dsc);
+
+  if ((stat&1) == 0)
+    {
+      return "";
+    }
+  if (stat == SS$_NOTRAN)
+    {
+      return "";
+    }
+  reslt[resltlen] = '\0';
+
+  s = xmalloc (resltlen+1);
+  strcpy (s, reslt);
+  return s;
+}
+
+static char *
+showall (char *s)
+{
+  static char t[512];
+  char *pt;
+
+  pt = t;
+  if (strchr (s, '\\') == 0)
+    return s;
+  while (*s)
+    {
+      if (*s == '\\')
+       {
+         *pt++ = *s;
+       }
+      *pt++ = *s++;
+    }
+  return pt;
+}
+
+
+enum namestate { N_START, N_DEVICE, N_OPEN, N_DOT, N_CLOSED, N_DONE };
+
+/*
+  convert unix style name to vms style
+  type = 0 -> name is a full name (directory and filename part)
+  type = 1 -> name is a directory
+  type = 2 -> name is a filename without directory
+
+  The following conversions are applied
+                       (0)             (1)                     (2)
+       input           full name       dir name                file name
+
+1      ./              <cwd>           []                      <current directory>.dir
+2      ../             <home of cwd>   <home of cwd>           <home of cwd>.dir
+
+3      //              <dev of cwd>:   <dev of cwd>:[000000]   <dev of cwd>:000000.dir
+4      //a             a:              a:                      a:
+5      //a/            a:              a:                      a:000000.dir
+
+9      /               [000000]        [000000]                000000.dir
+10     /a              [000000]a       [a]                     [000000]a
+11     /a/             [a]             [a]                     [000000]a.dir
+12     /a/b            [a]b            [a.b]                   [a]b
+13     /a/b/           [a.b]           [a.b]                   [a]b.dir
+14     /a/b/c          [a.b]c          [a.b.c]                 [a.b]c
+15     /a/b/c/         [a.b.c]         [a.b.c]                 [a.b]c.dir
+
+16     a               a               [.a]                    a
+17     a/              [.a]            [.a]                    a.dir
+18     a/b             [.a]b           [.a.b]                  [.a]b
+19     a/b/            [.a.b]          [.a.b]                  [.a]b.dir
+20     a/b/c           [.a.b]c         [.a.b.c]                [.a.b]c
+21     a/b/c/          [.a.b.c]        [.a.b.c]                [.a.b]c.dir
+
+22     a.b.c           a_b.c           [.a_b_c]                a_b_c.dir
+
+23     [x][y]z         [x.y]z          [x.y]z                  [x.y]z
+24     [x][.y]z        [x.y]z          [x.y]z                  [x.y]z
+
+25  filenames with '$'  are left unchanged if they contain no '/'
+25  filenames with ':' are left unchanged
+26  filenames with a single pair of '[' ']' are left unchanged
+
+  The input string is not written to.  The result is also const because
+  it's a static buffer; we don't want to change it.
+*/
+
+const char *
+vmsify (const char *name, int type)
+{
+/* max 255 device
+   max 39 directory
+   max 39 filename
+   max 39 filetype
+   max 5 version
+*/
+/* todo: VMSMAXPATHLEN is defined for ODS2 names: it needs to be adjusted. */
+#define VMSMAXPATHLEN 512
+
+  enum namestate nstate;
+  static char vmsname[VMSMAXPATHLEN+1];
+  const char *fptr;
+  const char *t;
+  char *vptr;
+  int as_dir;
+  int count;
+  const char *s;
+  const char *s1;
+  const char *s2;
+
+  if (name == 0)
+    return 0;
+  fptr = name;
+  vptr = vmsname;
+  nstate = N_START;
+
+  /* case 25a */
+  t = strpbrk (name, "$:");
+
+  if (t != 0)
+    {
+//      const char *s1;
+//      const char *s2;
+
+      if (type == 1)
+        {
+          s1 = strchr (t+1, '[');
+          s2 = strchr (t+1, ']');
+        }
+
+      if (*t == '$')
+        {
+          if (strchr (name, '/') == 0)
+            {
+              strcpy (vmsname, name);
+              if ((type == 1) && (s1 != 0) && (s2 == 0))
+                strcat (vmsname, "]");
+              return vmsname;
+            }
+        }
+      else
+        {
+          strcpy (vmsname, name);
+          if ((type == 1) && (s1 != 0) && (s2 == 0))
+            strcat (vmsname, "]");
+          return vmsname;
+        }
+    }
+
+  /* case 26 */
+  t = strchr (name, '[');
+
+  if (t != 0)
+    {
+//      const char *s;
+//      const char *s1 = strchr (t+1, '[');
+      s1 = strchr (t+1, '[');
+      if (s1 == 0)
+       {
+          strcpy (vmsname, name);
+         if ((type == 1) && (strchr (t+1, ']') == 0))
+            strcat (vmsname, "]");
+          return vmsname;
+       }
+      s1--;
+      if (*s1 != ']')
+       {
+          strcpy (vmsname, name);
+         return vmsname;               /* not ][, keep unchanged */
+       }
+
+      /* we have ][ */
+
+      s = name;
+
+      /* s  -> starting char
+        s1 -> ending ']'  */
+      do
+       {
+         strncpy (vptr, s, s1-s);      /* copy up to but not including ']' */
+         vptr += s1-s;
+         if (*s1 == 0)
+           break;
+         s = s1 + 1;                   /* s -> char behind ']' */
+         if (*s != '[')                /* was '][' ? */
+           break;                      /* no, last ] found, exit */
+         s++;
+         if (*s != '.')
+           *vptr++ = '.';
+         s1 = strchr (s, ']');
+         if (s1 == 0)                  /* no closing ] */
+           s1 = s + strlen (s);
+       }
+      while (1);
+
+      *vptr++ = ']';
+
+      fptr = s;
+
+    }
+  else         /* no [ in name */
+    {
+      int state = 0;
+      int rooted = 1;  /* flag if logical is rooted, else insert [000000] */
+
+      do
+       {
+      switch (state)
+       {
+         case 0:                               /* start of loop */
+           if (*fptr == '/')
+             {
+               fptr++;
+               state = 1;
+             }
+           else if (*fptr == '.')
+             {
+               fptr++;
+               state = 10;
+             }
+           else
+             state = 2;
+           break;
+
+         case 1:                               /* '/' at start */
+           if (*fptr == '/')
+             {
+               fptr++;
+               state = 3;
+             }
+           else
+             state = 4;
+           break;
+
+         case 2:                               /* no '/' at start */
+            {
+            const char *s = strchr (fptr, '/');
+           if (s == 0)                 /* no '/' (16) */
+             {
+               if (type == 1)
+                 {
+                   strcpy (vptr, "[.");
+                   vptr += 2;
+                 }
+               copyto (&vptr, &fptr, 0, (type==1));
+               if (type == 1)
+                 *vptr++ = ']';
+               state = -1;
+             }
+           else                        /* found '/' (17..21) */
+             {
+               if ((type == 2)
+                   && (*(s+1) == 0))   /* 17(2) */
+                 {
+                   copyto (&vptr, &fptr, '/', 1);
+                   state = 7;
+                 }
+               else
+                 {
+                   strcpy (vptr, "[.");
+                   vptr += 2;
+                   copyto (&vptr, &fptr, '/', 1);
+                   nstate = N_OPEN;
+                   state = 9;
+                 }
+             }
+           break;
+            }
+
+         case 3:                               /* '//' at start */
+            {
+//            const char *s;
+//            const char *s1;
+            char *vp;
+           while (*fptr == '/')        /* collapse all '/' */
+             fptr++;
+           if (*fptr == 0)             /* just // */
+             {
+               char cwdbuf[VMSMAXPATHLEN+1];
+
+               s1 = getcwd(cwdbuf, VMSMAXPATHLEN);
+               if (s1 == 0)
+                 {
+                    vmsname[0] = '\0';
+                   return vmsname;     /* FIXME, err getcwd */
+                 }
+               s = strchr (s1, ':');
+               if (s == 0)
+                 {
+                    vmsname[0] = '\0';
+                   return vmsname;     /* FIXME, err no device */
+                 }
+               strncpy (vptr, s1, s-s1+1);
+               vptr += s-s1+1;
+               state = -1;
+               break;
+             }
+
+           s = vptr;
+
+           if (copyto (&vptr, &fptr, '/', 1) == 0)     /* copy device part */
+             {
+               *vptr++ = ':';
+               state = -1;
+               break;
+             }
+           *vptr = ':';
+           nstate = N_DEVICE;
+           if (*fptr == 0)     /* just '//a/' */
+             {
+               strcpy (vptr+1, "[000000]");
+               vptr += 9;
+               state = -1;
+               break;
+             }
+           *vptr = 0;
+                               /* check logical for [000000] insertion */
+           vp = trnlog (s);
+           if (*vp != '\0')
+             {                 /* found translation */
+               for (;;)        /* loop over all nested logicals */
+                 {
+                   char *vp2 = vp + strlen (vp) - 1;
+                   if (*vp2 == ':')    /* translation ends in ':' */
+                     {
+                       vp2 = trnlog (vp);
+                       free (vp);
+                       if (*vp2 == 0)
+                         {
+                           rooted = 0;
+                           break;
+                         }
+                       vp = vp2;
+                       continue;       /* next iteration */
+                     }
+                   if (*vp2 == ']')    /* translation ends in ']' */
+                     {
+                       if (*(vp2-1) == '.')    /* ends in '.]' */
+                         {
+                           if (strncmp (fptr, "000000", 6) != 0)
+                             rooted = 0;
+                         }
+                       else
+                         {
+                           strcpy (vmsname, s1);
+                           vp = strchr (vmsname, ']');
+                           *vp = '.';
+                           nstate = N_DOT;
+                           vptr = vp;
+                         }
+                     }
+                   break;
+                 }
+               free (vp);
+             }
+           else
+             rooted = 0;
+
+           if (*vptr == 0)
+             {
+               nstate = N_DEVICE;
+               *vptr++ = ':';
+             }
+           else
+             vptr++;
+
+           if (rooted == 0)
+             {
+               nstate = N_DOT;
+               strcpy (vptr, "[000000.");
+               vptr += 8;
+               vp = vptr-1;
+             }
+           else
+             vp = 0;
+
+            /* vp-> '.' after 000000 or NULL */
+
+           s = strchr (fptr, '/');
+           if (s == 0)
+             {                         /* no next '/' */
+               if (*(vptr-1) == '.')
+                 *(vptr-1) = ']';
+               else if (rooted == 0)
+                 *vptr++ = ']';
+               copyto (&vptr, &fptr, 0, (type == 1));
+               state = -1;
+               break;
+             }
+           else
+             {
+               while (*(s+1) == '/')   /* skip multiple '/' */
+                 s++;
+             }
+
+           if ((rooted != 0)
+               && (*(vptr-1) != '.'))
+             {
+               *vptr++ = '[';
+               nstate = N_DOT;
+             }
+           else
+             if ((nstate == N_DOT)
+                && (vp != 0)
+                && (*(s+1) == 0))
+               {
+                 if (type == 2)
+                   {
+                     *vp = ']';
+                     nstate = N_CLOSED;
+                   }
+               }
+           state = 9;
+           break;
+            }
+         case 4:                               /* single '/' at start (9..15) */
+           if (*fptr == 0)
+             state = 5;
+           else
+             state = 6;
+           break;
+
+         case 5:                               /* just '/' at start (9) */
+           if (type != 2)
+             {
+               *vptr++ = '[';
+               nstate = N_OPEN;
+             }
+           strcpy (vptr, "000000");
+           vptr += 6;
+           if (type == 2)
+             state = 7;
+           else
+             state = 8;
+           break;
+
+         case 6:               /* chars following '/' at start 10..15 */
+            {
+            const char *s;
+           *vptr++ = '[';
+           nstate = N_OPEN;
+           s = strchr (fptr, '/');
+           if (s == 0)                 /* 10 */
+             {
+               if (type != 1)
+                 {
+                   strcpy (vptr, "000000]");
+                   vptr += 7;
+                 }
+               copyto (&vptr, &fptr, 0, (type == 1));
+               if (type == 1)
+                 {
+                   *vptr++ = ']';
+                 }
+               state = -1;
+             }
+           else                        /* 11..15 */
+             {
+               if ( (type == 2)
+                  && (*(s+1) == 0))    /* 11(2) */
+                 {
+                   strcpy (vptr, "000000]");
+                   nstate = N_CLOSED;
+                   vptr += 7;
+                 }
+               copyto (&vptr, &fptr, '/', (*(vptr-1) != ']'));
+               state = 9;
+             }
+           break;
+            }
+
+         case 7:                               /* add '.dir' and exit */
+           if ((nstate == N_OPEN)
+               || (nstate == N_DOT))
+             {
+               char *vp = vptr-1;
+               while (vp > vmsname)
+                 {
+                   if (*vp == ']')
+                     {
+                       break;
+                     }
+                   if (*vp == '.')
+                     {
+                       *vp = ']';
+                       break;
+                     }
+                   vp--;
+                 }
+             }
+           strcpy (vptr, ".dir");
+           vptr += 4;
+           state = -1;
+           break;
+
+         case 8:                               /* add ']' and exit */
+           *vptr++ = ']';
+           state = -1;
+           break;
+
+         case 9:                       /* 17..21, fptr -> 1st '/' + 1 */
+            {
+            const char *s;
+           if (*fptr == 0)
+             {
+               if (type == 2)
+                 {
+                   state = 7;
+                 }
+               else
+                 state = 8;
+               break;
+             }
+           s = strchr (fptr, '/');
+           if (s == 0)
+             {
+               if (type != 1)
+                 {
+                   if (nstate == N_OPEN)
+                     {
+                       *vptr++ = ']';
+                       nstate = N_CLOSED;
+                     }
+                   as_dir = 0;
+                 }
+               else
+                 {
+                   if (nstate == N_OPEN)
+                     {
+                       *vptr++ = '.';
+                       nstate = N_DOT;
+                     }
+                   as_dir = 1;
+                 }
+             }
+           else
+             {
+               while (*(s+1) == '/')
+                 s++;
+               if ( (type == 2)
+                   && (*(s+1) == 0))           /* 19(2), 21(2)*/
+                 {
+                   if (nstate != N_CLOSED)
+                     {
+                       *vptr++ = ']';
+                       nstate = N_CLOSED;
+                     }
+                   as_dir = 1;
+                 }
+               else
+                 {
+                   if (nstate == N_OPEN)
+                     {
+                       *vptr++ = '.';
+                       nstate = N_DOT;
+                     }
+                   as_dir = 1;
+                 }
+             }
+           if ( (*fptr == '.')                 /* check for '..' or '../' */
+               && (*(fptr+1) == '.')
+               && ((*(fptr+2) == '/')
+                   || (*(fptr+2) == 0)) )
+             {
+                char *vp;
+               fptr += 2;
+               if (*fptr == '/')
+                 {
+                   do
+                     {
+                       fptr++;
+                     }
+                   while (*fptr == '/');
+                 }
+               else if (*fptr == 0)
+                 type = 1;
+               vptr--;                         /* vptr -> '.' or ']' */
+               vp = vptr;
+               for (;;)
+                 {
+                   vp--;
+                   if (*vp == '.')             /* one back */
+                     {
+                       vptr = vp;
+                       nstate = N_OPEN;
+                       break;
+                     }
+                   if (*vp == '[')             /* top level reached */
+                     {
+                       if (*fptr == 0)
+                         {
+                           strcpy (vp, "[000000]");
+                           vptr = vp + 8;
+                           nstate = N_CLOSED;
+                           s = 0;
+                           break;
+                         }
+                       else
+                         {
+                           vptr = vp+1;
+                           nstate = N_OPEN;
+                           break;
+                         }
+                     }
+                 }
+             }
+           else
+             {
+               copyto (&vptr, &fptr, '/', as_dir);
+               if (nstate == N_DOT)
+                 nstate = N_OPEN;
+             }
+           if (s == 0)
+             {                                 /* 18,20 */
+               if (type == 1)
+                 *vptr++ = ']';
+               state = -1;
+             }
+           else
+             {
+               if (*(s+1) == 0)
+                 {
+                   if (type == 2)              /* 19,21 */
+                     {
+                       state = 7;
+                     }
+                   else
+                     {
+                       *vptr++ = ']';
+                       state = -1;
+                     }
+                 }
+             }
+           break;
+            }
+
+         case 10:                              /* 1,2 first is '.' */
+           if (*fptr == '.')
+             {
+               fptr++;
+               state = 11;
+             }
+           else
+             state = 12;
+           break;
+
+         case 11:                              /* 2, '..' at start */
+           count = 1;
+           if (*fptr != 0)
+             {
+               if (*fptr != '/')               /* got ..xxx */
+                 {
+                    strcpy (vmsname, name);
+                   return vmsname;
+                 }
+               do                              /* got ../ */
+                 {
+                   fptr++;
+                   while (*fptr == '/') fptr++;
+                   if (*fptr != '.')
+                     break;
+                   if (*(fptr+1) != '.')
+                     break;
+                   fptr += 2;
+                   if ((*fptr == 0)
+                       || (*fptr == '/'))
+                     count++;
+                 }
+               while (*fptr == '/');
+             }
+           {                                   /* got '..' or '../' */
+              char *vp;
+             char cwdbuf[VMSMAXPATHLEN+1];
+
+             vp = getcwd(cwdbuf, VMSMAXPATHLEN);
+             if (vp == 0)
+               {
+                  vmsname[0] = '\0';
+                 return vmsname;    /* FIXME, err getcwd */
+               }
+             strcpy (vptr, vp);
+             vp = strchr (vptr, ']');
+             if (vp != 0)
+               {
+                 nstate = N_OPEN;
+                 while (vp > vptr)
+                   {
+                     vp--;
+                     if (*vp == '[')
+                       {
+                         vp++;
+                         strcpy (vp, "000000]");
+                         state = -1;
+                         break;
+                       }
+                     else if (*vp == '.')
+                       {
+                         if (--count == 0)
+                           {
+                             if (*fptr == 0)   /* had '..' or '../' */
+                               {
+                                 *vp++ = ']';
+                                 state = -1;
+                               }
+                             else                      /* had '../xxx' */
+                               {
+                                 state = 9;
+                               }
+                             *vp = '\0';
+                             break;
+                           }
+                       }
+                   }
+               }
+             vptr += strlen (vptr);
+           }
+           break;
+
+         case 12:                              /* 1, '.' at start */
+           if (*fptr != 0)
+             {
+               if (*fptr != '/')
+                 {
+                    strcpy (vmsname, name);
+                   return vmsname;
+                 }
+               while (*fptr == '/')
+                 fptr++;
+             }
+
+           {
+              char *vp;
+             char cwdbuf[VMSMAXPATHLEN+1];
+
+             vp = getcwd(cwdbuf, VMSMAXPATHLEN);
+             if (vp == 0)
+               {
+                  vmsname[0] = '\0';
+                 return vmsname;    /*FIXME, err getcwd */
+               }
+             strcpy (vptr, vp);
+            }
+            if (*fptr == 0)
+              {
+                state = -1;
+                break;
+              }
+            else
+              {
+                char *vp = strchr (vptr, ']');
+                if (vp == 0)
+                  {
+                    state = -1;
+                    break;
+                  }
+                *vp = '\0';
+                nstate = N_OPEN;
+                vptr += strlen (vptr);
+                state = 9;
+              }
+           break;
+       }
+
+       }
+      while (state > 0);
+
+
+    }
+
+
+  /* directory conversion done
+     fptr -> filename part of input string
+     vptr -> free space in vmsname
+  */
+
+  *vptr++ = 0;
+
+  return vmsname;
+}
+
+
+
+/*
+  convert from vms-style to unix-style
+
+  dev:[dir1.dir2]      //dev/dir1/dir2/
+*/
+
+const char *
+unixify (const char *name)
+{
+  static char piece[512];
+  const char *s;
+  char *p;
+
+  if (strchr (name, '/') != 0)         /* already in unix style */
+    {
+      strcpy (piece, name);
+      return piece;
+    }
+
+  p = piece;
+  *p = 0;
+
+  /* device part */
+
+  s = strchr (name, ':');
+
+  if (s != 0)
+    {
+      int l = s - name;
+      *p++ = '/';
+      *p++ = '/';
+      strncpy (p, name, l);
+      p += l;
+    }
+
+  /* directory part */
+
+  *p++ = '/';
+  s = strchr (name, '[');
+
+  if (s != 0)
+    {
+      s++;
+      switch (*s)
+        {
+         case ']':             /* [] */
+           strcat (p, "./");
+           break;
+         case '-':             /* [- */
+           strcat (p, "../");
+           break;
+         case '.':
+           strcat (p, "./");   /* [. */
+           break;
+         default:
+           s--;
+           break;
+        }
+      s++;
+      while (*s)
+        {
+         if (*s == '.')
+           *p++ = '/';
+         else
+           *p++ = *s;
+         s++;
+         if (*s == ']')
+           {
+             s++;
+             break;
+           }
+        }
+      if (*s != 0)             /* more after ']' ?? */
+        {
+         if (*(p-1) != '/')
+           *p++ = '/';
+         strcpy (p, s);                /* copy it anyway */
+        }
+    }
+
+  else         /* no '[' anywhere */
+
+    {
+      *p++ = 0;
+    }
+
+  /* force end with '/' */
+
+  if (*(p-1) != '/')
+    *p++ = '/';
+  *p = 0;
+
+  return piece;
+}
+
+/* EOF */
diff --git a/src/vmsjobs.c b/src/vmsjobs.c
new file mode 100644 (file)
index 0000000..979a209
--- /dev/null
@@ -0,0 +1,1465 @@
+/* --------------- Moved here from job.c ---------------
+   This file must be #included in job.c, as it accesses static functions.
+
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <string.h>
+#include <descrip.h>
+#include <clidef.h>
+
+/* TODO - VMS specific header file conditionally included in makeint.h */
+
+#include <stsdef.h>
+#include <ssdef.h>
+void
+decc$exit (int status);
+
+/* Lowest legal non-success VMS exit code is 8 */
+/* GNU make only defines codes 0, 1, 2 */
+/* So assume any exit code > 8 is a VMS exit code */
+
+#ifndef MAX_EXPECTED_EXIT_CODE
+# define MAX_EXPECTED_EXIT_CODE 7
+#endif
+
+
+#if __CRTL_VER >= 70302000 && !defined(__VAX)
+# define MAX_DCL_LINE_LENGTH 4095
+# define MAX_DCL_CMD_LINE_LENGTH 8192
+#else
+# define MAX_DCL_LINE_LENGTH 255
+# define MAX_DCL_CMD_LINE_LENGTH 1024
+#endif
+#define MAX_DCL_TOKEN_LENGTH 255
+#define MAX_DCL_TOKENS 127
+
+enum auto_pipe { nopipe, add_pipe, dcl_pipe };
+
+char *vmsify (char *name, int type);
+
+static int vms_jobsefnmask = 0;
+
+/* returns whether path is assumed to be a unix like shell. */
+int
+_is_unixy_shell (const char *path)
+{
+  return vms_gnv_shell;
+}
+
+#define VMS_GETMSG_MAX 256
+static char vms_strsignal_text[VMS_GETMSG_MAX + 2];
+
+char *
+vms_strsignal (int status)
+{
+  if (status <= MAX_EXPECTED_EXIT_CODE)
+    sprintf (vms_strsignal_text, "lib$spawn returned %x", status);
+  else
+    {
+      int vms_status;
+      unsigned short * msg_len;
+      unsigned char out[4];
+      vms_status = SYS$GETMSG (status, &msg_len,
+                               vms_strsignal_text, 7, *out);
+    }
+
+  return vms_strsignal_text;
+}
+
+
+/* Wait for nchildren children to terminate */
+static void
+vmsWaitForChildren (int *status)
+{
+  while (1)
+    {
+      if (!vms_jobsefnmask)
+        {
+          *status = 0;
+          return;
+        }
+
+      *status = sys$wflor (32, vms_jobsefnmask);
+    }
+  return;
+}
+
+static int ctrlYPressed= 0;
+/* This is called at main or AST level. It is at AST level for DONTWAITFORCHILD
+   and at main level otherwise. In any case it is called when a child process
+   terminated. At AST level it won't get interrupted by anything except a
+   inner mode level AST.
+*/
+static int
+vmsHandleChildTerm (struct childbase *cbase)
+{
+  struct child *child = (struct child*)cbase;
+  struct child *lastc, *c;
+  int child_failed;
+  int exit_code;
+
+  /* The child efn is 0 when a built-in or null command is executed
+     successfully with out actually creating a child.
+  */
+  if (child->efn > 0)
+  {
+    vms_jobsefnmask &= ~(1 << (child->efn - 32));
+
+    lib$free_ef (&child->efn);
+  }
+  if (child->comname)
+    {
+      if (!ISDB (DB_JOBS) && !ctrlYPressed)
+        unlink (child->comname);
+      free (child->comname);
+    }
+
+  (void) sigblock (fatal_signal_mask);
+
+  /* First check to see if this is a POSIX exit status and handle */
+  if ((child->cstatus & VMS_POSIX_EXIT_MASK) == VMS_POSIX_EXIT_MASK)
+    {
+      exit_code = (child->cstatus >> 3) & 255;
+      if (exit_code != MAKE_SUCCESS)
+        child_failed = 1;
+    }
+  else
+    {
+      child_failed = !$VMS_STATUS_SUCCESS (child->cstatus);
+      if (child_failed)
+        exit_code = child->cstatus;
+    }
+
+  /* Search for a child matching the deceased one.  */
+  lastc = 0;
+#if defined(RECURSIVEJOBS)
+  /* I've had problems with recursive stuff and process handling */
+  for (c = children; c != 0 && c != child; lastc = c, c = c->next)
+    ;
+#else
+  c = child;
+#endif
+
+  if ($VMS_STATUS_SUCCESS (child->vms_launch_status))
+    {
+      /* Convert VMS success status to 0 for UNIX code to be happy */
+      child->vms_launch_status = 0;
+    }
+
+  /* Set the state flag to say the commands have finished.  */
+  c->file->command_state = cs_finished;
+  notice_finished_file (c->file);
+
+  (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask));
+
+  return 1;
+}
+
+/* VMS:
+   Spawn a process executing the command in ARGV and return its pid. */
+
+/* local helpers to make ctrl+c and ctrl+y working, see below */
+#include <iodef.h>
+#include <libclidef.h>
+#include <ssdef.h>
+
+static int ctrlMask= LIB$M_CLI_CTRLY;
+static int oldCtrlMask;
+static int setupYAstTried= 0;
+static unsigned short int chan= 0;
+
+static void
+reEnableAst(void)
+{
+  lib$enable_ctrl (&oldCtrlMask,0);
+}
+
+static int
+astYHandler (void)
+{
+  struct child *c;
+  for (c = children; c != 0; c = c->next)
+    if (c->pid > 0)
+      sys$delprc (&c->pid, 0, 0);
+  ctrlYPressed= 1;
+  kill (getpid(),SIGQUIT);
+  return SS$_NORMAL;
+}
+
+static void
+tryToSetupYAst(void)
+{
+  $DESCRIPTOR(inputDsc,"SYS$COMMAND");
+  int     status;
+  struct {
+    short int       status, count;
+    int     dvi;
+  } iosb;
+  unsigned short int loc_chan;
+
+  setupYAstTried++;
+
+  if (chan)
+    loc_chan= chan;
+  else
+    {
+      status= sys$assign(&inputDsc,&loc_chan,0,0);
+      if (!(status&SS$_NORMAL))
+        {
+          lib$signal(status);
+          return;
+        }
+    }
+  status= sys$qiow (0, loc_chan, IO$_SETMODE|IO$M_CTRLYAST,&iosb,0,0,
+                    astYHandler,0,0,0,0,0);
+  if (status==SS$_NORMAL)
+    status= iosb.status;
+  if (status!=SS$_NORMAL)
+    {
+      if (!chan)
+        sys$dassgn(loc_chan);
+      if (status!=SS$_ILLIOFUNC && status!=SS$_NOPRIV)
+        lib$signal(status);
+      return;
+    }
+
+  /* called from AST handler ? */
+  if (setupYAstTried>1)
+    return;
+  if (atexit(reEnableAst))
+    fprintf (stderr,
+             _("-warning, you may have to re-enable CTRL-Y handling from DCL.\n"));
+  status= lib$disable_ctrl (&ctrlMask, &oldCtrlMask);
+  if (!(status&SS$_NORMAL))
+    {
+      lib$signal(status);
+      return;
+    }
+  if (!chan)
+    chan = loc_chan;
+}
+
+/* Check if a token is too long */
+#define INC_TOKEN_LEN_OR_RETURN(x) {token->length++; \
+  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
+    { token->cmd_errno = ERANGE; return x; }}
+
+#define INC_TOKEN_LEN_OR_BREAK {token->length++; \
+  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
+    { token->cmd_errno = ERANGE; break; }}
+
+#define ADD_TOKEN_LEN_OR_RETURN(add_len, x) {token->length += add_len; \
+  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
+    { token->cmd_errno = ERANGE; return x; }}
+
+/* Check if we are out of space for more tokens */
+#define V_NEXT_TOKEN { if (cmd_tkn_index < MAX_DCL_TOKENS) \
+  cmd_tokens[++cmd_tkn_index] = NULL; \
+  else { token.cmd_errno = E2BIG; break; } \
+  token.length = 0;}
+
+
+#define UPDATE_TOKEN {cmd_tokens[cmd_tkn_index] = strdup(token.text); \
+  V_NEXT_TOKEN;}
+
+#define EOS_ERROR(x) { if (*x == 0) { token->cmd_errno = ERANGE; break; }}
+
+struct token_info
+  {
+    char *text;       /* Parsed text */
+    int length;       /* Length of parsed text */
+    char *src;        /* Pointer to source text */
+    int cmd_errno;    /* Error status of parse */
+    int use_cmd_file; /* Force use of a command file */
+  };
+
+
+/* Extract a Posix single quoted string from input line */
+static char *
+posix_parse_sq (struct token_info *token)
+{
+  /* A Posix quoted string with no expansion unless in a string
+     Unix simulation means no lexical functions present.
+  */
+  char * q;
+  char * p;
+  q = token->text;
+  p = token->src;
+
+  *q++ = '"';
+  p++;
+  INC_TOKEN_LEN_OR_RETURN (p);
+
+  while (*p != '\'' && (token->length < MAX_DCL_TOKEN_LENGTH))
+    {
+      EOS_ERROR (p);
+      if (*p == '"')
+        {
+          /* Embedded double quotes need to be doubled */
+          *q++ = '"';
+          INC_TOKEN_LEN_OR_BREAK;
+          *q = '"';
+        }
+      else
+        *q = *p;
+
+      q++;
+      p++;
+      INC_TOKEN_LEN_OR_BREAK;
+    }
+  *q++ = '"';
+  p++;
+  INC_TOKEN_LEN_OR_RETURN (p);
+  *q = 0;
+  return p;
+}
+
+/* Extract a Posix double quoted string from input line */
+static char *
+posix_parse_dq (struct token_info *token)
+{
+  /* Unix mode:  Any imbedded \" becomes doubled.
+                 \t is tab, \\, \$ leading character stripped.
+                 $ character replaced with \' unless escaped.
+  */
+  char * q;
+  char * p;
+  q = token->text;
+  p = token->src;
+  *q++ = *p++;
+  INC_TOKEN_LEN_OR_RETURN (p);
+  while (*p != 0)
+    {
+      if (*p == '\\')
+        {
+          switch(p[1])
+            {
+            case 't':     /* Convert tabs */
+              *q = '\t';
+              p++;
+              break;
+            case '\\':     /* Just remove leading backslash */
+            case '$':
+              p++;
+              *q = *p;
+              break;
+            case '"':
+              p++;
+              *q = *p;
+              *q++ = '"';
+              INC_TOKEN_LEN_OR_BREAK;
+            default:      /* Pass through unchanged */
+              *q++ = *p++;
+              INC_TOKEN_LEN_OR_BREAK;
+            }
+          INC_TOKEN_LEN_OR_BREAK;
+        }
+      else if (*p == '$' && isalpha (p[1]))
+        {
+          /* A symbol we should be able to substitute */
+          *q++ = '\'';
+          INC_TOKEN_LEN_OR_BREAK;
+          *q = '\'';
+          INC_TOKEN_LEN_OR_BREAK;
+          token->use_cmd_file = 1;
+        }
+      else
+        {
+          *q = *p;
+          INC_TOKEN_LEN_OR_BREAK;
+          if (*p == '"')
+            {
+              p++;
+              q++;
+              break;
+            }
+        }
+      p++;
+      q++;
+    }
+  *q = 0;
+  return p;
+}
+
+/* Extract a VMS quoted string or substitution string from input line */
+static char *
+vms_parse_quotes (struct token_info *token)
+{
+  /* VMS mode, the \' means that a symbol substitution is starting
+     so while you might think you can just copy until the next
+     \'.  Unfortunately the substitution can be a lexical function
+     which can contain embedded strings and lexical functions.
+     Messy, so both types need to be handled together.
+  */
+  char * q;
+  char * p;
+  q = token->text;
+  p = token->src;
+  int parse_level[MAX_DCL_TOKENS + 1];
+  int nest = 0;
+
+  parse_level[0] = *p;
+  if (parse_level[0] == '\'')
+    token->use_cmd_file = 1;
+
+  *q++ = *p++;
+  INC_TOKEN_LEN_OR_RETURN (p);
+
+
+  /* Copy everything until after the next single quote at nest == 0 */
+  while (token->length < MAX_DCL_TOKEN_LENGTH)
+    {
+      EOS_ERROR (p);
+      *q = *p;
+      INC_TOKEN_LEN_OR_BREAK;
+      if ((*p == parse_level[nest]) && (p[1] != '"'))
+        {
+          if (nest == 0)
+            {
+              *q++ = *p++;
+              break;
+            }
+          nest--;
+        }
+      else
+        {
+          switch(*p)
+            {
+            case '\\':
+              /* Handle continuation on to next line */
+              if (p[1] != '\n')
+                break;
+              p++;
+              p++;
+              *q = *p;
+              break;
+            case '(':
+              /* Parenthesis only in single quote level */
+              if (parse_level[nest] == '\'')
+                {
+                  nest++;
+                  parse_level[nest] == ')';
+                }
+              break;
+            case '"':
+              /* Double quotes only in parenthesis */
+              if (parse_level[nest] == ')')
+                {
+                  nest++;
+                  parse_level[nest] == '"';
+                }
+              break;
+            case '\'':
+              /* Symbol substitution ony in double quotes */
+              if ((p[1] == '\'') && (parse_level[nest] == '"'))
+                {
+                  nest++;
+                  parse_level[nest] == '\'';
+                  *p++ = *q++;
+                  token->use_cmd_file = 1;
+                  INC_TOKEN_LEN_OR_BREAK;
+                  break;
+                }
+              *q = *p;
+            }
+        }
+      p++;
+      q++;
+      /* Pass through doubled double quotes */
+      if ((*p == '"') && (p[1] == '"') && (parse_level[nest] == '"'))
+      {
+        *p++ = *q++;
+        INC_TOKEN_LEN_OR_BREAK;
+        *p++ = *q++;
+        INC_TOKEN_LEN_OR_BREAK;
+      }
+    }
+  *q = 0;
+  return p;
+}
+
+/* Extract a $ string from the input line */
+static char *
+posix_parse_dollar (struct token_info *token)
+{
+  /* $foo becomes 'foo' */
+  char * q;
+  char * p;
+  q = token->text;
+  p = token->src;
+  token->use_cmd_file = 1;
+
+  p++;
+  *q++ = '\'';
+  INC_TOKEN_LEN_OR_RETURN (p);
+
+  while ((isalnum (*p)) || (*p == '_'))
+    {
+      *q++ = *p++;
+      INC_TOKEN_LEN_OR_BREAK;
+    }
+  *q++ = '\'';
+  while (1)
+    {
+      INC_TOKEN_LEN_OR_BREAK;
+      break;
+    }
+  *q = 0;
+  return p;
+}
+
+const char *vms_filechars = "0123456789abcdefghijklmnopqrstuvwxyz" \
+   "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]<>:/_-.$";
+
+/* Simple text copy */
+static char *
+parse_text (struct token_info *token, int assignment_hack)
+{
+  char * q;
+  char * p;
+  int str_len;
+  q = token->text;
+  p = token->src;
+
+  /* If assignment hack, then this text needs to be double quoted. */
+  if (vms_unix_simulation && (assignment_hack == 2))
+    {
+      *q++ = '"';
+      INC_TOKEN_LEN_OR_RETURN (p);
+    }
+
+  *q++ = *p++;
+  INC_TOKEN_LEN_OR_RETURN (p);
+
+  while (*p != 0)
+    {
+      str_len = strspn (p, vms_filechars);
+      if (str_len == 0)
+        {
+          /* Pass through backslash escapes in Unix simulation
+             probably will not work anyway.
+             All any character after a ^ otherwise to support EFS.
+          */
+          if (vms_unix_simulation && (p[0] == '\\') && (p[1] != 0))
+            str_len = 2;
+          else if ((p[0] == '^') && (p[1] != 0))
+            str_len = 2;
+          else if (!vms_unix_simulation && (p[0] == ';'))
+            str_len = 1;
+
+          if (str_len == 0)
+            {
+              /* If assignment hack, then this needs to be double quoted. */
+              if (vms_unix_simulation && (assignment_hack == 2))
+              {
+                *q++ = '"';
+                INC_TOKEN_LEN_OR_RETURN (p);
+              }
+              *q = 0;
+              return p;
+            }
+        }
+      if (str_len > 0)
+        {
+          ADD_TOKEN_LEN_OR_RETURN (str_len, p);
+          strncpy (q, p, str_len);
+          p += str_len;
+          q += str_len;
+          *q = 0;
+        }
+    }
+  /* If assignment hack, then this text needs to be double quoted. */
+  if (vms_unix_simulation && (assignment_hack == 2))
+    {
+      *q++ = '"';
+      INC_TOKEN_LEN_OR_RETURN (p);
+    }
+  return p;
+}
+
+/* single character copy */
+static char *
+parse_char (struct token_info *token, int count)
+{
+  char * q;
+  char * p;
+  q = token->text;
+  p = token->src;
+
+  while (count > 0)
+    {
+      *q++ = *p++;
+      INC_TOKEN_LEN_OR_RETURN (p);
+      count--;
+    }
+  *q = 0;
+  return p;
+}
+
+/* Build a command string from the collected tokens
+   and process built-ins now
+*/
+static struct dsc$descriptor_s *
+build_vms_cmd (char **cmd_tokens,
+               enum auto_pipe use_pipe_cmd,
+               int append_token)
+{
+  struct dsc$descriptor_s *cmd_dsc;
+  int cmd_tkn_index;
+  char * cmd;
+  int cmd_len;
+  int semicolon_seen;
+
+  cmd_tkn_index = 0;
+  cmd_dsc = xmalloc (sizeof (struct dsc$descriptor_s));
+
+  /* Empty command? */
+  if (cmd_tokens[0] == NULL)
+    {
+      cmd_dsc->dsc$a_pointer = NULL;
+      cmd_dsc->dsc$w_length = 0;
+      return cmd_dsc;
+    }
+
+  /* Max DCL command + 1 extra token and trailing space */
+  cmd = xmalloc (MAX_DCL_CMD_LINE_LENGTH + 256);
+
+  cmd[0] = '$';
+  cmd[1] = 0;
+  cmd_len = 1;
+
+  /* Handle real or auto-pipe */
+  if (use_pipe_cmd == add_pipe)
+    {
+      /* We need to auto convert to a pipe command */
+      strcat (cmd, "pipe ");
+      cmd_len += 5;
+    }
+
+  semicolon_seen = 0;
+  while (cmd_tokens[cmd_tkn_index] != NULL)
+    {
+
+      /* Check for buffer overflow */
+      if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+        {
+          errno = E2BIG;
+          break;
+        }
+
+      /* Eliminate double ';' */
+      if (semicolon_seen && (cmd_tokens[cmd_tkn_index][0] == ';'))
+        {
+          semicolon_seen = 0;
+          free (cmd_tokens[cmd_tkn_index++]);
+          if (cmd_tokens[cmd_tkn_index] == NULL)
+            break;
+        }
+
+      /* Special handling for CD built-in */
+      if (strncmp (cmd_tokens[cmd_tkn_index], "builtin_cd", 11) == 0)
+        {
+          int result;
+          semicolon_seen = 0;
+          free (cmd_tokens[cmd_tkn_index]);
+          cmd_tkn_index++;
+          if (cmd_tokens[cmd_tkn_index] == NULL)
+            break;
+          DB(DB_JOBS, (_("BUILTIN CD %s\n"), cmd_tokens[cmd_tkn_index]));
+
+          /* TODO: chdir fails with some valid syntaxes */
+          result = chdir (cmd_tokens[cmd_tkn_index]);
+          if (result != 0)
+            {
+              /* TODO: Handle failure better */
+              free (cmd);
+              while (cmd_tokens[cmd_tkn_index] == NULL)
+                free (cmd_tokens[cmd_tkn_index++]);
+              cmd_dsc->dsc$w_length = -1;
+              cmd_dsc->dsc$a_pointer = NULL;
+              return cmd_dsc;
+            }
+        }
+      else if (strncmp (cmd_tokens[cmd_tkn_index], "exit", 5) == 0)
+        {
+          /* Copy the exit command */
+          semicolon_seen = 0;
+          strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
+          cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
+          free (cmd_tokens[cmd_tkn_index++]);
+          if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+            {
+              errno = E2BIG;
+              break;
+            }
+
+          /* Optional whitespace */
+          if (isspace (cmd_tokens[cmd_tkn_index][0]))
+            {
+              strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
+              cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
+              free (cmd_tokens[cmd_tkn_index++]);
+              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+              {
+                errno = E2BIG;
+                break;
+              }
+            }
+
+          /* There should be a status, but it is optional */
+          if (cmd_tokens[cmd_tkn_index][0] == ';')
+            continue;
+
+          /* If Unix simulation, add '((' */
+          if (vms_unix_simulation)
+            {
+              strcpy (&cmd[cmd_len], "((");
+              cmd_len += 2;
+              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+                {
+                  errno = E2BIG;
+                  break;
+                }
+            }
+
+          /* Add the parameter */
+          strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
+          cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
+          free (cmd_tokens[cmd_tkn_index++]);
+          if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+            {
+              errno = E2BIG;
+              break;
+            }
+
+          /* Add " * 8) .and. %x7f8) .or. %x1035a002" */
+          if (vms_unix_simulation)
+            {
+              const char *end_str = " * 8) .and. %x7f8) .or. %x1035a002";
+              strcpy (&cmd[cmd_len], end_str);
+              cmd_len += strlen (end_str);
+              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+                {
+                  errno = E2BIG;
+                  break;
+                }
+            }
+          continue;
+        }
+
+      /* auto pipe needs spaces before semicolon */
+      if (use_pipe_cmd == add_pipe)
+        if (cmd_tokens[cmd_tkn_index][0] == ';')
+          {
+            cmd[cmd_len++] = ' ';
+            semicolon_seen = 1;
+            if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
+              {
+                errno = E2BIG;
+                break;
+              }
+          }
+        else
+          {
+            char ch;
+            ch = cmd_tokens[cmd_tkn_index][0];
+            if (!(ch == ' ' || ch == '\t'))
+              semicolon_seen = 0;
+          }
+
+      strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
+      cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
+
+      free (cmd_tokens[cmd_tkn_index++]);
+
+      /* Skip the append tokens if they exist */
+      if (cmd_tkn_index == append_token)
+        {
+          free (cmd_tokens[cmd_tkn_index++]);
+          if (isspace (cmd_tokens[cmd_tkn_index][0]))
+            free (cmd_tokens[cmd_tkn_index++]);
+          free (cmd_tokens[cmd_tkn_index++]);
+        }
+    }
+
+  cmd[cmd_len] = 0;
+  cmd_dsc->dsc$w_length = cmd_len;
+  cmd_dsc->dsc$a_pointer = cmd;
+  cmd_dsc->dsc$b_dtype = DSC$K_DTYPE_T;
+  cmd_dsc->dsc$b_class = DSC$K_CLASS_S;
+
+  return cmd_dsc;
+}
+
+pid_t
+child_execute_job (struct childbase *child, int good_stdin UNUSED, char *argv)
+{
+  int i;
+
+  static struct dsc$descriptor_s *cmd_dsc;
+  static struct dsc$descriptor_s pnamedsc;
+  int spflags = CLI$M_NOWAIT;
+  int status;
+  int comnamelen;
+  char procname[100];
+
+  char *p;
+  char *cmd_tokens[(MAX_DCL_TOKENS * 2) + 1]; /* whitespace does not count */
+  char token_str[MAX_DCL_TOKEN_LENGTH + 1];
+  struct token_info token;
+  int cmd_tkn_index;
+  int paren_level = 0;
+  enum auto_pipe use_pipe_cmd = nopipe;
+  int append_token = -1;
+  char *append_file = NULL;
+  int unix_echo_cmd = 0;  /* Special handle Unix echo command */
+  int assignment_hack = 0; /* Handle x=y command as piped command */
+
+  /* Parse IO redirection.  */
+
+  child->comname = NULL;
+
+  DB (DB_JOBS, ("child_execute_job (%s)\n", argv));
+
+  while (isspace ((unsigned char)*argv))
+    argv++;
+
+  if (*argv == 0)
+    {
+      /* Only a built-in or a null command - Still need to run term AST */
+      child->cstatus = VMS_POSIX_EXIT_MASK;
+      child->vms_launch_status = SS$_NORMAL;
+      child->efn = 0;
+      vmsHandleChildTerm (child);
+      /* TODO what is this "magic number" */
+      return 270163; /* Special built-in */
+    }
+
+  sprintf (procname, "GMAKE_%05x", getpid () & 0xfffff);
+  pnamedsc.dsc$w_length = strlen (procname);
+  pnamedsc.dsc$a_pointer = procname;
+  pnamedsc.dsc$b_dtype = DSC$K_DTYPE_T;
+  pnamedsc.dsc$b_class = DSC$K_CLASS_S;
+
+  /* Old */
+  /* Handle comments and redirection.
+     For ONESHELL, the redirection must be on the first line. Any other
+     redirection token is handled by DCL, that is, the pipe command with
+     redirection can be used, but it should not be used on the first line
+     for ONESHELL. */
+
+  /* VMS parser notes:
+     1. A token is any of DCL verbs, qualifiers, parameters, or punctuation.
+     2. Only MAX_DCL_TOKENS per line in both one line or command file mode.
+     3. Each token limited to MAC_DCL_TOKEN_LENGTH
+     4. If the line to DCL is greater than MAX_DCL_LINE_LENGTH then a
+        command file must be used.
+     5. Currently a command file must be used symbol substitution is to
+        be performed.
+     6. Currently limiting command files to 2 * MAX_DCL_TOKENS.
+
+     Build both a command file token list and command line token list
+     until it is determined that the command line limits are exceeded.
+  */
+
+  cmd_tkn_index = 0;
+  cmd_tokens[cmd_tkn_index] = NULL;
+  p = argv;
+
+  token.text = token_str;
+  token.length = 0;
+  token.cmd_errno = 0;
+  token.use_cmd_file = 0;
+
+  while (*p != 0)
+    {
+      /* We can not build this command so give up */
+      if (token.cmd_errno != 0)
+        break;
+
+      token.src = p;
+
+      switch (*p)
+        {
+        case '\'':
+          if (vms_unix_simulation || unix_echo_cmd)
+            {
+              p = posix_parse_sq (&token);
+              UPDATE_TOKEN;
+              break;
+            }
+
+          /* VMS mode, the \' means that a symbol substitution is starting
+             so while you might think you can just copy until the next
+             \'.  Unfortunately the substitution can be a lexical function
+             which can contain embedded strings and lexical functions.
+             Messy.
+          */
+          p = vms_parse_quotes (&token);
+          UPDATE_TOKEN;
+          break;
+        case '"':
+          if (vms_unix_simulation)
+            {
+              p = posix_parse_dq (&token);
+              UPDATE_TOKEN;
+              break;
+            }
+
+          /* VMS quoted string, can contain lexical functions with
+             quoted strings and nested lexical functions.
+          */
+          p = vms_parse_quotes (&token);
+          UPDATE_TOKEN;
+          break;
+
+        case '$':
+          if (vms_unix_simulation)
+            {
+              p = posix_parse_dollar (&token);
+              UPDATE_TOKEN;
+              break;
+            }
+
+          /* Otherwise nothing special */
+          p = parse_text (&token, 0);
+          UPDATE_TOKEN;
+          break;
+        case '\\':
+          if (p[1] == '\n')
+            {
+              /* Line continuation, remove it */
+              p += 2;
+              break;
+            }
+
+          /* Ordinary character otherwise */
+          if (assignment_hack != 0)
+            assignment_hack++;
+          if (assignment_hack > 2)
+            {
+              assignment_hack = 0;          /* Reset */
+              if (use_pipe_cmd == nopipe)   /* force pipe use */
+                use_pipe_cmd = add_pipe;
+              token_str[0] = ';';              /* add ; token */
+              token_str[1] = 0;
+              UPDATE_TOKEN;
+            }
+          p = parse_text (&token, assignment_hack);
+          UPDATE_TOKEN;
+          break;
+        case '!':
+        case '#':
+          /* Unix '#' is VMS '!' which comments out the rest of the line.
+             Historically the rest of the line has been skipped.
+             Not quite the right thing to do, as the f$verify lexical
+             function works in comments.  But this helps keep the line
+             lengths short.
+          */
+          unix_echo_cmd = 0;
+          while (*p != '\n' && *p != 0)
+            p++;
+          break;
+        case '(':
+          /* Subshell, equation, or lexical function argument start */
+          p = parse_char (&token, 1);
+          UPDATE_TOKEN;
+          paren_level++;
+          break;
+        case ')':
+          /* Close out a paren level */
+          p = parse_char (&token, 1);
+          UPDATE_TOKEN;
+          paren_level--;
+          /* TODO: Should we diagnose if paren_level goes negative? */
+          break;
+        case '&':
+          if (isalpha (p[1]) && !vms_unix_simulation)
+            {
+              /* VMS symbol substitution */
+              p = parse_text (&token, 0);
+              token.use_cmd_file = 1;
+              UPDATE_TOKEN;
+              break;
+            }
+          if (use_pipe_cmd == nopipe)
+            use_pipe_cmd = add_pipe;
+          if (p[1] != '&')
+            p = parse_char (&token, 1);
+          else
+            p = parse_char (&token, 2);
+          UPDATE_TOKEN;
+          break;
+        case '|':
+          if (use_pipe_cmd == nopipe)
+            use_pipe_cmd = add_pipe;
+          if (p[1] != '|')
+            p = parse_char (&token, 1);
+          else
+            p = parse_char (&token, 2);
+          UPDATE_TOKEN;
+          break;
+        case ';':
+          /* Separator - convert to a pipe command. */
+          unix_echo_cmd = 0;
+        case '<':
+          if (use_pipe_cmd == nopipe)
+            use_pipe_cmd = add_pipe;
+          p = parse_char (&token, 1);
+          UPDATE_TOKEN;
+          break;
+        case '>':
+          if (use_pipe_cmd == nopipe)
+            use_pipe_cmd = add_pipe;
+          if (p[1] == '>')
+            {
+              /* Parsing would have been simple until support for the >>
+                 append redirect was added.
+                 Implementation needs:
+                 * if not exist output file create empty
+                 * open/append gnv$make_temp??? output_file
+                 * define/user sys$output gnv$make_temp???
+                 ** And all this done before the command previously tokenized.
+                 * command previously tokenized
+                 * close gnv$make_temp???
+              */
+              p = parse_char (&token, 2);
+              append_token = cmd_tkn_index;
+              token.use_cmd_file = 1;
+            }
+          else
+            p = parse_char (&token, 1);
+          UPDATE_TOKEN;
+          break;
+        case '/':
+          /* Unix path or VMS option start, read until non-path symbol */
+          if (assignment_hack != 0)
+            assignment_hack++;
+          if (assignment_hack > 2)
+            {
+              assignment_hack = 0;          /* Reset */
+              if (use_pipe_cmd == nopipe)   /* force pipe use */
+                use_pipe_cmd = add_pipe;
+              token_str[0] = ';';              /* add ; token */
+              token_str[1] = 0;
+              UPDATE_TOKEN;
+            }
+          p = parse_text (&token, assignment_hack);
+          UPDATE_TOKEN;
+          break;
+        case ':':
+          if ((p[1] == 0) || isspace (p[1]))
+            {
+              /* Unix Null command - treat as comment until next command */
+              unix_echo_cmd = 0;
+              p++;
+              while (*p != 0)
+                {
+                  if (*p == ';')
+                    {
+                      /* Remove Null command from pipeline */
+                      p++;
+                      break;
+                    }
+                  p++;
+                }
+              break;
+            }
+
+          /* String assignment */
+          /* := :== or : */
+          if (p[1] != '=')
+            p = parse_char (&token, 1);
+          else if (p[2] != '=')
+            p = parse_char (&token, 2);
+          else
+            p = parse_char (&token, 3);
+          UPDATE_TOKEN;
+          break;
+        case '=':
+          /* = or == */
+          /* If this is not an echo statement, this could be a shell
+             assignment.  VMS requires the target to be quoted if it
+             is not a macro substitution */
+          if (!unix_echo_cmd && vms_unix_simulation && (assignment_hack == 0))
+            assignment_hack = 1;
+          if (p[1] != '=')
+            p = parse_char (&token, 1);
+          else
+            p = parse_char (&token, 2);
+          UPDATE_TOKEN;
+          break;
+        case '+':
+        case '-':
+        case '*':
+          p = parse_char (&token, 1);
+          UPDATE_TOKEN;
+          break;
+        case '.':
+          /* .xxx. operation, VMS does not require the trailing . */
+          p = parse_text (&token, 0);
+          UPDATE_TOKEN;
+          break;
+        default:
+          /* Skip repetitive whitespace */
+          if (isspace (*p))
+            {
+              p = parse_char (&token, 1);
+
+              /* Force to a space or a tab */
+              if ((token_str[0] != ' ') ||
+                  (token_str[0] != '\t'))
+                token_str[0] = ' ';
+              UPDATE_TOKEN;
+
+              while (isspace (*p))
+                p++;
+              if (assignment_hack != 0)
+                assignment_hack++;
+              break;
+            }
+
+          if (assignment_hack != 0)
+            assignment_hack++;
+          if (assignment_hack > 2)
+            {
+              assignment_hack = 0;          /* Reset */
+              if (use_pipe_cmd == nopipe)   /* force pipe use */
+                use_pipe_cmd = add_pipe;
+              token_str[0] = ';';              /* add ; token */
+              token_str[1] = 0;
+              UPDATE_TOKEN;
+            }
+          p = parse_text (&token, assignment_hack);
+          if (strncasecmp (token.text, "echo", 4) == 0)
+            unix_echo_cmd = 1;
+          else if (strncasecmp (token.text, "pipe", 4) == 0)
+            use_pipe_cmd = dcl_pipe;
+          UPDATE_TOKEN;
+          break;
+        }
+    }
+
+  /* End up here with a list of tokens to build a command line.
+     Deal with errors detected during parsing.
+   */
+  if (token.cmd_errno != 0)
+    {
+      while (cmd_tokens[cmd_tkn_index] == NULL)
+        free (cmd_tokens[cmd_tkn_index++]);
+      child->cstatus = VMS_POSIX_EXIT_MASK | (MAKE_TROUBLE << 3);
+      child->vms_launch_status = SS$_ABORT;
+      child->efn = 0;
+      errno = token.cmd_errno;
+      return -1;
+    }
+
+  /* Save any redirection to append file */
+  if (append_token != -1)
+    {
+      int file_token;
+      char * lastdot;
+      char * lastdir;
+      char * raw_append_file;
+      file_token = append_token;
+      file_token++;
+      if (isspace (cmd_tokens[file_token][0]))
+        file_token++;
+      raw_append_file = vmsify (cmd_tokens[file_token], 0);
+      /* VMS DCL needs a trailing dot if null file extension */
+      lastdot = strrchr(raw_append_file, '.');
+      lastdir = strrchr(raw_append_file, ']');
+      if (lastdir == NULL)
+        lastdir = strrchr(raw_append_file, '>');
+      if (lastdir == NULL)
+        lastdir = strrchr(raw_append_file, ':');
+      if ((lastdot == NULL) || (lastdot > lastdir))
+        {
+          append_file = xmalloc (strlen (raw_append_file) + 1);
+          strcpy (append_file, raw_append_file);
+          strcat (append_file, ".");
+        }
+      else
+        append_file = strdup(raw_append_file);
+    }
+
+  cmd_dsc = build_vms_cmd (cmd_tokens, use_pipe_cmd, append_token);
+  if (cmd_dsc->dsc$a_pointer == NULL)
+    {
+      if (cmd_dsc->dsc$w_length < 0)
+        {
+          free (cmd_dsc);
+          child->cstatus = VMS_POSIX_EXIT_MASK | (MAKE_TROUBLE << 3);
+          child->vms_launch_status = SS$_ABORT;
+          child->efn = 0;
+          return -1;
+        }
+
+      /* Only a built-in or a null command - Still need to run term AST */
+      free (cmd_dsc);
+      child->cstatus = VMS_POSIX_EXIT_MASK;
+      child->vms_launch_status = SS$_NORMAL;
+      child->efn = 0;
+      vmsHandleChildTerm (child);
+      /* TODO what is this "magic number" */
+      return 270163; /* Special built-in */
+    }
+
+  if (cmd_dsc->dsc$w_length > MAX_DCL_LINE_LENGTH)
+    token.use_cmd_file = 1;
+
+  DB(DB_JOBS, (_("DCL: %s\n"), cmd_dsc->dsc$a_pointer));
+
+  /* Enforce the creation of a command file if "vms_always_use_cmd_file" is
+     non-zero.
+     Further, this way DCL reads the input stream and therefore does
+     'forced' symbol substitution, which it doesn't do for one-liners when
+     they are 'lib$spawn'ed.
+
+     Otherwise the behavior is:
+
+     Create a *.com file if either the command is too long for
+     lib$spawn, or if a redirect appending to a file is desired, or
+     symbol substitition.
+  */
+
+  if (vms_always_use_cmd_file || token.use_cmd_file)
+    {
+      FILE *outfile;
+      int cmd_len;
+
+      outfile = get_tmpfile (&child->comname,
+                             "sys$scratch:gnv$make_cmdXXXXXX.com");
+      /*                      123456789012345678901234567890 */
+      if (outfile == 0)
+        pfatal_with_name (_("fopen (temporary file)"));
+      comnamelen = strlen (child->comname);
+
+      /* The whole DCL "script" is executed as one action, and it behaves as
+         any DCL "script", that is errors stop it but warnings do not. Usually
+         the command on the last line, defines the exit code.  However, with
+         redirections there is a prolog and possibly an epilog to implement
+         the redirection.  Both are part of the script which is actually
+         executed. So if the redirection encounters an error in the prolog,
+         the user actions will not run; if in the epilog, the user actions
+         ran, but output is not captured. In both error cases, the error of
+         redirection is passed back and not the exit code of the actions. The
+         user should be able to enable DCL "script" verification with "set
+         verify". However, the prolog and epilog commands are not shown. Also,
+         if output redirection is used, the verification output is redirected
+         into that file as well. */
+      fprintf (outfile, "$ gnv$$make_verify = \"''f$verify(0)'\"\n");
+      fprintf (outfile, "$ gnv$$make_pid = f$getjpi(\"\",\"pid\")\n");
+      fprintf (outfile, "$ on error then $ goto gnv$$make_error\n");
+
+      /* Handle append redirection */
+      if (append_file != NULL)
+        {
+          /* If file does not exist, create it */
+          fprintf (outfile,
+                   "$ gnv$$make_al = \"gnv$$make_append''gnv$$make_pid'\"\n");
+          fprintf (outfile,
+                   "$ if f$search(\"%s\") .eqs. \"\" then create %s\n",
+                   append_file, append_file);
+
+          fprintf (outfile,
+                   "$ open/append 'gnv$$make_al' %s\n", append_file);
+
+          /* define sys$output to that file */
+          fprintf (outfile,
+                   "$ define/user sys$output 'gnv$$make_al'\n");
+          DB (DB_JOBS, (_("Append output to %s\n"), append_file));
+          free(append_file);
+        }
+
+      fprintf (outfile, "$ gnv$$make_verify = f$verify(gnv$$make_verify)\n");
+
+      /* TODO:
+         Only for ONESHELL there will be several commands separated by
+         '\n'. But there can always be multiple continuation lines.
+      */
+
+      fprintf (outfile, "%s\n", cmd_dsc->dsc$a_pointer);
+      fprintf (outfile, "$ gnv$$make_status_2 = $status\n");
+      fprintf (outfile, "$ goto gnv$$make_exit\n");
+
+      /* Exit and clean up */
+      fprintf (outfile, "$ gnv$$make_error: ! 'f$verify(0)\n");
+      fprintf (outfile, "$ gnv$$make_status_2 = $status\n");
+
+      if (append_token != -1)
+        {
+          fprintf (outfile, "$ deassign sys$output\n");
+          fprintf (outfile, "$ close 'gnv$$make_al'\n");
+
+          DB (DB_JOBS,
+              (_("Append %.*s and cleanup\n"), comnamelen-3, child->comname));
+        }
+      fprintf (outfile, "$ gnv$$make_exit: ! 'f$verify(0)\n");
+      fprintf (outfile,
+             "$ exit 'gnv$$make_status_2' + (0*f$verify(gnv$$make_verify))\n");
+
+      fclose (outfile);
+
+      free (cmd_dsc->dsc$a_pointer);
+      cmd_dsc->dsc$a_pointer = xmalloc (256 + 4);
+      sprintf (cmd_dsc->dsc$a_pointer, "$ @%s", child->comname);
+      cmd_dsc->dsc$w_length = strlen (cmd_dsc->dsc$a_pointer);
+
+      DB (DB_JOBS, (_("Executing %s instead\n"), child->comname));
+    }
+
+  child->efn = 0;
+  while (child->efn < 32 || child->efn > 63)
+    {
+      status = LIB$GET_EF ((unsigned long *)&child->efn);
+      if (!$VMS_STATUS_SUCCESS (status))
+        {
+          if (child->comname)
+            {
+              if (!ISDB (DB_JOBS))
+                unlink (child->comname);
+              free (child->comname);
+            }
+          return -1;
+        }
+    }
+
+  SYS$CLREF (child->efn);
+
+  vms_jobsefnmask |= (1 << (child->efn - 32));
+
+  /* Export the child environment into DCL symbols */
+  if (child->environment != 0)
+    {
+      char **ep = child->environment;
+      while (*ep != 0)
+        {
+          vms_putenv_symbol (*ep);
+          *ep++;
+        }
+    }
+
+  /*
+    LIB$SPAWN  [command-string]
+    [,input-file]
+    [,output-file]
+    [,flags]
+    [,process-name]
+    [,process-id] [,completion-status-address] [,byte-integer-event-flag-num]
+    [,AST-address] [,varying-AST-argument]
+    [,prompt-string] [,cli] [,table]
+  */
+
+#ifndef DONTWAITFORCHILD
+  /*
+   * Code to make ctrl+c and ctrl+y working.
+   * The problem starts with the synchronous case where after lib$spawn is
+   * called any input will go to the child. But with input re-directed,
+   * both control characters won't make it to any of the programs, neither
+   * the spawning nor to the spawned one. Hence the caller needs to spawn
+   * with CLI$M_NOWAIT to NOT give up the input focus. A sys$waitfr
+   * has to follow to simulate the wanted synchronous behaviour.
+   * The next problem is ctrl+y which isn't caught by the crtl and
+   * therefore isn't converted to SIGQUIT (for a signal handler which is
+   * already established). The only way to catch ctrl+y, is an AST
+   * assigned to the input channel. But ctrl+y handling of DCL needs to be
+   * disabled, otherwise it will handle it. Not to mention the previous
+   * ctrl+y handling of DCL needs to be re-established before make exits.
+   * One more: At the time of LIB$SPAWN signals are blocked. SIGQUIT will
+   * make it to the signal handler after the child "normally" terminates.
+   * This isn't enough. It seems reasonable for simple command lines like
+   * a 'cc foobar.c' spawned in a subprocess but it is unacceptable for
+   * spawning make. Therefore we need to abort the process in the AST.
+   *
+   * Prior to the spawn it is checked if an AST is already set up for
+   * ctrl+y, if not one is set up for a channel to SYS$COMMAND. In general
+   * this will work except if make is run in a batch environment, but there
+   * nobody can press ctrl+y. During the setup the DCL handling of ctrl+y
+   * is disabled and an exit handler is established to re-enable it.
+   * If the user interrupts with ctrl+y, the assigned AST will fire, force
+   * an abort to the subprocess and signal SIGQUIT, which will be caught by
+   * the already established handler and will bring us back to common code.
+   * After the spawn (now /nowait) a sys$waitfr simulates the /wait and
+   * enables the ctrl+y be delivered to this code. And the ctrl+c too,
+   * which the crtl converts to SIGINT and which is caught by the common
+   * signal handler. Because signals were blocked before entering this code
+   * sys$waitfr will always complete and the SIGQUIT will be processed after
+   * it (after termination of the current block, somewhere in common code).
+   * And SIGINT too will be delayed. That is ctrl+c can only abort when the
+   * current command completes. Anyway it's better than nothing :-)
+   */
+
+  if (!setupYAstTried)
+    tryToSetupYAst();
+  child->vms_launch_status = lib$spawn (cmd_dsc,               /* cmd-string */
+                     NULL, /* input-file */
+                     NULL, /* output-file */
+                     &spflags,                                 /* flags */
+                     &pnamedsc,                                /* proc name */
+                     &child->pid, &child->cstatus, &child->efn,
+                     0, 0,
+                     0, 0, 0);
+
+  status = child->vms_launch_status;
+  if ($VMS_STATUS_SUCCESS (status))
+    {
+      status = sys$waitfr (child->efn);
+      vmsHandleChildTerm (child);
+    }
+#else
+  child->vms_launch_status = lib$spawn (cmd_dsc,
+                      NULL,
+                      NULL,
+                      &spflags,
+                      &pnamedsc,
+                      &child->pid, &child->cstatus, &child->efn,
+                      vmsHandleChildTerm, child,
+                      0, 0, 0);
+   status = child->vms_launch_status;
+#endif
+
+  /* Free the pointer if not a command file */
+  if (!vms_always_use_cmd_file && !token.use_cmd_file)
+    free (cmd_dsc->dsc$a_pointer);
+  free (cmd_dsc);
+
+  if (!$VMS_STATUS_SUCCESS (status))
+    {
+      switch (status)
+        {
+        case SS$_EXQUOTA:
+          errno = EPROCLIM;
+          break;
+        default:
+          errno = EFAIL;
+        }
+    }
+
+  /* Restore the VMS symbols that were changed */
+  if (child->environment != 0)
+    {
+      char **ep = child->environment;
+      while (*ep != 0)
+        {
+          vms_restore_symbol (*ep);
+          *ep++;
+        }
+    }
+
+  /* TODO what is this "magic number" */
+  return (status & 1) ? 270163 : -1 ;
+}
diff --git a/src/vpath.c b/src/vpath.c
new file mode 100644 (file)
index 0000000..d4e7dc7
--- /dev/null
@@ -0,0 +1,637 @@
+/* Implementation of pattern-matching file search paths for GNU Make.
+Copyright (C) 1988-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include "filedef.h"
+#include "variable.h"
+#ifdef WINDOWS32
+#include "pathstuff.h"
+#endif
+
+
+/* Structure used to represent a selective VPATH searchpath.  */
+
+struct vpath
+  {
+    struct vpath *next;      /* Pointer to next struct in the linked list.  */
+    const char *pattern;     /* The pattern to match.  */
+    const char *percent;     /* Pointer into 'pattern' where the '%' is.  */
+    size_t patlen;           /* Length of the pattern.  */
+    const char **searchpath; /* Null-terminated list of directories.  */
+    size_t maxlen;           /* Maximum length of any entry in the list.  */
+  };
+
+/* Linked-list of all selective VPATHs.  */
+
+static struct vpath *vpaths;
+
+/* Structure for the general VPATH given in the variable.  */
+
+static struct vpath *general_vpath;
+
+/* Structure for GPATH given in the variable.  */
+
+static struct vpath *gpaths;
+\f
+
+/* Reverse the chain of selective VPATH lists so they will be searched in the
+   order given in the makefiles and construct the list from the VPATH
+   variable.  */
+
+void
+build_vpath_lists (void)
+{
+  struct vpath *new = 0;
+  struct vpath *old, *nexto;
+  char *p;
+
+  /* Reverse the chain.  */
+  for (old = vpaths; old != 0; old = nexto)
+    {
+      nexto = old->next;
+      old->next = new;
+      new = old;
+    }
+
+  vpaths = new;
+
+  /* If there is a VPATH variable with a nonnull value, construct the
+     general VPATH list from it.  We use variable_expand rather than just
+     calling lookup_variable so that it will be recursively expanded.  */
+
+  {
+    /* Turn off --warn-undefined-variables while we expand SHELL and IFS.  */
+    int save = warn_undefined_variables_flag;
+    warn_undefined_variables_flag = 0;
+
+    p = variable_expand ("$(strip $(VPATH))");
+
+    warn_undefined_variables_flag = save;
+  }
+
+  if (*p != '\0')
+    {
+      /* Save the list of vpaths.  */
+      struct vpath *save_vpaths = vpaths;
+      char gp[] = "%";
+
+      /* Empty 'vpaths' so the new one will have no next, and 'vpaths'
+         will still be nil if P contains no existing directories.  */
+      vpaths = 0;
+
+      /* Parse P.  */
+      construct_vpath_list (gp, p);
+
+      /* Store the created path as the general path,
+         and restore the old list of vpaths.  */
+      general_vpath = vpaths;
+      vpaths = save_vpaths;
+    }
+
+  /* If there is a GPATH variable with a nonnull value, construct the
+     GPATH list from it.  We use variable_expand rather than just
+     calling lookup_variable so that it will be recursively expanded.  */
+
+  {
+    /* Turn off --warn-undefined-variables while we expand SHELL and IFS.  */
+    int save = warn_undefined_variables_flag;
+    warn_undefined_variables_flag = 0;
+
+    p = variable_expand ("$(strip $(GPATH))");
+
+    warn_undefined_variables_flag = save;
+  }
+
+  if (*p != '\0')
+    {
+      /* Save the list of vpaths.  */
+      struct vpath *save_vpaths = vpaths;
+      char gp[] = "%";
+
+      /* Empty 'vpaths' so the new one will have no next, and 'vpaths'
+         will still be nil if P contains no existing directories.  */
+      vpaths = 0;
+
+      /* Parse P.  */
+      construct_vpath_list (gp, p);
+
+      /* Store the created path as the GPATH,
+         and restore the old list of vpaths.  */
+      gpaths = vpaths;
+      vpaths = save_vpaths;
+    }
+}
+\f
+/* Construct the VPATH listing for the PATTERN and DIRPATH given.
+
+   This function is called to generate selective VPATH lists and also for
+   the general VPATH list (which is in fact just a selective VPATH that
+   is applied to everything).  The returned pointer is either put in the
+   linked list of all selective VPATH lists or in the GENERAL_VPATH
+   variable.
+
+   If DIRPATH is nil, remove all previous listings with the same
+   pattern.  If PATTERN is nil, remove all VPATH listings.  Existing
+   and readable directories that are not "." given in the DIRPATH
+   separated by the path element separator (defined in makeint.h) are
+   loaded into the directory hash table if they are not there already
+   and put in the VPATH searchpath for the given pattern with trailing
+   slashes stripped off if present (and if the directory is not the
+   root, "/").  The length of the longest entry in the list is put in
+   the structure as well.  The new entry will be at the head of the
+   VPATHS chain.  */
+
+void
+construct_vpath_list (char *pattern, char *dirpath)
+{
+  unsigned int elem;
+  char *p;
+  const char **vpath;
+  size_t maxvpath;
+  unsigned int maxelem;
+  const char *percent = NULL;
+
+  if (pattern != 0)
+    percent = find_percent (pattern);
+
+  if (dirpath == 0)
+    {
+      /* Remove matching listings.  */
+      struct vpath *path, *lastpath;
+
+      lastpath = 0;
+      path = vpaths;
+      while (path != 0)
+        {
+          struct vpath *next = path->next;
+
+          if (pattern == 0
+              || (((percent == 0 && path->percent == 0)
+                   || (percent - pattern == path->percent - path->pattern))
+                  && streq (pattern, path->pattern)))
+            {
+              /* Remove it from the linked list.  */
+              if (lastpath == 0)
+                vpaths = path->next;
+              else
+                lastpath->next = next;
+
+              /* Free its unused storage.  */
+              /* MSVC erroneously warns without a cast here.  */
+              free ((void *)path->searchpath);
+              free (path);
+            }
+          else
+            lastpath = path;
+
+          path = next;
+        }
+
+      return;
+    }
+
+#ifdef WINDOWS32
+    convert_vpath_to_windows32 (dirpath, ';');
+#endif
+
+  /* Skip over any initial separators and blanks.  */
+  while (STOP_SET (*dirpath, MAP_BLANK|MAP_PATHSEP))
+    ++dirpath;
+
+  /* Figure out the maximum number of VPATH entries and put it in
+     MAXELEM.  We start with 2, one before the first separator and one
+     nil (the list terminator) and increment our estimated number for
+     each separator or blank we find.  */
+  maxelem = 2;
+  p = dirpath;
+  while (*p != '\0')
+    if (STOP_SET (*p++, MAP_BLANK|MAP_PATHSEP))
+      ++maxelem;
+
+  vpath = xmalloc (maxelem * sizeof (const char *));
+  maxvpath = 0;
+
+  elem = 0;
+  p = dirpath;
+  while (*p != '\0')
+    {
+      char *v;
+      size_t len;
+
+      /* Find the end of this entry.  */
+      v = p;
+      while (*p != '\0'
+#if defined(HAVE_DOS_PATHS) && (PATH_SEPARATOR_CHAR == ':')
+             /* Platforms whose PATH_SEPARATOR_CHAR is ':' and which
+                also define HAVE_DOS_PATHS would like us to recognize
+                colons after the drive letter in the likes of
+                "D:/foo/bar:C:/xyzzy".  */
+             && (*p != PATH_SEPARATOR_CHAR
+                 || (p == v + 1 && (p[1] == '/' || p[1] == '\\')))
+#else
+             && *p != PATH_SEPARATOR_CHAR
+#endif
+             && !ISBLANK (*p))
+        ++p;
+
+      len = p - v;
+      /* Make sure there's no trailing slash,
+         but still allow "/" as a directory.  */
+#if defined(__MSDOS__) || defined(__EMX__) || defined(HAVE_DOS_PATHS)
+      /* We need also to leave alone a trailing slash in "d:/".  */
+      if (len > 3 || (len > 1 && v[1] != ':'))
+#endif
+      if (len > 1 && p[-1] == '/')
+        --len;
+
+      /* Put the directory on the vpath list.  */
+      if (len > 1 || *v != '.')
+        {
+          vpath[elem++] = dir_name (strcache_add_len (v, len));
+          if (len > maxvpath)
+            maxvpath = len;
+        }
+
+      /* Skip over separators and blanks between entries.  */
+      while (STOP_SET (*p, MAP_BLANK|MAP_PATHSEP))
+        ++p;
+    }
+
+  if (elem > 0)
+    {
+      struct vpath *path;
+      /* ELEM is now incremented one element past the last
+         entry, to where the nil-pointer terminator goes.
+         Usually this is maxelem - 1.  If not, shrink down.  */
+      if (elem < (maxelem - 1))
+        vpath = xrealloc (vpath, (elem+1) * sizeof (const char *));
+
+      /* Put the nil-pointer terminator on the end of the VPATH list.  */
+      vpath[elem] = NULL;
+
+      /* Construct the vpath structure and put it into the linked list.  */
+      path = xmalloc (sizeof (struct vpath));
+      path->searchpath = vpath;
+      path->maxlen = maxvpath;
+      path->next = vpaths;
+      vpaths = path;
+
+      /* Set up the members.  */
+      path->pattern = strcache_add (pattern);
+      path->patlen = strlen (pattern);
+      path->percent = percent ? path->pattern + (percent - pattern) : 0;
+    }
+  else
+    /* There were no entries, so free whatever space we allocated.  */
+    /* MSVC erroneously warns without a cast here.  */
+    free ((void *)vpath);
+}
+\f
+/* Search the GPATH list for a pathname string that matches the one passed
+   in.  If it is found, return 1.  Otherwise we return 0.  */
+
+int
+gpath_search (const char *file, size_t len)
+{
+  if (gpaths && (len <= gpaths->maxlen))
+    {
+      const char **gp;
+      for (gp = gpaths->searchpath; *gp != NULL; ++gp)
+        if (strneq (*gp, file, len) && (*gp)[len] == '\0')
+          return 1;
+    }
+
+  return 0;
+}
+\f
+
+/* Search the given VPATH list for a directory where the name pointed to by
+   FILE exists.  If it is found, we return a cached name of the existing file
+   and set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no
+   stat call was done). Also set the matching directory index in PATH_INDEX
+   if it is not NULL. Otherwise we return NULL.  */
+
+static const char *
+selective_vpath_search (struct vpath *path, const char *file,
+                        FILE_TIMESTAMP *mtime_ptr, unsigned int* path_index)
+{
+  int not_target;
+  char *name;
+  const char *n;
+  const char *filename;
+  const char **vpath = path->searchpath;
+  size_t maxvpath = path->maxlen;
+  unsigned int i;
+  size_t flen, name_dplen;
+  int exists = 0;
+
+  /* Find out if *FILE is a target.
+     If and only if it is NOT a target, we will accept prospective
+     files that don't exist but are mentioned in a makefile.  */
+  {
+    struct file *f = lookup_file (file);
+    not_target = f == 0 || !f->is_target;
+  }
+
+  flen = strlen (file);
+
+  /* Split *FILE into a directory prefix and a name-within-directory.
+     NAME_DPLEN gets the length of the prefix; FILENAME gets the pointer to
+     the name-within-directory and FLEN is its length.  */
+
+  n = strrchr (file, '/');
+#ifdef HAVE_DOS_PATHS
+  /* We need the rightmost slash or backslash.  */
+  {
+    const char *bslash = strrchr (file, '\\');
+    if (!n || bslash > n)
+      n = bslash;
+  }
+#endif
+  name_dplen = n != 0 ? n - file : 0;
+  filename = name_dplen > 0 ? n + 1 : file;
+  if (name_dplen > 0)
+    flen -= name_dplen + 1;
+
+  /* Get enough space for the biggest VPATH entry, a slash, the directory
+     prefix that came with FILE, another slash (although this one may not
+     always be necessary), the filename, and a null terminator.  */
+  name = alloca (maxvpath + 1 + name_dplen + 1 + flen + 1);
+
+  /* Try each VPATH entry.  */
+  for (i = 0; vpath[i] != 0; ++i)
+    {
+      int exists_in_cache = 0;
+      char *p = name;
+      size_t vlen = strlen (vpath[i]);
+
+      /* Put the next VPATH entry into NAME at P and increment P past it.  */
+      memcpy (p, vpath[i], vlen);
+      p += vlen;
+
+      /* Add the directory prefix already in *FILE.  */
+      if (name_dplen > 0)
+        {
+#ifndef VMS
+          *p++ = '/';
+#else
+          /* VMS: if this is not in VMS format, treat as Unix format */
+          if ((*p != ':') && (*p != ']') && (*p != '>'))
+            *p++ = '/';
+#endif
+          memcpy (p, file, name_dplen);
+          p += name_dplen;
+        }
+
+#ifdef HAVE_DOS_PATHS
+      /* Cause the next if to treat backslash and slash alike.  */
+      if (p != name && p[-1] == '\\' )
+        p[-1] = '/';
+#endif
+      /* Now add the name-within-directory at the end of NAME.  */
+#ifndef VMS
+      if (p != name && p[-1] != '/')
+        {
+          *p = '/';
+          memcpy (p + 1, filename, flen + 1);
+        }
+      else
+#else
+      /* VMS use a slash if no directory terminator present */
+      if (p != name && p[-1] != '/' && p[-1] != ':' &&
+          p[-1] != '>' && p[-1] != ']')
+        {
+          *p = '/';
+          memcpy (p + 1, filename, flen + 1);
+        }
+      else
+#endif
+        memcpy (p, filename, flen + 1);
+
+      /* Check if the file is mentioned in a makefile.  If *FILE is not
+         a target, that is enough for us to decide this file exists.
+         If *FILE is a target, then the file must be mentioned in the
+         makefile also as a target to be chosen.
+
+         The restriction that *FILE must not be a target for a
+         makefile-mentioned file to be chosen was added by an
+         inadequately commented change in July 1990; I am not sure off
+         hand what problem it fixes.
+
+         In December 1993 I loosened this restriction to allow a file
+         to be chosen if it is mentioned as a target in a makefile.  This
+         seem logical.
+
+         Special handling for -W / -o: make sure we preserve the special
+         values here.  Actually this whole thing is a little bogus: I think
+         we should ditch the name/hname thing and look into the renamed
+         capability that already exists for files: that is, have a new struct
+         file* entry for the VPATH-found file, and set the renamed field if
+         we use it.
+      */
+      {
+        struct file *f = lookup_file (name);
+        if (f != 0)
+          {
+            exists = not_target || f->is_target;
+            if (exists && mtime_ptr
+                && (f->last_mtime == OLD_MTIME || f->last_mtime == NEW_MTIME))
+              {
+                *mtime_ptr = f->last_mtime;
+                mtime_ptr = 0;
+              }
+          }
+      }
+
+      if (!exists)
+        {
+          /* That file wasn't mentioned in the makefile.
+             See if it actually exists.  */
+
+#ifdef VMS
+          /* For VMS syntax just use the original vpath */
+          if (*p != '/')
+            exists_in_cache = exists = dir_file_exists_p (vpath[i], filename);
+          else
+#endif
+            {
+              /* Clobber a null into the name at the last slash.
+                 Now NAME is the name of the directory to look in.  */
+              *p = '\0';
+              /* We know the directory is in the hash table now because either
+                 construct_vpath_list or the code just above put it there.
+                 Does the file we seek exist in it?  */
+              exists_in_cache = exists = dir_file_exists_p (name, filename);
+            }
+        }
+
+      if (exists)
+        {
+          /* The file is in the directory cache.
+             Now check that it actually exists in the filesystem.
+             The cache may be out of date.  When vpath thinks a file
+             exists, but stat fails for it, confusion results in the
+             higher levels.  */
+
+          struct stat st;
+
+#ifndef VMS
+          /* Put the slash back in NAME.  */
+          *p = '/';
+#else
+          /* If the slash was removed, put it back */
+          if (*p == 0)
+            *p = '/';
+#endif
+
+          if (exists_in_cache)  /* Makefile-mentioned file need not exist.  */
+            {
+              int e;
+
+              EINTRLOOP (e, stat (name, &st)); /* Does it really exist?  */
+              if (e != 0)
+                {
+                  exists = 0;
+                  continue;
+                }
+
+              /* Store the modtime into *MTIME_PTR for the caller.  */
+              if (mtime_ptr != 0)
+                {
+                  *mtime_ptr = FILE_TIMESTAMP_STAT_MODTIME (name, st);
+                  mtime_ptr = 0;
+                }
+            }
+
+          /* We have found a file.
+             If we get here and mtime_ptr hasn't been set, record
+             UNKNOWN_MTIME to indicate this.  */
+          if (mtime_ptr != 0)
+            *mtime_ptr = UNKNOWN_MTIME;
+
+          /* Store the name we found and return it.  */
+
+          if (path_index)
+            *path_index = i;
+
+          return strcache_add_len (name, (p + 1 - name) + flen);
+        }
+    }
+
+  return 0;
+}
+
+
+/* Search the VPATH list whose pattern matches FILE for a directory where FILE
+   exists.  If it is found, return the cached name of an existing file, and
+   set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no
+   stat call was done). Also set the matching directory index in VPATH_INDEX
+   and PATH_INDEX if they are not NULL.  Otherwise we return 0.  */
+
+const char *
+vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr,
+              unsigned int* vpath_index, unsigned int* path_index)
+{
+  struct vpath *v;
+
+  /* If there are no VPATH entries or FILENAME starts at the root,
+     there is nothing we can do.  */
+
+  if (file[0] == '/'
+#ifdef HAVE_DOS_PATHS
+      || file[0] == '\\' || file[1] == ':'
+#endif
+      || (vpaths == 0 && general_vpath == 0))
+    return 0;
+
+  if (vpath_index)
+    {
+      *vpath_index = 0;
+      *path_index = 0;
+    }
+
+  for (v = vpaths; v != 0; v = v->next)
+    {
+      if (pattern_matches (v->pattern, v->percent, file))
+        {
+          const char *p = selective_vpath_search (
+            v, file, mtime_ptr, path_index);
+          if (p)
+            return p;
+        }
+
+      if (vpath_index)
+        ++*vpath_index;
+    }
+
+
+  if (general_vpath != 0)
+    {
+      const char *p = selective_vpath_search (
+        general_vpath, file, mtime_ptr, path_index);
+      if (p)
+        return p;
+    }
+
+  return 0;
+}
+
+
+
+\f
+/* Print the data base of VPATH search paths.  */
+
+void
+print_vpath_data_base (void)
+{
+  unsigned int nvpaths;
+  struct vpath *v;
+
+  puts (_("\n# VPATH Search Paths\n"));
+
+  nvpaths = 0;
+  for (v = vpaths; v != 0; v = v->next)
+    {
+      unsigned int i;
+
+      ++nvpaths;
+
+      printf ("vpath %s ", v->pattern);
+
+      for (i = 0; v->searchpath[i] != 0; ++i)
+        printf ("%s%c", v->searchpath[i],
+                v->searchpath[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR);
+    }
+
+  if (vpaths == 0)
+    puts (_("# No 'vpath' search paths."));
+  else
+    printf (_("\n# %u 'vpath' search paths.\n"), nvpaths);
+
+  if (general_vpath == 0)
+    puts (_("\n# No general ('VPATH' variable) search path."));
+  else
+    {
+      const char **path = general_vpath->searchpath;
+      unsigned int i;
+
+      fputs (_("\n# General ('VPATH' variable) search path:\n# "), stdout);
+
+      for (i = 0; path[i] != 0; ++i)
+        printf ("%s%c", path[i],
+                path[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR);
+    }
+}
diff --git a/src/w32/compat/dirent.c b/src/w32/compat/dirent.c
new file mode 100644 (file)
index 0000000..b8ec615
--- /dev/null
@@ -0,0 +1,195 @@
+/* Directory entry code for Window platforms.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+#include <config.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include "dirent.h"
+
+
+DIR*
+opendir(const char* pDirName)
+{
+        struct stat sb;
+        DIR*    pDir;
+        char*   pEndDirName;
+        size_t  nBufferLen;
+
+        /* sanity checks */
+        if (!pDirName) {
+                errno = EINVAL;
+                return NULL;
+        }
+        if (stat(pDirName, &sb) != 0) {
+                errno = ENOENT;
+                return NULL;
+        }
+        if ((sb.st_mode & S_IFMT) != S_IFDIR) {
+                errno = ENOTDIR;
+                return NULL;
+        }
+
+        /* allocate a DIR structure to return */
+        pDir = (DIR *) malloc(sizeof (DIR));
+
+        if (!pDir)
+                return NULL;
+
+        /* input directory name length */
+        nBufferLen = strlen(pDirName);
+
+        /* copy input directory name to DIR buffer */
+        strcpy(pDir->dir_pDirectoryName, pDirName);
+
+        /* point to end of the copied directory name */
+        pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1];
+
+        /* if directory name did not end in '/' or '\', add '/' */
+        if ((*pEndDirName != '/') && (*pEndDirName != '\\')) {
+                pEndDirName++;
+                *pEndDirName = '/';
+        }
+
+        /* now append the wildcard character to the buffer */
+        pEndDirName++;
+        *pEndDirName = '*';
+        pEndDirName++;
+        *pEndDirName = '\0';
+
+        /* other values defaulted */
+        pDir->dir_nNumFiles = 0;
+        pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
+        pDir->dir_ulCookie = __DIRENT_COOKIE;
+
+        return pDir;
+}
+
+void
+closedir(DIR *pDir)
+{
+        /* got a valid pointer? */
+        if (!pDir) {
+                errno = EINVAL;
+                return;
+        }
+
+        /* sanity check that this is a DIR pointer */
+        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
+                errno = EINVAL;
+                return;
+        }
+
+        /* close the WINDOWS32 directory handle */
+        if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
+                FindClose(pDir->dir_hDirHandle);
+
+        free(pDir);
+
+        return;
+}
+
+struct dirent *
+readdir(DIR* pDir)
+{
+        WIN32_FIND_DATA wfdFindData;
+
+        if (!pDir) {
+                errno = EINVAL;
+                return NULL;
+        }
+
+        /* sanity check that this is a DIR pointer */
+        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
+                errno = EINVAL;
+                return NULL;
+        }
+
+        if (pDir->dir_nNumFiles == 0) {
+                pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData);
+                if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE)
+                        return NULL;
+        } else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData))
+                        return NULL;
+
+        /* bump count for next call to readdir() */
+        pDir->dir_nNumFiles++;
+
+        /* fill in struct dirent values */
+        pDir->dir_sdReturn.d_ino = (ino_t)-1;
+        strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName);
+
+        if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DEVICE)
+          pDir->dir_sdReturn.d_type = DT_CHR;
+        else if (wfdFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+          pDir->dir_sdReturn.d_type = DT_DIR;
+        else
+          pDir->dir_sdReturn.d_type = DT_REG;
+
+        return &pDir->dir_sdReturn;
+}
+
+void
+rewinddir(DIR* pDir)
+{
+        if (!pDir) {
+                errno = EINVAL;
+                return;
+        }
+
+        /* sanity check that this is a DIR pointer */
+        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
+                errno = EINVAL;
+                return;
+        }
+
+        /* close the WINDOWS32 directory handle */
+        if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
+                if (!FindClose(pDir->dir_hDirHandle))
+                        errno = EBADF;
+
+        /* reset members which control readdir() */
+        pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
+        pDir->dir_nNumFiles = 0;
+
+        return;
+}
+
+void
+seekdir(DIR* pDir, long nPosition)
+{
+        if (!pDir)
+                return;
+
+        /* sanity check that this is a DIR pointer */
+        if (pDir->dir_ulCookie != __DIRENT_COOKIE)
+                return;
+
+        /* go back to beginning of directory */
+        rewinddir(pDir);
+
+        /* loop until we have found position we care about */
+        for (--nPosition; nPosition && readdir(pDir); nPosition--);
+
+        /* flag invalid nPosition value */
+        if (nPosition)
+                errno = EINVAL;
+
+        return;
+}
diff --git a/src/w32/compat/posixfcn.c b/src/w32/compat/posixfcn.c
new file mode 100644 (file)
index 0000000..975dfb7
--- /dev/null
@@ -0,0 +1,486 @@
+/* Replacements for Posix functions and Posix functionality for MS-Windows.
+
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <string.h>
+#include <io.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <windows.h>
+
+#include "dlfcn.h"
+
+#include "makeint.h"
+#include "job.h"
+
+#ifndef NO_OUTPUT_SYNC
+/* Support for OUTPUT_SYNC and related functionality.  */
+
+/* Emulation of fcntl that supports only F_GETFD and F_SETLKW.  */
+int
+fcntl (intptr_t fd, int cmd, ...)
+{
+  va_list ap;
+
+  va_start (ap, cmd);
+
+  switch (cmd)
+    {
+      case F_GETFD:
+        va_end (ap);
+        /* Could have used GetHandleInformation, but that isn't
+           supported on Windows 9X.  */
+        if (_get_osfhandle (fd) == -1)
+          return -1;
+        return 0;
+      case F_SETLKW:
+        {
+          void *buf = va_arg (ap, void *);
+          struct flock *fl = (struct flock *)buf;
+          HANDLE hmutex = (HANDLE)fd;
+          static struct flock last_fl;
+          short last_type = last_fl.l_type;
+
+          va_end (ap);
+
+          if (hmutex == INVALID_HANDLE_VALUE || !hmutex)
+            return -1;
+
+          last_fl = *fl;
+
+          switch (fl->l_type)
+            {
+
+              case F_WRLCK:
+                {
+                  DWORD result;
+
+                  if (last_type == F_WRLCK)
+                    {
+                      /* Don't call WaitForSingleObject if we already
+                         own the mutex, because doing so will require
+                         us to call ReleaseMutex an equal number of
+                         times, before the mutex is actually
+                         released.  */
+                      return 0;
+                    }
+
+                  result = WaitForSingleObject (hmutex, INFINITE);
+                  switch (result)
+                    {
+                      case WAIT_OBJECT_0:
+                        /* We don't care if the mutex owner crashed or
+                           exited.  */
+                      case WAIT_ABANDONED:
+                        return 0;
+                      case WAIT_FAILED:
+                      case WAIT_TIMEOUT: /* cannot happen, really */
+                        {
+                          DWORD err = GetLastError ();
+
+                          /* Invalidate the last command.  */
+                          memset (&last_fl, 0, sizeof (last_fl));
+
+                          switch (err)
+                            {
+                              case ERROR_INVALID_HANDLE:
+                              case ERROR_INVALID_FUNCTION:
+                                errno = EINVAL;
+                                return -1;
+                              default:
+                                errno = EDEADLOCK;
+                                return -1;
+                            }
+                        }
+                    }
+                }
+              case F_UNLCK:
+                {
+                  /* FIXME: Perhaps we should call ReleaseMutex
+                     repatedly until it errors out, to make sure the
+                     mutext is released even if we somehow managed to
+                     to take ownership multiple times?  */
+                  BOOL status = ReleaseMutex (hmutex);
+
+                  if (status)
+                    return 0;
+                  else
+                    {
+                      DWORD err = GetLastError ();
+
+                      if (err == ERROR_NOT_OWNER)
+                        errno = EPERM;
+                      else
+                        {
+                          memset (&last_fl, 0, sizeof (last_fl));
+                          errno = EINVAL;
+                        }
+                      return -1;
+                    }
+                }
+              default:
+                errno = ENOSYS;
+                return -1;
+            }
+        }
+      default:
+        errno = ENOSYS;
+        va_end (ap);
+        return -1;
+    }
+}
+
+static intptr_t mutex_handle = -1;
+
+/* Record in a static variable the mutex handle we were requested to
+   use.  That nameless mutex was created by the top-level Make, and
+   its handle was passed to us via inheritance.  The value of that
+   handle is passed via the command-line arguments, so that we know
+   which handle to use.  */
+void
+record_sync_mutex (const char *str)
+{
+  char *endp;
+  intptr_t hmutex = strtol (str, &endp, 16);
+
+  if (*endp == '\0')
+    mutex_handle = hmutex;
+  else
+    {
+      mutex_handle = -1;
+      errno = EINVAL;
+    }
+}
+
+/* Create a new mutex or reuse one created by our parent.  */
+intptr_t
+create_mutex (void)
+{
+  SECURITY_ATTRIBUTES secattr;
+  intptr_t hmutex = -1;
+
+  /* If we have a mutex handle passed from the parent Make, just use
+     that.  */
+  if (mutex_handle > 0)
+    return mutex_handle;
+
+  /* We are the top-level Make, and we want the handle to be inherited
+     by our child processes.  */
+  secattr.nLength = sizeof (secattr);
+  secattr.lpSecurityDescriptor = NULL; /* use default security descriptor */
+  secattr.bInheritHandle = TRUE;
+
+  hmutex = (intptr_t)CreateMutex (&secattr, FALSE, NULL);
+  if (!hmutex)
+    {
+      DWORD err = GetLastError ();
+
+      fprintf (stderr, "CreateMutex: error %lu\n", err);
+      errno = ENOLCK;
+      hmutex = -1;
+    }
+
+  mutex_handle = hmutex;
+  return hmutex;
+}
+
+/* Return non-zero if F1 and F2 are 2 streams representing the same
+   file or pipe or device.  */
+int
+same_stream (FILE *f1, FILE *f2)
+{
+  HANDLE fh1 = (HANDLE)_get_osfhandle (fileno (f1));
+  HANDLE fh2 = (HANDLE)_get_osfhandle (fileno (f2));
+
+  /* Invalid file descriptors get treated as different streams.  */
+  if (fh1 && fh1 != INVALID_HANDLE_VALUE
+      && fh2 && fh2 != INVALID_HANDLE_VALUE)
+    {
+      if (fh1 == fh2)
+        return 1;
+      else
+        {
+          DWORD ftyp1 = GetFileType (fh1), ftyp2 = GetFileType (fh2);
+
+          if (ftyp1 != ftyp2
+              || ftyp1 == FILE_TYPE_UNKNOWN || ftyp2 == FILE_TYPE_UNKNOWN)
+            return 0;
+          else if (ftyp1 == FILE_TYPE_CHAR)
+            {
+              /* For character devices, check if they both refer to a
+                 console.  This loses if both handles refer to the
+                 null device (FIXME!), but in that case we don't care
+                 in the context of Make.  */
+              DWORD conmode1, conmode2;
+
+              /* Each process on Windows can have at most 1 console,
+                 so if both handles are for the console device, they
+                 are the same.  We also compare the console mode to
+                 distinguish between stdin and stdout/stderr.  */
+              if (GetConsoleMode (fh1, &conmode1)
+                  && GetConsoleMode (fh2, &conmode2)
+                  && conmode1 == conmode2)
+                return 1;
+            }
+          else
+            {
+              /* For disk files and pipes, compare their unique
+                 attributes.  */
+              BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2;
+
+              /* Pipes get zero in the volume serial number, but do
+                 appear to have meaningful information in file index
+                 attributes.  We test file attributes as well, for a
+                 good measure.  */
+              if (GetFileInformationByHandle (fh1, &bhfi1)
+                  && GetFileInformationByHandle (fh2, &bhfi2))
+                return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber
+                        && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow
+                        && bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh
+                        && bhfi1.dwFileAttributes == bhfi2.dwFileAttributes);
+            }
+        }
+    }
+  return 0;
+}
+
+/* A replacement for tmpfile, since the MSVCRT implementation creates
+   the file in the root directory of the current drive, which might
+   not be writable by our user.  Most of the code borrowed from
+   create_batch_file, see job.c.  */
+FILE *
+tmpfile (void)
+{
+  char temp_path[MAXPATHLEN];
+  unsigned path_size = GetTempPath (sizeof temp_path, temp_path);
+  int path_is_dot = 0;
+  /* The following variable is static so we won't try to reuse a name
+     that was generated a little while ago, because that file might
+     not be on disk yet, since we use FILE_ATTRIBUTE_TEMPORARY below,
+     which tells the OS it doesn't need to flush the cache to disk.
+     If the file is not yet on disk, we might think the name is
+     available, while it really isn't.  This happens in parallel
+     builds, where Make doesn't wait for one job to finish before it
+     launches the next one.  */
+  static unsigned uniq = 0;
+  static int second_loop = 0;
+  const char base[] = "gmake_tmpf";
+  const unsigned sizemax = sizeof base - 1 + 4 + 10 + 10;
+  unsigned pid = GetCurrentProcessId ();
+
+  if (path_size == 0)
+    {
+      path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
+      path_is_dot = 1;
+    }
+
+  ++uniq;
+  if (uniq >= 0x10000 && !second_loop)
+    {
+      /* If we already had 64K batch files in this
+         process, make a second loop through the numbers,
+         looking for free slots, i.e. files that were
+         deleted in the meantime.  */
+      second_loop = 1;
+      uniq = 1;
+    }
+  while (path_size > 0 &&
+         path_size + sizemax < sizeof temp_path &&
+         !(uniq >= 0x10000 && second_loop))
+    {
+      HANDLE h;
+
+      sprintf (temp_path + path_size,
+               "%s%s%u-%x.tmp",
+               temp_path[path_size - 1] == '\\' ? "" : "\\",
+               base, pid, uniq);
+      h = CreateFile (temp_path,  /* file name */
+                      GENERIC_READ | GENERIC_WRITE | DELETE, /* desired access */
+                      FILE_SHARE_READ | FILE_SHARE_WRITE,    /* share mode */
+                      NULL,                                  /* default security attributes */
+                      CREATE_NEW,                            /* creation disposition */
+                      FILE_ATTRIBUTE_NORMAL |                /* flags and attributes */
+                      FILE_ATTRIBUTE_TEMPORARY |
+                      FILE_FLAG_DELETE_ON_CLOSE,
+                      NULL);                                 /* no template file */
+
+      if (h == INVALID_HANDLE_VALUE)
+        {
+          const DWORD er = GetLastError ();
+
+          if (er == ERROR_FILE_EXISTS || er == ERROR_ALREADY_EXISTS)
+            {
+              ++uniq;
+              if (uniq == 0x10000 && !second_loop)
+                {
+                  second_loop = 1;
+                  uniq = 1;
+                }
+            }
+
+          /* The temporary path is not guaranteed to exist, or might
+             not be writable by user.  Use the current directory as
+             fallback.  */
+          else if (path_is_dot == 0)
+            {
+              path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
+              path_is_dot = 1;
+            }
+
+          else
+            {
+              errno = EACCES;
+              break;
+            }
+        }
+      else
+        {
+          int fd = _open_osfhandle ((intptr_t)h, 0);
+
+          return _fdopen (fd, "w+b");
+        }
+    }
+
+  if (uniq >= 0x10000)
+    errno = EEXIST;
+  return NULL;
+}
+
+#endif  /* !NO_OUTPUT_SYNC */
+
+#if MAKE_LOAD
+
+/* Support for dynamic loading of objects.  */
+
+
+static DWORD last_err;
+
+void *
+dlopen (const char *file, int mode)
+{
+  char dllfn[MAX_PATH], *p;
+  HANDLE dllhandle;
+
+  if ((mode & ~(RTLD_LAZY | RTLD_NOW | RTLD_GLOBAL)) != 0)
+    {
+      errno = EINVAL;
+      last_err = ERROR_INVALID_PARAMETER;
+      return NULL;
+    }
+
+  if (!file)
+    dllhandle = GetModuleHandle (NULL);
+  else
+    {
+      /* MSDN says to be sure to use backslashes in the DLL file name.  */
+      strcpy (dllfn, file);
+      for (p = dllfn; *p; p++)
+        if (*p == '/')
+          *p = '\\';
+
+      dllhandle = LoadLibrary (dllfn);
+    }
+  if (!dllhandle)
+    last_err = GetLastError ();
+
+  return dllhandle;
+}
+
+char *
+dlerror (void)
+{
+  static char errbuf[1024];
+  DWORD ret;
+
+  if (!last_err)
+    return NULL;
+
+  ret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
+                       | FORMAT_MESSAGE_IGNORE_INSERTS,
+                       NULL, last_err, 0, errbuf, sizeof (errbuf), NULL);
+  while (ret > 0 && (errbuf[ret - 1] == '\n' || errbuf[ret - 1] == '\r'))
+    --ret;
+
+  errbuf[ret] = '\0';
+  if (!ret)
+    sprintf (errbuf, "Error code %lu", last_err);
+
+  last_err = 0;
+  return errbuf;
+}
+
+void *
+dlsym (void *handle, const char *name)
+{
+  FARPROC addr = NULL;
+
+  if (!handle || handle == INVALID_HANDLE_VALUE)
+    {
+      last_err = ERROR_INVALID_PARAMETER;
+      return NULL;
+    }
+
+  addr = GetProcAddress (handle, name);
+  if (!addr)
+    last_err = GetLastError ();
+
+  return (void *)addr;
+}
+
+int
+dlclose (void *handle)
+{
+  if (!handle || handle == INVALID_HANDLE_VALUE)
+    return -1;
+  if (!FreeLibrary (handle))
+    return -1;
+
+  return 0;
+}
+
+
+#endif  /* MAKE_LOAD */
+
+
+/* MS runtime's isatty returns non-zero for any character device,
+   including the null device, which is not what we want.  */
+int
+isatty (int fd)
+{
+  HANDLE fh = (HANDLE) _get_osfhandle (fd);
+  DWORD con_mode;
+
+  if (fh == INVALID_HANDLE_VALUE)
+    {
+      errno = EBADF;
+      return 0;
+    }
+  if (GetConsoleMode (fh, &con_mode))
+    return 1;
+
+  errno = ENOTTY;
+  return 0;
+}
+
+char *
+ttyname (int fd)
+{
+  /* This "knows" that Make only asks about stdout and stderr.  A more
+     sophisticated implementation should test whether FD is open for
+     input or output.  We can do that by looking at the mode returned
+     by GetConsoleMode.  */
+  return "CONOUT$";
+}
diff --git a/src/w32/include/dirent.h b/src/w32/include/dirent.h
new file mode 100644 (file)
index 0000000..ae814b3
--- /dev/null
@@ -0,0 +1,84 @@
+/* Windows version of dirent.h
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _DIRENT_H
+#define _DIRENT_H
+
+#ifdef __MINGW32__
+# include <windows.h>
+# include_next <dirent.h>
+#else
+
+#include <stdlib.h>
+#include <windows.h>
+#include <limits.h>
+#include <sys/types.h>
+
+#ifndef NAME_MAX
+#define NAME_MAX 255
+#endif
+
+#define __DIRENT_COOKIE 0xfefeabab
+
+/* File types for `d_type'.
+   Windows only supports DT_CHR, DT_DIR, and DT_REG.  */
+enum
+  {
+    DT_UNKNOWN = 0,
+# define DT_UNKNOWN     DT_UNKNOWN
+    DT_FIFO = 1,
+# define DT_FIFO        DT_FIFO
+    DT_CHR = 2,
+# define DT_CHR         DT_CHR
+    DT_DIR = 4,
+# define DT_DIR         DT_DIR
+    DT_BLK = 6,
+# define DT_BLK         DT_BLK
+    DT_REG = 8,
+# define DT_REG         DT_REG
+    DT_LNK = 10,
+# define DT_LNK         DT_LNK
+    DT_SOCK = 12,
+# define DT_SOCK        DT_SOCK
+    DT_WHT = 14
+# define DT_WHT         DT_WHT
+  };
+
+
+struct dirent
+  {
+    ino_t d_ino;             /* unused - no equivalent on WINDOWS32.  */
+    unsigned char d_type;
+    char d_name[NAME_MAX+1]; /* must come last due to dir.c assumptions.  */
+  };
+
+typedef struct dir_struct
+  {
+    ULONG   dir_ulCookie;
+    HANDLE  dir_hDirHandle;
+    DWORD   dir_nNumFiles;
+    char    dir_pDirectoryName[NAME_MAX+1];
+    struct dirent dir_sdReturn;
+  } DIR;
+
+DIR *opendir(const char *);
+struct dirent *readdir(DIR *);
+void rewinddir(DIR *);
+void closedir(DIR *);
+void seekdir(DIR *, long);
+
+#endif  /* !__MINGW32__ */
+#endif
diff --git a/src/w32/include/dlfcn.h b/src/w32/include/dlfcn.h
new file mode 100644 (file)
index 0000000..00d1d7d
--- /dev/null
@@ -0,0 +1,29 @@
+/* dlfcn.h replacement for MS-Windows build.
+Copyright (C) 2013-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef DLFCN_H
+#define DLFCN_H
+
+#define RTLD_LAZY   1
+#define RTLD_NOW    2
+#define RTLD_GLOBAL 4
+
+extern void *dlopen (const char *, int);
+extern void *dlsym (void *, const char *);
+extern char *dlerror (void);
+extern int   dlclose (void *);
+
+#endif  /* DLFCN_H */
diff --git a/src/w32/include/pathstuff.h b/src/w32/include/pathstuff.h
new file mode 100644 (file)
index 0000000..63f4325
--- /dev/null
@@ -0,0 +1,25 @@
+/* Definitions for Windows path manipulation.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _PATHSTUFF_H
+#define _PATHSTUFF_H
+
+char *convert_Path_to_windows32(char *Path, char to_delim);
+char *convert_vpath_to_windows32(char *Path, char to_delim);
+char *w32ify(const char *file, int resolve);
+char *getcwd_fs(char *buf, int len);
+
+#endif
diff --git a/src/w32/include/sub_proc.h b/src/w32/include/sub_proc.h
new file mode 100644 (file)
index 0000000..8ab9353
--- /dev/null
@@ -0,0 +1,64 @@
+/* Definitions for Windows process invocation.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef SUB_PROC_H
+#define SUB_PROC_H
+
+/*
+ * Component Name:
+ *
+ * $Date$
+ *
+ * $Source$
+ *
+ * $Id$
+ */
+
+#define EXTERN_DECL(entry, args) extern entry args
+#define VOID_DECL void
+
+EXTERN_DECL(HANDLE process_init, (VOID_DECL));
+EXTERN_DECL(HANDLE process_init_fd, (HANDLE stdinh, HANDLE stdouth,
+                                     HANDLE stderrh));
+EXTERN_DECL(long process_begin, (HANDLE proc, char **argv, char **envp,
+                                 char *exec_path, char *as_user));
+EXTERN_DECL(long process_pipe_io, (HANDLE proc, char *stdin_data,
+                                   int stdin_data_len));
+EXTERN_DECL(long process_file_io, (HANDLE proc));
+EXTERN_DECL(void process_cleanup, (HANDLE proc));
+EXTERN_DECL(HANDLE process_wait_for_any, (int block, DWORD* pdwWaitStatus));
+EXTERN_DECL(void process_register, (HANDLE proc));
+EXTERN_DECL(HANDLE process_easy, (char** argv, char** env,
+                                  int outfd, int errfd));
+EXTERN_DECL(BOOL process_kill, (HANDLE proc, int signal));
+EXTERN_DECL(BOOL process_table_full, (VOID_DECL));
+EXTERN_DECL(int process_table_usable_size, (VOID_DECL));
+EXTERN_DECL(int process_table_actual_size, (VOID_DECL));
+EXTERN_DECL(DWORD process_set_handles, (HANDLE *handles));
+EXTERN_DECL(DWORD process_wait_for_multiple_objects, (DWORD, const HANDLE*, BOOL, DWORD));
+
+/* support routines */
+EXTERN_DECL(long process_errno, (HANDLE proc));
+EXTERN_DECL(long process_last_err, (HANDLE proc));
+EXTERN_DECL(long process_exit_code, (HANDLE proc));
+EXTERN_DECL(long process_signal, (HANDLE proc));
+EXTERN_DECL(char * process_outbuf, (HANDLE proc));
+EXTERN_DECL(char * process_errbuf, (HANDLE proc));
+EXTERN_DECL(int process_outcnt, (HANDLE proc));
+EXTERN_DECL(int process_errcnt, (HANDLE proc));
+EXTERN_DECL(void process_pipes, (HANDLE proc, int pipes[3]));
+
+#endif
diff --git a/src/w32/include/w32err.h b/src/w32/include/w32err.h
new file mode 100644 (file)
index 0000000..f3ca50c
--- /dev/null
@@ -0,0 +1,26 @@
+/* Definitions for Windows error handling.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _W32ERR_H_
+#define _W32ERR_H_
+
+#ifndef EXTERN_DECL
+#define EXTERN_DECL(entry, args) entry args
+#endif
+
+EXTERN_DECL(const char * map_windows32_error_to_string, (DWORD error));
+
+#endif /* !_W32ERR_H */
diff --git a/src/w32/pathstuff.c b/src/w32/pathstuff.c
new file mode 100644 (file)
index 0000000..99b6a3f
--- /dev/null
@@ -0,0 +1,266 @@
+/* Path conversion for Windows pathnames.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+#include <string.h>
+#include <stdlib.h>
+#include "pathstuff.h"
+
+/*
+ * Convert delimiter separated vpath to Canonical format.
+ */
+char *
+convert_vpath_to_windows32(char *Path, char to_delim)
+{
+    char *etok;            /* token separator for old Path */
+
+        /*
+         * Convert all spaces to delimiters. Note that pathnames which
+         * contain blanks get trounced here. Use 8.3 format as a workaround.
+         */
+        for (etok = Path; etok && *etok; etok++)
+                if (ISBLANK ((unsigned char) *etok))
+                        *etok = to_delim;
+
+        return (convert_Path_to_windows32(Path, to_delim));
+}
+
+/*
+ * Convert delimiter separated path to Canonical format.
+ */
+char *
+convert_Path_to_windows32(char *Path, char to_delim)
+{
+    char *etok;            /* token separator for old Path */
+    char *p;            /* points to element of old Path */
+
+    /* is this a multi-element Path ? */
+    /* FIXME: Perhaps use ":;\"" in strpbrk to convert all quotes to
+       delimiters as well, as a way to handle quoted directories in
+       PATH?  */
+    for (p = Path, etok = strpbrk(p, ":;");
+         etok;
+         etok = strpbrk(p, ":;"))
+        if ((etok - p) == 1) {
+            if (*(etok - 1) == ';' ||
+                *(etok - 1) == ':') {
+                etok[-1] = to_delim;
+                etok[0] = to_delim;
+                p = ++etok;
+                continue;    /* ignore empty bucket */
+            } else if (!isalpha ((unsigned char) *p)) {
+                /* found one to count, handle things like '.' */
+                *etok = to_delim;
+                p = ++etok;
+            } else if ((*etok == ':') && ((etok = strpbrk(etok+1, ":;")) != NULL)) {
+                /* found one to count, handle drive letter */
+                *etok = to_delim;
+                p = ++etok;
+            } else
+                /* all finished, force abort */
+                p += strlen(p);
+        } else if (*p == '"') { /* a quoted directory */
+            for (p++; *p && *p != '"'; p++) /* skip quoted part */
+                ;
+            etok = strpbrk(p, ":;");        /* find next delimiter */
+            if (etok) {
+                *etok = to_delim;
+                p = ++etok;
+            } else
+                p += strlen(p);
+        } else {
+            /* found another one, no drive letter */
+            *etok = to_delim;
+            p = ++etok;
+        }
+
+    return Path;
+}
+
+/*
+ * Convert to forward slashes. Resolve to full pathname optionally
+ */
+char *
+w32ify(const char *filename, int resolve)
+{
+    static char w32_path[FILENAME_MAX];
+    char *p;
+
+    if (resolve)
+        _fullpath(w32_path, filename, sizeof (w32_path));
+    else
+        strncpy(w32_path, filename, sizeof (w32_path));
+
+    for (p = w32_path; p && *p; p++)
+        if (*p == '\\')
+            *p = '/';
+
+    return w32_path;
+}
+
+char *
+getcwd_fs(char* buf, int len)
+{
+        char *p = getcwd(buf, len);
+
+        if (p) {
+                char *q = w32ify(buf, 0);
+                strncpy(buf, q, len);
+        }
+
+        return p;
+}
+
+#ifdef unused
+/*
+ * Convert delimiter separated pathnames (e.g. PATH) or single file pathname
+ * (e.g. c:/foo, c:\bar) to NutC format. If we are handed a string that
+ * _NutPathToNutc() fails to convert, just return the path we were handed
+ * and assume the caller will know what to do with it (It was probably
+ * a mistake to try and convert it anyway due to some of the bizarre things
+ * that might look like pathnames in makefiles).
+ */
+char *
+convert_path_to_nutc(char *path)
+{
+    int  count;            /* count of path elements */
+    char *nutc_path;     /* new NutC path */
+    int  nutc_path_len;    /* length of buffer to allocate for new path */
+    char *pathp;        /* pointer to nutc_path used to build it */
+    char *etok;            /* token separator for old path */
+    char *p;            /* points to element of old path */
+    char sep;            /* what flavor of separator used in old path */
+    char *rval;
+
+    /* is this a multi-element path ? */
+    for (p = path, etok = strpbrk(p, ":;"), count = 0;
+         etok;
+         etok = strpbrk(p, ":;"))
+        if ((etok - p) == 1) {
+            if (*(etok - 1) == ';' ||
+                *(etok - 1) == ':') {
+                p = ++etok;
+                continue;    /* ignore empty bucket */
+            } else if (etok = strpbrk(etok+1, ":;"))
+                /* found one to count, handle drive letter */
+                p = ++etok, count++;
+            else
+                /* all finished, force abort */
+                p += strlen(p);
+        } else
+            /* found another one, no drive letter */
+            p = ++etok, count++;
+
+    if (count) {
+        count++;    /* x1;x2;x3 <- need to count x3 */
+
+        /*
+         * Hazard a guess on how big the buffer needs to be.
+         * We have to convert things like c:/foo to /c=/foo.
+         */
+        nutc_path_len = strlen(path) + (count*2) + 1;
+        nutc_path = xmalloc(nutc_path_len);
+        pathp = nutc_path;
+        *pathp = '\0';
+
+        /*
+         * Loop through PATH and convert one elemnt of the path at at
+         * a time. Single file pathnames will fail this and fall
+         * to the logic below loop.
+         */
+        for (p = path, etok = strpbrk(p, ":;");
+             etok;
+             etok = strpbrk(p, ":;")) {
+
+            /* don't trip up on device specifiers or empty path slots */
+            if ((etok - p) == 1)
+                if (*(etok - 1) == ';' ||
+                    *(etok - 1) == ':') {
+                    p = ++etok;
+                    continue;
+                } else if ((etok = strpbrk(etok+1, ":;")) == NULL)
+                    break;    /* thing found was a WINDOWS32 pathname */
+
+            /* save separator */
+            sep = *etok;
+
+            /* terminate the current path element -- temporarily */
+            *etok = '\0';
+
+#ifdef __NUTC__
+            /* convert to NutC format */
+            if (_NutPathToNutc(p, pathp, 0) == FALSE) {
+                free(nutc_path);
+                rval = savestring(path, strlen(path));
+                return rval;
+            }
+#else
+            *pathp++ = '/';
+            *pathp++ = p[0];
+            *pathp++ = '=';
+            *pathp++ = '/';
+            strcpy(pathp, &p[2]);
+#endif
+
+            pathp += strlen(pathp);
+            *pathp++ = ':';     /* use Unix style path separtor for new path */
+            *pathp   = '\0'; /* make sure we are null terminaed */
+
+            /* restore path separator */
+            *etok = sep;
+
+            /* point p to first char of next path element */
+            p = ++etok;
+
+        }
+    } else {
+        nutc_path_len = strlen(path) + 3;
+        nutc_path = xmalloc(nutc_path_len);
+        pathp = nutc_path;
+        *pathp = '\0';
+        p = path;
+    }
+
+    /*
+      * OK, here we handle the last element in PATH (e.g. c of a;b;c)
+     * or the path was a single filename and will be converted
+     * here. Note, testing p here assures that we don't trip up
+     * on paths like a;b; which have trailing delimiter followed by
+     * nothing.
+     */
+    if (*p != '\0') {
+#ifdef __NUTC__
+        if (_NutPathToNutc(p, pathp, 0) == FALSE) {
+            free(nutc_path);
+            rval = savestring(path, strlen(path));
+            return rval;
+        }
+#else
+        *pathp++ = '/';
+        *pathp++ = p[0];
+        *pathp++ = '=';
+        *pathp++ = '/';
+        strcpy(pathp, &p[2]);
+#endif
+    } else
+        *(pathp-1) = '\0'; /* we're already done, don't leave trailing : */
+
+    rval = savestring(nutc_path, strlen(nutc_path));
+    free(nutc_path);
+    return rval;
+}
+
+#endif
diff --git a/src/w32/subproc/misc.c b/src/w32/subproc/misc.c
new file mode 100644 (file)
index 0000000..af5567c
--- /dev/null
@@ -0,0 +1,83 @@
+/* Process handling for Windows
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <windows.h>
+#include "proc.h"
+
+
+/*
+ * Description:  Convert a NULL string terminated UNIX environment block to
+ *              an environment block suitable for a windows32 system call
+ *
+ * Returns:  TRUE= success, FALSE=fail
+ *
+ * Notes/Dependencies:  the environment block is sorted in case-insensitive
+ *      order, is double-null terminated, and is a char *, not a char **
+ */
+int _cdecl compare(const void *a1, const void *a2)
+{
+        return _stricoll(*((char**)a1),*((char**)a2));
+}
+bool_t
+arr2envblk(char **arr, char **envblk_out, size_t *envsize_needed)
+{
+        char **tmp;
+        size_t size_needed;
+        int arrcnt;
+        char *ptr;
+
+        arrcnt = 0;
+        while (arr[arrcnt]) {
+                arrcnt++;
+        }
+
+        tmp = (char**) calloc(arrcnt + 1, sizeof(char *));
+        if (!tmp) {
+                return FALSE;
+        }
+
+        arrcnt = 0;
+        size_needed = *envsize_needed = 0;
+        while (arr[arrcnt]) {
+                tmp[arrcnt] = arr[arrcnt];
+                size_needed += strlen(arr[arrcnt]) + 1;
+                arrcnt++;
+        }
+        size_needed++;
+        *envsize_needed = size_needed;
+
+        qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare);
+
+        ptr = *envblk_out = calloc(size_needed, 1);
+        if (!ptr) {
+                free(tmp);
+                return FALSE;
+        }
+
+        arrcnt = 0;
+        while (tmp[arrcnt]) {
+                strcpy(ptr, tmp[arrcnt]);
+                ptr += strlen(tmp[arrcnt]) + 1;
+                arrcnt++;
+        }
+
+        free(tmp);
+        return TRUE;
+}
diff --git a/src/w32/subproc/proc.h b/src/w32/subproc/proc.h
new file mode 100644 (file)
index 0000000..d9f6406
--- /dev/null
@@ -0,0 +1,29 @@
+/* Definitions for Windows
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef  _PROC_H
+#define _PROC_H
+
+typedef int bool_t;
+
+#define E_SCALL         101
+#define E_IO            102
+#define E_NO_MEM        103
+#define E_FORK          104
+
+extern bool_t arr2envblk(char **arr, char **envblk_out, size_t *envsize_needed);
+
+#endif
diff --git a/src/w32/subproc/sub_proc.c b/src/w32/subproc/sub_proc.c
new file mode 100644 (file)
index 0000000..c0c4f44
--- /dev/null
@@ -0,0 +1,1564 @@
+/* Process handling for Windows.
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <io.h>         /* for _get_osfhandle */
+#ifdef _MSC_VER
+# include <stddef.h>    /* for intptr_t */
+#else
+# include <stdint.h>
+#endif
+#include <string.h>
+#include <process.h>  /* for msvc _beginthreadex, _endthreadex */
+#include <signal.h>
+#include <windows.h>
+
+#include "makeint.h"
+#include "filedef.h"
+#include "variable.h"
+#include "sub_proc.h"
+#include "proc.h"
+#include "w32err.h"
+#include "debug.h"
+#include "os.h"
+
+#define GMAKE_MAXIMUM_WAIT_OBJECTS (MAXIMUM_WAIT_OBJECTS * MAXIMUM_WAIT_OBJECTS)
+
+/* We need to move these special-case return codes out-of-band */
+#define GMAKE_WAIT_TIMEOUT      0xFFFF0102L
+#define GMAKE_WAIT_ABANDONED_0  0x00080000L
+
+static char *make_command_line(char *shell_name, char *exec_path, char **argv);
+
+typedef struct sub_process_t {
+        intptr_t sv_stdin[2];
+        intptr_t sv_stdout[2];
+        intptr_t sv_stderr[2];
+        int using_pipes;
+        char *inp;
+        DWORD incnt;
+        char * volatile outp;
+        volatile DWORD outcnt;
+        char * volatile errp;
+        volatile DWORD errcnt;
+        pid_t pid;
+        int exit_code;
+        int signal;
+        long last_err;
+        long lerrno;
+} sub_process;
+
+/* keep track of children so we can implement a waitpid-like routine */
+static sub_process *proc_array[GMAKE_MAXIMUM_WAIT_OBJECTS];
+static unsigned int proc_index = 0;
+static unsigned int fake_exits_pending = 0;
+
+/*
+ * Address the scalability limit intrisic to WaitForMultipleOjects by
+ * calling WaitForMultipleObjects on 64 element chunks of the input
+ * array with 0 timeout.  Exit with an appropriately conditioned result
+ * or repeat again every 10 ms if no handle has signaled and the
+ * requested timeout was not zero.
+ */
+DWORD process_wait_for_multiple_objects(
+  DWORD nCount,
+  const HANDLE *lpHandles,
+  BOOL bWaitAll,
+  DWORD dwMilliseconds
+)
+{
+  assert(nCount <= GMAKE_MAXIMUM_WAIT_OBJECTS);
+
+  if (nCount <= MAXIMUM_WAIT_OBJECTS) {
+    DWORD retVal =  WaitForMultipleObjects(nCount, lpHandles, bWaitAll, dwMilliseconds);
+    return (retVal == WAIT_TIMEOUT) ? GMAKE_WAIT_TIMEOUT : retVal;
+  } else {
+    for (;;) {
+      DWORD objectCount = nCount;
+      int blockCount  = 0;
+      DWORD retVal;
+
+      assert(bWaitAll == FALSE); /* This logic only works for this use case */
+      assert(dwMilliseconds == 0 || dwMilliseconds == INFINITE); /* No support for timeouts */
+
+      for (; objectCount > 0; blockCount++) {
+        DWORD n = objectCount <= MAXIMUM_WAIT_OBJECTS ? objectCount : MAXIMUM_WAIT_OBJECTS;
+        objectCount -= n;
+        retVal = WaitForMultipleObjects(n, &lpHandles[blockCount * MAXIMUM_WAIT_OBJECTS],
+                                            FALSE, 0);
+        switch (retVal) {
+          case WAIT_TIMEOUT:
+            retVal = GMAKE_WAIT_TIMEOUT;
+            continue;
+            break;
+          case WAIT_FAILED:
+            fprintf(stderr,"WaitForMultipleOjbects failed waiting with error %lu\n", GetLastError());
+            break;
+          default:
+            if (retVal >= WAIT_ABANDONED_0) {
+              assert(retVal < WAIT_ABANDONED_0 + MAXIMUM_WAIT_OBJECTS);
+              retVal += blockCount * MAXIMUM_WAIT_OBJECTS - WAIT_ABANDONED_0 + GMAKE_WAIT_ABANDONED_0;
+            } else {
+              assert(retVal < WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS);
+              retVal += blockCount * MAXIMUM_WAIT_OBJECTS;
+            }
+            break;
+        }
+
+        return retVal;
+
+      }
+
+      if (dwMilliseconds == 0) return retVal;
+
+      Sleep(10);  /* Sleep for 10 ms */
+    }
+  }
+}
+
+/*
+ * Fill a HANDLE list with handles to wait for.
+ */
+DWORD
+process_set_handles(HANDLE *handles)
+{
+    DWORD count = 0;
+    unsigned int i;
+
+    /* Build array of handles to wait for */
+    for (i = 0; i < proc_index; i++) {
+        /* Don't wait on child processes that have already finished */
+        if (fake_exits_pending && proc_array[i]->exit_code)
+            continue;
+
+        handles[count++] = (HANDLE) proc_array[i]->pid;
+    }
+
+    return count;
+}
+
+/*
+ * When a process has been waited for, adjust the wait state
+ * array so that we don't wait for it again
+ */
+static void
+process_adjust_wait_state(sub_process* pproc)
+{
+        unsigned int i;
+
+        if (!proc_index)
+                return;
+
+        for (i = 0; i < proc_index; i++)
+                if (proc_array[i]->pid == pproc->pid)
+                        break;
+
+        if (i < proc_index) {
+                proc_index--;
+                if (i != proc_index)
+                        memmove(&proc_array[i], &proc_array[i+1],
+                                (proc_index-i) * sizeof(sub_process*));
+                proc_array[proc_index] = NULL;
+        }
+}
+
+/*
+ * Waits for any of the registered child processes to finish.
+ */
+static sub_process *
+process_wait_for_any_private(int block, DWORD* pdwWaitStatus)
+{
+        HANDLE handles[GMAKE_MAXIMUM_WAIT_OBJECTS];
+        DWORD retval, which;
+        unsigned int i;
+
+        if (!proc_index)
+                return NULL;
+
+        /* build array of handles to wait for */
+        for (i = 0; i < proc_index; i++) {
+                handles[i] = (HANDLE) proc_array[i]->pid;
+
+                if (fake_exits_pending && proc_array[i]->exit_code)
+                        break;
+        }
+
+        /* wait for someone to exit */
+        if (!fake_exits_pending) {
+                retval = process_wait_for_multiple_objects(proc_index, handles, FALSE, (block ? INFINITE : 0));
+                which = retval - WAIT_OBJECT_0;
+        } else {
+                fake_exits_pending--;
+                retval = !WAIT_FAILED;
+                which = i;
+        }
+
+        /* If the pointer is not NULL, set the wait status result variable. */
+        if (pdwWaitStatus)
+                *pdwWaitStatus = (retval == GMAKE_WAIT_TIMEOUT) ? WAIT_TIMEOUT : retval;
+
+        /* return pointer to process */
+        if ((retval == GMAKE_WAIT_TIMEOUT) || (retval == WAIT_FAILED)) {
+                return NULL;
+        }
+        else {
+                sub_process* pproc = proc_array[which];
+                process_adjust_wait_state(pproc);
+                return pproc;
+        }
+}
+
+/*
+ * Terminate a process.
+ */
+BOOL
+process_kill(HANDLE proc, int signal)
+{
+        sub_process* pproc = (sub_process*) proc;
+        pproc->signal = signal;
+        return (TerminateProcess((HANDLE) pproc->pid, signal));
+}
+
+/*
+ * Returns true when we have no more available slots in our process table.
+ */
+BOOL
+process_table_full()
+{
+  extern int shell_function_pid;
+
+  /* Reserve slots for jobserver_semaphore if we have one and the shell function if not active */
+  return(proc_index >= GMAKE_MAXIMUM_WAIT_OBJECTS - jobserver_enabled() - (shell_function_pid == 0));
+}
+
+/*
+ * Returns the maximum number of job slots we can support when using the jobserver.
+ */
+int
+process_table_usable_size()
+{
+  /* Reserve slots for jobserver_semaphore and shell function */
+  return(GMAKE_MAXIMUM_WAIT_OBJECTS - 2);
+}
+
+/*
+ * Returns the actual size of the process table.
+ */
+int
+process_table_actual_size()
+{
+  return(GMAKE_MAXIMUM_WAIT_OBJECTS);
+}
+
+/*
+ * Use this function to register processes you wish to wait for by
+ * calling process_file_io(NULL) or process_wait_any(). This must be done
+ * because it is possible for callers of this library to reuse the same
+ * handle for multiple processes launches :-(
+ */
+void
+process_register(HANDLE proc)
+{
+  assert(proc_index < GMAKE_MAXIMUM_WAIT_OBJECTS);
+  proc_array[proc_index++] = (sub_process *) proc;
+}
+
+/*
+ * Public function which works kind of like waitpid(). Wait for any
+ * of the children to die and return results. To call this function,
+ * you must do 1 of things:
+ *
+ *      x = process_easy(...);
+ *
+ * or
+ *
+ *      x = process_init_fd();
+ *      process_register(x);
+ *
+ * or
+ *
+ *      x = process_init();
+ *      process_register(x);
+ *
+ * You must NOT then call process_pipe_io() because this function is
+ * not capable of handling automatic notification of any child
+ * death.
+ */
+
+HANDLE
+process_wait_for_any(int block, DWORD* pdwWaitStatus)
+{
+        sub_process* pproc = process_wait_for_any_private(block, pdwWaitStatus);
+
+        if (!pproc)
+                return NULL;
+        else {
+                /*
+                 * Ouch! can't tell caller if this fails directly. Caller
+                 * will have to use process_last_err()
+                 */
+                (void) process_file_io(pproc);
+                return ((HANDLE) pproc);
+        }
+}
+
+long
+process_signal(HANDLE proc)
+{
+        if (proc == INVALID_HANDLE_VALUE) return 0;
+        return (((sub_process *)proc)->signal);
+}
+
+long
+process_last_err(HANDLE proc)
+{
+        if (proc == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE;
+        return (((sub_process *)proc)->last_err);
+}
+
+long
+process_exit_code(HANDLE proc)
+{
+        if (proc == INVALID_HANDLE_VALUE) return EXIT_FAILURE;
+        return (((sub_process *)proc)->exit_code);
+}
+
+/*
+2006-02:
+All the following functions are currently unused.
+All of them would crash gmake if called with argument INVALID_HANDLE_VALUE.
+Hence whoever wants to use one of this functions must invent and implement
+a reasonable error handling for this function.
+
+char *
+process_outbuf(HANDLE proc)
+{
+        return (((sub_process *)proc)->outp);
+}
+
+char *
+process_errbuf(HANDLE proc)
+{
+        return (((sub_process *)proc)->errp);
+}
+
+int
+process_outcnt(HANDLE proc)
+{
+        return (((sub_process *)proc)->outcnt);
+}
+
+int
+process_errcnt(HANDLE proc)
+{
+        return (((sub_process *)proc)->errcnt);
+}
+
+void
+process_pipes(HANDLE proc, int pipes[3])
+{
+        pipes[0] = ((sub_process *)proc)->sv_stdin[0];
+        pipes[1] = ((sub_process *)proc)->sv_stdout[0];
+        pipes[2] = ((sub_process *)proc)->sv_stderr[0];
+        return;
+}
+*/
+
+        HANDLE
+process_init()
+{
+        sub_process *pproc;
+        /*
+         * open file descriptors for attaching stdin/stdout/sterr
+         */
+        HANDLE stdin_pipes[2];
+        HANDLE stdout_pipes[2];
+        HANDLE stderr_pipes[2];
+        SECURITY_ATTRIBUTES inherit;
+        BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
+
+        pproc = malloc(sizeof(*pproc));
+        memset(pproc, 0, sizeof(*pproc));
+
+        /* We can't use NULL for lpSecurityDescriptor because that
+           uses the default security descriptor of the calling process.
+           Instead we use a security descriptor with no DACL.  This
+           allows nonrestricted access to the associated objects. */
+
+        if (!InitializeSecurityDescriptor((PSECURITY_DESCRIPTOR)(&sd),
+                                          SECURITY_DESCRIPTOR_REVISION)) {
+                pproc->last_err = GetLastError();
+                pproc->lerrno = E_SCALL;
+                return((HANDLE)pproc);
+        }
+
+        inherit.nLength = sizeof(inherit);
+        inherit.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)(&sd);
+        inherit.bInheritHandle = TRUE;
+
+        /* By convention, parent gets pipe[0], and child gets pipe[1].
+           This means the READ side of stdin pipe goes into pipe[1] and the
+           WRITE side of the stdout and stderr pipes go into pipe[1].  */
+        if (CreatePipe( &stdin_pipes[1], &stdin_pipes[0], &inherit, 0) == FALSE ||
+        CreatePipe( &stdout_pipes[0], &stdout_pipes[1], &inherit, 0) == FALSE ||
+        CreatePipe( &stderr_pipes[0], &stderr_pipes[1], &inherit, 0) == FALSE) {
+
+                pproc->last_err = GetLastError();
+                pproc->lerrno = E_SCALL;
+                return((HANDLE)pproc);
+        }
+
+        /* Mark the parent sides of the pipes as non-inheritable.  */
+        if (SetHandleInformation(stdin_pipes[0],
+                                HANDLE_FLAG_INHERIT, 0) == FALSE ||
+                SetHandleInformation(stdout_pipes[0],
+                                HANDLE_FLAG_INHERIT, 0) == FALSE ||
+                SetHandleInformation(stderr_pipes[0],
+                                HANDLE_FLAG_INHERIT, 0) == FALSE) {
+
+                pproc->last_err = GetLastError();
+                pproc->lerrno = E_SCALL;
+                return((HANDLE)pproc);
+        }
+        pproc->sv_stdin[0]  = (intptr_t) stdin_pipes[0];
+        pproc->sv_stdin[1]  = (intptr_t) stdin_pipes[1];
+        pproc->sv_stdout[0] = (intptr_t) stdout_pipes[0];
+        pproc->sv_stdout[1] = (intptr_t) stdout_pipes[1];
+        pproc->sv_stderr[0] = (intptr_t) stderr_pipes[0];
+        pproc->sv_stderr[1] = (intptr_t) stderr_pipes[1];
+
+        pproc->using_pipes = 1;
+
+        pproc->lerrno = 0;
+
+        return((HANDLE)pproc);
+}
+
+
+        HANDLE
+process_init_fd(HANDLE stdinh, HANDLE stdouth, HANDLE stderrh)
+{
+        sub_process *pproc;
+
+        pproc = malloc(sizeof(*pproc));
+        if (pproc) {
+                memset(pproc, 0, sizeof(*pproc));
+
+                /*
+                 * Just pass the provided file handles to the 'child
+                 * side' of the pipe, bypassing pipes altogether.
+                 */
+                pproc->sv_stdin[1]  = (intptr_t) stdinh;
+                pproc->sv_stdout[1] = (intptr_t) stdouth;
+                pproc->sv_stderr[1] = (intptr_t) stderrh;
+
+                pproc->last_err = pproc->lerrno = 0;
+        }
+
+        return((HANDLE)pproc);
+}
+
+
+static HANDLE
+find_file(const char *exec_path, const char *path_var,
+          char *full_fname, DWORD full_len)
+{
+        HANDLE exec_handle;
+        char *fname;
+        char *ext;
+        DWORD req_len;
+        int i;
+        static const char *extensions[] =
+          /* Should .com come before no-extension case?  */
+          { ".exe", ".cmd", ".bat", "", ".com", NULL };
+
+        fname = xmalloc(strlen(exec_path) + 5);
+        strcpy(fname, exec_path);
+        ext = fname + strlen(fname);
+
+        for (i = 0; extensions[i]; i++) {
+                strcpy(ext, extensions[i]);
+                if (((req_len = SearchPath (path_var, fname, NULL, full_len,
+                                            full_fname, NULL)) > 0
+                     /* For compatibility with previous code, which
+                        used OpenFile, and with Windows operation in
+                        general, also look in various default
+                        locations, such as Windows directory and
+                        Windows System directory.  Warning: this also
+                        searches PATH in the Make's environment, which
+                        might not be what the Makefile wants, but it
+                        seems to be OK as a fallback, after the
+                        previous SearchPath failed to find on child's
+                        PATH.  */
+                     || (req_len = SearchPath (NULL, fname, NULL, full_len,
+                                               full_fname, NULL)) > 0)
+                    && req_len <= full_len
+                    && (exec_handle =
+                                CreateFile(full_fname,
+                                           GENERIC_READ,
+                                           FILE_SHARE_READ | FILE_SHARE_WRITE,
+                                           NULL,
+                                           OPEN_EXISTING,
+                                           FILE_ATTRIBUTE_NORMAL,
+                                           NULL)) != INVALID_HANDLE_VALUE) {
+                        free(fname);
+                        return(exec_handle);
+                }
+        }
+
+        free(fname);
+        return INVALID_HANDLE_VALUE;
+}
+
+/*
+ * Return non-zero of FNAME specifies a batch file and its name
+ * includes embedded whitespace.
+ */
+
+static int
+batch_file_with_spaces(const char *fname)
+{
+        size_t fnlen = strlen(fname);
+
+        return (fnlen > 4
+                && (_strnicmp(fname + fnlen - 4, ".bat", 4) == 0
+                    || _strnicmp(fname + fnlen - 4, ".cmd", 4) == 0)
+                /* The set of characters in the 2nd arg to strpbrk
+                   should be the same one used by make_command_line
+                   below to decide whether an argv[] element needs
+                   quoting.  */
+                && strpbrk(fname, " \t") != NULL);
+}
+
+
+/*
+ * Description:   Create the child process to be helped
+ *
+ * Returns: success <=> 0
+ *
+ * Notes/Dependencies:
+ */
+long
+process_begin(
+        HANDLE proc,
+        char **argv,
+        char **envp,
+        char *exec_path,
+        char *as_user)
+{
+        sub_process *pproc = (sub_process *)proc;
+        char *shell_name = 0;
+        int file_not_found=0;
+        HANDLE exec_handle;
+        char exec_fname[MAX_PATH];
+        const char *path_var = NULL;
+        char **ep;
+        char buf[MAX_PATH];
+        DWORD bytes_returned;
+        DWORD flags;
+        char *command_line;
+        STARTUPINFO startInfo;
+        PROCESS_INFORMATION procInfo;
+        char *envblk=NULL;
+        size_t envsize_needed = 0;
+        int pass_null_exec_path = 0;
+
+        /*
+         *  Shell script detection...  if the exec_path starts with #! then
+         *  we want to exec shell-script-name exec-path, not just exec-path
+         *  NT doesn't recognize #!/bin/sh or #!/etc/Tivoli/bin/perl.  We do not
+         *  hard-code the path to the shell or perl or whatever:  Instead, we
+         *  assume it's in the path somewhere (generally, the NT tools
+         *  bin directory)
+         */
+
+        /* Use the Makefile's value of PATH to look for the program to
+           execute, because it could be different from Make's PATH
+           (e.g., if the target sets its own value.  */
+        if (envp)
+                for (ep = envp; *ep; ep++) {
+                        if (strncmp (*ep, "PATH=", 5) == 0
+                            || strncmp (*ep, "Path=", 5) == 0) {
+                                path_var = *ep + 5;
+                                break;
+                        }
+                }
+        exec_handle = find_file(exec_path, path_var,
+                                exec_fname, sizeof(exec_fname));
+
+        /*
+         * If we couldn't open the file, just assume that Windows will be
+         * somehow able to find and execute it.  If the first character
+         * of the command is '/', assume they set SHELL to a Unixy shell
+         * that have some magic mounts known only to it, and run the whole
+         * command via $SHELL -c "COMMAND" instead.
+         */
+        if (exec_handle == INVALID_HANDLE_VALUE) {
+                if (exec_path[0] == '/') {
+                        char *new_argv0;
+                        char **argvi = argv;
+                        size_t arglen = 0;
+
+                        strcpy(buf, variable_expand ("$(SHELL)"));
+                        shell_name = &buf[0];
+                        strcpy(exec_fname, "-c");
+                        /* Construct a single command string in argv[0].  */
+                        while (*argvi) {
+                                arglen += strlen(*argvi) + 1;
+                                argvi++;
+                        }
+                        new_argv0 = xmalloc(arglen + 1);
+                        new_argv0[0] = '\0';
+                        for (argvi = argv; *argvi; argvi++) {
+                                strcat(new_argv0, *argvi);
+                                strcat(new_argv0, " ");
+                        }
+                        /* Remove the extra blank at the end.  */
+                        new_argv0[arglen-1] = '\0';
+                        free(argv[0]);
+                        argv[0] = new_argv0;
+                        argv[1] = NULL;
+                }
+                else
+                        file_not_found++;
+        }
+        else {
+                /* Attempt to read the first line of the file */
+                if (ReadFile( exec_handle,
+                                buf, sizeof(buf) - 1, /* leave room for trailing NULL */
+                                &bytes_returned, 0) == FALSE || bytes_returned < 2) {
+
+                        pproc->last_err = GetLastError();
+                        pproc->lerrno = E_IO;
+                        CloseHandle(exec_handle);
+                        return(-1);
+                }
+                if (buf[0] == '#' && buf[1] == '!') {
+                        /*
+                         *  This is a shell script...  Change the command line from
+                         *      exec_path args to shell_name exec_path args
+                         */
+                        char *p;
+
+                        /*  Make sure buf is NULL terminated */
+                        buf[bytes_returned] = 0;
+                        /*
+                         * Depending on the file system type, etc. the first line
+                         * of the shell script may end with newline or newline-carriage-return
+                         * Whatever it ends with, cut it off.
+                         */
+                        p= strchr(buf, '\n');
+                        if (p)
+                                *p = 0;
+                        p = strchr(buf, '\r');
+                        if (p)
+                                *p = 0;
+
+                        /*
+                         *  Find base name of shell
+                         */
+                        shell_name = strrchr( buf, '/');
+                        if (shell_name) {
+                                shell_name++;
+                        } else {
+                                shell_name = &buf[2];/* skipping "#!" */
+                        }
+
+                }
+                CloseHandle(exec_handle);
+        }
+
+        flags = 0;
+
+        if (file_not_found)
+                command_line = make_command_line( shell_name, exec_path, argv);
+        else {
+                /* If exec_fname includes whitespace, CreateProcess
+                   behaves erratically and unreliably, and often fails
+                   if argv[0] also includes whitespace (and thus will
+                   be quoted by make_command_line below).  So in that
+                   case, we don't pass exec_fname as the 1st arg to
+                   CreateProcess, but instead replace argv[0] with
+                   exec_fname (to keep its leading directories and
+                   extension as found by find_file), and pass NULL to
+                   CreateProcess as its 1st arg.  This works around
+                   the bugs in CreateProcess, which are probably
+                   caused by its passing the command to cmd.exe with
+                   some incorrect quoting.  */
+                if (!shell_name
+                    && batch_file_with_spaces(exec_fname)
+                    && _stricmp(exec_path, argv[0]) == 0) {
+                        char *new_argv, *p;
+                        char **argvi;
+                        size_t arglen;
+                        int i;
+                        pass_null_exec_path = 1;
+                        /* Rewrite argv[] replacing argv[0] with exec_fname.  */
+                        for (argvi = argv + 1, arglen = strlen(exec_fname) + 1;
+                             *argvi;
+                             argvi++) {
+                                arglen += strlen(*argvi) + 1;
+                        }
+                        new_argv = xmalloc(arglen);
+                        p = strcpy(new_argv, exec_fname) + strlen(exec_fname) + 1;
+                        for (argvi = argv + 1, i = 1; *argvi; argvi++, i++) {
+                                strcpy(p, *argvi);
+                                argv[i] = p;
+                                p += strlen(*argvi) + 1;
+                        }
+                        argv[i] = NULL;
+                        free (argv[0]);
+                        argv[0] = new_argv;
+                }
+                command_line = make_command_line( shell_name, exec_fname, argv);
+        }
+
+        if ( command_line == NULL ) {
+                pproc->last_err = 0;
+                pproc->lerrno = E_NO_MEM;
+                return(-1);
+        }
+
+        if (envp) {
+                if (arr2envblk(envp, &envblk, &envsize_needed) == FALSE) {
+                        pproc->lerrno = E_NO_MEM;
+                        free( command_line );
+                        if ((pproc->last_err == ERROR_INVALID_PARAMETER
+                             || pproc->last_err == ERROR_MORE_DATA)
+                            && envsize_needed > 32*1024) {
+                                fprintf (stderr, "CreateProcess failed, probably because environment is too large (%Iu bytes).\n",
+                                         envsize_needed);
+                        }
+                        pproc->last_err = 0;
+                        return(-1);
+                }
+        }
+
+        if (shell_name || file_not_found || pass_null_exec_path) {
+                exec_path = 0;  /* Search for the program in %Path% */
+        } else {
+                exec_path = exec_fname;
+        }
+
+        /*
+         *  Set up inherited stdin, stdout, stderr for child
+         */
+        memset(&startInfo, '\0', sizeof(startInfo));
+        GetStartupInfo(&startInfo);
+        startInfo.dwFlags = STARTF_USESTDHANDLES;
+        startInfo.lpReserved = 0;
+        startInfo.cbReserved2 = 0;
+        startInfo.lpReserved2 = 0;
+        startInfo.hStdInput = (HANDLE)pproc->sv_stdin[1];
+        startInfo.hStdOutput = (HANDLE)pproc->sv_stdout[1];
+        startInfo.hStdError = (HANDLE)pproc->sv_stderr[1];
+
+        if (as_user) {
+                free(envblk);
+                return -1;
+        } else {
+                DB (DB_JOBS, ("CreateProcess(%s,%s,...)\n",
+                        exec_path ? exec_path : "NULL",
+                        command_line ? command_line : "NULL"));
+                if (CreateProcess(
+                        exec_path,
+                        command_line,
+                        NULL,
+                        0, /* default security attributes for thread */
+                        TRUE, /* inherit handles (e.g. helper pipes, oserv socket) */
+                        flags,
+                        envblk,
+                        0, /* default starting directory */
+                        &startInfo,
+                        &procInfo) == FALSE) {
+
+                        pproc->last_err = GetLastError();
+                        pproc->lerrno = E_FORK;
+                        fprintf(stderr, "process_begin: CreateProcess(%s, %s, ...) failed.\n",
+                                exec_path ? exec_path : "NULL", command_line);
+                        free(envblk);
+                        free( command_line );
+                        return(-1);
+                }
+        }
+
+        pproc->pid = (pid_t)procInfo.hProcess;
+        /* Close the thread handle -- we'll just watch the process */
+        CloseHandle(procInfo.hThread);
+
+        /* Close the halves of the pipes we don't need */
+        if ((HANDLE)pproc->sv_stdin[1] != INVALID_HANDLE_VALUE)
+          CloseHandle((HANDLE)pproc->sv_stdin[1]);
+        if ((HANDLE)pproc->sv_stdout[1] != INVALID_HANDLE_VALUE)
+          CloseHandle((HANDLE)pproc->sv_stdout[1]);
+        if ((HANDLE)pproc->sv_stderr[1] != INVALID_HANDLE_VALUE)
+          CloseHandle((HANDLE)pproc->sv_stderr[1]);
+        pproc->sv_stdin[1] = 0;
+        pproc->sv_stdout[1] = 0;
+        pproc->sv_stderr[1] = 0;
+
+        free( command_line );
+        free(envblk);
+        pproc->lerrno=0;
+        return 0;
+}
+
+
+
+#if 0   /* unused */
+static DWORD
+proc_stdin_thread(sub_process *pproc)
+{
+        DWORD in_done;
+        for (;;) {
+                if (WriteFile( (HANDLE) pproc->sv_stdin[0], pproc->inp, pproc->incnt,
+                                         &in_done, NULL) == FALSE)
+                        _endthreadex(0);
+                /* This if should never be true for anonymous pipes, but gives
+                   us a chance to change I/O mechanisms later.  */
+                if (in_done < pproc->incnt) {
+                        pproc->incnt -= in_done;
+                        pproc->inp += in_done;
+                } else {
+                        _endthreadex(0);
+                }
+        }
+        return 0; /* for compiler warnings only.. not reached.  */
+}
+
+static DWORD
+proc_stdout_thread(sub_process *pproc)
+{
+        DWORD bufsize = 1024;
+        char c;
+        DWORD nread;
+        pproc->outp = malloc(bufsize);
+        if (pproc->outp == NULL)
+                _endthreadex(0);
+        pproc->outcnt = 0;
+
+        for (;;) {
+                if (ReadFile( (HANDLE)pproc->sv_stdout[0], &c, 1, &nread, NULL)
+                                        == FALSE) {
+/*                      map_windows32_error_to_string(GetLastError());*/
+                        _endthreadex(0);
+                }
+                if (nread == 0)
+                        _endthreadex(0);
+                if (pproc->outcnt + nread > bufsize) {
+                        bufsize += nread + 512;
+                        pproc->outp = realloc(pproc->outp, bufsize);
+                        if (pproc->outp == NULL) {
+                                pproc->outcnt = 0;
+                                _endthreadex(0);
+                        }
+                }
+                pproc->outp[pproc->outcnt++] = c;
+        }
+        return 0;
+}
+
+static DWORD
+proc_stderr_thread(sub_process *pproc)
+{
+        DWORD bufsize = 1024;
+        char c;
+        DWORD nread;
+        pproc->errp = malloc(bufsize);
+        if (pproc->errp == NULL)
+                _endthreadex(0);
+        pproc->errcnt = 0;
+
+        for (;;) {
+                if (ReadFile( (HANDLE)pproc->sv_stderr[0], &c, 1, &nread, NULL) == FALSE) {
+                        map_windows32_error_to_string(GetLastError());
+                        _endthreadex(0);
+                }
+                if (nread == 0)
+                        _endthreadex(0);
+                if (pproc->errcnt + nread > bufsize) {
+                        bufsize += nread + 512;
+                        pproc->errp = realloc(pproc->errp, bufsize);
+                        if (pproc->errp == NULL) {
+                                pproc->errcnt = 0;
+                                _endthreadex(0);
+                        }
+                }
+                pproc->errp[pproc->errcnt++] = c;
+        }
+        return 0;
+}
+
+
+/*
+ * Purpose: collects output from child process and returns results
+ *
+ * Description:
+ *
+ * Returns:
+ *
+ * Notes/Dependencies:
+ */
+        long
+process_pipe_io(
+        HANDLE proc,
+        char *stdin_data,
+        int stdin_data_len)
+{
+        sub_process *pproc = (sub_process *)proc;
+        bool_t stdin_eof = FALSE, stdout_eof = FALSE, stderr_eof = FALSE;
+        HANDLE childhand = (HANDLE) pproc->pid;
+        HANDLE tStdin = NULL, tStdout = NULL, tStderr = NULL;
+        unsigned int dwStdin, dwStdout, dwStderr;
+        HANDLE wait_list[4];
+        DWORD wait_count;
+        DWORD wait_return;
+        HANDLE ready_hand;
+        bool_t child_dead = FALSE;
+        BOOL GetExitCodeResult;
+
+        /*
+         *  Create stdin thread, if needed
+         */
+        pproc->inp = stdin_data;
+        pproc->incnt = stdin_data_len;
+        if (!pproc->inp) {
+                stdin_eof = TRUE;
+                CloseHandle((HANDLE)pproc->sv_stdin[0]);
+                pproc->sv_stdin[0] = 0;
+        } else {
+                tStdin = (HANDLE) _beginthreadex( 0, 1024,
+                        (unsigned (__stdcall *) (void *))proc_stdin_thread,
+                                                  pproc, 0, &dwStdin);
+                if (tStdin == 0) {
+                        pproc->last_err = GetLastError();
+                        pproc->lerrno = E_SCALL;
+                        goto done;
+                }
+        }
+
+        /*
+         *   Assume child will produce stdout and stderr
+         */
+        tStdout = (HANDLE) _beginthreadex( 0, 1024,
+                (unsigned (__stdcall *) (void *))proc_stdout_thread, pproc, 0,
+                &dwStdout);
+        tStderr = (HANDLE) _beginthreadex( 0, 1024,
+                (unsigned (__stdcall *) (void *))proc_stderr_thread, pproc, 0,
+                &dwStderr);
+
+        if (tStdout == 0 || tStderr == 0) {
+
+                pproc->last_err = GetLastError();
+                pproc->lerrno = E_SCALL;
+                goto done;
+        }
+
+
+        /*
+         *  Wait for all I/O to finish and for the child process to exit
+         */
+
+        while (!stdin_eof || !stdout_eof || !stderr_eof || !child_dead) {
+                wait_count = 0;
+                if (!stdin_eof) {
+                        wait_list[wait_count++] = tStdin;
+                }
+                if (!stdout_eof) {
+                        wait_list[wait_count++] = tStdout;
+                }
+                if (!stderr_eof) {
+                        wait_list[wait_count++] = tStderr;
+                }
+                if (!child_dead) {
+                        wait_list[wait_count++] = childhand;
+                }
+
+                wait_return = WaitForMultipleObjects(wait_count, wait_list,
+                         FALSE, /* don't wait for all: one ready will do */
+                         child_dead? 1000 :INFINITE); /* after the child dies, subthreads have
+                                one second to collect all remaining output */
+
+                if (wait_return == WAIT_FAILED) {
+/*                      map_windows32_error_to_string(GetLastError());*/
+                        pproc->last_err = GetLastError();
+                        pproc->lerrno = E_SCALL;
+                        goto done;
+                }
+
+                ready_hand = wait_list[wait_return - WAIT_OBJECT_0];
+
+                if (ready_hand == tStdin) {
+                        CloseHandle((HANDLE)pproc->sv_stdin[0]);
+                        pproc->sv_stdin[0] = 0;
+                        CloseHandle(tStdin);
+                        tStdin = 0;
+                        stdin_eof = TRUE;
+
+                } else if (ready_hand == tStdout) {
+
+                        CloseHandle((HANDLE)pproc->sv_stdout[0]);
+                        pproc->sv_stdout[0] = 0;
+                        CloseHandle(tStdout);
+                        tStdout = 0;
+                        stdout_eof = TRUE;
+
+                } else if (ready_hand == tStderr) {
+
+                        CloseHandle((HANDLE)pproc->sv_stderr[0]);
+                        pproc->sv_stderr[0] = 0;
+                        CloseHandle(tStderr);
+                        tStderr = 0;
+                        stderr_eof = TRUE;
+
+                } else if (ready_hand == childhand) {
+
+                        DWORD ierr;
+                        GetExitCodeResult = GetExitCodeProcess(childhand, &ierr);
+                        if (ierr == CONTROL_C_EXIT) {
+                                pproc->signal = SIGINT;
+                        } else {
+                                pproc->exit_code = ierr;
+                        }
+                        if (GetExitCodeResult == FALSE) {
+                                pproc->last_err = GetLastError();
+                                pproc->lerrno = E_SCALL;
+                                goto done;
+                        }
+                        child_dead = TRUE;
+
+                } else {
+
+                        /* ?? Got back a handle we didn't query ?? */
+                        pproc->last_err = 0;
+                        pproc->lerrno = E_FAIL;
+                        goto done;
+                }
+        }
+
+ done:
+        if (tStdin != 0)
+                CloseHandle(tStdin);
+        if (tStdout != 0)
+                CloseHandle(tStdout);
+        if (tStderr != 0)
+                CloseHandle(tStderr);
+
+        if (pproc->lerrno)
+                return(-1);
+        else
+                return(0);
+
+}
+#endif  /* unused */
+
+/*
+ * Purpose: collects output from child process and returns results
+ *
+ * Description:
+ *
+ * Returns:
+ *
+ * Notes/Dependencies:
+ */
+        long
+process_file_io(
+        HANDLE proc)
+{
+        sub_process *pproc;
+        HANDLE childhand;
+        DWORD wait_return;
+        BOOL GetExitCodeResult;
+        DWORD ierr;
+
+        if (proc == NULL)
+                pproc = process_wait_for_any_private(1, 0);
+        else
+                pproc = (sub_process *)proc;
+
+        /* some sort of internal error */
+        if (!pproc)
+                return -1;
+
+        childhand = (HANDLE) pproc->pid;
+
+        /*
+         * This function is poorly named, and could also be used just to wait
+         * for child death if you're doing your own pipe I/O.  If that is
+         * the case, close the pipe handles here.
+         */
+        if (pproc->sv_stdin[0]) {
+                CloseHandle((HANDLE)pproc->sv_stdin[0]);
+                pproc->sv_stdin[0] = 0;
+        }
+        if (pproc->sv_stdout[0]) {
+                CloseHandle((HANDLE)pproc->sv_stdout[0]);
+                pproc->sv_stdout[0] = 0;
+        }
+        if (pproc->sv_stderr[0]) {
+                CloseHandle((HANDLE)pproc->sv_stderr[0]);
+                pproc->sv_stderr[0] = 0;
+        }
+
+        /*
+         *  Wait for the child process to exit
+         */
+
+        wait_return = WaitForSingleObject(childhand, INFINITE);
+
+        if (wait_return != WAIT_OBJECT_0) {
+/*              map_windows32_error_to_string(GetLastError());*/
+                pproc->last_err = GetLastError();
+                pproc->lerrno = E_SCALL;
+                goto done2;
+        }
+
+        GetExitCodeResult = GetExitCodeProcess(childhand, &ierr);
+        if (ierr == CONTROL_C_EXIT) {
+                pproc->signal = SIGINT;
+        } else {
+                pproc->exit_code = ierr;
+        }
+        if (GetExitCodeResult == FALSE) {
+                pproc->last_err = GetLastError();
+                pproc->lerrno = E_SCALL;
+        }
+
+done2:
+        if (pproc->lerrno)
+                return(-1);
+        else
+                return(0);
+
+}
+
+/*
+ * Description:  Clean up any leftover handles, etc.  It is up to the
+ * caller to manage and free the input, output, and stderr buffers.
+ */
+        void
+process_cleanup(
+        HANDLE proc)
+{
+        sub_process *pproc = (sub_process *)proc;
+        int i;
+
+        if (pproc->using_pipes) {
+                for (i= 0; i <= 1; i++) {
+                        if ((HANDLE)pproc->sv_stdin[i]
+                            && (HANDLE)pproc->sv_stdin[i] != INVALID_HANDLE_VALUE)
+                                CloseHandle((HANDLE)pproc->sv_stdin[i]);
+                        if ((HANDLE)pproc->sv_stdout[i]
+                            && (HANDLE)pproc->sv_stdout[i] != INVALID_HANDLE_VALUE)
+                                CloseHandle((HANDLE)pproc->sv_stdout[i]);
+                        if ((HANDLE)pproc->sv_stderr[i]
+                            && (HANDLE)pproc->sv_stderr[i] != INVALID_HANDLE_VALUE)
+                                CloseHandle((HANDLE)pproc->sv_stderr[i]);
+                }
+        }
+        if ((HANDLE)pproc->pid)
+                CloseHandle((HANDLE)pproc->pid);
+
+        free(pproc);
+}
+
+
+/*
+ * Description:
+ *       Create a command line buffer to pass to CreateProcess
+ *
+ * Returns:  the buffer or NULL for failure
+ *      Shell case:  sh_name a:/full/path/to/script argv[1] argv[2] ...
+ *      Otherwise:   argv[0] argv[1] argv[2] ...
+ *
+ * Notes/Dependencies:
+ *   CreateProcess does not take an argv, so this command creates a
+ *   command line for the executable.
+ */
+
+static char *
+make_command_line( char *shell_name, char *full_exec_path, char **argv)
+{
+        int    argc = 0;
+        char** argvi;
+        int*   enclose_in_quotes = NULL;
+        int*   enclose_in_quotes_i;
+        size_t bytes_required = 0;
+        char*  command_line;
+        char*  command_line_i;
+        int have_sh = 0; /* HAVE_CYGWIN_SHELL */
+        int cygwin_mode = 0; /* HAVE_CYGWIN_SHELL */
+
+#ifdef HAVE_CYGWIN_SHELL
+        cygwin_mode = 1;
+#endif
+
+        if (shell_name && full_exec_path) {
+                have_sh = cygwin_mode && strstr(full_exec_path, "sh.exe");
+                bytes_required
+                  = strlen(shell_name) + 1 + strlen(full_exec_path);
+                /*
+                 * Skip argv[0] if any, when shell_name is given.
+                 * The special case of "-c" in full_exec_path means
+                 * argv[0] is not the shell name, but the command string
+                 * to pass to the shell.
+                 */
+                if (*argv && strcmp(full_exec_path, "-c")) argv++;
+                /*
+                 * Add one for the intervening space.
+                 */
+                if (*argv) bytes_required++;
+        }
+
+        argvi = argv;
+        while (*(argvi++)) argc++;
+
+        if (argc) {
+                enclose_in_quotes = (int*) calloc(1, argc * sizeof(int));
+
+                if (!enclose_in_quotes) {
+                        return NULL;
+                }
+        }
+
+        /* We have to make one pass through each argv[i] to see if we need
+         * to enclose it in ", so we might as well figure out how much
+         * memory we'll need on the same pass.
+         */
+
+        argvi = argv;
+        enclose_in_quotes_i = enclose_in_quotes;
+        while(*argvi) {
+                char* p = *argvi;
+                unsigned int backslash_count = 0;
+
+                /*
+                 * We have to enclose empty arguments in ".
+                 */
+                if (!(*p)) *enclose_in_quotes_i = 1;
+
+                while(*p) {
+                        switch (*p) {
+                        case '\"':
+                                /*
+                                 * We have to insert a backslash for each "
+                                 * and each \ that precedes the ".
+                                 */
+                                bytes_required += (backslash_count + 1);
+                                backslash_count = 0;
+                                break;
+
+#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL)
+                        case '\\':
+                                backslash_count++;
+                                break;
+#endif
+        /*
+         * At one time we set *enclose_in_quotes_i for '*' or '?' to suppress
+         * wildcard expansion in programs linked with MSVC's SETARGV.OBJ so
+         * that argv in always equals argv out. This was removed.  Say you have
+         * such a program named glob.exe.  You enter
+         * glob '*'
+         * at the sh command prompt.  Obviously the intent is to make glob do the
+         * wildcarding instead of sh.  If we set *enclose_in_quotes_i for '*' or '?',
+         * then the command line that glob would see would be
+         * glob "*"
+         * and the _setargv in SETARGV.OBJ would _not_ expand the *.
+         */
+                        case ' ':
+                        case '\t':
+                                *enclose_in_quotes_i = 1;
+                                /* fall through */
+
+                        default:
+                                backslash_count = 0;
+                                break;
+                        }
+
+                        /*
+                         * Add one for each character in argv[i].
+                         */
+                        bytes_required++;
+
+                        p++;
+                }
+
+                if (*enclose_in_quotes_i) {
+                        /*
+                         * Add one for each enclosing ",
+                         * and one for each \ that precedes the
+                         * closing ".
+                         */
+                        bytes_required += (backslash_count + 2);
+                }
+
+                /*
+                 * Add one for the intervening space.
+                 */
+                if (*(++argvi)) bytes_required++;
+                enclose_in_quotes_i++;
+        }
+
+        /*
+         * Add one for the terminating NULL.
+         */
+        bytes_required++;
+
+        command_line = (char*) malloc(bytes_required);
+
+        if (!command_line) {
+                free(enclose_in_quotes);
+                return NULL;
+        }
+
+        command_line_i = command_line;
+
+        if (shell_name && full_exec_path) {
+                while(*shell_name) {
+                        *(command_line_i++) = *(shell_name++);
+                }
+
+                *(command_line_i++) = ' ';
+
+                while(*full_exec_path) {
+                        *(command_line_i++) = *(full_exec_path++);
+                }
+
+                if (*argv) {
+                        *(command_line_i++) = ' ';
+                }
+        }
+
+        argvi = argv;
+        enclose_in_quotes_i = enclose_in_quotes;
+
+        while(*argvi) {
+                char* p = *argvi;
+                unsigned int backslash_count = 0;
+
+                if (*enclose_in_quotes_i) {
+                        *(command_line_i++) = '\"';
+                }
+
+                while(*p) {
+                        if (*p == '\"') {
+                                if (cygwin_mode && have_sh) { /* HAVE_CYGWIN_SHELL */
+                                        /* instead of a \", cygwin likes "" */
+                                        *(command_line_i++) = '\"';
+                                } else {
+
+                                /*
+                                 * We have to insert a backslash for the "
+                                 * and each \ that precedes the ".
+                                 */
+                                backslash_count++;
+
+                                while(backslash_count) {
+                                        *(command_line_i++) = '\\';
+                                        backslash_count--;
+                                };
+                                }
+#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL)
+                        } else if (*p == '\\') {
+                                backslash_count++;
+                        } else {
+                                backslash_count = 0;
+#endif
+                        }
+
+                        /*
+                         * Copy the character.
+                         */
+                        *(command_line_i++) = *(p++);
+                }
+
+                if (*enclose_in_quotes_i) {
+#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL)
+                        /*
+                         * Add one \ for each \ that precedes the
+                         * closing ".
+                         */
+                        while(backslash_count--) {
+                                *(command_line_i++) = '\\';
+                        };
+#endif
+                        *(command_line_i++) = '\"';
+                }
+
+                /*
+                 * Append an intervening space.
+                 */
+                if (*(++argvi)) {
+                        *(command_line_i++) = ' ';
+                }
+
+                enclose_in_quotes_i++;
+        }
+
+        /*
+         * Append the terminating NULL.
+         */
+        *command_line_i = '\0';
+
+        free(enclose_in_quotes);
+        return command_line;
+}
+
+/*
+ * Description: Given an argv and optional envp, launch the process
+ *              using the default stdin, stdout, and stderr handles.
+ *              Also, register process so that process_wait_for_any_private()
+ *              can be used via process_file_io(NULL) or
+ *              process_wait_for_any().
+ *
+ * Returns:
+ *
+ * Notes/Dependencies:
+ */
+HANDLE
+process_easy(
+        char **argv,
+        char **envp,
+        int outfd,
+        int errfd)
+{
+  HANDLE hIn = INVALID_HANDLE_VALUE;
+  HANDLE hOut = INVALID_HANDLE_VALUE;
+  HANDLE hErr = INVALID_HANDLE_VALUE;
+  HANDLE hProcess, tmpIn, tmpOut, tmpErr;
+  DWORD e;
+
+  if (process_table_full()) {
+        DB (DB_JOBS, ("process_easy: All process slots used up\n"));
+        return INVALID_HANDLE_VALUE;
+  }
+  /* Standard handles returned by GetStdHandle can be NULL or
+     INVALID_HANDLE_VALUE if the parent process closed them.  If that
+     happens, we open the null device and pass its handle to
+     CreateProcess as the corresponding handle to inherit.  */
+  tmpIn = GetStdHandle(STD_INPUT_HANDLE);
+  if (DuplicateHandle(GetCurrentProcess(),
+                      tmpIn,
+                      GetCurrentProcess(),
+                      &hIn,
+                      0,
+                      TRUE,
+                      DUPLICATE_SAME_ACCESS) == FALSE) {
+    if ((e = GetLastError()) == ERROR_INVALID_HANDLE) {
+      tmpIn = CreateFile("NUL", GENERIC_READ,
+                         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+      if (tmpIn != INVALID_HANDLE_VALUE
+          && DuplicateHandle(GetCurrentProcess(),
+                             tmpIn,
+                             GetCurrentProcess(),
+                             &hIn,
+                             0,
+                             TRUE,
+                             DUPLICATE_SAME_ACCESS) == FALSE)
+        CloseHandle(tmpIn);
+    }
+    if (hIn == INVALID_HANDLE_VALUE) {
+      fprintf(stderr, "process_easy: DuplicateHandle(In) failed (e=%ld)\n", e);
+      return INVALID_HANDLE_VALUE;
+    }
+  }
+  if (outfd >= 0)
+    tmpOut = (HANDLE)_get_osfhandle (outfd);
+  else
+    tmpOut = GetStdHandle (STD_OUTPUT_HANDLE);
+  if (DuplicateHandle(GetCurrentProcess(),
+                      tmpOut,
+                      GetCurrentProcess(),
+                      &hOut,
+                      0,
+                      TRUE,
+                      DUPLICATE_SAME_ACCESS) == FALSE) {
+    if ((e = GetLastError()) == ERROR_INVALID_HANDLE) {
+      tmpOut = CreateFile("NUL", GENERIC_WRITE,
+                          FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+      if (tmpOut != INVALID_HANDLE_VALUE
+          && DuplicateHandle(GetCurrentProcess(),
+                             tmpOut,
+                             GetCurrentProcess(),
+                             &hOut,
+                             0,
+                             TRUE,
+                             DUPLICATE_SAME_ACCESS) == FALSE)
+        CloseHandle(tmpOut);
+    }
+    if (hOut == INVALID_HANDLE_VALUE) {
+      fprintf(stderr, "process_easy: DuplicateHandle(Out) failed (e=%ld)\n", e);
+      return INVALID_HANDLE_VALUE;
+    }
+  }
+  if (errfd >= 0)
+    tmpErr = (HANDLE)_get_osfhandle (errfd);
+  else
+    tmpErr = GetStdHandle(STD_ERROR_HANDLE);
+  if (DuplicateHandle(GetCurrentProcess(),
+                      tmpErr,
+                      GetCurrentProcess(),
+                      &hErr,
+                      0,
+                      TRUE,
+                      DUPLICATE_SAME_ACCESS) == FALSE) {
+    if ((e = GetLastError()) == ERROR_INVALID_HANDLE) {
+      tmpErr = CreateFile("NUL", GENERIC_WRITE,
+                          FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+      if (tmpErr != INVALID_HANDLE_VALUE
+          && DuplicateHandle(GetCurrentProcess(),
+                             tmpErr,
+                             GetCurrentProcess(),
+                             &hErr,
+                             0,
+                             TRUE,
+                             DUPLICATE_SAME_ACCESS) == FALSE)
+        CloseHandle(tmpErr);
+    }
+    if (hErr == INVALID_HANDLE_VALUE) {
+      fprintf(stderr, "process_easy: DuplicateHandle(Err) failed (e=%ld)\n", e);
+      return INVALID_HANDLE_VALUE;
+    }
+  }
+
+  hProcess = process_init_fd(hIn, hOut, hErr);
+
+  if (process_begin(hProcess, argv, envp, argv[0], NULL)) {
+    fake_exits_pending++;
+    /* process_begin() failed: make a note of that.  */
+    if (!((sub_process*) hProcess)->last_err)
+      ((sub_process*) hProcess)->last_err = -1;
+    ((sub_process*) hProcess)->exit_code = process_last_err(hProcess);
+
+    /* close up unused handles */
+    if (hIn != INVALID_HANDLE_VALUE)
+      CloseHandle(hIn);
+    if (hOut != INVALID_HANDLE_VALUE)
+      CloseHandle(hOut);
+    if (hErr != INVALID_HANDLE_VALUE)
+      CloseHandle(hErr);
+  }
+
+  process_register(hProcess);
+
+  return hProcess;
+}
diff --git a/src/w32/subproc/w32err.c b/src/w32/subproc/w32err.c
new file mode 100644 (file)
index 0000000..5ae3043
--- /dev/null
@@ -0,0 +1,85 @@
+/* Error handling for Windows
+Copyright (C) 1996-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stdlib.h>
+#include <windows.h>
+#include "makeint.h"
+#include "w32err.h"
+
+/*
+ * Description: the windows32 version of perror()
+ *
+ * Returns:  a pointer to a static error
+ *
+ * Notes/Dependencies:  I got this from
+ *      comp.os.ms-windows.programmer.win32
+ */
+const char *
+map_windows32_error_to_string (DWORD ercode) {
+/*
+ * We used to have an MSVC-specific '__declspec (thread)' qualifier
+ * here, with the following comment:
+ *
+ * __declspec (thread) necessary if you will use multiple threads on MSVC
+ *
+ * However, Make was never multithreaded on Windows (except when
+ * Ctrl-C is hit, in which case the main thread is stopped
+ * immediately, so it doesn't matter in this context).  The functions
+ * on sub_proc.c that started and stopped additional threads were
+ * never used, and are now #ifdef'ed away.  Until we need more than
+ * one thread, we have no problems with the following buffer being
+ * static.  (If and when we do need it to be in thread-local storage,
+ * the corresponding GCC qualifier is '__thread'.)
+ */
+    static char szMessageBuffer[128];
+        /* Fill message buffer with a default message in
+         * case FormatMessage fails
+         */
+    wsprintf (szMessageBuffer, "Error %ld\n", ercode);
+
+        /*
+         *  Special code for winsock error handling.
+         */
+        if (ercode > WSABASEERR) {
+#if 0
+                HMODULE hModule = GetModuleHandle("wsock32");
+                if (hModule != NULL) {
+                        FormatMessage(FORMAT_MESSAGE_FROM_HMODULE,
+                                hModule,
+                                ercode,
+                                LANG_NEUTRAL,
+                                szMessageBuffer,
+                                sizeof(szMessageBuffer),
+                                NULL);
+                        FreeLibrary(hModule);
+                }
+#else
+                O (fatal, NILF, szMessageBuffer);
+#endif
+        } else {
+                /*
+                 *  Default system message handling
+                 */
+                FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
+                        NULL,
+                        ercode,
+                        LANG_NEUTRAL,
+                        szMessageBuffer,
+                        sizeof(szMessageBuffer),
+                        NULL);
+        }
+    return szMessageBuffer;
+}
diff --git a/src/w32/w32os.c b/src/w32/w32os.c
new file mode 100644 (file)
index 0000000..fe74811
--- /dev/null
@@ -0,0 +1,218 @@
+/* Windows32-based operating system interface for GNU Make.
+Copyright (C) 2016-2020 Free Software Foundation, Inc.
+This file is part of GNU Make.
+
+GNU Make is free software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation; either version 3 of the License, or (at your option) any later
+version.
+
+GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "makeint.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include <windows.h>
+#include <process.h>
+#include <io.h>
+#include "pathstuff.h"
+#include "sub_proc.h"
+#include "w32err.h"
+#include "os.h"
+#include "debug.h"
+
+/* This section provides OS-specific functions to support the jobserver.  */
+
+static char jobserver_semaphore_name[MAX_PATH + 1];
+static HANDLE jobserver_semaphore = NULL;
+
+unsigned int
+jobserver_setup (int slots)
+{
+  /* sub_proc.c is limited in the number of objects it can wait for. */
+
+  if (slots > process_table_usable_size())
+    {
+      slots = process_table_usable_size();
+      DB (DB_JOBS, (_("Jobserver slots limited to %d\n"), slots));
+    }
+
+  sprintf (jobserver_semaphore_name, "gmake_semaphore_%d", _getpid ());
+
+  jobserver_semaphore = CreateSemaphore (
+      NULL,                           /* Use default security descriptor */
+      slots,                          /* Initial count */
+      slots,                          /* Maximum count */
+      jobserver_semaphore_name);      /* Semaphore name */
+
+  if (jobserver_semaphore == NULL)
+    {
+      DWORD err = GetLastError ();
+      const char *estr = map_windows32_error_to_string (err);
+      ONS (fatal, NILF,
+           _("creating jobserver semaphore: (Error %ld: %s)"), err, estr);
+    }
+
+  return 1;
+}
+
+unsigned int
+jobserver_parse_auth (const char *auth)
+{
+  jobserver_semaphore = OpenSemaphore (
+      SEMAPHORE_ALL_ACCESS,   /* Semaphore access setting */
+      FALSE,                  /* Child processes DON'T inherit */
+      auth);                  /* Semaphore name */
+
+  if (jobserver_semaphore == NULL)
+    {
+      DWORD err = GetLastError ();
+      const char *estr = map_windows32_error_to_string (err);
+      fatal (NILF, strlen (auth) + INTSTR_LENGTH + strlen (estr),
+             _("internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"),
+             auth, err, estr);
+    }
+  DB (DB_JOBS, (_("Jobserver client (semaphore %s)\n"), auth));
+
+  return 1;
+}
+
+char *
+jobserver_get_auth ()
+{
+  return xstrdup (jobserver_semaphore_name);
+}
+
+unsigned int
+jobserver_enabled ()
+{
+  return jobserver_semaphore != NULL;
+}
+
+/* Close jobserver semaphore */
+void
+jobserver_clear ()
+{
+  if (jobserver_semaphore != NULL)
+    {
+      CloseHandle (jobserver_semaphore);
+      jobserver_semaphore = NULL;
+    }
+}
+
+void
+jobserver_release (int is_fatal)
+{
+  if (! ReleaseSemaphore (
+          jobserver_semaphore,    /* handle to semaphore */
+          1,                      /* increase count by one */
+          NULL))                  /* not interested in previous count */
+    {
+      if (is_fatal)
+        {
+          DWORD err = GetLastError ();
+          const char *estr = map_windows32_error_to_string (err);
+          ONS (fatal, NILF,
+               _("release jobserver semaphore: (Error %ld: %s)"), err, estr);
+        }
+      perror_with_name ("release_jobserver_semaphore", "");
+    }
+}
+
+unsigned int
+jobserver_acquire_all ()
+{
+  unsigned int tokens = 0;
+  while (1)
+    {
+      DWORD dwEvent = WaitForSingleObject (
+          jobserver_semaphore,    /* Handle to semaphore */
+          0);                     /* DON'T wait on semaphore */
+
+      if (dwEvent != WAIT_OBJECT_0)
+        return tokens;
+
+      ++tokens;
+    }
+}
+
+void
+jobserver_signal ()
+{
+}
+
+void jobserver_pre_child (int recursive)
+{
+}
+
+void jobserver_post_child (int recursive)
+{
+}
+
+void
+jobserver_pre_acquire ()
+{
+}
+
+/* Returns 1 if we got a token, or 0 if a child has completed.
+   The Windows implementation doesn't support load detection.  */
+unsigned int
+jobserver_acquire (int timeout)
+{
+    HANDLE *handles;
+    DWORD dwHandleCount;
+    DWORD dwEvent;
+
+    handles = xmalloc(process_table_actual_size() * sizeof(HANDLE));
+
+    /* Add jobserver semaphore to first slot. */
+    handles[0] = jobserver_semaphore;
+
+    /* Build array of handles to wait for.  */
+    dwHandleCount = 1 + process_set_handles (&handles[1]);
+
+    dwEvent = process_wait_for_multiple_objects (
+        dwHandleCount,  /* number of objects in array */
+        handles,        /* array of objects */
+        FALSE,          /* wait for any object */
+        INFINITE);      /* wait until object is signalled */
+
+    free(handles);
+
+    if (dwEvent == WAIT_FAILED)
+      {
+        DWORD err = GetLastError ();
+        const char *estr = map_windows32_error_to_string (err);
+        ONS (fatal, NILF,
+             _("semaphore or child process wait: (Error %ld: %s)"),
+             err, estr);
+      }
+
+    /* WAIT_OBJECT_0 indicates that the semaphore was signalled.  */
+    return dwEvent == WAIT_OBJECT_0;
+}
+
+void
+fd_inherit(int fd)
+{
+  HANDLE fh = (HANDLE)_get_osfhandle(fd);
+
+  if (fh && fh != INVALID_HANDLE_VALUE)
+        SetHandleInformation(fh, HANDLE_FLAG_INHERIT, 1);
+}
+
+void
+fd_noinherit(int fd)
+{
+  HANDLE fh = (HANDLE)_get_osfhandle(fd);
+
+  if (fh && fh != INVALID_HANDLE_VALUE)
+        SetHandleInformation(fh, HANDLE_FLAG_INHERIT, 0);
+}
diff --git a/strcache.c b/strcache.c
deleted file mode 100644 (file)
index 6dcf2bc..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/* Constant string caching for GNU Make.
-Copyright (C) 2006-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <stddef.h>
-#include <assert.h>
-
-#include "hash.h"
-
-/* A string cached here will never be freed, so we don't need to worry about
-   reference counting.  We just store the string, and then remember it in a
-   hash so it can be looked up again. */
-
-typedef unsigned short int sc_buflen_t;
-
-struct strcache {
-  struct strcache *next;    /* The next block of strings.  Must be first!  */
-  sc_buflen_t end;          /* Offset to the beginning of free space.  */
-  sc_buflen_t bytesfree;    /* Free space left in this buffer.  */
-  sc_buflen_t count;        /* # of strings in this buffer (for stats).  */
-  char buffer[1];           /* The buffer comes after this.  */
-};
-
-/* The size (in bytes) of each cache buffer.
-   Try to pick something that will map well into the heap.
-   This must be able to be represented by a short int (<=65535).  */
-#define CACHE_BUFFER_BASE       (8192)
-#define CACHE_BUFFER_ALLOC(_s)  ((_s) - (2 * sizeof (size_t)))
-#define CACHE_BUFFER_OFFSET     (offsetof (struct strcache, buffer))
-#define CACHE_BUFFER_SIZE(_s)   (CACHE_BUFFER_ALLOC(_s) - CACHE_BUFFER_OFFSET)
-#define BUFSIZE                 CACHE_BUFFER_SIZE (CACHE_BUFFER_BASE)
-
-static struct strcache *strcache = NULL;
-static struct strcache *fullcache = NULL;
-
-static unsigned long total_buffers = 0;
-static unsigned long total_strings = 0;
-static unsigned long total_size = 0;
-
-/* Add a new buffer to the cache.  Add it at the front to reduce search time.
-   This can also increase the overhead, since it's less likely that older
-   buffers will be filled in.  However, GNU make has so many smaller strings
-   that this doesn't seem to be much of an issue in practice.
- */
-static struct strcache *
-new_cache (struct strcache **head, sc_buflen_t buflen)
-{
-  struct strcache *new = xmalloc (buflen + CACHE_BUFFER_OFFSET);
-  new->end = 0;
-  new->count = 0;
-  new->bytesfree = buflen;
-
-  new->next = *head;
-  *head = new;
-
-  ++total_buffers;
-  return new;
-}
-
-static const char *
-copy_string (struct strcache *sp, const char *str, unsigned int len)
-{
-  /* Add the string to this cache.  */
-  char *res = &sp->buffer[sp->end];
-
-  memmove (res, str, len);
-  res[len++] = '\0';
-  sp->end += len;
-  sp->bytesfree -= len;
-  ++sp->count;
-
-  return res;
-}
-
-static const char *
-add_string (const char *str, unsigned int len)
-{
-  const char *res;
-  struct strcache *sp;
-  struct strcache **spp = &strcache;
-  /* We need space for the nul char.  */
-  unsigned int sz = len + 1;
-
-  ++total_strings;
-  total_size += sz;
-
-  /* If the string we want is too large to fit into a single buffer, then
-     no existing cache is large enough.  Add it directly to the fullcache.  */
-  if (sz > BUFSIZE)
-    {
-      sp = new_cache (&fullcache, sz);
-      return copy_string (sp, str, len);
-    }
-
-  /* Find the first cache with enough free space.  */
-  for (; *spp != NULL; spp = &(*spp)->next)
-    if ((*spp)->bytesfree > sz)
-      break;
-  sp = *spp;
-
-  /* If nothing is big enough, make a new cache at the front.  */
-  if (sp == NULL)
-    {
-      sp = new_cache (&strcache, BUFSIZE);
-      spp = &strcache;
-    }
-
-  /* Add the string to this cache.  */
-  res = copy_string (sp, str, len);
-
-  /* If the amount free in this cache is less than the average string size,
-     consider it full and move it to the full list.  */
-  if (total_strings > 20 && sp->bytesfree < (total_size / total_strings) + 1)
-    {
-      *spp = sp->next;
-      sp->next = fullcache;
-      fullcache = sp;
-    }
-
-  return res;
-}
-
-/* For strings too large for the strcache, we just save them in a list.  */
-struct hugestring {
-  struct hugestring *next;  /* The next string.  */
-  char buffer[1];           /* The string.  */
-};
-
-static struct hugestring *hugestrings = NULL;
-
-static const char *
-add_hugestring (const char *str, unsigned int len)
-{
-  struct hugestring *new = xmalloc (sizeof (struct hugestring) + len);
-  memcpy (new->buffer, str, len);
-  new->buffer[len] = '\0';
-
-  new->next = hugestrings;
-  hugestrings = new;
-
-  return new->buffer;
-}
-
-/* Hash table of strings in the cache.  */
-
-static unsigned long
-str_hash_1 (const void *key)
-{
-  return_ISTRING_HASH_1 ((const char *) key);
-}
-
-static unsigned long
-str_hash_2 (const void *key)
-{
-  return_ISTRING_HASH_2 ((const char *) key);
-}
-
-static int
-str_hash_cmp (const void *x, const void *y)
-{
-  return_ISTRING_COMPARE ((const char *) x, (const char *) y);
-}
-
-static struct hash_table strings;
-static unsigned long total_adds = 0;
-
-static const char *
-add_hash (const char *str, unsigned int len)
-{
-  char *const *slot;
-  const char *key;
-
-  /* If it's too large for the string cache, just copy it.
-     We don't bother trying to match these.  */
-  if (len > USHRT_MAX - 1)
-    return add_hugestring (str, len);
-
-  /* Look up the string in the hash.  If it's there, return it.  */
-  slot = (char *const *) hash_find_slot (&strings, str);
-  key = *slot;
-
-  /* Count the total number of add operations we performed.  */
-  ++total_adds;
-
-  if (!HASH_VACANT (key))
-    return key;
-
-  /* Not there yet so add it to a buffer, then into the hash table.  */
-  key = add_string (str, len);
-  hash_insert_at (&strings, key, slot);
-  return key;
-}
-
-/* Returns true if the string is in the cache; false if not.  */
-int
-strcache_iscached (const char *str)
-{
-  struct strcache *sp;
-
-  for (sp = strcache; sp != 0; sp = sp->next)
-    if (str >= sp->buffer && str < sp->buffer + sp->end)
-      return 1;
-  for (sp = fullcache; sp != 0; sp = sp->next)
-    if (str >= sp->buffer && str < sp->buffer + sp->end)
-      return 1;
-
-  {
-    struct hugestring *hp;
-    for (hp = hugestrings; hp != 0; hp = hp->next)
-      if (str == hp->buffer)
-        return 1;
-  }
-
-  return 0;
-}
-
-/* If the string is already in the cache, return a pointer to the cached
-   version.  If not, add it then return a pointer to the cached version.
-   Note we do NOT take control of the string passed in.  */
-const char *
-strcache_add (const char *str)
-{
-  return add_hash (str, strlen (str));
-}
-
-const char *
-strcache_add_len (const char *str, unsigned int len)
-{
-  /* If we're not given a nul-terminated string we have to create one, because
-     the hashing functions expect it.  */
-  if (str[len] != '\0')
-    {
-      char *key = alloca (len + 1);
-      memcpy (key, str, len);
-      key[len] = '\0';
-      str = key;
-    }
-
-  return add_hash (str, len);
-}
-
-void
-strcache_init (void)
-{
-  hash_init (&strings, 8000, str_hash_1, str_hash_2, str_hash_cmp);
-}
-
-
-/* Generate some stats output.  */
-
-void
-strcache_print_stats (const char *prefix)
-{
-  const struct strcache *sp;
-  unsigned long numbuffs = 0, fullbuffs = 0;
-  unsigned long totfree = 0, maxfree = 0, minfree = BUFSIZE;
-
-  if (! strcache)
-    {
-      printf (_("\n%s No strcache buffers\n"), prefix);
-      return;
-    }
-
-  /* Count the first buffer separately since it's not full.  */
-  for (sp = strcache->next; sp != NULL; sp = sp->next)
-    {
-      sc_buflen_t bf = sp->bytesfree;
-
-      totfree += bf;
-      maxfree = (bf > maxfree ? bf : maxfree);
-      minfree = (bf < minfree ? bf : minfree);
-
-      ++numbuffs;
-    }
-  for (sp = fullcache; sp != NULL; sp = sp->next)
-    {
-      sc_buflen_t bf = sp->bytesfree;
-
-      totfree += bf;
-      maxfree = (bf > maxfree ? bf : maxfree);
-      minfree = (bf < minfree ? bf : minfree);
-
-      ++numbuffs;
-      ++fullbuffs;
-    }
-
-  /* Make sure we didn't lose any buffers.  */
-  assert (total_buffers == numbuffs + 1);
-
-  printf (_("\n%s strcache buffers: %lu (%lu) / strings = %lu / storage = %lu B / avg = %lu B\n"),
-          prefix, numbuffs + 1, fullbuffs, total_strings, total_size,
-          (total_size / total_strings));
-
-  printf (_("%s current buf: size = %hu B / used = %hu B / count = %hu / avg = %hu B\n"),
-          prefix, (sc_buflen_t)BUFSIZE, strcache->end, strcache->count,
-          (strcache->end / strcache->count));
-
-  if (numbuffs)
-    {
-      /* Show information about non-current buffers.  */
-      unsigned long sz = total_size - strcache->end;
-      unsigned long cnt = total_strings - strcache->count;
-      sc_buflen_t avgfree = totfree / numbuffs;
-
-      printf (_("%s other used: total = %lu B / count = %lu / avg = %lu B\n"),
-              prefix, sz, cnt, sz / cnt);
-
-      printf (_("%s other free: total = %lu B / max = %lu B / min = %lu B / avg = %hu B\n"),
-              prefix, totfree, maxfree, minfree, avgfree);
-    }
-
-  printf (_("\n%s strcache performance: lookups = %lu / hit rate = %lu%%\n"),
-          prefix, total_adds, (long unsigned)(100.0 * (total_adds - total_strings) / total_adds));
-  fputs (_("# hash-table stats:\n# "), stdout);
-  hash_print_stats (&strings, stdout);
-}
diff --git a/subproc.bat b/subproc.bat
deleted file mode 100644 (file)
index 685ed9d..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-@echo off\r
-rem Copyright (C) 1996-2016 Free Software Foundation, Inc.\r
-rem This file is part of GNU Make.\r
-rem\r
-rem GNU Make is free software; you can redistribute it and/or modify it under\r
-rem the terms of the GNU General Public License as published by the Free\r
-rem Software Foundation; either version 3 of the License, or (at your option)\r
-rem any later version.\r
-rem\r
-rem GNU Make is distributed in the hope that it will be useful, but WITHOUT\r
-rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
-rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.\r
-rem more details.\r
-rem\r
-rem You should have received a copy of the GNU General Public License along\r
-rem with this program.  If not, see <http://www.gnu.org/licenses/>.\r
-\r
-cd w32\subproc\r
-set MAKE=%2\r
-set MAKEFILE=%1\r
-if x%2 == x set MAKE=nmake\r
-%MAKE% /f %MAKEFILE%\r
-if ERRORLEVEL 1 exit /B\r
-cd ..\..\r
diff --git a/tests/COPYING b/tests/COPYING
deleted file mode 100644 (file)
index 94a9ed0..0000000
+++ /dev/null
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/tests/ChangeLog.1 b/tests/ChangeLog.1
deleted file mode 100644 (file)
index 684af03..0000000
+++ /dev/null
@@ -1,1429 +0,0 @@
-2013-10-09  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/patspecific_vars: Typo fixes.
-
-2013-10-05  Paul Smith  <psmith@gnu.org>
-
-       * test_driver.pl (run_all_tests): Rewrite to be more clear.
-       * scripts/features/jobserver: Avoid using $ENV{HOME} as it doesn't
-       exist everywhere.
-       * scripts/features/default_names: End with 1;
-
-       * scripts/features/loadapi: Use new calling signatures.  Verify
-       the NOEXPAND flag works.  Test with all valid function name
-       characters.
-
-2013-09-29  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/SHELL: Solaris /bin/sh can't handle options in
-       multiple words; skip that test.
-       * scripts/targets/ONESHELL: Ditto.
-
-       * scripts/variables/GNUMAKEFLAGS: Verify that GNUMAKEFLAGS is
-       cleared and options are not duplicated.
-
-2013-09-23  Paul Smith  <psmith@gnu.org>
-
-       * scripts/options/print-directory: Rename dash-w to
-       print-directory to avoid conflicts with dash-W on case-insensitive
-       filesystems.
-
-2013-09-22  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/se_implicit: Verify that order-only tokens
-       inside second expansion are parsed correctly.
-       Test for Savannah bug #31155.
-
-       * run_make_tests.pl (set_more_defaults): If we can't find
-       gnumake.h based on the make program we might be running from a
-       remote build directory.  Parse the Makefile for the right path.
-
-       Fix some test issues on Solaris.
-
-       * scripts/features/archives: Determine what output ar gives when
-       adding and replacing objects and compare with that.
-       * scripts/features/escape: Solaris /bin/sh doesn't properly handle
-       backslashes inside single quotes, so don't rely on it.
-       * scripts/features/output-sync: false(1) gives different exit
-       codes on different systems; use "exit 1" instead.
-       * scripts/features/parallelism: Increase the timeout for slower systems.
-
-2013-09-21  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/archives: Some versions of ar (MacOSX) generate
-       different output when creating archives.  Run it and verify the
-       real output.
-       * scripts/features/default_names: MacOSX is, like Windows,
-       case-preserving / case-insensitive.  Redo the test to avoid
-       checking for "UNIX".
-       * test_driver.pl (attach_default_output): Don't dup stdout into
-       stderr.  Reported by Denis Excoffier <bug-tar@Denis-Excoffier.org>
-
-       * scripts/features/se_explicit: Fix a test that behaves
-       differently with/without archive capability enabled.
-       * scripts/features/output-sync: Don't test output-sync if it's not
-       enabled.  We also skip it if parallelism is not enabled, although
-       strictly speaking some of the output-sync tests are valid even
-       without parallelism.
-       * scripts/features/jobserver: Move some tests that require the
-       jobserver from features/parallelism to a separate suite.  Only run
-       this if jobserver mode is enabled.
-
-       * scripts/features/output-sync: Test shell functions writing to
-       stderr in recipes: ensure it's captured via output-sync.  Test
-       output generated while reading makefiles and make sure it's
-       captured via output-sync.  Make sure that fatal errors dump the
-       output so it's not lost.
-
-       * scripts/options/dash-w: Add a test for -w flag.
-
-2013-09-15  Paul Smith  <psmith@gnu.org>
-
-       * scripts/misc/fopen-fail: Check for failure on infinite recursion.
-       * run_make_tests.pl (run_make_test): Allow the answer string to be
-       undef, which means that we shouldn't compare it at all.  Only the
-       exit code matters in this case.
-       * test_driver.pl (compare_output): Ditto.
-       Test for Savannah bug #27374.
-
-       * scripts/features/parallelism: Test broken jobserver on recursion.
-       Test for Savannah bug #39934.
-
-       * scripts/options/eval: Verify --eval during restart.
-       Test for Savannah bug #39203.
-
-2013-09-14  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync: Verify -Orecurse properly.
-
-2013-09-12  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync: Modify for output sync behavior.
-       * scripts/variables/MAKE_RESTARTS: Ditto.
-       * scripts/variables/MAKEFLAGS: Remove mode for --trace.
-       * scripts/variables/GNUMAKEFLAGS: Ditto.
-
-2013-07-22  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/rule_glob: Add tests for wildcards in rules.
-       Test for Savannah bug #39310.
-
-2013-07-09  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/se_implicit: Add a test for SE rules depending
-       on other SE rules to be built.
-
-2013-05-26  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/archives: Test for Savannah bug #38442.
-
-       * scripts/misc/bs-nl: Test for Savannah bug #39035.
-       Add a test for Savannah bug #38945.
-
-2013-05-22  Paul Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-n: Fix results after MAKEFLAGS fixes.
-       * scripts/variables/MAKEFLAGS: Ditto.
-       * scripts/variables/GNUMAKEFLAGS: Ditto.
-
-2013-05-14  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/loadapi: Add plugin_is_GPL_compatible symbol.
-       * scripts/features/load: Ditto.
-
-2013-05-13  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync (output_sync_set): Update for new
-       --trace behavior.
-
-2013-05-05  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync (output_sync_set): Remove
-       extraneous enter/leave lines, which are no longer printed.
-       Add tests for syncing command line printing.
-       (output_sync_set): Rename options: "job"->"line"; "make"->"recurse"
-
-2013-05-04  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/loadapi: Use the new alloc functions.
-
-       * scripts/features/output-sync (output_sync_set): New test for
-       ordered recursive output for -Ojob / -Otarget.
-
-2013-05-03  Eli Zaretskii  <eliz@gnu.org>
-
-       * scripts/features/load: Fix signatures of testload_gmk_setup and
-       explicit_setup, to bring them in line with the documentation.
-
-2013-04-28  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync (output_sync_set): Add tests for
-       the per-job syntax mode.
-       (output_sync_set): Test improved error message location.
-
-2013-04-15  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync (output_sync_set): New arg syntax.
-
-2013-04-14  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/output-sync: Rewrite to be more reliable.
-
-       * test_driver.pl (_run_command): Don't set SIGALRM until after we
-       start the child.  Print errors to the top-level output, which will
-       be stderr.
-       (attach_default_output): Use a list of file handles as the stack.
-       (detach_default_output): Ditto.
-
-       * scripts/features/output-sync: Add a test for output-sync.
-
-2013-02-25  Paul Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (valid_option): Support the -srcdir flag.
-       (set_more_defaults): Set up $srcdir if it's not set yet.
-
-       * scripts/functions/guile: Verify gmk-eval doesn't expand twice.
-       * scripts/features/load: Rework to test just the load capability.
-       * scripts/features/loadapi: New set of tests for the load API.
-
-2013-01-19  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/load: Test loaded files with and without "./"
-       prefix.  Add tests for automatically rebuilding loaded files if
-       they are out of date or non-existent.
-
-2013-01-13  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/archives: Add a check targets that have parens,
-       but are not archives.  See Savannah bug #37878.
-
-       * scripts/options/dash-n: Verify -n is preserved after recursive /
-       re-exec.  See Savannah bug #38051.
-
-2013-01-12  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: Change rule so it doesn't depend
-       on invocation order, etc.
-
-2012-10-29  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/load: New test suite for the "load" directive.
-
-2012-09-09  Paul Smith  <psmith@gnu.org>
-
-       * scripts/functions/file: Get errors in the C locale, not the
-       current locale.  Fixes Savannah bug #35764.
-
-       * scripts/features/escape: Check that backslashes before
-       non-special characters are not removed.
-
-       * scripts/features/utf8: New test for UTF-8 support.
-       See Savannah bug #36529.
-
-       * scripts/targets/POSIX: Add tests for default macro values as
-       specified by IEEE Std 1003.1-2008.  See Savannah bug #37069.
-
-2012-03-04  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/se_explicit: Test $(x:%=%) format in secondary
-       expansion prerequisite lists.  See Savannah bug #16545.
-
-       * scripts/features/escape: Test escaped ":" in prerequisite lists.
-       See Savannah bug #12126.
-
-       * scripts/variables/private: Test appending private variables in
-       pattern-specific target rules.  See Savannah bug #35468.
-
-2012-03-03  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/SHELL: Ensure .SHELLFLAGS works with options
-       separated by whitespace.
-
-       * scripts/targets/ONESHELL: Try .ONESHELL in combination with
-       whitespace-separated options in .SHELLFLAGS.  See Savannah bug #35397.
-
-       * scripts/functions/filter-out: Add filter tests and test escape
-       operations.  See Savannah bug #35410.
-
-       * guile.supp: Suppress valgrind errors from Guile
-       * run_make_tests.pl: Use the Guile suppression file.
-
-       * scripts/misc/bs-nl: Check for POSIX and non-POSIX
-       backslash/newline handling.  Addresses Savannah bug #16670.
-
-2012-01-29  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/flavors: Add tests for ::=
-       * scripts/variables/define: Ditto
-
-       * scripts/functions/file: Test the new $(file ...) function.
-
-2012-01-12  Paul Smith  <psmith@gnu.org>
-
-       * scripts/functions/guile: New regression tests for Guile support.
-
-2011-12-10  Paul Smith  <psmith@gnu.org>
-
-       * scripts/targets/SECONDARY: Add prereq statements to ensure rules
-       are printed in the right order for test #9
-
-2011-11-14  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/double_colon: Check double-colon with escaped
-       filenames.  See Savannah bug #33399.
-
-2011-09-18  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: On re-exec make sure we preserve
-       the value of MAKEFLAGS when necessary.  See Savannah bug #33873.
-
-       * scripts/features/vpath3: Verify handling of -lfoo libraries
-       found via vpath vs. the standard directory search.
-       See Savannah bug #32511.
-
-2011-09-12  Paul Smith  <psmith@gnu.org>
-
-       * scripts/functions/call: Verify that using export in a $(call ...)
-       context creates a global variable.  See Savannah bug #32498.
-
-2011-09-02  Paul Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-n: Verify that in "-n -t", the -n takes
-       priority.  Patch from Michael Witten <mfwitten@gmail.com>.
-
-2011-08-29  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/varnesting: Test resetting of variables while
-       expanding them.  See Savannah patch #7534
-
-2011-06-12  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/archives: Check archives with whitespace at the
-       beginning, end, and extra in the middle.
-       Another test for Savannah bug #30612.
-
-2011-05-07  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/private: Ensure we skip private variables when
-       appending.  Test for Savannah bug #32872.
-
-       * scripts/functions/wildcard: Verify wildcard used to test for
-       file existence/non-existence.
-
-2011-05-02  Paul Smith  <psmith@gnu.org>
-
-       * scripts/functions/sort: Add a test for Savannah bug #33125.
-
-2011-04-17  David A. Wheeler  <dwheeler@dwheeler.com>
-
-       * scripts/features/shell_assignment: Regression for "!=" feature
-
-2010-11-06  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Fix known-good output for BS/NL changes.
-       * scripts/functions/call: Ditto.
-       * scripts/variables/special: Ditto.
-
-       * scripts/misc/bs-nl: New test suite for backslash/newline testing.
-
-2010-08-29  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/errors: Add new error message to output text.
-       * scripts/variables/SHELL: Ditto.
-       * scripts/targets/POSIX: Ditto.
-       * scripts/options/dash-k: Ditto.
-       * scripts/features/vpathplus: Ditto.
-       * scripts/features/patternrules: Ditto.
-       * scripts/features/parallelism: Ditto.
-
-2010-08-13  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/archives: New regression tests for archive
-       support.  Test for fix to Savannah bug #30612.
-
-       * run_make_tests.pl (set_more_defaults): Set a %FEATURES hash to
-       the features available in $(.FEATURES).
-
-2010-08-10  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/reinvoke: Ensure command line variable settings
-       are preserved across make re-exec.  Tests Savannah bug #30723.
-
-2010-07-28  Paul Smith  <psmith@gnu.org>
-
-       * scripts/targets/POSIX: Compatibility issues with Solaris (and
-       Tru64?); "false" returns different exit codes, and set -x shows
-       output with extra whitespace.  Run the commands by hand first to
-       find out what the real shell would do, then compare what make does.
-       * scripts/variables/SHELL: Ditto.
-
-2010-07-12  Paul Smith  <psmith@gnu.org>
-
-       * test_driver.pl: Add a new $perl_name containing the path to Perl.
-       * run_make_tests.pl (run_make_test): Replace the special string
-       #PERL# in a makefile etc. with the path the Perl executable so
-       makefiles can use it.
-
-       * scripts/targets/ONESHELL: Add a new set of regression tests for
-       the .ONESHELL feature.
-
-2010-07-06  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/SHELL: Test the new .SHELLFLAGS variable.
-
-       * scripts/targets/POSIX: New file.  Test the .POSIX special target.
-       Verify that enabling .POSIX changes the shell flags to set -e.
-
-2010-07-01  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/recursion: Add a space to separate command-line
-       args.  Fixes Savannah bug #29968.
-
-2009-11-12  Boris Kolpackov  <boris@codesynthesis.com>
-
-       * scripts/features/vpath3: Test for the new library search
-       behavior.
-
-2009-10-06  Boris Kolpackov  <boris@codesynthesis.com>
-
-       * scripts/features/se_explicit: Enable the test for now fixed
-       Savannah bug 25780.
-
-2009-10-06  Boris Kolpackov  <boris@codesynthesis.com>
-
-       * scripts/variables/undefine: Tests for the new undefine feature.
-
-2009-10-03  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: Test for open Savannah bug #26846.
-
-       * scripts/variables/MAKE: Rewrite for new run_make_test() format.
-
-       * scripts/variables/MAKEFLAGS: Created.
-       Add test for Savannah bug #2216 (still open).
-
-       * scripts/features/include: Test for Savannah bug #102 (still open).
-
-2009-09-30  Boris Kolpackov  <boris@codesynthesis.com>
-
-       * scripts/features/include: Add diagnostics issuing tests for
-       cases where targets have been updated and failed with the
-       dontcare flag. Savannah bugs #15110, #25493, #12686, #17740.
-
-2009-09-28  Paul Smith  <psmith@gnu.org>
-
-       * scripts/functions/shell: Add regression test for Savannah bug
-       #20513 (still open).
-
-       * scripts/features/se_explicit: Add regression tests for Savannah
-       bug #25780 (still open).
-
-       * run_make_tests.pl (valid_option): Add a new flag, -all([-_]?tests)?
-       that runs tests we know will fail.  This allows us to add
-       regression tests to the test suite for bugs that haven't been
-       fixed yet.
-
-2009-09-28  Boris Kolpackov  <boris@codesynthesis.com>
-
-       * scripts/features/patspecific_vars: Add a test for the shortest
-       stem first order.
-
-       * scripts/features/patternrules: Add a test for the shortest stem
-       first order.
-
-2009-09-24  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/se_implicit: Add a test for order-only
-       secondary expansion prerequisites.
-
-2009-09-23  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/patternrules: Test that we can remove pattern
-       rules, both single and multiple prerequisites.  Savannah bug #18622.
-
-       * scripts/features/echoing: Rework for run_make_test().
-
-2009-06-14  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/vpath: Verify we don't get bogus circular
-       dependency warnings if we choose a different file via vpath during
-       update.  Savannah bug #13529.
-
-2009-06-13  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/MAKEFILES: Verify that MAKEFILES included
-       files (and files included by them) don't set the default goal.
-       Savannah bug #13401.
-
-       * scripts/functions/wildcard: Test that wildcards with
-       non-existent glob matchers return empty.
-
-2009-06-09  Paul Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-B: Test the $? works correctly with -B.
-       Savannah bug #17825.
-
-       * scripts/features/patternrules: Test that dependencies of
-       "also_make" targets are created properly.  Savannah bug #19108.
-
-       * test_driver.pl (compare_output): Create a "run" file for failed
-       tests containing the command that was run.
-       (get_runfile): New function.
-
-       * run_make_tests.pl (valid_option): Enhanced support for valgrind:
-       allow memcheck and massif tools.
-
-       * scripts/features/patternrules: Have to comment out a line in the
-       first test due to backing out a change that broke the implicit
-       rule search algorithm.  Savannah bug #17752.
-       * scripts/misc/general4: Remove a test that is redundant with
-       patternrules.
-
-       * scripts/features/parallelism: Add a test for re-exec with
-       jobserver master override.  Savannah bug #18124.
-
-2009-06-08  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Add a test for continued target
-       vars after a semicolon.  Savannah bug #17521.
-
-2009-06-07  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/se_explicit: Make sure we catch defining
-       prereqs during snap_deps().  Savannah bug #24622.
-
-       * scripts/variables/automatic: Check prereq ordering when the
-       target with the recipe has no prereqs.  Savannah bug #21198.
-
-       * scripts/variables/LIBPATTERNS: Add a new set of test for
-       $(.LIBPATTERNS) (previously untested!)
-
-2009-06-04  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/SHELL: The export target-specific SHELL test
-       has an incorrect known-good-value.
-
-       * scripts/misc/general4: Check for whitespace (ffeed, vtab, etc.)
-
-       * scripts/features/se_explicit: Add tests for Savannah bug #24588.
-
-2009-05-31  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/DEFAULT_GOAL: Add tests for Savannah bug #25697.
-
-       * scripts/features/targetvars: Add tests of overrides for Savannah
-       bug #26207.
-       * scripts/features/patspecific_vars: Ditto.
-
-       * scripts/features/patternrules: Add a test for Savannah bug #26593.
-
-2009-05-30  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/flavors: Update with new variable flavor tests.
-       * scripts/variables/define: Create a new set of tests for
-       define/endef and move those aspects of the flavors suite here.
-
-2009-05-25  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Ditto.
-
-       * scripts/features/export: Test new variable parsing abilities.
-
-2009-02-23  Ramon Garcia  <ramon.garcia.f@gmail.com>
-
-       * scripts/variables/private: Create a new suite of tests for 'private'.
-
-2007-11-04  Paul Smith  <psmith@gnu.org>
-
-       * scripts/functions/eval: Update error message for command -> recipe.
-
-       * test_driver.pl (compare_output): Allow the answer to be a regex,
-       if surrounded by '/'.
-       * scripts/misc/close_stdout: Use a regex for the answer, since
-       sometimes the error will have a description and sometimes it won't.
-
-2007-09-10  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/special: Add tests for .RECIPEPREFIX variable.
-
-2007-08-15  Paul Smith  <psmith@gnu.org>
-
-       These test cases were contributed by
-       Icarus Sparry <savannah@icarus.freeuk.com> and J. David Bryan for
-       Savannah bugs #3330 and #15919.
-
-       * scripts/targets/SECONDARY: Add tests for Savannah bugs 3330 and
-       15919.
-
-       * scripts/features/parallelism: Add tests for wrong answer/hang
-       combining INTERMEDIATE, order-only prereqs, and parallelism.
-       See Savannah bugs 3330 and 15919.
-
-2007-07-13  Paul Smith  <psmith@gnu.org>
-
-       Install a timeout so tests can never loop infinitely.
-       Original idea and patch for a single-test version provided by
-       Icarus Sparry <savannah@icarus.freeuk.com>
-
-       * test_driver.pl (_run_command): New function: this is called by
-       other functions to actually run a command.  Before we run it,
-       install a SIGALRM handler and set up a timer to go off in the
-       future (default is 5s; this can be overridden by individual tests).
-       (run_command): Call it.
-       (run_command_with_output): Call it.
-
-       * run_make_tests.pl (run_make_with_options): Override the default
-       timeout if the caller requests it.
-       (run_make_test): Pass any timeout override to run_make_with_options.
-
-       * scripts/features/parallelism: Increase the timeout for long tests.
-       * scripts/options/dash-l: Ditto.
-
-2006-10-01  Paul Smith  <psmith@paulandlesley.org>
-
-       * run_make_tests.pl (set_more_defaults): Remove setting of LANG in
-       ENV here.  This doesn't always work.
-       * test_driver.pl (toplevel): Set LC_ALL to 'C' in the make
-       environment.  Fixes Savannah bug #16698.
-
-2006-09-30  Paul Smith  <psmith@paulandlesley.org>
-
-       * scripts/variables/automatic: Add back the test for bug #8154.
-
-2006-04-01  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/realpath: Don't run tests with multiple
-       initial slashes on Windows: those paths mean something different.
-
-2006-03-19  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: Test that the jobserver is
-       properly managed when we have to re-exec the master instance of
-       make.
-
-2006-03-17  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/statipattrules: Add tests for bug #16053.
-
-2006-03-09  Paul Smith  <psmith@gnu.org>
-
-       * scripts/features/escape: Use "pre:" not "p:" to avoid conflicts
-       with DOS drive letters.  Fixes Savannah bug #15947.
-
-       * test_driver.pl (run_each_test): Set the status properly even
-       when a test fails to execute.  Fixes Savannah bug #15942.
-
-       * scripts/functions/foreach: Use a different environment variable
-       other than PATH to avoid differences with Windows platforms.
-       Fixes Savannah bug #15938.
-
-2006-03-05  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (set_more_defaults): Add CYGWIN_NT as a port
-       type W32.  Fixed Savannah bug #15937.
-
-       * scripts/features/default_names: Don't call error() when the test
-       fails.  Fixes Savannah bug #15941.
-
-2006-02-17  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Test a complex construction which
-       guarantees that we have to merge variable lists of different
-       sizes.  Tests for Savannah bug #15757.
-
-2006-02-15  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/error: Make sure filename/lineno information
-       is related to where the error is expanded, not where it's set.
-       * scripts/functions/warning: Ditto.
-       * scripts/functions/foreach: Check for different error conditions.
-       * scripts/functions/word: Ditto.
-       * scripts/variables/negative: Test some variable reference failure
-       conditions.
-       * scripts/options/warn-undefined-variables: Test the
-       --warn-undefined-variables flag.
-
-2006-02-09  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (set_more_defaults): Update valgrind support
-       for newer versions.
-       * test_driver.pl (toplevel): Skip all hidden files/directories (ones
-       beginning with ".").
-
-       * scripts/functions/andor: Tests for $(and ...) and $(or ...)
-       functions.
-
-2006-02-08  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/parallelism: Add a test for bug #15641.
-
-2006-02-06  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-W: Add a test for bug #15341.
-
-2006-01-03  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/automatic: Add a test for bug #8154.
-
-       * README: Update to reflect the current state of the test suite.
-
-2005-12-12  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism, scripts/functions/wildcard,
-       scripts/targets/FORCE, scripts/targets/PHONY,
-       scripts/targets/SILENT: Use the default setting for
-       $delete_command.  Fixes bug #15085.
-
-       * run_make_tests.pl (get_this_pwd) [VMS]: Use -no_ask with delete_file.
-
-2005-12-11  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/misc/general4: Test implicit rules with '$' in the
-       prereq list & prereq patterns.
-       * scripts/features/se_implicit: Add in .SECONDEXPANSION settings.
-
-2005-12-09  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/patternrules: Add a test for bug #13022.
-
-2005-12-07  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/double_colon: Add a test for bug #14334.
-
-2005-11-17  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/functions/flavor: Add a test for the flavor function.
-
-2005-11-14  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/variables/INCLUDE_DIRS: Add a test for the .INCLUDE_DIRS
-       special variable.
-
-2005-10-24  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/misc/general4: Test '$$' in prerequisites list.
-       * scripts/features/statipattrules: Rewrite to use run_make_test().
-       Add various static pattern info.
-       * scripts/features/se_statpat: Enable .SECONDEXPANSION target.
-       * scripts/features/se_explicit: Add tests for handling '$$' in
-       prerequisite lists with and without setting .SECONDEXPANSION.
-       * scripts/features/order_only: Convert to run_make_test().
-       * run_make_tests.pl (set_more_defaults): If we can't get the value
-       of $(MAKE) from make, then fatal immediately.
-
-2005-08-31  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (get_this_pwd): Require the POSIX module (in
-       an eval to trap errors) and if it exists, use POSIX::getcwd to
-       find the working directory.  If it doesn't exist, go back to the
-       previous methods.  This tries to be more accurate on Windows
-       systems.
-
-2005-08-29  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/abspath: Add some text to the error messages
-       to get a better idea of what's wrong.  Make warnings instead of
-       errors.
-
-       * scripts/features/patspecific_vars: Don't use "test", which is
-       UNIX specific.  Print the values and let the test script match
-       them.
-
-2005-08-25  Paul Smith  <psmith@gnu.org>
-
-       * scripts/variables/SHELL: Use a /./ prefix instead of //: the
-       former works better with non-UNIX environments.  Fixes Savannah
-       bug #14129.
-
-2005-08-13  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/functions/wildcard: Wrap calls to $(wildcard) with
-       $(sort) so that the resulting order is no longer filesystem-
-       dependent.
-
-2005-08-10  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/statipattrules: Add a test for Savannah bug #13881.
-
-2005-08-07  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: Add a test for a bug reported by
-       Michael Matz (matz@suse.de) in which make exits without waiting
-       for all its children in some situations during parallel builds.
-
-2005-07-08  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl: Reset the environment to a clean value every
-       time before we invoke make.  I'm suspicious that the environment
-       isn't handled the same way in Windows as it is in UNIX, and some
-       variables are leaking out beyond the tests they are intended for.
-       Create an %extraENV hash tests can set to add more env. vars.
-       * tests/scripts/features/export: Change to use %extraENV.
-       * tests/scripts/functions/eval: Ditto.
-       * tests/scripts/functions/origin: Ditto.
-       * tests/scripts/options/dash-e: Ditto.
-       * tests/scripts/variables/SHELL: Ditto.
-
-2005-06-27  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-W: Use 'echo >>' instead of touch to update
-       files.
-       * scripts/features/reinvoke: Rewrite to be safer on systems with
-       subsecond timestamps.
-       * scripts/features/patternrules: False exits with different error
-       codes on different systems (for example, Linux => 1, Solaris => 255).
-
-       * scripts/options/dash-W: Set the timestamp to foo.x in the future,
-       to be sure it will be considered updated when it's remade.
-
-2005-06-26  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/shell: New test suite for the shell function.
-
-2005-06-25  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/include: Test include/-include/sinclude with no
-       arguments.  Tests fix for Savannah bug #1761.
-
-       * scripts/misc/general3: Implement comprehensive testing of
-       backslash-newline behavior in command scripts: various types of
-       quoting, fast path / slow path, etc.
-       Tests fix for Savannah bug #1332.
-
-       * scripts/options/symlinks: Test symlinks to non-existent files.
-       Tests fix for Savannah bug #13280.
-
-       * scripts/misc/general3: Test semicolons in variable references.
-       Tests fix for Savannah bug #1454.
-
-       * scripts/variables/MAKE_RESTARTS: New file: test the
-       MAKE_RESTARTS variable.
-       * scripts/options/dash-B: Test re-exec doesn't loop infinitely.
-       Tests fix for Savannah bug #7566.
-       * scripts/options/dash-W: New file: test the -W flag, including
-       re-exec infinite looping.
-
-2005-06-12  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/misc/close_stdout: Add a test for Savannah bug #1328.
-       This test only works on systems that have /dev/full (e.g., Linux).
-
-2005-06-09  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/foreach: Add a test for Savannah bug #11913.
-
-2005-05-31  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/include: Add a test for Savannah bug #13216.
-       * scripts/features/patternrules: Add a test for Savannah bug #13218.
-
-2005-05-13  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/conditionals: Add tests for the new if... else
-       if... endif syntax.
-
-2005-05-03  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/DEFAULT_GOAL: Rename DEFAULT_TARGET to
-       DEFAULT_GOAL.
-
-2005-05-02  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: Add a test for exporting recursive
-       variables containing $(shell) calls.  Rewrite this script to use
-       run_make_test() everywhere.
-
-2005-04-07  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/targets/SECONDARY: Add a test for Savannah bug #12331.
-
-2005-03-15  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/variables/automatic: Add a test for Savannah bug #12320.
-
-2005-03-10  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/patternrules: Add a test for Savannah bug #12267.
-
-2005-03-09  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/variables/DEFAULT_TARGET: Add a test for Savannah
-       bug #12266.
-
-2005-03-04  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/patternrules: Add a test for Savannah bug #12202.
-
-2005-03-03  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/se_implicit: Add a test for stem
-       termination bug. Add a test for stem triple-expansion bug.
-
-       * scripts/features/se_statpat: Add a test for stem
-       triple-expansion bug.
-
-       * scripts/features/statipattrules: Change test #4 to reflect
-       new way empty prerequisite list is handled.
-
-
-2005-03-01  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/statipattrules: Add a test for
-       Savannah bug #12180.
-
-2005-02-28  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-q: Add a test for Savannah bug # 7144.
-
-       * scripts/options/symlinks: New file to test checking of symlink
-       timestamps.  Can't use filename dash-L because it conflicts with
-       dash-l on case-insensitive filesystems.
-
-       * scripts/variables/MAKEFILE_LIST, scripts/variables/MFILE_LIST:
-       Rename MAKEFILE_LIST test to MFILE_LIST, for systems that need 8.3
-       unique filenames.
-
-2005-02-28  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/variables/DEFAULT_TARGET: Test the .DEFAULT_TARGET
-       special variable.
-
-2005-02-27  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/se_explicit: Test the second expansion in
-       explicit rules.
-       * scripts/features/se_implicit: Test the second expansion in
-       implicit rules.
-       * scripts/features/se_statpat: Test the second expansion in
-       static pattern rules.
-       * scripts/variables/automatic: Fix to work with the second
-       expansion.
-
-       * scripts/misc/general4: Add a test for bug #12091.
-
-2005-02-27  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/eval: Check that eval of targets within
-       command scripts fails.  See Savannah bug # 12124.
-
-2005-02-26  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (compare_output): If a basic comparison of the
-       log and answer doesn't match, try harder: change all backslashes
-       to slashes and all CRLF to LF.  This helps on DOS/Windows systems.
-
-2005-02-09  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/recursion: Test command line variable settings:
-       only one instance of a given variable should be provided.
-
-2004-11-30  Boris Kolpackov  <boris@kolpackov.net>
-
-       * tests/scripts/functions/abspath: New file: test `abspath'
-       built-in function.
-
-       * tests/scripts/functions/realpath: New file: test `realpath'
-       built-in function.
-
-2004-11-28  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-C [WINDOWS32]: Add a test for bug #10252;
-       this doesn't really test anything useful in UNIX but...
-
-       * scripts/variables/SHELL: New file: test proper handling of SHELL
-       according to POSIX rules.  Fixes bug #1276.
-
-2004-10-21  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/functions/word: Test $(firstword ) and $(lastword ).
-
-2004-10-05  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/patspecific_vars: Test simple/recursive
-       variable expansion.
-
-2004-09-28  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/include: Test dontcare flag inheritance
-       when rebuilding makefiles.
-
-2004-09-27  Boris Kolpackov  <boris@kolpackov.net>
-
-       * scripts/features/patspecific_vars: Test exported variables.
-
-2004-09-22  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (run_make_test): Don't add newlines to the
-       makestring or answer if they are completely empty.
-
-       * scripts/features/patternrules: Rename from implicit_prereq_eval.
-
-       * scripts/test_template: Rework the template.
-
-2004-09-21  Boris Kolpackov  <boris@kolpackov.net>
-
-       * run_make_tests.pl: Change `#!/usr/local/bin/perl' to be
-       `#!/usr/bin/env perl'.
-
-       * scripts/features/implicit_prereq_eval: Test implicit rule
-       prerequisite evaluation code.
-
-2004-09-21  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (run_make_test): Enhance to allow the make
-       string to be undef: in that case it reuses the previous make
-       string.  Allows multiple tests on the same makefile.
-
-       * scripts/variables/flavors: Add some tests for prefix characters
-       interacting with define/endef variables.
-
-2004-09-20  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/substitution: Rewrite to use run_make_test()
-       interface, and add test for substitution failures reported by
-       Markus Mauhart <qwe123@chello.at>.
-
-2004-03-22  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (run_each_test, toplevel, compare_output): Change
-       to track both the testing categories _AND_ the number of
-       individual tests, and report both sets of numbers.
-
-2004-02-21  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/origin: Set our own environment variable
-       rather than relying on $HOME.
-
-2004-01-21  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/conditionals: Test arguments to ifn?def which
-       contain whitespace (such as a function that is evaluated).  Bug
-       #7257.
-
-2004-01-07  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/order_only: Test order-only prerequisites in
-       pattern rules (patch #2349).
-
-2003-11-02  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/if: Test if on conditionals with trailing
-       whitespace--bug #5798.
-
-       * scripts/functions/eval: Test eval in a non-file context--bug #6195.
-
-2003-04-19  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/patspecific_vars: Test multiple patterns
-       matching the same target--Bug #1405.
-
-2003-04-09  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (set_more_defaults): A new $port_type of
-       'OS/2' for (surprise!) OS/2.  Also choose a wait time of 2 seconds
-       for OS/2.
-
-2003-03-28  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/targets/SECONDARY: Test the "global" .SECONDARY (with
-       not prerequisites)--Bug #2515.
-
-2003-01-30  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Test very long target-specific
-       variable definition lines (longer than the default make buffer
-       length).  Tests patch # 1022.
-
-       * scripts/functions/eval: Test very recursive $(eval ...) calls
-       with simple variable expansion (bug #2238).
-
-       * scripts/functions/word: Test error handling for word and
-       wordlist functions (bug #2407).
-
-2003-01-22  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/call: Test recursive argument masking (bug
-       #1744).
-
-2002-10-25  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/eval: Test using $(eval ...) inside
-       conditionals (Bug #1516).
-
-2002-10-14  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-t: Add a test for handling -t on targets
-       with no commands (Bug #1418).
-
-2002-10-13  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Add a test for exporting
-       target-specific vars (Bug #1391).
-
-2002-10-05  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/automatic: Add tests for $$(@), $${@}, $${@D},
-       and $${@F}.
-
-2002-09-23  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/escape: Test handling of escaped comment
-       characters in targets and prerequisites.
-
-2002-09-18  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/export: Test export/unexport of multiple
-       variables in a single command.
-
-2002-09-17  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Tests for Bug #940: test
-       target-specific and pattern-specific variables in conjunction with
-       double-colon targets.
-
-2002-09-10  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (compare_output): Match the new format for time
-       skew error messages.
-
-       * scripts/features/export: Created.  Add tests for export/unexport
-       capabilities, including exporting/unexporting expanded variables.
-
-       * scripts/features/conditionals: Add a test for expanded variables
-       in ifdef conditionals.
-
-2002-09-04  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/reinvoke: Change touch/sleep combos to utouch
-       invocations.
-       * scripts/features/vpathgpath: Ditto.
-       * scripts/features/vpathplus: Ditto.
-       * scripts/options/dash-n: Ditto.
-       * scripts/targets/INTERMEDIATE: Ditto.
-       * scripts/targets/SECONDARY: Ditto.
-
-       * scripts/options/dash-t: Added a test for the -t bug fixed by
-       Henning Makholm.  This test was also contributed by Henning.
-
-       * scripts/misc/general4: Add a test suite for obscure algorithmic
-       features of make.  First test: make sure creation subdirectories
-       as prerequisites of targets works properly.
-
-       * scripts/misc/version: Remove this bogus test.
-
-2002-08-07  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/misc/general3: Add a test for makefiles that don't end
-       in newlines.
-
-       * scripts/variables/special: Create tests for the special
-       variables (.VARIABLES and .TARGETS).  Comment out .TARGETS test
-       for now as it's not yet supported.
-
-2002-08-01  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-B: Add a test for the new -B option.
-
-2002-07-11  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (valid_option): Add support for Valgrind.  Use
-       -valgrind option to the test suite.
-       (set_more_defaults): Set up the file descriptor to capture
-       Valgrind output.  We have to unset its close-on-exec flag; we
-       hardcode the value for F_SETFD (2) rather than load it; hopefully
-       this will help us avoid breaking the Windows/DOS test suite.
-
-2002-07-10  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/automatic: Add some tests for $$@, $$(@D), and
-       $$(@F).
-
-       * test_driver.pl (utouch): Create a new function that creates a
-       file with a specific timestamp offset.  Use of this function will
-       let us avoid lots of annoying sleep() invocations in the tests
-       just to get proper timestamping, which will make the tests run a
-       lot faster.  So far it's only used in the automatic test suite.
-
-2002-07-09  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/automatic: Create a test for automatic variables.
-
-2002-07-08  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/order_only: Test new order-only prerequisites.
-
-2002-07-07  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/eval: Test new function.
-       * scripts/functions/value: Test new function.
-       * scripts/variables/MAKEFILE_LIST: Test new variable.
-
-2002-04-28  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/call: New test: transitive closure
-       implementation using $(call ...) to test variable recursion.
-
-2002-04-21  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (compare_dir_tree): Ignore CVS and RCS
-       directories in the script directories.
-
-2001-05-02  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/flavors: Test define/endef scripts where only
-       one of the command lines is quiet.
-
-2000-06-22  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-q: New file; test the -q option.  Includes
-       a test for PR/1780.
-
-2000-06-21  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Added a test for PR/1709: allowing
-       semicolons in target-specific variable values.
-
-2000-06-19  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/addsuffix: Test for an empty final argument.
-       Actually this bug might have happened for any function, but this
-       one was handy.
-
-2000-06-17  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * scripts/options/general: If parallel jobs are not supported,
-       expect a warning message from Make.
-
-2000-06-15  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * scripts/options/general: Don't try -jN with N != 1 if parallel
-       jobs are not supported.
-
-2000-05-24  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/general: Test general option processing (PR/1716).
-
-2000-04-11  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/strip: Test empty value to strip (PR/1689).
-
-2000-04-08  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * scripts/features/reinvoke: Sleep before updating the target
-       files in the first test, to ensure its time stamp really gets
-       newer; otherwise Make might re-exec more than once.
-
-2000-04-07  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * scripts/features/double_colon: Don't run the parallel tests if
-       parallel jobs aren't supported.
-
-2000-04-04  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/word: wordlist doesn't swap arguments anymore.
-
-2000-03-27  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/statipattrules: Test that static pattern rules
-       whose prerequisite patterns resolve to empty strings throw an
-       error (instead of dumping core).  Fixes PR/1670.
-
-       * scripts/features/reinvoke: Make more robust by touching "b"
-       first, to ensure it's not newer than "a".
-       Reported by Marco Franzen <Marco.Franzen@Thyron.com>.
-       * scripts/options/dash-n: Ditto.
-
-       * scripts/functions/call: Whoops.  The fix to PR/1527 caused
-       recursive invocations of $(call ...) to break.  I can't come up
-       with any way to get both working at the same time, so I backed out
-       the fix to 1527 and added a test case for recursive calls.  This
-       also tests the fix for PR/1610.
-
-       * scripts/features/double_colon: Test that circular dependencies
-       in double-colon rule sets are detected correctly (PR/1671).
-
-2000-03-26  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/targets/INTERMEDIATE: Test that make doesn't remove
-       .INTERMEDIATE files when given on the command line (PR/1669).
-
-2000-03-08  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-k: Add a test for error detection by
-       multiple targets depending on the same prerequisite with -k.
-       For PR/1634.
-
-2000-02-07  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/escape: Add a test for backslash-escaped spaces
-       in a target name (PR/1586).
-
-2000-02-04  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/patspecific_vars: Add a test for pattern-specific
-       target variables inherited from the parent target (PR/1407).
-
-2000-02-02  Paul D. Smith  <psmith@gnu.org>
-
-       * run_make_tests.pl (set_more_defaults): Hard-code the LANG to C
-       to make sure sorting order, etc. is predictable.
-       Reported by Andreas Jaeger <aj@suse.de>.
-
-       * run_make_tests.pl (set_more_defaults): Set the $wtime variable
-       depending on the OS.  Eli Zaretskii <eliz@is.elta.co.il> reports
-       this seems to need to be *4* on DOS/Windows, not just 2.  Keep it
-       1 for other systems.
-       * scripts/features/vpathplus (touchfiles): Use the $wtime value
-       instead of hardcoding 2.
-       * scripts/targets/SECONDARY: Ditto.
-       * scripts/targets/INTERMEDIATE: Ditto.
-
-2000-01-27  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (toplevel): Don't try to run test scripts which
-       are really directories.
-
-2000-01-23  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/include: Remove a check; the fix caused more
-       problems than the error, so I removed it and removed the test for
-       it.
-
-2000-01-11  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/call: Add a test for PR/1517 and PR/1527: make
-       sure $(call ...) doesn't eval its arguments and that you can
-       invoke foreach from it without looping forever.
-
-1999-12-15  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/targets/INTERMEDIATE: Add a test for PR/1423: make sure
-       .INTERMEDIATE settings on files don't disable them as implicit
-       intermediate possibilities.
-
-1999-12-01  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/double_colon: Add a test for PR/1476: Try
-       double-colon rules as non-goal targets and during parallel builds
-       to make sure they're handled serially.
-
-1999-11-17  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/functions/if: Add a test for PR/1429: put some text
-       after an if-statement to make sure it works.
-
-       * scripts/features/targetvars: Add a test for PR/1380: handling +=
-       in target-specific variable definitions correctly.
-
-1999-10-15  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/variables/MAKEFILES: This was really broken: it didn't
-       test anything at all, really.  Rewrote it, plus added a test for
-       PR/1394.
-
-1999-10-13  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/options/dash-n: Add a test for PR/1379: "-n doesn't
-       behave properly when used with recursive targets".
-
-1999-10-08  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/targetvars: Add a check for PR/1378:
-       "Target-specific vars don't inherit correctly"
-
-1999-09-29  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (get_osname): Change $fancy_file_names to
-       $short_filenames and reverse the logic.
-       (run_each_test): Change test of non-existent $port_host to use
-       $short_filenames--problem reported by Eli Zaretskii.
-
-1999-09-23  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/parallelism: Add a check to ensure that the
-       jobserver works when we re-invoke.  Also cleaned up the tests a
-       little, reducing the number of rules we use so the test won't need
-       as many "sleep" commands.
-
-1999-09-16  Paul D. Smith  <psmith@gnu.org>
-
-       * scripts/features/reinvoke: Remove invocations of "touch" in
-       makefiles.  See the comments on the touch function rewrite below.
-       Note that UNIX touch behaves the same way if the file already
-       exists: it sets the time to the _local_ time.  We don't want
-       this.  This is probably a good tip for makefile writers in
-       general, actually... where practical.
-       * scripts/options/dash-l: Ditto.
-       * scripts/options/dash-n: Ditto.
-
-       * test_driver.pl (run_each_test): In retrospect, I don't like the
-       .lN/.bN/.dN postfix required by DOS.  So, for non-DOS systems I
-       changed it back to use .log, .base, and .diff.
-
-       * run_make_tests.pl (set_more_defaults): Move the check for the
-       make pathname to here from set_defaults (that's too early since it
-       happens before the command line processing).
-       Create a new variable $port_type, calculated from $osname, to
-       specify what kind of system we're running on.  We should integrate
-       the VOS stuff here, too.
-       (valid_option): Comment out the workdir/-work stuff so people
-       won't be fooled into thinking it works... someone needs to fix
-       this, though!
-
-       * scripts/functions/origin: Use $port_type instead of $osname.
-       * scripts/functions/foreach: Ditto.
-       * scripts/features/default_names: Ditto.
-
-1999-09-15  Paul D. Smith  <psmith@gnu.org>
-
-       * test_driver.pl (touch): Rewrite this function.  Previously it
-       used to use utime() to hard-set the time based on the current
-       local clock, or, if the file didn't exist, it merely created it.
-       This mirrors exactly what real UNIX touch does, but it fails badly
-       on networked filesystems where the FS server clock is skewed from
-       the local clock: normally modifying a file causes it to get a mod
-       time based on the _server's_ clock.  Hard-setting it based on the
-       _local_ clock causes gratuitous errors and makes the tests
-       unreliable except on local filesystems.  The new function will
-       simply modify the file, allowing the filesystem to set the mod
-       time as it sees fit.
-
-       * scripts/features/parallelism: The second test output could
-       change depending on how fast some scripts completed; use "sleep"
-       to force the order we want.
-
-       * test_driver.pl (toplevel): A bug in Perl 5.000 to Perl 5.004
-       means that "%ENV = ();" doesn't do the right thing.  This worked
-       in Perl 4 and was fixed in Perl 5.004_01, but use a loop to delete
-       the environment rather than require specific versions.
-
-       * run_make_tests.pl (set_more_defaults): Don't use Perl 5 s///
-       modifier "s", so the tests will run with Perl 4.
-       (set_more_defaults): Set $pure_log to empty if there's no -logfile
-       option in PURIFYOPTIONS.
-       (setup_for_test): Don't remove any logs unless $pure_log is set.
-
-1999-09-15  Eli Zaretskii  <eliz@is.elta.co.il>
-
-       * scripts/features/reinvoke: Put the SHELL definition in the right
-       test makefile.
-
-1999-09-15  Paul D. Smith  <psmith@gnu.org>
-
-       ChangeLog file for the test suite created.
-\f
-
-Copyright (C) 1992-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/tests/NEWS b/tests/NEWS
deleted file mode 100644 (file)
index f55e4ba..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-Changes from 0.4.9 to 3.78 (Sep 6, 1999):
-
-    Lots of new tests.  Renamed to follow the GNU make scheme.  Also
-    added some support for using Purify with make.
-
-    Rob Tulloh contributed some changes to get the test suite running on
-    NT; I tweaked them a bit (hopefully I didn't break anything!)  Note
-    that NT doesn't grok the self-exec funkiness that Unix shells use,
-    so instead I broke that out into a separate shell script
-    "run_make_tests" that invokes perl with the (renamed) script
-    run_make_tests.pl.
-
-    Eli Zaretski contributed changes to get the test suite running on
-    DOS with DJGPP.  I also meddled in these somewhat.
-
-    If you're on DOS or NT you should run "perl.exe run_make_tests.pl ..."
-    If you're on Unix, you can continue to run "./run_make_tests ..." as
-    before.
-
-Changes from 0.4.8 to 0.4.9 (May 14, 1998):
-
-    Release by Paul D. Smith <psmith@baynetworks.com>; I'm the one to
-    blame for problems in this version :).
-
-    Add some perl to test_driver.pl to strip out GNU make clock skew
-    warning messages from the output before comparing it to the
-    known-good output.
-
-    A new test for escaped :'s in filenames (someone on VMS found this
-    didn't work anymore in 3.77): scripts/features/escape.
-
-Changes from 0.4.7 to 0.4.8 (May 14, 1998):
-
-    Release by Paul D. Smith <psmith@baynetworks.com>; I'm the one to
-    blame for problems in this version :).
-
-    New tests for features to be included in GNU make 3.77.
-
-Changes from 0.4.6 to 0.4.7 (August 18, 1997):
-
-    Release by Paul D. Smith <psmith@baynetworks.com>; I'm the one to
-    blame for problems in this version :).
-
-    Reworked some tests to make sure they all work with both perl4 and perl5.
-
-    Work around a bug in perl 5.004 which doesn't clean the environment
-    correctly in all cases (fixed in at least 5.004_02).
-
-    Updated functions/strip to test for newline stripping.
-
-    Keep a $PURIFYOPTIONS env variable if present.
-
-Changes from 0.4.5 to 0.4.6 (April 07, 1997):
-
-    Release by Paul D. Smith <psmith@baynetworks.com>; I'm the one to
-    blame for problems in this version :).
-
-    Updated to work with GNU make 3.76 (and pretests).
-
-    Added new tests and updated existing ones.  Note that the new tests
-    weren't tested with perl 4, however I think they should work.
-
-    Ignore any tests whose filenames end in "~", so that Emacs backup
-    files aren't run.
-
-Changes from 0.4.4 to 0.4.5 (April 29, 1995):
-
-    Updated to be compatible with perl 5.001 as well as 4.036.
-
-    Note: the test suite still won't work on 14-char filesystems
-    (sorry, Kaveh), but I will get to it.
-
-    Also, some tests and stuff still haven't made it in because I
-    haven't had time to write the test scripts for them.  But they,
-    too, will get in eventually.  Contributions of scripts (i.e., tests
-    that I can just drop in) are particularly welcome and will be
-    incorporated immediately.
-
-Changes from 0.4.3 to 0.4.4 (March 1995):
-
-    Updated for changes in make 3.72.12, and to ignore CVS directories
-    (thanks go to Jim Meyering for the patches for this).
-
-    Fixed uname call to not make a mess on BSD/OS 2.0 (whose uname -a
-    is very verbose).  Let me know if this doesn't work correctly on
-    your system.
-
-    Changed to display test name while it is running, not just when it
-    finishes.
-
-    Note: the test suite still won't work on 14-char filesystems
-    (sorry, Kaveh), but I will get to it.
-
-    Also, some tests and stuff still haven't made it in because I
-    haven't had time to write the test scripts for them.  But they,
-    too, will get in eventually.
-
-Changes from 0.4 to 0.4.3 (October 1994):
-
-    Fixed bugs (like dependencies on environment variables).
-
-    Caught up with changes in make.
-
-    The load_limit test should now silently ignore a failure due to
-    make not being able to read /dev/kmem.
-
-    Reorganized tests into subdirs and renamed lots of things so that
-    those poor souls who still have to deal with 14-char filename
-    limits won't hate me any more.  Thanks very much to Kaveh R. Ghazi
-    <ghazi@noc.rutgers.edu> for helping me with the implementation and
-    testing of these changes, and for putting up with all my whining
-    about it...
-
-    Added a $| = 1 so that systems that don't seem to automatically
-    flush their output for some reason will still print all the
-    output.  I'd hate for someone to miss out on the smiley that
-    you're supposed to get when all the tests pass... :-)
-
-Changes from 0.3 to 0.4 (August 1993):
-
-    Lost in the mists of time (and my hurry to get it out before I
-    left my job).
-
-Changes from 0.2 to 0.3 (9-30-92):
-
-    Several tests fixed to match the fact that MAKELEVEL > 0 or -C now
-    imply -w.
-
-    parallel_execution test fixed to not use double colon rules any
-    more since their behavior has changed.
-
-    errors_in_commands test fixed to handle different error messages
-    and return codes from rm.
-
-    Several tests fixed to handle -make_path with a relative path
-    and/or a name other than "make" for make.
-
-    dash-e-option test fixed to use $PATH instead of $USER (since the
-    latter does not exist on some System V systems).  This also
-    removes the dependency on getlogin (which fails under certain
-    weird conditions).
-
-    test_driver_core changed so that you can give a test name like
-    scripts/errors_in_commands and it will be handled correctly (handy
-    if you have a shell with filename completion).
-
-Changes from 0.1 to 0.2 (5-4-92):
-
-    README corrected to require perl 4.019, not 4.010.
-
-    -make_path replaces -old.
-
-    errors_in_commands test updated for change in format introduced in
-    make 3.62.6.
-
-    test_driver_core now uses a better way of figuring what OS it is
-    running on (thanks to meyering@cs.utexas.edu (Jim Meyering) for
-    suggesting this, as well as discovering the hard way that the old
-    way (testing for /mnt) fails on his machine).
-
-    Some new tests were added.
-
-\f
--------------------------------------------------------------------------------
-Copyright (C) 1992-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.
index 0213159f0c224072ce47bd8541e7d0cd03f2c29c..aab3c35373d70d0dc14c5e5d10234ec75ffe59a4 100644 (file)
@@ -7,7 +7,7 @@ This entire test suite, including all test files, are copyright and
 distributed under the following terms:
 
  -----------------------------------------------------------------------------
- Copyright (C) 1992-2016 Free Software Foundation, Inc.
+ Copyright (C) 1992-2020 Free Software Foundation, Inc.
  This file is part of GNU Make.
 
  GNU Make is free software; you can redistribute it and/or modify it under the
diff --git a/tests/config-flags.pm b/tests/config-flags.pm
deleted file mode 100644 (file)
index cc45c6b..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# This is a -*-perl-*- script
-#
-# Set variables that were defined by configure, in case we need them
-# during the tests.
-
-%CONFIG_FLAGS = (
-    AM_LDFLAGS   => '-Wl,--export-dynamic',
-    AR           => 'ar',
-    CC           => 'gcc',
-    CFLAGS       => '-g -O2',
-    CPP          => 'gcc -E',
-    CPPFLAGS     => '',
-    GUILE_CFLAGS => '-pthread -I/usr/include/guile/2.0',
-    GUILE_LIBS   => '-lguile-2.0 -lgc',
-    LDFLAGS      => '',
-    LIBS         => '-ldl '
-);
-
-1;
diff --git a/tests/config-flags.pm.W32 b/tests/config-flags.pm.W32
new file mode 100644 (file)
index 0000000..9d2602b
--- /dev/null
@@ -0,0 +1,9 @@
+# This is a -*-perl-*- script
+#
+# Set variables for Windows systems.
+
+%CONFIG_FLAGS = (
+    USE_SYSTEM_GLOB => 'no'
+);
+
+1;
index 29ba1469a06f6075836f2976c7793f47d1f413d4..90cd98016d41f743ecb7e21b2568140f5237ee93 100644 (file)
@@ -4,16 +4,17 @@
 # during the tests.
 
 %CONFIG_FLAGS = (
-    AM_LDFLAGS   => '@AM_LDFLAGS@',
-    AR           => '@AR@',
-    CC           => '@CC@',
-    CFLAGS       => '@CFLAGS@',
-    CPP          => '@CPP@',
-    CPPFLAGS     => '@CPPFLAGS@',
-    GUILE_CFLAGS => '@GUILE_CFLAGS@',
-    GUILE_LIBS   => '@GUILE_LIBS@',
-    LDFLAGS      => '@LDFLAGS@',
-    LIBS         => '@LIBS@'
+    AM_LDFLAGS      => '@AM_LDFLAGS@',
+    AR              => '@AR@',
+    CC              => '@CC@',
+    CFLAGS          => '@CFLAGS@',
+    CPP             => '@CPP@',
+    CPPFLAGS        => '@CPPFLAGS@',
+    GUILE_CFLAGS    => '@GUILE_CFLAGS@',
+    GUILE_LIBS      => '@GUILE_LIBS@',
+    LDFLAGS         => '@LDFLAGS@',
+    LIBS            => '@LIBS@',
+    USE_SYSTEM_GLOB => '@USE_SYSTEM_GLOB@'
 );
 
 1;
index a4271b61b22dff8a5ee7f52243bfea84c846214c..e7da8ca21c6d08ad98e5788cb626cdb6225d39de 100755 (executable)
@@ -3,7 +3,7 @@ $! config_flags_pm.com  - Build config-flags.pm on VMS.
 $!
 $! Just good enough to run the self tests for now.
 $!
-$! Copyright (C) 2014-2016 Free Software Foundation, Inc.
+$! Copyright (C) 2014-2020 Free Software Foundation, Inc.
 $! This file is part of GNU Make.
 $!
 $! GNU Make is free software; you can redistribute it and/or modify it under
@@ -24,7 +24,7 @@ $ open/read cfpm_in config-flags.pm.in
 $!
 $ outfile = "sys$disk:[]config-flags.pm"
 $!
-$ cflags = "/include=([],[.glob]"
+$ cflags = "/include=([],[.lib]"
 $!
 $ create 'outfile'
 $ open/append cfpm 'outfile'
@@ -42,6 +42,7 @@ $       if key .eqs. "CC" then value = "CC"
 $       if key .eqs. "CPP" then value = "CPP"
 $       if key .eqs. "CFLAGS" then value = cflags
 $       if key .eqs. "GUILE_CFLAGS" then value = cflags
+$       if key .eqs. "USE_SYSTEM_GLOB" then value = "no"
 $       write cfpm part1, value, part2
 $       goto cfpm_read_loop
 $   endif
index 23c7ab0cc6100134a6388dd2c409b2cf9183ceb8..e7533c830d06840b48b373197f3b5d78d9ebdde7 100755 (executable)
@@ -3,7 +3,7 @@
 # Simple script to make a "shadow" test directory, using symbolic links.
 # Typically you'd put the shadow in /tmp or another local disk
 #
-# Copyright (C) 1992-2016 Free Software Foundation, Inc.
+# Copyright (C) 1992-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
diff --git a/tests/run_make_tests.bat b/tests/run_make_tests.bat
new file mode 100644 (file)
index 0000000..45ff930
--- /dev/null
@@ -0,0 +1,21 @@
+@echo off
+rem Copyright (C) 2017-2020 Free Software Foundation, Inc.
+rem This file is part of GNU Make.
+rem
+rem GNU Make is free software; you can redistribute it and/or modify it under
+rem the terms of the GNU General Public License as published by the Free
+rem Software Foundation; either version 3 of the License, or (at your option)
+rem any later version.
+rem
+rem GNU Make is distributed in the hope that it will be useful, but WITHOUT
+rem ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+rem FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for.
+rem more details.
+rem
+rem You should have received a copy of the GNU General Public License along
+rem with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+setlocal
+cd "%~dp0"
+
+perl -I. .\run_make_tests.pl %*
diff --git a/tests/run_make_tests.com b/tests/run_make_tests.com
deleted file mode 100755 (executable)
index de79a91..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-$! Test_make.com
-$!
-$! This is a wrapper for the GNU make perl test programs on VMS.
-$!
-$! Parameter "-help" for description on how to use described below.
-$!
-$! Copyright (C) 2014-2016 Free Software Foundation, Inc.
-$! This file is part of GNU Make.
-$!
-$! GNU Make is free software; you can redistribute it and/or modify it under
-$! the terms of the GNU General Public License as published by the Free Software
-$! Foundation; either version 3 of the License, or (at your option) any later
-$! version.
-$!
-$! GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-$! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-$! FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-$! details.
-$!
-$! You should have received a copy of the GNU General Public License along with
-$! this program.  If not, see <http://www.gnu.org/licenses/>.
-$!
-$!
-$! Allow more than 8 paramters with using commas as a delimiter.
-$!
-$ params = "''p1',''p2',''p3',''p4',''p5',''p6',''p7',''p8'"
-$!
-$ test_flags = ",verbose,detail,keep,usage,help,debug,"
-$ test_flags_len = f$length(test_flags)
-$ verbose_flag = ""
-$ detail_flag = ""
-$ keep_flag = ""
-$ usage_flag = ""
-$ help_flag = ""
-$ debug_flag = ""
-$!
-$ ignored_options = "profile,make,srcdir,valgrind,memcheck,massif,"
-$ ignored_option_len = f$length(ignored_options)
-$!
-$ testname = ""
-$ make :== $bin:make.exe"
-$!
-$ i = 0
-$param_loop:
-$ param = f$element(i, ",", params)
-$ i = i + 1
-$ if param .eqs. "" then goto param_loop
-$ if param .eqs. "," then goto param_loop_end
-$ param_len = f$length(param)
-$ if f$locate("/", param) .lt. param_len
-$ then
-$   if testname .nes. ""
-$   then
-$       write sys$output "Only the last test name specified will be run!"
-$   endif
-$   testname = param
-$   goto param_loop
-$ endif
-$ lc_param = f$edit(param,"LOWERCASE") - "-"
-$ if f$locate(",''lc_param',", ignored_options) .lt. ignored_option_len
-$ then
-$   write sys$output "parameter ''param' is ignored on VMS for now."
-$   goto param_loop
-$ endif
-$ if f$locate(",''lc_param',", test_flags) .lt. test_flags_len
-$ then
-$   'lc_param'_flag = "-" + lc_param
-$   goto param_loop
-$ endif
-$   write sys$output "parameter ''param' is not known to VMS."
-$ goto param_loop
-$!
-$param_loop_end:
-$!
-$no_gnv = 1
-$no_perl = 1
-$!
-$!  Find GNV 2.1.3 + manditory updates
-$!  If properly updated, the GNV$GNU logical name is present.
-$!  Updated GNV utilities have a gnv$ prefix on them.
-$   gnv_root = f$trnlnm("GNV$GNU", "LNM$SYSTEM_TABLE")
-$   if gnv_root .nes. ""
-$   then
-$       no_gnv = 0
-$       ! Check for update ar utility.
-$       new_ar = "gnv$gnu:[usr.bin]gnv$ar.exe"
-$       if f$search(new_ar) .nes. ""
-$       then
-$           ! See if a new port of ar exists.
-$           ar :== $'new_ar'
-$       else
-$           ! Fall back to legacy GNV AR wrapper.
-$           old_ar = "gnv$gnu:[bin]ar.exe"
-$           if f$search(old_ar) .nes. ""
-$           then
-$               ar :== $'old_ar'
-$           else
-$               no_gnv = 1
-$           endif
-$       endif
-$       ! Check for updated bash
-$       if no_gnv .eq. 0
-$       then
-$           new_bash = "gnv$gnu:[bin]gnv$bash.exe"
-$           if f$search(new_bash) .nes. ""
-$           then
-$               bash :== $'new_bash'
-$               sh :== $'new_bash'
-$           else
-$               no_gnv = 1
-$           endif
-$       endif
-$       ! Check for updated coreutils
-$       if no_gnv .eq. 0
-$       then
-$           new_cat = "gnv$gnu:[bin]gnv$cat.exe"
-$           if f$search(new_cat) .nes. ""
-$           then
-$               cat :== $'new_cat'
-$               cp :== $gnv$gnu:[bin]gnv$cp.exe
-$               echo :== $gnv$gnu:[bin]gnv$echo.exe
-$               false :== $gnv$gnu:[bin]gnv$false.exe
-$               true :== $gnv$gnu:[bin]gnv$true.exe
-$               touch :== $gnv$gnu:[bin]gnv$touch.exe
-$               mkdir :== $gnv$gnu:[bin]gnv$mkdir.exe
-$               rm :== $gnv$gnu:[bin]gnv$rm.exe
-$               sleep :== $gnv$gnu:[bin]gnv$sleep.exe
-$           else
-$               no_gnv = 1
-$           endif
-$       endif
-$       ! Check for updated diff utility.
-$       if no_gnv .eq. 0
-$       then
-$           new_diff = "gnv$gnu:[usr.bin]gnv$diff.exe"
-$           if f$search(new_diff) .nes. ""
-$           then
-$               ! See if a new port of diff exists.
-$               diff :== $'new_diff'
-$           else
-$               ! Fall back to legacy GNV diff
-$               old_diff = "gnv$gnu:[bin]diff.exe"
-$               if f$search(old_diff) .nes. ""
-$               then
-$                   diff :== $'old_diff'
-$               else
-$                   no_gnv = 1
-$               endif
-$           endif
-$       endif
-$   endif
-$!
-$if no_gnv
-$then
-$   write sys$output "Could not find an up to date GNV installed!"
-$   help_flag = 1
-$endif
-$!
-$! Find perl 5.18.1 or later.
-$!
-$! look in perl_root:[000000]perl_setup.com
-$ perl_root = f$trnlnm("perl_root")
-$ ! This works with known perl installed from PCSI kits.
-$ if perl_root .nes. ""
-$ then
-$   perl_ver = f$element(1, ".", perl_root)
-$   if f$locate("-", perl_ver) .lt. f$length(perl_ver)
-$   then
-$       no_perl = 0
-$   endif
-$ endif
-$ if no_perl
-$ then
-$!  look for sys$common:[perl-*]perl_setup.com
-$   perl_setup = f$search("sys$common:[perl-*]perl_setup.com")
-$   if perl_setup .eqs. ""
-$   then
-$       if gnv_root .nes. ""
-$       then
-$           gnv_device = f$parse(gnv_root,,,"DEVICE")
-$           perl_templ = "[vms$common.perl-*]perl_setup.com"
-$           perl_search = f$parse(perl_templ, gnv_device)
-$           perl_setup = f$search(perl_search)
-$       endif
-$   endif
-$   if perl_setup .nes. ""
-$   then
-$       @'perl_setup'
-$       no_perl = 0
-$   endif
-$ endif
-$!
-$ if no_perl
-$ then
-$   write sys$output "Could not find an up to date Perl installed!"
-$   help_flag = "-help"
-$ endif
-$!
-$!
-$ if help_flag .nes. ""
-$ then
-$   type sys$input
-$DECK
-This is a test script wrapper for the run_make_tests.pl script.
-
-This wrapper makes sure that the DCL symbols and logical names needed to
-run the perl script are in place.
-
-The test wrapper currently requires that the DCL symbols be global symbols.
-Those symbols will be left behind after the procedure is run.
-
-The PERL_ROOT will be set to a compatible perl if such a perl is found and
-is not the default PERL_ROOT:.  This setting will persist after the test.
-
-This wrapper should be run with the default set to the base directory
-of the make source.
-
-The HELP parameter will bring up this text and then run the help script
-for the Perl wrapper.  Not all options for the perl script have been
-implemented, such as valgrind or specifying the make path or source path.
-
-Running the wrapper script requires:
-  Perl 5.18 or later.
-  PCSI kits available from http://sourceforge.net/projects/vmsperlkit/files/
-
-  GNV 2.1.3 or later.  GNV 3.0.1 has not tested with this script.
-  Bash 4.2.47 or later.
-  Coreutils 8.21 or later.
-  http://sourceforge.net/projects/gnv/files/
-  Read before installing:
-     http://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/
-  As updates for other GNV components get posted, those updates should
-  be used.
-
-$EOD
-$ endif
-$!
-$ if no_gnv .or. no_perl then exit 44
-$!
-$!
-$ default = f$environment("DEFAULT")
-$ default_dev = f$element(0, ":", default) + ":"
-$ this = f$environment("PROCEDURE")
-$ on error then goto all_error
-$ set default 'default_dev''f$parse(this,,,"DIRECTORY")'
-$!
-$! Need to make sure that the config-flags.pm exists.
-$ if f$search("config-flags.pm") .eqs. ""
-$ then
-$   @config_flags_pm.com
-$ endif
-$ define/user bin 'default_dev'[-],gnv$gnu:[bin]
-$ define/user decc$filename_unix_noversion enable
-$ define/user decc$filename_unix_report enable
-$ define/user decc$readdir_dropdotnotype enable
-$ flags = ""
-$ if verbose_flag .nes. "" then flags = verbose_flag
-$ if detail_flag .nes. "" then flags = flags + " " + detail_flag
-$ if keep_flag .nes. "" then flags = flags + " " + keep_flag
-$ if usage_flag .nes. "" then flags = flags + " " + usage_flag
-$ if help_flag .nes. "" then flags = flags + " " + help_flag
-$ if debug_flag .nes. "" then flags = flags + " " + debug_flag
-$ flags = f$edit(flags, "TRIM, COMPRESS")
-$ if testname .nes. ""
-$ then
-$   perl run_make_tests.pl "''testname'" 'flags'
-$ else
-$   perl run_make_tests.pl 'flags'
-$ endif
-$all_error:
-$ set default 'default'
-$!
index 916f3467309bf50bd0a8def8db7d13754b94b2c2..d76e4f3b01a6bfcf10062d88579a04a98dcf3142 100644 (file)
@@ -11,7 +11,7 @@
 #                         [-make <make prog>]
 #                        (and others)
 
-# Copyright (C) 1992-2016 Free Software Foundation, Inc.
+# Copyright (C) 1992-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
 # You should have received a copy of the GNU General Public License along with
 # this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# Add the working directory to @INC and load the test driver
+use FindBin;
+use lib "$FindBin::Bin";
+
+our $testsroot = $FindBin::Bin;
+
+require "test_driver.pl";
+
+use File::Spec;
+
+use Cwd;
+$cwdpath = cwd();
+($cwdvol, $cwddir, $_) = File::Spec->splitpath($cwdpath, 1);
+
+# Some target systems might not have the POSIX module...
+$has_POSIX = eval { require "POSIX.pm" };
+
 %FEATURES = ();
 
 $valgrind = 0;              # invoke make with valgrind
@@ -36,12 +53,29 @@ $massif_args = '--num-callers=15 --tool=massif --alloc-fn=xmalloc --alloc-fn=xca
 $pure_log = undef;
 
 # The location of the GNU make source directory
-$srcdir = '';
+$srcdir = undef;
+$fqsrcdir = undef;
+$srcvol = undef;
+
+# The location of the build directory
+$blddir = undef;
+$fqblddir = undef;
+$bldvol = undef;
+
+$make_path = undef;
+@make_command = ();
 
 $command_string = '';
 
 $all_tests = 0;
 
+# Shell commands
+
+$sh_name = '/bin/sh';
+$is_posix_sh = 1;
+
+$CMD_rmfile = 'rm -f';
+
 # rmdir broken in some Perls on VMS.
 if ($^O eq 'VMS')
 {
@@ -56,13 +90,75 @@ if ($^O eq 'VMS')
   };
 
   *CORE::GLOBAL::rmdir = \&vms_rmdir;
+
+  $CMD_rmfile = 'delete_file -no_ask';
 }
 
-require "test_driver.pl";
-require "config-flags.pm";
+%CONFIG_FLAGS = ();
 
-# Some target systems might not have the POSIX module...
-$has_POSIX = eval { require "POSIX.pm" };
+# Find the strings that will be generated for various error codes.
+# We want them from the C locale regardless of our current locale.
+
+$ERR_no_such_file = undef;
+$ERR_read_only_file = undef;
+$ERR_unreadable_file = undef;
+$ERR_nonexe_file = undef;
+$ERR_exe_dir = undef;
+
+{
+  use locale;
+
+  my $loc = undef;
+  if ($has_POSIX) {
+      POSIX->import(qw(locale_h));
+      # Windows has POSIX locale, but only LC_ALL not LC_MESSAGES
+      $loc = POSIX::setlocale(&POSIX::LC_ALL);
+      POSIX::setlocale(&POSIX::LC_ALL, 'C');
+  }
+
+  if (open(my $F, '<', 'file.none')) {
+      print "Opened non-existent file! Skipping related tests.\n";
+  } else {
+      $ERR_no_such_file = "$!";
+  }
+
+  unlink('file.out');
+  touch('file.out');
+
+  chmod(0444, 'file.out');
+  if (open(my $F, '>', 'file.out')) {
+      print "Opened read-only file! Skipping related tests.\n";
+      close($F);
+  } else {
+      $ERR_read_only_file = "$!";
+  }
+
+  $_ = `./file.out 2>/dev/null`;
+  if ($? == 0) {
+      print "Executed non-executable file!  Skipping related tests.\n";
+  } else {
+      $ERR_nonexe_file = "$!";
+  }
+
+  $_ = `./. 2>/dev/null`;
+  if ($? == 0) {
+      print "Executed directory!  Skipping related tests.\n";
+  } else {
+      $ERR_exe_dir = "$!";
+  }
+
+  chmod(0000, 'file.out');
+  if (open(my $F, '<', 'file.out')) {
+      print "Opened unreadable file!  Skipping related tests.\n";
+      close($F);
+  } else {
+      $ERR_unreadable_file = "$!";
+  }
+
+  unlink('file.out') or die "Failed to delete file.out: $!\n";
+
+  $loc and POSIX::setlocale(&POSIX::LC_ALL, $loc);
+}
 
 #$SIG{INT} = sub { print STDERR "Caught a signal!\n"; die @_; };
 
@@ -81,7 +177,7 @@ sub valid_option
 
    if ($option =~ /^-srcdir$/i) {
        $srcdir = shift @argv;
-       if (! -f "$srcdir/gnumake.h") {
+       if (! -f File::Spec->catfile($srcdir, 'src', 'gnumake.h')) {
            print "$option $srcdir: Not a valid GNU make source directory.\n";
            exit 0;
        }
@@ -124,7 +220,11 @@ sub valid_option
 #  [2] (string):  Answer we should get back.
 #  [3] (integer): Exit code we expect.  A missing code means 0 (success)
 
+$makefile = undef;
 $old_makefile = undef;
+$mkpath = undef;
+$make_name = undef;
+$helptool = undef;
 
 sub subst_make_string
 {
@@ -133,7 +233,9 @@ sub subst_make_string
     s/#MAKEPATH#/$mkpath/g;
     s/#MAKE#/$make_name/g;
     s/#PERL#/$perl_name/g;
-    s/#PWD#/$pwd/g;
+    s/#PWD#/$cwdpath/g;
+    # If we're using a shell
+    s/#HELPER#/$perl_name $helptool/g;
     return $_;
 }
 
@@ -148,7 +250,7 @@ sub run_make_test
 
   if (! defined $makestring) {
     defined $old_makefile
-      || die "run_make_test(undef) invoked before run_make_test('...')\n";
+      or die "run_make_test(undef) invoked before run_make_test('...')\n";
     $makefile = $old_makefile;
   } else {
     if (! defined($makefile)) {
@@ -160,9 +262,9 @@ sub run_make_test
     $makestring = subst_make_string($makestring);
 
     # Populate the makefile!
-    open(MAKEFILE, "> $makefile") || die "Failed to open $makefile: $!\n";
+    open(MAKEFILE, "> $makefile") or die "Failed to open $makefile: $!\n";
     print MAKEFILE $makestring;
-    close(MAKEFILE) || die "Failed to write $makefile: $!\n";
+    close(MAKEFILE) or die "Failed to write $makefile: $!\n";
   }
 
   # Do the same processing on $answer as we did on $makestring.
@@ -179,12 +281,35 @@ sub run_make_test
   $makefile = undef;
 }
 
+sub add_options {
+  my $cmd = shift;
+
+  foreach (@_) {
+    if (ref($cmd)) {
+      push(@$cmd, ref($_) ? @$_ : $_);
+    } else {
+      $cmd .= ' '.(ref($_) ? "@$_" : $_);
+    }
+  }
+
+  return $cmd;
+}
+
+sub create_command {
+  return !$_[0] || ref($_[0]) ? [@make_command] : join(' ', @make_command);
+}
+
 # The old-fashioned way...
+# $options can be a scalar (string) or a ref to an array of options
+# If it's a scalar the entire argument is passed to system/exec etc. as
+# a single string.  If it's a ref then the array is passed to system/exec.
+# Using a ref should be preferred as it's more portable but all the older
+# invocations use strings.
 sub run_make_with_options {
   my ($filename,$options,$logname,$expected_code,$timeout,@call) = @_;
   @call = caller unless @call;
-  local($code);
-  local($command) = $make_path;
+  my $code;
+  my $command = create_command($options);
 
   $expected_code = 0 unless defined($expected_code);
 
@@ -192,13 +317,14 @@ sub run_make_with_options {
   $test_passed = 1;
 
   if ($filename) {
-    $command .= " -f $filename";
+    $command = add_options($command, '-f', $filename);
   }
 
   if ($options) {
-    if ($^O eq 'VMS') {
+    if (!ref($options) && $^O eq 'VMS') {
       # Try to make sure arguments are properly quoted.
       # This does not handle all cases.
+      # We should convert the tests to use array refs not strings
 
       # VMS uses double quotes instead of single quotes.
       $options =~ s/\'/\"/g;
@@ -230,20 +356,22 @@ sub run_make_with_options {
 
       print ("Options fixup = -$options-\n") if $debug;
     }
-    $command .= " $options";
+
+    $command = add_options($command, $options);
   }
 
-  $command_string = "";
+  my $cmdstr = ref($command) ? "'".join("' '", @$command)."'" : $command;
+
   if (@call) {
-      $command_string = "#$call[1]:$call[2]\n";
+    $command_string = "#$call[1]:$call[2]\n$cmdstr\n";
+  } else {
+    $command_string = $cmdstr;
   }
-  $command_string .= "$command\n";
 
   if ($valgrind) {
-    print VALGRIND "\n\nExecuting: $command\n";
+    print VALGRIND "\n\nExecuting: $cmdstr\n";
   }
 
-
   {
       my $old_timeout = $test_timeout;
       $timeout and $test_timeout = $timeout;
@@ -251,7 +379,11 @@ sub run_make_with_options {
       # If valgrind is enabled, turn off the timeout check
       $valgrind and $test_timeout = 0;
 
-      $code = &run_command_with_output($logname,$command);
+      if (ref($command)) {
+          $code = run_command_with_output($logname, @$command);
+      } else {
+          $code = run_command_with_output($logname, $command);
+      }
       $test_timeout = $old_timeout;
   }
 
@@ -265,8 +397,7 @@ sub run_make_with_options {
       # If we have a purify log, save it
       $tn = $pure_testname . ($num_of_logfiles ? ".$num_of_logfiles" : "");
       print("Renaming purify log file to $tn\n") if $debug;
-      rename($pure_log, "$tn")
-        || die "Can't rename $log to $tn: $!\n";
+      rename($pure_log, "$tn") or die "Can't rename $pure_log to $tn: $!\n";
       ++$purify_errors;
     } else {
       unlink($pure_log);
@@ -274,9 +405,8 @@ sub run_make_with_options {
   }
 
   if ($code != $expected_code) {
-    print "Error running $make_path (expected $expected_code; got $code): $command\n";
+    print "Error running @make_command (expected $expected_code; got $code): $cmdstr\n";
     $test_passed = 0;
-    $runf = &get_runfile;
     &create_file (&get_runfile, $command_string);
     # If it's a SIGINT, stop here
     if ($code & 127) {
@@ -287,7 +417,7 @@ sub run_make_with_options {
   }
 
   if ($profile & $vos) {
-    system "add_profile $make_path";
+    system "add_profile @make_command";
   }
 
   return 1;
@@ -311,180 +441,241 @@ sub print_help
         "\tRun the test suite under valgrind's memcheck tool.",
         "\tChange the default valgrind args with the VALGRIND_ARGS env var.",
         "-massif",
-        "\tRun the test suite under valgrind's massif toool.",
+        "\tRun the test suite under valgrind's massif tool.",
         "\tChange the default valgrind args with the VALGRIND_ARGS env var."
        );
 }
 
-sub get_this_pwd {
-  $delete_command = 'rm -f';
-  if ($has_POSIX) {
-    $__pwd = POSIX::getcwd();
-  } elsif ($vos) {
-    $delete_command = "delete_file -no_ask";
-    $__pwd = `++(current_dir)`;
+sub set_defaults
+{
+  # $profile = 1;
+  $testee = "GNU make";
+  $make_path = "make";
+  $tmpfilesuffix = "mk";
+  if ($port_type eq 'UNIX') {
+    $scriptsuffix = '.sh';
+  } elsif ($port_type eq 'VMS') {
+    $scriptsuffix = '.com';
   } else {
-    # No idea... just try using pwd as a last resort.
-    chop ($__pwd = `pwd`);
+    $scriptsuffix = '.bat';
+  }
+}
+
+# This is no longer used: we import config-flags.pm instead
+# sub parse_status
+# {
+#   if (open(my $fh, '<', "$_[0]/config.status")) {
+#     while (my $line = <$fh>) {
+#       $line =~ m/^[SD]\["([^\"]+)"\]=" *(.*)"/ and $CONFIG_FLAGS{$1} = $2;
+#     }
+#     return 1;
+#   }
+#   return 0;
+# }
+
+sub find_prog
+{
+  my $prog = $_[0];
+  my ($v, $d, $f) = File::Spec->splitpath($prog);
+
+  # If there's no directory then we need to search the PATH
+  if (! $d) {
+    foreach my $e (File::Spec->path()) {
+      $prog = File::Spec->catfile($e, $f);
+      if (-x $prog) {
+        ($v, $d, $f) = File::Spec->splitpath($prog);
+        last;
+      }
+    }
   }
 
-  return $__pwd;
+  return ($v, $d, $f);
 }
 
-sub set_defaults
+sub get_config
 {
-   # $profile = 1;
-   $testee = "GNU make";
-   $make_path = "make";
-   $tmpfilesuffix = "mk";
-   $pwd = &get_this_pwd;
+  return exists($CONFIG_FLAGS{$_[0]}) ? $CONFIG_FLAGS{$_[0]} : '';
 }
 
 sub set_more_defaults
 {
-   local($string);
-   local($index);
-
-   # find the type of the port.  We do this up front to have a single
-   # point of change if it needs to be tweaked.
-   #
-   # This is probably not specific enough.
-   #
-   if ($osname =~ /Windows/i || $osname =~ /MINGW32/i || $osname =~ /CYGWIN_NT/i) {
-     $port_type = 'W32';
-   }
-   # Bleah, the osname is so variable on DOS.  This kind of bites.
-   # Well, as far as I can tell if we check for some text at the
-   # beginning of the line with either no spaces or a single space, then
-   # a D, then either "OS", "os", or "ev" and a space.  That should
-   # match and be pretty specific.
-   elsif ($osname =~ /^([^ ]*|[^ ]* [^ ]*)D(OS|os|ev) /) {
-     $port_type = 'DOS';
-   }
-   # Check for OS/2
-   elsif ($osname =~ m%OS/2%) {
-     $port_type = 'OS/2';
-   }
+  my $string;
 
-   # VMS has a GNV Unix mode or a DCL mode.
-   # The SHELL environment variable should not be defined in VMS-DCL mode.
-   elsif ($osname eq 'VMS' && !defined $ENV{"SHELL"}) {
-     $port_type = 'VMS-DCL';
-   }
-   # Everything else, right now, is UNIX.  Note that we should integrate
-   # the VOS support into this as well and get rid of $vos; we'll do
-   # that next time.
-   else {
-     $port_type = 'UNIX';
-   }
+  # Now that we have located make_path, locate the srcdir and blddir
+  my ($mpv, $mpd, $mpf) = find_prog($make_path);
 
-   # On DOS/Windows system the filesystem apparently can't track
-   # timestamps with second granularity (!!).  Change the sleep time
-   # needed to force a file to be considered "old".
-   $wtime = $port_type eq 'UNIX' ? 1 : $port_type eq 'OS/2' ? 2 : 4;
-
-   print "Port type: $port_type\n" if $debug;
-   print "Make path: $make_path\n" if $debug;
-
-   # Find the full pathname of Make.  For DOS systems this is more
-   # complicated, so we ask make itself.
-   if ($osname eq 'VMS') {
-     $port_type = 'VMS-DCL' unless defined $ENV{"SHELL"};
-     # On VMS pre-setup make to be found with simply 'make'.
-     $make_path = 'make';
-   } else {
-     my $mk = `sh -c 'echo "all:;\@echo \\\$(MAKE)" | $make_path -f-'`;
-     chop $mk;
-     $mk or die "FATAL ERROR: Cannot determine the value of \$(MAKE):\n
-'echo \"all:;\@echo \\\$(MAKE)\" | $make_path -f-' failed!\n";
-     $make_path = $mk;
-   }
-   print "Make\t= '$make_path'\n" if $debug;
+  # We have a make program so try to compute the blddir.
+  if ($mpd) {
+    my $f = File::Spec->catpath($mpv, File::Spec->catdir($mpd, 'tests'), 'config-flags.pm');
+    if (-f $f) {
+      $bldvol = $mpv;
+      $blddir = $mpd;
+    }
+  }
 
-   my $redir2 = '2> /dev/null';
-   $redir2 = '' if os_name eq 'VMS';
-   $string = `$make_path -v -f /dev/null $redir2`;
+  # If srcdir wasn't provided on the command line, try to find it.
+  if (! $srcdir && $blddir) {
+    # See if the blddir is the srcdir
+    my $f = File::Spec->catpath($bldvol, File::Spec->catdir($blddir, 'src'), 'gnumake.h');
+    if (-f $f) {
+      $srcdir = $blddir;
+      $srcvol = $bldvol;
+    }
+  }
 
-   $string =~ /^(GNU Make [^,\n]*)/;
-   $testee_version = "$1\n";
+  if (! $srcdir) {
+    # Not found, see if our parent is the source dir
+    my $f = File::Spec->catpath($cwdvol, File::Spec->catdir(File::Spec->updir(), 'src'), 'gnumake.h');
+    if (-f $f) {
+      $srcdir = File::Spec->updir();
+      $srcvol = $cwdvol;
+    }
+  }
 
-   my $redir = '2>&1';
-   $redir = '' if os_name eq 'VMS';
-   $string = `sh -c "$make_path -f /dev/null $redir"`;
-   if ($string =~ /(.*): \*\*\* No targets\.  Stop\./) {
-     $make_name = $1;
-   }
-   else {
-     $make_path =~ /^(?:.*$pathsep)?(.+)$/;
-     $make_name = $1;
-   }
+  # If we have srcdir but not blddir, set them equal
+  if ($srcdir && !$blddir) {
+    $blddir = $srcdir;
+    $bldvol = $srcvol;
+  }
 
-   # prepend pwd if this is a relative path (ie, does not
-   # start with a slash, but contains one).  Thanks for the
-   # clue, Roland.
+  # Load the config flags
+  if (!$blddir) {
+    warn "Cannot locate config-flags.pm (no blddir)\n";
+  } else {
+    my $f = File::Spec->catpath($bldvol, File::Spec->catdir($blddir, 'tests'), 'config-flags.pm');
+    if (! -f $f) {
+      warn "Cannot locate $f\n";
+    } else {
+      unshift(@INC, File::Spec->catpath($bldvol, File::Spec->catdir($blddir, 'tests'), ''));
+      require "config-flags.pm";
+    }
+  }
 
-   if (index ($make_path, ":") != 1 && index ($make_path, "/") > 0)
-   {
-      $mkpath = "$pwd$pathsep$make_path";
-   }
-   else
-   {
-      $mkpath = $make_path;
-   }
+  # Find the full pathname of Make.  For DOS systems this is more
+  # complicated, so we ask make itself.
+  if ($osname eq 'VMS') {
+    $port_type = 'VMS-DCL' unless defined $ENV{"SHELL"};
+    # On VMS pre-setup make to be found with simply 'make'.
+    $make_path = 'make';
+  } else {
+    create_file('make.mk', 'all:;$(info $(MAKE))');
+    my $mk = `$make_path -sf make.mk`;
+    unlink('make.mk');
+    chop $mk;
+    $mk or die "FATAL ERROR: Cannot determine the value of \$(MAKE)\n";
+    $make_path = $mk;
+  }
+  ($mpv, $mpd, $mpf) = File::Spec->splitpath($make_path);
+
+  # Ask make what shell to use
+  create_file('shell.mk', 'all:;$(info $(SHELL))');
+  $sh_name = `$make_path -sf shell.mk`;
+  unlink('shell.mk');
+  chop $sh_name;
+  if (! $sh_name) {
+      print "Cannot determine shell\n";
+      $is_posix_sh = 0;
+  } else {
+      my $o = `$sh_name -c ': do nothing' 2>&1`;
+      $is_posix_sh = $? == 0 && $o eq '';
+  }
 
-   # If srcdir wasn't provided on the command line, see if the
-   # location of the make program gives us a clue.  Don't fail if not;
-   # we'll assume it's been installed into /usr/include or wherever.
-   if (! $srcdir) {
-       $make_path =~ /^(.*$pathsep)?/;
-       my $d = $1 || '../';
-       -f "${d}gnumake.h" and $srcdir = $d;
-   }
+  $string = `$make_path -v`;
+  $string =~ /^(GNU Make [^,\n]*)/ or die "$make_path is not GNU make.  Version:\n$string";
+  $testee_version = "$1\n";
 
-   # Not with the make program, so see if we can get it out of the makefile
-   if (! $srcdir && open(MF, "< ../Makefile")) {
-       local $/ = undef;
-       $_ = <MF>;
-       close(MF);
-       /^abs_srcdir\s*=\s*(.*?)\s*$/m;
-       -f "$1/gnumake.h" and $srcdir = $1;
-   }
+  create_file('null.mk', '');
 
-   # Get Purify log info--if any.
+  my $redir = '2>&1';
+  $redir = '' if os_name eq 'VMS';
+  $string = `$make_path -f null.mk $redir`;
+  if ($string =~ /(.*): \*\*\* No targets\.  Stop\./) {
+    $make_name = $1;
+  } else {
+    $make_name = $mpf;
+  }
 
-   if (exists $ENV{PURIFYOPTIONS}
-       && $ENV{PURIFYOPTIONS} =~ /.*-logfile=([^ ]+)/) {
-     $pure_log = $1 || '';
-     $pure_log =~ s/%v/$make_name/;
-     $purify_errors = 0;
-   }
+  # prepend pwd if this is a relative path (ie, does not
+  # start with a slash, but contains one).  Thanks for the
+  # clue, Roland.
 
-   $string = `sh -c "$make_path -j 2 -f /dev/null $redir"`;
-   if ($string =~ /not supported/) {
-     $parallel_jobs = 0;
-   }
-   else {
-     $parallel_jobs = 1;
-   }
+  if ($mpd && !File::Spec->file_name_is_absolute($make_path) && $cwdvol == $mpv) {
+     $mkpath = File::Spec->catpath($cwdvol, File::Spec->catdir($cwd, $mpd), $mpf);
+  } else {
+     $mkpath = $make_path;
+  }
 
-   %FEATURES = map { $_ => 1 } split /\s+/, `sh -c "echo '\\\$(info \\\$(.FEATURES))' | $make_path -f- 2>/dev/null"`;
+  # Not with the make program, so see if we can get it out of the makefile
+  if (! $srcdir && open(MF, '<', File::Spec->catfile(File::Spec->updir(), 'Makefile'))) {
+    local $/ = undef;
+    $_ = <MF>;
+    close(MF);
+    /^abs_srcdir\s*=\s*(.*?)\s*$/m;
+    -f File::Spec->catfile($1, 'src', 'gnumake.h') and $srcdir = $1;
+  }
 
-   # Set up for valgrind, if requested.
+  # At this point we should have srcdir and blddir: get fq versions
+  $fqsrcdir = File::Spec->rel2abs($srcdir);
+  $fqblddir = File::Spec->rel2abs($blddir);
 
-   $make_command = $make_path;
+  # Find the helper tool
+  $helptool = File::Spec->catfile($fqsrcdir, 'tests', 'thelp.pl');
 
-   if ($valgrind) {
-     my $args = $valgrind_args;
-     open(VALGRIND, "> valgrind.out")
-       || die "Cannot open valgrind.out: $!\n";
-     #  -q --leak-check=yes
-     exists $ENV{VALGRIND_ARGS} and $args = $ENV{VALGRIND_ARGS};
-     $make_path = "valgrind --log-fd=".fileno(VALGRIND)." $args $make_path";
-     # F_SETFD is 2
-     fcntl(VALGRIND, 2, 0) or die "fcntl(setfd) failed: $!\n";
-     system("echo Starting on `date` 1>&".fileno(VALGRIND));
-     print "Enabled valgrind support.\n";
-   }
+  # It's difficult to quote this properly in all the places it's used so
+  # ensure it doesn't need to be quoted.
+  $helptool =~ s,\\,/,g if $port_type eq 'W32';
+  $helptool =~ s, ,\\ ,g;
+
+  # Get Purify log info--if any.
+
+  if (exists $ENV{PURIFYOPTIONS}
+      && $ENV{PURIFYOPTIONS} =~ /.*-logfile=([^ ]+)/) {
+    $pure_log = $1 || '';
+    $pure_log =~ s/%v/$make_name/;
+    $purify_errors = 0;
+  }
+
+  $string = `$make_path -j 2 -f null.mk $redir`;
+  if ($string =~ /not supported/) {
+    $parallel_jobs = 0;
+  }
+  else {
+    $parallel_jobs = 1;
+  }
+
+  unlink('null.mk');
+
+  create_file('features.mk', 'all:;$(info $(.FEATURES))');
+  %FEATURES = map { $_ => 1 } split /\s+/, `$make_path -sf features.mk`;
+  unlink('features.mk');
+
+  # Set up for valgrind, if requested.
+
+  @make_command = ($make_path);
+
+  if ($valgrind) {
+    my $args = $valgrind_args;
+    open(VALGRIND, "> valgrind.out") or die "Cannot open valgrind.out: $!\n";
+    #  -q --leak-check=yes
+    exists $ENV{VALGRIND_ARGS} and $args = $ENV{VALGRIND_ARGS};
+    @make_command = ('valgrind', '--log-fd='.fileno(VALGRIND));
+    push(@make_command, split(' ', $args));
+    push(@make_command, $make_path);
+    # F_SETFD is 2
+    fcntl(VALGRIND, 2, 0) or die "fcntl(setfd) failed: $!\n";
+    system("echo Starting on `date` 1>&".fileno(VALGRIND));
+    print "Enabled valgrind support.\n";
+  }
+
+  if ($debug) {
+    print "Port type:    $port_type\n";
+    print "Make command: @make_command\n";
+    print "Shell path:   $sh_name".($is_posix_sh ? ' (POSIX)' : '')."\n";
+    print "#PWD#:        $cwdpath\n";
+    print "#PERL#:       $perl_name\n";
+    print "#MAKEPATH#:   $mkpath\n";
+    print "#MAKE#:       $make_name\n";
+  }
 }
 
 sub setup_for_test
index a064dd44605b4a2222a171f2630e9ccf5ef6fff9..dcd38e5a81cbde2c0f73452d0d544398c981668f 100644 (file)
@@ -8,10 +8,12 @@ This only works on systems that support it.";
 # If this instance of make doesn't support archives, skip it
 exists $FEATURES{archives} or return -1;
 
+# In theory archive support exists on Windows but it doesn't use ar;
+# someone will need to port this test.
+$port_type eq 'W32' and return -1;
+
 # Create some .o files to work with
 if ($osname eq 'VMS') {
-  use Cwd;
-  my $pwd = getcwd;
   # VMS AR needs real object files at this time.
   foreach $afile ('a1', 'a2', 'a3') {
     # Use non-standard extension to prevent implicit rules from recreating
@@ -27,11 +29,8 @@ if ($osname eq 'VMS') {
   utouch(-60, qw(a1.o a2.o a3.o));
 }
 
-my $ar = $CONFIG_FLAGS{AR};
-
-# Fallback if configure did not find AR, such as VMS
-# which does not run configure.
-$ar = 'ar' if $ar eq '';
+# Fallback if configure did not find AR
+my $ar = get_config('AR') || 'ar';
 
 my $redir = '2>&1';
 $redir = '' if $osname eq 'VMS';
@@ -52,6 +51,7 @@ if ($? == 0) {
 # Some versions of ar print different things on creation.  Find out.
 unlink('libxx.a');
 my $created = `$ar $arflags libxx.a a1.o $redir`;
+$created =~ s/a1\.o/#OBJECT#/g;
 
 # Some versions of ar print different things on add.  Find out.
 my $add = `$ar $arflags libxx.a a2.o $redir`;
@@ -64,7 +64,8 @@ $repl =~ s/a2\.o/#OBJECT#/g;
 unlink('libxx.a');
 
 # Very simple
-my $answer = "$ar $arflags libxx.a a1.o\n$created";
+($_ = $created) =~ s/#OBJECT#/a1.o/g;
+my $answer = "$ar $arflags libxx.a a1.o\n$_";
 if ($port_type eq 'VMS-DCL') {
   $answer = 'library /replace libxx.a a1.o';
 }
@@ -204,10 +205,37 @@ run_make_test(undef, $arvar, "#MAKE#: Nothing to be done for 'default'.\n");
 
 unlink('foo.vhd');
 if ($osname eq 'VMS') {
-  remove_directory_tree("$pwd/artest");
+  remove_directory_tree("$cwdpath/artest");
 } else {
   remove_directory_tree('artest');
 }
 
+# Check long names for archive members.
+# See Savannah bug #54395
+
+if ($osname ne 'VMS') {
+    my $pre = '1234567890123456';
+    my $lib = 'libxx.a';
+    my $cr = $created;
+    $cr =~ s/#OBJECT#/${pre}a/g;
+    my $ad = $add;
+    $ad =~ s/#OBJECT#/${pre}b/g;
+
+    run_make_test(qq!
+# Both member names > 16 characters long
+default: $lib(${pre}a) $lib(${pre}b)
+
+(%): % ; \$(AR) \$(ARFLAGS) \$@ \$%
+
+$pre%: ; touch \$\@
+!,
+                  $arvar, "touch ${pre}a\n$ar $arflags $lib ${pre}a\n${cr}touch ${pre}b\n$ar $arflags $lib ${pre}b\n${ad}rm ${pre}a ${pre}b\n");
+
+    # Run it again; nothing should happen
+    run_make_test(undef, $arvar, "#MAKE#: Nothing to be done for 'default'.\n");
+
+    unlink($lib);
+}
+
 # This tells the test driver that the perl test script executed properly.
 1;
index 40debf5a9096d3acde461ddabc689d729882182e..a666a26307366b42f916ac98c2fe9fcc29e8002d 100644 (file)
@@ -36,7 +36,7 @@ run_make_test("
 all:
 \techo This makefile did not clean the dir... good
 clean:
-\t\@$delete_command $example\n",
+\t\@$CMD_rmfile $example\n",
               '', 'echo This makefile did not clean the dir... good
 This makefile did not clean the dir... good');
 
@@ -52,7 +52,7 @@ if (-f $example) {
 # TEST #3
 # -------
 
-run_make_test(undef, '-n clean', "$delete_command $example\n");
+run_make_test(undef, '-n clean', "$CMD_rmfile $example\n");
 
 
 # TEST #4
index ebd43831b4e2249694c581959aaa1616aba68b35..f236d5172490c3d405287b6b6583c93f12244bba 100644 (file)
 #                                                                    -*-perl-*-
 
-$description = "The following tests the -i option and the '-' in front of \n"
-              ."commands to test that make ignores errors in these commands\n"
-              ."and continues processing.";
-
-$details = "This test runs two makes.  The first runs on a target with a \n"
-          ."command that has a '-' in front of it (and a command that is \n"
-          ."intended to fail) and then a delete command after that is \n"
-          ."intended to succeed.  If make ignores the failure of the first\n"
-          ."command as it is supposed to, then the second command should \n"
-          ."delete a file and this is what we check for.  The second make\n"
-          ."that is run in this test is identical except that the make \n"
-          ."command is given with the -i option instead of the '-' in \n"
-          ."front of the command.  They should run the same. ";
-
-if ($vos)
-{
-   $rm_command = "delete_file";
-}
-else
-{
-   $rm_command = "rm";
-}
+$description = "Test ignored failures in recipe command lines";
+
+run_make_test(qq!
+one:
+\t-exit 1
+\texit 0
+two:
+\texit 1
+\texit 0
+!,
+              "one", "exit 1\n#MAKE#: [#MAKEFILE#:3: one] Error 1 (ignored)\nexit 0\n");
 
-open(MAKEFILE,"> $makefile");
+# TEST #1
+# -------
 
-# The Contents of the MAKEFILE ...
+run_make_test(undef, " -i two",
+              "exit 1\n#MAKE#: [#MAKEFILE#:6: two] Error 1 (ignored)\nexit 0\n");
 
-print MAKEFILE "clean:\n"
-              ."\t-$rm_command cleanit\n"
-              ."\t$rm_command foo\n"
-              ."clean2: \n"
-              ."\t$rm_command cleanit\n"
-              ."\t$rm_command foo\n";
+# TEST #2
+# -------
 
-# END of Contents of MAKEFILE
+# Test that error line offset works
 
-close(MAKEFILE);
+run_make_test(qq!
+all:
+\t\@echo hi
+\t\@echo there
+\t\@exit 1
+!,
+              '', "hi\nthere\n#MAKE#: *** [#MAKEFILE#:5: all] Error 1", 512);
 
-&touch("foo");
+# TEST #3
+# -------
 
-unlink("cleanit");
-$cleanit_error = `sh -c "$rm_command cleanit 2>&1"`;
-chomp $cleanit_error;
-$delete_error_code = $? >> 8;
+# Try failing due to unknown command
+my $unk = './foobarbazbozblat';
+unlink($unk);
 
-# TEST #1
-# -------
+my $err = $ERR_no_such_file;
 
-$answer = "$rm_command cleanit
-$cleanit_error
-$make_name: [$makefile:2: clean] Error $delete_error_code (ignored)
-$rm_command foo\n";
+run_make_test(qq!
+one: ; -$unk xx yy
+!,
+              'one', "$unk xx yy\n#MAKE#: $unk: $err\n#MAKE#: [#MAKEFILE#:2: one] Error 127 (ignored)\n");
 
-&run_make_with_options($makefile,"",&get_logfile);
+# TEST #4
+# -------
 
-# If make acted as planned, it should ignore the error from the first
-# command in the target and execute the second which deletes the file "foo"
-# This file, therefore, should not exist if the test PASSES.
-if (-f "foo") {
-  $test_passed = 0;
-}
+run_make_test(qq!
+two: ; $unk aa bb
+!, 'two -i',
+              "$unk aa bb\n#MAKE#: $unk: $err\n#MAKE#: [#MAKEFILE#:2: two] Error 127 (ignored)\n");
 
-# The output for this on VOS is too hard to replicate, so we only check it
-# on unix.
-if (!$vos)
-{
-   &compare_output($answer,&get_logfile(1));
-}
+# TEST #5
+# -------
 
+run_make_test(undef, 'two',
+              "$unk aa bb\n#MAKE#: $unk: $err\n#MAKE#: *** [#MAKEFILE#:2: two] Error 127\n", 512);
 
-&touch("foo");
+# SV #56918 : Test the unknown command as the second recipe line
 
-# TEST #2
-# -------
+run_make_test(qq!
+three:
+\t\@echo one
+\t$unk qq rr
+!, 'three',
+              "one\n$unk qq rr\n#MAKE#: $unk: $err\n#MAKE#: *** [#MAKEFILE#:4: three] Error 127\n", 512);
 
-$answer = "$rm_command cleanit
-$cleanit_error
-$make_name: [$makefile:5: clean2] Error $delete_error_code (ignored)
-$rm_command foo\n";
+# Try failing due to non-executable file
 
-&run_make_with_options($makefile,"clean2 -i",&get_logfile);
+if ($ERR_nonexe_file) {
+    my $noexe = './barfooblatboz';
+    touch($noexe);
 
-if (-f "foo") {
-  $test_passed = 0;
-}
+    run_make_test(qq!
+    one: ; -$noexe xx yy
+    two: ; $noexe aa bb
+    !,
+                  'one', "$noexe xx yy\n#MAKE#: $noexe: $ERR_nonexe_file\n#MAKE#: [#MAKEFILE#:2: one] Error 127 (ignored)\n");
 
-if (!$vos) {
-   &compare_output($answer,&get_logfile(1));
+    unlink($noexe);
 }
 
-# Test that error line offset works
+# Try failing by "running" a directory
 
-run_make_test(q!
-all:
-       @echo hi
-       @echo there
-       @exit 1
+if ($ERR_exe_dir) {
+    mkdir('sd', 0775);
+
+    run_make_test(q!
+PATH := .
+all: ; sd
 !,
-              '', "hi\nthere\n#MAKE#: *** [#MAKEFILE#:5: all] Error 1", 512);
+              '', "sd\n#MAKE#: sd: $ERR_exe_dir\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512);
 
-1;
+    run_make_test(q!
+all: ; ./sd
+!,
+              '', "./sd\n#MAKE#: ./sd: $ERR_exe_dir\n#MAKE#: *** [#MAKEFILE#:2: all] Error 127", 512);
 
-### Local Variables:
-### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action))
-### End:
+    rmdir('sd');
+}
+
+1;
index bf069df2250db3fb4d73b0c30381aa48bc222633..5157a977ecc09d22c597a4a5635b70695786a244 100644 (file)
@@ -10,47 +10,58 @@ Make sure that backslash before non-special characters are kept.";
 
 # TEST 1
 
-run_make_test('
+run_make_test(q!
+ifdef NOESC
+path = pre:
+endif
+ifdef ONEESC
+path = pre\:
+endif
+ifdef TWOESC
+path = pre\\\\:
+endif
+
 $(path)foo : ; @echo "touch ($@)"
 
 foo\ bar: ; @echo "touch ($@)"
 
 sharp: foo\#bar.ext
-foo\#bar.ext: ; @echo "foo#bar.ext = ($@)"',
-             '',
-             'touch (foo)');
+foo\#bar.ext: ; @echo "foo#bar.ext = ($@)"
+!,
+              '',
+              'touch (foo)');
 
 # TEST 2: This one should fail, since the ":" is unquoted.
 
 run_make_test(undef,
-             'path=pre:',
-             "#MAKEFILE#:2: *** target pattern contains no '%'.  Stop.",
-             512);
+              'NOESC=1',
+              "#MAKEFILE#:12: *** target pattern contains no '%'.  Stop.",
+              512);
 
 # TEST 3: This one should work, since we escape the ":".
 
 run_make_test(undef,
-             "'path=pre\\:'",
-             'touch (pre:foo)');
+              'ONEESC=1',
+              'touch (pre:foo)');
 
 # TEST 4: This one should fail, since the escape char is escaped.
 
 run_make_test(undef,
-             "'path=pre\\\\:'",
-             "#MAKEFILE#:2: *** target pattern contains no '%'.  Stop.",
-             512);
+              'TWOESC=1',
+              "#MAKEFILE#:12: *** target pattern contains no '%'.  Stop.",
+              512);
 
 # TEST 5: This one should work
 
 run_make_test(undef,
-             "'foo bar'",
-             'touch (foo bar)');
+              ['foo bar'],
+              'touch (foo bar)');
 
 # TEST 6: Test escaped comments
 
 run_make_test(undef,
-             'sharp',
-             'foo#bar.ext = (foo#bar.ext)');
+              'sharp',
+              'foo#bar.ext = (foo#bar.ext)');
 
 # Test escaped colons in prerequisites
 # Quoting of backslashes in q!! is kind of messy.
@@ -70,5 +81,23 @@ all: ..\foo
 !,
               '', ": '..\\foo'\n");
 
+# Test escaped comments in variable assignments
+run_make_test(q!
+self = $1
+foo := $(call self,#foo#)#foo
+bar := $(call self,\#bar\#)#bar
+all:;@echo '$(foo) $(bar)'
+!,
+               '',"#foo# \\#bar\\#");
+
+# Test escaped comments in variable assignments in a variable
+run_make_test(q!
+C = \#
+self = $1
+foo := $(call self,$Cfoo$C)#foo
+all:;@echo '$(foo)'
+!,
+               '',"#foo#");
+
 # This tells the test driver that the perl test script executed properly.
 1;
diff --git a/tests/scripts/features/exec b/tests/scripts/features/exec
new file mode 100644 (file)
index 0000000..91181f4
--- /dev/null
@@ -0,0 +1,63 @@
+#                                                                    -*-perl-*-
+
+use warnings;
+
+my $description = "Test that make can execute binaries as well as scripts with"
+                 ." various shabangs and without a shebang";
+my $details = "The various shells that this test uses are the default"
+             ." /bin/sh, \$SHELL and the perl interpreter that is"
+             ." executing this test program. The shells are used for the value"
+             ." of SHELL inside the test makefile and also as a shebang in the"
+             ." executed script. There is also a test which executes a script"
+             ." that has no shebang.";
+
+# Only bother with this on UNIX systems
+$port_type eq 'UNIX' or return -1;
+
+my $usersh = $origENV{SHELL};
+my $answer = 'hello, world';
+
+my @shebangs = ('', '#!/bin/sh', "#!$usersh", "#!$perl_name");
+my @shells = ('', 'SHELL=/bin/sh', "SHELL=$usersh");
+
+# tests [0-11]
+# Have a makefile with various SHELL= exec a shell program with varios
+# shebangs or without a shebang at all.
+my $stem = './exec.cmd';
+my $k = 0;
+for my $shebang (@shebangs) {
+    for my $shell (@shells) {
+        my $cmd = $k ? "$stem.$k" : $stem;
+        ++$k;
+        unlink $cmd;
+        open(CMD,"> $cmd");
+        print CMD "$shebang\n";
+        print CMD "printf \"$answer\\n\";\n";
+        close(CMD);
+        chmod 0700, $cmd;
+
+        run_make_test(q!
+all:; @$(CMD)
+!, "$shell CMD=$cmd", "$answer\n");
+
+        rmfiles($cmd);
+    }
+}
+
+# tests [12-14]
+# Exec a binary from a makefile that has SHELL=.
+for my $shell (@shells) {
+    run_make_test(q!
+all:; @#PERL# -e 'printf "$(ANSWER)\n"';
+!, "$shell ANSWER='$answer'", "$answer\n");
+}
+
+# test 15
+# Use perl as a shell.
+run_make_test(q!
+SHELL = #PERL#
+.SHELLFLAGS = -e
+all:; @printf "$(ANSWER)\n";
+!, "ANSWER='$answer'", "$answer\n");
+
+1;
diff --git a/tests/scripts/features/grouped_targets b/tests/scripts/features/grouped_targets
new file mode 100644 (file)
index 0000000..615e962
--- /dev/null
@@ -0,0 +1,133 @@
+#                                                                    -*-perl-*-
+
+$description = "This test is about grouped multiple targets indicated by &:";
+$details = "Here we test for requirements like\n"
+          ."- if multiple such targets are updated, the recipe is run once\n"
+          ."- parsing issues related to the &: syntax itself\n";
+
+# Parsing: &: allowed without any targets.
+run_make_test(q{
+.PHONY: all
+&:;
+all: ;@printf ''
+},
+'', "");
+
+# Parsing: &: works not preceded by whitespace.
+run_make_test(q{
+foo&:;@echo foo
+},
+'foo', "foo");
+
+# Ordinary rule runs recipe four times for t1 t2 t3 t4.
+# Grouped target rule runs recipe once; others are considered updated.
+run_make_test(q{
+.PHONY: t1 t2 t3 t4 g1 g2 g3 g4
+t1 t2 t3 t4: ; @echo $@
+g1 g2 g3 g4 &: ; @echo $@
+},
+'t1 t2 t3 t4 g1 g2 g3 g4',
+"t1\n"
+."t2\n"
+."t3\n"
+."t4\n"
+."g1\n"
+."#MAKE#: Nothing to be done for 'g2'.\n"
+."#MAKE#: Nothing to be done for 'g3'.\n"
+."#MAKE#: Nothing to be done for 'g4'.");
+
+# Similar to previous test, but targets come from m1 phony
+# rather than from the command line. We don't see "Nothing to
+# be done for" messages. Also, note reversed order g4 g3 ...
+# Thus the auto variable $@ is "g4" when that rule fires.
+run_make_test(q{
+.PHONY: m1 t1 t2 t3 t4 g1 g2 g3 g4
+m1: t1 t2 t3 t4 g4 g3 g2 g1
+t1 t2 t3 t4: ; @echo $@
+g1 g2 g3 g4&: ; @echo $@
+},
+'',
+"t1\nt2\nt3\nt4\ng4");
+
+# Set a grouped target recipe for existing targets
+run_make_test(q{
+.PHONY: M a b
+M: a b
+a:
+a b&: ; @echo Y
+b:
+},
+'',
+"Y");
+
+# grouped targets require a recipe
+run_make_test(q{
+.PHONY: M a b
+M: a b
+a b&:
+},
+'',
+"#MAKEFILE#:4: *** grouped targets must provide a recipe.  Stop.", 512);
+
+# Pattern rules use grouped targets anyway so it's a no-op
+run_make_test(q{
+.PHONY: M
+M: a.q b.q
+a.% b.%&: ; @echo Y
+},
+'',
+"Y");
+
+# Double-colon grouped target rules.
+run_make_test(q{
+.PHONY: M a b c d e f g h
+M: a b
+a b c&:: ; @echo X
+c d e&:: ; @echo Y
+f g h&:: ; @echo Z
+},
+'',
+"X");
+
+run_make_test(q{
+.PHONY: M a b c d e f g h
+M: c
+a b c&:: ; @echo X
+c d e&:: ; @echo Y
+f g h&:: ; @echo Z
+},
+'',
+"X\nY");
+
+run_make_test(q{
+.PHONY: M a b c d e f g h
+M: a b c d e
+a b c&:: ; @echo X
+c d e&:: ; @echo Y
+f g h&:: ; @echo Z
+},
+'',
+"X\nY");
+
+run_make_test(q{
+.PHONY: M a b c d e f g h
+M: d e
+a b c&:: ; @echo X
+c d e&:: ; @echo Y
+f g h&:: ; @echo Z
+},
+'',
+"Y");
+
+run_make_test(q{
+.PHONY: M a b c d e f g h
+M: f g h
+a b c&:: ; @echo X
+c d e&:: ; @echo Y
+f g h&:: ; @echo Z
+},
+'',
+"Z");
+
+# This tells the test driver that the perl test script executed properly.
+1;
index f78563f9ca5eda5f49a13262bf97853a91f88c6c..0c63c067bc656c12db2d99a77776a20929488487 100644 (file)
@@ -147,24 +147,6 @@ baz: end
 "#MAKE#: *** No rule to make target 'end', needed by 'baz'.  Stop.\n",
 512);
 
-# Test that the diagnostics is issued even if the target has been
-# tried before with the dontcare flag (include/-include case).
-#
-run_make_test('
-include bar
--include foo
-
-all:
-
-foo: baz
-bar: baz
-baz: end
-',
-'',
-"#MAKEFILE#:2: bar: No such file or directory
-#MAKE#: *** No rule to make target 'end', needed by 'baz'.  Stop.\n",
-512);
-
 # Test include of make-able file doesn't show an error (Savannah #102)
 run_make_test(q!
 .PHONY: default
@@ -179,18 +161,13 @@ inc2:; echo > $@
 
 rmfiles('inc1', 'inc2');
 
-# Test include of non-make-able file does show an error (Savannah #102)
-run_make_test(q!
-.PHONY: default
-default:; @echo DONE
-
-inc1:; echo > $@
-include inc1
-include inc2
-!,
-              '', "#MAKEFILE#:7: inc2: No such file or directory\n#MAKE#: *** No rule to make target 'inc2'.  Stop.\n", 512);
+# No target gets correct error
+run_make_test('', '', '#MAKE#: *** No targets.  Stop.', 512);
 
-rmfiles('inc1');
+# No target in included file either, still gets correct error.
+touch('inc1.mk');
+run_make_test('include inc1.mk', '', '#MAKE#: *** No targets.  Stop.', 512);
+rmfiles('inc1.mk');
 
 # Include same file multiple times
 
@@ -204,40 +181,83 @@ include inc1
 
 rmfiles('inc1');
 
-# Included file has a prerequisite that fails to build
+if (defined $ERR_no_such_file) {
 
-run_make_test(q!
+    # Test that the diagnostics is issued even if the target has been
+    # tried before with the dontcare flag (include/-include case).
+    #
+    run_make_test('
+include bar
+-include foo
+
+all:
+
+foo: baz
+bar: baz
+baz: end
+',
+'',
+                  "#MAKEFILE#:2: bar: $ERR_no_such_file\n#MAKE#: *** No rule to make target 'end', needed by 'baz'.  Stop.\n",
+                  512);
+
+    # Test include of non-make-able file does show an error (Savannah #102)
+    run_make_test(q!
+.PHONY: default
+default:; @echo DONE
+
+inc1:; echo > $@
+include inc1
+include inc2
+!,
+                  '', "#MAKEFILE#:7: inc2: $ERR_no_such_file\n#MAKE#: *** No rule to make target 'inc2'.  Stop.\n", 512);
+
+    rmfiles('inc1');
+
+    # Included file has a prerequisite that fails to build
+
+    run_make_test(q!
 default:; @echo DEFAULT
 include inc1
 inc1: foo; echo > $@
 foo:; exit 1
 !,
-              '', "exit 1\n#MAKEFILE#:3: inc1: No such file or directory\n#MAKE#: *** [#MAKEFILE#:5: foo] Error 1\n", 512);
+                  '', "exit 1\n#MAKEFILE#:3: inc1: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:5: foo] Error 1\n", 512);
 
-rmfiles('inc1');
+    rmfiles('inc1');
 
-# Included file has a prerequisite we don't know how to build
+    # Included file has a prerequisite we don't know how to build
 
-run_make_test(q!
+    run_make_test(q!
 default:; @echo DEFAULT
 include inc1
 inc1: foo; echo > $@
 !,
-              '', "#MAKEFILE#:3: inc1: No such file or directory\n#MAKE#: *** No rule to make target 'foo', needed by 'inc1'.  Stop.\n", 512);
+                  '', "#MAKEFILE#:3: inc1: $ERR_no_such_file\n#MAKE#: *** No rule to make target 'foo', needed by 'inc1'.  Stop.\n", 512);
 
-rmfiles('inc1');
+    rmfiles('inc1');
+}
 
-# include a directory
+# Including files that can't be read should show an error
+if (defined $ERR_unreadable_file) {
+    create_file('inc1', 'FOO := foo');
+    chmod 0000, 'inc1';
 
-if ($all_tests) {
-    # Test that include of a rebuild-able file doesn't show a warning
-    # Savannah bug #102
     run_make_test(q!
-include foo
-foo: ; @echo foo = bar > $@
+include inc1
+all:;@echo $(FOO)
 !,
-                  '', "#MAKE#: 'foo' is up to date.\n");
-    rmfiles('foo');
+                  '', "#MAKEFILE#:2: inc1: $ERR_unreadable_file\n#MAKE#: *** No rule to make target 'inc1'.  Stop.", 512);
+
+# Unreadable files that we know how to successfully recreate should work
+
+    run_make_test(sprintf(q!
+all:;@echo $(FOO)
+include inc1
+inc1:; @%s $@ && echo FOO := bar > $@
+!, $CMD_rmfile),
+                  '', "bar");
+
+    rmfiles('inc1');
 }
 
 1;
index 7da4a654da38b8f7185449ac8f9e4e8095cd102f..73d10d9f1090d76483c36a23fa0de322e6a83e35 100644 (file)
@@ -42,7 +42,7 @@ recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -j3 -f #MAKEFILE# recurse2
 recurse2: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all
 all:;@echo $@: "/$(SHOW)/"
 !,
-              "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\n#MAKE#[1]: warning: -jN forced in submake: disabling jobserver mode.\nrecurse2: /-j3 --jobserver-auth=<auth> $np/\nall: /-j3 --jobserver-auth=<auth> $np/\n");
+              "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\n#MAKE#[1]: warning: -j3 forced in submake: resetting jobserver mode.\nrecurse2: /-j3 --jobserver-auth=<auth> $np/\nall: /-j3 --jobserver-auth=<auth> $np/\n");
 delete $extraENV{MAKEFLAGS};
 
 # Test override of -jN with -j
@@ -52,7 +52,7 @@ recurse: ; @echo $@: "/$(SHOW)/"; $(MAKE) -j -f #MAKEFILE# recurse2
 recurse2: ; @echo $@: "/$(SHOW)/"; $(MAKE) -f #MAKEFILE# all
 all:;@echo $@: "/$(SHOW)/"
 !,
-              "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\n#MAKE#[1]: warning: -jN forced in submake: disabling jobserver mode.\nrecurse2: /-j $np/\nall: /-j $np/\n");
+              "-j2 $np", "recurse: /-j2 --jobserver-auth=<auth> $np/\n#MAKE#[1]: warning: -j0 forced in submake: resetting jobserver mode.\nrecurse2: /-j $np/\nall: /-j $np/\n");
 
 # Don't put --jobserver-auth into a re-exec'd MAKEFLAGS.
 # We can't test this directly because there's no way a makefile can
@@ -76,29 +76,31 @@ inc.mk:
 #      @echo 'MAKEFLAGS = $(MAKEFLAGS)'
        @echo 'FOO = bar' > $@
 !,
-              "$np -j2", "#MAKE#[1]: warning: -jN forced in submake: disabling jobserver mode.\nall\n");
+              "$np -j2", "#MAKE#[1]: warning: -j2 forced in submake: resetting jobserver mode.\nall\n");
 
 unlink('inc.mk');
 
-# Test recursion when make doesn't think it exists.
+# Test recursion which is hidden from make.
 # See Savannah bug #39934
 # Or Red Hat bug https://bugzilla.redhat.com/show_bug.cgi?id=885474
-
-open(MAKEFILE,"> Makefile2");
-print MAKEFILE '
-vpath %.c ../
-foo:
-';
-close(MAKEFILE);
-
-run_make_test(q!
+# Windows doesn't use a pipe, and doesn't close access, so this won't happen.
+if ($port_type ne 'W32') {
+    open(MAKEFILE,"> Makefile2");
+    print MAKEFILE '
+    vpath %.c ../
+    foo:
+    ';
+    close(MAKEFILE);
+
+    run_make_test(q!
 default: ; @ #MAKEPATH# -f Makefile2
 !,
               "-j2 $np",
 "#MAKE#[1]: warning: jobserver unavailable: using -j1.  Add '+' to parent make rule.
 #MAKE#[1]: Nothing to be done for 'foo'.");
 
-rmfiles('Makefile2');
+    rmfiles('Makefile2');
+}
 
 1;
 
index 2e9318d52dca30a2b46043231a00ea75b053ec99..fa4b86f6cb16834ba6ca4b166ebc9cfd55a55f1e 100644 (file)
@@ -6,6 +6,12 @@ $details = "Test dynamic loading of modules.";
 # Don't do anything if this system doesn't support "load"
 exists $FEATURES{load} or return -1;
 
+my $cc = get_config('CC');
+if (! $cc) {
+    $verbose and print "Skipping load test: no CC defined\n";
+    return -1;
+}
+
 # First build a shared object
 # Provide both a default and non-default load symbol
 
@@ -39,9 +45,11 @@ EOF
 close($F) or die "close: testload.c: $!\n";
 
 # Make sure we can compile
-# CONFIG_FLAGS are loaded from config-flags.pm and set by configure
 
-my $sobuild = "$CONFIG_FLAGS{CC} ".($srcdir? "-I$srcdir":'')." $CONFIG_FLAGS{CPPFLAGS} $CONFIG_FLAGS{CFLAGS} -shared -fPIC $CONFIG_FLAGS{LDFLAGS} -o testload.so testload.c";
+my $cflags = get_config('CFLAGS');
+my $cppflags = get_config('CPPFLAGS');
+my $ldflags = get_config('LDFLAGS');
+my $sobuild = "$cc ".($srcdir? "-I$srcdir/src":'')." $cppflags $cflags -shared -fPIC $ldflags -o testload.so testload.c";
 
 my $clog = `$sobuild 2>&1`;
 if ($? != 0) {
index 8c824c049d84b9ae10c612708df92f278d4bc2f2..ba149281985ce870ee9231569e33b45374c1ac65 100644 (file)
@@ -6,6 +6,12 @@ $details = "Verify the different aspects of the shared object API.";
 # Don't do anything if this system doesn't support "load"
 exists $FEATURES{load} or return -1;
 
+my $cc = get_config('CC');
+if (! $cc) {
+    $verbose and print "Skipping load test: no CC defined\n";
+    return -1;
+}
+
 # First build a shared object
 # Provide both a default and non-default load symbol
 
@@ -72,7 +78,12 @@ testapi_gmk_setup ()
 EOF
 close($F) or die "close: testapi.c: $!\n";
 
-my $sobuild = "$CONFIG_FLAGS{CC} ".($srcdir? "-I$srcdir":'')." $CONFIG_FLAGS{CPPFLAGS} $CONFIG_FLAGS{CFLAGS} -shared -fPIC $CONFIG_FLAGS{LDFLAGS} -o testapi.so testapi.c";
+# Make sure we can compile
+
+my $cflags = get_config('CFLAGS');
+my $cppflags = get_config('CPPFLAGS');
+my $ldflags = get_config('LDFLAGS');
+my $sobuild = "$cc ".($srcdir? "-I$srcdir/src":'')." $cppflags $cflags -shared -fPIC $ldflags -o testapi.so testapi.c";
 
 my $clog = `$sobuild 2>&1`;
 if ($? != 0) {
index 7237e65bfd6ef76defae29ec5664333061a2fcb1..1d09174f294e574c4d4158bd3ef3ec911151fa21 100644 (file)
@@ -11,13 +11,6 @@ exists $FEATURES{'output-sync'} or return -1;
 $parallel_jobs or return -1;
 
 
-if ($vos) {
-  $sleep_command = "sleep -seconds";
-}
-else {
-  $sleep_command = "sleep";
-}
-
 # The following subdirectories with Makefiles are used in several
 # of the following tests.  The model is:
 #   foo/Makefile - has a "foo" target that waits for the bar target
@@ -45,10 +38,10 @@ sub output_sync_clean {
 # reliable.  If things are too fast, then sometimes a different job will steal
 # the output sync lock and the output is mis-ordered from what we expect.
 sub output_sync_wait {
-    return "while [ ! -f ../mksync.$_[0] ]; do :; done; rm -f ../mksync.$_[0].wait; $sleep_command 1";
+    return subst_make_string("#HELPER# -q wait ../mksync.$_[0] sleep 1");
 }
 sub output_sync_set {
-    return "date > ../mksync.$_[0]";
+    return subst_make_string("#HELPER# -q file ../mksync.$_[0]");
 }
 
 @syncfiles = qw(mksync.foo mksync.foo_start mksync.bar mksync.bar_start);
@@ -158,10 +151,10 @@ all: make-foo make-bar
 
 make-foo: ; \$(MAKE) -C foo
 
-make-bar: ; $sleep_command 1 ; \$(MAKE) -C bar!,
+make-bar: ; #HELPER# -q sleep 1 ; \$(MAKE) -C bar!,
               '-j --output-sync=target',
 "#MAKEPATH# -C foo
-$sleep_command 1 ; #MAKEPATH# -C bar
+#HELPER# -q sleep 1 ; #MAKEPATH# -C bar
 #MAKE#[1]: Entering directory '#PWD#/bar'
 bar: start
 bar: end
@@ -179,7 +172,7 @@ baz: end
 unlink(@syncfiles);
 run_make_test(undef, '-j --output-sync=target x=',
               "#MAKEPATH# -C foo
-$sleep_command 1 ; #MAKEPATH# -C bar
+#HELPER# -q sleep 1 ; #MAKEPATH# -C bar
 bar: start
 bar: end
 foo: start
@@ -195,10 +188,10 @@ all: make-foo-fail make-bar-bar
 
 make-foo-fail: ; \$(MAKE) -C foo foo-fail
 
-make-bar-bar: ; $sleep_command 1 ; \$(MAKE) -C bar bar!,
+make-bar-bar: ; #HELPER# -q sleep 1 ; \$(MAKE) -C bar bar!,
               '-j -O',
 "#MAKEPATH# -C foo foo-fail
-$sleep_command 1 ; #MAKEPATH# -C bar bar
+#HELPER# -q sleep 1 ; #MAKEPATH# -C bar bar
 #MAKE#[1]: Entering directory '#PWD#/bar'
 bar: start
 bar: end
@@ -223,10 +216,10 @@ all: make-foo make-bar
 
 make-foo: ; \$(MAKE) -C foo foo-job
 
-make-bar: ; $sleep_command 1 ; \$(MAKE) -C bar bar-job!,
+make-bar: ; #HELPER# -q sleep 1 ; \$(MAKE) -C bar bar-job!,
               '-j --output-sync=line',
 "#MAKEPATH# -C foo foo-job
-$sleep_command 1 ; #MAKEPATH# -C bar bar-job
+#HELPER# -q sleep 1 ; #MAKEPATH# -C bar bar-job
 #MAKE#[1]: Entering directory '#PWD#/foo'
 foo: start
 #MAKE#[1]: Leaving directory '#PWD#/foo'
@@ -240,7 +233,6 @@ bar: end
 foo: end
 #MAKE#[1]: Leaving directory '#PWD#/foo'\n", 0, $tmout);
 
-
 # Remove temporary directories and contents.
 output_sync_clean();
 
@@ -338,12 +330,13 @@ foo: $(OBJS) ; echo $(or $(filter %.o,$^),$(error fail))
               '-O', "#MAKEFILE#:2: *** fail.  Stop.\n", 512);
 
 # SV 47365: Make sure exec failure error messages are shown
-# Is "127" not always the same everywhere?  We may have to detect it?
-
-run_make_test(q!
+# Needs to be ported to Windows
+if ($port_type ne 'W32') {
+    run_make_test(q!
 all:: ; @./foo bar baz
 !,
-              '-O', "#MAKE#: ./foo: Command not found\n#MAKE#: *** [#MAKEFILE#:2: all] Error 127\n", 512);
+              '-O', "#MAKE#: ./foo: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:2: all] Error 127\n", 512);
+}
 
 # This tells the test driver that the perl test script executed properly.
 1;
index fabe5485c61f0630b9e3dc70eceaaf3adaf5f7a3..08f94a6b6307a8f1e00a60f454795396641f9719 100644 (file)
@@ -1,68 +1,73 @@
 #                                                                    -*-perl-*-
 
 $description = "Test parallelism (-j) option.";
-
-
-$details = "This test creates a makefile with two double-colon default
-rules.  The first rule has a series of sleep and echo commands
-intended to run in series.  The second and third have just an
-echo statement.  When make is called in this test, it is given
-the -j option with a value of 4.  This tells make that it may
-start up to four jobs simultaneously.  In this case, since the
-first command is a sleep command, the output of the second
-and third commands will appear before the first if indeed
-make is running all of these commands in parallel.";
+$details = "";
 
 if (!$parallel_jobs) {
   return -1;
 }
 
-if ($vos) {
-  $sleep_command = "sleep -seconds";
-}
-else {
-  $sleep_command = "sleep";
-}
+run_make_test("
+all : def_1 def_2 def_3
+def_1 : ; \@#HELPER# file ONE wait THREE out TWO
+def_2 : ; \@#HELPER# wait FOUR file THREE
+def_3 : ; \@#HELPER# wait ONE file FOUR",
+              '-j4', "file ONE\nwait ONE\nfile FOUR\nwait FOUR\nfile THREE\nwait THREE\nTWO");
+rmfiles(qw(ONE TWO THREE FOUR));
 
+# Verify -j added to MAKEFLAGS in the makefile
+run_make_test("
+MAKEFLAGS += -j4
+all : def_1 def_2 def_3
+def_1 : ; \@#HELPER# file ONE wait THREE out TWO
+def_2 : ; \@#HELPER# wait FOUR file THREE
+def_3 : ; \@#HELPER# wait ONE file FOUR",
+              '', "file ONE\nwait ONE\nfile FOUR\nwait FOUR\nfile THREE\nwait THREE\nTWO");
+rmfiles(qw(ONE TWO THREE FOUR));
 
+# Command line should take precedence
 run_make_test("
+MAKEFLAGS += -j2
 all : def_1 def_2 def_3
-def_1 : ; \@echo ONE; $sleep_command 3 ; echo TWO
-def_2 : ; \@$sleep_command 2 ; echo THREE
-def_3 : ; \@$sleep_command 1 ; echo FOUR",
-              '-j4', "ONE\nFOUR\nTHREE\nTWO");
+def_1 : ; \@#HELPER# file ONE wait THREE out TWO
+def_2 : ; \@#HELPER# wait FOUR file THREE
+def_3 : ; \@#HELPER# wait ONE file FOUR",
+              '-j4', "file ONE\nwait ONE\nfile FOUR\nwait FOUR\nfile THREE\nwait THREE\nTWO");
+rmfiles(qw(ONE TWO THREE FOUR));
 
 # Test parallelism with included files.  Here we sleep/echo while
 # building the included files, to test that they are being built in
 # parallel.
 run_make_test("
-all: 1 2; \@echo success
+all: 1 2; \@#HELPER# out success
 -include 1.inc 2.inc
-1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@
-2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@",
+1.inc:
+\t\@#HELPER# file ONE.inc wait THREE.inc file TWO.inc
+\t\@echo '1: ; \@#HELPER# file ONE wait THREE file TWO' > \$\@
+2.inc:
+\t\@#HELPER# wait ONE.inc file THREE.inc
+\t\@echo '2: ; \@#HELPER# wait ONE file THREE' > \$\@",
               "-j4",
-              "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n", 0, 7);
-
-rmfiles(qw(1.inc 2.inc));
+              "file ONE.inc\nwait ONE.inc\nfile THREE.inc\nwait THREE.inc\nfile TWO.inc\nfile ONE\nwait ONE\nfile THREE\nwait THREE\nfile TWO\nsuccess\n", 0, 7);
+rmfiles(qw(ONE.inc TWO.inc THREE.inc ONE TWO THREE 1.inc 2.inc));
 
 
 # Test parallelism with included files--this time recurse first and make
 # sure the jobserver works.
 run_make_test("
 recurse: ; \@\$(MAKE) --no-print-directory -f #MAKEFILE# INC=yes all
-all: 1 2; \@echo success
+all: 1 2; \@#HELPER# out success
 
 INC = no
 ifeq (\$(INC),yes)
 -include 1.inc 2.inc
 endif
 
-1.inc: ; \@echo ONE.inc; $sleep_command 2; echo TWO.inc; echo '1: ; \@echo ONE; $sleep_command 2; echo TWO' > \$\@
-2.inc: ; \@$sleep_command 1; echo THREE.inc; echo '2: ; \@$sleep_command 1; echo THREE' > \$\@",
+1.inc: ; \@#HELPER# file ONE.inc wait THREE.inc file TWO.inc; echo '1: ; \@#HELPER# file ONE wait THREE file TWO' > \$\@
+2.inc: ; \@#HELPER# wait ONE.inc file THREE.inc; echo '2: ; \@#HELPER# wait ONE file THREE' > \$\@",
               "-j4",
-              "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n", 0, 7);
-
-rmfiles(qw(1.inc 2.inc));
+              "file ONE.inc\nwait ONE.inc\nfile THREE.inc\nwait THREE.inc\nfile TWO.inc\nfile ONE\nwait ONE\nfile THREE\nwait THREE\nfile TWO\nsuccess\n", 0, 7);
+rmfiles(qw(ONE.inc TWO.inc THREE.inc ONE TWO THREE 1.inc 2.inc));
 
 # Grant Taylor reports a problem where tokens can be lost (not written back
 # to the pipe when they should be): this happened when there is a $(shell ...)
@@ -73,14 +78,14 @@ rmfiles(qw(1.inc 2.inc));
 
 run_make_test("
 export HI = \$(shell \$(\$\@.CMD))
-first.CMD = echo hi
-second.CMD = $sleep_command 4; echo hi
+first.CMD = #HELPER# out hi
+second.CMD = #HELPER# sleep 4
 
 .PHONY: all first second
 all: first second
 
-first second: ; \@echo \$\@; $sleep_command 1; echo \$\@",
-              '-j2', "first\nfirst\nsecond\nsecond", 0, 7);
+first second: ; \@#HELPER# out \$\@ sleep 1 out \$\@",
+              '-j2', "first\nsleep 1\nfirst\nsecond\nsleep 1\nsecond", 0, 7);
 
 # Michael Matz <matz@suse.de> reported a bug where if make is running in
 # parallel without -k and two jobs die in a row, but not too close to each
@@ -90,22 +95,24 @@ run_make_test("
 .PHONY: all fail.1 fail.2 fail.3 ok
 all: fail.1 ok fail.2 fail.3
 
+.RECIPEPREFIX := >
+
 fail.1 fail.2 fail.3:
-       \@$sleep_command \$(patsubst fail.%,%,\$\@)
-       \@echo Fail
-       \@exit 1
+> \@#HELPER# sleep \$(patsubst fail.%,%,\$\@)
+> \@#HELPER# out Fail
+> \@#HELPER# fail 1
 
 ok:
-       \@$sleep_command 4
-       \@echo Ok done",
-              '-rR -j5', "Fail
-#MAKE#: *** [#MAKEFILE#:8: fail.1] Error 1
+> \@#HELPER# sleep 4
+> \@#HELPER# out OK",
+              '-rR -j5', "sleep 1\nFail\nfail 1
+#MAKE#: *** [#MAKEFILE#:10: fail.1] Error 1
 #MAKE#: *** Waiting for unfinished jobs....
-Fail
-#MAKE#: *** [#MAKEFILE#:8: fail.2] Error 1
-Fail
-#MAKE#: *** [#MAKEFILE#:8: fail.3] Error 1
-Ok done",
+sleep 2\nFail\nfail 1
+#MAKE#: *** [#MAKEFILE#:10: fail.2] Error 1
+sleep 3\nFail\nfail 1
+#MAKE#: *** [#MAKEFILE#:10: fail.3] Error 1
+sleep 4\nOK",
              512);
 
 
@@ -117,24 +124,22 @@ all:; @:
 
 -include foo.d
 
-foo.d: comp
-       @echo building $@
+foo.d: comp ; @#HELPER# out $@
 
 comp: mod_a.o mod_b.o; @:
 
-mod_a.o mod_b.o:
-       @exit 1
-', '-j2', '');
+mod_a.o mod_b.o: ; @#HELPER# fail 1
+', '-j2', "fail 1\nfail 1\n");
 
 
 # TEST #9 -- Savannah bugs 3330 and 15919
 # In earlier versions of make this will either give the wrong answer, or hang.
 
 utouch(-10, 'target');
-run_make_test('target: intermed ; touch $@
+run_make_test('target: intermed ; #HELPER# file $@
 
 .INTERMEDIATE: intermed
-intermed: | phony ; touch $@
+intermed: | phony ; #HELPER# file $@
 
 .PHONY: phony
 phony: ; : phony', '-rR -j', ': phony');
@@ -148,15 +153,15 @@ $extraENV{MAKEFLAGS} = '-j4';
 run_make_test(q!
 things = thing1 thing2
 all: $(things)
-thing1:; @sleep 1; echo '$@ start'; sleep 2; echo '$@ end'
-thing2:; @echo '$@ start'; sleep 2; echo '$@ end'
+thing1:; @#HELPER# wait thing2start file $@start wait thing2end out $@end
+thing2:; @#HELPER# file $@start wait thing1start file $@end
 -include inc.mk
 inc.mk: ; @touch $@
 !,
-              '', "thing2 start\nthing1 start\nthing2 end\nthing1 end\n");
+              '', "file thing2start\nwait thing2start\nfile thing1start\nwait thing1start\nfile thing2end\nwait thing2end\nthing1end\n");
 
 delete $extraENV{MAKEFLAGS};
-rmfiles('inc.mk');
+rmfiles(qw(inc.mk thing1start thing1end thing2start thing2end));
 
 # Ensure intermediate/secondary files are not pruned incorrectly.
 # See Savannah bug #30653
@@ -175,6 +180,41 @@ file2: file1 ; @touch $@
 
 rmfiles('file1', 'file2', 'file3', 'file4');
 
+# Ensure that the jobserver is preserved across make re-exec.
+
+run_make_test(q!
+all: one two
+one: ;@ #HELPER# wait TWO file ONE
+two: ;@ #HELPER# file TWO
+include fff1.mk
+fff1.mk: ; touch $@
+!,
+              '-j2', "touch fff1.mk\nfile TWO\nwait TWO\nfile ONE\n");
+
+unlink('fff1.mk', 'ONE', 'TWO');
+
+# Test if a sub-make needs to re-exec and the makefile is built via
+# sub-make.  Reported by Masahiro Yamada <yamada.masahiro@socionext.com>
+
+run_make_test(q!
+all: ; @$(MAKE) -f #MAKEFILE# recurse
+
+recurse: one two ; @#HELPER# out $@
+one: ;@ #HELPER# wait TWO file ONE
+two: ;@ #HELPER# file TWO
+
+mkinclude: ; touch fff1.mk
+
+ifeq ($(MAKECMDGOALS),recurse)
+include fff1.mk
+fff1.mk: ; @$(MAKE) -f #MAKEFILE# mkinclude
+endif
+!,
+              '--no-print-directory -j2', "touch fff1.mk\nfile TWO\nwait TWO\nfile ONE\nrecurse\n");
+
+unlink('fff1.mk', 'ONE', 'TWO');
+
+
 # Make sure that all jobserver FDs are closed if we need to re-exec the
 # master copy.
 #
@@ -211,7 +251,3 @@ rmfiles('file1', 'file2', 'file3', 'file4');
 # rmfiles(qw(dependfile output));
 
 1;
-
-### Local Variables:
-### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action))
-### End:
index c7ae7cffc474e4a1991d8c7b9ec8390eecdb2e4a..6510c3873ab1d25c4a3f576a5639213b6bbd3925 100644 (file)
@@ -163,16 +163,16 @@ p1.% p2.%: %.orig
 # TEST 6: Make sure that non-target files are still eligible to be created
 # as part of implicit rule chaining.  Savannah bug #17752.
 
-run_make_test(q!
+run_make_test(sprintf(q!
 BIN = xyz
 COPY = $(BIN).cp
 SRC = $(BIN).c
 allbroken: $(COPY) $(BIN) ; @echo ok
 $(SRC): ; @echo 'main(){}' > $@
-%.cp: % ; @cp $< $@
-% : %.c ; @cp $< $@
-clean: ; @rm -rf $(SRC) $(COPY) $(BIN)
-!,
+%%.cp: %% ; @cp $< $@
+%% : %%.c ; @cp $< $@
+clean: ; @%s $(SRC) $(COPY) $(BIN)
+!, $CMD_rmfile),
               '', "ok\n");
 
 unlink(qw(xyz xyz.cp xyz.c));
@@ -220,6 +220,30 @@ all: foo.x foo-mt.x
 
 1;
 
+# Test pattern rules building the same targets
+# See SV 54233.  Rely on our standard test timeout to break the loop
+
+touch('a.c');
+
+run_make_test(q!
+all: a.elf a.dbg
+
+%.elf %.lnk: %.c ; : $*.elf $*.lnk
+
+%.elf %.dbg: %.lnk ; : $*.elf $*.dbg
+!,
+    '-j2', ": a.elf a.lnk\n: a.elf a.dbg\n");
+
+unlink('a.c');
+
+# SV 56655: Test patterns matching files containing whitespace
+touch('some file.yy');
+run_make_test(q!
+%.xx : %.yy ; @echo matched
+!, '"some file.xx"', "matched\n");
+
+unlink('some file.xx', 'some file.yy');
+
 # This tells the test driver that the perl test script executed properly.
 1;
 
index 916681c994b096d574368a7172c434e5170909ba..b7d95268b3cdb15ae01d6a0668e93c2f2689e5ba 100644 (file)
@@ -8,7 +8,6 @@ open(MAKEFILE,"> $makefile");
 # The Contents of the MAKEFILE ...
 
 print MAKEFILE <<'EOM';
-SHELL = /bin/sh
 TEXFONTS = NICEFONT
 DEFINES = -DDEFAULT_TFM_PATH=\".:$(TEXFONTS)\"
 test: ; @"echo" 'DEFINES = $(DEFINES)'
index fd5e3518c98719518aa32055efb332fe9dc1024f..d225c13750c8d328521597131364637b70bad24f 100644 (file)
@@ -5,16 +5,17 @@ $details = "DETAILS";
 
 # Test some basic recursion.
 run_make_test('
+.RECIPEPREFIX := |
 all:
-       $(MAKE) -f #MAKEFILE# foo
+|       $(MAKE) -f #MAKEFILE# foo
 foo:
-       @echo $(MAKE)
-       @echo MAKELEVEL = $(MAKELEVEL)
-       $(MAKE) -f #MAKEFILE# last
+|       @echo $(MAKE)
+|       @echo MAKELEVEL = $(MAKELEVEL)
+|       $(MAKE) -f #MAKEFILE# last
 last:
-       @echo $(MAKE)
-       @echo MAKELEVEL = $(MAKELEVEL)
-       @echo THE END
+|       @echo $(MAKE)
+|       @echo MAKELEVEL = $(MAKELEVEL)
+|       @echo THE END
 ',
               ('CFLAGS=-O -w' . ($parallel_jobs ? ' -j 2' : '')),
               ($vos
@@ -52,4 +53,15 @@ all: ; @echo "MAKEOVERRIDES = $(MAKEOVERRIDES)"
 MAKEOVERRIDES = a=AA
 ');
 
+# SV 46013: Ensure that MAKEOVERRIDES is passed even if set in the makefile
+run_make_test(q!
+ifeq ($(MAKELEVEL),0)
+MAKEOVERRIDES += FOO+=bar
+endif
+.PHONY: M R
+M: ; @$(MAKE) --no-print-directory -f #MAKEFILE# R
+R: ; @echo '$(FOO)'
+!,
+              '', 'bar');
+
 1;
index eb1a34920bf0b2a7c785c0d7800b46eda7b517a7..d2a1f50ca78229005e85e7f12e149854a592bf8b 100644 (file)
@@ -41,8 +41,6 @@ run_make_test(undef, '', "rebuilding #MAKEFILE#\nrunning rules.\n");
 &touch('c');
 
 run_make_test('
-SHELL = /bin/sh
-
 all: ; @echo hello
 
 a : b ; echo >> $@
@@ -57,7 +55,7 @@ include $(F)',
 # Now try with the file we're not updating being the actual file we're
 # including: this and the previous one test different parts of the code.
 
-run_make_test(undef, 'F=b', "[ -f b ] || echo >> b\nhello\n")
+run_make_test(undef, 'F=b', "[ -f b ] || echo >> b\nhello\n");
 
 &rmfiles('a','b','c');
 
@@ -78,3 +76,7 @@ unlink('foo30723');
 
 # This tells the test driver that the perl test script executed properly.
 1;
+
+### Local Variables:
+### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action))
+### End:
index 790017af7c3a91cb67a60acf565256cc28e382ba..c28641c124981d41decd6392014706614402839b 100644 (file)
@@ -164,4 +164,40 @@ foo: $$(@\\:%=%.bar); @echo '$^'
 !,
               '', "foo.bar\n");
 
+# SV 54549 : Ensure we don't free used variable_sets
+run_make_test(q!
+foo: -lcat
+
+# Removing second expansion prevents segfault
+.SECONDEXPANSION:
+foo: $$@.o ;
+
+# Having an empty command here prevents segfault unless,
+# the environment is empty. `env -i make foo`
+# MFLAGS=-w or MAKEFLAGS=-w `env MFLAGS=-w make foo`
+# libcat.a target calls an extra command, `@true \n @touch $@`
+# odd.
+%.o: ; @true
+
+# Having an empty command prevents segfault.
+-l%: lib%.a ; @true
+
+# Not creating libcat.a here prevents segfault,
+libcat.a: ; @touch $@
+!,
+              '', q!#MAKEFILE#:16: Recipe was specified for file '-lcat' at #MAKEFILE#:19,
+#MAKEFILE#:16: but '-lcat' is now considered the same file as 'libcat.a'.
+#MAKEFILE#:16: Recipe for 'libcat.a' will be ignored in favor of the one for '-lcat'.!);
+unlink('libcat.a');
+
+# SV 28456 : Don't reset $$< for default recipes
+run_make_test(q!
+.SECONDEXPANSION:
+
+.PHONY: biz baz
+biz: baz ;
+biz: $$(info $$<)
+!,
+              '', "baz\n#MAKE#: Nothing to be done for 'biz'.\n");
+
 1;
index ec09d8daae51ad6b4e21fba4fc82ad5a5ee40f6f..866d1fb014237e06caf1d722d6725e76ece208bc 100644 (file)
@@ -1,5 +1,5 @@
 #                                                                    -*-perl-*-
-$description = "Test second expansion in ordinary rules.";
+$description = "Test second expansion in implicit rules.";
 
 $details = "";
 
@@ -24,8 +24,7 @@ foo.%: 1.$$@ \
        $$(addprefix 3.,$$^) \
        $$(addprefix 4.,$$+) \
        5.$$| \
-       6.$$*
-       @:
+       6.$$* ; @:
 
 1.foo.a \
 2.bar \
@@ -36,8 +35,7 @@ foo.%: 1.$$@ \
 4.baz \
 4.biz \
 5.buz \
-6.a:
-       @echo '$@'
+6.a: ; @echo '$@'
 
 !,
 '',
@@ -64,8 +62,7 @@ run_make_test(q!
 .SECONDEXPANSION:
 foo.x:
 
-foo.%: $$(%_a) $$(%_b) bar
-       @:
+foo.%: $$(%_a) $$(%_b) bar ; @:
 
 foo.x: x_a := bar
 
@@ -137,8 +134,7 @@ $(dir)/tmp/foo/bar.c: ; @echo '$@'
 $(dir)/tmp/bar/bar.c: ; @echo '$@'
 foo.h: ; @echo '$@'
 
-%.o: $$(addsuffix /%.c,foo bar) foo.h
-       @echo '$@: {$<} $^'
+%.o: $$(addsuffix /%.c,foo bar) foo.h ; @echo '$@: {$<} $^'
 !,
               "dir=$dir", "$dir/tmp/foo/bar.c
 $dir/tmp/bar/bar.c
@@ -155,8 +151,7 @@ $(dir)/tmp/foo.o: $(dir)/tmp/foo.c
 $(dir)/tmp/foo.c: ; @echo '$@'
 bar.h: ; @echo '$@'
 
-%.o: %.c|bar.h
-       @echo '$@: {$<} {$|} $^'
+%.o: %.c|bar.h ; @echo '$@: {$<} {$|} $^'
 
 !,
               "dir=$dir", "$dir/tmp/foo.c
@@ -172,8 +167,7 @@ run_make_test(q!
 foo.o: foo.c
 foo.c: ; @echo '$@'
 
-%.o:
-       @echo '$@: {$<} $^'
+%.o: ; @echo '$@: {$<} $^'
 !,
               '', "foo.c\nfoo.o: {foo.c} foo.c\n");
 
@@ -184,11 +178,9 @@ run_make_test(q!
 .SECONDEXPANSION:
 foobarbaz:
 
-foo%baz: % $$*.1
-       @echo '$*'
+foo%baz: % $$*.1 ; @echo '$*'
 
-bar bar.1:
-       @echo '$@'
+bar bar.1: ; @echo '$@'
 !,
               '', "bar\nbar.1\nbar\n");
 
@@ -199,11 +191,9 @@ run_make_test(q!
 .SECONDEXPANSION:
 foo$$bar:
 
-f%r: % $$*.1
-       @echo '$*'
+f%r: % $$*.1 ; @echo '$*'
 
-oo$$ba oo$$ba.1:
-       @echo '$@'
+oo$$ba oo$$ba.1: ; @echo '$@'
 !,
               '', 'oo$ba
 oo$ba.1
@@ -230,15 +220,12 @@ run_make_test(q!
 sim_base_rgg := just_a_name
 sim_base_src := a
 sim_base_f := a a a
-sim_%.f: $${sim_$$*_f}
-       echo $@
-sim_%.src: $${sim_$$*_src}
-       echo $@
+sim_%.f: $${sim_$$*_f} ; echo $@
+sim_%.src: $${sim_$$*_src} ; echo $@
 sim_%: \
-       $$(if $$(sim_$$*_src),sim_%.src) \
-       $$(if $$(sim_$$*_f),sim_%.f) \
-       $$(if $$(sim_$$*_rgg),$$(sim_$$*_rgg).s)
-       echo $@
+        $$(if $$(sim_$$*_src),sim_%.src) \
+        $$(if $$(sim_$$*_f),sim_%.f) \
+        $$(if $$(sim_$$*_rgg),$$(sim_$$*_rgg).s) ; echo $@
 !,
               '-s sim_base', "#MAKE#: *** No rule to make target 'sim_base'.  Stop.", 512);
 
@@ -256,5 +243,24 @@ p% : ; : $@
 !,
               "", ": p1\n: p2\nfoo from p1 and p2\nbar from p1 and p2\n");
 
+# SV 28456 : Don't reset $$< for default recipes
+run_make_test(q!
+.SECONDEXPANSION:
+
+.PHONY: foo bar
+foo: bar
+foo: $$(info $$<)
+%oo: ;
+!,
+              '', "bar\n#MAKE#: Nothing to be done for 'foo'.\n");
+
+# SV 54161: Expand $$* properly when it contains a path
+
+run_make_test(q!
+.SECONDEXPANSION:
+%x: $$(info $$*); @echo '$*'
+!,
+              'q/ux', "q/u\nq/u\n");
+
 # This tells the test driver that the perl test script executed properly.
 1;
diff --git a/tests/scripts/features/suffixrules b/tests/scripts/features/suffixrules
new file mode 100644 (file)
index 0000000..b8f4652
--- /dev/null
@@ -0,0 +1,99 @@
+#                                                                    -*-perl-*-
+
+$description = "Test suffix rules.";
+
+$details = "";
+
+# TEST #0: Clear all suffixes
+
+touch('foo.c');
+
+run_make_test(q!
+.SUFFIXES:
+all: foo.o ; @echo $@ $<
+!,
+              '', "#MAKE#: *** No rule to make target 'foo.o', needed by 'all'.  Stop.\n", 512);
+
+unlink('foo.c');
+
+# Test #1: Add a simple suffix rule
+
+touch('foo.baz');
+
+run_make_test(q!
+.SUFFIXES: .biz .baz
+
+.baz.biz: ; @echo make $@
+!,
+              'foo.biz', "make foo.biz\n");
+
+unlink('foo.baz');
+
+# Test #2: Make sure the defaults still work
+
+touch('foo.c');
+
+run_make_test(undef, 'foo.o COMPILE.c=@echo OUTPUT_OPTION=', "foo.c\n");
+
+unlink('foo.c');
+
+# Test #3: Replacing all suffixes
+
+touch('foo.baz');
+
+run_make_test(q!
+.SUFFIXES:
+.SUFFIXES: .biz .baz
+
+.baz.biz: ; @echo make $@
+!,
+              'foo.biz', "make foo.biz\n");
+
+unlink('foo.baz');
+
+# SV 40657: Test #4: "Suffix rules" with deps are normal rules
+
+my $prewarn = 'warning: ignoring prerequisites on suffix rule definition';
+
+touch('foo.bar');
+
+run_make_test(q!
+.SUFFIXES:
+.SUFFIXES: .biz .baz
+
+$X.POSIX:
+
+.baz.biz: foo.bar ; @echo make $@ from $<
+!,
+              'X=1 .baz.biz', "#MAKEFILE#:7: $prewarn\nmake .baz.biz from foo.bar\n");
+
+# SV 40657: Test #5: In POSIX mode we don't get a warning
+
+run_make_test(undef, 'X= .baz.biz', "make .baz.biz from foo.bar\n");
+
+unlink('foo.bar');
+
+# SV 40657: Test #6: In POSIX mode, no pattern rules should be created
+
+utouch(-20, 'foo.baz');
+
+run_make_test(undef,
+              'X= foo.biz', "#MAKE#: *** No rule to make target 'foo.biz'.  Stop.\n", 512);
+
+# SV 40657: Test #7: In Non-POSIX mode, a pattern rule is created
+
+run_make_test(undef,
+              'X=1 foo.biz', "#MAKEFILE#:7: $prewarn\nmake foo.biz from foo.baz\n");
+
+# SV 40657: Test #8: ... but any prerequisites are ignored
+
+utouch(-10, 'foo.biz');
+touch('foo.bar');
+
+run_make_test(undef,
+              'X=1 foo.biz', "#MAKEFILE#:7: $prewarn\n#MAKE#: 'foo.biz' is up to date.\n");
+
+unlink('foo.baz', 'foo.biz', 'foo.bar');
+
+# Complete
+1;
index a9b8dbebc413af519a1dd85b4b2f3606acc555eb..2929b2cc523d2b4800f5ce0be2bc430cca4c6a23 100644 (file)
@@ -7,7 +7,6 @@ values, override and non-override, and using various variable expansion
 rules, semicolon interference, etc.";
 
 run_make_test('
-SHELL = /bin/sh
 export FOO = foo
 export BAR = bar
 one: override FOO = one
@@ -256,6 +255,32 @@ a: ; @echo $(A)
 !,
               '', "hello; world\n");
 
+# TEST #21: SV-56834 Ensure setting PATH in a target var works properly
+my $sname = "foobar$scriptsuffix";
+
+mkdir('sd', 0775);
+create_file("sd/$sname", "exit 0\n");
+chmod 0755, "sd/$sname";
+
+run_make_test(qq!
+all: PATH := sd
+all: ; $sname >/dev/null
+!,
+              '', "$sname >/dev/null\n");
+
+# Don't use the general PATH if not found on the target path
+
+$extraENV{PATH} = "$ENV{PATH}:sd";
+
+run_make_test(qq!
+all: PATH := ..
+all: ; $sname
+!,
+              '', "$sname\n#MAKE#: $sname: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512);
+
+unlink("sd/$sname");
+rmdir ('sd');
+
 # TEST #19: Test define/endef variables as target-specific vars
 
 # run_make_test('
@@ -271,3 +296,7 @@ a: ; @echo $(A)
 #               '', "local\n");
 
 1;
+
+### Local Variables:
+### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action))
+### End:
index 7e970a710ba9b8da4e7dd3b11f6f399dccaadb00..c8de29bc1948b5105804bdb67bd660d48c16a7a1 100644 (file)
@@ -13,10 +13,10 @@ open(MAKEFILE,"> $makefile");
 
 # The Contents of the MAKEFILE ...
 
-print MAKEFILE "VPATH = $workdir:$sourcedir\n";
+print MAKEFILE "VPATH = $workdir:$scriptdir\n";
 print MAKEFILE "vpath %.c foo\n";
 print MAKEFILE "vpath %.c $workdir\n";
-print MAKEFILE "vpath %.c $sourcedir\n";
+print MAKEFILE "vpath %.c $scriptdir\n";
 print MAKEFILE "vpath %.h $workdir\n";
 print MAKEFILE "vpath %.c\n";
 print MAKEFILE "vpath\n";
index 9ade3f0c3d7de68cf18e2acc1a6c10d5ee1dbf2e..978aecb85a7935921b02e36f984e51b50aebd018 100644 (file)
@@ -12,9 +12,6 @@ open(MAKEFILE,"> $makefile");
 print MAKEFILE "VPATH = $VP\n";
 
 print MAKEFILE <<'EOMAKE';
-
-SHELL = /bin/sh
-
 .SUFFIXES: .a .b .c .d
 .PHONY: general rename notarget intermediate
 
@@ -86,7 +83,7 @@ cat ${VP}foo.c bar.c > foo.b 2>/dev/null || exit 1
 
 $answer = "not creating notarget.c from notarget.d
 cat notarget.c > notarget.b 2>/dev/null || exit 1
-$make_name: *** [$makefile:16: notarget.b] Error 1
+$make_name: *** [$makefile:13: notarget.b] Error 1
 ";
 
 &compare_output($answer,&get_logfile(1));
@@ -99,10 +96,12 @@ $make_name: *** [$makefile:16: notarget.b] Error 1
 
 push(@touchedfiles, "inter.a", "inter.b");
 
+my $be = pack("L", 1) eq pack("N", 1);
+my $intfiles = $be ? "inter.c inter.b" : "inter.b inter.c";
 $answer = "cat ${VP}inter.d > inter.c
 cat inter.c > inter.b 2>/dev/null || exit 1
 cat inter.b > inter.a
-rm inter.b inter.c
+rm $intfiles
 ";
 &compare_output($answer,&get_logfile(1));
 
index 84c30ab8623af6187b0ceb367361e315308f1314..59bd3841bc5df3c06ce04441390a8c8228086d24 100644 (file)
@@ -3,6 +3,9 @@ $description = "Test the abspath functions.";
 
 $details = "";
 
+# Someone needs to rewrite this to be portable for Windows
+$port_type eq 'W32' and return -1;
+
 run_make_test('
 ifneq ($(realpath $(abspath .)),$(CURDIR))
   $(warning .: abs="$(abspath .)" real="$(realpath $(abspath .))" curdir="$(CURDIR)")
index 904db790404b702b23e7003288e297bec3bdf5e5..eaabd3ac29134959681d0dceef6e764a7ce3532d 100644 (file)
@@ -48,22 +48,11 @@ x:;@cat 4touch
 unlink('4touch');
 
 # Test > to a read-only file
-touch('file.out');
-chmod(0444, 'file.out');
-
-# Find the error that will be printed
-# This seems complicated, but we need the message from the C locale
-my $loc = undef;
-if ($has_POSIX) {
-    $loc = POSIX::setlocale(POSIX::LC_MESSAGES);
-    POSIX::setlocale(POSIX::LC_MESSAGES, 'C');
-}
-my $e;
-open(my $F, '>', 'file.out') and die "Opened read-only file!\n";
-$e = "$!";
-$loc and POSIX::setlocale(POSIX::LC_MESSAGES, $loc);
+if (defined $ERR_read_only_file) {
+    touch('file.out');
+    chmod(0444, 'file.out');
 
-run_make_test(q!
+    run_make_test(q!
 define A
 a
 b
@@ -71,10 +60,11 @@ endef
 $(file     >     file.out,$(A))
 x:;@cat file.out
 !,
-              '', "#MAKEFILE#:6: *** open: file.out: $e.  Stop.",
-              512);
+                  '', "#MAKEFILE#:6: *** open: file.out: $ERR_read_only_file.  Stop.",
+                  512);
 
-unlink('file.out');
+    unlink('file.out');
+}
 
 # Use variables for operator and filename
 run_make_test(q!
index 451839a2f74168a81262ef2c2efd5cd592e569cc..9badc52e49c0f4de8720ad450899a7c6f1c36a37 100644 (file)
@@ -7,7 +7,7 @@ $details = "This is a test of the foreach function in gnu make.
 This function starts with a space separated list of
 names and a variable. Each name in the list is subsituted
 into the variable and the given text evaluated. The general
-form of the command is $(foreach var,$list,$text). Several
+form of the command is $(foreach var,\$list,\$text). Several
 types of foreach loops are tested\n";
 
 
index c63bec9ba1d4e8dd4a94dc7db594a7ae343036cc..120aaf3bce1fc20dc454024985094568fc7f12b0 100644 (file)
@@ -21,6 +21,9 @@ $details = 'This only works on systems that support it.';
 # If we don't have Guile support, never mind.
 exists $FEATURES{guile} or return -1;
 
+# Guile and Valgrind don't play together at all.
+$valgrind and return -1;
+
 # Verify simple data type conversions
 # Currently we don't support vectors:
 #    echo '$(guile (vector 1 2 3))'; \
@@ -36,6 +39,20 @@ x:;@echo '$(guile #f)'; \
 !,
               '', "\n#t\nc\n1234\nfoo\nbar\na b\na b c d 1 2 3");
 
+# Verify guile functions in variables -- SV 43378
+run_make_test(q!
+res := $(guile #f) \
+       $(guile #t) \
+       $(guile #\c) \
+       $(guile 1234) \
+       $(guile 'foo) \
+       $(guile "bar") \
+       $(guile (cons 'a 'b)) \
+       $(guile '(a b (c . d) 1 (2) 3))
+x:;@echo '$(res)'
+!,
+              '', " #t c 1234 foo bar a b a b c d 1 2 3");
+
 # Verify the gmk-expand function
 run_make_test(q!
 VAR = $(guile (gmk-expand "$(shell echo hi)"))
index 9b503b42178a1ad220e66357acd21165abbe0beb..fcea515522ba2fd3573d65765047ce8e47848105 100644 (file)
@@ -3,78 +3,88 @@ $description = "Test the realpath functions.";
 
 $details = "";
 
+# Check the local directory's realpath
 run_make_test('
 ifneq ($(realpath .),$(CURDIR))
-  $(error )
+  $(warning $(realpath .) != $(CURDIR))
 endif
 
 ifneq ($(realpath ./),$(CURDIR))
-  $(error )
+  $(warning $(realpath ./) != $(CURDIR))
 endif
 
 ifneq ($(realpath .///),$(CURDIR))
-  $(error )
+  $(warning $(realpath .///) != $(CURDIR))
 endif
 
-ifneq ($(realpath /),/)
-  $(error )
-endif
+.PHONY: all
+all: ; @:
+',
+              '', '');
 
-ifneq ($(realpath /.),/)
-  $(error )
+# Find the realpath to the root of the partition
+create_file('root.mk', 'all:;$(info $(realpath /))');
+my $root = `$make_path -sf root.mk`;
+unlink('root.mk');
+chomp $root;
+
+my $tst = '
+ifneq ($(realpath /.),#ROOT#)
+  $(warning $(realpath /.) != #ROOT#)
 endif
 
-ifneq ($(realpath /./),/)
-  $(error )
+ifneq ($(realpath /./),#ROOT#)
+  $(warning $(realpath /./) != #ROOT#)
 endif
 
-ifneq ($(realpath /.///),/)
-  $(error )
+ifneq ($(realpath /.///),#ROOT#)
+  $(warning $(realpath /.///) != #ROOT#)
 endif
 
-ifneq ($(realpath /..),/)
-  $(error )
+ifneq ($(realpath /..),#ROOT#)
+  $(warning $(realpath /..) != #ROOT#)
 endif
 
-ifneq ($(realpath /../),/)
-  $(error )
+ifneq ($(realpath /../),#ROOT#)
+  $(warning $(realpath /../) != #ROOT#)
 endif
 
-ifneq ($(realpath /..///),/)
-  $(error )
+ifneq ($(realpath /..///),#ROOT#)
+  $(warning $(realpath /..///) != #ROOT#)
 endif
 
-ifneq ($(realpath . /..),$(CURDIR) /)
-  $(error )
+ifneq ($(realpath . /..),$(CURDIR) #ROOT#)
+  $(warning $(realpath . /..) != $(CURDIR) #ROOT#)
 endif
 
 .PHONY: all
 all: ; @:
-',
-              '',
-              '');
+';
+$tst =~ s/#ROOT#/$root/g;
+run_make_test($tst, '', '');
 
-# On Windows platforms, "//" means something special.  So, don't do these
-# tests there.
+# On Windows platforms "//" means something special.  So, don't do these tests
+# there.
 
 if ($port_type ne 'W32') {
-  run_make_test('
-ifneq ($(realpath ///),/)
-  $(error )
+  $tst = '
+ifneq ($(realpath ///),#ROOT#)
+  $(warning $(realpath ///) != #ROOT#)
 endif
 
-ifneq ($(realpath ///.),/)
-  $(error )
+ifneq ($(realpath ///.),#ROOT#)
+  $(warning $(realpath ///.) != #ROOT#)
 endif
 
-ifneq ($(realpath ///..),/)
-  $(error )
+ifneq ($(realpath ///..),#ROOT#)
+  $(warning $(realpath ///..) != #ROOT#)
 endif
 
 .PHONY: all
-all: ; @:',
-                '',
-                '');
+all: ; @:';
+  $tst =~ s/#ROOT#/$root/g;
+
+  run_make_test($tst, '', '');
 }
 
 
index 809c77fa6afdd4290a43106945397f40b7e99f4c..59865293e6f2697d41d57fd16dd0c838ca596a5c 100644 (file)
@@ -25,15 +25,12 @@ BAD := $(.SHELLSTATUS)
 all: ; @echo PRE=$(PRE) OK=$(OK) BAD=$(BAD)
               ','','PRE= OK=0 BAD=1');
 
-
 # Test unescaped comment characters in shells.  Savannah bug #20513
-if ($all_tests) {
-    run_make_test(q!
+run_make_test(q!
 FOO := $(shell echo '#')
 foo: ; echo '$(FOO)'
 !,
-              '', "#\n");
-}
+              '', "echo '#'\n#\n");
 
 # Test shells inside exported environment variables.
 # This is the test that fails if we try to put make exported variables into
@@ -44,14 +41,47 @@ export HI = $(shell echo hi)
 all: ; @echo $$HI
     ','','hi');
 
-# Test shell errors in recipes including offset
-run_make_test('
+if ($port_type ne 'W32') {
+    # Test shell errors in recipes including offset
+    # This needs to be ported to Windows, or else Windows error messages
+    # need to converted to look like more normal make errors.
+    run_make_test('
 all:
        @echo hi
        $(shell ./basdfdfsed there)
-       @echo there
+       @echo $(.SHELLSTATUS)
+',
+                  '', "#MAKE#: ./basdfdfsed: $ERR_no_such_file\nhi\n127\n");
+
+    run_make_test('
+$(shell ./basdfdfsed where)
+all: ; @echo $(.SHELLSTATUS)
 ',
-              '', "#MAKE#: ./basdfdfsed: Command not found\nhi\nthere\n");
+                  '', "#MAKE#: ./basdfdfsed: $ERR_no_such_file\n127\n");
+
+    # Test SHELLSTATUS for kill.
+    # This test could be ported to Windows, using taskkill ... ?
+
+    # Figure out the exit code for SIGINT
+    my $pid = fork();
+    if (! $pid) {
+        exec('kill -2 $$') or die "exec: Cannot execute sleep\n";
+    }
+    waitpid($pid, 0);
+    # .SHELLSTATUS for a signal gives 128 + the signal number
+    my $ret = $?;
+    if ($ret > 255) {
+       # Solaris 10 perl 5.8.4 puts signal number + 128 into the high 8 bits.
+       $ret >>= 8;
+    }
+    $ret |= 128;
+
+    run_make_test('.PHONY: all
+$(shell kill -2 $$$$)
+STAT := $(.SHELLSTATUS)
+all: ; @echo STAT=$(STAT)
+              ','',"STAT=$ret\n");
+}
 
 1;
 
index bcd84ad793a3ff40c7924422a455b95bea94a8b0..f01f574a97ab626d0b1a2123a8f931f535144cdd 100644 (file)
@@ -13,57 +13,38 @@ test echo's all files which match '?.example' and
 [a-z0-9].example.  Lastly we clean up all of the files using
 the '*' wildcard as in the first test";
 
-open(MAKEFILE,"> $makefile");
+touch("example.1");
+touch("example.two");
+touch("example.3");
+touch("example.for");
+touch("example._");
 
-# The Contents of the MAKEFILE ...
+# TEST #1
+# -------
 
-print MAKEFILE <<EOM;
+run_make_test(qq/
 .PHONY: print1 print2 clean
-print1: ;\@echo \$(sort \$(wildcard example.*))
+print1: ;\@echo \$(wildcard example.*)
 print2:
-\t\@echo \$(sort \$(wildcard example.?))
-\t\@echo \$(sort \$(wildcard example.[a-z0-9]))
-\t\@echo \$(sort \$(wildcard example.[!A-Za-z_\\!]))
+\t\@echo \$(wildcard example.?)
+\t\@echo \$(wildcard example.[a-z0-9])
+\t\@echo \$(wildcard example.[!A-Za-z_\\!])
 clean:
-\t$delete_command \$(sort \$(wildcard example.*))
-EOM
-
-# END of Contents of MAKEFILE
-
-close(MAKEFILE);
-
-&touch("example.1");
-&touch("example.two");
-&touch("example.3");
-&touch("example.for");
-&touch("example._");
-
-# TEST #1
-# -------
-
-$answer = "example.1 example.3 example._ example.for example.two\n";
-
-&run_make_with_options($makefile,"print1",&get_logfile);
-
-&compare_output($answer,&get_logfile(1));
-
+\t$CMD_rmfile \$(wildcard example.*)
+/,
+              'print1', "example.1 example.3 example._ example.for example.two\n");
 
 # TEST #2
 # -------
 
-$answer = "example.1 example.3 example._\n"
-         ."example.1 example.3\n"
-         ."example.1 example.3\n";
-
-&run_make_with_options($makefile,"print2",&get_logfile);
-
-&compare_output($answer,&get_logfile(1));
-
+run_make_test(undef, 'print2', "example.1 example.3 example._\n"
+                               ."example.1 example.3\n"
+                               ."example.1 example.3\n");
 
 # TEST #3
 # -------
 
-$answer = "$delete_command example.1 example.3 example._ example.for example.two";
+$answer = "$CMD_rmfile example.1 example.3 example._ example.for example.two";
 if ($vos)
 {
    $answer .= " \n";
@@ -73,13 +54,7 @@ else
    $answer .= "\n";
 }
 
-&run_make_with_options($makefile,"clean",&get_logfile);
-
-if ((-f "example.1")||(-f "example.two")||(-f "example.3")||(-f "example.for")) {
-   $test_passed = 0;
-}
-
-&compare_output($answer,&get_logfile(1));
+run_make_test(undef, 'clean', $answer);
 
 # TEST #4: Verify that failed wildcards don't return the pattern
 
@@ -92,12 +67,97 @@ all: ; @echo $(wildcard xz--y*.7)
 
 touch('xxx.yyy');
 
-run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!,
-              '', "file=xxx.yyy\n");
+run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!, '', "file=xxx.yyy\n");
 
 unlink('xxx.yyy');
 
-run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!,
-              '', "file=\n");
+run_make_test(q!exists: ; @echo file=$(wildcard xxx.yyy)!, '', "file=\n");
+
+# TEST #7: verify that when the input pattern has a trailing slash wildcard
+# returns only directories.
+#
+# Currently this doesn't work with our embedded GLOB so disable it.
+# -------
+
+if (get_config('USE_SYSTEM_GLOB') eq 'yes') {
+  touch("hellof");
+  mkdir("hellod", 0770);
+  mkdir("hellod/worldd", 0770);
+  touch("hellod/worldf");
+  mkdir("hellod/worldd/kend1", 0770);
+  mkdir("hellod/worldd/kend2", 0770);
+  touch("hellod/worldd/kenf1");
+  touch("hellod/worldd/kenf2");
+
+  run_make_test(qq!
+print3:
+\t\@echo \$(wildcard hello*)
+\t\@echo \$(wildcard hello*/)
+\t\@echo \$(wildcard hellod/world*)
+\t\@echo \$(wildcard hellod/world*/)
+\t\@echo \$(wildcard hello* hellod/world*)
+\t\@echo \$(wildcard hello*/ hellod/world*/)
+\t\@echo \$(wildcard hellod/*)
+\t\@echo \$(wildcard hellod/*/)
+\t\@echo \$(wildcard */world*)
+\t\@echo \$(wildcard */worldd/)
+\t\@echo \$(wildcard hellod/*/ken*/)
+\t\@echo \$(wildcard hellod/*/ken?[12])
+\t\@echo \$(wildcard hellod/*/ken?[12]/)
+!, '',
+                "hellod hellof\n"
+                ."hellod/\n"
+                ."hellod/worldd hellod/worldf\n"
+                ."hellod/worldd/\n"
+                ."hellod hellof hellod/worldd hellod/worldf\n"
+                ."hellod/ hellod/worldd/\n"
+                ."hellod/worldd hellod/worldf\n"
+                ."hellod/worldd/\n"
+                ."hellod/worldd hellod/worldf\n"
+                ."hellod/worldd/\n"
+                ."hellod/worldd/kend1/ hellod/worldd/kend2/\n"
+                ."hellod/worldd/kend1 hellod/worldd/kend2 "
+                ."hellod/worldd/kenf1 hellod/worldd/kenf2\n"
+                ."hellod/worldd/kend1/ hellod/worldd/kend2/\n");
+
+  unlink('hellof', 'hellod/worldf', 'hellod/worldd/kenf1',
+         'hellod/worldd/kenf2');
+  foreach $d ('hellod/worldd/kend1', 'hellod/worldd/kend2', 'hellod/worldd',
+              'hellod') {
+    rmdir($d);
+  }
+}
+
+if ($port_type ne 'W32') {
+  # Check wildcard on the root directory
+  run_make_test('print4: ; @echo $(wildcard /)', '', "/\n");
+}
+
+if ($port_type ne 'W32' && eval { symlink("",""); 1 }) {
+
+  # TEST #6: check for wildcards matching directories
+  # See SV 53465
+
+  my $dir = '__rdir';
+  my $lnk = '__ldir';
+  mkdir($dir, 0777);
+  symlink($dir, $lnk);
+
+  run_make_test(qq!all: ; \@echo \$(wildcard $lnk*/.)!, '', "$lnk/.");
+
+  unlink($lnk);
+  rmdir($dir);
+
+  # Test for dangling symlinks
+  # This doesn't work with the built-in glob... needs to be updated!
+
+  if (get_config('USE_SYSTEM_GLOB') eq 'yes') {
+    symlink($dir, $lnk);
+
+    run_make_test(qq!all: ; \@echo \$(wildcard $lnk)!, '', "$lnk");
+
+    unlink($lnk);
+  }
+}
 
 1;
index fc323ce91b7d0b4fce29aa5678efae0e07290196..fdf4aabcb76f06d68f15684dec28e8e1bab9629e 100644 (file)
@@ -18,8 +18,11 @@ run_make_test("slow:;\@: no-op; echo sl\\\now\n",
 run_make_test("dquote:;\@echo \"dqu\\\note\"\n",
               '', 'dquote');
 
-run_make_test("squote:;\@echo 'squ\\\note'\n",
+# Single quotes don't behave the same in Windows
+if ($port_type ne 'W32') {
+    run_make_test("squote:;\@echo 'squ\\\note'\n",
               '', "squ\\\note");
+}
 
 # Ensure that a leading prefix character is omitted
 run_make_test("fast:;\@echo fa\\\n\tst\n",
@@ -31,8 +34,11 @@ run_make_test("slow:;\@: no-op; echo sl\\\n\tow\n",
 run_make_test("dquote:;\@echo \"dqu\\\n\tote\"\n",
               '', 'dquote');
 
-run_make_test("squote:;\@echo 'squ\\\n\tote'\n",
+# Single quotes don't behave the same in Windows
+if ($port_type ne 'W32') {
+    run_make_test("squote:;\@echo 'squ\\\n\tote'\n",
               '', "squ\\\note");
+}
 
 # Ensure that ONLY the leading prefix character is omitted
 run_make_test("fast:;\@echo fa\\\n\t  st\n",
@@ -133,7 +139,6 @@ sub xlate
     s/\\r/\r/g;
     s/\\t/\t/g;
     s/\\f/\f/g;
-    s/\\v/\v/g;
     s/\\n/\n/g;
     return $_;
 }
index 18606c3aa77f650b07a4db01980ce249367a8cf2..b16ea8da548ae4531a448c23068d140db4bffbc8 100644 (file)
@@ -2,8 +2,8 @@
 
 $description = "Make sure make exits with an error if stdout is full.";
 
-if (-e '/dev/full') {
-  run_make_test('', '-v > /dev/full', '/^#MAKE#: write error/', 256);
-}
+-e '/dev/full' or return -1;
+
+run_make_test('', '-v > /dev/full', '/^#MAKE#: write error/', 256);
 
 1;
index 7bbff1c2c7b08403fcc917222d084730602043fb..455027aa0dcb32131c41ea31de24cc752896e009 100644 (file)
@@ -88,25 +88,27 @@ foo bar
 foo bar');
 
 # Test the fastpath / single quotes
-run_make_test("
+# Single quotes don't behave the same in Windows
+if ($port_type ne 'W32') {
+    run_make_test(q!
 all:
-       \@echo 'foo\\
+       @echo 'foo\
 bar'
-       \@echo 'foo\\
+       @echo 'foo\
        bar'
-       \@echo 'foo\\
+       @echo 'foo\
     bar'
-       \@echo 'foo\\
+       @echo 'foo\
            bar'
-       \@echo 'foo \\
+       @echo 'foo \
 bar'
-       \@echo 'foo \\
+       @echo 'foo \
        bar'
-       \@echo 'foo \\
+       @echo 'foo \
     bar'
-       \@echo 'foo \\
+       @echo 'foo \
            bar'
-",
+!,
               '', 'foo\
 bar
 foo\
@@ -123,6 +125,7 @@ foo \
     bar
 foo \
     bar');
+}
 
 # Test the fastpath / double quotes
 run_make_test('
@@ -229,25 +232,25 @@ foo bar
 hi');
 
 # Test the slow path / single quotes
-run_make_test("
+run_make_test(q!
 all:
-       \@echo hi; echo 'foo\\
+       @echo hi; echo 'foo\
 bar'
-       \@echo hi; echo 'foo\\
+       @echo hi; echo 'foo\
        bar'
-       \@echo hi; echo 'foo\\
+       @echo hi; echo 'foo\
     bar'
-       \@echo hi; echo 'foo\\
+       @echo hi; echo 'foo\
            bar'
-       \@echo hi; echo 'foo \\
+       @echo hi; echo 'foo \
 bar'
-       \@echo hi; echo 'foo \\
+       @echo hi; echo 'foo \
        bar'
-       \@echo hi; echo 'foo \\
+       @echo hi; echo 'foo \
     bar'
-       \@echo hi; echo 'foo \\
+       @echo hi; echo 'foo \
            bar'
-",
+!,
               '', 'hi
 foo\
 bar
@@ -312,4 +315,33 @@ foo     bar');
 
 run_make_test('x:;@-exit 1', '', "#MAKE#: [#MAKEFILE#:1: x] Error 1 (ignored)\n");
 
+# Slow path with odd setups
+
+if ($port_type ne 'W32') {
+    run_make_test(q!
+    slow: SHELL := echo
+    slow: .SHELLFLAGS := hoho
+    slow:; @foo bar
+    !,
+                  '', "hoho foo bar\n");
+
+    run_make_test(q!
+    slow: SHELL := echo hi
+    slow: .SHELLFLAGS := ho ho
+    slow:; @foo bar
+    !,
+                  '', "hi ho ho foo bar\n");
+
+    run_make_test(q!
+    slow: SHELL := echo hi
+    slow: .SHELLFLAGS := 'ho;ho'
+    slow:; @foo bar
+    !,
+                  '', "hi ho;ho foo bar\n");
+}
+
 1;
+
+### Local Variables:
+### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action))
+### End:
index 6d42a16dcb07f371241f941f1341196775237556..eeb8d106754122f0996f09f48d426d2429cbea60 100644 (file)
@@ -79,4 +79,43 @@ all: ; \@echo hi
 ",
               '', "hi\n");
 
+# SV-56834 Ensure setting PATH in the makefile works properly
+my $sname = "foobar$scriptsuffix";
+
+mkdir('sd', 0775);
+create_file("sd/$sname", "exit 0\n");
+chmod 0755, "sd/$sname";
+
+run_make_test(qq!
+PATH := sd
+all: ; $sname >/dev/null
+!,
+              '', "$sname >/dev/null\n");
+
+# Don't use the general PATH if not found on the target path
+
+$extraENV{PATH} = "$ENV{PATH}:sd";
+
+run_make_test(qq!
+PATH := ..
+all: ; $sname
+!,
+              '', "$sname\n#MAKE#: $sname: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512);
+
+unlink("sd/$sname");
+rmdir('sd');
+
+# Ensure that local programs are not found if "." is not on the PATH
+
+create_file($sname, '');
+chmod 0755, $sname;
+
+run_make_test(qq!
+PATH := ..
+all: ; $sname
+!,
+              '', "$sname\n#MAKE#: $sname: $ERR_no_such_file\n#MAKE#: *** [#MAKEFILE#:3: all] Error 127", 512);
+
+unlink($sname);
+
 1;
index 42d0a8baeb43bdcd20cf3357b41d518502c079b5..7daf69f24c1a5b24bbde59a5777583633092541b 100644 (file)
@@ -11,23 +11,23 @@ find the makefile and the file to delete in the work directory.";
 $example = $workdir . $pathsep . "EXAMPLE";
 
 open(MAKEFILE,"> $makefile");
-print MAKEFILE <<EOF;
+print MAKEFILE qq!
 all: ; \@echo This makefile did not clean the dir ... good
-clean: ; $delete_command EXAMPLE\$(ext)
-EOF
+clean: ; $CMD_rmfile EXAMPLE\$(ext)
+!;
 close(MAKEFILE);
 
 # TEST #1
 # -------
-&touch($example);
+touch($example);
 
-&run_make_with_options("${testname}.mk",
-                      "-C $workdir clean",
-                      &get_logfile);
+run_make_with_options("${testname}.mk", "-C $workdir clean", &get_logfile);
+
+use Cwd;
 
 chdir $workdir;
-$wpath = &get_this_pwd;
-chdir $pwd;
+$wpath = cwd();
+chdir $cwdpath;
 
 if (-f $example) {
   $test_passed = 0;
@@ -35,10 +35,10 @@ if (-f $example) {
 
 # Create the answer to what should be produced by this Makefile
 $answer = "$make_name: Entering directory '$wpath'\n"
-        . "$delete_command EXAMPLE\n"
+        . "$CMD_rmfile EXAMPLE\n"
         . "$make_name: Leaving directory '$wpath'\n";
 
-&compare_output($answer,&get_logfile(1));
+compare_output($answer,&get_logfile(1));
 
 
 # TEST #2
@@ -47,15 +47,9 @@ $answer = "$make_name: Entering directory '$wpath'\n"
 
 $example .= "slash";
 
-&touch($example);
+touch($example);
 
-&run_make_with_options("${testname}.mk",
-                      "-C $workdir/ clean ext=slash",
-                      &get_logfile);
-
-chdir $workdir;
-$wpath = &get_this_pwd;
-chdir $pwd;
+run_make_with_options("${testname}.mk", "-C $workdir/ clean ext=slash", &get_logfile);
 
 if (-f $example) {
   $test_passed = 0;
@@ -63,9 +57,10 @@ if (-f $example) {
 
 # Create the answer to what should be produced by this Makefile
 $answer = "$make_name: Entering directory '$wpath'\n"
-        . "$delete_command EXAMPLEslash\n"
+        . "$CMD_rmfile EXAMPLEslash\n"
         . "$make_name: Leaving directory '$wpath'\n";
 
 &compare_output($answer,&get_logfile(1));
 
+unlink($example);
 1;
index d47a8d8a1e4c0f264b1d51a30993f34a38cc4895..5d2df3898645830bb0bf5a8d7f75dc5a0c67e25e 100644 (file)
@@ -50,10 +50,12 @@ $answer = "This is another included makefile\n";
 &compare_output($answer,&get_logfile(1));
 
 
-$answer = "$mkpath ANOTHER -f $makefile
-${make_name}[1]: Entering directory '$pwd'
+$answer = subst_make_string("$mkpath ANOTHER -f $makefile
+#MAKE#[1]: Entering directory '#PWD#'
 This is another included makefile
-${make_name}[1]: Leaving directory '$pwd'\n";
+#MAKE#[1]: Leaving directory '#PWD#'\n");
 
 &run_make_with_options($makefile,"-I $workdir recurse",&get_logfile);
 &compare_output($answer,&get_logfile(1));
+
+1;
index 85dd0b0a3b6fe94c45acae28b1b4b4f873efc68d..cd78e7f00ae8238113797fa5a439532f8ffd5463 100644 (file)
@@ -100,15 +100,17 @@ $make_name: Target 'all' not remade because of errors.\n";
 # TEST -- make sure we keep the error code if we can't create an included
 # makefile.
 
-run_make_test('all: ; @echo hi
+if (defined $ERR_no_such_file) {
+    run_make_test('all: ; @echo hi
 include ifile
 ifile: no-such-file; @false
 ',
-              '-k',
-              "#MAKEFILE#:2: ifile: No such file or directory
+                  '-k',
+                  "#MAKEFILE#:2: ifile: $ERR_no_such_file
 #MAKE#: *** No rule to make target 'no-such-file', needed by 'ifile'.
 #MAKE#: Failed to remake makefile 'ifile'.
 hi\n",
-              512);
+                  512);
+}
 
 1;
index 0b0f196f9c926a4e204dc9588b12f2aebe05299b..637c8bd8f697e0bfae023d4c24e716ff7ac9688a 100644 (file)
@@ -16,16 +16,14 @@ that the load will be above this number and make will therefore
 decide that it cannot run more than one job even though -j 4 was
 also specified on the command line.";
 
-open(MAKEFILE,"> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE <<'EOF';
-SHELL = /bin/sh
+# On Windows a very different algorithm is used.
+$port_type eq 'W32' and return -1;
 
+open(MAKEFILE,"> $makefile");
+printf MAKEFILE q,
 define test
 if [ ! -f test-file ]; then \
-  echo >> test-file; sleep 2; rm -f test-file; \
+  echo >> test-file; sleep 2; %s test-file; \
 else \
   echo $@ FAILED; \
 fi
@@ -35,11 +33,7 @@ all : ONE TWO THREE
 ONE : ; @$(test)
 TWO : ; @$(test)
 THREE : ; @$(test)
-EOF
-
-
-# END of Contents of MAKEFILE
-
+,, $CMD_rmfile;
 close(MAKEFILE);
 
 $mkoptions = "-l 0.0001";
index 02ae4a9956c550637df74ed631b04e8747b7d878..ca3b43d67c6da4a2094dee63c7f759ce6b3d8bb9 100644 (file)
@@ -92,7 +92,7 @@ EOF
 close(MAKEFILE);
 
 &run_make_with_options($topmake, '-n --no-print-directory', &get_logfile);
-$answer = "$make_command -f \"$submake\" bar\ntouch inc\necho n --no-print-directory\n";
+$answer = subst_make_string("#MAKEPATH# -f \"$submake\" bar\ntouch inc\necho n --no-print-directory\n");
 &compare_output($answer, &get_logfile(1));
 
 unlink('inc');
diff --git a/tests/scripts/options/dash-s b/tests/scripts/options/dash-s
new file mode 100644 (file)
index 0000000..76bffe6
--- /dev/null
@@ -0,0 +1,26 @@
+#                                                                    -*-perl-*-
+
+$description = "Test the -s (silent) and --no-silent options.\n";
+
+run_make_test(q!
+all: one two
+one: ; @echo MAKEFLAGS=$$MAKEFLAGS
+two: ; echo two
+!,
+              '', "MAKEFLAGS=\necho two\ntwo");
+
+run_make_test(undef, '-s', "MAKEFLAGS=s\ntwo");
+run_make_test(undef, '--silent', "MAKEFLAGS=s\ntwo");
+run_make_test(undef, '--quiet', "MAKEFLAGS=s\ntwo");
+
+run_make_test(undef, '--no-silent', "MAKEFLAGS=\necho two\ntwo");
+
+run_make_test(undef, '-s --no-silent', "MAKEFLAGS=\necho two\ntwo");
+run_make_test(undef, '--silent --no-silent', "MAKEFLAGS=\necho two\ntwo");
+run_make_test(undef, '--quiet --no-silent', "MAKEFLAGS=\necho two\ntwo");
+
+run_make_test(undef, '--no-silent -s', "MAKEFLAGS=s\ntwo");
+run_make_test(undef, '--no-silent --silent', "MAKEFLAGS=s\ntwo");
+run_make_test(undef, '--no-silent --quiet', "MAKEFLAGS=s\ntwo");
+
+1;
index 0f824090a11e40864d0d74973d24ac5502adcbd9..54a3a4f012362b930c11e02a9a22fc00c25e3fb2 100644 (file)
@@ -7,14 +7,22 @@ and are passed to sub-makes.";
 
 # Verify that --eval is evaluated first
 run_make_test(q!
+$(info infile)
 BAR = bar
 all: ; @echo all
 recurse: ; @$(MAKE) -f #MAKEFILE# && echo recurse!,
-              '--eval=\$\(info\ eval\) FOO=\$\(BAR\)', "eval\nall");
+              ['--eval=$(info eval)', 'FOO=$(BAR)'], "eval\ninfile\nall");
 
 # Make sure that --eval is handled correctly during recursion
-run_make_test(undef, '--no-print-directory --eval=\$\(info\ eval\) recurse',
-              "eval\neval\nall\nrecurse");
+run_make_test(undef, ['--no-print-directory', '--eval=$(info eval)', 'recurse'],
+              "eval\ninfile\neval\ninfile\nall\nrecurse");
+
+# Make sure that --eval is not passed in MAKEFLAGS
+run_make_test(q!
+all: ; @echo "MAKEFLAGS=$$MAKEFLAGS"
+!,
+              ['--eval=$(info eval)'],
+              "eval\n".'MAKEFLAGS= --eval=$$(info\ eval)');
 
 # Make sure that --eval is handled correctly during restarting
 run_make_test(q!
@@ -22,8 +30,15 @@ all: ; @echo $@
 -include gen.mk
 gen.mk: ; @echo > $@
 !,
-              '--eval=\$\(info\ eval\)', "eval\neval\nall");
+              ['--eval=$(info eval)'], "eval\neval\nall");
 
 unlink('gen.mk');
 
+# Check -E
+run_make_test(q!
+BAR = bar
+all: ; @echo all
+recurse: ; @$(MAKE) -f #MAKEFILE# && echo recurse!,
+              ['-E', '$(info eval)', 'FOO=$(BAR)'], "eval\nall");
+
 1;
index d35bb358dfe80b0ea6d10fc81c99a1935947b36c..702fb55bc944799270bbb48facb060512d2fe3d2 100644 (file)
@@ -1,35 +1,30 @@
 #                                                                    -*-perl-*-
 $description = "Test generic option processing.\n";
 
-open(MAKEFILE, "> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE "foo 1foo: ; \@echo \$\@\n";
-
-close(MAKEFILE);
-
 # TEST 0
 
-&run_make_with_options($makefile, "-j 1foo", &get_logfile);
 if (!$parallel_jobs) {
-  $answer = "$make_name: Parallel jobs (-j) are not supported on this platform.\n$make_name: Resetting to single job (-j1) mode.\n1foo\n";
+  $answer = "#MAKE#: Parallel jobs (-j) are not supported on this platform.\n#MAKE#: Resetting to single job (-j1) mode.\n1foo\n";
 }
 else {
   $answer = "1foo\n";
 }
 
+run_make_test(q!
+foo 1foo: ; @echo $@
+!,
+              "-j 1foo", $answer);
+
 # TEST 1
 
 # This test prints the usage string; I don't really know a good way to
 # test it.  I guess I could invoke make with a known-bad option to see
 # what the usage looks like, then compare it to what I get here... :(
 
-# If I were always on UNIX, I could invoke it with 2>/dev/null, then
-# just check the error code.
+# On UNIX I can invoke it with 2>/dev/null, then just check the error code.
 
-&run_make_with_options($makefile, "-j1foo 2>/dev/null", &get_logfile, 512);
-$answer = "";
-&compare_output($answer, &get_logfile(1));
+if ($port_type ne 'W32') {
+    run_make_test(undef, "-j1foo 2>/dev/null", '', 512);
+}
 
 1;
index a1bfce032b363bdfb0b9427ab0f773bef4ebbca7..bf8a89279d187ba5dcb5463c8672b116d8ae8c26 100644 (file)
@@ -11,58 +11,59 @@ $details = "Verify that symlink handling with and without -L works properly.";
 # check for it explicitly.
 
 if ($port_type eq 'W32' || !( eval { symlink("",""); 1 })) {
-  # This test is N/A 
-  -1;
-} else {
+  # This test is N/A
+  return -1;
+}
 
-  # Set up a symlink sym -> dep
-  # We'll make both dep and targ older than sym
-  $pwd =~ m%/([^/]+)$%;
-  $dirnm = $1;
-  &utouch(-10, 'dep');
-  &utouch(-5, 'targ');
-  symlink("../$dirnm/dep", 'sym');
+use File::Spec;
 
-  # Without -L, nothing should happen
-  # With -L, it should update targ
-  run_make_test('targ: sym ; @echo make $@ from $<', '',
-                "#MAKE#: 'targ' is up to date.");
-  run_make_test(undef, '-L', "make targ from sym");
+# Set up a symlink sym -> dep
+# We'll make both dep and targ older than sym
+&utouch(-10, 'dep');
+&utouch(-5, 'targ');
 
-  # Now update dep; in all cases targ should be out of date.
-  &touch('dep');
-  run_make_test(undef, '', "make targ from sym");
-  run_make_test(undef, '-L', "make targ from sym");
+$dirnm = (File::Spec->splitdir($cwddir))[-1];
+symlink(File::Spec->catfile(File::Spec->updir(), $dirnm, 'dep'), 'sym');
 
-  # Now update targ; in all cases targ should be up to date.
-  &touch('targ');
-  run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
-  run_make_test(undef, '-L', "#MAKE#: 'targ' is up to date.");
+# Without -L, nothing should happen
+# With -L, it should update targ
+run_make_test('targ: sym ; @echo make $@ from $<', '',
+              "#MAKE#: 'targ' is up to date.");
+run_make_test(undef, '-L', "make targ from sym");
 
-  # Add in a new link between sym and dep.  Be sure it's newer than targ.
-  sleep(1);
-  rename('dep', 'dep1');
-  symlink('dep1', 'dep');
+# Now update dep; in all cases targ should be out of date.
+&touch('dep');
+run_make_test(undef, '', "make targ from sym");
+run_make_test(undef, '-L', "make targ from sym");
 
-  # Without -L, nothing should happen
-  # With -L, it should update targ
-  run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
-  run_make_test(undef, '-L', "make targ from sym");
+# Now update targ; in all cases targ should be up to date.
+&touch('targ');
+run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
+run_make_test(undef, '-L', "#MAKE#: 'targ' is up to date.");
 
-  rmfiles('targ', 'dep', 'sym', 'dep1');
+# Add in a new link between sym and dep.  Be sure it's newer than targ.
+sleep(1);
+rename('dep', 'dep1');
+symlink('dep1', 'dep');
 
-  # Check handling when symlinks point to non-existent files.  Without -L we
-  # should get an error: with -L we should use the timestamp of the symlink.
+# Without -L, nothing should happen
+# With -L, it should update targ
+run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
+run_make_test(undef, '-L', "make targ from sym");
 
-  symlink("../$dirname/dep", 'sym');
-  run_make_test('targ: sym ; @echo make $@ from $<', '',
-                "#MAKE#: *** No rule to make target 'sym', needed by 'targ'.  Stop.", 512);
+rmfiles('targ', 'dep', 'sym', 'dep1');
 
-  run_make_test('targ: sym ; @echo make $@ from $<', '-L',
-                'make targ from sym');
+# Check handling when symlinks point to non-existent files.  Without -L we
+# should get an error: with -L we should use the timestamp of the symlink.
 
+symlink("../$dirnm/dep", 'sym');
+run_make_test('targ: sym ; @echo make $@ from $<', '',
+              "#MAKE#: *** No rule to make target 'sym', needed by 'targ'.  Stop.", 512);
 
-  rmfiles('targ', 'sym');
+run_make_test('targ: sym ; @echo make $@ from $<', '-L',
+              'make targ from sym');
 
-  1;
-}
+
+rmfiles('targ', 'sym');
+
+1;
index f3d514849f491bdc4413f8110f2e735a3f7bc422..955c5608a150404d15288abaa64beebaf8b79f1d 100644 (file)
@@ -1,3 +1,5 @@
+#                                                                    -*-perl-*-
+
 $description = "The following test creates a makefile to override part\n"
               ."of one Makefile with Another Makefile with the .DEFAULT\n"
               ."rule.";
@@ -9,41 +11,21 @@ $details = "This tests the use of the .DEFAULT special target to say that \n"
           ."defined here but passes the target bar on to another makefile\n"
           ."which does have the target bar defined.\n";
 
-$makefile2 = &get_tmpfile;
-
-open(MAKEFILE,"> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE "foo:\n";
-print MAKEFILE "\t\@echo Executing rule FOO\n\n";
-print MAKEFILE ".DEFAULT:\n";
-print MAKEFILE "\t\@\$(MAKE) -f $makefile2 \$\@ \n";
-
-# END of Contents of MAKEFILE
-
-close(MAKEFILE);
-
-
-open(MAKEFILE,"> $makefile2");
-
-print MAKEFILE "bar:\n";
-print MAKEFILE "\t\@echo Executing rule BAR\n\n";
-
-close(MAKEFILE);
-
-&run_make_with_options($makefile,'bar',&get_logfile);
+create_file('defsub.mk', q!
+bar: ; @echo Executing rule BAR
+!);
 
-# Create the answer to what should be produced by this Makefile
-$answer = "${make_name}[1]: Entering directory '$pwd'\n"
-        . "Executing rule BAR\n"
-        . "${make_name}[1]: Leaving directory '$pwd'\n";
+run_make_test(q!
+foo:; @echo Executing rule FOO
 
-# COMPARE RESULTS
+.DEFAULT: ; @$(MAKE) -f defsub.mk $@
+!,
+                       'bar',"#MAKE#[1]: Entering directory '#PWD#'\n"
+                       . "Executing rule BAR\n"
+                       . "#MAKE#[1]: Leaving directory '#PWD#'\n");
 
-&compare_output($answer,&get_logfile(1));
+unlink('defsub.mk');
 
-# This tells the test driver that the perl test script executed properly.
 1;
 
 
index eb8f2517bcbf267101361ca4dc078ad9b56bd2a1..297bb38b4012f843cbda42c5846c56e5d8c2abd8 100644 (file)
@@ -2,39 +2,18 @@
 
 $description = "The following tests rules without Commands or Dependencies.";
 
-$details = "If the rule ...\n";
-
-open(MAKEFILE,"> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE ".IGNORE :\n";
-print MAKEFILE "clean: FORCE\n";
-print MAKEFILE "\t$delete_command clean\n";
-print MAKEFILE "FORCE:\n";
-
-# END of Contents of MAKEFILE
-
-close(MAKEFILE);
-
-
 # Create a file named "clean".  This is the same name as the target clean
 # and tricks the target into thinking that it is up to date.  (Unless you
 # use the .PHONY target.
-&touch("clean");
+touch('clean');
 
-$answer = "$delete_command clean\n";
-&run_make_with_options($makefile,"clean",&get_logfile);
+run_make_test(qq!
+.IGNORE :
+clean: FORCE ; $CMD_rmfile clean
+FORCE:
+!,
+              '', "$CMD_rmfile clean");
 
-&compare_output($answer,&get_logfile(1));
+rmfiles('clean');
 
 1;
-
-
-
-
-
-
-
-
-
index 2b3021b2352cfd53a6b92cf17a64ea8d9dee15e6..512498c3093e8ccc8609ccda4a246a1dfef0ff10 100644 (file)
@@ -57,7 +57,7 @@ $answer = "cp foo.f foo.e\ncp foo.e foo.d\nrm foo.e\n";
 # TEST #3
 
 &run_make_with_options($makefile,'foo.c',&get_logfile);
-$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm bar.e foo.e\n";
+$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm foo.e bar.e\n";
 &compare_output($answer, &get_logfile(1));
 
 # TEST #4
@@ -72,7 +72,7 @@ $answer = "$make_name: 'foo.c' is up to date.\n";
 &touch('foo.f');
 
 &run_make_with_options($makefile,'foo.c',&get_logfile);
-$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm bar.e foo.e\n";
+$answer = "cp foo.f foo.e\ncp bar.f bar.e\ncat foo.e bar.e > foo.c\nrm foo.e bar.e\n";
 &compare_output($answer, &get_logfile(1));
 
 # TEST #6 -- added for PR/1669: don't remove files mentioned on the cmd line.
index 87713da474ac8a86be5417bf16a868b97858a472..3876966aec57917dbe215884646bd8a8cb4696ba 100644 (file)
@@ -4,10 +4,14 @@ $description = "Test the behaviour of the .ONESHELL target.";
 
 $details = "";
 
-# Some shells (*shakes fist at Solaris*) cannot handle multiple flags in
-# separate arguments.
-my $t = `/bin/sh -e -c true 2>/dev/null`;
-my $multi_ok = $? == 0;
+my $multi_ok = 0;
+
+if ($port_type ne 'W32') {
+    # Some shells (*shakes fist at Solaris*) cannot handle multiple flags in
+    # separate arguments.
+    my $t = `$sh_name -e -c true 2>/dev/null`;
+    my $multi_ok = $? == 0;
+}
 
 # Simple
 
@@ -71,8 +75,9 @@ all:
 
 
 # Now try using a different interpreter
-
-run_make_test(q!
+# This doesn't work on Windows right now
+if ($port_type ne 'W32') {
+    run_make_test(q!
 .RECIPEPREFIX = >
 .ONESHELL:
 SHELL = #PERL#
@@ -83,6 +88,7 @@ all:
 >      @y=qw(a b c);
 >print "a = $$a, y = (@y)\n";
 !,
-              '', "a = 12, y = (a b c)\n");
+                  '', "a = 12, y = (a b c)\n");
+}
 
 1;
index c8e2110fef6d9d43097d92f3a7670cc36075f085..d49e3f83890322f5968237b2cfca9b9976e86ab5 100644 (file)
@@ -12,28 +12,22 @@ $details = "This makefile in this test declares the target clean to be a \n"
 
 $example = "EXAMPLE_FILE";
 
-open(MAKEFILE,"> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE ".PHONY : clean \n";
-print MAKEFILE "all: \n";
-print MAKEFILE "\t\@echo This makefile did not clean the dir ... good\n";
-print MAKEFILE "clean: \n";
-print MAKEFILE "\t$delete_command $example clean\n";
-
-# END of Contents of MAKEFILE
-
-close(MAKEFILE);
-
-&touch($example);
+touch($example);
 
 # Create a file named "clean".  This is the same name as the target clean
 # and tricks the target into thinking that it is up to date.  (Unless you
 # use the .PHONY target.
-&touch("clean");
+touch('clean');
+
+open(MAKEFILE, "> $makefile");
+print MAKEFILE qq!
+.PHONY : clean
+all: ; \@echo This makefile did not clean the dir ... good
+clean: ; $CMD_rmfile $example clean
+!;
+close(MAKEFILE);
 
-$answer = "$delete_command $example clean\n";
+$answer = "$CMD_rmfile $example clean\n";
 &run_make_with_options($makefile,"clean",&get_logfile);
 
 if (-f $example) {
@@ -42,13 +36,7 @@ if (-f $example) {
 
 &compare_output($answer,&get_logfile(1));
 
-1;
-
-
-
-
-
-
-
-
+# Just in case
+unlink($example, 'clean');
 
+1;
index 5c3c7f89a61d01624c5ff2af390da4826a984f46..c44cc500111e76896a4343084fa70fbb2aa38a2d 100644 (file)
@@ -11,7 +11,7 @@ $details = "";
 
 my $script = 'false; true';
 my $flags = '-ec';
-my $out = `/bin/sh $flags '$script' 2>&1`;
+my $out = `$sh_name $flags '$script' 2>&1`;
 my $err = $? >> 8;
 run_make_test(qq!
 .POSIX:
@@ -21,7 +21,7 @@ all: ; \@$script
 
 # User settings must override .POSIX
 $flags = '-xc';
-$out = `/bin/sh $flags '$script' 2>&1`;
+$out = `$sh_name $flags '$script' 2>&1`;
 run_make_test(qq!
 .SHELLFLAGS = $flags
 .POSIX:
@@ -34,9 +34,8 @@ my %POSIX = (AR => 'ar', ARFLAGS => '-rv',
              YACC => 'yacc', YFLAGS => '',
              LEX => 'lex', LFLAGS => '',
              LDFLAGS => '',
-             CC => 'c99', CFLAGS => '-O',
-             FC => 'fort77', FFLAGS => '-O 1',
-             GET => 'get', GFLAGS => '',
+             CC => 'c99', CFLAGS => '-O1',
+             FC => 'fort77', FFLAGS => '-O1',
              SCCSFLAGS => '', SCCSGETFLAGS => '-s');
 my $make = join('', map { "\t\@echo '$_=\$($_)'\n" } sort keys %POSIX);
 my $r = join('', map { "$_=$POSIX{$_}\n"} sort keys %POSIX);
index 447c275e8563102bdf32772597bddb2637300742..963c240597a35b9b7aa14f49bb0f6bb3f22194a2 100644 (file)
@@ -93,8 +93,7 @@ print MAKEFILE <<'EOF';
 final: intermediate
 intermediate: source
 
-final intermediate source:
-       echo $< > $@
+final intermediate source: ; echo $< > $@
 EOF
 
 close(MAKEFILE);
@@ -135,7 +134,7 @@ all : 1.c 2.c
 cp 1.b 1.c
 cp 2.a 2.b
 cp 2.b 2.c
-rm 1.b 2.b');
+rm 2.b 1.b');
 
 unlink(qw(1.a 2.a 1.c 2.c));
 
index 4bb0a0f42e5308aeebac432ee8a1875134c43118..df396a4c56ecf292d6f3cfc326da22335e73d589 100644 (file)
@@ -1,42 +1,33 @@
 #                                                                    -*-perl-*-
 
-$description = "The following tests the special target .SILENT.  By simply\n"
-              ."mentioning this as a target, it tells make not to print\n"
-              ."commands before executing them.";
-
-$details = "This test is the same as the clean test except that it should\n"
-          ."not echo its command before deleting the specified file.\n";
-
-$example = "EXAMPLE_FILE";
-
-open(MAKEFILE,"> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE ".SILENT : clean\n";
-print MAKEFILE "clean: \n";
-print MAKEFILE "\t$delete_command EXAMPLE_FILE\n";
-
-# END of Contents of MAKEFILE
-
-close(MAKEFILE);
-
-&touch($example);
-
-$answer = "";
-&run_make_with_options($makefile,"clean",&get_logfile,0);
-if (-f $example) {
-  $test_passed = 0;
-}
-&compare_output($answer,&get_logfile(1));
+$description = "Test the special target .SILENT.";
+
+run_make_test(q!
+.PHONY: M a b
+M: a b
+.SILENT : b
+a b: ; echo $@
+!,
+              '', "echo a\na\nb");
+
+run_make_test(q!
+.PHONY: M a b
+M: a b
+.SILENT:
+a b: ; echo $@
+!,
+              '', "a\nb");
+
+# SV 54740 : don't inherit .SILENT settings in sub-makes
+run_make_test(q!
+.PHONY: M r a b
+r: a b ; @$(MAKE) -f #MAKEFILE# M V=x
+a b: ; echo $@
+
+V =
+$V.SILENT:
+M: a b
+!,
+              '--no-print-directory', "a\nb\necho a\na\necho b\nb");
 
 1;
-
-
-
-
-
-
-
-
-
index b32c976702ba902f7bd1223a5af418bfa782ba94..e67458e90f0c645a555908fd09f4872f6abb7695 100644 (file)
@@ -8,43 +8,24 @@ $description = "The following test creates a makefile to delete a \n"
 $example = "EXAMPLE_FILE";
 
 open(MAKEFILE,"> $makefile");
-
-# The Contents of the MAKEFILE ...
-
-print MAKEFILE "all: \n";
-print MAKEFILE "\t\@echo This makefile did not clean the dir... good\n";
-print MAKEFILE "clean: \n";
-print MAKEFILE "\t$delete_command EXAMPLE_FILE\n";
-
-# END of Contents of MAKEFILE
-
+print MAKEFILE qq!
+all: ; \@echo This makefile did not clean the dir... good
+clean: ; $CMD_rmfile $example
+!;
 close(MAKEFILE);
 
-&touch($example);
+touch($example);
+run_make_with_options($makefile,"",&get_logfile,0);
 
-
-&run_make_with_options($makefile,"",&get_logfile,0);
-
-# Create the answer to what should be produced by this Makefile
 $answer = "This makefile did not clean the dir... good\n";
+compare_output($answer,&get_logfile(1)) || error("abort");
 
-&compare_output($answer,&get_logfile(1)) || &error ("abort");
 
-
-$answer = "$delete_command $example\n";
-&run_make_with_options($makefile,"clean",&get_logfile,0);
+$answer = "$CMD_rmfile $example\n";
+run_make_with_options($makefile,"clean",&get_logfile,0);
 if (-f $example) {
   $test_passed = 0;
 }
-&compare_output($answer,&get_logfile(1)) || &error ("abort");
+compare_output($answer,&get_logfile(1)) || error("abort");
 
 1;
-
-
-
-
-
-
-
-
-
index ee7cacb1f4a732443cf511dec8a09b7caecadc19..1be54f1a0a2499aadcdee1973cbbc7b2fee88fa6 100644 (file)
@@ -1,20 +1,16 @@
 #                                                                    -*-perl-*-
 
-$description = "This tests the CURDIR varaible.";
+$description = "This tests the CURDIR variable.";
 
 $details = "Echo CURDIR both with and without -C.  Also ensure overrides work.";
 
-open(MAKEFILE,"> $makefile");
-print MAKEFILE "all: ; \@echo \$(CURDIR)\n";
-close(MAKEFILE);
-
 
 # TEST #1
 # -------
 
-&run_make_with_options($makefile,"",&get_logfile);
-$answer = "$pwd\n";
-&compare_output($answer,&get_logfile(1));
-
+run_make_test(q!
+all: ; @echo $(CURDIR)
+!,
+              '', "#PWD#\n");
 
 1;
diff --git a/tests/scripts/variables/EXTRA_PREREQS b/tests/scripts/variables/EXTRA_PREREQS
new file mode 100644 (file)
index 0000000..57ad597
--- /dev/null
@@ -0,0 +1,151 @@
+#                                                                    -*-perl-*-
+
+$description = "Test the .EXTRA_PREREQS special variable.";
+$details = "";
+
+# Simple global .EXTRA_PREREQS and automatic variable settings
+run_make_test('
+.EXTRA_PREREQS = tick tack
+.PHONY: all
+all: ; @echo ${.EXTRA_PREREQS}/$@/$</$^/$?/$+/$|/$*/
+tick tack: ; @echo $@
+',
+              '', "tick\ntack\ntick tack/all///////\n");
+
+# Global .EXTRA_PREREQS and pattern rules
+run_make_test('
+.EXTRA_PREREQS = tick tack
+a%: ; @echo ${.EXTRA_PREREQS}/$@/$</$^/$?/$+/$|/$*/
+tick tack: ; @echo $@
+',
+              'all', "tick\ntack\ntick tack/all//////ll/\n");
+
+# Simple target-specific .EXTRA_PREREQS and automatic variable settings
+run_make_test('
+.PHONY: all
+all: ; @echo ${.EXTRA_PREREQS}/$@/$</$^/$?/$+/$|/$*/
+all: .EXTRA_PREREQS = tick tack
+tick tack: ; @echo $@
+',
+              '', "tick\ntack\ntick tack/all///////\n");
+
+# Simple pattern-specific .EXTRA_PREREQS and automatic variable settings
+# This is not currently supported :-/
+if (0) {
+    run_make_test('
+.PHONY: all
+all: ; @echo ${.EXTRA_PREREQS}/$@/$</$^/$?/$+/$|/$*/
+a%: .EXTRA_PREREQS = tick tack
+tick tack: ; @echo $@
+',
+                  '', "tick\ntack\ntick tack/all///////\n");
+}
+
+touch('hi');
+
+# Basic test target specific .EXTRA_PREREQS:
+run_make_test('
+DEPENDENCY_ONLY_PREREQUISITES = ho hey
+OTHER_PREREQUISITES := foo bar baz
+target: .EXTRA_PREREQS := hi ${DEPENDENCY_ONLY_PREREQUISITES}
+target: ${OTHER_PREREQUISITES} ; @echo ${.EXTRA_PREREQS} $^
+.PHONY: target ${DEPENDENCY_ONLY_PREREQUISITES} ${OTHER_PREREQUISITES}
+${DEPENDENCY_ONLY_PREREQUISITES} ${OTHER_PREREQUISITES}: ; @echo $@
+',
+              '', "foo\nbar\nbaz\nho\nhey\nhi ho hey foo bar baz\n");
+
+# Test target specific .EXTRA_PREREQS and pattern rules:
+run_make_test('
+all: target.dst
+DEPENDENCY_ONLY_PREREQUISITES = ho hey
+target.dst: .EXTRA_PREREQS := hi ${DEPENDENCY_ONLY_PREREQUISITES}
+%.dst: %.src ; @echo ${.EXTRA_PREREQS} $^
+.PHONY: ${DEPENDENCY_ONLY_PREREQUISITES} target.src
+${DEPENDENCY_ONLY_PREREQUISITES} target.src: ; @echo $@
+',
+              '', "target.src\nho\nhey\nhi ho hey target.src\n");
+
+# Test that global .EXTRA_PREREQS are built first:
+run_make_test('
+.EXTRA_PREREQS = hi ho hey
+OTHER_PREREQUISITES := foo bar baz
+target: ${OTHER_PREREQUISITES} ; @echo ${.EXTRA_PREREQS} $^
+.PHONY: target ${.EXTRA_PREREQS} ${OTHER_PREREQUISITES}
+${.EXTRA_PREREQS} ${OTHER_PREREQUISITES}: ; @echo $@
+',
+              '', "hi\nho\nhey\nfoo\nbar\nbaz\nhi ho hey foo bar baz\n");
+
+# Test that target specific .EXTRA_PREREQS override global .EXTRA_PREREQS:
+run_make_test('
+.EXTRA_PREREQS = tick tack
+DEPENDENCY_ONLY_PREREQUISITES = ho hey
+OTHER_PREREQUISITES := foo bar baz
+target: .EXTRA_PREREQS := hi ${DEPENDENCY_ONLY_PREREQUISITES}
+target: ${OTHER_PREREQUISITES} ; @echo ${.EXTRA_PREREQS} $^
+.PHONY: target ${DEPENDENCY_ONLY_PREREQUISITES} ${OTHER_PREREQUISITES} ${.EXTRA_PREREQS}
+${DEPENDENCY_ONLY_PREREQUISITES} ${OTHER_PREREQUISITES} ${.EXTRA_PREREQS}: ; @echo $@
+',
+              '', "tick\ntack\nfoo\nbar\nbaz\nho\nhey\nhi ho hey foo bar baz\n");
+
+# Cleanup:
+unlink('hi');
+
+# Test error reporting of global .EXTRA_PREREQS:
+run_make_test('
+.EXTRA_PREREQS = tick tack
+.PHONY: all
+all: ; @echo ${.EXTRA_PREREQS} $^
+',
+              '', "#MAKE#: *** No rule to make target 'tick', needed by 'all'.  Stop.", 512);
+
+# Test error reporting of global .EXTRA_PREREQS and keep-going:
+run_make_test('
+.EXTRA_PREREQS = tick tack
+.PHONY: all
+all: ; @echo ${.EXTRA_PREREQS} $^
+',
+              '-k', "#MAKE#: *** No rule to make target 'tick', needed by 'all'.\n#MAKE#: *** No rule to make target 'tack', needed by 'all'.\n#MAKE#: Target 'all' not remade because of errors.", 512);
+
+# Test error reporting of target specific .EXTRA_PREREQS and keep-going:
+run_make_test('
+all: .EXTRA_PREREQS = tick tack
+.PHONY: all
+all: ; @echo ${.EXTRA_PREREQS} $^
+',
+              '-k',
+              "#MAKE#: *** No rule to make target 'tick', needed by 'all'.
+#MAKE#: *** No rule to make target 'tack', needed by 'all'.
+#MAKE#: Target 'all' not remade because of errors.\n", 512);
+
+# Test wildcard
+
+touch('tick', 'tack');
+
+run_make_test('
+.EXTRA_PREREQS = *ck
+.PHONY: all tick tack
+all: ; @echo ${.EXTRA_PREREQS} $^
+tick tack: ; @echo $@
+',
+              '', "tack\ntick\ntack tick\n");
+
+run_make_test('
+.PHONY: all tick tack
+all: ; @echo ${.EXTRA_PREREQS} $^
+all: .EXTRA_PREREQS = *ck
+tick tack: ; @echo $@
+',
+              '', "tack\ntick\ntack tick\n");
+
+run_make_test('
+.PHONY: tick tack
+a%: ; @echo ${.EXTRA_PREREQS} $^
+.EXTRA_PREREQS = *ck
+tick tack: ; @echo $@
+',
+              'all', "tack\ntick\ntack tick\n");
+
+unlink('tick', 'tack');
+
+# This tells the test driver that the perl test script executed properly.
+1;
index b23da8ead3c28567d03a7a3d297326b5d4084b7e..564d996025a0365647c7e68bc90da57ecb6ad366 100644 (file)
@@ -5,11 +5,6 @@ $description = "Test the MAKEFILES variable.";
 $makefile2 = &get_tmpfile;
 $makefile3 = &get_tmpfile;
 
-open(MAKEFILE,"> $makefile");
-print MAKEFILE 'all: ; @echo DEFAULT RULE: M2=$(M2) M3=$(M3)', "\n";
-close(MAKEFILE);
-
-
 open(MAKEFILE,"> $makefile2");
 print MAKEFILE <<EOF;
 M2 = m2
@@ -25,11 +20,10 @@ NDEF3: ; \@echo RULE FROM MAKEFILE 3
 EOF
 close(MAKEFILE);
 
-
-&run_make_with_options($makefile, "MAKEFILES='$makefile2 $makefile3'",
-                       &get_logfile);
-$answer = "DEFAULT RULE: M2=m2 M3=m3\n";
-&compare_output($answer,&get_logfile(1));
+run_make_test(q!
+all: ; @echo DEFAULT RULE: M2=$(M2) M3=$(M3)
+!,
+              ["MAKEFILES=$makefile2 $makefile3"], "DEFAULT RULE: M2=m2 M3=m3\n");
 
 # TEST 2: Verify that included makefiles don't set the default goal.
 # See Savannah bug #13401.
index 076e42da33165a1ede598d991fdb6933d05a5279..b75eea7e8fd398b514905f8abee762311136ee36 100644 (file)
@@ -2,29 +2,39 @@
 
 $description = "Test the MAKEFILE_LIST variable.";
 
-$makefile2 = &get_tmpfile;
+create_file('incl2', "m2 := \$(MAKEFILE_LIST)\n");
 
-open(MAKEFILE,"> $makefile");
-print MAKEFILE <<EOF;
+run_make_test(qq!
 m1 := \$(MAKEFILE_LIST)
-include $makefile2
+include incl2
 m3 := \$(MAKEFILE_LIST)
 
 all:
 \t\@echo \$(m1)
 \t\@echo \$(m2)
 \t\@echo \$(m3)
-EOF
-close(MAKEFILE);
+!,
+              '', "#MAKEFILE#\n#MAKEFILE# incl2\n#MAKEFILE# incl2\n");
 
+unlink('incl2');
 
-open(MAKEFILE,"> $makefile2");
-print MAKEFILE "m2 := \$(MAKEFILE_LIST)\n";
-close(MAKEFILE);
+# SV 50823 -- makefiles containing '$' chars
 
+create_file('foo$bar', "m2 := \$(MAKEFILE_LIST)\n");
 
-&run_make_with_options($makefile, "", &get_logfile);
-$answer = "$makefile\n$makefile $makefile2\n$makefile $makefile2\n";
-&compare_output($answer,&get_logfile(1));
+run_make_test(qq!
+m1 := \$(MAKEFILE_LIST)
+include foo\$\$bar
+m3 := \$(MAKEFILE_LIST)
+
+all:
+\t\@echo '\$(m1)'
+\t\@echo '\$(m2)'
+\t\@echo '\$(m3)'
+\t\@echo '\$(value MAKEFILE_LIST)'
+!,
+              '', "#MAKEFILE#\n#MAKEFILE# foo\$bar\n#MAKEFILE# foo\$bar\n#MAKEFILE# foo\$bar\n");
+
+unlink('foo$bar');
 
 1;
index edba7b67e84e695c492c2c63886afc5df961abbd..4ff1ac256f4ebfaaf310e82e258a3265b40af9a2 100644 (file)
@@ -2,12 +2,15 @@
 
 $description = "Test proper handling of SHELL.";
 
-# Find the default value when SHELL is not set.  On UNIX it will be /bin/sh,
-# but on other platforms who knows?
-resetENV();
-delete $ENV{SHELL};
-$mshell = `echo 'all:;\@echo \$(SHELL)' | $make_path -f-`;
-chop $mshell;
+# If we don't have a POSIX shell available, never mind
+$is_posix_sh or return -1;
+
+# On Windows, shell names might not match
+if ($port_type eq 'W32') {
+    return -1;
+}
+
+$mshell = $sh_name;
 
 # According to POSIX, the value of SHELL in the environment has no impact on
 # the value in the makefile.
@@ -24,18 +27,25 @@ run_make_test('all:;@echo "$(SHELL)"', '', $mshell);
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("SHELL := /./$mshell\n".'
+my $altshell = "/./$mshell";
+my $altshell2 = "/././$mshell";
+if ($mshell =~ m,^([a-zA-Z]:)([\\/])(.*),) {
+    $altshell = "$1$2.$2$3";
+    $altshell2 = "$1$2.$2.$2$3";
+}
+
+run_make_test("SHELL := $altshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/./$mshell $mshell");
+', '', "$altshell $mshell");
 
 # As a GNU make extension, if make's SHELL variable is explicitly exported,
 # then we really _DO_ export it.
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("export SHELL := /./$mshell\n".'
+run_make_test("export SHELL := $altshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/./$mshell /./$mshell");
+', '', "$altshell $altshell");
 
 
 # Test out setting of SHELL, both exported and not, as a target-specific
@@ -43,18 +53,18 @@ all:;@echo "$(SHELL) $$SHELL"
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("all: SHELL := /./$mshell\n".'
+run_make_test("all: SHELL := $altshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/./$mshell $mshell");
+', '', "$altshell $mshell");
 
 $extraENV{SHELL} = $mshell;
 
 run_make_test("
-SHELL := /././$mshell
+SHELL := $altshell2
 one: two
-two: export SHELL := /./$mshell\n".'
+two: export SHELL := $altshell\n".'
 one two:;@echo "$@: $(SHELL) $$SHELL"
-', '', "two: /./$mshell /./$mshell\none: /././$mshell $mshell\n");
+', '', "two: $altshell $altshell\none: $altshell2 $mshell\n");
 
 # Test .SHELLFLAGS
 
@@ -62,7 +72,7 @@ one two:;@echo "$@: $(SHELL) $$SHELL"
 # by the shell in -x mode has a trailing space (!!)
 my $script = 'true; true';
 my $flags = '-xc';
-my $out = `/bin/sh $flags '$script' 2>&1`;
+my $out = `$sh_name $flags '$script' 2>&1`;
 
 run_make_test(qq!
 .SHELLFLAGS = $flags
@@ -74,7 +84,7 @@ all: ; \@$script
 
 # Some shells (*shakes fist at Solaris*) cannot handle multiple flags in
 # separate arguments.
-my $t = `/bin/sh -e -c true 2>/dev/null`;
+my $t = `$sh_name -e -c true 2>/dev/null`;
 my $multi_ok = $? == 0;
 
 if ($multi_ok) {
@@ -90,7 +100,7 @@ all: ; \@$script
 # different exit code--once again Solaris: false exits with 255 not 1
 $script = 'true; false; true';
 $flags = '-xec';
-$out = `/bin/sh $flags '$script' 2>&1`;
+$out = `$sh_name $flags '$script' 2>&1`;
 my $err = $? >> 8;
 
 run_make_test(qq!
index 33c482df6909def3c1e1c5cc20976f851d9f8431..0b2e4513fecaa1b6aa94f5aa9d3b4fd4c4e1729e 100644 (file)
@@ -72,7 +72,7 @@ $answer = ".x\n$dir/foo.x\nx\n\$@.x\n$dir.x\nfoo.x\n$dir/bar.x\nbar.x\n";
 &compare_output($answer, &get_logfile(1));
 
 &run_make_with_options($makefile2, "$dir/x.z $dir/y.z", &get_logfile);
-$answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\n\y\n\$@.y\n$dir.y\ny.z.y\n";
+$answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\ny\n\$@.y\n$dir.y\ny.z.y\n";
 &compare_output($answer, &get_logfile(1));
 
 &run_make_with_options($makefile2, "$dir/biz", &get_logfile);
index ba133ea860d2fc204b3b75c54837da2e2dad328f..831e5d81004de19dab3dc4c065f75337ec3a7423 100644 (file)
@@ -93,4 +93,64 @@ all: ; @echo $(foo)
 ',
               '', "Goodbye\n");
 
+# TEST 8: Append to empty
+run_make_test(q!
+recur =
+recur += foo
+simple :=
+simple += bar
+recur_empty = foo
+recur_empty +=
+simple_empty := bar
+simple_empty +=
+empty_recur =
+empty_recur +=
+empty_simple :=
+empty_simple +=
+
+all: ; @: $(info recur=/$(recur)/ simple=/$(simple)/ recure=/$(recur_empty)/ simplee=/$(simple_empty)/ erecur=/$(empty_recur)/ esimple=/$(empty_simple)/)
+!,
+              '', "recur=/foo/ simple=/bar/ recure=/foo/ simplee=/bar/ erecur=// esimple=//\n");
+
+# TEST 9: Line continuation
+run_make_test(q!
+recur = $\
+  one$\
+  two$\
+  three
+simple := $\
+  four$\
+  five$\
+  six
+
+all: d$\
+     e$\
+     p; @:
+
+.PHONY: dep
+dep: ; @: $(info recur=/$(recur)/ simple=/$(simple)/)
+!,
+             '', "recur=/onetwothree/ simple=/fourfivesix/\n");
+
+# TEST 9: Line continuation
+run_make_test(q!
+.POSIX:
+recur = $\
+  one$\
+  two$\
+  three
+simple := $\
+  four$\
+  five$\
+  six
+
+all: d$\
+     e$\
+     p; @:
+
+.PHONY: dep
+dep: ; @: $(info recur=/$(recur)/ simple=/$(simple)/)
+!,
+             '', "recur=/onetwothree/ simple=/fourfivesix/\n");
+
 1;
index 16a72b896ab961f89cc2321e73475f45cbe22d4c..0f9abc82225bef1a65e10ee36334770d30d09a6f 100644 (file)
@@ -18,7 +18,7 @@ all: ; @echo $y
 # TEST #1
 # Bogus variable value passed on the command line.
 run_make_test(undef,
-              'x=\$\(other',
+              ['x=$(other'],
               '#MAKEFILE#:4: *** unterminated variable reference.  Stop.',
               512);
 
@@ -39,7 +39,7 @@ all: ; @echo $y
 # TEST #3
 # Bogus variable value passed on the command line.
 run_make_test(undef,
-              'x=\$\(other',
+              ['x=$(other'],
               '#MAKEFILE#:4: *** unterminated variable reference.  Stop.',
               512);
 
index 9a64951e9e13a0b34978b0dff7b952de8c6af608..8375dfa6283d07c683e5674633d267dc9c41ba1e 100644 (file)
@@ -25,7 +25,7 @@ $mk_string = "text : text.tlb(file1.txt)\n\n" .
 "file1.txt :\n" .
 "\t\@pipe open/write xxx file1.txt ; write xxx \"text file\" ; close xxx\n";
 
-my $answer = "library /replace text.tlb file1.txt";
+$answer = "library /replace text.tlb file1.txt";
 
 run_make_test($mk_string,
               '', $answer);
@@ -37,10 +37,10 @@ unlink('file1.txt');
 #Macro library
 $mk_string = "macro : macro.mlb(file1.mar)\n\n" .
 "file1.mar :\n" .
-"\t\pipe open/write xxx file1.mar ; " .
+"\tpipe open/write xxx file1.mar ; " .
 "write xxx \".macro a b\" ; write xxx \".endm\" ; close xxx\n";
 
-my $answer = "library /replace macro.mlb file1.mar";
+$answer = "library /replace macro.mlb file1.mar";
 
 run_make_test($mk_string,
               '', $answer);
@@ -58,7 +58,7 @@ $mk_string =
 "file2.c :\n" .
 "\t\@pipe open/write xxx file2.c ; write xxx \"file2(){}\" ; close xxx\n";
 
-my $answer = "library /replace imagelib.olb file2.exe";
+$answer = "library /replace imagelib.olb file2.exe";
 
 run_make_test($mk_string,
               '', $answer);
index e6cd9f9e68d712c20a5b11b6e5cb150ba78c0af7..f18e7854c40215673aa4b60346e8c513503ae8e5 100644 (file)
@@ -5,7 +5,7 @@
 # Written 91-12-02 through 92-01-01 by Stephen McGee.
 # Modified 92-02-11 through 92-02-22 by Chris Arthur to further generalize.
 #
-# Copyright (C) 1991-2016 Free Software Foundation, Inc.
+# Copyright (C) 1991-2020 Free Software Foundation, Inc.
 # This file is part of GNU Make.
 #
 # GNU Make is free software; you can redistribute it and/or modify it under
@@ -30,6 +30,9 @@
 
 # $Id$
 
+use Config;
+use Cwd;
+use File::Spec;
 
 # The number of test categories we've run
 $categories_run = 0;
@@ -54,6 +57,31 @@ $test_timeout = 10 if $^O eq 'VMS';
 
 # Path to Perl
 $perl_name = $^X;
+if ($^O ne 'VMS') {
+    $perl_name .= $Config{_exe} unless $perl_name =~ m/$Config{_exe}$/i;
+}
+# If it's a simple name, look it up on PATH
+{
+    my ($v,$d,$f) = File::Spec->splitpath($perl_name);
+    if (!$d) {
+        my $perl = undef;
+        foreach my $p (File::Spec->path()) {
+            my $f = File::Spec->catfile($p, $f);
+            if (-e $f) {
+                $perl = $f;
+                last;
+            }
+        }
+        if ($perl) {
+            $perl_name = $perl;
+        } else {
+            print "Cannot locate Perl interpreter $perl_name\n";
+        }
+    }
+}
+# Make sure it uses forward-slashes even on Windows, else it won't work
+# in recipes
+$perl_name =~ tr,\\,/,;
 
 # %makeENV is the cleaned-out environment.
 %makeENV = ();
@@ -136,6 +164,8 @@ sub toplevel
   foreach (# UNIX-specific things
            'TZ', 'TMPDIR', 'HOME', 'USER', 'LOGNAME', 'PATH',
            'LD_LIBRARY_PATH',
+           # SAN things
+           'ASAN_OPTIONS', 'UBSAN_OPTIONS',
            # Purify things
            'PURIFYOPTIONS',
            # Windows NT-specific stuff
@@ -187,85 +217,71 @@ sub toplevel
 
   &print_banner;
 
-  if ($osname eq 'VMS' && $cwdslash eq "")
-  {
+  if ($osname eq 'VMS' && $cwdslash eq "") {
     # Porting this script to VMS revealed a small bug in opendir() not
     # handling search lists correctly when the directory only exists in
     # one of the logical_devices.  Need to find the first directory in
     # the search list, as that is where things will be written to.
-    my @dirs = split("/", $pwd);
+    my @dirs = split('/', $cwdpath);
 
     my $logical_device = $ENV{$dirs[1]};
-    if ($logical_device =~ /([A-Za-z0-9_]+):(:?.+:)+/)
-    {
-        # A search list was found.  Grab the first logical device
-        # and use it instead of the search list.
-        $dirs[1]=$1;
-        my $lcl_pwd = join('/', @dirs);
-        $workpath = $lcl_pwd . '/' . $workdir
+    if ($logical_device =~ /([A-Za-z0-9_]+):(:?.+:)+/) {
+      # A search list was found.  Grab the first logical device
+      # and use it instead of the search list.
+      $dirs[1]=$1;
+      my $lcl_pwd = join('/', @dirs);
+      $workpath = $lcl_pwd . '/' . $workdir
     }
   }
 
-  if (-d $workpath)
-  {
+  if (-d $workpath) {
     print "Clearing $workpath...\n";
     &remove_directory_tree("$workpath/")
-          || &error ("Couldn't wipe out $workpath\n");
-  }
-  else
-  {
-    mkdir ($workpath, 0777) || &error ("Couldn't mkdir $workpath: $!\n");
+        or &error ("Couldn't wipe out $workpath: $!\n");
+  } else {
+    mkdir ($workpath, 0777) or &error ("Couldn't mkdir $workpath: $!\n");
   }
 
-  if (!-d $scriptpath)
-  {
+  if (!-d $scriptpath) {
     &error ("Failed to find $scriptpath containing perl test scripts.\n");
   }
 
-  if (@TESTS)
-  {
+  if (@TESTS) {
     print "Making work dirs...\n";
-    foreach $test (@TESTS)
-    {
-      if ($test =~ /^([^\/]+)\//)
-      {
+    foreach $test (@TESTS) {
+      if ($test =~ /^([^\/]+)\//) {
         $dir = $1;
         push (@rmdirs, $dir);
         -d "$workpath/$dir"
-           || mkdir ("$workpath/$dir", 0777)
-           || &error ("Couldn't mkdir $workpath/$dir: $!\n");
+           or mkdir ("$workpath/$dir", 0777)
+           or &error ("Couldn't mkdir $workpath/$dir: $!\n");
       }
     }
-  }
-  else
-  {
+  } else {
     print "Finding tests...\n";
     opendir (SCRIPTDIR, $scriptpath)
-        || &error ("Couldn't opendir $scriptpath: $!\n");
+        or &error ("Couldn't opendir $scriptpath: $!\n");
     @dirs = grep (!/^(\..*|CVS|RCS)$/, readdir (SCRIPTDIR) );
     closedir (SCRIPTDIR);
-    foreach $dir (@dirs)
-    {
+    foreach my $dir (@dirs) {
       next if ($dir =~ /^(\..*|CVS|RCS)$/ || ! -d "$scriptpath/$dir");
       push (@rmdirs, $dir);
       # VMS can have overlayed file systems, so directories may repeat.
       next if -d "$workpath/$dir";
       mkdir ("$workpath/$dir", 0777)
-          || &error ("Couldn't mkdir $workpath/$dir: $!\n");
+          or &error ("Couldn't mkdir $workpath/$dir: $!\n");
       opendir (SCRIPTDIR, "$scriptpath/$dir")
-          || &error ("Couldn't opendir $scriptpath/$dir: $!\n");
+          or &error ("Couldn't opendir $scriptpath/$dir: $!\n");
       @files = grep (!/^(\..*|CVS|RCS|.*~)$/, readdir (SCRIPTDIR) );
       closedir (SCRIPTDIR);
-      foreach $test (@files)
-      {
+      foreach my $test (@files) {
         -d $test and next;
         push (@TESTS, "$dir/$test");
       }
     }
   }
 
-  if (@TESTS == 0)
-  {
+  if (@TESTS == 0) {
     &error ("\nNo tests in $scriptpath, and none were specified.\n");
   }
 
@@ -273,8 +289,7 @@ sub toplevel
 
   run_all_tests();
 
-  foreach $dir (@rmdirs)
-  {
+  foreach my $dir (@rmdirs) {
     rmdir ("$workpath/$dir");
   }
 
@@ -283,8 +298,7 @@ sub toplevel
   $categories_failed = $categories_run - $categories_passed;
   $total_tests_failed = $total_tests_run - $total_tests_passed;
 
-  if ($total_tests_failed)
-  {
+  if ($total_tests_failed) {
     print "\n$total_tests_failed Test";
     print "s" unless $total_tests_failed == 1;
     print " in $categories_failed Categor";
@@ -292,15 +306,13 @@ sub toplevel
     print " Failed (See .$diffext* files in $workdir dir for details) :-(\n\n";
     return 0;
   }
-  else
-  {
-    print "\n$total_tests_passed Test";
-    print "s" unless $total_tests_passed == 1;
-    print " in $categories_passed Categor";
-    print ($categories_passed == 1 ? "y" : "ies");
-    print " Complete ... No Failures :-)\n\n";
-    return 1;
-  }
+
+  print "\n$total_tests_passed Test";
+  print "s" unless $total_tests_passed == 1;
+  print " in $categories_passed Categor";
+  print ($categories_passed == 1 ? "y" : "ies");
+  print " Complete ... No Failures :-)\n\n";
+  return 1;
 }
 
 sub get_osname
@@ -308,6 +320,40 @@ sub get_osname
   # Set up an initial value.  In perl5 we can do it the easy way.
   $osname = defined($^O) ? $^O : '';
 
+  # find the type of the port.  We do this up front to have a single
+  # point of change if it needs to be tweaked.
+  #
+  # This is probably not specific enough.
+  #
+  if ($osname =~ /MSWin32/i || $osname =~ /Windows/i
+      || $osname =~ /MINGW32/i || $osname =~ /CYGWIN_NT/i) {
+    $port_type = 'W32';
+  }
+  # Bleah, the osname is so variable on DOS.  This kind of bites.
+  # Well, as far as I can tell if we check for some text at the
+  # beginning of the line with either no spaces or a single space, then
+  # a D, then either "OS", "os", or "ev" and a space.  That should
+  # match and be pretty specific.
+  elsif ($osname =~ /^([^ ]*|[^ ]* [^ ]*)D(OS|os|ev) /) {
+    $port_type = 'DOS';
+  }
+  # Check for OS/2
+  elsif ($osname =~ m%OS/2%) {
+    $port_type = 'OS/2';
+  }
+
+  # VMS has a GNV Unix mode or a DCL mode.
+  # The SHELL environment variable should not be defined in VMS-DCL mode.
+  elsif ($osname eq 'VMS' && !defined $ENV{"SHELL"}) {
+    $port_type = 'VMS-DCL';
+  }
+  # Everything else, right now, is UNIX.  Note that we should integrate
+  # the VOS support into this as well and get rid of $vos; we'll do
+  # that next time.
+  else {
+    $port_type = 'UNIX';
+  }
+
   if ($osname eq 'VMS')
   {
     $vos = 0;
@@ -320,9 +366,9 @@ sub get_osname
   # See if the filesystem supports long file names with multiple
   # dots.  DOS doesn't.
   $short_filenames = 0;
-  (open (TOUCHFD, "> fancy.file.name") && close (TOUCHFD))
-      || ($short_filenames = 1);
-  unlink ("fancy.file.name") || ($short_filenames = 1);
+  (open (TOUCHFD, "> fancy.file.name") and close (TOUCHFD))
+      or $short_filenames = 1;
+  unlink ("fancy.file.name") or $short_filenames = 1;
 
   if (! $short_filenames) {
     # Thanks go to meyering@cs.utexas.edu (Jim Meyering) for suggesting a
@@ -331,44 +377,39 @@ sub get_osname
     # Because perl on VOS translates /'s to >'s, we need to test for
     # VOSness rather than testing for Unixness (ie, try > instead of /).
 
-    mkdir (".ostest", 0777) || &error ("Couldn't create .ostest: $!\n", 1);
-    open (TOUCHFD, "> .ostest>ick") && close (TOUCHFD);
-    chdir (".ostest") || &error ("Couldn't chdir to .ostest: $!\n", 1);
+    mkdir (".ostest", 0777) or &error ("Couldn't create .ostest: $!\n", 1);
+    open (TOUCHFD, "> .ostest>ick") and close (TOUCHFD);
+    chdir (".ostest") or &error ("Couldn't chdir to .ostest: $!\n", 1);
   }
 
-  if (! $short_filenames && -f "ick")
-  {
+  if (! $short_filenames && -f "ick") {
     $osname = "vos";
     $vos = 1;
     $pathsep = ">";
-  }
-  else
-  {
-    # the following is regrettably knarly, but it seems to be the only way
+
+  } else {
+    # the following is regrettably gnarly, but it seems to be the only way
     # to not get ugly error messages if uname can't be found.
     # Hmmm, BSD/OS 2.0's uname -a is excessively verbose.  Let's try it
     # with switches first.
     eval "chop (\$osname = `sh -c 'uname -nmsr 2>&1'`)";
-    if ($osname =~ /not found/i)
-    {
-        $osname = "(something posixy with no uname)";
-    }
-    elsif ($@ ne "" || $?)
-    {
-        eval "chop (\$osname = `sh -c 'uname -a 2>&1'`)";
-        if ($@ ne "" || $?)
-        {
-            $osname = "(something posixy)";
-        }
+    if ($osname =~ /not found/i) {
+      $osname = "(something posixy with no uname)";
+
+    } elsif ($@ ne "" || $?) {
+      eval "chop (\$osname = `sh -c 'uname -a 2>&1'`)";
+      if ($@ ne "" || $?) {
+        $osname = "(something posixy)";
+      }
     }
     $vos = 0;
     $pathsep = "/";
   }
 
   if (! $short_filenames) {
-    chdir ("..") || &error ("Couldn't chdir to ..: $!\n", 1);
+    chdir ("..") or &error ("Couldn't chdir to ..: $!\n", 1);
     unlink (".ostest>ick");
-    rmdir (".ostest") || &error ("Couldn't rmdir .ostest: $!\n", 1);
+    rmdir (".ostest") or &error ("Couldn't rmdir .ostest: $!\n", 1);
   }
 }
 
@@ -378,61 +419,50 @@ sub parse_command_line
 
   # use @ARGV if no args were passed in
 
-  if (@argv == 0)
-  {
+  if (@argv == 0) {
     @argv = @ARGV;
   }
 
   # look at each option; if we don't recognize it, maybe the suite-specific
   # command line parsing code will...
 
-  while (@argv)
-  {
+  while (@argv) {
     $option = shift @argv;
-    if ($option =~ /^-debug$/i)
-    {
-      print "\nDEBUG ON\n";
-      $debug = 1;
-    }
-    elsif ($option =~ /^-usage$/i)
-    {
+    if ($option =~ /^-usage$/i) {
       &print_usage;
       exit 0;
     }
-    elsif ($option =~ /^-(h|help)$/i)
-    {
+    if ($option =~ /^-(h|help)$/i) {
       &print_help;
       exit 0;
     }
-    elsif ($option =~ /^-profile$/i)
-    {
+
+    if ($option =~ /^-debug$/i) {
+      print "\nDEBUG ON\n";
+      $debug = 1;
+
+    } elsif ($option =~ /^-profile$/i) {
       $profile = 1;
-    }
-    elsif ($option =~ /^-verbose$/i)
-    {
+
+    } elsif ($option =~ /^-verbose$/i) {
       $verbose = 1;
-    }
-    elsif ($option =~ /^-detail$/i)
-    {
+
+    } elsif ($option =~ /^-detail$/i) {
       $detail = 1;
       $verbose = 1;
-    }
-    elsif ($option =~ /^-keep$/i)
-    {
+
+    } elsif ($option =~ /^-keep$/i) {
       $keep = 1;
-    }
-    elsif (&valid_option($option))
-    {
+
+    } elsif (&valid_option($option)) {
       # The suite-defined subroutine takes care of the option
-    }
-    elsif ($option =~ /^-/)
-    {
+
+    } elsif ($option =~ /^-/) {
       print "Invalid option: $option\n";
       &print_usage;
       exit 0;
-    }
-    else # must be the name of a test
-    {
+
+    } else { # must be the name of a test
       $option =~ s/\.pl$//;
       push(@TESTS,$option);
     }
@@ -441,14 +471,12 @@ sub parse_command_line
 
 sub max
 {
-  local($num) = shift @_;
-  local($newnum);
+  my $num = shift @_;
+  my $newnum;
 
-  while (@_)
-  {
+  while (@_) {
     $newnum = shift @_;
-    if ($newnum > $num)
-    {
+    if ($newnum > $num) {
       $num = $newnum;
     }
   }
@@ -458,171 +486,161 @@ sub max
 
 sub print_centered
 {
-  local($width, $string) = @_;
-  local($pad);
+  my ($width, $string) = @_;
 
-  if (length ($string))
-  {
-    $pad = " " x ( ($width - length ($string) + 1) / 2);
+  if (length ($string)) {
+    my $pad = " " x ( ($width - length ($string) + 1) / 2);
     print "$pad$string";
   }
 }
 
 sub print_banner
 {
-  local($info);
-  local($line);
-  local($len);
-
-  $info = "Running tests for $testee on $osname\n";  # $testee is suite-defined
-  $len = &max (length ($line), length ($testee_version),
-               length ($banner_info), 73) + 5;
-  $line = ("-" x $len) . "\n";
-  if ($len < 78)
-  {
-    $len = 78;
-  }
+  # $testee is suite-defined
+  my $info = "Running tests for $testee on $osname\n";
+  my $len = &max (length($info), length($testee_version), 73) + 5;
+  my $line = ("-" x $len) . "\n";
 
   &print_centered ($len, $line);
   &print_centered ($len, $info);
-  &print_centered ($len, $testee_version);  # suite-defined
-  &print_centered ($len, $banner_info);     # suite-defined
+  &print_centered ($len, $testee_version);
   &print_centered ($len, $line);
   print "\n";
 }
 
 sub run_all_tests
 {
-    $categories_run = 0;
-
-    $lasttest = '';
-    foreach $testname (sort @TESTS) {
-        # Skip duplicates on VMS caused by logical name search lists.
-        next if $testname eq $lasttest;
-        $lasttest = $testname;
-        $suite_passed = 1;       # reset by test on failure
-        $num_of_logfiles = 0;
-        $num_of_tmpfiles = 0;
-        $description = "";
-        $details = "";
-        $old_makefile = undef;
-        $testname =~ s/^$scriptpath$pathsep//;
-        $perl_testname = "$scriptpath$pathsep$testname";
-        $testname =~ s/(\.pl|\.perl)$//;
-        $testpath = "$workpath$pathsep$testname";
-        # Leave enough space in the extensions to append a number, even
-        # though it needs to fit into 8+3 limits.
-        if ($short_filenames) {
-            $logext = 'l';
-            $diffext = 'd';
-            $baseext = 'b';
-            $runext = 'r';
-            $extext = '';
-        } else {
-            $logext = 'log';
-            $diffext = 'diff';
-            $baseext = 'base';
-            $runext = 'run';
-            $extext = '.';
-        }
-        $extext = '_' if $^O eq 'VMS';
-        $log_filename = "$testpath.$logext";
-        $diff_filename = "$testpath.$diffext";
-        $base_filename = "$testpath.$baseext";
-        $run_filename = "$testpath.$runext";
-        $tmp_filename = "$testpath.$tmpfilesuffix";
-
-        setup_for_test();
-
-        $output = "........................................................ ";
-
-        substr($output,0,length($testname)) = "$testname ";
-
-        print $output;
-
-        $tests_run = 0;
-        $tests_passed = 0;
+  # Make sure we always run the tests from the current directory
+  unshift(@INC, cwd());
+
+  $categories_run = 0;
+
+  $lasttest = '';
+  # $testname is published
+  foreach $testname (sort @TESTS) {
+    # Skip duplicates on VMS caused by logical name search lists.
+    next if $testname eq $lasttest;
+    $lasttest = $testname;
+    $suite_passed = 1;       # reset by test on failure
+    $num_of_logfiles = 0;
+    $num_of_tmpfiles = 0;
+    $description = "";
+    $details = "";
+    $old_makefile = undef;
+    $testname =~ s/^$scriptpath$pathsep//;
+    $perl_testname = "$scriptpath$pathsep$testname";
+    $testname =~ s/(\.pl|\.perl)$//;
+    $testpath = "$workpath$pathsep$testname";
+    # Leave enough space in the extensions to append a number, even
+    # though it needs to fit into 8+3 limits.
+    if ($short_filenames) {
+      $logext = 'l';
+      $diffext = 'd';
+      $baseext = 'b';
+      $runext = 'r';
+      $extext = '';
+    } else {
+      $logext = 'log';
+      $diffext = 'diff';
+      $baseext = 'base';
+      $runext = 'run';
+      $extext = '.';
+    }
+    $extext = '_' if $^O eq 'VMS';
+    $log_filename = "$testpath.$logext";
+    $diff_filename = "$testpath.$diffext";
+    $base_filename = "$testpath.$baseext";
+    $run_filename = "$testpath.$runext";
+    $tmp_filename = "$testpath.$tmpfilesuffix";
 
-        # Run the test!
-        $code = do $perl_testname;
+    -f $perl_testname or die "Invalid test: $testname\n\n";
 
-        ++$categories_run;
-        $total_tests_run += $tests_run;
-        $total_tests_passed += $tests_passed;
+    setup_for_test();
 
-        # How did it go?
-        if (!defined($code)) {
-            # Failed to parse or called die
-            if (length ($@)) {
-                warn "\n*** Test died ($testname): $@\n";
-            } else {
-                warn "\n*** Couldn't parse $perl_testname\n";
-            }
-            $status = "FAILED ($tests_passed/$tests_run passed)";
-        }
+    $output = "........................................................ ";
 
-        elsif ($code == -1) {
-            # Skipped... not supported
-            $status = "N/A";
-            --$categories_run;
-        }
+    substr($output,0,length($testname)) = "$testname ";
 
-        elsif ($code != 1) {
-            # Bad result... this shouldn't really happen.  Usually means that
-            # the suite forgot to end with "1;".
-            warn "\n*** Test returned $code\n";
-            $status = "FAILED ($tests_passed/$tests_run passed)";
-        }
+    print $output;
 
-        elsif ($tests_run == 0) {
-            # Nothing was done!!
-            $status = "FAILED (no tests found!)";
-        }
+    $tests_run = 0;
+    $tests_passed = 0;
 
-        elsif ($tests_run > $tests_passed) {
-            # Lose!
-            $status = "FAILED ($tests_passed/$tests_run passed)";
-        }
+    # Run the test!
+    $code = do $perl_testname;
 
-        else {
-            # Win!
-            ++$categories_passed;
-            $status = "ok     ($tests_passed passed)";
+    ++$categories_run;
+    $total_tests_run += $tests_run;
+    $total_tests_passed += $tests_passed;
 
-            # Clean up
-            for ($i = $num_of_tmpfiles; $i; $i--) {
-                rmfiles($tmp_filename . num_suffix($i));
-            }
-            for ($i = $num_of_logfiles ? $num_of_logfiles : 1; $i; $i--) {
-                rmfiles($log_filename . num_suffix($i));
-                rmfiles($base_filename . num_suffix($i));
-            }
-        }
-
-        # If the verbose option has been specified, then a short description
-        # of each test is printed before displaying the results of each test
-        # describing WHAT is being tested.
+    # How did it go?
+    if (!defined($code)) {
+      # Failed to parse or called die
+      if (length ($@)) {
+        warn "\n*** Test died ($testname): $@\n";
+      } else {
+        warn "\n*** Couldn't parse $perl_testname\n";
+      }
+      $status = "FAILED ($tests_passed/$tests_run passed)";
+
+    } elsif ($code == -1) {
+      # Skipped... not supported
+      $status = "N/A";
+      --$categories_run;
+
+    } elsif ($code != 1) {
+      # Bad result... this shouldn't really happen.  Usually means that
+      # the suite forgot to end with "1;".
+      warn "\n*** Test returned $code\n";
+      $status = "FAILED ($tests_passed/$tests_run passed)";
+
+    } elsif ($tests_run == 0) {
+      # Nothing was done!!
+      $status = "FAILED (no tests found!)";
+
+    } elsif ($tests_run > $tests_passed) {
+      # Lose!
+      $status = "FAILED ($tests_passed/$tests_run passed)";
+
+    } else {
+      # Win!
+      ++$categories_passed;
+      $status = "ok     ($tests_passed passed)";
+
+      # Clean up
+      for ($i = $num_of_tmpfiles; $i; $i--) {
+        rmfiles($tmp_filename . num_suffix($i));
+      }
+      for ($i = $num_of_logfiles ? $num_of_logfiles : 1; $i; $i--) {
+        rmfiles($log_filename . num_suffix($i));
+        rmfiles($base_filename . num_suffix($i));
+      }
+    }
 
-        if ($verbose) {
-            if ($detail) {
-                print "\nWHAT IS BEING TESTED\n";
-                print "--------------------";
-            }
-            print "\n\n$description\n\n";
-        }
+    # If the verbose option has been specified, then a short description
+    # of each test is printed before displaying the results of each test
+    # describing WHAT is being tested.
 
-        # If the detail option has been specified, then the details of HOW
-        # the test is testing what it says it is testing in the verbose output
-        # will be displayed here before the results of the test are displayed.
+    if ($verbose) {
+      if ($detail) {
+        print "\nWHAT IS BEING TESTED\n";
+        print "--------------------";
+      }
+      print "\n\n$description\n\n";
+    }
 
-        if ($detail) {
-            print "\nHOW IT IS TESTED\n";
-            print "----------------";
-            print "\n\n$details\n\n";
-        }
+    # If the detail option has been specified, then the details of HOW
+    # the test is testing what it says it is testing in the verbose output
+    # will be displayed here before the results of the test are displayed.
 
-        print "$status\n";
+    if ($detail) {
+      print "\nHOW IT IS TESTED\n";
+      print "----------------";
+      print "\n\n$details\n\n";
     }
+
+    print "$status\n";
+  }
 }
 
 # If the keep flag is not set, this subroutine deletes all filenames that
@@ -630,10 +648,9 @@ sub run_all_tests
 
 sub rmfiles
 {
-  local(@files) = @_;
+  my (@files) = @_;
 
-  if (!$keep)
-  {
+  if (!$keep) {
     return (unlink @files);
   }
 
@@ -642,8 +659,7 @@ sub rmfiles
 
 sub print_standard_usage
 {
-  local($plname,@moreusage) = @_;
-  local($line);
+  my ($plname, @moreusage) = @_;
 
   print "usage:\t$plname [testname] [-verbose] [-detail] [-keep]\n";
   print "\t\t\t[-profile] [-usage] [-help] [-debug]\n";
@@ -654,17 +670,15 @@ sub print_standard_usage
 
 sub print_standard_help
 {
-  local(@morehelp) = @_;
-  local($line);
-  local($tline);
-  local($t) = "      ";
+  my (@morehelp) = @_;
+  my $t = "      ";
 
-  $line = "Test Driver For $testee";
+  my $line = "Test Driver For $testee";
   print "$line\n";
   $line = "=" x length ($line);
   print "$line\n";
 
-  &print_usage;
+  print_usage();
 
   print "\ntestname\n"
       . "${t}You may, if you wish, run only ONE test if you know the name\n"
@@ -694,11 +708,9 @@ sub print_standard_help
       . "${t}This can be helpful if you're having a problem adding a test\n"
       . "${t}to the suite, or if the test fails!\n";
 
-  foreach $line (@morehelp)
-  {
-    $tline = $line;
-    if (substr ($tline, 0, 1) eq "\t")
-    {
+  foreach $line (@morehelp) {
+    my $tline = $line;
+    if (substr ($tline, 0, 1) eq "\t") {
       substr ($tline, 0, 1) = $t;
     }
     print "$tline\n";
@@ -711,23 +723,17 @@ sub print_standard_help
 
 sub get_caller
 {
-  local($depth);
-  local($package);
-  local($filename);
-  local($linenum);
-
-  $depth = defined ($_[0]) ? $_[0] : 1;
-  ($package, $filename, $linenum) = caller ($depth + 1);
+  my $depth = defined ($_[0]) ? $_[0] : 1;
+  my ($pkg, $filename, $linenum) = caller ($depth + 1);
   return "$filename: $linenum";
 }
 
 sub error
 {
-  local($message) = $_[0];
-  local($caller) = &get_caller (1);
+  my $message = $_[0];
+  my $caller = &get_caller (1);
 
-  if (defined ($_[1]))
-  {
+  if (defined ($_[1])) {
     $caller = &get_caller ($_[1] + 1) . " -> $caller";
   }
 
@@ -736,165 +742,164 @@ sub error
 
 sub compare_output
 {
-  local($answer,$logfile) = @_;
-  local($slurp, $answer_matched) = ('', 0);
+  my ($answer,$logfile) = @_;
+  my ($slurp, $answer_matched) = ('', 0);
 
   ++$tests_run;
 
   if (! defined $answer) {
-      print "Ignoring output ........ " if $debug;
-      $answer_matched = 1;
+    print "Ignoring output ........ " if $debug;
+    $answer_matched = 1;
   } else {
-      print "Comparing Output ........ " if $debug;
+    print "Comparing output ........ " if $debug;
 
-      $slurp = &read_file_into_string ($logfile);
+    $slurp = &read_file_into_string ($logfile);
 
-      # For make, get rid of any time skew error before comparing--too bad this
-      # has to go into the "generic" driver code :-/
-      $slurp =~ s/^.*modification time .*in the future.*\n//gm;
-      $slurp =~ s/^.*Clock skew detected.*\n//gm;
+    # For make, get rid of any time skew error before comparing--too bad this
+    # has to go into the "generic" driver code :-/
+    $slurp =~ s/^.*modification time .*in the future.*\n//gm;
+    $slurp =~ s/^.*Clock skew detected.*\n//gm;
 
-      if ($slurp eq $answer) {
-          $answer_matched = 1;
-      } else {
-          # See if it is a slash or CRLF problem
-          local ($answer_mod, $slurp_mod) = ($answer, $slurp);
+    if ($slurp eq $answer) {
+        $answer_matched = 1;
+    } else {
+      # See if it is a slash or CRLF problem
+      my ($answer_mod, $slurp_mod) = ($answer, $slurp);
+
+      $answer_mod =~ tr,\\,/,;
+      $answer_mod =~ s,\r\n,\n,gs;
 
-          $answer_mod =~ tr,\\,/,;
-          $answer_mod =~ s,\r\n,\n,gs;
+      $slurp_mod =~ tr,\\,/,;
+      $slurp_mod =~ s,\r\n,\n,gs;
 
-          $slurp_mod =~ tr,\\,/,;
-          $slurp_mod =~ s,\r\n,\n,gs;
+      $answer_matched = ($slurp_mod eq $answer_mod);
+      if ($^O eq 'VMS') {
 
+        # VMS has extra blank lines in output sometimes.
+        # Ticket #41760
+        if (!$answer_matched) {
+          $slurp_mod =~ s/\n\n+/\n/gm;
+          $slurp_mod =~ s/\A\n+//g;
           $answer_matched = ($slurp_mod eq $answer_mod);
-          if ($^O eq 'VMS') {
-
-            # VMS has extra blank lines in output sometimes.
-            # Ticket #41760
-            if (!$answer_matched) {
-              $slurp_mod =~ s/\n\n+/\n/gm;
-              $slurp_mod =~ s/\A\n+//g;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        }
 
-            # VMS adding a "Waiting for unfinished jobs..."
-            # Remove it for now to see what else is going on.
-            if (!$answer_matched) {
-              $slurp_mod =~ s/^.+\*\*\* Waiting for unfinished jobs.+$//m;
-              $slurp_mod =~ s/\n\n/\n/gm;
-              $slurp_mod =~ s/^\n+//gm;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        # VMS adding a "Waiting for unfinished jobs..."
+        # Remove it for now to see what else is going on.
+        if (!$answer_matched) {
+          $slurp_mod =~ s/^.+\*\*\* Waiting for unfinished jobs.+$//m;
+          $slurp_mod =~ s/\n\n/\n/gm;
+          $slurp_mod =~ s/^\n+//gm;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # VMS wants target device to exist or generates an error,
-            # Some test tagets look like VMS devices and trip this.
-            if (!$answer_matched) {
-              $slurp_mod =~ s/^.+\: no such device or address.*$//gim;
-              $slurp_mod =~ s/\n\n/\n/gm;
-              $slurp_mod =~ s/^\n+//gm;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        # VMS wants target device to exist or generates an error,
+        # Some test tagets look like VMS devices and trip this.
+        if (!$answer_matched) {
+          $slurp_mod =~ s/^.+\: no such device or address.*$//gim;
+          $slurp_mod =~ s/\n\n/\n/gm;
+          $slurp_mod =~ s/^\n+//gm;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # VMS error message has a different case
-            if (!$answer_matched) {
-              $slurp_mod =~ s/no such file /No such file /gm;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        # VMS error message has a different case
+        if (!$answer_matched) {
+          $slurp_mod =~ s/no such file /No such file /gm;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # VMS is putting comas instead of spaces in output
-            if (!$answer_matched) {
-              $slurp_mod =~ s/,/ /gm;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        # VMS is putting comas instead of spaces in output
+        if (!$answer_matched) {
+          $slurp_mod =~ s/,/ /gm;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # VMS Is sometimes adding extra leading spaces to output?
-            if (!$answer_matched) {
-               my $slurp_mod = $slurp_mod;
-               $slurp_mod =~ s/^ +//gm;
-               $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        # VMS Is sometimes adding extra leading spaces to output?
+        if (!$answer_matched) {
+           my $slurp_mod = $slurp_mod;
+           $slurp_mod =~ s/^ +//gm;
+           $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # VMS port not handling POSIX encoded child status
-            # Translate error case it for now.
-            if (!$answer_matched) {
-              $slurp_mod =~ s/0x1035a00a/1/gim;
-              $answer_matched = 1 if $slurp_mod =~ /\Q$answer_mod\E/i;
+        # VMS port not handling POSIX encoded child status
+        # Translate error case it for now.
+        if (!$answer_matched) {
+          $slurp_mod =~ s/0x1035a00a/1/gim;
+          $answer_matched = 1 if $slurp_mod =~ /\Q$answer_mod\E/i;
 
-            }
-            if (!$answer_matched) {
-              $slurp_mod =~ s/0x1035a012/2/gim;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        }
+        if (!$answer_matched) {
+          $slurp_mod =~ s/0x1035a012/2/gim;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # Tests are using a UNIX null command, temp hack
-            # until this can be handled by the VMS port.
-            # ticket # 41761
-            if (!$answer_matched) {
-              $slurp_mod =~ s/^.+DCL-W-NOCOMD.*$//gim;
-              $slurp_mod =~ s/\n\n+/\n/gm;
-              $slurp_mod =~ s/^\n+//gm;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
-            # Tests are using exit 0;
-            # this generates a warning that should stop the make, but does not
-            if (!$answer_matched) {
-              $slurp_mod =~ s/^.+NONAME-W-NOMSG.*$//gim;
-              $slurp_mod =~ s/\n\n+/\n/gm;
-              $slurp_mod =~ s/^\n+//gm;
-              $answer_matched = ($slurp_mod eq $answer_mod);
-            }
+        # Tests are using a UNIX null command, temp hack
+        # until this can be handled by the VMS port.
+        # ticket # 41761
+        if (!$answer_matched) {
+          $slurp_mod =~ s/^.+DCL-W-NOCOMD.*$//gim;
+          $slurp_mod =~ s/\n\n+/\n/gm;
+          $slurp_mod =~ s/^\n+//gm;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
+        # Tests are using exit 0;
+        # this generates a warning that should stop the make, but does not
+        if (!$answer_matched) {
+          $slurp_mod =~ s/^.+NONAME-W-NOMSG.*$//gim;
+          $slurp_mod =~ s/\n\n+/\n/gm;
+          $slurp_mod =~ s/^\n+//gm;
+          $answer_matched = ($slurp_mod eq $answer_mod);
+        }
 
-            # VMS is sometimes adding single quotes to output?
-            if (!$answer_matched) {
-              my $noq_slurp_mod = $slurp_mod;
-              $noq_slurp_mod =~ s/\'//gm;
-              $answer_matched = ($noq_slurp_mod eq $answer_mod);
-
-              # And missing an extra space in output
-              if (!$answer_matched) {
-                $noq_answer_mod = $answer_mod;
-                $noq_answer_mod =~ s/\h\h+/ /gm;
-                $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
-              }
-
-              # VMS adding ; to end of some lines.
-              if (!$answer_matched) {
-                $noq_slurp_mod =~ s/;\n/\n/gm;
-                $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
-              }
-
-              # VMS adding trailing space to end of some quoted lines.
-              if (!$answer_matched) {
-                $noq_slurp_mod =~ s/\h+\n/\n/gm;
-                $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
-              }
-
-              # And VMS missing leading blank line
-              if (!$answer_matched) {
-                $noq_answer_mod =~ s/\A\n//g;
-                $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
-              }
-
-              # Unix double quotes showing up as single quotes on VMS.
-              if (!$answer_matched) {
-                $noq_answer_mod =~ s/\"//g;
-                $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
-              }
-            }
+        # VMS is sometimes adding single quotes to output?
+        if (!$answer_matched) {
+          my $noq_slurp_mod = $slurp_mod;
+          $noq_slurp_mod =~ s/\'//gm;
+          $answer_matched = ($noq_slurp_mod eq $answer_mod);
+
+          # And missing an extra space in output
+          if (!$answer_matched) {
+            $noq_answer_mod = $answer_mod;
+            $noq_answer_mod =~ s/\h\h+/ /gm;
+            $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
           }
 
-          # If it still doesn't match, see if the answer might be a regex.
-          if (!$answer_matched && $answer =~ m,^/(.+)/$,) {
-              $answer_matched = ($slurp =~ /$1/);
-              if (!$answer_matched && $answer_mod =~ m,^/(.+)/$,) {
-                  $answer_matched = ($slurp_mod =~ /$1/);
-              }
+          # VMS adding ; to end of some lines.
+          if (!$answer_matched) {
+            $noq_slurp_mod =~ s/;\n/\n/gm;
+            $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
           }
+
+          # VMS adding trailing space to end of some quoted lines.
+          if (!$answer_matched) {
+            $noq_slurp_mod =~ s/\h+\n/\n/gm;
+            $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
+          }
+
+          # And VMS missing leading blank line
+          if (!$answer_matched) {
+            $noq_answer_mod =~ s/\A\n//g;
+            $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
+          }
+
+          # Unix double quotes showing up as single quotes on VMS.
+          if (!$answer_matched) {
+            $noq_answer_mod =~ s/\"//g;
+            $answer_matched = ($noq_slurp_mod eq $noq_answer_mod);
+          }
+        }
       }
+
+      # If it still doesn't match, see if the answer might be a regex.
+      if (!$answer_matched && $answer =~ m,^/(.+)/$,) {
+        $answer_matched = ($slurp =~ /$1/);
+        if (!$answer_matched && $answer_mod =~ m,^/(.+)/$,) {
+            $answer_matched = ($slurp_mod =~ /$1/);
+        }
+      }
+    }
   }
 
-  if ($answer_matched && $test_passed)
-  {
+  if ($answer_matched && $test_passed) {
     print "ok\n" if $debug;
     ++$tests_passed;
     return 1;
@@ -910,7 +915,7 @@ sub compare_output
 
     # Create the difference file
 
-    local($command) = "diff -c " . &get_basefile . " " . $logfile;
+    my $command = "diff -c " . &get_basefile . " " . $logfile;
     &run_command_with_output(&get_difffile,$command);
   }
 
@@ -919,13 +924,12 @@ sub compare_output
 
 sub read_file_into_string
 {
-  local($filename) = @_;
-  local($oldslash) = $/;
-
+  my ($filename) = @_;
+  my $oldslash = $/;
   undef $/;
 
-  open (RFISFILE, $filename) || return "";
-  local ($slurp) = <RFISFILE>;
+  open (RFISFILE, '<', $filename) or return "";
+  my $slurp = <RFISFILE>;
   close (RFISFILE);
 
   $/ = $oldslash;
@@ -938,13 +942,12 @@ my @ERRSTACK = ();
 
 sub attach_default_output
 {
-  local ($filename) = @_;
-  local ($code);
+  my ($filename) = @_;
 
   if ($vos)
   {
-    $code = system "++attach_default_output_hack $filename";
-    $code == -2 || &error ("adoh death\n", 1);
+    my $code = system "++attach_default_output_hack $filename";
+    $code == -2 or &error ("adoh death\n", 1);
     return 1;
   }
 
@@ -965,12 +968,10 @@ sub attach_default_output
 
 sub detach_default_output
 {
-  local ($code);
-
   if ($vos)
   {
-    $code = system "++detach_default_output_hack";
-    $code == -2 || &error ("ddoh death\n", 1);
+    my $code = system "++detach_default_output_hack";
+    $code == -2 or &error ("ddoh death\n", 1);
     return 1;
   }
 
@@ -984,60 +985,93 @@ sub detach_default_output
   open (STDERR, '>&', pop @ERRSTACK) or error("ddo: $! duping STDERR\n", 1);
 }
 
-# This runs a command without any debugging info.
-sub _run_command
+sub _run_with_timeout
 {
   my $code;
+  if ($^O eq 'VMS') {
+    #local $SIG{ALRM} = sub {
+    #    my $e = $ERRSTACK[0];
+    #    print $e "\nTest timed out after $test_timeout seconds\n";
+    #    die "timeout\n";
+    #};
+    #alarm $test_timeout;
+    system(@_);
+    #alarm 0;
+    my $severity = ${^CHILD_ERROR_NATIVE} & 7;
+    $code = 0;
+    if (($severity & 1) == 0) {
+      $code = 512;
+    }
+
+    # Get the vms status.
+    my $vms_code = ${^CHILD_ERROR_NATIVE};
+
+    # Remove the print status bit
+    $vms_code &= ~0x10000000;
+
+    # Posix code translation.
+    if (($vms_code & 0xFFFFF000) == 0x35a000) {
+      $code = (($vms_code & 0xFFF) >> 3) * 256;
+    }
 
+  } elsif ($port_type eq 'W32') {
+    my $pid = system(1, @_);
+    $pid > 0 or die "Cannot execute $_[0]\n";
+    local $SIG{ALRM} = sub {
+      my $e = $ERRSTACK[0];
+      print $e "\nTest timed out after $test_timeout seconds\n";
+      kill -9, $pid;
+      die "timeout\n";
+    };
+    alarm $test_timeout;
+    my $r = waitpid($pid, 0);
+    alarm 0;
+    $r == -1 and die "No such pid: $pid\n";
+    # This shouldn't happen since we wait forever or timeout via SIGALRM
+    $r == 0 and die "No process exited.\n";
+    $code = $?;
+
+  } else {
+    my $pid = fork();
+    if (! $pid) {
+      exec(@_) or die "exec: Cannot execute $_[0]: $!\n";
+    }
+    local $SIG{ALRM} = sub {
+      my $e = $ERRSTACK[0];
+      print $e "\nTest timed out after $test_timeout seconds\n";
+      # Resend the alarm to our process group to kill the children.
+      $SIG{ALRM} = 'IGNORE';
+      kill -14, $$;
+      die "timeout\n";
+    };
+    alarm $test_timeout;
+    my $r = waitpid($pid, 0);
+    alarm 0;
+    $r == -1 and die "No such pid: $pid\n";
+    # This shouldn't happen since we wait forever or timeout via SIGALRM
+    $r == 0 and die "No process exited.\n";
+    $code = $?;
+  }
+
+  return $code;
+}
+
+# This runs a command without any debugging info.
+sub _run_command
+{
   # We reset this before every invocation.  On Windows I think there is only
   # one environment, not one per process, so I think that variables set in
   # test scripts might leak into subsequent tests if this isn't reset--???
   resetENV();
 
-  eval {
-      if ($^O eq 'VMS') {
-          local $SIG{ALRM} = sub {
-              my $e = $ERRSTACK[0];
-              print $e "\nTest timed out after $test_timeout seconds\n";
-              die "timeout\n"; };
-#          alarm $test_timeout;
-          system(@_);
-          my $severity = ${^CHILD_ERROR_NATIVE} & 7;
-          $code = 0;
-          if (($severity & 1) == 0) {
-              $code = 512;
-          }
-
-          # Get the vms status.
-          my $vms_code = ${^CHILD_ERROR_NATIVE};
+  my $orig = $SIG{ALRM};
+  my $code = eval { _run_with_timeout(@_); };
+  $SIG{ALRM} = $orig;
 
-          # Remove the print status bit
-          $vms_code &= ~0x10000000;
-
-          # Posix code translation.
-          if (($vms_code & 0xFFFFF000) == 0x35a000) {
-              $code = (($vms_code & 0xFFF) >> 3) * 256;
-          }
-      } else {
-          my $pid = fork();
-          if (! $pid) {
-              exec(@_) or die "Cannot execute $_[0]\n";
-          }
-          local $SIG{ALRM} = sub { my $e = $ERRSTACK[0]; print $e "\nTest timed out after $test_timeout seconds\n"; die "timeout\n"; };
-          alarm $test_timeout;
-          waitpid($pid, 0) > 0 or die "No such pid: $pid\n";
-          $code = $?;
-      }
-      alarm 0;
-  };
   if ($@) {
-      # The eval failed.  If it wasn't SIGALRM then die.
-      $@ eq "timeout\n" or die "Command failed: $@";
-
-      # Timed out.  Resend the alarm to our process group to kill the children.
-      $SIG{ALRM} = 'IGNORE';
-      kill -14, $$;
-      $code = 14;
+    # The eval failed.  If it wasn't SIGALRM then die.
+    $@ eq "timeout\n" or die "Command failed: $@";
+    $code = 14;
   }
 
   return $code;
@@ -1083,26 +1117,21 @@ sub run_command_with_output
 
 sub remove_directory_tree
 {
-  local ($targetdir) = @_;
-  local ($nuketop) = 1;
-  local ($ch);
+  my ($targetdir) = @_;
+  my ($nuketop) = 1;
 
-  $ch = substr ($targetdir, length ($targetdir) - 1);
-  if ($ch eq "/" || $ch eq $pathsep)
-  {
+  my $ch = substr ($targetdir, length ($targetdir) - 1);
+  if ($ch eq "/" || $ch eq $pathsep) {
     $targetdir = substr ($targetdir, 0, length ($targetdir) - 1);
     $nuketop = 0;
   }
 
-  if (! -e $targetdir)
-  {
-    return 1;
-  }
+  -e $targetdir or return 1;
 
-  &remove_directory_tree_inner ("RDT00", $targetdir) || return 0;
-  if ($nuketop)
-  {
-    rmdir $targetdir || return 0;
+  &remove_directory_tree_inner ("RDT00", $targetdir) or return 0;
+  if ($nuketop && !rmdir ($targetdir)) {
+    print "Cannot remove $targetdir: $!\n";
+    return 0;
   }
 
   return 1;
@@ -1110,35 +1139,28 @@ sub remove_directory_tree
 
 sub remove_directory_tree_inner
 {
-  local ($dirhandle, $targetdir) = @_;
-  local ($object);
-  local ($subdirhandle);
+  my ($dirhandle, $targetdir) = @_;
 
-  opendir ($dirhandle, $targetdir) || return 0;
-  $subdirhandle = $dirhandle;
+  opendir ($dirhandle, $targetdir) or return 0;
+  my $subdirhandle = $dirhandle;
   $subdirhandle++;
-  while ($object = readdir ($dirhandle))
-  {
-    if ($object =~ /^(\.\.?|CVS|RCS)$/)
-    {
-      next;
-    }
-
+  while (my $object = readdir ($dirhandle)) {
+    $object =~ /^(\.\.?|CVS|RCS)$/ and next;
     $object = "$targetdir$pathsep$object";
-    lstat ($object);
 
-    if (-d _ && &remove_directory_tree_inner ($subdirhandle, $object))
-    {
-      rmdir $object || return 0;
-    }
-    else
-    {
-      if ($^O ne 'VMS')
-      {
-        unlink $object || return 0;
+    lstat ($object);
+    if (-d _ && &remove_directory_tree_inner ($subdirhandle, $object)) {
+      if (!rmdir($object)) {
+        print "Cannot remove $object: $!\n";
+        return 0;
       }
-      else
-      {
+    } else {
+      if ($^O ne 'VMS') {
+        if (!unlink $object) {
+          print "Cannot unlink $object: $!\n";
+          return 0;
+        }
+      } else {
         # VMS can have multiple versions of a file.
         1 while unlink $object;
       }
@@ -1152,15 +1174,13 @@ sub remove_directory_tree_inner
 #
 #sub touch
 #{
-#  local (@filenames) = @_;
-#  local ($now) = time;
-#  local ($file);
+#  my (@filenames) = @_;
+#  my $now = time;
 #
-#  foreach $file (@filenames)
-#  {
+#  foreach my $file (@filenames) {
 #    utime ($now, $now, $file)
-#          || (open (TOUCHFD, ">> $file") && close (TOUCHFD))
-#               || &error ("Couldn't touch $file: $!\n", 1);
+#          or (open (TOUCHFD, ">> $file") and close (TOUCHFD))
+#               or &error ("Couldn't touch $file: $!\n", 1);
 #  }
 #  return 1;
 #}
@@ -1175,12 +1195,12 @@ sub remove_directory_tree_inner
 
 sub touch
 {
-  local ($file);
-
-  foreach $file (@_) {
-    (open(T, ">> $file") && print(T "\n") && close(T))
-        || &error("Couldn't touch $file: $!\n", 1);
+  foreach my $file (@_) {
+    (open(T, '>>', $file) and print(T "\n") and close(T))
+        or &error("Couldn't touch $file: $!\n", 1);
   }
+
+  return @_;
 }
 
 # Touch with a time offset.  To DTRT, call touch() then use stat() to get the
@@ -1188,25 +1208,26 @@ sub touch
 
 sub utouch
 {
-  local ($off) = shift;
-  local ($file);
+  my $off = shift;
 
   &touch(@_);
 
-  local (@s) = stat($_[0]);
+  foreach my $f (@_) {
+      my @s = stat($f);
+      utime($s[8]+$off, $s[9]+$off, $f);
+  }
 
-  utime($s[8]+$off, $s[9]+$off, @_);
+  return @_;
 }
 
 # open a file, write some stuff to it, and close it.
 
 sub create_file
 {
-  local ($filename, @lines) = @_;
+  my ($filename, @lines) = @_;
 
-  open (CF, "> $filename") || &error ("Couldn't open $filename: $!\n", 1);
-  foreach $line (@lines)
-  {
+  open (CF, "> $filename") or &error ("Couldn't open $filename: $!\n", 1);
+  foreach $line (@lines) {
     print CF $line;
   }
   close (CF);
@@ -1224,35 +1245,28 @@ sub create_file
 
 sub create_dir_tree
 {
-  local ($basedir, %dirtree) = @_;
-  local ($path);
+  my ($basedir, %dirtree) = @_;
 
   &remove_directory_tree ("$basedir");
-  mkdir ($basedir, 0777) || &error ("Couldn't mkdir $basedir: $!\n", 1);
+  mkdir ($basedir, 0777) or &error ("Couldn't mkdir $basedir: $!\n", 1);
 
-  foreach $path (sort keys (%dirtree))
-  {
-    if ($dirtree {$path} =~ /^DIR$/)
-    {
+  foreach my $path (sort keys (%dirtree)) {
+    if ($dirtree {$path} =~ /^DIR$/) {
       mkdir ("$basedir/$path", 0777)
-               || &error ("Couldn't mkdir $basedir/$path: $!\n", 1);
-    }
-    elsif ($dirtree {$path} =~ /^FILE:(.*)$/)
-    {
+          or &error ("Couldn't mkdir $basedir/$path: $!\n", 1);
+
+    } elsif ($dirtree {$path} =~ /^FILE:(.*)$/) {
       &create_file ("$basedir/$path", $1 . "\n");
-    }
-    elsif ($dirtree {$path} =~ /^LINK:(.*)$/)
-    {
+
+    } elsif ($dirtree {$path} =~ /^LINK:(.*)$/) {
       symlink ("$basedir/$1", "$basedir/$path")
-        || &error ("Couldn't symlink $basedir/$path -> $basedir/$1: $!\n", 1);
-    }
-    else
-    {
+          or &error ("Couldn't symlink $basedir/$path -> $basedir/$1: $!\n", 1);
+
+    } else {
       &error ("Bogus dirtree type: \"$dirtree{$path}\"\n", 1);
     }
   }
-  if ($just_setup_tree)
-  {
+  if ($just_setup_tree) {
     die "Tree is setup...\n";
   }
 }
@@ -1264,40 +1278,27 @@ sub create_dir_tree
 
 sub compare_dir_tree
 {
-  local ($basedir, %dirtree) = @_;
-  local ($path);
-  local ($i);
-  local ($bogus) = 0;
-  local ($contents);
-  local ($target);
-  local ($fulltarget);
-  local ($found);
-  local (@files);
-  local (@allfiles);
-
-  opendir (DIR, $basedir) || &error ("Couldn't open $basedir: $!\n", 1);
-  @allfiles = grep (!/^(\.\.?|CVS|RCS)$/, readdir (DIR) );
+  my ($basedir, %dirtree) = @_;
+  my $bogus = 0;
+
+  opendir (DIR, $basedir) or &error ("Couldn't open $basedir: $!\n", 1);
+  my @allfiles = grep (!/^(\.\.?|CVS|RCS)$/, readdir (DIR) );
   closedir (DIR);
-  if ($debug)
-  {
+  if ($debug) {
     print "dirtree: (%dirtree)\n$basedir: (@allfiles)\n";
   }
 
-  foreach $path (sort keys (%dirtree))
+  foreach my $path (sort keys (%dirtree))
   {
-    if ($debug)
-    {
+    if ($debug) {
       print "Checking $path ($dirtree{$path}).\n";
     }
 
-    $found = 0;
-    foreach $i (0 .. $#allfiles)
-    {
-      if ($allfiles[$i] eq $path)
-      {
+    my $found = 0;
+    foreach my $i (0 .. $#allfiles) {
+      if ($allfiles[$i] eq $path) {
         splice (@allfiles, $i, 1);  # delete it
-        if ($debug)
-        {
+        if ($debug) {
           print "     Zapped $path; files now (@allfiles).\n";
         }
         lstat ("$basedir/$path");
@@ -1306,18 +1307,15 @@ sub compare_dir_tree
       }
     }
 
-    if (!$found)
-    {
+    if (!$found) {
       print "compare_dir_tree: $path does not exist.\n";
       $bogus = 1;
       next;
     }
 
-    if ($dirtree {$path} =~ /^DIR$/)
-    {
-      if (-d _ && opendir (DIR, "$basedir/$path") )
-      {
-        @files = readdir (DIR);
+    if ($dirtree {$path} =~ /^DIR$/) {
+      if (-d _ && opendir (DIR, "$basedir/$path") ) {
+        my @files = readdir (DIR);
         closedir (DIR);
         @files = grep (!/^(\.\.?|CVS|RCS)$/ && ($_ = "$path/$_"), @files);
         push (@allfiles, @files);
@@ -1325,71 +1323,59 @@ sub compare_dir_tree
         {
           print "     Read in $path; new files (@files).\n";
         }
-      }
-      else
-      {
+
+      } else {
         print "compare_dir_tree: $path is not a dir.\n";
         $bogus = 1;
       }
-    }
-    elsif ($dirtree {$path} =~ /^FILE:(.*)$/)
-    {
-      if (-l _ || !-f _)
-      {
+
+    } elsif ($dirtree {$path} =~ /^FILE:(.*)$/) {
+      if (-l _ || !-f _) {
         print "compare_dir_tree: $path is not a file.\n";
         $bogus = 1;
         next;
       }
 
-      if ($1 ne "*")
-      {
-        $contents = &read_file_into_string ("$basedir/$path");
-        if ($contents ne "$1\n")
-        {
+      if ($1 ne "*") {
+        my $contents = &read_file_into_string ("$basedir/$path");
+        if ($contents ne "$1\n") {
           print "compare_dir_tree: $path contains wrong stuff."
               . "  Is:\n$contentsShould be:\n$1\n";
           $bogus = 1;
         }
       }
-    }
-    elsif ($dirtree {$path} =~ /^LINK:(.*)$/)
-    {
-      $target = $1;
-      if (!-l _)
-      {
+
+    } elsif ($dirtree {$path} =~ /^LINK:(.*)$/) {
+      my $target = $1;
+      if (!-l _) {
         print "compare_dir_tree: $path is not a link.\n";
         $bogus = 1;
         next;
       }
 
-      $contents = readlink ("$basedir/$path");
+      my $contents = readlink ("$basedir/$path");
       $contents =~ tr/>/\//;
-      $fulltarget = "$basedir/$target";
+      my $fulltarget = "$basedir/$target";
       $fulltarget =~ tr/>/\//;
-      if (!($contents =~ /$fulltarget$/))
-      {
-        if ($debug)
-        {
+      if (!($contents =~ /$fulltarget$/)) {
+        if ($debug) {
           $target = $fulltarget;
         }
         print "compare_dir_tree: $path should be link to $target, "
             . "not $contents.\n";
         $bogus = 1;
       }
-    }
-    else
-    {
+
+    } else {
       &error ("Bogus dirtree type: \"$dirtree{$path}\"\n", 1);
     }
   }
 
-  if ($debug)
-  {
+  if ($debug) {
     print "leftovers: (@allfiles).\n";
   }
 
-  foreach $file (@allfiles)
-  {
+  foreach my $file (@allfiles) {
     print "compare_dir_tree: $file should not exist.\n";
     $bogus = 1;
   }
@@ -1404,8 +1390,7 @@ sub compare_dir_tree
 
 sub num_suffix
 {
-  local($num) = @_;
-
+  my ($num) = @_;
   if (--$num > 0) {
     return "$extext$num";
   }
@@ -1423,7 +1408,7 @@ sub num_suffix
 
 sub get_logfile
 {
-  local($no_increment) = @_;
+  my ($no_increment) = @_;
 
   $num_of_logfiles += !$no_increment;
 
@@ -1464,7 +1449,7 @@ sub get_runfile
 
 sub get_tmpfile
 {
-  local($no_increment) = @_;
+  my ($no_increment) = @_;
 
   $num_of_tmpfiles += !$no_increment;
 
diff --git a/tests/thelp.pl b/tests/thelp.pl
new file mode 100755 (executable)
index 0000000..d8aaa66
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/env perl
+# -*-perl-*-
+#
+# This script helps us write tests in a portable way, without relying on a lot
+# of shell features.  Since we already have Perl to run the tests, use that.
+#
+# The arguments represent a set of steps that will be run one at a time.
+# Each step consists of an operator and argument.
+#
+# It supports the following operators:
+#  out <word>   : echo <word> to stdout
+#  file <word>  : echo <word> to stdout AND create the file <word>
+#  dir <word>   : echo <word> to stdout AND create the directory <word>
+#  rm <word>    : echo <word> to stdout AND delete the file/directory <word>
+#  wait <word>  : wait for a file named <word> to exist
+#  tmout <secs> : Change the timeout for waiting.  Default is 4 seconds.
+#  sleep <secs> : Sleep for <secs> seconds then echo <secs>
+#  fail <err>   : echo <err> to stdout then exit with error code err
+#
+# If given -q only the "out" command generates output.
+
+# Force flush
+$| = 1;
+
+my $quiet = 0;
+my $timeout = 4;
+
+sub op {
+    my ($op, $nm) = @_;
+
+    defined $nm or die "Missing value for $op\n";
+
+    if ($op eq 'out') {
+        print "$nm\n";
+        return 1;
+    }
+
+    # Show the output before creating the file
+    if ($op eq 'file') {
+        print "file $nm\n" unless $quiet;
+        open(my $fh, '>', $nm) or die "$nm: open: $!\n";
+        close(my $fh);
+        return 1;
+    }
+
+    # Show the output before creating the directory
+    if ($op eq 'dir') {
+        print "dir $nm\n" unless $quiet;
+        mkdir($nm) or die "$nm: mkdir: $!\n";
+        return 1;
+    }
+
+    # Show the output after removing the file
+    if ($op eq 'rm') {
+        if (-f $nm) {
+            unlink($nm) or die "$nm: unlink: $!\n";
+        } elsif (-d $nm) {
+            rmdir($nm) or die "$nm: rmdir: $!\n";
+        } else {
+            die "$nm: not file or directory: $!\n";
+        }
+        print "rm $nm\n" unless $quiet;
+        return 1;
+    }
+
+    if ($op eq 'tmout') {
+        $timeout = $nm;
+        print "tmout $nm\n" unless $quiet;
+        return 1;
+    }
+
+    # Show the output after the file exists
+    if ($op eq 'wait') {
+        my $start = time();
+        my $end = $start + $timeout;
+        while (time() <= $end) {
+            if (-f $nm) {
+                print "wait $nm\n" unless $quiet;
+                return 1;
+            }
+            select(undef, undef, undef, 0.1);
+        }
+        die "wait $nm: timeout after ".(time()-$start-1)." seconds\n";
+    }
+
+    # Show the output after sleeping
+    if ($op eq 'sleep') {
+        sleep($nm);
+        print "sleep $nm\n" unless $quiet;
+        return 1;
+    }
+
+    if ($op eq 'fail') {
+        print "fail $nm\n";
+        exit($nm);
+    }
+
+    die("Invalid command: $op $nm\n");
+}
+
+if (@ARGV && $ARGV[0] eq '-q') {
+    $quiet = 1;
+    shift;
+}
+
+while (@ARGV) {
+    if (op($ARGV[0], $ARGV[1])) {
+        shift;
+        shift;
+    }
+}
+
+exit(0);
diff --git a/variable.c b/variable.c
deleted file mode 100644 (file)
index 36ab1f4..0000000
+++ /dev/null
@@ -1,1802 +0,0 @@
-/* Internals of variables for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <assert.h>
-
-#include "filedef.h"
-#include "dep.h"
-#include "job.h"
-#include "commands.h"
-#include "variable.h"
-#include "rule.h"
-#ifdef WINDOWS32
-#include "pathstuff.h"
-#endif
-#include "hash.h"
-
-/* Incremented every time we add or remove a global variable.  */
-static unsigned long variable_changenum;
-
-/* Chain of all pattern-specific variables.  */
-
-static struct pattern_var *pattern_vars;
-
-/* Pointer to the last struct in the pack of a specific size, from 1 to 255.*/
-
-static struct pattern_var *last_pattern_vars[256];
-
-/* Create a new pattern-specific variable struct. The new variable is
-   inserted into the PATTERN_VARS list in the shortest patterns first
-   order to support the shortest stem matching (the variables are
-   matched in the reverse order so the ones with the longest pattern
-   will be considered first). Variables with the same pattern length
-   are inserted in the definition order. */
-
-struct pattern_var *
-create_pattern_var (const char *target, const char *suffix)
-{
-  register unsigned int len = strlen (target);
-  register struct pattern_var *p = xmalloc (sizeof (struct pattern_var));
-
-  if (pattern_vars != 0)
-    {
-      if (len < 256 && last_pattern_vars[len] != 0)
-        {
-          p->next = last_pattern_vars[len]->next;
-          last_pattern_vars[len]->next = p;
-        }
-      else
-        {
-          /* Find the position where we can insert this variable. */
-          register struct pattern_var **v;
-
-          for (v = &pattern_vars; ; v = &(*v)->next)
-            {
-              /* Insert at the end of the pack so that patterns with the
-                 same length appear in the order they were defined .*/
-
-              if (*v == 0 || (*v)->len > len)
-                {
-                  p->next = *v;
-                  *v = p;
-                  break;
-                }
-            }
-        }
-    }
-  else
-    {
-      pattern_vars = p;
-      p->next = 0;
-    }
-
-  p->target = target;
-  p->len = len;
-  p->suffix = suffix + 1;
-
-  if (len < 256)
-    last_pattern_vars[len] = p;
-
-  return p;
-}
-
-/* Look up a target in the pattern-specific variable list.  */
-
-static struct pattern_var *
-lookup_pattern_var (struct pattern_var *start, const char *target)
-{
-  struct pattern_var *p;
-  unsigned int targlen = strlen (target);
-
-  for (p = start ? start->next : pattern_vars; p != 0; p = p->next)
-    {
-      const char *stem;
-      unsigned int stemlen;
-
-      if (p->len > targlen)
-        /* It can't possibly match.  */
-        continue;
-
-      /* From the lengths of the filename and the pattern parts,
-         find the stem: the part of the filename that matches the %.  */
-      stem = target + (p->suffix - p->target - 1);
-      stemlen = targlen - p->len + 1;
-
-      /* Compare the text in the pattern before the stem, if any.  */
-      if (stem > target && !strneq (p->target, target, stem - target))
-        continue;
-
-      /* Compare the text in the pattern after the stem, if any.
-         We could test simply using streq, but this way we compare the
-         first two characters immediately.  This saves time in the very
-         common case where the first character matches because it is a
-         period.  */
-      if (*p->suffix == stem[stemlen]
-          && (*p->suffix == '\0' || streq (&p->suffix[1], &stem[stemlen+1])))
-        break;
-    }
-
-  return p;
-}
-\f
-/* Hash table of all global variable definitions.  */
-
-static unsigned long
-variable_hash_1 (const void *keyv)
-{
-  struct variable const *key = (struct variable const *) keyv;
-  return_STRING_N_HASH_1 (key->name, key->length);
-}
-
-static unsigned long
-variable_hash_2 (const void *keyv)
-{
-  struct variable const *key = (struct variable const *) keyv;
-  return_STRING_N_HASH_2 (key->name, key->length);
-}
-
-static int
-variable_hash_cmp (const void *xv, const void *yv)
-{
-  struct variable const *x = (struct variable const *) xv;
-  struct variable const *y = (struct variable const *) yv;
-  int result = x->length - y->length;
-  if (result)
-    return result;
-  return_STRING_N_COMPARE (x->name, y->name, x->length);
-}
-
-#ifndef VARIABLE_BUCKETS
-#define VARIABLE_BUCKETS                523
-#endif
-#ifndef PERFILE_VARIABLE_BUCKETS
-#define PERFILE_VARIABLE_BUCKETS        23
-#endif
-#ifndef SMALL_SCOPE_VARIABLE_BUCKETS
-#define SMALL_SCOPE_VARIABLE_BUCKETS    13
-#endif
-
-static struct variable_set global_variable_set;
-static struct variable_set_list global_setlist
-  = { 0, &global_variable_set, 0 };
-struct variable_set_list *current_variable_set_list = &global_setlist;
-\f
-/* Implement variables.  */
-
-void
-init_hash_global_variable_set (void)
-{
-  hash_init (&global_variable_set.table, VARIABLE_BUCKETS,
-             variable_hash_1, variable_hash_2, variable_hash_cmp);
-}
-
-/* Define variable named NAME with value VALUE in SET.  VALUE is copied.
-   LENGTH is the length of NAME, which does not need to be null-terminated.
-   ORIGIN specifies the origin of the variable (makefile, command line
-   or environment).
-   If RECURSIVE is nonzero a flag is set in the variable saying
-   that it should be recursively re-expanded.  */
-
-struct variable *
-define_variable_in_set (const char *name, unsigned int length,
-                        const char *value, enum variable_origin origin,
-                        int recursive, struct variable_set *set,
-                        const floc *flocp)
-{
-  struct variable *v;
-  struct variable **var_slot;
-  struct variable var_key;
-
-  if (set == NULL)
-    set = &global_variable_set;
-
-  var_key.name = (char *) name;
-  var_key.length = length;
-  var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
-  v = *var_slot;
-
-#ifdef VMS
-  /* VMS does not populate envp[] with DCL symbols and logical names which
-     historically are mapped to environent variables.
-     If the variable is not yet defined, then we need to check if getenv()
-     can find it.  Do not do this for origin == o_env to avoid infinte
-     recursion */
-  if (HASH_VACANT (v) && (origin != o_env))
-    {
-      struct variable * vms_variable;
-      char * vname = alloca (length + 1);
-      char * vvalue;
-
-      strncpy (vname, name, length);
-      vvalue = getenv(vname);
-
-      /* Values starting with '$' are probably foreign commands.
-         We want to treat them as Shell aliases and not look them up here */
-      if ((vvalue != NULL) && (vvalue[0] != '$'))
-        {
-          vms_variable =  lookup_variable(name, length);
-          /* Refresh the slot */
-          var_slot = (struct variable **) hash_find_slot (&set->table,
-                                                          &var_key);
-          v = *var_slot;
-        }
-    }
-#endif
-
-  if (env_overrides && origin == o_env)
-    origin = o_env_override;
-
-  if (! HASH_VACANT (v))
-    {
-      if (env_overrides && v->origin == o_env)
-        /* V came from in the environment.  Since it was defined
-           before the switches were parsed, it wasn't affected by -e.  */
-        v->origin = o_env_override;
-
-      /* A variable of this name is already defined.
-         If the old definition is from a stronger source
-         than this one, don't redefine it.  */
-      if ((int) origin >= (int) v->origin)
-        {
-          free (v->value);
-          v->value = xstrdup (value);
-          if (flocp != 0)
-            v->fileinfo = *flocp;
-          else
-            v->fileinfo.filenm = 0;
-          v->origin = origin;
-          v->recursive = recursive;
-        }
-      return v;
-    }
-
-  /* Create a new variable definition and add it to the hash table.  */
-
-  v = xmalloc (sizeof (struct variable));
-  v->name = xstrndup (name, length);
-  v->length = length;
-  hash_insert_at (&set->table, v, var_slot);
-  if (set == &global_variable_set)
-    ++variable_changenum;
-
-  v->value = xstrdup (value);
-  if (flocp != 0)
-    v->fileinfo = *flocp;
-  else
-    v->fileinfo.filenm = 0;
-  v->origin = origin;
-  v->recursive = recursive;
-  v->special = 0;
-  v->expanding = 0;
-  v->exp_count = 0;
-  v->per_target = 0;
-  v->append = 0;
-  v->private_var = 0;
-  v->export = v_default;
-
-  v->exportable = 1;
-  if (*name != '_' && (*name < 'A' || *name > 'Z')
-      && (*name < 'a' || *name > 'z'))
-    v->exportable = 0;
-  else
-    {
-      for (++name; *name != '\0'; ++name)
-        if (*name != '_' && (*name < 'a' || *name > 'z')
-            && (*name < 'A' || *name > 'Z') && !ISDIGIT(*name))
-          break;
-
-      if (*name != '\0')
-        v->exportable = 0;
-    }
-
-  return v;
-}
-\f
-
-/* Undefine variable named NAME in SET. LENGTH is the length of NAME, which
-   does not need to be null-terminated. ORIGIN specifies the origin of the
-   variable (makefile, command line or environment). */
-
-static void
-free_variable_name_and_value (const void *item)
-{
-  struct variable *v = (struct variable *) item;
-  free (v->name);
-  free (v->value);
-}
-
-void
-free_variable_set (struct variable_set_list *list)
-{
-  hash_map (&list->set->table, free_variable_name_and_value);
-  hash_free (&list->set->table, 1);
-  free (list->set);
-  free (list);
-}
-
-void
-undefine_variable_in_set (const char *name, unsigned int length,
-                          enum variable_origin origin,
-                          struct variable_set *set)
-{
-  struct variable *v;
-  struct variable **var_slot;
-  struct variable var_key;
-
-  if (set == NULL)
-    set = &global_variable_set;
-
-  var_key.name = (char *) name;
-  var_key.length = length;
-  var_slot = (struct variable **) hash_find_slot (&set->table, &var_key);
-
-  if (env_overrides && origin == o_env)
-    origin = o_env_override;
-
-  v = *var_slot;
-  if (! HASH_VACANT (v))
-    {
-      if (env_overrides && v->origin == o_env)
-        /* V came from in the environment.  Since it was defined
-           before the switches were parsed, it wasn't affected by -e.  */
-        v->origin = o_env_override;
-
-      /* Undefine only if this undefinition is from an equal or stronger
-         source than the variable definition.  */
-      if ((int) origin >= (int) v->origin)
-        {
-          hash_delete_at (&set->table, var_slot);
-          free_variable_name_and_value (v);
-          free (v);
-          if (set == &global_variable_set)
-            ++variable_changenum;
-        }
-    }
-}
-
-/* If the variable passed in is "special", handle its special nature.
-   Currently there are two such variables, both used for introspection:
-   .VARIABLES expands to a list of all the variables defined in this instance
-   of make.
-   .TARGETS expands to a list of all the targets defined in this
-   instance of make.
-   Returns the variable reference passed in.  */
-
-#define EXPANSION_INCREMENT(_l)  ((((_l) / 500) + 1) * 500)
-
-static struct variable *
-lookup_special_var (struct variable *var)
-{
-  static unsigned long last_changenum = 0;
-
-
-  /* This one actually turns out to be very hard, due to the way the parser
-     records targets.  The way it works is that target information is collected
-     internally until make knows the target is completely specified.  It unitl
-     it sees that some new construct (a new target or variable) is defined that
-     it knows the previous one is done.  In short, this means that if you do
-     this:
-
-       all:
-
-       TARGS := $(.TARGETS)
-
-     then $(TARGS) won't contain "all", because it's not until after the
-     variable is created that the previous target is completed.
-
-     Changing this would be a major pain.  I think a less complex way to do it
-     would be to pre-define the target files as soon as the first line is
-     parsed, then come back and do the rest of the definition as now.  That
-     would allow $(.TARGETS) to be correct without a major change to the way
-     the parser works.
-
-  if (streq (var->name, ".TARGETS"))
-    var->value = build_target_list (var->value);
-  else
-  */
-
-  if (variable_changenum != last_changenum && streq (var->name, ".VARIABLES"))
-    {
-      unsigned long max = EXPANSION_INCREMENT (strlen (var->value));
-      unsigned long len;
-      char *p;
-      struct variable **vp = (struct variable **) global_variable_set.table.ht_vec;
-      struct variable **end = &vp[global_variable_set.table.ht_size];
-
-      /* Make sure we have at least MAX bytes in the allocated buffer.  */
-      var->value = xrealloc (var->value, max);
-
-      /* Walk through the hash of variables, constructing a list of names.  */
-      p = var->value;
-      len = 0;
-      for (; vp < end; ++vp)
-        if (!HASH_VACANT (*vp))
-          {
-            struct variable *v = *vp;
-            int l = v->length;
-
-            len += l + 1;
-            if (len > max)
-              {
-                unsigned long off = p - var->value;
-
-                max += EXPANSION_INCREMENT (l + 1);
-                var->value = xrealloc (var->value, max);
-                p = &var->value[off];
-              }
-
-            memcpy (p, v->name, l);
-            p += l;
-            *(p++) = ' ';
-          }
-      *(p-1) = '\0';
-
-      /* Remember the current variable change number.  */
-      last_changenum = variable_changenum;
-    }
-
-  return var;
-}
-
-\f
-/* Lookup a variable whose name is a string starting at NAME
-   and with LENGTH chars.  NAME need not be null-terminated.
-   Returns address of the 'struct variable' containing all info
-   on the variable, or nil if no such variable is defined.  */
-
-struct variable *
-lookup_variable (const char *name, unsigned int length)
-{
-  const struct variable_set_list *setlist;
-  struct variable var_key;
-  int is_parent = 0;
-
-  var_key.name = (char *) name;
-  var_key.length = length;
-
-  for (setlist = current_variable_set_list;
-       setlist != 0; setlist = setlist->next)
-    {
-      const struct variable_set *set = setlist->set;
-      struct variable *v;
-
-      v = (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
-      if (v && (!is_parent || !v->private_var))
-        return v->special ? lookup_special_var (v) : v;
-
-      is_parent |= setlist->next_is_parent;
-    }
-
-#ifdef VMS
-  /* VMS does not populate envp[] with DCL symbols and logical names which
-     historically are mapped to enviroment varables and returned by getenv() */
-  {
-    char *vname = alloca (length + 1);
-    char *value;
-    strncpy (vname, name, length);
-    vname[length] = 0;
-    value = getenv (vname);
-    if (value != 0)
-      {
-        char *sptr;
-        int scnt;
-
-        sptr = value;
-        scnt = 0;
-
-        while ((sptr = strchr (sptr, '$')))
-          {
-            scnt++;
-            sptr++;
-          }
-
-        if (scnt > 0)
-          {
-            char *nvalue;
-            char *nptr;
-
-            nvalue = alloca (strlen (value) + scnt + 1);
-            sptr = value;
-            nptr = nvalue;
-
-            while (*sptr)
-              {
-                if (*sptr == '$')
-                  {
-                    *nptr++ = '$';
-                    *nptr++ = '$';
-                  }
-                else
-                  {
-                    *nptr++ = *sptr;
-                  }
-                sptr++;
-              }
-
-            *nptr = '\0';
-            return define_variable (vname, length, nvalue, o_env, 1);
-
-          }
-
-        return define_variable (vname, length, value, o_env, 1);
-      }
-  }
-#endif /* VMS */
-
-  return 0;
-}
-\f
-/* Lookup a variable whose name is a string starting at NAME
-   and with LENGTH chars in set SET.  NAME need not be null-terminated.
-   Returns address of the 'struct variable' containing all info
-   on the variable, or nil if no such variable is defined.  */
-
-struct variable *
-lookup_variable_in_set (const char *name, unsigned int length,
-                        const struct variable_set *set)
-{
-  struct variable var_key;
-
-  var_key.name = (char *) name;
-  var_key.length = length;
-
-  return (struct variable *) hash_find_item ((struct hash_table *) &set->table, &var_key);
-}
-\f
-/* Initialize FILE's variable set list.  If FILE already has a variable set
-   list, the topmost variable set is left intact, but the the rest of the
-   chain is replaced with FILE->parent's setlist.  If FILE is a double-colon
-   rule, then we will use the "root" double-colon target's variable set as the
-   parent of FILE's variable set.
-
-   If we're READING a makefile, don't do the pattern variable search now,
-   since the pattern variable might not have been defined yet.  */
-
-void
-initialize_file_variables (struct file *file, int reading)
-{
-  struct variable_set_list *l = file->variables;
-
-  if (l == 0)
-    {
-      l = (struct variable_set_list *)
-        xmalloc (sizeof (struct variable_set_list));
-      l->set = xmalloc (sizeof (struct variable_set));
-      hash_init (&l->set->table, PERFILE_VARIABLE_BUCKETS,
-                 variable_hash_1, variable_hash_2, variable_hash_cmp);
-      file->variables = l;
-    }
-
-  /* If this is a double-colon, then our "parent" is the "root" target for
-     this double-colon rule.  Since that rule has the same name, parent,
-     etc. we can just use its variables as the "next" for ours.  */
-
-  if (file->double_colon && file->double_colon != file)
-    {
-      initialize_file_variables (file->double_colon, reading);
-      l->next = file->double_colon->variables;
-      l->next_is_parent = 0;
-      return;
-    }
-
-  if (file->parent == 0)
-    l->next = &global_setlist;
-  else
-    {
-      initialize_file_variables (file->parent, reading);
-      l->next = file->parent->variables;
-    }
-  l->next_is_parent = 1;
-
-  /* If we're not reading makefiles and we haven't looked yet, see if
-     we can find pattern variables for this target.  */
-
-  if (!reading && !file->pat_searched)
-    {
-      struct pattern_var *p;
-
-      p = lookup_pattern_var (0, file->name);
-      if (p != 0)
-        {
-          struct variable_set_list *global = current_variable_set_list;
-
-          /* We found at least one.  Set up a new variable set to accumulate
-             all the pattern variables that match this target.  */
-
-          file->pat_variables = create_new_variable_set ();
-          current_variable_set_list = file->pat_variables;
-
-          do
-            {
-              /* We found one, so insert it into the set.  */
-
-              struct variable *v;
-
-              if (p->variable.flavor == f_simple)
-                {
-                  v = define_variable_loc (
-                    p->variable.name, strlen (p->variable.name),
-                    p->variable.value, p->variable.origin,
-                    0, &p->variable.fileinfo);
-
-                  v->flavor = f_simple;
-                }
-              else
-                {
-                  v = do_variable_definition (
-                    &p->variable.fileinfo, p->variable.name,
-                    p->variable.value, p->variable.origin,
-                    p->variable.flavor, 1);
-                }
-
-              /* Also mark it as a per-target and copy export status. */
-              v->per_target = p->variable.per_target;
-              v->export = p->variable.export;
-              v->private_var = p->variable.private_var;
-            }
-          while ((p = lookup_pattern_var (p, file->name)) != 0);
-
-          current_variable_set_list = global;
-        }
-      file->pat_searched = 1;
-    }
-
-  /* If we have a pattern variable match, set it up.  */
-
-  if (file->pat_variables != 0)
-    {
-      file->pat_variables->next = l->next;
-      file->pat_variables->next_is_parent = l->next_is_parent;
-      l->next = file->pat_variables;
-      l->next_is_parent = 0;
-    }
-}
-\f
-/* Pop the top set off the current variable set list,
-   and free all its storage.  */
-
-struct variable_set_list *
-create_new_variable_set (void)
-{
-  register struct variable_set_list *setlist;
-  register struct variable_set *set;
-
-  set = xmalloc (sizeof (struct variable_set));
-  hash_init (&set->table, SMALL_SCOPE_VARIABLE_BUCKETS,
-             variable_hash_1, variable_hash_2, variable_hash_cmp);
-
-  setlist = (struct variable_set_list *)
-    xmalloc (sizeof (struct variable_set_list));
-  setlist->set = set;
-  setlist->next = current_variable_set_list;
-  setlist->next_is_parent = 0;
-
-  return setlist;
-}
-
-/* Create a new variable set and push it on the current setlist.
-   If we're pushing a global scope (that is, the current scope is the global
-   scope) then we need to "push" it the other way: file variable sets point
-   directly to the global_setlist so we need to replace that with the new one.
- */
-
-struct variable_set_list *
-push_new_variable_scope (void)
-{
-  current_variable_set_list = create_new_variable_set ();
-  if (current_variable_set_list->next == &global_setlist)
-    {
-      /* It was the global, so instead of new -> &global we want to replace
-         &global with the new one and have &global -> new, with current still
-         pointing to &global  */
-      struct variable_set *set = current_variable_set_list->set;
-      current_variable_set_list->set = global_setlist.set;
-      global_setlist.set = set;
-      current_variable_set_list->next = global_setlist.next;
-      global_setlist.next = current_variable_set_list;
-      current_variable_set_list = &global_setlist;
-    }
-  return (current_variable_set_list);
-}
-
-void
-pop_variable_scope (void)
-{
-  struct variable_set_list *setlist;
-  struct variable_set *set;
-
-  /* Can't call this if there's no scope to pop!  */
-  assert (current_variable_set_list->next != NULL);
-
-  if (current_variable_set_list != &global_setlist)
-    {
-      /* We're not pointing to the global setlist, so pop this one.  */
-      setlist = current_variable_set_list;
-      set = setlist->set;
-      current_variable_set_list = setlist->next;
-    }
-  else
-    {
-      /* This set is the one in the global_setlist, but there is another global
-         set beyond that.  We want to copy that set to global_setlist, then
-         delete what used to be in global_setlist.  */
-      setlist = global_setlist.next;
-      set = global_setlist.set;
-      global_setlist.set = setlist->set;
-      global_setlist.next = setlist->next;
-      global_setlist.next_is_parent = setlist->next_is_parent;
-    }
-
-  /* Free the one we no longer need.  */
-  free (setlist);
-  hash_map (&set->table, free_variable_name_and_value);
-  hash_free (&set->table, 1);
-  free (set);
-}
-\f
-/* Merge FROM_SET into TO_SET, freeing unused storage in FROM_SET.  */
-
-static void
-merge_variable_sets (struct variable_set *to_set,
-                     struct variable_set *from_set)
-{
-  struct variable **from_var_slot = (struct variable **) from_set->table.ht_vec;
-  struct variable **from_var_end = from_var_slot + from_set->table.ht_size;
-
-  int inc = to_set == &global_variable_set ? 1 : 0;
-
-  for ( ; from_var_slot < from_var_end; from_var_slot++)
-    if (! HASH_VACANT (*from_var_slot))
-      {
-        struct variable *from_var = *from_var_slot;
-        struct variable **to_var_slot
-          = (struct variable **) hash_find_slot (&to_set->table, *from_var_slot);
-        if (HASH_VACANT (*to_var_slot))
-          {
-            hash_insert_at (&to_set->table, from_var, to_var_slot);
-            variable_changenum += inc;
-          }
-        else
-          {
-            /* GKM FIXME: delete in from_set->table */
-            free (from_var->value);
-            free (from_var);
-          }
-      }
-}
-
-/* Merge SETLIST1 into SETLIST0, freeing unused storage in SETLIST1.  */
-
-void
-merge_variable_set_lists (struct variable_set_list **setlist0,
-                          struct variable_set_list *setlist1)
-{
-  struct variable_set_list *to = *setlist0;
-  struct variable_set_list *last0 = 0;
-
-  /* If there's nothing to merge, stop now.  */
-  if (!setlist1)
-    return;
-
-  /* This loop relies on the fact that all setlists terminate with the global
-     setlist (before NULL).  If that's not true, arguably we SHOULD die.  */
-  if (to)
-    while (setlist1 != &global_setlist && to != &global_setlist)
-      {
-        struct variable_set_list *from = setlist1;
-        setlist1 = setlist1->next;
-
-        merge_variable_sets (to->set, from->set);
-
-        last0 = to;
-        to = to->next;
-      }
-
-  if (setlist1 != &global_setlist)
-    {
-      if (last0 == 0)
-        *setlist0 = setlist1;
-      else
-        last0->next = setlist1;
-    }
-}
-\f
-/* Define the automatic variables, and record the addresses
-   of their structures so we can change their values quickly.  */
-
-void
-define_automatic_variables (void)
-{
-  struct variable *v;
-  char buf[200];
-
-  sprintf (buf, "%u", makelevel);
-  define_variable_cname (MAKELEVEL_NAME, buf, o_env, 0);
-
-  sprintf (buf, "%s%s%s",
-           version_string,
-           (remote_description == 0 || remote_description[0] == '\0')
-           ? "" : "-",
-           (remote_description == 0 || remote_description[0] == '\0')
-           ? "" : remote_description);
-  define_variable_cname ("MAKE_VERSION", buf, o_default, 0);
-  define_variable_cname ("MAKE_HOST", make_host, o_default, 0);
-
-#ifdef  __MSDOS__
-  /* Allow to specify a special shell just for Make,
-     and use $COMSPEC as the default $SHELL when appropriate.  */
-  {
-    static char shell_str[] = "SHELL";
-    const int shlen = sizeof (shell_str) - 1;
-    struct variable *mshp = lookup_variable ("MAKESHELL", 9);
-    struct variable *comp = lookup_variable ("COMSPEC", 7);
-
-    /* $(MAKESHELL) overrides $(SHELL) even if -e is in effect.  */
-    if (mshp)
-      (void) define_variable (shell_str, shlen,
-                              mshp->value, o_env_override, 0);
-    else if (comp)
-      {
-        /* $(COMSPEC) shouldn't override $(SHELL).  */
-        struct variable *shp = lookup_variable (shell_str, shlen);
-
-        if (!shp)
-          (void) define_variable (shell_str, shlen, comp->value, o_env, 0);
-      }
-  }
-#elif defined(__EMX__)
-  {
-    static char shell_str[] = "SHELL";
-    const int shlen = sizeof (shell_str) - 1;
-    struct variable *shell = lookup_variable (shell_str, shlen);
-    struct variable *replace = lookup_variable ("MAKESHELL", 9);
-
-    /* if $MAKESHELL is defined in the environment assume o_env_override */
-    if (replace && *replace->value && replace->origin == o_env)
-      replace->origin = o_env_override;
-
-    /* if $MAKESHELL is not defined use $SHELL but only if the variable
-       did not come from the environment */
-    if (!replace || !*replace->value)
-      if (shell && *shell->value && (shell->origin == o_env
-          || shell->origin == o_env_override))
-        {
-          /* overwrite whatever we got from the environment */
-          free (shell->value);
-          shell->value = xstrdup (default_shell);
-          shell->origin = o_default;
-        }
-
-    /* Some people do not like cmd to be used as the default
-       if $SHELL is not defined in the Makefile.
-       With -DNO_CMD_DEFAULT you can turn off this behaviour */
-# ifndef NO_CMD_DEFAULT
-    /* otherwise use $COMSPEC */
-    if (!replace || !*replace->value)
-      replace = lookup_variable ("COMSPEC", 7);
-
-    /* otherwise use $OS2_SHELL */
-    if (!replace || !*replace->value)
-      replace = lookup_variable ("OS2_SHELL", 9);
-# else
-#   warning NO_CMD_DEFAULT: GNU make will not use CMD.EXE as default shell
-# endif
-
-    if (replace && *replace->value)
-      /* overwrite $SHELL */
-      (void) define_variable (shell_str, shlen, replace->value,
-                              replace->origin, 0);
-    else
-      /* provide a definition if there is none */
-      (void) define_variable (shell_str, shlen, default_shell,
-                              o_default, 0);
-  }
-
-#endif
-
-  /* This won't override any definition, but it will provide one if there
-     isn't one there.  */
-  v = define_variable_cname ("SHELL", default_shell, o_default, 0);
-#ifdef __MSDOS__
-  v->export = v_export;  /*  Export always SHELL.  */
-#endif
-
-  /* On MSDOS we do use SHELL from environment, since it isn't a standard
-     environment variable on MSDOS, so whoever sets it, does that on purpose.
-     On OS/2 we do not use SHELL from environment but we have already handled
-     that problem above. */
-#if !defined(__MSDOS__) && !defined(__EMX__)
-  /* Don't let SHELL come from the environment.  */
-  if (*v->value == '\0' || v->origin == o_env || v->origin == o_env_override)
-    {
-      free (v->value);
-      v->origin = o_file;
-      v->value = xstrdup (default_shell);
-    }
-#endif
-
-  /* Make sure MAKEFILES gets exported if it is set.  */
-  v = define_variable_cname ("MAKEFILES", "", o_default, 0);
-  v->export = v_ifset;
-
-  /* Define the magic D and F variables in terms of
-     the automatic variables they are variations of.  */
-
-#if defined(__MSDOS__) || defined(WINDOWS32)
-  /* For consistency, remove the trailing backslash as well as slash.  */
-  define_variable_cname ("@D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $@)))",
-                         o_automatic, 1);
-  define_variable_cname ("%D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $%)))",
-                         o_automatic, 1);
-  define_variable_cname ("*D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $*)))",
-                         o_automatic, 1);
-  define_variable_cname ("<D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $<)))",
-                         o_automatic, 1);
-  define_variable_cname ("?D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $?)))",
-                         o_automatic, 1);
-  define_variable_cname ("^D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $^)))",
-                         o_automatic, 1);
-  define_variable_cname ("+D", "$(patsubst %/,%,$(patsubst %\\,%,$(dir $+)))",
-                         o_automatic, 1);
-#else  /* not __MSDOS__, not WINDOWS32 */
-  define_variable_cname ("@D", "$(patsubst %/,%,$(dir $@))", o_automatic, 1);
-  define_variable_cname ("%D", "$(patsubst %/,%,$(dir $%))", o_automatic, 1);
-  define_variable_cname ("*D", "$(patsubst %/,%,$(dir $*))", o_automatic, 1);
-  define_variable_cname ("<D", "$(patsubst %/,%,$(dir $<))", o_automatic, 1);
-  define_variable_cname ("?D", "$(patsubst %/,%,$(dir $?))", o_automatic, 1);
-  define_variable_cname ("^D", "$(patsubst %/,%,$(dir $^))", o_automatic, 1);
-  define_variable_cname ("+D", "$(patsubst %/,%,$(dir $+))", o_automatic, 1);
-#endif
-  define_variable_cname ("@F", "$(notdir $@)", o_automatic, 1);
-  define_variable_cname ("%F", "$(notdir $%)", o_automatic, 1);
-  define_variable_cname ("*F", "$(notdir $*)", o_automatic, 1);
-  define_variable_cname ("<F", "$(notdir $<)", o_automatic, 1);
-  define_variable_cname ("?F", "$(notdir $?)", o_automatic, 1);
-  define_variable_cname ("^F", "$(notdir $^)", o_automatic, 1);
-  define_variable_cname ("+F", "$(notdir $+)", o_automatic, 1);
-}
-\f
-int export_all_variables;
-
-/* Create a new environment for FILE's commands.
-   If FILE is nil, this is for the 'shell' function.
-   The child's MAKELEVEL variable is incremented.  */
-
-char **
-target_environment (struct file *file)
-{
-  struct variable_set_list *set_list;
-  register struct variable_set_list *s;
-  struct hash_table table;
-  struct variable **v_slot;
-  struct variable **v_end;
-  struct variable makelevel_key;
-  char **result_0;
-  char **result;
-
-  if (file == 0)
-    set_list = current_variable_set_list;
-  else
-    set_list = file->variables;
-
-  hash_init (&table, VARIABLE_BUCKETS,
-             variable_hash_1, variable_hash_2, variable_hash_cmp);
-
-  /* Run through all the variable sets in the list,
-     accumulating variables in TABLE.  */
-  for (s = set_list; s != 0; s = s->next)
-    {
-      struct variable_set *set = s->set;
-      v_slot = (struct variable **) set->table.ht_vec;
-      v_end = v_slot + set->table.ht_size;
-      for ( ; v_slot < v_end; v_slot++)
-        if (! HASH_VACANT (*v_slot))
-          {
-            struct variable **new_slot;
-            struct variable *v = *v_slot;
-
-            /* If this is a per-target variable and it hasn't been touched
-               already then look up the global version and take its export
-               value.  */
-            if (v->per_target && v->export == v_default)
-              {
-                struct variable *gv;
-
-                gv = lookup_variable_in_set (v->name, strlen (v->name),
-                                             &global_variable_set);
-                if (gv)
-                  v->export = gv->export;
-              }
-
-            switch (v->export)
-              {
-              case v_default:
-                if (v->origin == o_default || v->origin == o_automatic)
-                  /* Only export default variables by explicit request.  */
-                  continue;
-
-                /* The variable doesn't have a name that can be exported.  */
-                if (! v->exportable)
-                  continue;
-
-                if (! export_all_variables
-                    && v->origin != o_command
-                    && v->origin != o_env && v->origin != o_env_override)
-                  continue;
-                break;
-
-              case v_export:
-                break;
-
-              case v_noexport:
-                {
-                  /* If this is the SHELL variable and it's not exported,
-                     then add the value from our original environment, if
-                     the original environment defined a value for SHELL.  */
-                  if (streq (v->name, "SHELL") && shell_var.value)
-                    {
-                      v = &shell_var;
-                      break;
-                    }
-                  continue;
-                }
-
-              case v_ifset:
-                if (v->origin == o_default)
-                  continue;
-                break;
-              }
-
-            new_slot = (struct variable **) hash_find_slot (&table, v);
-            if (HASH_VACANT (*new_slot))
-              hash_insert_at (&table, v, new_slot);
-          }
-    }
-
-  makelevel_key.name = (char *)MAKELEVEL_NAME;
-  makelevel_key.length = MAKELEVEL_LENGTH;
-  hash_delete (&table, &makelevel_key);
-
-  result = result_0 = xmalloc ((table.ht_fill + 2) * sizeof (char *));
-
-  v_slot = (struct variable **) table.ht_vec;
-  v_end = v_slot + table.ht_size;
-  for ( ; v_slot < v_end; v_slot++)
-    if (! HASH_VACANT (*v_slot))
-      {
-        struct variable *v = *v_slot;
-
-        /* If V is recursively expanded and didn't come from the environment,
-           expand its value.  If it came from the environment, it should
-           go back into the environment unchanged.  */
-        if (v->recursive
-            && v->origin != o_env && v->origin != o_env_override)
-          {
-            char *value = recursively_expand_for_file (v, file);
-#ifdef WINDOWS32
-            if (strcmp (v->name, "Path") == 0 ||
-                strcmp (v->name, "PATH") == 0)
-              convert_Path_to_windows32 (value, ';');
-#endif
-            *result++ = xstrdup (concat (3, v->name, "=", value));
-            free (value);
-          }
-        else
-          {
-#ifdef WINDOWS32
-            if (strcmp (v->name, "Path") == 0 ||
-                strcmp (v->name, "PATH") == 0)
-              convert_Path_to_windows32 (v->value, ';');
-#endif
-            *result++ = xstrdup (concat (3, v->name, "=", v->value));
-          }
-      }
-
-  *result = xmalloc (100);
-  sprintf (*result, "%s=%u", MAKELEVEL_NAME, makelevel + 1);
-  *++result = 0;
-
-  hash_free (&table, 0);
-
-  return result_0;
-}
-\f
-static struct variable *
-set_special_var (struct variable *var)
-{
-  if (streq (var->name, RECIPEPREFIX_NAME))
-    {
-      /* The user is resetting the command introduction prefix.  This has to
-         happen immediately, so that subsequent rules are interpreted
-         properly.  */
-      cmd_prefix = var->value[0]=='\0' ? RECIPEPREFIX_DEFAULT : var->value[0];
-    }
-
-  return var;
-}
-\f
-/* Given a string, shell-execute it and return a malloc'ed string of the
- * result. This removes only ONE newline (if any) at the end, for maximum
- * compatibility with the *BSD makes.  If it fails, returns NULL. */
-
-static char *
-shell_result (const char *p)
-{
-  char *buf;
-  unsigned int len;
-  char *args[2];
-  char *result;
-
-  install_variable_buffer (&buf, &len);
-
-  args[0] = (char *) p;
-  args[1] = NULL;
-  variable_buffer_output (func_shell_base (variable_buffer, args, 0), "\0", 1);
-  result = strdup (variable_buffer);
-
-  restore_variable_buffer (buf, len);
-  return result;
-}
-\f
-/* Given a variable, a value, and a flavor, define the variable.
-   See the try_variable_definition() function for details on the parameters. */
-
-struct variable *
-do_variable_definition (const floc *flocp, const char *varname,
-                        const char *value, enum variable_origin origin,
-                        enum variable_flavor flavor, int target_var)
-{
-  const char *p;
-  char *alloc_value = NULL;
-  struct variable *v;
-  int append = 0;
-  int conditional = 0;
-
-  /* Calculate the variable's new value in VALUE.  */
-
-  switch (flavor)
-    {
-    default:
-    case f_bogus:
-      /* Should not be possible.  */
-      abort ();
-    case f_simple:
-      /* A simple variable definition "var := value".  Expand the value.
-         We have to allocate memory since otherwise it'll clobber the
-         variable buffer, and we may still need that if we're looking at a
-         target-specific variable.  */
-      p = alloc_value = allocated_variable_expand (value);
-      break;
-    case f_shell:
-      {
-        /* A shell definition "var != value".  Expand value, pass it to
-           the shell, and store the result in recursively-expanded var. */
-        char *q = allocated_variable_expand (value);
-        p = alloc_value = shell_result (q);
-        free (q);
-        flavor = f_recursive;
-        break;
-      }
-    case f_conditional:
-      /* A conditional variable definition "var ?= value".
-         The value is set IFF the variable is not defined yet. */
-      v = lookup_variable (varname, strlen (varname));
-      if (v)
-        return v->special ? set_special_var (v) : v;
-
-      conditional = 1;
-      flavor = f_recursive;
-      /* FALLTHROUGH */
-    case f_recursive:
-      /* A recursive variable definition "var = value".
-         The value is used verbatim.  */
-      p = value;
-      break;
-    case f_append:
-      {
-        /* If we have += but we're in a target variable context, we want to
-           append only with other variables in the context of this target.  */
-        if (target_var)
-          {
-            append = 1;
-            v = lookup_variable_in_set (varname, strlen (varname),
-                                        current_variable_set_list->set);
-
-            /* Don't append from the global set if a previous non-appending
-               target-specific variable definition exists. */
-            if (v && !v->append)
-              append = 0;
-          }
-        else
-          v = lookup_variable (varname, strlen (varname));
-
-        if (v == 0)
-          {
-            /* There was no old value.
-               This becomes a normal recursive definition.  */
-            p = value;
-            flavor = f_recursive;
-          }
-        else
-          {
-            /* Paste the old and new values together in VALUE.  */
-
-            unsigned int oldlen, vallen;
-            const char *val;
-            char *tp = NULL;
-
-            val = value;
-            if (v->recursive)
-              /* The previous definition of the variable was recursive.
-                 The new value is the unexpanded old and new values. */
-              flavor = f_recursive;
-            else
-              /* The previous definition of the variable was simple.
-                 The new value comes from the old value, which was expanded
-                 when it was set; and from the expanded new value.  Allocate
-                 memory for the expansion as we may still need the rest of the
-                 buffer if we're looking at a target-specific variable.  */
-              val = tp = allocated_variable_expand (val);
-
-            oldlen = strlen (v->value);
-            vallen = strlen (val);
-            p = alloc_value = xmalloc (oldlen + 1 + vallen + 1);
-            memcpy (alloc_value, v->value, oldlen);
-            alloc_value[oldlen] = ' ';
-            memcpy (&alloc_value[oldlen + 1], val, vallen + 1);
-
-            free (tp);
-          }
-      }
-    }
-
-#ifdef __MSDOS__
-  /* Many Unix Makefiles include a line saying "SHELL=/bin/sh", but
-     non-Unix systems don't conform to this default configuration (in
-     fact, most of them don't even have '/bin').  On the other hand,
-     $SHELL in the environment, if set, points to the real pathname of
-     the shell.
-     Therefore, we generally won't let lines like "SHELL=/bin/sh" from
-     the Makefile override $SHELL from the environment.  But first, we
-     look for the basename of the shell in the directory where SHELL=
-     points, and along the $PATH; if it is found in any of these places,
-     we define $SHELL to be the actual pathname of the shell.  Thus, if
-     you have bash.exe installed as d:/unix/bash.exe, and d:/unix is on
-     your $PATH, then SHELL=/usr/local/bin/bash will have the effect of
-     defining SHELL to be "d:/unix/bash.exe".  */
-  if ((origin == o_file || origin == o_override)
-      && strcmp (varname, "SHELL") == 0)
-    {
-      PATH_VAR (shellpath);
-      extern char * __dosexec_find_on_path (const char *, char *[], char *);
-
-      /* See if we can find "/bin/sh.exe", "/bin/sh.com", etc.  */
-      if (__dosexec_find_on_path (p, NULL, shellpath))
-        {
-          char *tp;
-
-          for (tp = shellpath; *tp; tp++)
-            if (*tp == '\\')
-              *tp = '/';
-
-          v = define_variable_loc (varname, strlen (varname),
-                                   shellpath, origin, flavor == f_recursive,
-                                   flocp);
-        }
-      else
-        {
-          const char *shellbase, *bslash;
-          struct variable *pathv = lookup_variable ("PATH", 4);
-          char *path_string;
-          char *fake_env[2];
-          size_t pathlen = 0;
-
-          shellbase = strrchr (p, '/');
-          bslash = strrchr (p, '\\');
-          if (!shellbase || bslash > shellbase)
-            shellbase = bslash;
-          if (!shellbase && p[1] == ':')
-            shellbase = p + 1;
-          if (shellbase)
-            shellbase++;
-          else
-            shellbase = p;
-
-          /* Search for the basename of the shell (with standard
-             executable extensions) along the $PATH.  */
-          if (pathv)
-            pathlen = strlen (pathv->value);
-          path_string = xmalloc (5 + pathlen + 2 + 1);
-          /* On MSDOS, current directory is considered as part of $PATH.  */
-          sprintf (path_string, "PATH=.;%s", pathv ? pathv->value : "");
-          fake_env[0] = path_string;
-          fake_env[1] = 0;
-          if (__dosexec_find_on_path (shellbase, fake_env, shellpath))
-            {
-              char *tp;
-
-              for (tp = shellpath; *tp; tp++)
-                if (*tp == '\\')
-                  *tp = '/';
-
-              v = define_variable_loc (varname, strlen (varname),
-                                       shellpath, origin,
-                                       flavor == f_recursive, flocp);
-            }
-          else
-            v = lookup_variable (varname, strlen (varname));
-
-          free (path_string);
-        }
-    }
-  else
-#endif /* __MSDOS__ */
-#ifdef WINDOWS32
-  if ((origin == o_file || origin == o_override || origin == o_command)
-      && streq (varname, "SHELL"))
-    {
-      extern const char *default_shell;
-
-      /* Call shell locator function. If it returns TRUE, then
-         set no_default_sh_exe to indicate sh was found and
-         set new value for SHELL variable.  */
-
-      if (find_and_set_default_shell (p))
-        {
-          v = define_variable_in_set (varname, strlen (varname), default_shell,
-                                      origin, flavor == f_recursive,
-                                      (target_var
-                                       ? current_variable_set_list->set
-                                       : NULL),
-                                      flocp);
-          no_default_sh_exe = 0;
-        }
-      else
-        {
-          char *tp = alloc_value;
-
-          alloc_value = allocated_variable_expand (p);
-
-          if (find_and_set_default_shell (alloc_value))
-            {
-              v = define_variable_in_set (varname, strlen (varname), p,
-                                          origin, flavor == f_recursive,
-                                          (target_var
-                                           ? current_variable_set_list->set
-                                           : NULL),
-                                          flocp);
-              no_default_sh_exe = 0;
-            }
-          else
-            v = lookup_variable (varname, strlen (varname));
-
-          free (tp);
-        }
-    }
-  else
-#endif
-
-  /* If we are defining variables inside an $(eval ...), we might have a
-     different variable context pushed, not the global context (maybe we're
-     inside a $(call ...) or something.  Since this function is only ever
-     invoked in places where we want to define globally visible variables,
-     make sure we define this variable in the global set.  */
-
-  v = define_variable_in_set (varname, strlen (varname), p,
-                              origin, flavor == f_recursive,
-                              (target_var
-                               ? current_variable_set_list->set : NULL),
-                              flocp);
-  v->append = append;
-  v->conditional = conditional;
-
-  free (alloc_value);
-
-  return v->special ? set_special_var (v) : v;
-}
-\f
-/* Parse P (a null-terminated string) as a variable definition.
-
-   If it is not a variable definition, return NULL and the contents of *VAR
-   are undefined, except NAME is set to the first non-space character or NIL.
-
-   If it is a variable definition, return a pointer to the char after the
-   assignment token and set the following fields (only) of *VAR:
-    name   : name of the variable (ALWAYS SET) (NOT NUL-TERMINATED!)
-    length : length of the variable name
-    value  : value of the variable (nul-terminated)
-    flavor : flavor of the variable
-   Other values in *VAR are unchanged.
-  */
-
-char *
-parse_variable_definition (const char *p, struct variable *var)
-{
-  int wspace = 0;
-  const char *e = NULL;
-
-  NEXT_TOKEN (p);
-  var->name = (char *)p;
-  var->length = 0;
-
-  while (1)
-    {
-      int c = *p++;
-
-      /* If we find a comment or EOS, it's not a variable definition.  */
-      if (STOP_SET (c, MAP_COMMENT|MAP_NUL))
-        return NULL;
-
-      if (c == '$')
-        {
-          /* This begins a variable expansion reference.  Make sure we don't
-             treat chars inside the reference as assignment tokens.  */
-          char closeparen;
-          unsigned int count;
-
-          c = *p++;
-          if (c == '(')
-            closeparen = ')';
-          else if (c == '{')
-            closeparen = '}';
-          else if (c == '\0')
-            return NULL;
-          else
-            /* '$$' or '$X'.  Either way, nothing special to do here.  */
-            continue;
-
-          /* P now points past the opening paren or brace.
-             Count parens or braces until it is matched.  */
-          for (count = 1; *p != '\0'; ++p)
-            {
-              if (*p == closeparen && --count == 0)
-                {
-                  ++p;
-                  break;
-                }
-              if (*p == c)
-                ++count;
-            }
-          continue;
-        }
-
-      /* If we find whitespace skip it, and remember we found it.  */
-      if (ISBLANK (c))
-        {
-          wspace = 1;
-          e = p - 1;
-          NEXT_TOKEN (p);
-          c = *p;
-          if (c == '\0')
-            return NULL;
-          ++p;
-        }
-
-
-      if (c == '=')
-        {
-          var->flavor = f_recursive;
-          if (! e)
-            e = p - 1;
-          break;
-        }
-
-      /* Match assignment variants (:=, +=, ?=, !=)  */
-      if (*p == '=')
-        {
-          switch (c)
-            {
-              case ':':
-                var->flavor = f_simple;
-                break;
-              case '+':
-                var->flavor = f_append;
-                break;
-              case '?':
-                var->flavor = f_conditional;
-                break;
-              case '!':
-                var->flavor = f_shell;
-                break;
-              default:
-                /* If we skipped whitespace, non-assignments means no var.  */
-                if (wspace)
-                  return NULL;
-
-                /* Might be assignment, or might be $= or #=.  Check.  */
-                continue;
-            }
-          if (! e)
-            e = p - 1;
-          ++p;
-          break;
-        }
-
-      /* Check for POSIX ::= syntax  */
-      if (c == ':')
-        {
-          /* A colon other than :=/::= is not a variable defn.  */
-          if (*p != ':' || p[1] != '=')
-            return NULL;
-
-          /* POSIX allows ::= to be the same as GNU make's := */
-          var->flavor = f_simple;
-          if (! e)
-            e = p - 1;
-          p += 2;
-          break;
-        }
-
-      /* If we skipped whitespace, non-assignments means no var.  */
-      if (wspace)
-        return NULL;
-    }
-
-  var->length = e - var->name;
-  var->value = next_token (p);
-  return (char *)p;
-}
-\f
-/* Try to interpret LINE (a null-terminated string) as a variable definition.
-
-   If LINE was recognized as a variable definition, a pointer to its 'struct
-   variable' is returned.  If LINE is not a variable definition, NULL is
-   returned.  */
-
-struct variable *
-assign_variable_definition (struct variable *v, const char *line)
-{
-  char *name;
-
-  if (!parse_variable_definition (line, v))
-    return NULL;
-
-  /* Expand the name, so "$(foo)bar = baz" works.  */
-  name = alloca (v->length + 1);
-  memcpy (name, v->name, v->length);
-  name[v->length] = '\0';
-  v->name = allocated_variable_expand (name);
-
-  if (v->name[0] == '\0')
-    O (fatal, &v->fileinfo, _("empty variable name"));
-
-  return v;
-}
-\f
-/* Try to interpret LINE (a null-terminated string) as a variable definition.
-
-   ORIGIN may be o_file, o_override, o_env, o_env_override,
-   or o_command specifying that the variable definition comes
-   from a makefile, an override directive, the environment with
-   or without the -e switch, or the command line.
-
-   See the comments for assign_variable_definition().
-
-   If LINE was recognized as a variable definition, a pointer to its 'struct
-   variable' is returned.  If LINE is not a variable definition, NULL is
-   returned.  */
-
-struct variable *
-try_variable_definition (const floc *flocp, const char *line,
-                         enum variable_origin origin, int target_var)
-{
-  struct variable v;
-  struct variable *vp;
-
-  if (flocp != 0)
-    v.fileinfo = *flocp;
-  else
-    v.fileinfo.filenm = 0;
-
-  if (!assign_variable_definition (&v, line))
-    return 0;
-
-  vp = do_variable_definition (flocp, v.name, v.value,
-                               origin, v.flavor, target_var);
-
-  free (v.name);
-
-  return vp;
-}
-\f
-/* Print information for variable V, prefixing it with PREFIX.  */
-
-static void
-print_variable (const void *item, void *arg)
-{
-  const struct variable *v = item;
-  const char *prefix = arg;
-  const char *origin;
-
-  switch (v->origin)
-    {
-    case o_automatic:
-      origin = _("automatic");
-      break;
-    case o_default:
-      origin = _("default");
-      break;
-    case o_env:
-      origin = _("environment");
-      break;
-    case o_file:
-      origin = _("makefile");
-      break;
-    case o_env_override:
-      origin = _("environment under -e");
-      break;
-    case o_command:
-      origin = _("command line");
-      break;
-    case o_override:
-      origin = _("'override' directive");
-      break;
-    case o_invalid:
-    default:
-      abort ();
-    }
-  fputs ("# ", stdout);
-  fputs (origin, stdout);
-  if (v->private_var)
-    fputs (" private", stdout);
-  if (v->fileinfo.filenm)
-    printf (_(" (from '%s', line %lu)"),
-            v->fileinfo.filenm, v->fileinfo.lineno + v->fileinfo.offset);
-  putchar ('\n');
-  fputs (prefix, stdout);
-
-  /* Is this a 'define'?  */
-  if (v->recursive && strchr (v->value, '\n') != 0)
-    printf ("define %s\n%s\nendef\n", v->name, v->value);
-  else
-    {
-      char *p;
-
-      printf ("%s %s= ", v->name, v->recursive ? v->append ? "+" : "" : ":");
-
-      /* Check if the value is just whitespace.  */
-      p = next_token (v->value);
-      if (p != v->value && *p == '\0')
-        /* All whitespace.  */
-        printf ("$(subst ,,%s)", v->value);
-      else if (v->recursive)
-        fputs (v->value, stdout);
-      else
-        /* Double up dollar signs.  */
-        for (p = v->value; *p != '\0'; ++p)
-          {
-            if (*p == '$')
-              putchar ('$');
-            putchar (*p);
-          }
-      putchar ('\n');
-    }
-}
-
-
-static void
-print_auto_variable (const void *item, void *arg)
-{
-  const struct variable *v = item;
-
-  if (v->origin == o_automatic)
-    print_variable (item, arg);
-}
-
-
-static void
-print_noauto_variable (const void *item, void *arg)
-{
-  const struct variable *v = item;
-
-  if (v->origin != o_automatic)
-    print_variable (item, arg);
-}
-
-
-/* Print all the variables in SET.  PREFIX is printed before
-   the actual variable definitions (everything else is comments).  */
-
-static void
-print_variable_set (struct variable_set *set, const char *prefix, int pauto)
-{
-  hash_map_arg (&set->table, (pauto ? print_auto_variable : print_variable),
-                (void *)prefix);
-
-  fputs (_("# variable set hash-table stats:\n"), stdout);
-  fputs ("# ", stdout);
-  hash_print_stats (&set->table, stdout);
-  putc ('\n', stdout);
-}
-
-/* Print the data base of variables.  */
-
-void
-print_variable_data_base (void)
-{
-  puts (_("\n# Variables\n"));
-
-  print_variable_set (&global_variable_set, "", 0);
-
-  puts (_("\n# Pattern-specific Variable Values"));
-
-  {
-    struct pattern_var *p;
-    unsigned int rules = 0;
-
-    for (p = pattern_vars; p != 0; p = p->next)
-      {
-        ++rules;
-        printf ("\n%s :\n", p->target);
-        print_variable (&p->variable, (void *)"# ");
-      }
-
-    if (rules == 0)
-      puts (_("\n# No pattern-specific variable values."));
-    else
-      printf (_("\n# %u pattern-specific variable values"), rules);
-  }
-}
-
-
-/* Print all the local variables of FILE.  */
-
-void
-print_file_variables (const struct file *file)
-{
-  if (file->variables != 0)
-    print_variable_set (file->variables->set, "# ", 1);
-}
-
-void
-print_target_variables (const struct file *file)
-{
-  if (file->variables != 0)
-    {
-      int l = strlen (file->name);
-      char *t = alloca (l + 3);
-
-      strcpy (t, file->name);
-      t[l] = ':';
-      t[l+1] = ' ';
-      t[l+2] = '\0';
-
-      hash_map_arg (&file->variables->set->table, print_noauto_variable, t);
-    }
-}
-
-#ifdef WINDOWS32
-void
-sync_Path_environment (void)
-{
-  char *path = allocated_variable_expand ("$(PATH)");
-  static char *environ_path = NULL;
-
-  if (!path)
-    return;
-
-  /* If done this before, free the previous entry before allocating new one.  */
-  free (environ_path);
-
-  /* Create something WINDOWS32 world can grok.  */
-  convert_Path_to_windows32 (path, ';');
-  environ_path = xstrdup (concat (3, "PATH", "=", path));
-  putenv (environ_path);
-  free (path);
-}
-#endif
diff --git a/variable.h b/variable.h
deleted file mode 100644 (file)
index fe1d609..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/* Definitions for using variables in GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "hash.h"
-
-/* Codes in a variable definition saying where the definition came from.
-   Increasing numeric values signify less-overridable definitions.  */
-enum variable_origin
-  {
-    o_default,          /* Variable from the default set.  */
-    o_env,              /* Variable from environment.  */
-    o_file,             /* Variable given in a makefile.  */
-    o_env_override,     /* Variable from environment, if -e.  */
-    o_command,          /* Variable given by user.  */
-    o_override,         /* Variable from an 'override' directive.  */
-    o_automatic,        /* Automatic variable -- cannot be set.  */
-    o_invalid           /* Core dump time.  */
-  };
-
-enum variable_flavor
-  {
-    f_bogus,            /* Bogus (error) */
-    f_simple,           /* Simple definition (:= or ::=) */
-    f_recursive,        /* Recursive definition (=) */
-    f_append,           /* Appending definition (+=) */
-    f_conditional,      /* Conditional definition (?=) */
-    f_shell             /* Shell assignment (!=) */
-  };
-
-/* Structure that represents one variable definition.
-   Each bucket of the hash table is a chain of these,
-   chained through 'next'.  */
-
-#define EXP_COUNT_BITS  15      /* This gets all the bitfields into 32 bits */
-#define EXP_COUNT_MAX   ((1<<EXP_COUNT_BITS)-1)
-
-struct variable
-  {
-    char *name;                 /* Variable name.  */
-    char *value;                /* Variable value.  */
-    floc fileinfo;              /* Where the variable was defined.  */
-    int length;                 /* strlen (name) */
-    unsigned int recursive:1;   /* Gets recursively re-evaluated.  */
-    unsigned int append:1;      /* Nonzero if an appending target-specific
-                                   variable.  */
-    unsigned int conditional:1; /* Nonzero if set with a ?=. */
-    unsigned int per_target:1;  /* Nonzero if a target-specific variable.  */
-    unsigned int special:1;     /* Nonzero if this is a special variable.  */
-    unsigned int exportable:1;  /* Nonzero if the variable _could_ be
-                                   exported.  */
-    unsigned int expanding:1;   /* Nonzero if currently being expanded.  */
-    unsigned int private_var:1; /* Nonzero avoids inheritance of this
-                                   target-specific variable.  */
-    unsigned int exp_count:EXP_COUNT_BITS;
-                                /* If >1, allow this many self-referential
-                                   expansions.  */
-    enum variable_flavor
-      flavor ENUM_BITFIELD (3); /* Variable flavor.  */
-    enum variable_origin
-      origin ENUM_BITFIELD (3); /* Variable origin.  */
-    enum variable_export
-      {
-        v_export,               /* Export this variable.  */
-        v_noexport,             /* Don't export this variable.  */
-        v_ifset,                /* Export it if it has a non-default value.  */
-        v_default               /* Decide in target_environment.  */
-      } export ENUM_BITFIELD (2);
-  };
-
-/* Structure that represents a variable set.  */
-
-struct variable_set
-  {
-    struct hash_table table;    /* Hash table of variables.  */
-  };
-
-/* Structure that represents a list of variable sets.  */
-
-struct variable_set_list
-  {
-    struct variable_set_list *next;     /* Link in the chain.  */
-    struct variable_set *set;           /* Variable set.  */
-    int next_is_parent;                 /* True if next is a parent target.  */
-  };
-
-/* Structure used for pattern-specific variables.  */
-
-struct pattern_var
-  {
-    struct pattern_var *next;
-    const char *suffix;
-    const char *target;
-    unsigned int len;
-    struct variable variable;
-  };
-
-extern char *variable_buffer;
-extern struct variable_set_list *current_variable_set_list;
-extern struct variable *default_goal_var;
-extern struct variable shell_var;
-
-/* expand.c */
-char *variable_buffer_output (char *ptr, const char *string, unsigned int length);
-char *variable_expand (const char *line);
-char *variable_expand_for_file (const char *line, struct file *file);
-char *allocated_variable_expand_for_file (const char *line, struct file *file);
-#define allocated_variable_expand(line) \
-  allocated_variable_expand_for_file (line, (struct file *) 0)
-char *expand_argument (const char *str, const char *end);
-char *variable_expand_string (char *line, const char *string, long length);
-void install_variable_buffer (char **bufp, unsigned int *lenp);
-void restore_variable_buffer (char *buf, unsigned int len);
-
-/* function.c */
-int handle_function (char **op, const char **stringp);
-int pattern_matches (const char *pattern, const char *percent, const char *str);
-char *subst_expand (char *o, const char *text, const char *subst,
-                    const char *replace, unsigned int slen, unsigned int rlen,
-                    int by_word);
-char *patsubst_expand_pat (char *o, const char *text, const char *pattern,
-                           const char *replace, const char *pattern_percent,
-                           const char *replace_percent);
-char *patsubst_expand (char *o, const char *text, char *pattern, char *replace);
-char *func_shell_base (char *o, char **argv, int trim_newlines);
-void shell_completed (int exit_code, int exit_sig);
-
-/* expand.c */
-char *recursively_expand_for_file (struct variable *v, struct file *file);
-#define recursively_expand(v)   recursively_expand_for_file (v, NULL)
-
-/* variable.c */
-struct variable_set_list *create_new_variable_set (void);
-void free_variable_set (struct variable_set_list *);
-struct variable_set_list *push_new_variable_scope (void);
-void pop_variable_scope (void);
-void define_automatic_variables (void);
-void initialize_file_variables (struct file *file, int reading);
-void print_file_variables (const struct file *file);
-void print_target_variables (const struct file *file);
-void merge_variable_set_lists (struct variable_set_list **to_list,
-                               struct variable_set_list *from_list);
-struct variable *do_variable_definition (const floc *flocp,
-                                         const char *name, const char *value,
-                                         enum variable_origin origin,
-                                         enum variable_flavor flavor,
-                                         int target_var);
-char *parse_variable_definition (const char *line,
-                                 struct variable *v);
-struct variable *assign_variable_definition (struct variable *v, const char *line);
-struct variable *try_variable_definition (const floc *flocp, const char *line,
-                                          enum variable_origin origin,
-                                          int target_var);
-void init_hash_global_variable_set (void);
-void hash_init_function_table (void);
-void define_new_function(const floc *flocp, const char *name,
-                         unsigned int min, unsigned int max, unsigned int flags,
-                         gmk_func_ptr func);
-struct variable *lookup_variable (const char *name, unsigned int length);
-struct variable *lookup_variable_in_set (const char *name, unsigned int length,
-                                         const struct variable_set *set);
-
-struct variable *define_variable_in_set (const char *name, unsigned int length,
-                                         const char *value,
-                                         enum variable_origin origin,
-                                         int recursive,
-                                         struct variable_set *set,
-                                         const floc *flocp);
-
-/* Define a variable in the current variable set.  */
-
-#define define_variable(n,l,v,o,r) \
-          define_variable_in_set((n),(l),(v),(o),(r),\
-                                 current_variable_set_list->set,NILF)
-
-/* Define a variable with a constant name in the current variable set.  */
-
-#define define_variable_cname(n,v,o,r) \
-          define_variable_in_set((n),(sizeof (n) - 1),(v),(o),(r),\
-                                 current_variable_set_list->set,NILF)
-
-/* Define a variable with a location in the current variable set.  */
-
-#define define_variable_loc(n,l,v,o,r,f) \
-          define_variable_in_set((n),(l),(v),(o),(r),\
-                                 current_variable_set_list->set,(f))
-
-/* Define a variable with a location in the global variable set.  */
-
-#define define_variable_global(n,l,v,o,r,f) \
-          define_variable_in_set((n),(l),(v),(o),(r),NULL,(f))
-
-/* Define a variable in FILE's variable set.  */
-
-#define define_variable_for_file(n,l,v,o,r,f) \
-          define_variable_in_set((n),(l),(v),(o),(r),(f)->variables->set,NILF)
-
-void undefine_variable_in_set (const char *name, unsigned int length,
-                               enum variable_origin origin,
-                               struct variable_set *set);
-
-/* Remove variable from the current variable set. */
-
-#define undefine_variable_global(n,l,o) \
-          undefine_variable_in_set((n),(l),(o),NULL)
-
-/* Warn that NAME is an undefined variable.  */
-
-#define warn_undefined(n,l) do{\
-                              if (warn_undefined_variables_flag)        \
-                                error (reading_file, (l),               \
-                                       _("warning: undefined variable '%.*s'"), \
-                                       (int)(l), (n));                  \
-                              }while(0)
-
-char **target_environment (struct file *file);
-
-struct pattern_var *create_pattern_var (const char *target,
-                                        const char *suffix);
-
-extern int export_all_variables;
-
-#define MAKELEVEL_NAME "MAKELEVEL"
-#define MAKELEVEL_LENGTH (CSTRLEN (MAKELEVEL_NAME))
diff --git a/version.c b/version.c
deleted file mode 100644 (file)
index e6d822d..0000000
--- a/version.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Record version and build host architecture for GNU make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* We use <config.h> instead of "config.h" so that a compilation
-   using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
-   (which it would do because makeint.h was found in $srcdir).  */
-#include <config.h>
-
-#ifndef MAKE_HOST
-# define MAKE_HOST "unknown"
-#endif
-
-const char *version_string = VERSION;
-const char *make_host = MAKE_HOST;
-\f
-/*
-  Local variables:
-  version-control: never
-  End:
- */
diff --git a/vms_exit.c b/vms_exit.c
deleted file mode 100644 (file)
index b08d84d..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/* vms_exit.c
- *
- * Wrapper for the VMS exit() command to tranlate UNIX codes to be
- * encoded for POSIX, but also have VMS severity levels.
- * The posix_exit() variant only sets a severity level for status code 1.
- *
- * Author: John E. Malmberg
- */
-
-/* Copyright (C) 2014-2016 Free Software Foundation, Inc.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* Per copyright assignment agreement with the Free Software Foundation
-   this software may be available under under other license agreements
-   and copyrights. */
-
-#include <makeint.h>
-
-#include <stsdef.h>
-void
-decc$exit (int status);
-#ifndef C_FACILITY_NO
-# define C_FACILITY_NO 0x350000
-#endif
-
-/* Lowest legal non-success VMS exit code is 8 */
-/* GNU make only defines codes 0, 1, 2 */
-/* So assume any exit code > 8 is a VMS exit code */
-
-#ifndef MAX_EXPECTED_EXIT_CODE
-# define MAX_EXPECTED_EXIT_CODE 7
-#endif
-
-/* Build a Posix Exit with VMS severity */
-void
-vms_exit (int status)
-{
-  int vms_status;
-  /* Fake the __posix_exit with severity added */
-  /* Undocumented correct way to do this. */
-  vms_status = 0;
-
-  /* The default DECC definition is not compatible with doing a POSIX_EXIT */
-  /* So fix it. */
-  if (status == EXIT_FAILURE)
-    status = MAKE_FAILURE;
-
-  /* Trivial case exit success */
-  if (status == 0)
-    decc$exit (STS$K_SUCCESS);
-
-  /* Is this a VMS status then just take it */
-  if (status > MAX_EXPECTED_EXIT_CODE)
-    {
-      /* Make sure that the message inhibit is set since message has */
-      /* already been displayed. */
-      vms_status = status | STS$M_INHIB_MSG;
-      decc$exit (vms_status);
-    }
-
-  /* Unix status codes are limited to 1 byte, so anything larger */
-  /* is a probably a VMS exit code and needs to be passed through */
-  /* A lower value can be set for a macro. */
-  /* Status 0 is always passed through as it is converted to SS$_NORMAL */
-  /* Always set the message inhibit bit */
-  vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;
-  vms_status |= (status << 3);
-
-  /* STS$K_ERROR is for status that stops makefile that a simple */
-  /* Rerun of the makefile will not fix. */
-
-  if (status == MAKE_FAILURE)
-    vms_status |= STS$K_ERROR;
-  else if (status == MAKE_TROUBLE)
-    {
-      /* Make trouble is for when make was told to do nothing and */
-      /* found that a target was not up to date.  Since a second */
-      /* of make will produce the same condition, this is of */
-      /* Error severity */
-      vms_status |= STS$K_ERROR;
-    }
-  decc$exit (vms_status);
-}
diff --git a/vms_export_symbol.c b/vms_export_symbol.c
deleted file mode 100644 (file)
index 954f3f4..0000000
+++ /dev/null
@@ -1,527 +0,0 @@
-/* File: vms_export_symbol.c
- *
- * Some programs need special environment variables deported as DCL
- * DCL symbols.
- */
-
-/* Copyright (C) 2014-2016 Free Software Foundation, Inc.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* Per copyright assignment agreement with the Free Software Foundation
-   this software may be available under under other license agreements
-   and copyrights. */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#include <descrip.h>
-#include <stsdef.h>
-#include <ssdef.h>
-#include <unixlib.h>
-#include <libclidef.h>
-
-#pragma member_alignment save
-#pragma nomember_alignment longword
-struct item_list_3
-{
-  unsigned short len;
-  unsigned short code;
-  void * bufadr;
-  unsigned short * retlen;
-};
-
-
-#pragma member_alignment
-
-int
-LIB$GET_SYMBOL (const struct dsc$descriptor_s * symbol,
-                struct dsc$descriptor_s * value,
-                unsigned short * value_len,
-                const unsigned long * table);
-
-int
-LIB$SET_SYMBOL (const struct dsc$descriptor_s * symbol,
-                const struct dsc$descriptor_s * value,
-                const unsigned long * table);
-
-int
-LIB$DELETE_SYMBOL (const struct dsc$descriptor_s * symbol,
-                   const unsigned long * table);
-
-#define MAX_DCL_SYMBOL_LEN (255)
-#if __CRTL_VER >= 70302000 && !defined(__VAX)
-# define MAX_DCL_SYMBOL_VALUE (8192)
-#else
-# define MAX_DCL_SYMBOL_VALUE (1024)
-#endif
-
-struct dcl_symbol
-{
-  struct dcl_symbol * link;
-  struct dsc$descriptor_s name_desc;
-  struct dsc$descriptor_s value_desc;
-  char name[MAX_DCL_SYMBOL_LEN + 1];    /* + 1 byte for null terminator */
-  char value[MAX_DCL_SYMBOL_VALUE +1];  /* + 1 byte for null terminator */
-  char pad[3]; /* Pad structure to longword allignment */
-};
-
-static struct dcl_symbol * vms_dcl_symbol_head = NULL;
-
-/* Restore symbol state to original condition. */
-static unsigned long
-clear_dcl_symbol (struct dcl_symbol * symbol)
-{
-
-  const unsigned long symtbl = LIB$K_CLI_LOCAL_SYM;
-  int status;
-
-  if (symbol->value_desc.dsc$w_length == (unsigned short)-1)
-    status = LIB$DELETE_SYMBOL (&symbol->name_desc, &symtbl);
-  else
-    status = LIB$SET_SYMBOL (&symbol->name_desc,
-                             &symbol->value_desc, &symtbl);
-  return status;
-}
-
-
-/* Restore all exported symbols to their original conditions */
-static void
-clear_exported_symbols (void)
-{
-
-  struct dcl_symbol * symbol;
-
-  symbol = vms_dcl_symbol_head;
-
-  /* Walk the list of symbols.  This is done durring exit,
-   * so no need to free memory.
-   */
-  while (symbol != NULL)
-  {
-    clear_dcl_symbol (symbol);
-    symbol = symbol->link;
-  }
-
-}
-
-
-/* Restore the symbol back to the original value
- * symbol name is either a plain name or of the form "symbol=name" where
- * the name portion is ignored.
- */
-void
-vms_restore_symbol (const char * string)
-{
-
-  struct dcl_symbol * symbol;
-  char name[MAX_DCL_SYMBOL_LEN + 1];
-  int status;
-  char * value;
-  int name_len;
-
-  symbol = vms_dcl_symbol_head;
-
-  /* Isolate the name from the value */
-  value = strchr (string, '=');
-  if (value != NULL)
-    {
-      /* Copy the name from the string */
-      name_len = (value - string);
-    }
-  else
-    name_len = strlen (string);
-
-  if (name_len > MAX_DCL_SYMBOL_LEN)
-    name_len = MAX_DCL_SYMBOL_LEN;
-
-  strncpy (name, string, name_len);
-  name[name_len] = 0;
-
-  /* Walk the list of symbols.  The saved symbol is not freed
-   * symbols are likely to be overwritten multiple times, so this
-   * saves time in saving them each time.
-   */
-  while (symbol != NULL)
-    {
-      int result;
-      result = strcmp (symbol->name, name);
-      if (result == 0)
-        {
-          clear_dcl_symbol (symbol);
-          break;
-        }
-      symbol = symbol->link;
-    }
-}
-
-int
-vms_export_dcl_symbol (const char * name, const char * value)
-{
-
-  struct dcl_symbol * symbol;
-  struct dcl_symbol * next;
-  struct dcl_symbol * link;
-  int found;
-  const unsigned long symtbl = LIB$K_CLI_LOCAL_SYM;
-  struct dsc$descriptor_s value_desc;
-  int string_len;
-  int status;
-  char new_value[MAX_DCL_SYMBOL_VALUE + 1];
-  char * dollarp;
-
-  next = vms_dcl_symbol_head;
-  link = vms_dcl_symbol_head;
-
-  /* Is symbol already exported? */
-  found = 0;
-  while ((found == 0) && (link != NULL))
-    {
-      int x;
-      found = !strncasecmp (link->name, name, MAX_DCL_SYMBOL_LEN);
-      if (found)
-        symbol = link;
-      next = link;
-      link = link->link;
-    }
-
-  /* New symbol, set it up */
-  if (found == 0)
-    {
-      symbol = malloc (sizeof (struct dcl_symbol));
-      if (symbol == NULL)
-        return SS$_INSFMEM;
-
-      /* Construct the symbol descriptor, used for both saving
-       * the old symbol and creating the new symbol.
-       */
-      symbol->name_desc.dsc$w_length = strlen (name);
-      if (symbol->name_desc.dsc$w_length > MAX_DCL_SYMBOL_LEN)
-        symbol->name_desc.dsc$w_length = MAX_DCL_SYMBOL_LEN;
-
-      strncpy (symbol->name, name, symbol->name_desc.dsc$w_length);
-      symbol->name[symbol->name_desc.dsc$w_length] = 0;
-      symbol->name_desc.dsc$a_pointer = symbol->name;
-      symbol->name_desc.dsc$b_dtype = DSC$K_DTYPE_T;
-      symbol->name_desc.dsc$b_class = DSC$K_CLASS_S;
-
-      /* construct the value descriptor, used only for saving
-       * the old symbol.
-       */
-      symbol->value_desc.dsc$a_pointer = symbol->value;
-      symbol->value_desc.dsc$w_length = MAX_DCL_SYMBOL_VALUE;
-      symbol->value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
-      symbol->value_desc.dsc$b_class = DSC$K_CLASS_S;
-    }
-
-  if (found == 0)
-    {
-      unsigned long old_symtbl;
-      unsigned short value_len;
-
-      /* Look up the symbol */
-      status = LIB$GET_SYMBOL (&symbol->name_desc, &symbol->value_desc,
-                               &value_len, &old_symtbl);
-      if (!$VMS_STATUS_SUCCESS (status))
-        value_len = (unsigned short)-1;
-      else if (old_symtbl != symtbl)
-        value_len = (unsigned short)-1;
-
-      symbol->value_desc.dsc$w_length = value_len;
-
-      /* Store it away */
-      if (value_len != (unsigned short) -1)
-        symbol->value[value_len] = 0;
-
-      /* Make sure atexit scheduled */
-      if (vms_dcl_symbol_head == NULL)
-        {
-          vms_dcl_symbol_head = symbol;
-          atexit (clear_exported_symbols);
-        }
-      else
-        {
-          /* Extend the chain */
-          next->link = symbol;
-        }
-    }
-
-  /* Create or replace a symbol */
-  value_desc.dsc$a_pointer = new_value;
-  string_len = strlen (value);
-  if (string_len > MAX_DCL_SYMBOL_VALUE)
-    string_len = MAX_DCL_SYMBOL_VALUE;
-
-  strncpy (new_value, value, string_len);
-  new_value[string_len] = 0;
-
-  /* Special handling for GNU Make.  GNU Make doubles the dollar signs
-   * in environment variables read in from getenv().  Make exports symbols
-   * with the dollar signs already doubled.  So all $$ must be converted
-   * back to $.
-   * If the first $ is not doubled, then do not convert at all.
-   */
-  dollarp = strchr (new_value, '$');
-  while (dollarp && dollarp[1] == '$')
-    {
-      int left;
-      dollarp++;
-      left = string_len - (dollarp - new_value - 1);
-      string_len--;
-      if (left > 0)
-        {
-          memmove (dollarp, &dollarp[1], left);
-          dollarp = strchr (&dollarp[1], '$');
-        }
-      else
-        {
-          /* Ended with $$, simple case */
-          dollarp[1] = 0;
-          break;
-        }
-    }
-  value_desc.dsc$w_length = string_len;
-  value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
-  value_desc.dsc$b_class = DSC$K_CLASS_S;
-  status = LIB$SET_SYMBOL (&symbol->name_desc, &value_desc, &symtbl);
-  return status;
-}
-
-/* export a DCL symbol using a string in the same syntax as putenv */
-int
-vms_putenv_symbol (const char * string)
-{
-
-  char name[MAX_DCL_SYMBOL_LEN + 1];
-  int status;
-  char * value;
-  int name_len;
-
-  /* Isolate the name from the value */
-  value = strchr (string, '=');
-  if (value == NULL)
-    {
-      errno = EINVAL;
-      return -1;
-    }
-
-  /* Copy the name from the string */
-  name_len = (value - string);
-  if (name_len > MAX_DCL_SYMBOL_LEN)
-    name_len = MAX_DCL_SYMBOL_LEN;
-
-  strncpy (name, string, name_len);
-  name[name_len] = 0;
-
-  /* Skip past the "=" */
-  value++;
-
-  /* Export the symbol */
-  status = vms_export_dcl_symbol (name, value);
-
-  /* Convert the error to Unix format */
-  if (!$VMS_STATUS_SUCCESS (status))
-    {
-      errno = EVMSERR;
-      vaxc$errno = status;
-      return -1;
-    }
-  return 0;
-}
-
-#if __CRTL_VER >= 70301000
-# define transpath_parm transpath
-#else
-static char transpath[MAX_DCL_SYMBOL_VALUE];
-#endif
-
-/* Helper callback routine for converting Unix paths to VMS */
-static int
-to_vms_action (char * vms_spec, int flag, char * transpath_parm)
-{
-  strncpy (transpath, vms_spec, MAX_DCL_SYMBOL_VALUE - 1);
-  transpath[MAX_DCL_SYMBOL_VALUE - 1] = 0;
-  return 0;
-}
-
-#ifdef __DECC
-# pragma message save
-  /* Undocumented extra parameter use triggers a ptrmismatch warning */
-# pragma message disable ptrmismatch
-#endif
-
-/* Create a foreign command only visible to children */
-int
-create_foreign_command (const char * command, const char * image)
-{
-  char vms_command[MAX_DCL_SYMBOL_VALUE + 1];
-  int status;
-
-  vms_command[0] = '$';
-  vms_command[1] = 0;
-  if (image[0] == '/')
-    {
-#if __CRTL_VER >= 70301000
-      /* Current decc$to_vms is reentrant */
-      decc$to_vms (image, to_vms_action, 0, 1, &vms_command[1]);
-#else
-      /* Older decc$to_vms is not reentrant */
-      decc$to_vms (image, to_vms_action, 0, 1);
-      strncpy (&vms_command[1], transpath, MAX_DCL_SYMBOL_VALUE - 1);
-      vms_command[MAX_DCL_SYMBOL_VALUE] = 0;
-#endif
-    }
-  else
-    {
-      strncpy (&vms_command[1], image, MAX_DCL_SYMBOL_VALUE - 1);
-      vms_command[MAX_DCL_SYMBOL_VALUE] = 0;
-    }
-  status = vms_export_dcl_symbol (command, vms_command);
-
-  return status;
-}
-#ifdef __DECC
-# pragma message restore
-#endif
-
-
-#ifdef DEBUG
-
-int
-main(int argc, char ** argv, char **env)
-{
-
-  char value[MAX_DCL_SYMBOL_VALUE +1];
-  int status = 0;
-  int putenv_status;
-  int vms_status;
-  struct dsc$descriptor_s name_desc;
-  struct dsc$descriptor_s value_desc;
-  const unsigned long symtbl = LIB$K_CLI_LOCAL_SYM;
-  unsigned short value_len;
-  unsigned long old_symtbl;
-  int result;
-  const char * vms_command = "vms_export_symbol";
-  const char * vms_image = "test_image.exe";
-  const char * vms_symbol1 = "test_symbol1";
-  const char * value1 = "test_value1";
-  const char * vms_symbol2 = "test_symbol2";
-  const char * putenv_string = "test_symbol2=value2";
-  const char * value2 = "value2";
-
-  /* Test creating a foreign command */
-  vms_status = create_foreign_command (vms_command, vms_image);
-  if (!$VMS_STATUS_SUCCESS (vms_status))
-    {
-      printf("Create foreign command failed: %d\n", vms_status);
-      status = 1;
-    }
-
-  name_desc.dsc$a_pointer = (char *)vms_command;
-  name_desc.dsc$w_length = strlen (vms_command);
-  name_desc.dsc$b_dtype = DSC$K_DTYPE_T;
-  name_desc.dsc$b_class = DSC$K_CLASS_S;
-
-  value_desc.dsc$a_pointer = value;
-  value_desc.dsc$w_length = MAX_DCL_SYMBOL_VALUE;
-  value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
-  value_desc.dsc$b_class = DSC$K_CLASS_S;
-
-  vms_status = LIB$GET_SYMBOL (&name_desc, &value_desc,
-                               &value_len, &old_symtbl);
-  if (!$VMS_STATUS_SUCCESS (vms_status))
-    {
-      printf ("lib$get_symbol for command failed: %d\n", vms_status);
-      status = 1;
-    }
-
-  value[value_len] = 0;
-  result = strncasecmp (&value[1], vms_image, value_len - 1);
-  if (result != 0)
-    {
-      printf ("create_foreign_command failed!  expected '%s', got '%s'\n",
-              vms_image, &value[1]);
-      status = 1;
-    }
-
-  /* Test exporting a symbol */
-  vms_status = vms_export_dcl_symbol (vms_symbol1, value1);
-  if (!$VMS_STATUS_SUCCESS (vms_status))
-    {
-      printf ("vms_export_dcl_symbol for command failed: %d\n", vms_status);
-      status = 1;
-    }
-
-  name_desc.dsc$a_pointer = (char *)vms_symbol1;
-  name_desc.dsc$w_length = strlen (vms_symbol1);
-  vms_status = LIB$GET_SYMBOL(&name_desc, &value_desc,
-                              &value_len, &old_symtbl);
-  if (!$VMS_STATUS_SUCCESS(vms_status))
-    {
-      printf ("lib$get_symbol for command failed: %d\n", vms_status);
-      status = 1;
-    }
-
-  value[value_len] = 0;
-  result = strncmp (value, value1, value_len);
-  if (result != 0)
-    {
-      printf ("vms_export_dcl_symbol failed!  expected '%s', got '%s'\n",
-              value1, value);
-      status = 1;
-    }
-
-  /* Test putenv for DCL symbols */
-  putenv_status = vms_putenv_symbol (putenv_string);
-  if (putenv_status != 0)
-    {
-      perror ("vms_putenv_symbol");
-      status = 1;
-    }
-
-  name_desc.dsc$a_pointer = (char *)vms_symbol2;
-  name_desc.dsc$w_length = strlen(vms_symbol2);
-  vms_status = LIB$GET_SYMBOL (&name_desc, &value_desc,
-                               &value_len, &old_symtbl);
-  if (!$VMS_STATUS_SUCCESS (vms_status))
-    {
-      printf ("lib$get_symbol for command failed: %d\n", vms_status);
-      status = 1;
-    }
-
-  value[value_len] = 0;
-  result = strncmp (value, value2, value_len);
-  if (result != 0)
-  {
-    printf ("vms_putenv_symbol failed!  expected '%s', got '%s'\n",
-            value2, value);
-    status = 1;
-  }
-
-  vms_restore_symbol (putenv_string);
-  vms_status = LIB$GET_SYMBOL (&name_desc, &value_desc,
-                               &value_len, &old_symtbl);
-  if ($VMS_STATUS_SUCCESS (vms_status))
-    {
-      printf ("lib$get_symbol for command succeeded, should have failed\n");
-      status = 1;
-    }
-
-  exit (status);
-}
-
-#endif
diff --git a/vms_progname.c b/vms_progname.c
deleted file mode 100644 (file)
index 0665a54..0000000
+++ /dev/null
@@ -1,463 +0,0 @@
-/* File: vms_progname.c
- *
- * This module provides a fixup of the program name.
- *
- * This module is designed to be a plug in replacement for the
- * progname module used by many GNU utilities with a few enhancements
- * needed for GNU Make.
- *
- * It does not support the HAVE_DECL_PROGRAM_INVOCATION_* macros at this
- * time.
- *
- * Make sure that the program_name string is set as close as possible to
- *    what the original command was given.
- *
- * When run from DCL, The argv[0] element is initialized with an absolute
- * path name.  The decc$ feature logical names can control the format
- * of this pathname.  In some cases it causes the UNIX format name to be
- * formatted incorrectly.
- *
- * This DCL provided name is usually incompatible with what is expected to
- * be provided by Unix programs and needs to be replaced.
- *
- * When run from an exec() call, the argv[0] element is initialized by the
- * program.  This name is compatible with what is expected to be provided
- * by Unix programs and should be passed through unchanged.
- *
- * The DCL provided name can be detected because it always contains the
- * device name.
- *
- * DCL examples:
- *    devname:[dir]program.exe;1         Normal VMS - remove path and .EXE;n
- *    devname:[dir]facility$program.exe;1   Facility also needs removal.
- *    /devname/dir/program.exe
- *    /DISK$VOLUME/dir/program.exe.1     Bug version should not be there.
- *    /DISK$VOLUME/dir/program.          Bug Period should not be there.
- *
- */
-
-/* Copyright (C) 2014-2016 Free Software Foundation, Inc.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-/* Per copyright assignment agreement with the Free Software Foundation
-   this software may be available under under other license agreements
-   and copyrights. */
-
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-#include <descrip.h>
-#include <dvidef.h>
-#include <efndef.h>
-#include <fscndef.h>
-#include <stsdef.h>
-
-#ifdef USE_PROGNAME_H
-# include "progname.h"
-#endif
-
-#pragma member_alignment save
-#pragma nomember_alignment longword
-struct item_list_3
-{
-  unsigned short len;
-  unsigned short code;
-  void * bufadr;
-  unsigned short * retlen;
-};
-
-struct filescan_itmlst_2
-{
-  unsigned short length;
-  unsigned short itmcode;
-  char * component;
-};
-
-#pragma member_alignment
-
-int
-SYS$GETDVIW (unsigned long efn,
-             unsigned short chan,
-             const struct dsc$descriptor_s * devnam,
-             const struct item_list_3 * itmlst,
-             void * iosb,
-             void (* astadr)(unsigned long),
-             unsigned long astprm,
-             void * nullarg);
-
-int
-SYS$FILESCAN (const struct dsc$descriptor_s * srcstr,
-              struct filescan_itmlst_2 * valuelist,
-              unsigned long * fldflags,
-              struct dsc$descriptor_s *auxout,
-              unsigned short * retlen);
-
-/* String containing name the program is called with.
-   To be initialized by main().  */
-
-const char *program_name = NULL;
-
-static int internal_need_vms_symbol = 0;
-
-static char vms_new_nam[256];
-
-int
-need_vms_symbol (void)
-{
-  return internal_need_vms_symbol;
-}
-
-
-void
-set_program_name (const char *argv0)
-{
-  int status;
-  int result;
-
-#ifdef DEBUG
-  printf ("original argv0 = %s\n", argv0);
-#endif
-
-  /* Posix requires non-NULL argv[0] */
-  if (argv0 == NULL)
-    {
-      fputs ("A NULL argv[0] was passed through an exec system call.\n",
-             stderr);
-      abort ();
-    }
-
-  program_name = argv0;
-  result = 0;
-  internal_need_vms_symbol = 0;
-
-  /* If the path name starts with a /, then it is an absolute path         */
-  /* that may have been generated by the CRTL instead of the command name  */
-  /* If it is the device name between the slashes, then this was likely    */
-  /* from the run command and needs to be fixed up.                        */
-  /* If the DECC$POSIX_COMPLIANT_PATHNAMES is set to 2, then it is the     */
-  /* DISK$VOLUME that will be present, and it will still need to be fixed. */
-  if (argv0[0] == '/')
-    {
-      char * nextslash;
-      int length;
-      struct item_list_3 itemlist[3];
-      unsigned short dvi_iosb[4];
-      char alldevnam[64];
-      unsigned short alldevnam_len;
-      struct dsc$descriptor_s devname_dsc;
-      char diskvolnam[256];
-      unsigned short diskvolnam_len;
-
-      internal_need_vms_symbol = 1;
-
-       /* Get some information about the disk */
-      /*--------------------------------------*/
-      itemlist[0].len = (sizeof alldevnam) - 1;
-      itemlist[0].code = DVI$_ALLDEVNAM;
-      itemlist[0].bufadr = alldevnam;
-      itemlist[0].retlen = &alldevnam_len;
-      itemlist[1].len = (sizeof diskvolnam) - 1 - 5;
-      itemlist[1].code = DVI$_VOLNAM;
-      itemlist[1].bufadr = &diskvolnam[5];
-      itemlist[1].retlen = &diskvolnam_len;
-      itemlist[2].len = 0;
-      itemlist[2].code = 0;
-
-      /* Add the prefix for the volume name. */
-      /* SYS$GETDVI will append the volume name to this */
-      strcpy (diskvolnam, "DISK$");
-
-      nextslash = strchr (&argv0[1], '/');
-      if (nextslash != NULL)
-        {
-          length = nextslash - argv0 - 1;
-
-          /* Cast needed for HP C compiler diagnostic */
-          devname_dsc.dsc$a_pointer = (char *)&argv0[1];
-          devname_dsc.dsc$w_length = length;
-          devname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
-          devname_dsc.dsc$b_class = DSC$K_CLASS_S;
-
-          status = SYS$GETDVIW (EFN$C_ENF, 0, &devname_dsc, itemlist,
-                                dvi_iosb, NULL, 0, 0);
-          if (!$VMS_STATUS_SUCCESS (status))
-            {
-              /* If the sys$getdviw fails, then this path was passed by */
-              /* An exec() program and not from DCL, so do nothing */
-              /* An example is "/tmp/program" where tmp: does not exist */
-#ifdef DEBUG
-              printf ("sys$getdviw failed with status %d\n", status);
-#endif
-              result = 0;
-             }
-           else if (!$VMS_STATUS_SUCCESS (dvi_iosb[0]))
-             {
-#ifdef DEBUG
-                printf ("sys$getdviw failed with iosb %d\n", dvi_iosb[0]);
-#endif
-                result = 0;
-              }
-            else
-              {
-                char * devnam;
-                int devnam_len;
-                char argv_dev[64];
-
-                /* Null terminate the returned alldevnam */
-                alldevnam[alldevnam_len] = 0;
-                devnam = alldevnam;
-                devnam_len = alldevnam_len;
-
-                /* Need to skip past any leading underscore */
-                if (devnam[0] == '_')
-                  {
-                    devnam++;
-                    devnam_len--;
-                  }
-
-                /* And remove the trailing colon */
-                if (devnam[devnam_len - 1] == ':')
-                  {
-                    devnam_len--;
-                    devnam[devnam_len] = 0;
-                  }
-
-                /* Null terminate the returned volnam */
-                diskvolnam_len += 5;
-                diskvolnam[diskvolnam_len] = 0;
-
-                /* Check first for normal CRTL behavior */
-                if (devnam_len == length)
-                  {
-                    strncpy (vms_new_nam, &argv0[1], length);
-                    vms_new_nam[length] = 0;
-                    result = (strcasecmp (devnam, vms_new_nam) == 0);
-                  }
-
-                /* If we have not got a match, check for POSIX Compliant */
-                /* behavior.  To be more accurate, we could also check */
-                /* to see if that feature is active. */
-                if ((result == 0) && (diskvolnam_len == length))
-                  {
-                    strncpy (vms_new_nam, &argv0[1], length);
-                    vms_new_nam[length] = 0;
-                    result = (strcasecmp (diskvolnam, vms_new_nam) == 0);
-                  }
-              }
-        }
-      }
-    else
-      {
-        /* The path did not start with a slash, so it could be VMS format */
-        /* If it is vms format, it has a volume/device in it as it must   */
-        /* be an absolute path */
-        struct dsc$descriptor_s path_desc;
-        int status;
-        unsigned long field_flags;
-        struct filescan_itmlst_2 item_list[5];
-        char * volume;
-        char * name;
-        int name_len;
-        char * ext;
-
-        path_desc.dsc$a_pointer = (char *)argv0; /* cast ok */
-        path_desc.dsc$w_length = strlen (argv0);
-        path_desc.dsc$b_dtype = DSC$K_DTYPE_T;
-        path_desc.dsc$b_class = DSC$K_CLASS_S;
-
-        /* Don't actually need to initialize anything buf itmcode */
-        /* I just do not like uninitialized input values */
-
-        /* Sanity check, this must be the same length as input */
-        item_list[0].itmcode = FSCN$_FILESPEC;
-        item_list[0].length = 0;
-        item_list[0].component = NULL;
-
-        /* If the device is present, then it if a VMS spec */
-        item_list[1].itmcode = FSCN$_DEVICE;
-        item_list[1].length = 0;
-        item_list[1].component = NULL;
-
-        /* we need the program name and type */
-        item_list[2].itmcode = FSCN$_NAME;
-        item_list[2].length = 0;
-        item_list[2].component = NULL;
-
-        item_list[3].itmcode = FSCN$_TYPE;
-        item_list[3].length = 0;
-        item_list[3].component = NULL;
-
-        /* End the list */
-        item_list[4].itmcode = 0;
-        item_list[4].length = 0;
-        item_list[4].component = NULL;
-
-        status = SYS$FILESCAN ((const struct dsc$descriptor_s *)&path_desc,
-                               item_list, &field_flags, NULL, NULL);
-
-
-        if ($VMS_STATUS_SUCCESS (status) &&
-           (item_list[0].length == path_desc.dsc$w_length) &&
-           (item_list[1].length != 0))
-          {
-
-            char * dollar;
-            int keep_ext;
-            int i;
-
-            /* We need the filescan to be successful, */
-            /* same length as input, and a volume to be present */
-            internal_need_vms_symbol = 1;
-
-            /* We will assume that we only get to this path on a version */
-            /* of VMS that does not support the EFS character set */
-
-            /* There may be a xxx$ prefix on the image name.  Linux */
-            /* programs do not handle that well, so strip the prefix */
-            name = item_list[2].component;
-            name_len = item_list[2].length;
-            dollar = strrchr (name, '$');
-            if (dollar != NULL)
-              {
-                dollar++;
-                name_len = name_len - (dollar - name);
-                name = dollar;
-              }
-
-            strncpy (vms_new_nam, name, name_len);
-            vms_new_nam[name_len] = 0;
-
-            /* Commit to using the new name */
-            program_name = vms_new_nam;
-
-            /* We only keep the extension if it is not ".exe" */
-            keep_ext = 0;
-            ext = item_list[3].component;
-
-            if (item_list[3].length != 1)
-              {
-                keep_ext = 1;
-                if (item_list[3].length == 4)
-                  {
-                    if ((ext[1] == 'e' || ext[1] == 'E') &&
-                        (ext[2] == 'x' || ext[2] == 'X') &&
-                        (ext[3] == 'e' || ext[3] == 'E'))
-                      keep_ext = 0;
-                  }
-              }
-
-            if (keep_ext == 1)
-              strncpy (&vms_new_nam[name_len], ext, item_list[3].length);
-          }
-      }
-
-    if (result)
-      {
-        char * lastslash;
-        char * dollar;
-        char * dotexe;
-        char * lastdot;
-        char * extension;
-
-        /* This means it is probably the name from a DCL command */
-        /* Find the last slash which separates the file from the */
-        /* path. */
-        lastslash = strrchr (argv0, '/');
-
-        if (lastslash != NULL) {
-            int i;
-
-            lastslash++;
-
-            /* There may be a xxx$ prefix on the image name.  Linux */
-            /* programs do not handle that well, so strip the prefix */
-            dollar = strrchr (lastslash, '$');
-
-            if (dollar != NULL) {
-                dollar++;
-                lastslash = dollar;
-            }
-
-            strcpy (vms_new_nam, lastslash);
-
-            /* In UNIX mode + EFS character set, there should not be a */
-            /* version present, as it is not possible when parsing to  */
-            /* tell if it is a version or part of the UNIX filename as */
-            /* UNIX programs use numeric extensions for many reasons.  */
-
-            lastdot = strrchr (vms_new_nam, '.');
-            if (lastdot != NULL) {
-                int i;
-
-                i = 1;
-                while (isdigit (lastdot[i])) {
-                    i++;
-                }
-                if (lastdot[i] == 0) {
-                    *lastdot = 0;
-                }
-            }
-
-            /* Find the .exe on the name (case insenstive) and toss it */
-            dotexe = strrchr (vms_new_nam, '.');
-            if (dotexe != NULL) {
-                if ((dotexe[1] == 'e' || dotexe[1] == 'E') &&
-                    (dotexe[2] == 'x' || dotexe[2] == 'X') &&
-                    (dotexe[3] == 'e' || dotexe[3] == 'E') &&
-                    (dotexe[4] == 0)) {
-
-                    *dotexe = 0;
-                } else {
-                     /* Also need to handle a null extension because of a */
-                     /* CRTL bug. */
-                     if (dotexe[1] == 0) {
-                         *dotexe = 0;
-                    }
-                }
-            }
-
-            /* Commit to new name */
-            program_name = vms_new_nam;
-
-        } else {
-            /* There is no way that the code should ever get here */
-            /* As we already verified that the '/' was present */
-            fprintf (stderr, "Sanity failure somewhere we lost a '/'\n");
-        }
-    }
-}
-
-#ifdef DEBUG
-
-int
-main (int argc, char ** argv, char **env)
-{
-
-  char command[1024];
-
-  set_program_name (argv[0]);
-
-  printf ("modified argv[0] = %s\n", program_name);
-
-  return 0;
-}
-#endif
diff --git a/vmsdir.h b/vmsdir.h
deleted file mode 100644 (file)
index 814b89d..0000000
--- a/vmsdir.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* dirent.h for vms
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef VMSDIR_H
-#define VMSDIR_H
-
-#include <rms.h>
-
-#define        MAXNAMLEN       255
-
-#ifndef __DECC
-#if !defined (__GNUC__) && !defined (__ALPHA)
-typedef unsigned long u_long;
-typedef unsigned short u_short;
-#endif
-#endif
-
-struct direct
-{
-  off_t d_off;
-  u_long d_fileno;
-  u_short d_reclen;
-  u_short d_namlen;
-  char d_name[MAXNAMLEN + 1];
-};
-
-#undef DIRSIZ
-#define DIRSIZ(dp)             \
-  (((sizeof (struct direct)    \
-     - (MAXNAMLEN+1)           \
-     + ((dp)->d_namlen+1))     \
-    + 3) & ~3)
-
-#define d_ino  d_fileno                /* compatibility */
-
-
-/*
- * Definitions for library routines operating on directories.
- */
-
-typedef struct DIR
-{
-  struct direct dir;
-  char d_result[MAXNAMLEN + 1];
-#if defined (__ALPHA) || defined (__DECC)
-  struct FAB fab;
-#else
-  struct fabdef fab;
-#endif
-} DIR;
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-#define rewinddir(dirp)        seekdir((dirp), (long)0)
-
-DIR *opendir ();
-struct direct *readdir (DIR *dfd);
-int closedir (DIR *dfd);
-const char *vmsify (const char *name, int type);
-
-#endif /* VMSDIR_H */
diff --git a/vmsfunctions.c b/vmsfunctions.c
deleted file mode 100644 (file)
index e422d48..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-/* VMS functions
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "debug.h"
-#include "job.h"
-
-#include <ctype.h>
-#include <string.h>
-
-#ifdef __DECC
-#include <starlet.h>
-#endif
-
-#include <rms.h>
-#include "vmsdir.h"
-
-#ifdef HAVE_VMSDIR_H
-
-DIR *
-opendir (char *dspec)
-{
-  struct DIR *dir  = xcalloc (sizeof (struct DIR));
-  struct NAM *dnam = xmalloc (sizeof (struct NAM));
-  struct FAB *dfab = &dir->fab;
-  char *searchspec = xmalloc (MAXNAMLEN + 1);
-
-  *dfab = cc$rms_fab;
-  *dnam = cc$rms_nam;
-  sprintf (searchspec, "%s*.*;", dspec);
-
-  dfab->fab$l_fna = searchspec;
-  dfab->fab$b_fns = strlen (searchspec);
-  dfab->fab$l_nam = dnam;
-
-  *dnam = cc$rms_nam;
-  dnam->nam$l_esa = searchspec;
-  dnam->nam$b_ess = MAXNAMLEN;
-
-  if (! (sys$parse (dfab) & 1))
-    {
-      free (dir);
-      free (dnam);
-      free (searchspec);
-      return (NULL);
-    }
-
-  return dir;
-}
-
-#define uppercasify(str) \
-  do \
-    { \
-      char *tmp; \
-      for (tmp = (str); *tmp != '\0'; tmp++) \
-        if (islower ((unsigned char)*tmp)) \
-          *tmp = toupper ((unsigned char)*tmp); \
-    } \
-  while (0)
-
-struct direct *
-readdir (DIR *dir)
-{
-  struct FAB *dfab = &dir->fab;
-  struct NAM *dnam = (struct NAM *)(dfab->fab$l_nam);
-  struct direct *dentry = &dir->dir;
-  int i;
-
-  memset (dentry, 0, sizeof *dentry);
-
-  dnam->nam$l_rsa = dir->d_result;
-  dnam->nam$b_rss = MAXNAMLEN;
-
-  DB (DB_VERBOSE, ("."));
-
-  if (!((i = sys$search (dfab)) & 1))
-    {
-      DB (DB_VERBOSE, (_("sys$search() failed with %d\n"), i));
-      return (NULL);
-    }
-
-  dentry->d_off = 0;
-  if (dnam->nam$w_fid == 0)
-    dentry->d_fileno = 1;
-  else
-    dentry->d_fileno = dnam->nam$w_fid[0] + (dnam->nam$w_fid[1] << 16);
-
-  dentry->d_reclen = sizeof (struct direct);
-  dentry->d_namlen = dnam->nam$b_name + dnam->nam$b_type;
-  strncpy (dentry->d_name, dnam->nam$l_name, dentry->d_namlen);
-  dentry->d_name[dentry->d_namlen] = '\0';
-
-#ifdef HAVE_CASE_INSENSITIVE_FS
-  uppercasify (dentry->d_name);
-#endif
-
-  return (dentry);
-}
-
-int
-closedir (DIR *dir)
-{
-  if (dir != NULL)
-    {
-      struct FAB *dfab = &dir->fab;
-      struct NAM *dnam = (struct NAM *)(dfab->fab$l_nam);
-      if (dnam != NULL)
-        free (dnam->nam$l_esa);
-      free (dnam);
-      free (dir);
-    }
-
-  return 0;
-}
-#endif /* compiled for OpenVMS prior to V7.x */
-
-/* Argv0 will be a full vms file specification, like
-   node$dka100:[utils.gnumake]make.exe;47
-   prefix it with "mcr " to make it a vms command, executable for DCL. */
-const char *
-vms_command(const char* argv0)
-{
-  size_t l = strlen(argv0) + 1;
-  char* s = xmalloc(l + 4);
-  memcpy(s, "mcr ", 4);
-  memcpy(s+4, argv0, l);
-  return s;
-}
-
-/* Argv0 aka argv[0] will be a full vms file specification, like
-   node$dka100:[utils.gnumake]make.exe;47, set up by the CRTL.
-   The vms progname should be ^^^^, the file name without
-   file type .exe and ;version.
-   Use sys$parse to get the name part of the file specification. That is
-   in the above example, pick up "make" and return a copy of that string.
-   If something goes wrong in sys$parse (unlikely, this is a VMS/CRTL supplied
-   file specification) or if there is an empty name part (not easy to produce,
-   but it is possible) just return "make".
-   Somes notes ...
-   NAM[L]$M_SYNCHK requests a syntax check, only.
-   NAM is for ODS2 names (shorter parts, output usually converted to UPPERCASE).
-   NAML is for ODS2/ODS5 names (longer parts, output unchanged).
-   NAM$M_NO_SHORT_UPCASE may not be available for older versions of VMS.
-   NAML is not available on older versions of VMS (NAML$C_BID not defined).
-   argv[0] on older versions of VMS (no extended parse style and no
-   CRTL feature DECC$ARGV_PARSE_STYLE) is always in lowercase. */
-const char *
-vms_progname(const char* argv0)
-{
-  int status;
-  static struct FAB fab;
-  char *progname;
-  const char *fallback = "make";
-
-#ifdef NAML$C_BID
-  static char esa[NAML$C_MAXRSS];
-  static struct NAML naml;
-#else
-  static char esa[NAM$C_MAXRSS];
-  static struct NAM nam;
-#endif
-
-  fab = cc$rms_fab;
-  fab.fab$l_fna = (char*)argv0;
-  fab.fab$b_fns = strlen(argv0);
-
-#ifdef NAML$C_BID
-  fab.fab$l_naml = &naml;
-  naml = cc$rms_naml;
-  naml.naml$l_long_expand = esa;
-  naml.naml$l_long_expand_alloc = NAML$C_MAXRSS;
-  naml.naml$b_nop = NAML$M_SYNCHK;
-  naml.naml$l_input_flags = NAML$M_NO_SHORT_OUTPUT;
-#else
-  fab.fab$l_nam = &nam;
-  nam = cc$rms_nam;
-  nam.nam$l_esa = esa;
-  nam.nam$b_ess = NAM$C_MAXRSS;
-# ifdef NAM$M_NO_SHORT_UPCASE
-  nam.nam$b_nop = NAM$M_SYNCHK | NAM$M_NO_SHORT_UPCASE;
-# else
-  nam.nam$b_nop = NAM$M_SYNCHK;
-# endif
-#endif
-
-  status = sys$parse(&fab);
-  if (!(status & 1))
-    return fallback;
-
-#ifdef NAML$C_BID
-  if (naml.naml$l_long_name_size == 0)
-    return fallback;
-  progname = xmalloc(naml.naml$l_long_name_size + 1);
-  memcpy(progname, naml.naml$l_long_name, naml.naml$l_long_name_size);
-  progname[naml.naml$l_long_name_size] = '\0';
-#else
-  if (nam.nam$b_name == 0)
-    return fallback;
-  progname = xmalloc(nam.nam$b_name + 1);
-# ifdef NAM$M_NO_SHORT_UPCASE
-  memcpy(progname, nam.nam$l_name, nam.nam$b_name);
-# else
-    {
-      int i;
-      for (i = 0; i < nam.nam$b_name; i++)
-        progname[i] = tolower(nam.nam$l_name[i]);
-    }
-# endif
-  progname[nam.nam$b_name] = '\0';
-#endif
-
-  return progname;
-}
diff --git a/vmsify.c b/vmsify.c
deleted file mode 100644 (file)
index e504a09..0000000
--- a/vmsify.c
+++ /dev/null
@@ -1,1005 +0,0 @@
-/* vmsify.c -- Module for vms <-> unix file name conversion
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/* Written by Klaus Kämpf (kkaempf@progis.de)
-   of proGIS Software, Aachen, Germany */
-
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#include "makeint.h"
-
-#if VMS
-#include <unixlib.h>
-#include <stdlib.h>
-#include <jpidef.h>
-#include <descrip.h>
-#include <uaidef.h>
-#include <ssdef.h>
-#include <starlet.h>
-#include <lib$routines.h>
-/* Initialize a string descriptor (struct dsc$descriptor_s) for an
-   arbitrary string.   ADDR is a pointer to the first character
-   of the string, and LEN is the length of the string. */
-
-#define INIT_DSC_S(dsc, addr, len) do { \
-  (dsc).dsc$b_dtype = DSC$K_DTYPE_T;    \
-  (dsc).dsc$b_class = DSC$K_CLASS_S;    \
-  (dsc).dsc$w_length = (len);           \
-  (dsc).dsc$a_pointer = (addr);         \
-} while (0)
-
-/* Initialize a string descriptor (struct dsc$descriptor_s) for a
-   NUL-terminated string.  S is a pointer to the string; the length
-   is determined by calling strlen(). */
-
-#define INIT_DSC_CSTRING(dsc, s) INIT_DSC_S(dsc, s, strlen(s))
-#endif
-
-/*
-  copy 'from' to 'to' up to but not including 'upto'
-  return 0 if eos on from
-  return 1 if upto found
-
-  return 'to' at last char + 1
-  return 'from' at match + 1 or eos if no match
-
-  if as_dir == 1, change all '.' to '_'
-  else change all '.' but the last to '_'
-*/
-
-static int
-copyto (char **to, const char **from, char upto, int as_dir)
-{
-  const char *s;
-
-  s = strrchr (*from, '.');
-
-  while (**from)
-    {
-      if (**from == upto)
-       {
-         do
-           {
-             (*from)++;
-           }
-         while (**from == upto);
-         return 1;
-       }
-      if (**from == '.')
-       {
-         if ((as_dir == 1)
-             || (*from != s))
-           **to = '_';
-         else
-           **to = '.';
-       }
-      else
-       {
-#ifdef HAVE_CASE_INSENSITIVE_FS
-         if (isupper ((unsigned char)**from))
-           **to = tolower ((unsigned char)**from);
-         else
-#endif
-           **to = **from;
-       }
-      (*to)++;
-      (*from)++;
-    }
-
-  return 0;
-}
-
-
-/*
-  get translation of logical name
-
-*/
-
-static char *
-trnlog (const char *name)
-{
-  int stat;
-  static char reslt[1024];
-  $DESCRIPTOR (reslt_dsc, reslt);
-  short resltlen;
-  struct dsc$descriptor_s name_dsc;
-  char *s;
-
-  /*
-   * the string isn't changed, but there is no string descriptor with
-   * "const char *dsc$a_pointer"
-   */
-  INIT_DSC_CSTRING (name_dsc, (char *)name);
-
-  stat = lib$sys_trnlog (&name_dsc, &resltlen, &reslt_dsc);
-
-  if ((stat&1) == 0)
-    {
-      return "";
-    }
-  if (stat == SS$_NOTRAN)
-    {
-      return "";
-    }
-  reslt[resltlen] = '\0';
-
-  s = xmalloc (resltlen+1);
-  strcpy (s, reslt);
-  return s;
-}
-
-static char *
-showall (char *s)
-{
-  static char t[512];
-  char *pt;
-
-  pt = t;
-  if (strchr (s, '\\') == 0)
-    return s;
-  while (*s)
-    {
-      if (*s == '\\')
-       {
-         *pt++ = *s;
-       }
-      *pt++ = *s++;
-    }
-  return pt;
-}
-
-
-enum namestate { N_START, N_DEVICE, N_OPEN, N_DOT, N_CLOSED, N_DONE };
-
-/*
-  convert unix style name to vms style
-  type = 0 -> name is a full name (directory and filename part)
-  type = 1 -> name is a directory
-  type = 2 -> name is a filename without directory
-
-  The following conversions are applied
-                       (0)             (1)                     (2)
-       input           full name       dir name                file name
-
-1      ./              <cwd>           []                      <current directory>.dir
-2      ../             <home of cwd>   <home of cwd>           <home of cwd>.dir
-
-3      //              <dev of cwd>:   <dev of cwd>:[000000]   <dev of cwd>:000000.dir
-4      //a             a:              a:                      a:
-5      //a/            a:              a:                      a:000000.dir
-
-9      /               [000000]        [000000]                000000.dir
-10     /a              [000000]a       [a]                     [000000]a
-11     /a/             [a]             [a]                     [000000]a.dir
-12     /a/b            [a]b            [a.b]                   [a]b
-13     /a/b/           [a.b]           [a.b]                   [a]b.dir
-14     /a/b/c          [a.b]c          [a.b.c]                 [a.b]c
-15     /a/b/c/         [a.b.c]         [a.b.c]                 [a.b]c.dir
-
-16     a               a               [.a]                    a
-17     a/              [.a]            [.a]                    a.dir
-18     a/b             [.a]b           [.a.b]                  [.a]b
-19     a/b/            [.a.b]          [.a.b]                  [.a]b.dir
-20     a/b/c           [.a.b]c         [.a.b.c]                [.a.b]c
-21     a/b/c/          [.a.b.c]        [.a.b.c]                [.a.b]c.dir
-
-22     a.b.c           a_b.c           [.a_b_c]                a_b_c.dir
-
-23     [x][y]z         [x.y]z          [x.y]z                  [x.y]z
-24     [x][.y]z        [x.y]z          [x.y]z                  [x.y]z
-
-25  filenames with '$'  are left unchanged if they contain no '/'
-25  filenames with ':' are left unchanged
-26  filenames with a single pair of '[' ']' are left unchanged
-
-  The input string is not written to.  The result is also const because
-  it's a static buffer; we don't want to change it.
-*/
-
-const char *
-vmsify (const char *name, int type)
-{
-/* max 255 device
-   max 39 directory
-   max 39 filename
-   max 39 filetype
-   max 5 version
-*/
-/* todo: VMSMAXPATHLEN is defined for ODS2 names: it needs to be adjusted. */
-#define VMSMAXPATHLEN 512
-
-  enum namestate nstate;
-  static char vmsname[VMSMAXPATHLEN+1];
-  const char *fptr;
-  const char *t;
-  char *vptr;
-  int as_dir;
-  int count;
-  const char *s;
-  const char *s1;
-  const char *s2;
-
-  if (name == 0)
-    return 0;
-  fptr = name;
-  vptr = vmsname;
-  nstate = N_START;
-
-  /* case 25a */
-  t = strpbrk (name, "$:");
-
-  if (t != 0)
-    {
-//      const char *s1;
-//      const char *s2;
-
-      if (type == 1)
-        {
-          s1 = strchr (t+1, '[');
-          s2 = strchr (t+1, ']');
-        }
-
-      if (*t == '$')
-        {
-          if (strchr (name, '/') == 0)
-            {
-              strcpy (vmsname, name);
-              if ((type == 1) && (s1 != 0) && (s2 == 0))
-                strcat (vmsname, "]");
-              return vmsname;
-            }
-        }
-      else
-        {
-          strcpy (vmsname, name);
-          if ((type == 1) && (s1 != 0) && (s2 == 0))
-            strcat (vmsname, "]");
-          return vmsname;
-        }
-    }
-
-  /* case 26 */
-  t = strchr (name, '[');
-
-  if (t != 0)
-    {
-//      const char *s;
-//      const char *s1 = strchr (t+1, '[');
-      s1 = strchr (t+1, '[');
-      if (s1 == 0)
-       {
-          strcpy (vmsname, name);
-         if ((type == 1) && (strchr (t+1, ']') == 0))
-            strcat (vmsname, "]");
-          return vmsname;
-       }
-      s1--;
-      if (*s1 != ']')
-       {
-          strcpy (vmsname, name);
-         return vmsname;               /* not ][, keep unchanged */
-       }
-
-      /* we have ][ */
-
-      s = name;
-
-      /* s  -> starting char
-        s1 -> ending ']'  */
-      do
-       {
-         strncpy (vptr, s, s1-s);      /* copy up to but not including ']' */
-         vptr += s1-s;
-         if (*s1 == 0)
-           break;
-         s = s1 + 1;                   /* s -> char behind ']' */
-         if (*s != '[')                /* was '][' ? */
-           break;                      /* no, last ] found, exit */
-         s++;
-         if (*s != '.')
-           *vptr++ = '.';
-         s1 = strchr (s, ']');
-         if (s1 == 0)                  /* no closing ] */
-           s1 = s + strlen (s);
-       }
-      while (1);
-
-      *vptr++ = ']';
-
-      fptr = s;
-
-    }
-  else         /* no [ in name */
-    {
-      int state = 0;
-      int rooted = 1;  /* flag if logical is rooted, else insert [000000] */
-
-      do
-       {
-      switch (state)
-       {
-         case 0:                               /* start of loop */
-           if (*fptr == '/')
-             {
-               fptr++;
-               state = 1;
-             }
-           else if (*fptr == '.')
-             {
-               fptr++;
-               state = 10;
-             }
-           else
-             state = 2;
-           break;
-
-         case 1:                               /* '/' at start */
-           if (*fptr == '/')
-             {
-               fptr++;
-               state = 3;
-             }
-           else
-             state = 4;
-           break;
-
-         case 2:                               /* no '/' at start */
-            {
-            const char *s = strchr (fptr, '/');
-           if (s == 0)                 /* no '/' (16) */
-             {
-               if (type == 1)
-                 {
-                   strcpy (vptr, "[.");
-                   vptr += 2;
-                 }
-               copyto (&vptr, &fptr, 0, (type==1));
-               if (type == 1)
-                 *vptr++ = ']';
-               state = -1;
-             }
-           else                        /* found '/' (17..21) */
-             {
-               if ((type == 2)
-                   && (*(s+1) == 0))   /* 17(2) */
-                 {
-                   copyto (&vptr, &fptr, '/', 1);
-                   state = 7;
-                 }
-               else
-                 {
-                   strcpy (vptr, "[.");
-                   vptr += 2;
-                   copyto (&vptr, &fptr, '/', 1);
-                   nstate = N_OPEN;
-                   state = 9;
-                 }
-             }
-           break;
-            }
-
-         case 3:                               /* '//' at start */
-            {
-//            const char *s;
-//            const char *s1;
-            char *vp;
-           while (*fptr == '/')        /* collapse all '/' */
-             fptr++;
-           if (*fptr == 0)             /* just // */
-             {
-               char cwdbuf[VMSMAXPATHLEN+1];
-
-               s1 = getcwd(cwdbuf, VMSMAXPATHLEN);
-               if (s1 == 0)
-                 {
-                    vmsname[0] = '\0';
-                   return vmsname;     /* FIXME, err getcwd */
-                 }
-               s = strchr (s1, ':');
-               if (s == 0)
-                 {
-                    vmsname[0] = '\0';
-                   return vmsname;     /* FIXME, err no device */
-                 }
-               strncpy (vptr, s1, s-s1+1);
-               vptr += s-s1+1;
-               state = -1;
-               break;
-             }
-
-           s = vptr;
-
-           if (copyto (&vptr, &fptr, '/', 1) == 0)     /* copy device part */
-             {
-               *vptr++ = ':';
-               state = -1;
-               break;
-             }
-           *vptr = ':';
-           nstate = N_DEVICE;
-           if (*fptr == 0)     /* just '//a/' */
-             {
-               strcpy (vptr+1, "[000000]");
-               vptr += 9;
-               state = -1;
-               break;
-             }
-           *vptr = 0;
-                               /* check logical for [000000] insertion */
-           vp = trnlog (s);
-           if (*vp != '\0')
-             {                 /* found translation */
-               for (;;)        /* loop over all nested logicals */
-                 {
-                   char *vp2 = vp + strlen (vp) - 1;
-                   if (*vp2 == ':')    /* translation ends in ':' */
-                     {
-                       vp2 = trnlog (vp);
-                       free (vp);
-                       if (*vp2 == 0)
-                         {
-                           rooted = 0;
-                           break;
-                         }
-                       vp = vp2;
-                       continue;       /* next iteration */
-                     }
-                   if (*vp2 == ']')    /* translation ends in ']' */
-                     {
-                       if (*(vp2-1) == '.')    /* ends in '.]' */
-                         {
-                           if (strncmp (fptr, "000000", 6) != 0)
-                             rooted = 0;
-                         }
-                       else
-                         {
-                           strcpy (vmsname, s1);
-                           vp = strchr (vmsname, ']');
-                           *vp = '.';
-                           nstate = N_DOT;
-                           vptr = vp;
-                         }
-                     }
-                   break;
-                 }
-               free (vp);
-             }
-           else
-             rooted = 0;
-
-           if (*vptr == 0)
-             {
-               nstate = N_DEVICE;
-               *vptr++ = ':';
-             }
-           else
-             vptr++;
-
-           if (rooted == 0)
-             {
-               nstate = N_DOT;
-               strcpy (vptr, "[000000.");
-               vptr += 8;
-               vp = vptr-1;
-             }
-           else
-             vp = 0;
-
-            /* vp-> '.' after 000000 or NULL */
-
-           s = strchr (fptr, '/');
-           if (s == 0)
-             {                         /* no next '/' */
-               if (*(vptr-1) == '.')
-                 *(vptr-1) = ']';
-               else if (rooted == 0)
-                 *vptr++ = ']';
-               copyto (&vptr, &fptr, 0, (type == 1));
-               state = -1;
-               break;
-             }
-           else
-             {
-               while (*(s+1) == '/')   /* skip multiple '/' */
-                 s++;
-             }
-
-           if ((rooted != 0)
-               && (*(vptr-1) != '.'))
-             {
-               *vptr++ = '[';
-               nstate = N_DOT;
-             }
-           else
-             if ((nstate == N_DOT)
-                && (vp != 0)
-                && (*(s+1) == 0))
-               {
-                 if (type == 2)
-                   {
-                     *vp = ']';
-                     nstate = N_CLOSED;
-                   }
-               }
-           state = 9;
-           break;
-            }
-         case 4:                               /* single '/' at start (9..15) */
-           if (*fptr == 0)
-             state = 5;
-           else
-             state = 6;
-           break;
-
-         case 5:                               /* just '/' at start (9) */
-           if (type != 2)
-             {
-               *vptr++ = '[';
-               nstate = N_OPEN;
-             }
-           strcpy (vptr, "000000");
-           vptr += 6;
-           if (type == 2)
-             state = 7;
-           else
-             state = 8;
-           break;
-
-         case 6:               /* chars following '/' at start 10..15 */
-            {
-            const char *s;
-           *vptr++ = '[';
-           nstate = N_OPEN;
-           s = strchr (fptr, '/');
-           if (s == 0)                 /* 10 */
-             {
-               if (type != 1)
-                 {
-                   strcpy (vptr, "000000]");
-                   vptr += 7;
-                 }
-               copyto (&vptr, &fptr, 0, (type == 1));
-               if (type == 1)
-                 {
-                   *vptr++ = ']';
-                 }
-               state = -1;
-             }
-           else                        /* 11..15 */
-             {
-               if ( (type == 2)
-                  && (*(s+1) == 0))    /* 11(2) */
-                 {
-                   strcpy (vptr, "000000]");
-                   nstate = N_CLOSED;
-                   vptr += 7;
-                 }
-               copyto (&vptr, &fptr, '/', (*(vptr-1) != ']'));
-               state = 9;
-             }
-           break;
-            }
-
-         case 7:                               /* add '.dir' and exit */
-           if ((nstate == N_OPEN)
-               || (nstate == N_DOT))
-             {
-               char *vp = vptr-1;
-               while (vp > vmsname)
-                 {
-                   if (*vp == ']')
-                     {
-                       break;
-                     }
-                   if (*vp == '.')
-                     {
-                       *vp = ']';
-                       break;
-                     }
-                   vp--;
-                 }
-             }
-           strcpy (vptr, ".dir");
-           vptr += 4;
-           state = -1;
-           break;
-
-         case 8:                               /* add ']' and exit */
-           *vptr++ = ']';
-           state = -1;
-           break;
-
-         case 9:                       /* 17..21, fptr -> 1st '/' + 1 */
-            {
-            const char *s;
-           if (*fptr == 0)
-             {
-               if (type == 2)
-                 {
-                   state = 7;
-                 }
-               else
-                 state = 8;
-               break;
-             }
-           s = strchr (fptr, '/');
-           if (s == 0)
-             {
-               if (type != 1)
-                 {
-                   if (nstate == N_OPEN)
-                     {
-                       *vptr++ = ']';
-                       nstate = N_CLOSED;
-                     }
-                   as_dir = 0;
-                 }
-               else
-                 {
-                   if (nstate == N_OPEN)
-                     {
-                       *vptr++ = '.';
-                       nstate = N_DOT;
-                     }
-                   as_dir = 1;
-                 }
-             }
-           else
-             {
-               while (*(s+1) == '/')
-                 s++;
-               if ( (type == 2)
-                   && (*(s+1) == 0))           /* 19(2), 21(2)*/
-                 {
-                   if (nstate != N_CLOSED)
-                     {
-                       *vptr++ = ']';
-                       nstate = N_CLOSED;
-                     }
-                   as_dir = 1;
-                 }
-               else
-                 {
-                   if (nstate == N_OPEN)
-                     {
-                       *vptr++ = '.';
-                       nstate = N_DOT;
-                     }
-                   as_dir = 1;
-                 }
-             }
-           if ( (*fptr == '.')                 /* check for '..' or '../' */
-               && (*(fptr+1) == '.')
-               && ((*(fptr+2) == '/')
-                   || (*(fptr+2) == 0)) )
-             {
-                char *vp;
-               fptr += 2;
-               if (*fptr == '/')
-                 {
-                   do
-                     {
-                       fptr++;
-                     }
-                   while (*fptr == '/');
-                 }
-               else if (*fptr == 0)
-                 type = 1;
-               vptr--;                         /* vptr -> '.' or ']' */
-               vp = vptr;
-               for (;;)
-                 {
-                   vp--;
-                   if (*vp == '.')             /* one back */
-                     {
-                       vptr = vp;
-                       nstate = N_OPEN;
-                       break;
-                     }
-                   if (*vp == '[')             /* top level reached */
-                     {
-                       if (*fptr == 0)
-                         {
-                           strcpy (vp, "[000000]");
-                           vptr = vp + 8;
-                           nstate = N_CLOSED;
-                           s = 0;
-                           break;
-                         }
-                       else
-                         {
-                           vptr = vp+1;
-                           nstate = N_OPEN;
-                           break;
-                         }
-                     }
-                 }
-             }
-           else
-             {
-               copyto (&vptr, &fptr, '/', as_dir);
-               if (nstate == N_DOT)
-                 nstate = N_OPEN;
-             }
-           if (s == 0)
-             {                                 /* 18,20 */
-               if (type == 1)
-                 *vptr++ = ']';
-               state = -1;
-             }
-           else
-             {
-               if (*(s+1) == 0)
-                 {
-                   if (type == 2)              /* 19,21 */
-                     {
-                       state = 7;
-                     }
-                   else
-                     {
-                       *vptr++ = ']';
-                       state = -1;
-                     }
-                 }
-             }
-           break;
-            }
-
-         case 10:                              /* 1,2 first is '.' */
-           if (*fptr == '.')
-             {
-               fptr++;
-               state = 11;
-             }
-           else
-             state = 12;
-           break;
-
-         case 11:                              /* 2, '..' at start */
-           count = 1;
-           if (*fptr != 0)
-             {
-               if (*fptr != '/')               /* got ..xxx */
-                 {
-                    strcpy (vmsname, name);
-                   return vmsname;
-                 }
-               do                              /* got ../ */
-                 {
-                   fptr++;
-                   while (*fptr == '/') fptr++;
-                   if (*fptr != '.')
-                     break;
-                   if (*(fptr+1) != '.')
-                     break;
-                   fptr += 2;
-                   if ((*fptr == 0)
-                       || (*fptr == '/'))
-                     count++;
-                 }
-               while (*fptr == '/');
-             }
-           {                                   /* got '..' or '../' */
-              char *vp;
-             char cwdbuf[VMSMAXPATHLEN+1];
-
-             vp = getcwd(cwdbuf, VMSMAXPATHLEN);
-             if (vp == 0)
-               {
-                  vmsname[0] = '\0';
-                 return vmsname;    /* FIXME, err getcwd */
-               }
-             strcpy (vptr, vp);
-             vp = strchr (vptr, ']');
-             if (vp != 0)
-               {
-                 nstate = N_OPEN;
-                 while (vp > vptr)
-                   {
-                     vp--;
-                     if (*vp == '[')
-                       {
-                         vp++;
-                         strcpy (vp, "000000]");
-                         state = -1;
-                         break;
-                       }
-                     else if (*vp == '.')
-                       {
-                         if (--count == 0)
-                           {
-                             if (*fptr == 0)   /* had '..' or '../' */
-                               {
-                                 *vp++ = ']';
-                                 state = -1;
-                               }
-                             else                      /* had '../xxx' */
-                               {
-                                 state = 9;
-                               }
-                             *vp = '\0';
-                             break;
-                           }
-                       }
-                   }
-               }
-             vptr += strlen (vptr);
-           }
-           break;
-
-         case 12:                              /* 1, '.' at start */
-           if (*fptr != 0)
-             {
-               if (*fptr != '/')
-                 {
-                    strcpy (vmsname, name);
-                   return vmsname;
-                 }
-               while (*fptr == '/')
-                 fptr++;
-             }
-
-           {
-              char *vp;
-             char cwdbuf[VMSMAXPATHLEN+1];
-
-             vp = getcwd(cwdbuf, VMSMAXPATHLEN);
-             if (vp == 0)
-               {
-                  vmsname[0] = '\0';
-                 return vmsname;    /*FIXME, err getcwd */
-               }
-             strcpy (vptr, vp);
-            }
-            if (*fptr == 0)
-              {
-                state = -1;
-                break;
-              }
-            else
-              {
-                char *vp = strchr (vptr, ']');
-                if (vp == 0)
-                  {
-                    state = -1;
-                    break;
-                  }
-                *vp = '\0';
-                nstate = N_OPEN;
-                vptr += strlen (vptr);
-                state = 9;
-              }
-           break;
-       }
-
-       }
-      while (state > 0);
-
-
-    }
-
-
-  /* directory conversion done
-     fptr -> filename part of input string
-     vptr -> free space in vmsname
-  */
-
-  *vptr++ = 0;
-
-  return vmsname;
-}
-
-
-
-/*
-  convert from vms-style to unix-style
-
-  dev:[dir1.dir2]      //dev/dir1/dir2/
-*/
-
-const char *
-unixify (const char *name)
-{
-  static char piece[512];
-  const char *s;
-  char *p;
-
-  if (strchr (name, '/') != 0)         /* already in unix style */
-    {
-      strcpy (piece, name);
-      return piece;
-    }
-
-  p = piece;
-  *p = 0;
-
-  /* device part */
-
-  s = strchr (name, ':');
-
-  if (s != 0)
-    {
-      int l = s - name;
-      *p++ = '/';
-      *p++ = '/';
-      strncpy (p, name, l);
-      p += l;
-    }
-
-  /* directory part */
-
-  *p++ = '/';
-  s = strchr (name, '[');
-
-  if (s != 0)
-    {
-      s++;
-      switch (*s)
-        {
-         case ']':             /* [] */
-           strcat (p, "./");
-           break;
-         case '-':             /* [- */
-           strcat (p, "../");
-           break;
-         case '.':
-           strcat (p, "./");   /* [. */
-           break;
-         default:
-           s--;
-           break;
-        }
-      s++;
-      while (*s)
-        {
-         if (*s == '.')
-           *p++ = '/';
-         else
-           *p++ = *s;
-         s++;
-         if (*s == ']')
-           {
-             s++;
-             break;
-           }
-        }
-      if (*s != 0)             /* more after ']' ?? */
-        {
-         if (*(p-1) != '/')
-           *p++ = '/';
-         strcpy (p, s);                /* copy it anyway */
-        }
-    }
-
-  else         /* no '[' anywhere */
-
-    {
-      *p++ = 0;
-    }
-
-  /* force end with '/' */
-
-  if (*(p-1) != '/')
-    *p++ = '/';
-  *p = 0;
-
-  return piece;
-}
-
-/* EOF */
diff --git a/vmsjobs.c b/vmsjobs.c
deleted file mode 100644 (file)
index f45c8a8..0000000
--- a/vmsjobs.c
+++ /dev/null
@@ -1,1468 +0,0 @@
-/* --------------- Moved here from job.c ---------------
-   This file must be #included in job.c, as it accesses static functions.
-
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include <string.h>
-#include <descrip.h>
-#include <clidef.h>
-
-/* TODO - VMS specific header file conditionally included in makeint.h */
-
-#include <stsdef.h>
-#include <ssdef.h>
-void
-decc$exit (int status);
-
-/* Lowest legal non-success VMS exit code is 8 */
-/* GNU make only defines codes 0, 1, 2 */
-/* So assume any exit code > 8 is a VMS exit code */
-
-#ifndef MAX_EXPECTED_EXIT_CODE
-# define MAX_EXPECTED_EXIT_CODE 7
-#endif
-
-
-#if __CRTL_VER >= 70302000 && !defined(__VAX)
-# define MAX_DCL_LINE_LENGTH 4095
-# define MAX_DCL_CMD_LINE_LENGTH 8192
-#else
-# define MAX_DCL_LINE_LENGTH 255
-# define MAX_DCL_CMD_LINE_LENGTH 1024
-#endif
-#define MAX_DCL_TOKEN_LENGTH 255
-#define MAX_DCL_TOKENS 127
-
-enum auto_pipe { nopipe, add_pipe, dcl_pipe };
-
-char *vmsify (char *name, int type);
-
-static int vms_jobsefnmask = 0;
-
-/* returns whether path is assumed to be a unix like shell. */
-int
-_is_unixy_shell (const char *path)
-{
-  return vms_gnv_shell;
-}
-
-#define VMS_GETMSG_MAX 256
-static char vms_strsignal_text[VMS_GETMSG_MAX + 2];
-
-char *
-vms_strsignal (int status)
-{
-  if (status <= MAX_EXPECTED_EXIT_CODE)
-    sprintf (vms_strsignal_text, "lib$spawn returned %x", status);
-  else
-    {
-      int vms_status;
-      unsigned short * msg_len;
-      unsigned char out[4];
-      vms_status = SYS$GETMSG (status, &msg_len,
-                               vms_strsignal_text, 7, *out);
-    }
-
-  return vms_strsignal_text;
-}
-
-
-/* Wait for nchildren children to terminate */
-static void
-vmsWaitForChildren (int *status)
-{
-  while (1)
-    {
-      if (!vms_jobsefnmask)
-        {
-          *status = 0;
-          return;
-        }
-
-      *status = sys$wflor (32, vms_jobsefnmask);
-    }
-  return;
-}
-
-static int ctrlYPressed= 0;
-/* This is called at main or AST level. It is at AST level for DONTWAITFORCHILD
-   and at main level otherwise. In any case it is called when a child process
-   terminated. At AST level it won't get interrupted by anything except a
-   inner mode level AST.
-*/
-static int
-vmsHandleChildTerm (struct child *child)
-{
-  int exit_code;
-  register struct child *lastc, *c;
-  int child_failed;
-
-  /* The child efn is 0 when a built-in or null command is executed
-     successfully with out actually creating a child.
-  */
-  if (child->efn > 0)
-  {
-    vms_jobsefnmask &= ~(1 << (child->efn - 32));
-
-    lib$free_ef (&child->efn);
-  }
-  if (child->comname)
-    {
-      if (!ISDB (DB_JOBS) && !ctrlYPressed)
-        unlink (child->comname);
-      free (child->comname);
-    }
-
-  (void) sigblock (fatal_signal_mask);
-
-  /* First check to see if this is a POSIX exit status and handle */
-  if ((child->cstatus & VMS_POSIX_EXIT_MASK) == VMS_POSIX_EXIT_MASK)
-    {
-      exit_code = (child->cstatus >> 3) & 255;
-      if (exit_code != MAKE_SUCCESS)
-        child_failed = 1;
-    }
-  else
-    {
-      child_failed = !$VMS_STATUS_SUCCESS (child->cstatus);
-      if (child_failed)
-        exit_code = child->cstatus;
-    }
-
-  /* Search for a child matching the deceased one.  */
-  lastc = 0;
-#if defined(RECURSIVEJOBS)
-  /* I've had problems with recursive stuff and process handling */
-  for (c = children; c != 0 && c != child; lastc = c, c = c->next)
-    ;
-#else
-  c = child;
-#endif
-
-  if ($VMS_STATUS_SUCCESS (child->vms_launch_status))
-    {
-      /* Convert VMS success status to 0 for UNIX code to be happy */
-      child->vms_launch_status = 0;
-    }
-
-  /* Set the state flag to say the commands have finished.  */
-  c->file->command_state = cs_finished;
-  notice_finished_file (c->file);
-
-  (void) sigsetmask (sigblock (0) & ~(fatal_signal_mask));
-
-  return 1;
-}
-
-/* VMS:
-   Spawn a process executing the command in ARGV and return its pid. */
-
-/* local helpers to make ctrl+c and ctrl+y working, see below */
-#include <iodef.h>
-#include <libclidef.h>
-#include <ssdef.h>
-
-static int ctrlMask= LIB$M_CLI_CTRLY;
-static int oldCtrlMask;
-static int setupYAstTried= 0;
-static unsigned short int chan= 0;
-
-static void
-reEnableAst(void)
-{
-  lib$enable_ctrl (&oldCtrlMask,0);
-}
-
-static int
-astYHandler (void)
-{
-  struct child *c;
-  for (c = children; c != 0; c = c->next)
-    sys$delprc (&c->pid, 0, 0);
-  ctrlYPressed= 1;
-  kill (getpid(),SIGQUIT);
-  return SS$_NORMAL;
-}
-
-static void
-tryToSetupYAst(void)
-{
-  $DESCRIPTOR(inputDsc,"SYS$COMMAND");
-  int     status;
-  struct {
-    short int       status, count;
-    int     dvi;
-  } iosb;
-  unsigned short int loc_chan;
-
-  setupYAstTried++;
-
-  if (chan)
-    loc_chan= chan;
-  else
-    {
-      status= sys$assign(&inputDsc,&loc_chan,0,0);
-      if (!(status&SS$_NORMAL))
-        {
-          lib$signal(status);
-          return;
-        }
-    }
-  status= sys$qiow (0, loc_chan, IO$_SETMODE|IO$M_CTRLYAST,&iosb,0,0,
-                    astYHandler,0,0,0,0,0);
-  if (status==SS$_NORMAL)
-    status= iosb.status;
-  if (status!=SS$_NORMAL)
-    {
-      if (!chan)
-        sys$dassgn(loc_chan);
-      if (status!=SS$_ILLIOFUNC && status!=SS$_NOPRIV)
-        lib$signal(status);
-      return;
-    }
-
-  /* called from AST handler ? */
-  if (setupYAstTried>1)
-    return;
-  if (atexit(reEnableAst))
-    fprintf (stderr,
-             _("-warning, you may have to re-enable CTRL-Y handling from DCL.\n"));
-  status= lib$disable_ctrl (&ctrlMask, &oldCtrlMask);
-  if (!(status&SS$_NORMAL))
-    {
-      lib$signal(status);
-      return;
-    }
-  if (!chan)
-    chan = loc_chan;
-}
-
-/* Check if a token is too long */
-#define INC_TOKEN_LEN_OR_RETURN(x) {token->length++; \
-  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
-    { token->cmd_errno = ERANGE; return x; }}
-
-#define INC_TOKEN_LEN_OR_BREAK {token->length++; \
-  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
-    { token->cmd_errno = ERANGE; break; }}
-
-#define ADD_TOKEN_LEN_OR_RETURN(add_len, x) {token->length += add_len; \
-  if (token->length >= MAX_DCL_TOKEN_LENGTH) \
-    { token->cmd_errno = ERANGE; return x; }}
-
-/* Check if we are out of space for more tokens */
-#define V_NEXT_TOKEN { if (cmd_tkn_index < MAX_DCL_TOKENS) \
-  cmd_tokens[++cmd_tkn_index] = NULL; \
-  else { token.cmd_errno = E2BIG; break; } \
-  token.length = 0;}
-
-
-#define UPDATE_TOKEN {cmd_tokens[cmd_tkn_index] = strdup(token.text); \
-  V_NEXT_TOKEN;}
-
-#define EOS_ERROR(x) { if (*x == 0) { token->cmd_errno = ERANGE; break; }}
-
-struct token_info
-  {
-    char *text;       /* Parsed text */
-    int length;       /* Length of parsed text */
-    char *src;        /* Pointer to source text */
-    int cmd_errno;    /* Error status of parse */
-    int use_cmd_file; /* Force use of a command file */
-  };
-
-
-/* Extract a Posix single quoted string from input line */
-static char *
-posix_parse_sq (struct token_info *token)
-{
-  /* A Posix quoted string with no expansion unless in a string
-     Unix simulation means no lexical functions present.
-  */
-  char * q;
-  char * p;
-  q = token->text;
-  p = token->src;
-
-  *q++ = '"';
-  p++;
-  INC_TOKEN_LEN_OR_RETURN (p);
-
-  while (*p != '\'' && (token->length < MAX_DCL_TOKEN_LENGTH))
-    {
-      EOS_ERROR (p);
-      if (*p == '"')
-        {
-          /* Embedded double quotes need to be doubled */
-          *q++ = '"';
-          INC_TOKEN_LEN_OR_BREAK;
-          *q = '"';
-        }
-      else
-        *q = *p;
-
-      q++;
-      p++;
-      INC_TOKEN_LEN_OR_BREAK;
-    }
-  *q++ = '"';
-  p++;
-  INC_TOKEN_LEN_OR_RETURN (p);
-  *q = 0;
-  return p;
-}
-
-/* Extract a Posix double quoted string from input line */
-static char *
-posix_parse_dq (struct token_info *token)
-{
-  /* Unix mode:  Any imbedded \" becomes doubled.
-                 \t is tab, \\, \$ leading character stripped.
-                 $ character replaced with \' unless escaped.
-  */
-  char * q;
-  char * p;
-  q = token->text;
-  p = token->src;
-  *q++ = *p++;
-  INC_TOKEN_LEN_OR_RETURN (p);
-  while (*p != 0)
-    {
-      if (*p == '\\')
-        {
-          switch(p[1])
-            {
-            case 't':     /* Convert tabs */
-              *q = '\t';
-              p++;
-              break;
-            case '\\':     /* Just remove leading backslash */
-            case '$':
-              p++;
-              *q = *p;
-              break;
-            case '"':
-              p++;
-              *q = *p;
-              *q++ = '"';
-              INC_TOKEN_LEN_OR_BREAK;
-            default:      /* Pass through unchanged */
-              *q++ = *p++;
-              INC_TOKEN_LEN_OR_BREAK;
-            }
-          INC_TOKEN_LEN_OR_BREAK;
-        }
-      else if (*p == '$' && isalpha (p[1]))
-        {
-          /* A symbol we should be able to substitute */
-          *q++ = '\'';
-          INC_TOKEN_LEN_OR_BREAK;
-          *q = '\'';
-          INC_TOKEN_LEN_OR_BREAK;
-          token->use_cmd_file = 1;
-        }
-      else
-        {
-          *q = *p;
-          INC_TOKEN_LEN_OR_BREAK;
-          if (*p == '"')
-            {
-              p++;
-              q++;
-              break;
-            }
-        }
-      p++;
-      q++;
-    }
-  *q = 0;
-  return p;
-}
-
-/* Extract a VMS quoted string or substitution string from input line */
-static char *
-vms_parse_quotes (struct token_info *token)
-{
-  /* VMS mode, the \' means that a symbol substitution is starting
-     so while you might think you can just copy until the next
-     \'.  Unfortunately the substitution can be a lexical function
-     which can contain embedded strings and lexical functions.
-     Messy, so both types need to be handled together.
-  */
-  char * q;
-  char * p;
-  q = token->text;
-  p = token->src;
-  int parse_level[MAX_DCL_TOKENS + 1];
-  int nest = 0;
-
-  parse_level[0] = *p;
-  if (parse_level[0] == '\'')
-    token->use_cmd_file = 1;
-
-  *q++ = *p++;
-  INC_TOKEN_LEN_OR_RETURN (p);
-
-
-  /* Copy everything until after the next single quote at nest == 0 */
-  while (token->length < MAX_DCL_TOKEN_LENGTH)
-    {
-      EOS_ERROR (p);
-      *q = *p;
-      INC_TOKEN_LEN_OR_BREAK;
-      if ((*p == parse_level[nest]) && (p[1] != '"'))
-        {
-          if (nest == 0)
-            {
-              *q++ = *p++;
-              break;
-            }
-          nest--;
-        }
-      else
-        {
-          switch(*p)
-            {
-            case '\\':
-              /* Handle continuation on to next line */
-              if (p[1] != '\n')
-                break;
-              p++;
-              p++;
-              *q = *p;
-              break;
-            case '(':
-              /* Parenthesis only in single quote level */
-              if (parse_level[nest] == '\'')
-                {
-                  nest++;
-                  parse_level[nest] == ')';
-                }
-              break;
-            case '"':
-              /* Double quotes only in parenthesis */
-              if (parse_level[nest] == ')')
-                {
-                  nest++;
-                  parse_level[nest] == '"';
-                }
-              break;
-            case '\'':
-              /* Symbol substitution ony in double quotes */
-              if ((p[1] == '\'') && (parse_level[nest] == '"'))
-                {
-                  nest++;
-                  parse_level[nest] == '\'';
-                  *p++ = *q++;
-                  token->use_cmd_file = 1;
-                  INC_TOKEN_LEN_OR_BREAK;
-                  break;
-                }
-              *q = *p;
-            }
-        }
-      p++;
-      q++;
-      /* Pass through doubled double quotes */
-      if ((*p == '"') && (p[1] == '"') && (parse_level[nest] == '"'))
-      {
-        *p++ = *q++;
-        INC_TOKEN_LEN_OR_BREAK;
-        *p++ = *q++;
-        INC_TOKEN_LEN_OR_BREAK;
-      }
-    }
-  *q = 0;
-  return p;
-}
-
-/* Extract a $ string from the input line */
-static char *
-posix_parse_dollar (struct token_info *token)
-{
-  /* $foo becomes 'foo' */
-  char * q;
-  char * p;
-  q = token->text;
-  p = token->src;
-  token->use_cmd_file = 1;
-
-  p++;
-  *q++ = '\'';
-  INC_TOKEN_LEN_OR_RETURN (p);
-
-  while ((isalnum (*p)) || (*p == '_'))
-    {
-      *q++ = *p++;
-      INC_TOKEN_LEN_OR_BREAK;
-    }
-  *q++ = '\'';
-  while (1)
-    {
-      INC_TOKEN_LEN_OR_BREAK;
-      break;
-    }
-  *q = 0;
-  return p;
-}
-
-const char *vms_filechars = "0123456789abcdefghijklmnopqrstuvwxyz" \
-   "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]<>:/_-.$";
-
-/* Simple text copy */
-static char *
-parse_text (struct token_info *token, int assignment_hack)
-{
-  char * q;
-  char * p;
-  int str_len;
-  q = token->text;
-  p = token->src;
-
-  /* If assignment hack, then this text needs to be double quoted. */
-  if (vms_unix_simulation && (assignment_hack == 2))
-    {
-      *q++ = '"';
-      INC_TOKEN_LEN_OR_RETURN (p);
-    }
-
-  *q++ = *p++;
-  INC_TOKEN_LEN_OR_RETURN (p);
-
-  while (*p != 0)
-    {
-      str_len = strspn (p, vms_filechars);
-      if (str_len == 0)
-        {
-          /* Pass through backslash escapes in Unix simulation
-             probably will not work anyway.
-             All any character after a ^ otherwise to support EFS.
-          */
-          if (vms_unix_simulation && (p[0] == '\\') && (p[1] != 0))
-            str_len = 2;
-          else if ((p[0] == '^') && (p[1] != 0))
-            str_len = 2;
-          else if (!vms_unix_simulation && (p[0] == ';'))
-            str_len = 1;
-
-          if (str_len == 0)
-            {
-              /* If assignment hack, then this needs to be double quoted. */
-              if (vms_unix_simulation && (assignment_hack == 2))
-              {
-                *q++ = '"';
-                INC_TOKEN_LEN_OR_RETURN (p);
-              }
-              *q = 0;
-              return p;
-            }
-        }
-      if (str_len > 0)
-        {
-          ADD_TOKEN_LEN_OR_RETURN (str_len, p);
-          strncpy (q, p, str_len);
-          p += str_len;
-          q += str_len;
-          *q = 0;
-        }
-    }
-  /* If assignment hack, then this text needs to be double quoted. */
-  if (vms_unix_simulation && (assignment_hack == 2))
-    {
-      *q++ = '"';
-      INC_TOKEN_LEN_OR_RETURN (p);
-    }
-  return p;
-}
-
-/* single character copy */
-static char *
-parse_char (struct token_info *token, int count)
-{
-  char * q;
-  char * p;
-  q = token->text;
-  p = token->src;
-
-  while (count > 0)
-    {
-      *q++ = *p++;
-      INC_TOKEN_LEN_OR_RETURN (p);
-      count--;
-    }
-  *q = 0;
-  return p;
-}
-
-/* Build a command string from the collected tokens
-   and process built-ins now
-*/
-static struct dsc$descriptor_s *
-build_vms_cmd (char **cmd_tokens,
-               enum auto_pipe use_pipe_cmd,
-               int append_token)
-{
-  struct dsc$descriptor_s *cmd_dsc;
-  int cmd_tkn_index;
-  char * cmd;
-  int cmd_len;
-  int semicolon_seen;
-
-  cmd_tkn_index = 0;
-  cmd_dsc = xmalloc (sizeof (struct dsc$descriptor_s));
-
-  /* Empty command? */
-  if (cmd_tokens[0] == NULL)
-    {
-      cmd_dsc->dsc$a_pointer = NULL;
-      cmd_dsc->dsc$w_length = 0;
-      return cmd_dsc;
-    }
-
-  /* Max DCL command + 1 extra token and trailing space */
-  cmd = xmalloc (MAX_DCL_CMD_LINE_LENGTH + 256);
-
-  cmd[0] = '$';
-  cmd[1] = 0;
-  cmd_len = 1;
-
-  /* Handle real or auto-pipe */
-  if (use_pipe_cmd == add_pipe)
-    {
-      /* We need to auto convert to a pipe command */
-      strcat (cmd, "pipe ");
-      cmd_len += 5;
-    }
-
-  semicolon_seen = 0;
-  while (cmd_tokens[cmd_tkn_index] != NULL)
-    {
-
-      /* Check for buffer overflow */
-      if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-        {
-          errno = E2BIG;
-          break;
-        }
-
-      /* Eliminate double ';' */
-      if (semicolon_seen && (cmd_tokens[cmd_tkn_index][0] == ';'))
-        {
-          semicolon_seen = 0;
-          free (cmd_tokens[cmd_tkn_index++]);
-          if (cmd_tokens[cmd_tkn_index] == NULL)
-            break;
-        }
-
-      /* Special handling for CD built-in */
-      if (strncmp (cmd_tokens[cmd_tkn_index], "builtin_cd", 11) == 0)
-        {
-          int result;
-          semicolon_seen = 0;
-          free (cmd_tokens[cmd_tkn_index]);
-          cmd_tkn_index++;
-          if (cmd_tokens[cmd_tkn_index] == NULL)
-            break;
-          DB(DB_JOBS, (_("BUILTIN CD %s\n"), cmd_tokens[cmd_tkn_index]));
-
-          /* TODO: chdir fails with some valid syntaxes */
-          result = chdir (cmd_tokens[cmd_tkn_index]);
-          if (result != 0)
-            {
-              /* TODO: Handle failure better */
-              free (cmd);
-              while (cmd_tokens[cmd_tkn_index] == NULL)
-                free (cmd_tokens[cmd_tkn_index++]);
-              cmd_dsc->dsc$w_length = -1;
-              cmd_dsc->dsc$a_pointer = NULL;
-              return cmd_dsc;
-            }
-        }
-      else if (strncmp (cmd_tokens[cmd_tkn_index], "exit", 5) == 0)
-        {
-          /* Copy the exit command */
-          semicolon_seen = 0;
-          strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
-          cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
-          free (cmd_tokens[cmd_tkn_index++]);
-          if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-            {
-              errno = E2BIG;
-              break;
-            }
-
-          /* Optional whitespace */
-          if (isspace (cmd_tokens[cmd_tkn_index][0]))
-            {
-              strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
-              cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
-              free (cmd_tokens[cmd_tkn_index++]);
-              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-              {
-                errno = E2BIG;
-                break;
-              }
-            }
-
-          /* There should be a status, but it is optional */
-          if (cmd_tokens[cmd_tkn_index][0] == ';')
-            continue;
-
-          /* If Unix simulation, add '((' */
-          if (vms_unix_simulation)
-            {
-              strcpy (&cmd[cmd_len], "((");
-              cmd_len += 2;
-              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-                {
-                  errno = E2BIG;
-                  break;
-                }
-            }
-
-          /* Add the parameter */
-          strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
-          cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
-          free (cmd_tokens[cmd_tkn_index++]);
-          if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-            {
-              errno = E2BIG;
-              break;
-            }
-
-          /* Add " * 8) .and. %x7f8) .or. %x1035a002" */
-          if (vms_unix_simulation)
-            {
-              const char *end_str = " * 8) .and. %x7f8) .or. %x1035a002";
-              strcpy (&cmd[cmd_len], end_str);
-              cmd_len += strlen (end_str);
-              if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-                {
-                  errno = E2BIG;
-                  break;
-                }
-            }
-          continue;
-        }
-
-      /* auto pipe needs spaces before semicolon */
-      if (use_pipe_cmd == add_pipe)
-        if (cmd_tokens[cmd_tkn_index][0] == ';')
-          {
-            cmd[cmd_len++] = ' ';
-            semicolon_seen = 1;
-            if (cmd_len > MAX_DCL_CMD_LINE_LENGTH)
-              {
-                errno = E2BIG;
-                break;
-              }
-          }
-        else
-          {
-            char ch;
-            ch = cmd_tokens[cmd_tkn_index][0];
-            if (!(ch == ' ' || ch == '\t'))
-              semicolon_seen = 0;
-          }
-
-      strcpy (&cmd[cmd_len], cmd_tokens[cmd_tkn_index]);
-      cmd_len += strlen (cmd_tokens[cmd_tkn_index]);
-
-      free (cmd_tokens[cmd_tkn_index++]);
-
-      /* Skip the append tokens if they exist */
-      if (cmd_tkn_index == append_token)
-        {
-          free (cmd_tokens[cmd_tkn_index++]);
-          if (isspace (cmd_tokens[cmd_tkn_index][0]))
-            free (cmd_tokens[cmd_tkn_index++]);
-          free (cmd_tokens[cmd_tkn_index++]);
-        }
-    }
-
-  cmd[cmd_len] = 0;
-  cmd_dsc->dsc$w_length = cmd_len;
-  cmd_dsc->dsc$a_pointer = cmd;
-  cmd_dsc->dsc$b_dtype = DSC$K_DTYPE_T;
-  cmd_dsc->dsc$b_class = DSC$K_CLASS_S;
-
-  return cmd_dsc;
-}
-
-int
-child_execute_job (struct child *child, char *argv)
-{
-  int i;
-
-  static struct dsc$descriptor_s *cmd_dsc;
-  static struct dsc$descriptor_s pnamedsc;
-  int spflags = CLI$M_NOWAIT;
-  int status;
-  int comnamelen;
-  char procname[100];
-
-  char *p;
-  char *cmd_tokens[(MAX_DCL_TOKENS * 2) + 1]; /* whitespace does not count */
-  char token_str[MAX_DCL_TOKEN_LENGTH + 1];
-  struct token_info token;
-  int cmd_tkn_index;
-  int paren_level = 0;
-  enum auto_pipe use_pipe_cmd = nopipe;
-  int append_token = -1;
-  char *append_file = NULL;
-  int unix_echo_cmd = 0;  /* Special handle Unix echo command */
-  int assignment_hack = 0; /* Handle x=y command as piped command */
-
-  /* Parse IO redirection.  */
-
-  child->comname = NULL;
-
-  DB (DB_JOBS, ("child_execute_job (%s)\n", argv));
-
-  while (isspace ((unsigned char)*argv))
-    argv++;
-
-  if (*argv == 0)
-    {
-      /* Only a built-in or a null command - Still need to run term AST */
-      child->cstatus = VMS_POSIX_EXIT_MASK;
-      child->vms_launch_status = SS$_NORMAL;
-      /* TODO what is this "magic number" */
-      child->pid = 270163; /* Special built-in */
-      child->efn = 0;
-      vmsHandleChildTerm (child);
-      return 1;
-    }
-
-  sprintf (procname, "GMAKE_%05x", getpid () & 0xfffff);
-  pnamedsc.dsc$w_length = strlen (procname);
-  pnamedsc.dsc$a_pointer = procname;
-  pnamedsc.dsc$b_dtype = DSC$K_DTYPE_T;
-  pnamedsc.dsc$b_class = DSC$K_CLASS_S;
-
-  /* Old */
-  /* Handle comments and redirection.
-     For ONESHELL, the redirection must be on the first line. Any other
-     redirection token is handled by DCL, that is, the pipe command with
-     redirection can be used, but it should not be used on the first line
-     for ONESHELL. */
-
-  /* VMS parser notes:
-     1. A token is any of DCL verbs, qualifiers, parameters, or punctuation.
-     2. Only MAX_DCL_TOKENS per line in both one line or command file mode.
-     3. Each token limited to MAC_DCL_TOKEN_LENGTH
-     4. If the line to DCL is greater than MAX_DCL_LINE_LENGTH then a
-        command file must be used.
-     5. Currently a command file must be used symbol substitution is to
-        be performed.
-     6. Currently limiting command files to 2 * MAX_DCL_TOKENS.
-
-     Build both a command file token list and command line token list
-     until it is determined that the command line limits are exceeded.
-  */
-
-  cmd_tkn_index = 0;
-  cmd_tokens[cmd_tkn_index] = NULL;
-  p = argv;
-
-  token.text = token_str;
-  token.length = 0;
-  token.cmd_errno = 0;
-  token.use_cmd_file = 0;
-
-  while (*p != 0)
-    {
-      /* We can not build this command so give up */
-      if (token.cmd_errno != 0)
-        break;
-
-      token.src = p;
-
-      switch (*p)
-        {
-        case '\'':
-          if (vms_unix_simulation || unix_echo_cmd)
-            {
-              p = posix_parse_sq (&token);
-              UPDATE_TOKEN;
-              break;
-            }
-
-          /* VMS mode, the \' means that a symbol substitution is starting
-             so while you might think you can just copy until the next
-             \'.  Unfortunately the substitution can be a lexical function
-             which can contain embedded strings and lexical functions.
-             Messy.
-          */
-          p = vms_parse_quotes (&token);
-          UPDATE_TOKEN;
-          break;
-        case '"':
-          if (vms_unix_simulation)
-            {
-              p = posix_parse_dq (&token);
-              UPDATE_TOKEN;
-              break;
-            }
-
-          /* VMS quoted string, can contain lexical functions with
-             quoted strings and nested lexical functions.
-          */
-          p = vms_parse_quotes (&token);
-          UPDATE_TOKEN;
-          break;
-
-        case '$':
-          if (vms_unix_simulation)
-            {
-              p = posix_parse_dollar (&token);
-              UPDATE_TOKEN;
-              break;
-            }
-
-          /* Otherwise nothing special */
-          p = parse_text (&token, 0);
-          UPDATE_TOKEN;
-          break;
-        case '\\':
-          if (p[1] == '\n')
-            {
-              /* Line continuation, remove it */
-              p += 2;
-              break;
-            }
-
-          /* Ordinary character otherwise */
-          if (assignment_hack != 0)
-            assignment_hack++;
-          if (assignment_hack > 2)
-            {
-              assignment_hack = 0;          /* Reset */
-              if (use_pipe_cmd == nopipe)   /* force pipe use */
-                use_pipe_cmd = add_pipe;
-              token_str[0] = ';';              /* add ; token */
-              token_str[1] = 0;
-              UPDATE_TOKEN;
-            }
-          p = parse_text (&token, assignment_hack);
-          UPDATE_TOKEN;
-          break;
-        case '!':
-        case '#':
-          /* Unix '#' is VMS '!' which comments out the rest of the line.
-             Historically the rest of the line has been skipped.
-             Not quite the right thing to do, as the f$verify lexical
-             function works in comments.  But this helps keep the line
-             lengths short.
-          */
-          unix_echo_cmd = 0;
-          while (*p != '\n' && *p != 0)
-            p++;
-          break;
-        case '(':
-          /* Subshell, equation, or lexical function argument start */
-          p = parse_char (&token, 1);
-          UPDATE_TOKEN;
-          paren_level++;
-          break;
-        case ')':
-          /* Close out a paren level */
-          p = parse_char (&token, 1);
-          UPDATE_TOKEN;
-          paren_level--;
-          /* TODO: Should we diagnose if paren_level goes negative? */
-          break;
-        case '&':
-          if (isalpha (p[1]) && !vms_unix_simulation)
-            {
-              /* VMS symbol substitution */
-              p = parse_text (&token, 0);
-              token.use_cmd_file = 1;
-              UPDATE_TOKEN;
-              break;
-            }
-          if (use_pipe_cmd == nopipe)
-            use_pipe_cmd = add_pipe;
-          if (p[1] != '&')
-            p = parse_char (&token, 1);
-          else
-            p = parse_char (&token, 2);
-          UPDATE_TOKEN;
-          break;
-        case '|':
-          if (use_pipe_cmd == nopipe)
-            use_pipe_cmd = add_pipe;
-          if (p[1] != '|')
-            p = parse_char (&token, 1);
-          else
-            p = parse_char (&token, 2);
-          UPDATE_TOKEN;
-          break;
-        case ';':
-          /* Separator - convert to a pipe command. */
-          unix_echo_cmd = 0;
-        case '<':
-          if (use_pipe_cmd == nopipe)
-            use_pipe_cmd = add_pipe;
-          p = parse_char (&token, 1);
-          UPDATE_TOKEN;
-          break;
-        case '>':
-          if (use_pipe_cmd == nopipe)
-            use_pipe_cmd = add_pipe;
-          if (p[1] == '>')
-            {
-              /* Parsing would have been simple until support for the >>
-                 append redirect was added.
-                 Implementation needs:
-                 * if not exist output file create empty
-                 * open/append gnv$make_temp??? output_file
-                 * define/user sys$output gnv$make_temp???
-                 ** And all this done before the command previously tokenized.
-                 * command previously tokenized
-                 * close gnv$make_temp???
-              */
-              p = parse_char (&token, 2);
-              append_token = cmd_tkn_index;
-              token.use_cmd_file = 1;
-            }
-          else
-            p = parse_char (&token, 1);
-          UPDATE_TOKEN;
-          break;
-        case '/':
-          /* Unix path or VMS option start, read until non-path symbol */
-          if (assignment_hack != 0)
-            assignment_hack++;
-          if (assignment_hack > 2)
-            {
-              assignment_hack = 0;          /* Reset */
-              if (use_pipe_cmd == nopipe)   /* force pipe use */
-                use_pipe_cmd = add_pipe;
-              token_str[0] = ';';              /* add ; token */
-              token_str[1] = 0;
-              UPDATE_TOKEN;
-            }
-          p = parse_text (&token, assignment_hack);
-          UPDATE_TOKEN;
-          break;
-        case ':':
-          if ((p[1] == 0) || isspace (p[1]))
-            {
-              /* Unix Null command - treat as comment until next command */
-              unix_echo_cmd = 0;
-              p++;
-              while (*p != 0)
-                {
-                  if (*p == ';')
-                    {
-                      /* Remove Null command from pipeline */
-                      p++;
-                      break;
-                    }
-                  p++;
-                }
-              break;
-            }
-
-          /* String assignment */
-          /* := :== or : */
-          if (p[1] != '=')
-            p = parse_char (&token, 1);
-          else if (p[2] != '=')
-            p = parse_char (&token, 2);
-          else
-            p = parse_char (&token, 3);
-          UPDATE_TOKEN;
-          break;
-        case '=':
-          /* = or == */
-          /* If this is not an echo statement, this could be a shell
-             assignment.  VMS requires the target to be quoted if it
-             is not a macro substitution */
-          if (!unix_echo_cmd && vms_unix_simulation && (assignment_hack == 0))
-            assignment_hack = 1;
-          if (p[1] != '=')
-            p = parse_char (&token, 1);
-          else
-            p = parse_char (&token, 2);
-          UPDATE_TOKEN;
-          break;
-        case '+':
-        case '-':
-        case '*':
-          p = parse_char (&token, 1);
-          UPDATE_TOKEN;
-          break;
-        case '.':
-          /* .xxx. operation, VMS does not require the trailing . */
-          p = parse_text (&token, 0);
-          UPDATE_TOKEN;
-          break;
-        default:
-          /* Skip repetitive whitespace */
-          if (isspace (*p))
-            {
-              p = parse_char (&token, 1);
-
-              /* Force to a space or a tab */
-              if ((token_str[0] != ' ') ||
-                  (token_str[0] != '\t'))
-                token_str[0] = ' ';
-              UPDATE_TOKEN;
-
-              while (isspace (*p))
-                p++;
-              if (assignment_hack != 0)
-                assignment_hack++;
-              break;
-            }
-
-          if (assignment_hack != 0)
-            assignment_hack++;
-          if (assignment_hack > 2)
-            {
-              assignment_hack = 0;          /* Reset */
-              if (use_pipe_cmd == nopipe)   /* force pipe use */
-                use_pipe_cmd = add_pipe;
-              token_str[0] = ';';              /* add ; token */
-              token_str[1] = 0;
-              UPDATE_TOKEN;
-            }
-          p = parse_text (&token, assignment_hack);
-          if (strncasecmp (token.text, "echo", 4) == 0)
-            unix_echo_cmd = 1;
-          else if (strncasecmp (token.text, "pipe", 4) == 0)
-            use_pipe_cmd = dcl_pipe;
-          UPDATE_TOKEN;
-          break;
-        }
-    }
-
-  /* End up here with a list of tokens to build a command line.
-     Deal with errors detected during parsing.
-   */
-  if (token.cmd_errno != 0)
-    {
-      while (cmd_tokens[cmd_tkn_index] == NULL)
-        free (cmd_tokens[cmd_tkn_index++]);
-      child->cstatus = VMS_POSIX_EXIT_MASK | (MAKE_TROUBLE << 3);
-      child->vms_launch_status = SS$_ABORT;
-      /* TODO what is this "magic number" */
-      child->pid = 270163; /* Special built-in */
-      child->efn = 0;
-      errno = token.cmd_errno;
-      return 0;
-    }
-
-  /* Save any redirection to append file */
-  if (append_token != -1)
-    {
-      int file_token;
-      char * lastdot;
-      char * lastdir;
-      char * raw_append_file;
-      file_token = append_token;
-      file_token++;
-      if (isspace (cmd_tokens[file_token][0]))
-        file_token++;
-      raw_append_file = vmsify (cmd_tokens[file_token], 0);
-      /* VMS DCL needs a trailing dot if null file extension */
-      lastdot = strrchr(raw_append_file, '.');
-      lastdir = strrchr(raw_append_file, ']');
-      if (lastdir == NULL)
-        lastdir = strrchr(raw_append_file, '>');
-      if (lastdir == NULL)
-        lastdir = strrchr(raw_append_file, ':');
-      if ((lastdot == NULL) || (lastdot > lastdir))
-        {
-          append_file = xmalloc (strlen (raw_append_file) + 1);
-          strcpy (append_file, raw_append_file);
-          strcat (append_file, ".");
-        }
-      else
-        append_file = strdup(raw_append_file);
-    }
-
-  cmd_dsc = build_vms_cmd (cmd_tokens, use_pipe_cmd, append_token);
-  if (cmd_dsc->dsc$a_pointer == NULL)
-    {
-      if (cmd_dsc->dsc$w_length < 0)
-        {
-          free (cmd_dsc);
-          child->cstatus = VMS_POSIX_EXIT_MASK | (MAKE_TROUBLE << 3);
-          child->vms_launch_status = SS$_ABORT;
-          /* TODO what is this "magic number" */
-          child->pid = 270163; /* Special built-in */
-          child->efn = 0;
-          return 0;
-        }
-
-      /* Only a built-in or a null command - Still need to run term AST */
-      free (cmd_dsc);
-      child->cstatus = VMS_POSIX_EXIT_MASK;
-      child->vms_launch_status = SS$_NORMAL;
-      /* TODO what is this "magic number" */
-      child->pid = 270163; /* Special built-in */
-      child->efn = 0;
-      vmsHandleChildTerm (child);
-      return 1;
-    }
-
-  if (cmd_dsc->dsc$w_length > MAX_DCL_LINE_LENGTH)
-    token.use_cmd_file = 1;
-
-  DB(DB_JOBS, (_("DCL: %s\n"), cmd_dsc->dsc$a_pointer));
-
-  /* Enforce the creation of a command file if "vms_always_use_cmd_file" is
-     non-zero.
-     Further, this way DCL reads the input stream and therefore does
-     'forced' symbol substitution, which it doesn't do for one-liners when
-     they are 'lib$spawn'ed.
-
-     Otherwise the behavior is:
-
-     Create a *.com file if either the command is too long for
-     lib$spawn, or if a redirect appending to a file is desired, or
-     symbol substitition.
-  */
-
-  if (vms_always_use_cmd_file || token.use_cmd_file)
-    {
-      FILE *outfile;
-      int cmd_len;
-
-      outfile = output_tmpfile (&child->comname,
-                                "sys$scratch:gnv$make_cmdXXXXXX.com");
-      /*                                          012345678901234567890 */
-      if (outfile == 0)
-        pfatal_with_name (_("fopen (temporary file)"));
-      comnamelen = strlen (child->comname);
-
-      /* The whole DCL "script" is executed as one action, and it behaves as
-         any DCL "script", that is errors stop it but warnings do not. Usually
-         the command on the last line, defines the exit code.  However, with
-         redirections there is a prolog and possibly an epilog to implement
-         the redirection.  Both are part of the script which is actually
-         executed. So if the redirection encounters an error in the prolog,
-         the user actions will not run; if in the epilog, the user actions
-         ran, but output is not captured. In both error cases, the error of
-         redirection is passed back and not the exit code of the actions. The
-         user should be able to enable DCL "script" verification with "set
-         verify". However, the prolog and epilog commands are not shown. Also,
-         if output redirection is used, the verification output is redirected
-         into that file as well. */
-      fprintf (outfile, "$ gnv$$make_verify = \"''f$verify(0)'\"\n");
-      fprintf (outfile, "$ gnv$$make_pid = f$getjpi(\"\",\"pid\")\n");
-      fprintf (outfile, "$ on error then $ goto gnv$$make_error\n");
-
-      /* Handle append redirection */
-      if (append_file != NULL)
-        {
-          /* If file does not exist, create it */
-          fprintf (outfile,
-                   "$ gnv$$make_al = \"gnv$$make_append''gnv$$make_pid'\"\n");
-          fprintf (outfile,
-                   "$ if f$search(\"%s\") .eqs. \"\" then create %s\n",
-                   append_file, append_file);
-
-          fprintf (outfile,
-                   "$ open/append 'gnv$$make_al' %s\n", append_file);
-
-          /* define sys$output to that file */
-          fprintf (outfile,
-                   "$ define/user sys$output 'gnv$$make_al'\n");
-          DB (DB_JOBS, (_("Append output to %s\n"), append_file));
-          free(append_file);
-        }
-
-      fprintf (outfile, "$ gnv$$make_verify = f$verify(gnv$$make_verify)\n");
-
-      /* TODO:
-         Only for ONESHELL there will be several commands separated by
-         '\n'. But there can always be multiple continuation lines.
-      */
-
-      fprintf (outfile, "%s\n", cmd_dsc->dsc$a_pointer);
-      fprintf (outfile, "$ gnv$$make_status_2 = $status\n");
-      fprintf (outfile, "$ goto gnv$$make_exit\n");
-
-      /* Exit and clean up */
-      fprintf (outfile, "$ gnv$$make_error: ! 'f$verify(0)\n");
-      fprintf (outfile, "$ gnv$$make_status_2 = $status\n");
-
-      if (append_token != -1)
-        {
-          fprintf (outfile, "$ deassign sys$output\n");
-          fprintf (outfile, "$ close 'gnv$$make_al'\n");
-
-          DB (DB_JOBS,
-              (_("Append %.*s and cleanup\n"), comnamelen-3, child->comname));
-        }
-      fprintf (outfile, "$ gnv$$make_exit: ! 'f$verify(0)\n");
-      fprintf (outfile,
-             "$ exit 'gnv$$make_status_2' + (0*f$verify(gnv$$make_verify))\n");
-
-      fclose (outfile);
-
-      free (cmd_dsc->dsc$a_pointer);
-      cmd_dsc->dsc$a_pointer = xmalloc (256 + 4);
-      sprintf (cmd_dsc->dsc$a_pointer, "$ @%s", child->comname);
-      cmd_dsc->dsc$w_length = strlen (cmd_dsc->dsc$a_pointer);
-
-      DB (DB_JOBS, (_("Executing %s instead\n"), child->comname));
-    }
-
-  child->efn = 0;
-  while (child->efn < 32 || child->efn > 63)
-    {
-      status = LIB$GET_EF ((unsigned long *)&child->efn);
-      if (!$VMS_STATUS_SUCCESS (status))
-        {
-          if (child->comname)
-            {
-              if (!ISDB (DB_JOBS))
-                unlink (child->comname);
-              free (child->comname);
-            }
-          return 0;
-        }
-    }
-
-  SYS$CLREF (child->efn);
-
-  vms_jobsefnmask |= (1 << (child->efn - 32));
-
-  /* Export the child environment into DCL symbols */
-  if (child->environment != 0)
-    {
-      char **ep = child->environment;
-      while (*ep != 0)
-        {
-          vms_putenv_symbol (*ep);
-          *ep++;
-        }
-    }
-
-  /*
-    LIB$SPAWN  [command-string]
-    [,input-file]
-    [,output-file]
-    [,flags]
-    [,process-name]
-    [,process-id] [,completion-status-address] [,byte-integer-event-flag-num]
-    [,AST-address] [,varying-AST-argument]
-    [,prompt-string] [,cli] [,table]
-  */
-
-#ifndef DONTWAITFORCHILD
-  /*
-   * Code to make ctrl+c and ctrl+y working.
-   * The problem starts with the synchronous case where after lib$spawn is
-   * called any input will go to the child. But with input re-directed,
-   * both control characters won't make it to any of the programs, neither
-   * the spawning nor to the spawned one. Hence the caller needs to spawn
-   * with CLI$M_NOWAIT to NOT give up the input focus. A sys$waitfr
-   * has to follow to simulate the wanted synchronous behaviour.
-   * The next problem is ctrl+y which isn't caught by the crtl and
-   * therefore isn't converted to SIGQUIT (for a signal handler which is
-   * already established). The only way to catch ctrl+y, is an AST
-   * assigned to the input channel. But ctrl+y handling of DCL needs to be
-   * disabled, otherwise it will handle it. Not to mention the previous
-   * ctrl+y handling of DCL needs to be re-established before make exits.
-   * One more: At the time of LIB$SPAWN signals are blocked. SIGQUIT will
-   * make it to the signal handler after the child "normally" terminates.
-   * This isn't enough. It seems reasonable for simple command lines like
-   * a 'cc foobar.c' spawned in a subprocess but it is unacceptable for
-   * spawning make. Therefore we need to abort the process in the AST.
-   *
-   * Prior to the spawn it is checked if an AST is already set up for
-   * ctrl+y, if not one is set up for a channel to SYS$COMMAND. In general
-   * this will work except if make is run in a batch environment, but there
-   * nobody can press ctrl+y. During the setup the DCL handling of ctrl+y
-   * is disabled and an exit handler is established to re-enable it.
-   * If the user interrupts with ctrl+y, the assigned AST will fire, force
-   * an abort to the subprocess and signal SIGQUIT, which will be caught by
-   * the already established handler and will bring us back to common code.
-   * After the spawn (now /nowait) a sys$waitfr simulates the /wait and
-   * enables the ctrl+y be delivered to this code. And the ctrl+c too,
-   * which the crtl converts to SIGINT and which is caught by the common
-   * signal handler. Because signals were blocked before entering this code
-   * sys$waitfr will always complete and the SIGQUIT will be processed after
-   * it (after termination of the current block, somewhere in common code).
-   * And SIGINT too will be delayed. That is ctrl+c can only abort when the
-   * current command completes. Anyway it's better than nothing :-)
-   */
-
-  if (!setupYAstTried)
-    tryToSetupYAst();
-  child->vms_launch_status = lib$spawn (cmd_dsc,               /* cmd-string */
-                     NULL, /* input-file */
-                     NULL, /* output-file */
-                     &spflags,                                 /* flags */
-                     &pnamedsc,                                /* proc name */
-                     &child->pid, &child->cstatus, &child->efn,
-                     0, 0,
-                     0, 0, 0);
-
-  status = child->vms_launch_status;
-  if ($VMS_STATUS_SUCCESS (status))
-    {
-      status = sys$waitfr (child->efn);
-      vmsHandleChildTerm (child);
-    }
-#else
-  child->vms_launch_status = lib$spawn (cmd_dsc,
-                      NULL,
-                      NULL,
-                      &spflags,
-                      &pnamedsc,
-                      &child->pid, &child->cstatus, &child->efn,
-                      vmsHandleChildTerm, child,
-                      0, 0, 0);
-   status = child->vms_launch_status;
-#endif
-
-  /* Free the pointer if not a command file */
-  if (!vms_always_use_cmd_file && !token.use_cmd_file)
-    free (cmd_dsc->dsc$a_pointer);
-  free (cmd_dsc);
-
-  if (!$VMS_STATUS_SUCCESS (status))
-    {
-      switch (status)
-        {
-        case SS$_EXQUOTA:
-          errno = EPROCLIM;
-          break;
-        default:
-          errno = EFAIL;
-        }
-    }
-
-  /* Restore the VMS symbols that were changed */
-  if (child->environment != 0)
-    {
-      char **ep = child->environment;
-      while (*ep != 0)
-        {
-          vms_restore_symbol (*ep);
-          *ep++;
-        }
-    }
-
-  return (status & 1);
-}
diff --git a/vpath.c b/vpath.c
deleted file mode 100644 (file)
index 0c7dce3..0000000
--- a/vpath.c
+++ /dev/null
@@ -1,637 +0,0 @@
-/* Implementation of pattern-matching file search paths for GNU Make.
-Copyright (C) 1988-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include "filedef.h"
-#include "variable.h"
-#ifdef WINDOWS32
-#include "pathstuff.h"
-#endif
-
-
-/* Structure used to represent a selective VPATH searchpath.  */
-
-struct vpath
-  {
-    struct vpath *next; /* Pointer to next struct in the linked list.  */
-    const char *pattern;/* The pattern to match.  */
-    const char *percent;/* Pointer into 'pattern' where the '%' is.  */
-    unsigned int patlen;/* Length of the pattern.  */
-    const char **searchpath; /* Null-terminated list of directories.  */
-    unsigned int maxlen;/* Maximum length of any entry in the list.  */
-  };
-
-/* Linked-list of all selective VPATHs.  */
-
-static struct vpath *vpaths;
-
-/* Structure for the general VPATH given in the variable.  */
-
-static struct vpath *general_vpath;
-
-/* Structure for GPATH given in the variable.  */
-
-static struct vpath *gpaths;
-\f
-
-/* Reverse the chain of selective VPATH lists so they will be searched in the
-   order given in the makefiles and construct the list from the VPATH
-   variable.  */
-
-void
-build_vpath_lists (void)
-{
-  register struct vpath *new = 0;
-  register struct vpath *old, *nexto;
-  register char *p;
-
-  /* Reverse the chain.  */
-  for (old = vpaths; old != 0; old = nexto)
-    {
-      nexto = old->next;
-      old->next = new;
-      new = old;
-    }
-
-  vpaths = new;
-
-  /* If there is a VPATH variable with a nonnull value, construct the
-     general VPATH list from it.  We use variable_expand rather than just
-     calling lookup_variable so that it will be recursively expanded.  */
-
-  {
-    /* Turn off --warn-undefined-variables while we expand SHELL and IFS.  */
-    int save = warn_undefined_variables_flag;
-    warn_undefined_variables_flag = 0;
-
-    p = variable_expand ("$(strip $(VPATH))");
-
-    warn_undefined_variables_flag = save;
-  }
-
-  if (*p != '\0')
-    {
-      /* Save the list of vpaths.  */
-      struct vpath *save_vpaths = vpaths;
-      char gp[] = "%";
-
-      /* Empty 'vpaths' so the new one will have no next, and 'vpaths'
-         will still be nil if P contains no existing directories.  */
-      vpaths = 0;
-
-      /* Parse P.  */
-      construct_vpath_list (gp, p);
-
-      /* Store the created path as the general path,
-         and restore the old list of vpaths.  */
-      general_vpath = vpaths;
-      vpaths = save_vpaths;
-    }
-
-  /* If there is a GPATH variable with a nonnull value, construct the
-     GPATH list from it.  We use variable_expand rather than just
-     calling lookup_variable so that it will be recursively expanded.  */
-
-  {
-    /* Turn off --warn-undefined-variables while we expand SHELL and IFS.  */
-    int save = warn_undefined_variables_flag;
-    warn_undefined_variables_flag = 0;
-
-    p = variable_expand ("$(strip $(GPATH))");
-
-    warn_undefined_variables_flag = save;
-  }
-
-  if (*p != '\0')
-    {
-      /* Save the list of vpaths.  */
-      struct vpath *save_vpaths = vpaths;
-      char gp[] = "%";
-
-      /* Empty 'vpaths' so the new one will have no next, and 'vpaths'
-         will still be nil if P contains no existing directories.  */
-      vpaths = 0;
-
-      /* Parse P.  */
-      construct_vpath_list (gp, p);
-
-      /* Store the created path as the GPATH,
-         and restore the old list of vpaths.  */
-      gpaths = vpaths;
-      vpaths = save_vpaths;
-    }
-}
-\f
-/* Construct the VPATH listing for the PATTERN and DIRPATH given.
-
-   This function is called to generate selective VPATH lists and also for
-   the general VPATH list (which is in fact just a selective VPATH that
-   is applied to everything).  The returned pointer is either put in the
-   linked list of all selective VPATH lists or in the GENERAL_VPATH
-   variable.
-
-   If DIRPATH is nil, remove all previous listings with the same
-   pattern.  If PATTERN is nil, remove all VPATH listings.  Existing
-   and readable directories that are not "." given in the DIRPATH
-   separated by the path element separator (defined in makeint.h) are
-   loaded into the directory hash table if they are not there already
-   and put in the VPATH searchpath for the given pattern with trailing
-   slashes stripped off if present (and if the directory is not the
-   root, "/").  The length of the longest entry in the list is put in
-   the structure as well.  The new entry will be at the head of the
-   VPATHS chain.  */
-
-void
-construct_vpath_list (char *pattern, char *dirpath)
-{
-  unsigned int elem;
-  char *p;
-  const char **vpath;
-  unsigned int maxvpath;
-  unsigned int maxelem;
-  const char *percent = NULL;
-
-  if (pattern != 0)
-    percent = find_percent (pattern);
-
-  if (dirpath == 0)
-    {
-      /* Remove matching listings.  */
-      struct vpath *path, *lastpath;
-
-      lastpath = 0;
-      path = vpaths;
-      while (path != 0)
-        {
-          struct vpath *next = path->next;
-
-          if (pattern == 0
-              || (((percent == 0 && path->percent == 0)
-                   || (percent - pattern == path->percent - path->pattern))
-                  && streq (pattern, path->pattern)))
-            {
-              /* Remove it from the linked list.  */
-              if (lastpath == 0)
-                vpaths = path->next;
-              else
-                lastpath->next = next;
-
-              /* Free its unused storage.  */
-              /* MSVC erroneously warns without a cast here.  */
-              free ((void *)path->searchpath);
-              free (path);
-            }
-          else
-            lastpath = path;
-
-          path = next;
-        }
-
-      return;
-    }
-
-#ifdef WINDOWS32
-    convert_vpath_to_windows32 (dirpath, ';');
-#endif
-
-  /* Skip over any initial separators and blanks.  */
-  while (STOP_SET (*dirpath, MAP_BLANK|MAP_PATHSEP))
-    ++dirpath;
-
-  /* Figure out the maximum number of VPATH entries and put it in
-     MAXELEM.  We start with 2, one before the first separator and one
-     nil (the list terminator) and increment our estimated number for
-     each separator or blank we find.  */
-  maxelem = 2;
-  p = dirpath;
-  while (*p != '\0')
-    if (STOP_SET (*p++, MAP_BLANK|MAP_PATHSEP))
-      ++maxelem;
-
-  vpath = xmalloc (maxelem * sizeof (const char *));
-  maxvpath = 0;
-
-  elem = 0;
-  p = dirpath;
-  while (*p != '\0')
-    {
-      char *v;
-      unsigned int len;
-
-      /* Find the end of this entry.  */
-      v = p;
-      while (*p != '\0'
-#if defined(HAVE_DOS_PATHS) && (PATH_SEPARATOR_CHAR == ':')
-             /* Platforms whose PATH_SEPARATOR_CHAR is ':' and which
-                also define HAVE_DOS_PATHS would like us to recognize
-                colons after the drive letter in the likes of
-                "D:/foo/bar:C:/xyzzy".  */
-             && (*p != PATH_SEPARATOR_CHAR
-                 || (p == v + 1 && (p[1] == '/' || p[1] == '\\')))
-#else
-             && *p != PATH_SEPARATOR_CHAR
-#endif
-             && !ISBLANK (*p))
-        ++p;
-
-      len = p - v;
-      /* Make sure there's no trailing slash,
-         but still allow "/" as a directory.  */
-#if defined(__MSDOS__) || defined(__EMX__) || defined(HAVE_DOS_PATHS)
-      /* We need also to leave alone a trailing slash in "d:/".  */
-      if (len > 3 || (len > 1 && v[1] != ':'))
-#endif
-      if (len > 1 && p[-1] == '/')
-        --len;
-
-      /* Put the directory on the vpath list.  */
-      if (len > 1 || *v != '.')
-        {
-          vpath[elem++] = dir_name (strcache_add_len (v, len));
-          if (len > maxvpath)
-            maxvpath = len;
-        }
-
-      /* Skip over separators and blanks between entries.  */
-      while (STOP_SET (*p, MAP_BLANK|MAP_PATHSEP))
-        ++p;
-    }
-
-  if (elem > 0)
-    {
-      struct vpath *path;
-      /* ELEM is now incremented one element past the last
-         entry, to where the nil-pointer terminator goes.
-         Usually this is maxelem - 1.  If not, shrink down.  */
-      if (elem < (maxelem - 1))
-        vpath = xrealloc (vpath, (elem+1) * sizeof (const char *));
-
-      /* Put the nil-pointer terminator on the end of the VPATH list.  */
-      vpath[elem] = NULL;
-
-      /* Construct the vpath structure and put it into the linked list.  */
-      path = xmalloc (sizeof (struct vpath));
-      path->searchpath = vpath;
-      path->maxlen = maxvpath;
-      path->next = vpaths;
-      vpaths = path;
-
-      /* Set up the members.  */
-      path->pattern = strcache_add (pattern);
-      path->patlen = strlen (pattern);
-      path->percent = percent ? path->pattern + (percent - pattern) : 0;
-    }
-  else
-    /* There were no entries, so free whatever space we allocated.  */
-    /* MSVC erroneously warns without a cast here.  */
-    free ((void *)vpath);
-}
-\f
-/* Search the GPATH list for a pathname string that matches the one passed
-   in.  If it is found, return 1.  Otherwise we return 0.  */
-
-int
-gpath_search (const char *file, unsigned int len)
-{
-  if (gpaths && (len <= gpaths->maxlen))
-    {
-      const char **gp;
-      for (gp = gpaths->searchpath; *gp != NULL; ++gp)
-        if (strneq (*gp, file, len) && (*gp)[len] == '\0')
-          return 1;
-    }
-
-  return 0;
-}
-\f
-
-/* Search the given VPATH list for a directory where the name pointed to by
-   FILE exists.  If it is found, we return a cached name of the existing file
-   and set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no
-   stat call was done). Also set the matching directory index in PATH_INDEX
-   if it is not NULL. Otherwise we return NULL.  */
-
-static const char *
-selective_vpath_search (struct vpath *path, const char *file,
-                        FILE_TIMESTAMP *mtime_ptr, unsigned int* path_index)
-{
-  int not_target;
-  char *name;
-  const char *n;
-  const char *filename;
-  const char **vpath = path->searchpath;
-  unsigned int maxvpath = path->maxlen;
-  unsigned int i;
-  unsigned int flen, name_dplen;
-  int exists = 0;
-
-  /* Find out if *FILE is a target.
-     If and only if it is NOT a target, we will accept prospective
-     files that don't exist but are mentioned in a makefile.  */
-  {
-    struct file *f = lookup_file (file);
-    not_target = f == 0 || !f->is_target;
-  }
-
-  flen = strlen (file);
-
-  /* Split *FILE into a directory prefix and a name-within-directory.
-     NAME_DPLEN gets the length of the prefix; FILENAME gets the pointer to
-     the name-within-directory and FLEN is its length.  */
-
-  n = strrchr (file, '/');
-#ifdef HAVE_DOS_PATHS
-  /* We need the rightmost slash or backslash.  */
-  {
-    const char *bslash = strrchr (file, '\\');
-    if (!n || bslash > n)
-      n = bslash;
-  }
-#endif
-  name_dplen = n != 0 ? n - file : 0;
-  filename = name_dplen > 0 ? n + 1 : file;
-  if (name_dplen > 0)
-    flen -= name_dplen + 1;
-
-  /* Get enough space for the biggest VPATH entry, a slash, the directory
-     prefix that came with FILE, another slash (although this one may not
-     always be necessary), the filename, and a null terminator.  */
-  name = alloca (maxvpath + 1 + name_dplen + 1 + flen + 1);
-
-  /* Try each VPATH entry.  */
-  for (i = 0; vpath[i] != 0; ++i)
-    {
-      int exists_in_cache = 0;
-      char *p = name;
-      unsigned int vlen = strlen (vpath[i]);
-
-      /* Put the next VPATH entry into NAME at P and increment P past it.  */
-      memcpy (p, vpath[i], vlen);
-      p += vlen;
-
-      /* Add the directory prefix already in *FILE.  */
-      if (name_dplen > 0)
-        {
-#ifndef VMS
-          *p++ = '/';
-#else
-          /* VMS: if this is not in VMS format, treat as Unix format */
-          if ((*p != ':') && (*p != ']') && (*p != '>'))
-            *p++ = '/';
-#endif
-          memcpy (p, file, name_dplen);
-          p += name_dplen;
-        }
-
-#ifdef HAVE_DOS_PATHS
-      /* Cause the next if to treat backslash and slash alike.  */
-      if (p != name && p[-1] == '\\' )
-        p[-1] = '/';
-#endif
-      /* Now add the name-within-directory at the end of NAME.  */
-#ifndef VMS
-      if (p != name && p[-1] != '/')
-        {
-          *p = '/';
-          memcpy (p + 1, filename, flen + 1);
-        }
-      else
-#else
-      /* VMS use a slash if no directory terminator present */
-      if (p != name && p[-1] != '/' && p[-1] != ':' &&
-          p[-1] != '>' && p[-1] != ']')
-        {
-          *p = '/';
-          memcpy (p + 1, filename, flen + 1);
-        }
-      else
-#endif
-        memcpy (p, filename, flen + 1);
-
-      /* Check if the file is mentioned in a makefile.  If *FILE is not
-         a target, that is enough for us to decide this file exists.
-         If *FILE is a target, then the file must be mentioned in the
-         makefile also as a target to be chosen.
-
-         The restriction that *FILE must not be a target for a
-         makefile-mentioned file to be chosen was added by an
-         inadequately commented change in July 1990; I am not sure off
-         hand what problem it fixes.
-
-         In December 1993 I loosened this restriction to allow a file
-         to be chosen if it is mentioned as a target in a makefile.  This
-         seem logical.
-
-         Special handling for -W / -o: make sure we preserve the special
-         values here.  Actually this whole thing is a little bogus: I think
-         we should ditch the name/hname thing and look into the renamed
-         capability that already exists for files: that is, have a new struct
-         file* entry for the VPATH-found file, and set the renamed field if
-         we use it.
-      */
-      {
-        struct file *f = lookup_file (name);
-        if (f != 0)
-          {
-            exists = not_target || f->is_target;
-            if (exists && mtime_ptr
-                && (f->last_mtime == OLD_MTIME || f->last_mtime == NEW_MTIME))
-              {
-                *mtime_ptr = f->last_mtime;
-                mtime_ptr = 0;
-              }
-          }
-      }
-
-      if (!exists)
-        {
-          /* That file wasn't mentioned in the makefile.
-             See if it actually exists.  */
-
-#ifdef VMS
-          /* For VMS syntax just use the original vpath */
-          if (*p != '/')
-            exists_in_cache = exists = dir_file_exists_p (vpath[i], filename);
-          else
-#endif
-            {
-              /* Clobber a null into the name at the last slash.
-                 Now NAME is the name of the directory to look in.  */
-              *p = '\0';
-              /* We know the directory is in the hash table now because either
-                 construct_vpath_list or the code just above put it there.
-                 Does the file we seek exist in it?  */
-              exists_in_cache = exists = dir_file_exists_p (name, filename);
-            }
-        }
-
-      if (exists)
-        {
-          /* The file is in the directory cache.
-             Now check that it actually exists in the filesystem.
-             The cache may be out of date.  When vpath thinks a file
-             exists, but stat fails for it, confusion results in the
-             higher levels.  */
-
-          struct stat st;
-
-#ifndef VMS
-          /* Put the slash back in NAME.  */
-          *p = '/';
-#else
-          /* If the slash was removed, put it back */
-          if (*p == 0)
-            *p = '/';
-#endif
-
-          if (exists_in_cache)  /* Makefile-mentioned file need not exist.  */
-            {
-              int e;
-
-              EINTRLOOP (e, stat (name, &st)); /* Does it really exist?  */
-              if (e != 0)
-                {
-                  exists = 0;
-                  continue;
-                }
-
-              /* Store the modtime into *MTIME_PTR for the caller.  */
-              if (mtime_ptr != 0)
-                {
-                  *mtime_ptr = FILE_TIMESTAMP_STAT_MODTIME (name, st);
-                  mtime_ptr = 0;
-                }
-            }
-
-          /* We have found a file.
-             If we get here and mtime_ptr hasn't been set, record
-             UNKNOWN_MTIME to indicate this.  */
-          if (mtime_ptr != 0)
-            *mtime_ptr = UNKNOWN_MTIME;
-
-          /* Store the name we found and return it.  */
-
-          if (path_index)
-            *path_index = i;
-
-          return strcache_add_len (name, (p + 1 - name) + flen);
-        }
-    }
-
-  return 0;
-}
-
-
-/* Search the VPATH list whose pattern matches FILE for a directory where FILE
-   exists.  If it is found, return the cached name of an existing file, and
-   set *MTIME_PTR (if MTIME_PTR is not NULL) to its modtime (or zero if no
-   stat call was done). Also set the matching directory index in VPATH_INDEX
-   and PATH_INDEX if they are not NULL.  Otherwise we return 0.  */
-
-const char *
-vpath_search (const char *file, FILE_TIMESTAMP *mtime_ptr,
-              unsigned int* vpath_index, unsigned int* path_index)
-{
-  struct vpath *v;
-
-  /* If there are no VPATH entries or FILENAME starts at the root,
-     there is nothing we can do.  */
-
-  if (file[0] == '/'
-#ifdef HAVE_DOS_PATHS
-      || file[0] == '\\' || file[1] == ':'
-#endif
-      || (vpaths == 0 && general_vpath == 0))
-    return 0;
-
-  if (vpath_index)
-    {
-      *vpath_index = 0;
-      *path_index = 0;
-    }
-
-  for (v = vpaths; v != 0; v = v->next)
-    {
-      if (pattern_matches (v->pattern, v->percent, file))
-        {
-          const char *p = selective_vpath_search (
-            v, file, mtime_ptr, path_index);
-          if (p)
-            return p;
-        }
-
-      if (vpath_index)
-        ++*vpath_index;
-    }
-
-
-  if (general_vpath != 0)
-    {
-      const char *p = selective_vpath_search (
-        general_vpath, file, mtime_ptr, path_index);
-      if (p)
-        return p;
-    }
-
-  return 0;
-}
-
-
-
-\f
-/* Print the data base of VPATH search paths.  */
-
-void
-print_vpath_data_base (void)
-{
-  unsigned int nvpaths;
-  struct vpath *v;
-
-  puts (_("\n# VPATH Search Paths\n"));
-
-  nvpaths = 0;
-  for (v = vpaths; v != 0; v = v->next)
-    {
-      register unsigned int i;
-
-      ++nvpaths;
-
-      printf ("vpath %s ", v->pattern);
-
-      for (i = 0; v->searchpath[i] != 0; ++i)
-        printf ("%s%c", v->searchpath[i],
-                v->searchpath[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR);
-    }
-
-  if (vpaths == 0)
-    puts (_("# No 'vpath' search paths."));
-  else
-    printf (_("\n# %u 'vpath' search paths.\n"), nvpaths);
-
-  if (general_vpath == 0)
-    puts (_("\n# No general ('VPATH' variable) search path."));
-  else
-    {
-      const char **path = general_vpath->searchpath;
-      unsigned int i;
-
-      fputs (_("\n# General ('VPATH' variable) search path:\n# "), stdout);
-
-      for (i = 0; path[i] != 0; ++i)
-        printf ("%s%c", path[i],
-                path[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR);
-    }
-}
diff --git a/w32/Makefile.am b/w32/Makefile.am
deleted file mode 100644 (file)
index 5527f77..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-# Makefile.am to create libw32.a for mingw32 host.
-# Copyright (C) 1997-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-AUTOMAKE_OPTIONS = subdir-objects
-
-noinst_LIBRARIES = libw32.a
-
-libw32_a_SOURCES =  subproc/misc.c subproc/sub_proc.c subproc/w32err.c \
-                   compat/posixfcn.c pathstuff.c w32os.c
-
-libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) \
-                   -I$(top_srcdir)/glob
diff --git a/w32/Makefile.in b/w32/Makefile.in
deleted file mode 100644 (file)
index 0c81384..0000000
+++ /dev/null
@@ -1,727 +0,0 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
-
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# Makefile.am to create libw32.a for mingw32 host.
-# Copyright (C) 1997-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-VPATH = @srcdir@
-am__is_gnu_make = { \
-  if test -z '$(MAKELEVEL)'; then \
-    false; \
-  elif test -n '$(MAKE_HOST)'; then \
-    true; \
-  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
-    true; \
-  else \
-    false; \
-  fi; \
-}
-am__make_running_with_option = \
-  case $${target_option-} in \
-      ?) ;; \
-      *) echo "am__make_running_with_option: internal error: invalid" \
-              "target option '$${target_option-}' specified" >&2; \
-         exit 1;; \
-  esac; \
-  has_opt=no; \
-  sane_makeflags=$$MAKEFLAGS; \
-  if $(am__is_gnu_make); then \
-    sane_makeflags=$$MFLAGS; \
-  else \
-    case $$MAKEFLAGS in \
-      *\\[\ \  ]*) \
-        bs=\\; \
-        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
-          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
-    esac; \
-  fi; \
-  skip_next=no; \
-  strip_trailopt () \
-  { \
-    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
-  }; \
-  for flg in $$sane_makeflags; do \
-    test $$skip_next = yes && { skip_next=no; continue; }; \
-    case $$flg in \
-      *=*|--*) continue;; \
-        -*I) strip_trailopt 'I'; skip_next=yes;; \
-      -*I?*) strip_trailopt 'I';; \
-        -*O) strip_trailopt 'O'; skip_next=yes;; \
-      -*O?*) strip_trailopt 'O';; \
-        -*l) strip_trailopt 'l'; skip_next=yes;; \
-      -*l?*) strip_trailopt 'l';; \
-      -[dEDm]) skip_next=yes;; \
-      -[JT]) skip_next=yes;; \
-    esac; \
-    case $$flg in \
-      *$$target_option*) has_opt=yes; break;; \
-    esac; \
-  done; \
-  test $$has_opt = yes
-am__make_dryrun = (target_option=n; $(am__make_running_with_option))
-am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
-pkgdatadir = $(datadir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkglibexecdir = $(libexecdir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-host_triplet = @host@
-subdir = w32
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/config/dospaths.m4 \
-       $(top_srcdir)/config/gettext.m4 $(top_srcdir)/config/iconv.m4 \
-       $(top_srcdir)/config/intlmacosx.m4 \
-       $(top_srcdir)/config/lib-ld.m4 \
-       $(top_srcdir)/config/lib-link.m4 \
-       $(top_srcdir)/config/lib-prefix.m4 \
-       $(top_srcdir)/config/longlong.m4 $(top_srcdir)/config/nls.m4 \
-       $(top_srcdir)/config/po.m4 $(top_srcdir)/config/progtest.m4 \
-       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-       $(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-CONFIG_CLEAN_VPATH_FILES =
-LIBRARIES = $(noinst_LIBRARIES)
-ARFLAGS = cru
-AM_V_AR = $(am__v_AR_@AM_V@)
-am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
-am__v_AR_0 = @echo "  AR      " $@;
-am__v_AR_1 = 
-libw32_a_AR = $(AR) $(ARFLAGS)
-libw32_a_LIBADD =
-am__dirstamp = $(am__leading_dot)dirstamp
-am_libw32_a_OBJECTS = subproc/libw32_a-misc.$(OBJEXT) \
-       subproc/libw32_a-sub_proc.$(OBJEXT) \
-       subproc/libw32_a-w32err.$(OBJEXT) \
-       compat/libw32_a-posixfcn.$(OBJEXT) \
-       libw32_a-pathstuff.$(OBJEXT) libw32_a-w32os.$(OBJEXT)
-libw32_a_OBJECTS = $(am_libw32_a_OBJECTS)
-AM_V_P = $(am__v_P_@AM_V@)
-am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
-am__v_P_0 = false
-am__v_P_1 = :
-AM_V_GEN = $(am__v_GEN_@AM_V@)
-am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
-am__v_GEN_0 = @echo "  GEN     " $@;
-am__v_GEN_1 = 
-AM_V_at = $(am__v_at_@AM_V@)
-am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
-am__v_at_0 = @
-am__v_at_1 = 
-DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/config/depcomp
-am__depfiles_maybe = depfiles
-am__mv = mv -f
-AM_V_lt = $(am__v_lt_@AM_V@)
-am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 = 
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_@AM_V@)
-am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_@AM_V@)
-am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
-SOURCES = $(libw32_a_SOURCES)
-DIST_SOURCES = $(libw32_a_SOURCES)
-am__can_run_installinfo = \
-  case $$AM_UPDATE_INFO_DIR in \
-    n|no|NO) false;; \
-    *) (install-info --version) >/dev/null 2>&1;; \
-  esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
-# Read a list of newline-separated strings from the standard input,
-# and print each of them once, without duplicates.  Input order is
-# *not* preserved.
-am__uniquify_input = $(AWK) '\
-  BEGIN { nonempty = 0; } \
-  { items[$$0] = 1; nonempty = 1; } \
-  END { if (nonempty) { for (i in items) print i; }; } \
-'
-# Make sure the list of sources is unique.  This is necessary because,
-# e.g., the same source file might be shared among _SOURCES variables
-# for different programs/libraries.
-am__define_uniq_tagged_files = \
-  list='$(am__tagged_files)'; \
-  unique=`for i in $$list; do \
-    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-  done | $(am__uniquify_input)`
-ETAGS = etags
-CTAGS = ctags
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-ALLOCA = @ALLOCA@
-AMTAR = @AMTAR@
-AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AM_LDFLAGS = @AM_LDFLAGS@
-AR = @AR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
-GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
-GLOBINC = @GLOBINC@
-GLOBLIB = @GLOBLIB@
-GMSGFMT = @GMSGFMT@
-GMSGFMT_015 = @GMSGFMT_015@
-GREP = @GREP@
-GUILE_CFLAGS = @GUILE_CFLAGS@
-GUILE_LIBS = @GUILE_LIBS@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INTLLIBS = @INTLLIBS@
-INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
-KMEM_GROUP = @KMEM_GROUP@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBINTL = @LIBINTL@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBICONV = @LTLIBICONV@
-LTLIBINTL = @LTLIBINTL@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MAKE_HOST = @MAKE_HOST@
-MKDIR_P = @MKDIR_P@
-MSGFMT = @MSGFMT@
-MSGFMT_015 = @MSGFMT_015@
-MSGMERGE = @MSGMERGE@
-NEED_SETGID = @NEED_SETGID@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_URL = @PACKAGE_URL@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
-PKG_CONFIG = @PKG_CONFIG@
-PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
-PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POSUB = @POSUB@
-RANLIB = @RANLIB@
-REMOTE = @REMOTE@
-SED = @SED@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-USE_NLS = @USE_NLS@
-VERSION = @VERSION@
-XGETTEXT = @XGETTEXT@
-XGETTEXT_015 = @XGETTEXT_015@
-XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-runstatedir = @runstatedir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_build_prefix = @top_build_prefix@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-AUTOMAKE_OPTIONS = subdir-objects
-noinst_LIBRARIES = libw32.a
-libw32_a_SOURCES = subproc/misc.c subproc/sub_proc.c subproc/w32err.c \
-                   compat/posixfcn.c pathstuff.c w32os.c
-
-libw32_a_CPPFLAGS = -I$(srcdir)/include -I$(srcdir)/subproc -I$(top_srcdir) \
-                   -I$(top_srcdir)/glob
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-       @for dep in $?; do \
-         case '$(am__configure_deps)' in \
-           *$$dep*) \
-             ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
-               && { if test -f $@; then exit 0; else break; fi; }; \
-             exit 1;; \
-         esac; \
-       done; \
-       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign w32/Makefile'; \
-       $(am__cd) $(top_srcdir) && \
-         $(AUTOMAKE) --foreign w32/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-       @case '$?' in \
-         *config.status*) \
-           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-         *) \
-           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-       esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(am__aclocal_m4_deps):
-
-clean-noinstLIBRARIES:
-       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
-subproc/$(am__dirstamp):
-       @$(MKDIR_P) subproc
-       @: > subproc/$(am__dirstamp)
-subproc/$(DEPDIR)/$(am__dirstamp):
-       @$(MKDIR_P) subproc/$(DEPDIR)
-       @: > subproc/$(DEPDIR)/$(am__dirstamp)
-subproc/libw32_a-misc.$(OBJEXT): subproc/$(am__dirstamp) \
-       subproc/$(DEPDIR)/$(am__dirstamp)
-subproc/libw32_a-sub_proc.$(OBJEXT): subproc/$(am__dirstamp) \
-       subproc/$(DEPDIR)/$(am__dirstamp)
-subproc/libw32_a-w32err.$(OBJEXT): subproc/$(am__dirstamp) \
-       subproc/$(DEPDIR)/$(am__dirstamp)
-compat/$(am__dirstamp):
-       @$(MKDIR_P) compat
-       @: > compat/$(am__dirstamp)
-compat/$(DEPDIR)/$(am__dirstamp):
-       @$(MKDIR_P) compat/$(DEPDIR)
-       @: > compat/$(DEPDIR)/$(am__dirstamp)
-compat/libw32_a-posixfcn.$(OBJEXT): compat/$(am__dirstamp) \
-       compat/$(DEPDIR)/$(am__dirstamp)
-
-libw32.a: $(libw32_a_OBJECTS) $(libw32_a_DEPENDENCIES) $(EXTRA_libw32_a_DEPENDENCIES) 
-       $(AM_V_at)-rm -f libw32.a
-       $(AM_V_AR)$(libw32_a_AR) libw32.a $(libw32_a_OBJECTS) $(libw32_a_LIBADD)
-       $(AM_V_at)$(RANLIB) libw32.a
-
-mostlyclean-compile:
-       -rm -f *.$(OBJEXT)
-       -rm -f compat/*.$(OBJEXT)
-       -rm -f subproc/*.$(OBJEXT)
-
-distclean-compile:
-       -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-pathstuff.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libw32_a-w32os.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@compat/$(DEPDIR)/libw32_a-posixfcn.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@subproc/$(DEPDIR)/libw32_a-misc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@subproc/$(DEPDIR)/libw32_a-sub_proc.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@subproc/$(DEPDIR)/libw32_a-w32err.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-subproc/libw32_a-misc.o: subproc/misc.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-misc.o -MD -MP -MF subproc/$(DEPDIR)/libw32_a-misc.Tpo -c -o subproc/libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-misc.Tpo subproc/$(DEPDIR)/libw32_a-misc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='subproc/misc.c' object='subproc/libw32_a-misc.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-misc.o `test -f 'subproc/misc.c' || echo '$(srcdir)/'`subproc/misc.c
-
-subproc/libw32_a-misc.obj: subproc/misc.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-misc.obj -MD -MP -MF subproc/$(DEPDIR)/libw32_a-misc.Tpo -c -o subproc/libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-misc.Tpo subproc/$(DEPDIR)/libw32_a-misc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='subproc/misc.c' object='subproc/libw32_a-misc.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-misc.obj `if test -f 'subproc/misc.c'; then $(CYGPATH_W) 'subproc/misc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/misc.c'; fi`
-
-subproc/libw32_a-sub_proc.o: subproc/sub_proc.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-sub_proc.o -MD -MP -MF subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo -c -o subproc/libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo subproc/$(DEPDIR)/libw32_a-sub_proc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='subproc/sub_proc.c' object='subproc/libw32_a-sub_proc.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-sub_proc.o `test -f 'subproc/sub_proc.c' || echo '$(srcdir)/'`subproc/sub_proc.c
-
-subproc/libw32_a-sub_proc.obj: subproc/sub_proc.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-sub_proc.obj -MD -MP -MF subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo -c -o subproc/libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-sub_proc.Tpo subproc/$(DEPDIR)/libw32_a-sub_proc.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='subproc/sub_proc.c' object='subproc/libw32_a-sub_proc.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-sub_proc.obj `if test -f 'subproc/sub_proc.c'; then $(CYGPATH_W) 'subproc/sub_proc.c'; else $(CYGPATH_W) '$(srcdir)/subproc/sub_proc.c'; fi`
-
-subproc/libw32_a-w32err.o: subproc/w32err.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-w32err.o -MD -MP -MF subproc/$(DEPDIR)/libw32_a-w32err.Tpo -c -o subproc/libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-w32err.Tpo subproc/$(DEPDIR)/libw32_a-w32err.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='subproc/w32err.c' object='subproc/libw32_a-w32err.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-w32err.o `test -f 'subproc/w32err.c' || echo '$(srcdir)/'`subproc/w32err.c
-
-subproc/libw32_a-w32err.obj: subproc/w32err.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT subproc/libw32_a-w32err.obj -MD -MP -MF subproc/$(DEPDIR)/libw32_a-w32err.Tpo -c -o subproc/libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) subproc/$(DEPDIR)/libw32_a-w32err.Tpo subproc/$(DEPDIR)/libw32_a-w32err.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='subproc/w32err.c' object='subproc/libw32_a-w32err.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o subproc/libw32_a-w32err.obj `if test -f 'subproc/w32err.c'; then $(CYGPATH_W) 'subproc/w32err.c'; else $(CYGPATH_W) '$(srcdir)/subproc/w32err.c'; fi`
-
-compat/libw32_a-posixfcn.o: compat/posixfcn.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT compat/libw32_a-posixfcn.o -MD -MP -MF compat/$(DEPDIR)/libw32_a-posixfcn.Tpo -c -o compat/libw32_a-posixfcn.o `test -f 'compat/posixfcn.c' || echo '$(srcdir)/'`compat/posixfcn.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) compat/$(DEPDIR)/libw32_a-posixfcn.Tpo compat/$(DEPDIR)/libw32_a-posixfcn.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='compat/posixfcn.c' object='compat/libw32_a-posixfcn.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o compat/libw32_a-posixfcn.o `test -f 'compat/posixfcn.c' || echo '$(srcdir)/'`compat/posixfcn.c
-
-compat/libw32_a-posixfcn.obj: compat/posixfcn.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT compat/libw32_a-posixfcn.obj -MD -MP -MF compat/$(DEPDIR)/libw32_a-posixfcn.Tpo -c -o compat/libw32_a-posixfcn.obj `if test -f 'compat/posixfcn.c'; then $(CYGPATH_W) 'compat/posixfcn.c'; else $(CYGPATH_W) '$(srcdir)/compat/posixfcn.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) compat/$(DEPDIR)/libw32_a-posixfcn.Tpo compat/$(DEPDIR)/libw32_a-posixfcn.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='compat/posixfcn.c' object='compat/libw32_a-posixfcn.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o compat/libw32_a-posixfcn.obj `if test -f 'compat/posixfcn.c'; then $(CYGPATH_W) 'compat/posixfcn.c'; else $(CYGPATH_W) '$(srcdir)/compat/posixfcn.c'; fi`
-
-libw32_a-pathstuff.o: pathstuff.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.o -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='pathstuff.c' object='libw32_a-pathstuff.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.o `test -f 'pathstuff.c' || echo '$(srcdir)/'`pathstuff.c
-
-libw32_a-pathstuff.obj: pathstuff.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-pathstuff.obj -MD -MP -MF $(DEPDIR)/libw32_a-pathstuff.Tpo -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libw32_a-pathstuff.Tpo $(DEPDIR)/libw32_a-pathstuff.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='pathstuff.c' object='libw32_a-pathstuff.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-pathstuff.obj `if test -f 'pathstuff.c'; then $(CYGPATH_W) 'pathstuff.c'; else $(CYGPATH_W) '$(srcdir)/pathstuff.c'; fi`
-
-libw32_a-w32os.o: w32os.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-w32os.o -MD -MP -MF $(DEPDIR)/libw32_a-w32os.Tpo -c -o libw32_a-w32os.o `test -f 'w32os.c' || echo '$(srcdir)/'`w32os.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libw32_a-w32os.Tpo $(DEPDIR)/libw32_a-w32os.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='w32os.c' object='libw32_a-w32os.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-w32os.o `test -f 'w32os.c' || echo '$(srcdir)/'`w32os.c
-
-libw32_a-w32os.obj: w32os.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libw32_a-w32os.obj -MD -MP -MF $(DEPDIR)/libw32_a-w32os.Tpo -c -o libw32_a-w32os.obj `if test -f 'w32os.c'; then $(CYGPATH_W) 'w32os.c'; else $(CYGPATH_W) '$(srcdir)/w32os.c'; fi`
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libw32_a-w32os.Tpo $(DEPDIR)/libw32_a-w32os.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='w32os.c' object='libw32_a-w32os.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libw32_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libw32_a-w32os.obj `if test -f 'w32os.c'; then $(CYGPATH_W) 'w32os.c'; else $(CYGPATH_W) '$(srcdir)/w32os.c'; fi`
-
-ID: $(am__tagged_files)
-       $(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
-TAGS: tags
-
-tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       set x; \
-       here=`pwd`; \
-       $(am__define_uniq_tagged_files); \
-       shift; \
-       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
-         test -n "$$unique" || unique=$$empty_fix; \
-         if test $$# -gt 0; then \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             "$$@" $$unique; \
-         else \
-           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-             $$unique; \
-         fi; \
-       fi
-ctags: ctags-am
-
-CTAGS: ctags
-ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
-       $(am__define_uniq_tagged_files); \
-       test -z "$(CTAGS_ARGS)$$unique" \
-         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-            $$unique
-
-GTAGS:
-       here=`$(am__cd) $(top_builddir) && pwd` \
-         && $(am__cd) $(top_srcdir) \
-         && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
-
-cscopelist-am: $(am__tagged_files)
-       list='$(am__tagged_files)'; \
-       case "$(srcdir)" in \
-         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
-         *) sdir=$(subdir)/$(srcdir) ;; \
-       esac; \
-       for i in $$list; do \
-         if test -f "$$i"; then \
-           echo "$(subdir)/$$i"; \
-         else \
-           echo "$$sdir/$$i"; \
-         fi; \
-       done >> $(top_builddir)/cscope.files
-
-distclean-tags:
-       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-       list='$(DISTFILES)'; \
-         dist_files=`for file in $$list; do echo $$file; done | \
-         sed -e "s|^$$srcdirstrip/||;t" \
-             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-       case $$dist_files in \
-         */*) $(MKDIR_P) `echo "$$dist_files" | \
-                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-                          sort -u` ;; \
-       esac; \
-       for file in $$dist_files; do \
-         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-         if test -d $$d/$$file; then \
-           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-           if test -d "$(distdir)/$$file"; then \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
-             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
-           fi; \
-           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
-         else \
-           test -f "$(distdir)/$$file" \
-           || cp -p $$d/$$file "$(distdir)/$$file" \
-           || exit 1; \
-         fi; \
-       done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LIBRARIES)
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
-       -rm -f compat/$(DEPDIR)/$(am__dirstamp)
-       -rm -f compat/$(am__dirstamp)
-       -rm -f subproc/$(DEPDIR)/$(am__dirstamp)
-       -rm -f subproc/$(am__dirstamp)
-
-maintainer-clean-generic:
-       @echo "This command is intended for maintainers to use"
-       @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
-
-distclean: distclean-am
-       -rm -rf ./$(DEPDIR) compat/$(DEPDIR) subproc/$(DEPDIR)
-       -rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-       distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-html-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-dvi-am:
-
-install-exec-am:
-
-install-html: install-html-am
-
-install-html-am:
-
-install-info: install-info-am
-
-install-info-am:
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-pdf-am:
-
-install-ps: install-ps-am
-
-install-ps-am:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-       -rm -rf ./$(DEPDIR) compat/$(DEPDIR) subproc/$(DEPDIR)
-       -rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am:
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-       clean-noinstLIBRARIES cscopelist-am ctags ctags-am distclean \
-       distclean-compile distclean-generic distclean-tags distdir dvi \
-       dvi-am html html-am info info-am install install-am \
-       install-data install-data-am install-dvi install-dvi-am \
-       install-exec install-exec-am install-html install-html-am \
-       install-info install-info-am install-man install-pdf \
-       install-pdf-am install-ps install-ps-am install-strip \
-       installcheck installcheck-am installdirs maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-compile \
-       mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
-       uninstall-am
-
-.PRECIOUS: Makefile
-
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/w32/compat/dirent.c b/w32/compat/dirent.c
deleted file mode 100644 (file)
index 17f7d5f..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/* Directory entry code for Window platforms.
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-
-#include <config.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include "dirent.h"
-
-
-DIR*
-opendir(const char* pDirName)
-{
-        struct stat sb;
-        DIR*    pDir;
-        char*   pEndDirName;
-        int     nBufferLen;
-
-        /* sanity checks */
-        if (!pDirName) {
-                errno = EINVAL;
-                return NULL;
-        }
-        if (stat(pDirName, &sb) != 0) {
-                errno = ENOENT;
-                return NULL;
-        }
-        if ((sb.st_mode & S_IFMT) != S_IFDIR) {
-                errno = ENOTDIR;
-                return NULL;
-        }
-
-        /* allocate a DIR structure to return */
-        pDir = (DIR *) malloc(sizeof (DIR));
-
-        if (!pDir)
-                return NULL;
-
-        /* input directory name length */
-        nBufferLen = strlen(pDirName);
-
-        /* copy input directory name to DIR buffer */
-        strcpy(pDir->dir_pDirectoryName, pDirName);
-
-        /* point to end of the copied directory name */
-        pEndDirName = &pDir->dir_pDirectoryName[nBufferLen - 1];
-
-        /* if directory name did not end in '/' or '\', add '/' */
-        if ((*pEndDirName != '/') && (*pEndDirName != '\\')) {
-                pEndDirName++;
-                *pEndDirName = '/';
-        }
-
-        /* now append the wildcard character to the buffer */
-        pEndDirName++;
-        *pEndDirName = '*';
-        pEndDirName++;
-        *pEndDirName = '\0';
-
-        /* other values defaulted */
-        pDir->dir_nNumFiles = 0;
-        pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
-        pDir->dir_ulCookie = __DIRENT_COOKIE;
-
-        return pDir;
-}
-
-void
-closedir(DIR *pDir)
-{
-        /* got a valid pointer? */
-        if (!pDir) {
-                errno = EINVAL;
-                return;
-        }
-
-        /* sanity check that this is a DIR pointer */
-        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
-                errno = EINVAL;
-                return;
-        }
-
-        /* close the WINDOWS32 directory handle */
-        if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
-                FindClose(pDir->dir_hDirHandle);
-
-        free(pDir);
-
-        return;
-}
-
-struct dirent *
-readdir(DIR* pDir)
-{
-        WIN32_FIND_DATA wfdFindData;
-
-        if (!pDir) {
-                errno = EINVAL;
-                return NULL;
-        }
-
-        /* sanity check that this is a DIR pointer */
-        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
-                errno = EINVAL;
-                return NULL;
-        }
-
-        if (pDir->dir_nNumFiles == 0) {
-                pDir->dir_hDirHandle = FindFirstFile(pDir->dir_pDirectoryName, &wfdFindData);
-                if (pDir->dir_hDirHandle == INVALID_HANDLE_VALUE)
-                        return NULL;
-        } else if (!FindNextFile(pDir->dir_hDirHandle, &wfdFindData))
-                        return NULL;
-
-        /* bump count for next call to readdir() or telldir() */
-        pDir->dir_nNumFiles++;
-
-        /* fill in struct dirent values */
-        pDir->dir_sdReturn.d_ino = (ino_t)-1;
-        strcpy(pDir->dir_sdReturn.d_name, wfdFindData.cFileName);
-
-        return &pDir->dir_sdReturn;
-}
-
-void
-rewinddir(DIR* pDir)
-{
-        if (!pDir) {
-                errno = EINVAL;
-                return;
-        }
-
-        /* sanity check that this is a DIR pointer */
-        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
-                errno = EINVAL;
-                return;
-        }
-
-        /* close the WINDOWS32 directory handle */
-        if (pDir->dir_hDirHandle != INVALID_HANDLE_VALUE)
-                if (!FindClose(pDir->dir_hDirHandle))
-                        errno = EBADF;
-
-        /* reset members which control readdir() */
-        pDir->dir_hDirHandle = INVALID_HANDLE_VALUE;
-        pDir->dir_nNumFiles = 0;
-
-        return;
-}
-
-int
-telldir(DIR* pDir)
-{
-        if (!pDir) {
-                errno = EINVAL;
-                return -1;
-        }
-
-        /* sanity check that this is a DIR pointer */
-        if (pDir->dir_ulCookie != __DIRENT_COOKIE) {
-                errno = EINVAL;
-                return -1;
-        }
-
-        /* return number of times readdir() called */
-        return pDir->dir_nNumFiles;
-}
-
-void
-seekdir(DIR* pDir, long nPosition)
-{
-        if (!pDir)
-                return;
-
-        /* sanity check that this is a DIR pointer */
-        if (pDir->dir_ulCookie != __DIRENT_COOKIE)
-                return;
-
-        /* go back to beginning of directory */
-        rewinddir(pDir);
-
-        /* loop until we have found position we care about */
-        for (--nPosition; nPosition && readdir(pDir); nPosition--);
-
-        /* flag invalid nPosition value */
-        if (nPosition)
-                errno = EINVAL;
-
-        return;
-}
diff --git a/w32/compat/posixfcn.c b/w32/compat/posixfcn.c
deleted file mode 100644 (file)
index c760cc8..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-/* Replacements for Posix functions and Posix functionality for MS-Windows.
-
-Copyright (C) 2013-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include <string.h>
-#include <io.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <windows.h>
-
-#include "dlfcn.h"
-
-#include "makeint.h"
-#include "job.h"
-
-#ifndef NO_OUTPUT_SYNC
-/* Support for OUTPUT_SYNC and related functionality.  */
-
-/* Emulation of fcntl that supports only F_GETFD and F_SETLKW.  */
-int
-fcntl (intptr_t fd, int cmd, ...)
-{
-  va_list ap;
-
-  va_start (ap, cmd);
-
-  switch (cmd)
-    {
-      case F_GETFD:
-        va_end (ap);
-        /* Could have used GetHandleInformation, but that isn't
-           supported on Windows 9X.  */
-        if (_get_osfhandle (fd) == -1)
-          return -1;
-        return 0;
-      case F_SETLKW:
-        {
-          void *buf = va_arg (ap, void *);
-          struct flock *fl = (struct flock *)buf;
-          HANDLE hmutex = (HANDLE)fd;
-          static struct flock last_fl;
-          short last_type = last_fl.l_type;
-
-          va_end (ap);
-
-          if (hmutex == INVALID_HANDLE_VALUE || !hmutex)
-            return -1;
-
-          last_fl = *fl;
-
-          switch (fl->l_type)
-            {
-
-              case F_WRLCK:
-                {
-                  DWORD result;
-
-                  if (last_type == F_WRLCK)
-                    {
-                      /* Don't call WaitForSingleObject if we already
-                         own the mutex, because doing so will require
-                         us to call ReleaseMutex an equal number of
-                         times, before the mutex is actually
-                         released.  */
-                      return 0;
-                    }
-
-                  result = WaitForSingleObject (hmutex, INFINITE);
-                  switch (result)
-                    {
-                      case WAIT_OBJECT_0:
-                        /* We don't care if the mutex owner crashed or
-                           exited.  */
-                      case WAIT_ABANDONED:
-                        return 0;
-                      case WAIT_FAILED:
-                      case WAIT_TIMEOUT: /* cannot happen, really */
-                        {
-                          DWORD err = GetLastError ();
-
-                          /* Invalidate the last command.  */
-                          memset (&last_fl, 0, sizeof (last_fl));
-
-                          switch (err)
-                            {
-                              case ERROR_INVALID_HANDLE:
-                              case ERROR_INVALID_FUNCTION:
-                                errno = EINVAL;
-                                return -1;
-                              default:
-                                errno = EDEADLOCK;
-                                return -1;
-                            }
-                        }
-                    }
-                }
-              case F_UNLCK:
-                {
-                  /* FIXME: Perhaps we should call ReleaseMutex
-                     repatedly until it errors out, to make sure the
-                     mutext is released even if we somehow managed to
-                     to take ownership multiple times?  */
-                  BOOL status = ReleaseMutex (hmutex);
-
-                  if (status)
-                    return 0;
-                  else
-                    {
-                      DWORD err = GetLastError ();
-
-                      if (err == ERROR_NOT_OWNER)
-                        errno = EPERM;
-                      else
-                        {
-                          memset (&last_fl, 0, sizeof (last_fl));
-                          errno = EINVAL;
-                        }
-                      return -1;
-                    }
-                }
-              default:
-                errno = ENOSYS;
-                return -1;
-            }
-        }
-      default:
-        errno = ENOSYS;
-        va_end (ap);
-        return -1;
-    }
-}
-
-static intptr_t mutex_handle = -1;
-
-/* Record in a static variable the mutex handle we were requested to
-   use.  That nameless mutex was created by the top-level Make, and
-   its handle was passed to us via inheritance.  The value of that
-   handle is passed via the command-line arguments, so that we know
-   which handle to use.  */
-void
-record_sync_mutex (const char *str)
-{
-  char *endp;
-  intptr_t hmutex = strtol (str, &endp, 16);
-
-  if (*endp == '\0')
-    mutex_handle = hmutex;
-  else
-    {
-      mutex_handle = -1;
-      errno = EINVAL;
-    }
-}
-
-/* Create a new mutex or reuse one created by our parent.  */
-intptr_t
-create_mutex (void)
-{
-  SECURITY_ATTRIBUTES secattr;
-  intptr_t hmutex = -1;
-
-  /* If we have a mutex handle passed from the parent Make, just use
-     that.  */
-  if (mutex_handle > 0)
-    return mutex_handle;
-
-  /* We are the top-level Make, and we want the handle to be inherited
-     by our child processes.  */
-  secattr.nLength = sizeof (secattr);
-  secattr.lpSecurityDescriptor = NULL; /* use default security descriptor */
-  secattr.bInheritHandle = TRUE;
-
-  hmutex = (intptr_t)CreateMutex (&secattr, FALSE, NULL);
-  if (!hmutex)
-    {
-      DWORD err = GetLastError ();
-
-      fprintf (stderr, "CreateMutex: error %lu\n", err);
-      errno = ENOLCK;
-      hmutex = -1;
-    }
-
-  mutex_handle = hmutex;
-  return hmutex;
-}
-
-/* Return non-zero if F1 and F2 are 2 streams representing the same
-   file or pipe or device.  */
-int
-same_stream (FILE *f1, FILE *f2)
-{
-  HANDLE fh1 = (HANDLE)_get_osfhandle (fileno (f1));
-  HANDLE fh2 = (HANDLE)_get_osfhandle (fileno (f2));
-
-  /* Invalid file descriptors get treated as different streams.  */
-  if (fh1 && fh1 != INVALID_HANDLE_VALUE
-      && fh2 && fh2 != INVALID_HANDLE_VALUE)
-    {
-      if (fh1 == fh2)
-        return 1;
-      else
-        {
-          DWORD ftyp1 = GetFileType (fh1), ftyp2 = GetFileType (fh2);
-
-          if (ftyp1 != ftyp2
-              || ftyp1 == FILE_TYPE_UNKNOWN || ftyp2 == FILE_TYPE_UNKNOWN)
-            return 0;
-          else if (ftyp1 == FILE_TYPE_CHAR)
-            {
-              /* For character devices, check if they both refer to a
-                 console.  This loses if both handles refer to the
-                 null device (FIXME!), but in that case we don't care
-                 in the context of Make.  */
-              DWORD conmode1, conmode2;
-
-              /* Each process on Windows can have at most 1 console,
-                 so if both handles are for the console device, they
-                 are the same.  We also compare the console mode to
-                 distinguish between stdin and stdout/stderr.  */
-              if (GetConsoleMode (fh1, &conmode1)
-                  && GetConsoleMode (fh2, &conmode2)
-                  && conmode1 == conmode2)
-                return 1;
-            }
-          else
-            {
-              /* For disk files and pipes, compare their unique
-                 attributes.  */
-              BY_HANDLE_FILE_INFORMATION bhfi1, bhfi2;
-
-              /* Pipes get zero in the volume serial number, but do
-                 appear to have meaningful information in file index
-                 attributes.  We test file attributes as well, for a
-                 good measure.  */
-              if (GetFileInformationByHandle (fh1, &bhfi1)
-                  && GetFileInformationByHandle (fh2, &bhfi2))
-                return (bhfi1.dwVolumeSerialNumber == bhfi2.dwVolumeSerialNumber
-                        && bhfi1.nFileIndexLow == bhfi2.nFileIndexLow
-                        && bhfi1.nFileIndexHigh == bhfi2.nFileIndexHigh
-                        && bhfi1.dwFileAttributes == bhfi2.dwFileAttributes);
-            }
-        }
-    }
-  return 0;
-}
-
-/* A replacement for tmpfile, since the MSVCRT implementation creates
-   the file in the root directory of the current drive, which might
-   not be writable by our user.  Most of the code borrowed from
-   create_batch_file, see job.c.  */
-FILE *
-tmpfile (void)
-{
-  char temp_path[MAXPATHLEN];
-  unsigned path_size = GetTempPath (sizeof temp_path, temp_path);
-  int path_is_dot = 0;
-  /* The following variable is static so we won't try to reuse a name
-     that was generated a little while ago, because that file might
-     not be on disk yet, since we use FILE_ATTRIBUTE_TEMPORARY below,
-     which tells the OS it doesn't need to flush the cache to disk.
-     If the file is not yet on disk, we might think the name is
-     available, while it really isn't.  This happens in parallel
-     builds, where Make doesn't wait for one job to finish before it
-     launches the next one.  */
-  static unsigned uniq = 0;
-  static int second_loop = 0;
-  const char base[] = "gmake_tmpf";
-  const unsigned sizemax = sizeof base - 1 + 4 + 10 + 10;
-  unsigned pid = GetCurrentProcessId ();
-
-  if (path_size == 0)
-    {
-      path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
-      path_is_dot = 1;
-    }
-
-  ++uniq;
-  if (uniq >= 0x10000 && !second_loop)
-    {
-      /* If we already had 64K batch files in this
-         process, make a second loop through the numbers,
-         looking for free slots, i.e. files that were
-         deleted in the meantime.  */
-      second_loop = 1;
-      uniq = 1;
-    }
-  while (path_size > 0 &&
-         path_size + sizemax < sizeof temp_path &&
-         !(uniq >= 0x10000 && second_loop))
-    {
-      HANDLE h;
-
-      sprintf (temp_path + path_size,
-               "%s%s%u-%x.tmp",
-               temp_path[path_size - 1] == '\\' ? "" : "\\",
-               base, pid, uniq);
-      h = CreateFile (temp_path,  /* file name */
-                      GENERIC_READ | GENERIC_WRITE | DELETE, /* desired access */
-                      FILE_SHARE_READ | FILE_SHARE_WRITE,    /* share mode */
-                      NULL,                                  /* default security attributes */
-                      CREATE_NEW,                            /* creation disposition */
-                      FILE_ATTRIBUTE_NORMAL |                /* flags and attributes */
-                      FILE_ATTRIBUTE_TEMPORARY |
-                      FILE_FLAG_DELETE_ON_CLOSE,
-                      NULL);                                 /* no template file */
-
-      if (h == INVALID_HANDLE_VALUE)
-        {
-          const DWORD er = GetLastError ();
-
-          if (er == ERROR_FILE_EXISTS || er == ERROR_ALREADY_EXISTS)
-            {
-              ++uniq;
-              if (uniq == 0x10000 && !second_loop)
-                {
-                  second_loop = 1;
-                  uniq = 1;
-                }
-            }
-
-          /* The temporary path is not guaranteed to exist, or might
-             not be writable by user.  Use the current directory as
-             fallback.  */
-          else if (path_is_dot == 0)
-            {
-              path_size = GetCurrentDirectory (sizeof temp_path, temp_path);
-              path_is_dot = 1;
-            }
-
-          else
-            {
-              errno = EACCES;
-              break;
-            }
-        }
-      else
-        {
-          int fd = _open_osfhandle ((intptr_t)h, 0);
-
-          return _fdopen (fd, "w+b");
-        }
-    }
-
-  if (uniq >= 0x10000)
-    errno = EEXIST;
-  return NULL;
-}
-
-#endif  /* !NO_OUTPUT_SYNC */
-
-#if MAKE_LOAD
-
-/* Support for dynamic loading of objects.  */
-
-
-static DWORD last_err;
-
-void *
-dlopen (const char *file, int mode)
-{
-  char dllfn[MAX_PATH], *p;
-  HANDLE dllhandle;
-
-  if ((mode & ~(RTLD_LAZY | RTLD_NOW | RTLD_GLOBAL)) != 0)
-    {
-      errno = EINVAL;
-      last_err = ERROR_INVALID_PARAMETER;
-      return NULL;
-    }
-
-  if (!file)
-    dllhandle = GetModuleHandle (NULL);
-  else
-    {
-      /* MSDN says to be sure to use backslashes in the DLL file name.  */
-      strcpy (dllfn, file);
-      for (p = dllfn; *p; p++)
-        if (*p == '/')
-          *p = '\\';
-
-      dllhandle = LoadLibrary (dllfn);
-    }
-  if (!dllhandle)
-    last_err = GetLastError ();
-
-  return dllhandle;
-}
-
-char *
-dlerror (void)
-{
-  static char errbuf[1024];
-  DWORD ret;
-
-  if (!last_err)
-    return NULL;
-
-  ret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
-                       | FORMAT_MESSAGE_IGNORE_INSERTS,
-                       NULL, last_err, 0, errbuf, sizeof (errbuf), NULL);
-  while (ret > 0 && (errbuf[ret - 1] == '\n' || errbuf[ret - 1] == '\r'))
-    --ret;
-
-  errbuf[ret] = '\0';
-  if (!ret)
-    sprintf (errbuf, "Error code %lu", last_err);
-
-  last_err = 0;
-  return errbuf;
-}
-
-void *
-dlsym (void *handle, const char *name)
-{
-  FARPROC addr = NULL;
-
-  if (!handle || handle == INVALID_HANDLE_VALUE)
-    {
-      last_err = ERROR_INVALID_PARAMETER;
-      return NULL;
-    }
-
-  addr = GetProcAddress (handle, name);
-  if (!addr)
-    last_err = GetLastError ();
-
-  return (void *)addr;
-}
-
-int
-dlclose (void *handle)
-{
-  if (!handle || handle == INVALID_HANDLE_VALUE)
-    return -1;
-  if (!FreeLibrary (handle))
-    return -1;
-
-  return 0;
-}
-
-
-#endif  /* MAKE_LOAD */
-
-
-/* MS runtime's isatty returns non-zero for any character device,
-   including the null device, which is not what we want.  */
-int
-isatty (int fd)
-{
-  HANDLE fh = (HANDLE) _get_osfhandle (fd);
-  DWORD con_mode;
-
-  if (fh == INVALID_HANDLE_VALUE)
-    {
-      errno = EBADF;
-      return 0;
-    }
-  if (GetConsoleMode (fh, &con_mode))
-    return 1;
-
-  errno = ENOTTY;
-  return 0;
-}
-
-char *
-ttyname (int fd)
-{
-  /* This "knows" that Make only asks about stdout and stderr.  A more
-     sophisticated implementation should test whether FD is open for
-     input or output.  We can do that by looking at the mode returned
-     by GetConsoleMode.  */
-  return "CONOUT$";
-}
diff --git a/w32/include/dirent.h b/w32/include/dirent.h
deleted file mode 100644 (file)
index bae8449..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Windows version of dirent.h
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _DIRENT_H
-#define _DIRENT_H
-
-#ifdef __MINGW32__
-# include <windows.h>
-# include_next <dirent.h>
-#else
-
-#include <stdlib.h>
-#include <windows.h>
-#include <limits.h>
-#include <sys/types.h>
-
-#ifndef NAME_MAX
-#define NAME_MAX 255
-#endif
-
-#define __DIRENT_COOKIE 0xfefeabab
-
-
-struct dirent
-{
-  ino_t d_ino;                  /* unused - no equivalent on WINDOWS32 */
-  char d_name[NAME_MAX+1];
-};
-
-typedef struct dir_struct {
-        ULONG   dir_ulCookie;
-        HANDLE  dir_hDirHandle;
-        DWORD   dir_nNumFiles;
-        char    dir_pDirectoryName[NAME_MAX+1];
-        struct dirent dir_sdReturn;
-} DIR;
-
-DIR *opendir(const char *);
-struct dirent *readdir(DIR *);
-void rewinddir(DIR *);
-void closedir(DIR *);
-int telldir(DIR *);
-void seekdir(DIR *, long);
-
-#endif  /* !__MINGW32__ */
-#endif
diff --git a/w32/include/dlfcn.h b/w32/include/dlfcn.h
deleted file mode 100644 (file)
index 5a2ae28..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* dlfcn.h replacement for MS-Windows build.
-Copyright (C) 2013-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef DLFCN_H
-#define DLFCN_H
-
-#define RTLD_LAZY   1
-#define RTLD_NOW    2
-#define RTLD_GLOBAL 4
-
-extern void *dlopen (const char *, int);
-extern void *dlsym (void *, const char *);
-extern char *dlerror (void);
-extern int   dlclose (void *);
-
-#endif  /* DLFCN_H */
diff --git a/w32/include/pathstuff.h b/w32/include/pathstuff.h
deleted file mode 100644 (file)
index 923dc00..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Definitions for Windows path manipulation.
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _PATHSTUFF_H
-#define _PATHSTUFF_H
-
-char *convert_Path_to_windows32(char *Path, char to_delim);
-char *convert_vpath_to_windows32(char *Path, char to_delim);
-char *w32ify(const char *file, int resolve);
-char *getcwd_fs(char *buf, int len);
-
-#endif
diff --git a/w32/include/sub_proc.h b/w32/include/sub_proc.h
deleted file mode 100644 (file)
index 4afa4b4..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Definitions for Windows process invocation.
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef SUB_PROC_H
-#define SUB_PROC_H
-
-/*
- * Component Name:
- *
- * $Date$
- *
- * $Source$
- *
- * $Id$
- */
-
-#define EXTERN_DECL(entry, args) extern entry args
-#define VOID_DECL void
-
-EXTERN_DECL(HANDLE process_init, (VOID_DECL));
-EXTERN_DECL(HANDLE process_init_fd, (HANDLE stdinh, HANDLE stdouth,
-                                     HANDLE stderrh));
-EXTERN_DECL(long process_begin, (HANDLE proc, char **argv, char **envp,
-                                 char *exec_path, char *as_user));
-EXTERN_DECL(long process_pipe_io, (HANDLE proc, char *stdin_data,
-                                   int stdin_data_len));
-EXTERN_DECL(long process_file_io, (HANDLE proc));
-EXTERN_DECL(void process_cleanup, (HANDLE proc));
-EXTERN_DECL(HANDLE process_wait_for_any, (int block, DWORD* pdwWaitStatus));
-EXTERN_DECL(void process_register, (HANDLE proc));
-EXTERN_DECL(HANDLE process_easy, (char** argv, char** env,
-                                  int outfd, int errfd));
-EXTERN_DECL(BOOL process_kill, (HANDLE proc, int signal));
-EXTERN_DECL(int process_used_slots, (VOID_DECL));
-EXTERN_DECL(DWORD process_set_handles, (HANDLE *handles));
-
-/* support routines */
-EXTERN_DECL(long process_errno, (HANDLE proc));
-EXTERN_DECL(long process_last_err, (HANDLE proc));
-EXTERN_DECL(long process_exit_code, (HANDLE proc));
-EXTERN_DECL(long process_signal, (HANDLE proc));
-EXTERN_DECL(char * process_outbuf, (HANDLE proc));
-EXTERN_DECL(char * process_errbuf, (HANDLE proc));
-EXTERN_DECL(int process_outcnt, (HANDLE proc));
-EXTERN_DECL(int process_errcnt, (HANDLE proc));
-EXTERN_DECL(void process_pipes, (HANDLE proc, int pipes[3]));
-EXTERN_DECL(void process_noinherit, (int fildes));
-
-#endif
diff --git a/w32/include/w32err.h b/w32/include/w32err.h
deleted file mode 100644 (file)
index b4292f2..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Definitions for Windows error handling.
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef _W32ERR_H_
-#define _W32ERR_H_
-
-#ifndef EXTERN_DECL
-#define EXTERN_DECL(entry, args) entry args
-#endif
-
-EXTERN_DECL(const char * map_windows32_error_to_string, (DWORD error));
-
-#endif /* !_W32ERR_H */
diff --git a/w32/pathstuff.c b/w32/pathstuff.c
deleted file mode 100644 (file)
index 9bd55e6..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-/* Path conversion for Windows pathnames.
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-#include <string.h>
-#include <stdlib.h>
-#include "pathstuff.h"
-
-/*
- * Convert delimiter separated vpath to Canonical format.
- */
-char *
-convert_vpath_to_windows32(char *Path, char to_delim)
-{
-    char *etok;            /* token separator for old Path */
-
-        /*
-         * Convert all spaces to delimiters. Note that pathnames which
-         * contain blanks get trounced here. Use 8.3 format as a workaround.
-         */
-        for (etok = Path; etok && *etok; etok++)
-                if (ISBLANK ((unsigned char) *etok))
-                        *etok = to_delim;
-
-        return (convert_Path_to_windows32(Path, to_delim));
-}
-
-/*
- * Convert delimiter separated path to Canonical format.
- */
-char *
-convert_Path_to_windows32(char *Path, char to_delim)
-{
-    char *etok;            /* token separator for old Path */
-    char *p;            /* points to element of old Path */
-
-    /* is this a multi-element Path ? */
-    /* FIXME: Perhaps use ":;\"" in strpbrk to convert all quotes to
-       delimiters as well, as a way to handle quoted directories in
-       PATH?  */
-    for (p = Path, etok = strpbrk(p, ":;");
-         etok;
-         etok = strpbrk(p, ":;"))
-        if ((etok - p) == 1) {
-            if (*(etok - 1) == ';' ||
-                *(etok - 1) == ':') {
-                etok[-1] = to_delim;
-                etok[0] = to_delim;
-                p = ++etok;
-                continue;    /* ignore empty bucket */
-            } else if (!isalpha ((unsigned char) *p)) {
-                /* found one to count, handle things like '.' */
-                *etok = to_delim;
-                p = ++etok;
-            } else if ((*etok == ':') && (etok = strpbrk(etok+1, ":;"))) {
-                /* found one to count, handle drive letter */
-                *etok = to_delim;
-                p = ++etok;
-            } else
-                /* all finished, force abort */
-                p += strlen(p);
-        } else if (*p == '"') { /* a quoted directory */
-            for (p++; *p && *p != '"'; p++) /* skip quoted part */
-                ;
-            etok = strpbrk(p, ":;");        /* find next delimiter */
-            if (etok) {
-                *etok = to_delim;
-                p = ++etok;
-            } else
-                p += strlen(p);
-        } else {
-            /* found another one, no drive letter */
-            *etok = to_delim;
-            p = ++etok;
-        }
-
-    return Path;
-}
-
-/*
- * Convert to forward slashes. Resolve to full pathname optionally
- */
-char *
-w32ify(const char *filename, int resolve)
-{
-    static char w32_path[FILENAME_MAX];
-    char *p;
-
-    if (resolve)
-        _fullpath(w32_path, filename, sizeof (w32_path));
-    else
-        strncpy(w32_path, filename, sizeof (w32_path));
-
-    for (p = w32_path; p && *p; p++)
-        if (*p == '\\')
-            *p = '/';
-
-    return w32_path;
-}
-
-char *
-getcwd_fs(char* buf, int len)
-{
-        char *p = getcwd(buf, len);
-
-        if (p) {
-                char *q = w32ify(buf, 0);
-                strncpy(buf, q, len);
-        }
-
-        return p;
-}
-
-#ifdef unused
-/*
- * Convert delimiter separated pathnames (e.g. PATH) or single file pathname
- * (e.g. c:/foo, c:\bar) to NutC format. If we are handed a string that
- * _NutPathToNutc() fails to convert, just return the path we were handed
- * and assume the caller will know what to do with it (It was probably
- * a mistake to try and convert it anyway due to some of the bizarre things
- * that might look like pathnames in makefiles).
- */
-char *
-convert_path_to_nutc(char *path)
-{
-    int  count;            /* count of path elements */
-    char *nutc_path;     /* new NutC path */
-    int  nutc_path_len;    /* length of buffer to allocate for new path */
-    char *pathp;        /* pointer to nutc_path used to build it */
-    char *etok;            /* token separator for old path */
-    char *p;            /* points to element of old path */
-    char sep;            /* what flavor of separator used in old path */
-    char *rval;
-
-    /* is this a multi-element path ? */
-    for (p = path, etok = strpbrk(p, ":;"), count = 0;
-         etok;
-         etok = strpbrk(p, ":;"))
-        if ((etok - p) == 1) {
-            if (*(etok - 1) == ';' ||
-                *(etok - 1) == ':') {
-                p = ++etok;
-                continue;    /* ignore empty bucket */
-            } else if (etok = strpbrk(etok+1, ":;"))
-                /* found one to count, handle drive letter */
-                p = ++etok, count++;
-            else
-                /* all finished, force abort */
-                p += strlen(p);
-        } else
-            /* found another one, no drive letter */
-            p = ++etok, count++;
-
-    if (count) {
-        count++;    /* x1;x2;x3 <- need to count x3 */
-
-        /*
-         * Hazard a guess on how big the buffer needs to be.
-         * We have to convert things like c:/foo to /c=/foo.
-         */
-        nutc_path_len = strlen(path) + (count*2) + 1;
-        nutc_path = xmalloc(nutc_path_len);
-        pathp = nutc_path;
-        *pathp = '\0';
-
-        /*
-         * Loop through PATH and convert one elemnt of the path at at
-         * a time. Single file pathnames will fail this and fall
-         * to the logic below loop.
-         */
-        for (p = path, etok = strpbrk(p, ":;");
-             etok;
-             etok = strpbrk(p, ":;")) {
-
-            /* don't trip up on device specifiers or empty path slots */
-            if ((etok - p) == 1)
-                if (*(etok - 1) == ';' ||
-                    *(etok - 1) == ':') {
-                    p = ++etok;
-                    continue;
-                } else if ((etok = strpbrk(etok+1, ":;")) == NULL)
-                    break;    /* thing found was a WINDOWS32 pathname */
-
-            /* save separator */
-            sep = *etok;
-
-            /* terminate the current path element -- temporarily */
-            *etok = '\0';
-
-#ifdef __NUTC__
-            /* convert to NutC format */
-            if (_NutPathToNutc(p, pathp, 0) == FALSE) {
-                free(nutc_path);
-                rval = savestring(path, strlen(path));
-                return rval;
-            }
-#else
-            *pathp++ = '/';
-            *pathp++ = p[0];
-            *pathp++ = '=';
-            *pathp++ = '/';
-            strcpy(pathp, &p[2]);
-#endif
-
-            pathp += strlen(pathp);
-            *pathp++ = ':';     /* use Unix style path separtor for new path */
-            *pathp   = '\0'; /* make sure we are null terminaed */
-
-            /* restore path separator */
-            *etok = sep;
-
-            /* point p to first char of next path element */
-            p = ++etok;
-
-        }
-    } else {
-        nutc_path_len = strlen(path) + 3;
-        nutc_path = xmalloc(nutc_path_len);
-        pathp = nutc_path;
-        *pathp = '\0';
-        p = path;
-    }
-
-    /*
-      * OK, here we handle the last element in PATH (e.g. c of a;b;c)
-     * or the path was a single filename and will be converted
-     * here. Note, testing p here assures that we don't trip up
-     * on paths like a;b; which have trailing delimiter followed by
-     * nothing.
-     */
-    if (*p != '\0') {
-#ifdef __NUTC__
-        if (_NutPathToNutc(p, pathp, 0) == FALSE) {
-            free(nutc_path);
-            rval = savestring(path, strlen(path));
-            return rval;
-        }
-#else
-        *pathp++ = '/';
-        *pathp++ = p[0];
-        *pathp++ = '=';
-        *pathp++ = '/';
-        strcpy(pathp, &p[2]);
-#endif
-    } else
-        *(pathp-1) = '\0'; /* we're already done, don't leave trailing : */
-
-    rval = savestring(nutc_path, strlen(nutc_path));
-    free(nutc_path);
-    return rval;
-}
-
-#endif
diff --git a/w32/subproc/NMakefile b/w32/subproc/NMakefile
deleted file mode 100644 (file)
index 325e55c..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# NOTE: If you have no 'make' program at all to process this makefile, run
-# 'build.bat' instead.
-#
-# Copyright (C) 1996-2016 Free Software Foundation, Inc.
-# This file is part of GNU Make.
-#
-# GNU Make is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
-#
-# GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-#
-#       NMakefile for GNU Make (subproc library)
-#
-LIB = lib
-CC = cl
-MAKE = nmake
-
-OUTDIR=.
-MAKEFILE=NMakefile
-
-CFLAGS_any = /nologo /MT /W4 /GX /Z7 /YX /D WIN32 /D WINDOWS32 /D _WINDOWS  -I. -I../include -I../../
-CFLAGS_debug = $(CFLAGS_any) /Od /D _DEBUG /FR.\WinDebug\ /Fp.\WinDebug\subproc.pch /Fo.\WinDebug/
-CFLAGS_release = $(CFLAGS_any) /O2 /FR.\WinRel\ /Fp.\WinRel\subproc.pch /Fo.\WinRel/
-
-all: Release Debug
-
-Release:
-       $(MAKE) /f $(MAKEFILE) OUTDIR=WinRel CFLAGS="$(CFLAGS_release)" WinRel/subproc.lib
-Debug:
-       $(MAKE) /f $(MAKEFILE) OUTDIR=WinDebug CFLAGS="$(CFLAGS_debug)" WinDebug/subproc.lib
-
-clean:
-       rmdir /s /q WinRel WinDebug
-       erase *.pdb
-
-$(OUTDIR):
-       if not exist .\$@\nul mkdir .\$@
-
-OBJS = $(OUTDIR)/misc.obj $(OUTDIR)/w32err.obj $(OUTDIR)/sub_proc.obj
-
-$(OUTDIR)/subproc.lib: $(OUTDIR) $(OBJS)
-       $(LIB) -out:$@ @<<
-               $(OBJS)
-<<
-
-.c{$(OUTDIR)}.obj:
-       $(CC) $(CFLAGS) /c $<
-
-$(OUTDIR)/misc.obj: misc.c proc.h
-$(OUTDIR)/sub_proc.obj: sub_proc.c  ../include/sub_proc.h ../include/w32err.h proc.h
-$(OUTDIR)/w32err.obj: w32err.c ../include/w32err.h
diff --git a/w32/subproc/misc.c b/w32/subproc/misc.c
deleted file mode 100644 (file)
index 8b17413..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/* Process handling for Windows
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include <config.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <windows.h>
-#include "proc.h"
-
-
-/*
- * Description:  Convert a NULL string terminated UNIX environment block to
- *              an environment block suitable for a windows32 system call
- *
- * Returns:  TRUE= success, FALSE=fail
- *
- * Notes/Dependencies:  the environment block is sorted in case-insensitive
- *      order, is double-null terminated, and is a char *, not a char **
- */
-int _cdecl compare(const void *a1, const void *a2)
-{
-        return _stricoll(*((char**)a1),*((char**)a2));
-}
-bool_t
-arr2envblk(char **arr, char **envblk_out, int *envsize_needed)
-{
-        char **tmp;
-        int size_needed;
-        int arrcnt;
-        char *ptr;
-
-        arrcnt = 0;
-        while (arr[arrcnt]) {
-                arrcnt++;
-        }
-
-        tmp = (char**) calloc(arrcnt + 1, sizeof(char *));
-        if (!tmp) {
-                return FALSE;
-        }
-
-        arrcnt = 0;
-        size_needed = *envsize_needed = 0;
-        while (arr[arrcnt]) {
-                tmp[arrcnt] = arr[arrcnt];
-                size_needed += strlen(arr[arrcnt]) + 1;
-                arrcnt++;
-        }
-        size_needed++;
-        *envsize_needed = size_needed;
-
-        qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare);
-
-        ptr = *envblk_out = calloc(size_needed, 1);
-        if (!ptr) {
-                free(tmp);
-                return FALSE;
-        }
-
-        arrcnt = 0;
-        while (tmp[arrcnt]) {
-                strcpy(ptr, tmp[arrcnt]);
-                ptr += strlen(tmp[arrcnt]) + 1;
-                arrcnt++;
-        }
-
-        free(tmp);
-        return TRUE;
-}
diff --git a/w32/subproc/proc.h b/w32/subproc/proc.h
deleted file mode 100644 (file)
index 7ccb5ea..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Definitions for Windows
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef  _PROC_H
-#define _PROC_H
-
-typedef int bool_t;
-
-#define E_SCALL         101
-#define E_IO            102
-#define E_NO_MEM        103
-#define E_FORK          104
-
-extern bool_t arr2envblk(char **arr, char **envblk_out, int *envsize_needed);
-
-#endif
diff --git a/w32/subproc/sub_proc.c b/w32/subproc/sub_proc.c
deleted file mode 100644 (file)
index d34e840..0000000
+++ /dev/null
@@ -1,1482 +0,0 @@
-/* Process handling for Windows.
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include <config.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <io.h>         /* for _get_osfhandle */
-#ifdef _MSC_VER
-# include <stddef.h>    /* for intptr_t */
-#else
-# include <stdint.h>
-#endif
-#include <string.h>
-#include <process.h>  /* for msvc _beginthreadex, _endthreadex */
-#include <signal.h>
-#include <windows.h>
-
-#include "makeint.h"
-#include "filedef.h"
-#include "variable.h"
-#include "sub_proc.h"
-#include "proc.h"
-#include "w32err.h"
-#include "debug.h"
-
-static char *make_command_line(char *shell_name, char *exec_path, char **argv);
-
-typedef struct sub_process_t {
-        intptr_t sv_stdin[2];
-        intptr_t sv_stdout[2];
-        intptr_t sv_stderr[2];
-        int using_pipes;
-        char *inp;
-        DWORD incnt;
-        char * volatile outp;
-        volatile DWORD outcnt;
-        char * volatile errp;
-        volatile DWORD errcnt;
-        pid_t pid;
-        int exit_code;
-        int signal;
-        long last_err;
-        long lerrno;
-} sub_process;
-
-/* keep track of children so we can implement a waitpid-like routine */
-static sub_process *proc_array[MAXIMUM_WAIT_OBJECTS];
-static int proc_index = 0;
-static int fake_exits_pending = 0;
-
-
-/*
- * Fill a HANDLE list with handles to wait for.
- */
-DWORD
-process_set_handles(HANDLE *handles)
-{
-    DWORD count = 0;
-    int i;
-
-    /* Build array of handles to wait for */
-    for (i = 0; i < proc_index; i++) {
-        /* Don't wait on child processes that have already finished */
-        if (fake_exits_pending && proc_array[i]->exit_code)
-            continue;
-
-        handles[count++] = (HANDLE) proc_array[i]->pid;
-    }
-
-    return count;
-}
-
-/*
- * When a process has been waited for, adjust the wait state
- * array so that we don't wait for it again
- */
-static void
-process_adjust_wait_state(sub_process* pproc)
-{
-        int i;
-
-        if (!proc_index)
-                return;
-
-        for (i = 0; i < proc_index; i++)
-                if (proc_array[i]->pid == pproc->pid)
-                        break;
-
-        if (i < proc_index) {
-                proc_index--;
-                if (i != proc_index)
-                        memmove(&proc_array[i], &proc_array[i+1],
-                                (proc_index-i) * sizeof(sub_process*));
-                proc_array[proc_index] = NULL;
-        }
-}
-
-/*
- * Waits for any of the registered child processes to finish.
- */
-static sub_process *
-process_wait_for_any_private(int block, DWORD* pdwWaitStatus)
-{
-        HANDLE handles[MAXIMUM_WAIT_OBJECTS];
-        DWORD retval, which;
-        int i;
-
-        if (!proc_index)
-                return NULL;
-
-        /* build array of handles to wait for */
-        for (i = 0; i < proc_index; i++) {
-                handles[i] = (HANDLE) proc_array[i]->pid;
-
-                if (fake_exits_pending && proc_array[i]->exit_code)
-                        break;
-        }
-
-        /* wait for someone to exit */
-        if (!fake_exits_pending) {
-                retval = WaitForMultipleObjects(proc_index, handles, FALSE, (block ? INFINITE : 0));
-                which = retval - WAIT_OBJECT_0;
-        } else {
-                fake_exits_pending--;
-                retval = !WAIT_FAILED;
-                which = i;
-        }
-
-        /* If the pointer is not NULL, set the wait status result variable. */
-        if (pdwWaitStatus)
-            *pdwWaitStatus = retval;
-
-        /* return pointer to process */
-        if ((retval == WAIT_TIMEOUT) || (retval == WAIT_FAILED)) {
-                return NULL;
-        }
-        else {
-                sub_process* pproc = proc_array[which];
-                process_adjust_wait_state(pproc);
-                return pproc;
-        }
-}
-
-/*
- * Terminate a process.
- */
-BOOL
-process_kill(HANDLE proc, int signal)
-{
-        sub_process* pproc = (sub_process*) proc;
-        pproc->signal = signal;
-        return (TerminateProcess((HANDLE) pproc->pid, signal));
-}
-
-/*
- * Use this function to register processes you wish to wait for by
- * calling process_file_io(NULL) or process_wait_any(). This must be done
- * because it is possible for callers of this library to reuse the same
- * handle for multiple processes launches :-(
- */
-void
-process_register(HANDLE proc)
-{
-        if (proc_index < MAXIMUM_WAIT_OBJECTS)
-                proc_array[proc_index++] = (sub_process *) proc;
-}
-
-/*
- * Return the number of processes that we are still waiting for.
- */
-int
-process_used_slots(void)
-{
-        return proc_index;
-}
-
-/*
- * Public function which works kind of like waitpid(). Wait for any
- * of the children to die and return results. To call this function,
- * you must do 1 of things:
- *
- *      x = process_easy(...);
- *
- * or
- *
- *      x = process_init_fd();
- *      process_register(x);
- *
- * or
- *
- *      x = process_init();
- *      process_register(x);
- *
- * You must NOT then call process_pipe_io() because this function is
- * not capable of handling automatic notification of any child
- * death.
- */
-
-HANDLE
-process_wait_for_any(int block, DWORD* pdwWaitStatus)
-{
-        sub_process* pproc = process_wait_for_any_private(block, pdwWaitStatus);
-
-        if (!pproc)
-                return NULL;
-        else {
-                /*
-                 * Ouch! can't tell caller if this fails directly. Caller
-                 * will have to use process_last_err()
-                 */
-                (void) process_file_io(pproc);
-                return ((HANDLE) pproc);
-        }
-}
-
-long
-process_signal(HANDLE proc)
-{
-        if (proc == INVALID_HANDLE_VALUE) return 0;
-        return (((sub_process *)proc)->signal);
-}
-
-long
-process_last_err(HANDLE proc)
-{
-        if (proc == INVALID_HANDLE_VALUE) return ERROR_INVALID_HANDLE;
-        return (((sub_process *)proc)->last_err);
-}
-
-long
-process_exit_code(HANDLE proc)
-{
-        if (proc == INVALID_HANDLE_VALUE) return EXIT_FAILURE;
-        return (((sub_process *)proc)->exit_code);
-}
-
-void
-process_noinherit(int fd)
-{
-  HANDLE fh = (HANDLE)_get_osfhandle(fd);
-
-  if (fh && fh != INVALID_HANDLE_VALUE)
-        SetHandleInformation(fh, HANDLE_FLAG_INHERIT, 0);
-}
-
-/*
-2006-02:
-All the following functions are currently unused.
-All of them would crash gmake if called with argument INVALID_HANDLE_VALUE.
-Hence whoever wants to use one of this functions must invent and implement
-a reasonable error handling for this function.
-
-char *
-process_outbuf(HANDLE proc)
-{
-        return (((sub_process *)proc)->outp);
-}
-
-char *
-process_errbuf(HANDLE proc)
-{
-        return (((sub_process *)proc)->errp);
-}
-
-int
-process_outcnt(HANDLE proc)
-{
-        return (((sub_process *)proc)->outcnt);
-}
-
-int
-process_errcnt(HANDLE proc)
-{
-        return (((sub_process *)proc)->errcnt);
-}
-
-void
-process_pipes(HANDLE proc, int pipes[3])
-{
-        pipes[0] = ((sub_process *)proc)->sv_stdin[0];
-        pipes[1] = ((sub_process *)proc)->sv_stdout[0];
-        pipes[2] = ((sub_process *)proc)->sv_stderr[0];
-        return;
-}
-*/
-
-        HANDLE
-process_init()
-{
-        sub_process *pproc;
-        /*
-         * open file descriptors for attaching stdin/stdout/sterr
-         */
-        HANDLE stdin_pipes[2];
-        HANDLE stdout_pipes[2];
-        HANDLE stderr_pipes[2];
-        SECURITY_ATTRIBUTES inherit;
-        BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
-
-        pproc = malloc(sizeof(*pproc));
-        memset(pproc, 0, sizeof(*pproc));
-
-        /* We can't use NULL for lpSecurityDescriptor because that
-           uses the default security descriptor of the calling process.
-           Instead we use a security descriptor with no DACL.  This
-           allows nonrestricted access to the associated objects. */
-
-        if (!InitializeSecurityDescriptor((PSECURITY_DESCRIPTOR)(&sd),
-                                          SECURITY_DESCRIPTOR_REVISION)) {
-                pproc->last_err = GetLastError();
-                pproc->lerrno = E_SCALL;
-                return((HANDLE)pproc);
-        }
-
-        inherit.nLength = sizeof(inherit);
-        inherit.lpSecurityDescriptor = (PSECURITY_DESCRIPTOR)(&sd);
-        inherit.bInheritHandle = TRUE;
-
-        // By convention, parent gets pipe[0], and child gets pipe[1]
-        // This means the READ side of stdin pipe goes into pipe[1]
-        // and the WRITE side of the stdout and stderr pipes go into pipe[1]
-        if (CreatePipe( &stdin_pipes[1], &stdin_pipes[0], &inherit, 0) == FALSE ||
-        CreatePipe( &stdout_pipes[0], &stdout_pipes[1], &inherit, 0) == FALSE ||
-        CreatePipe( &stderr_pipes[0], &stderr_pipes[1], &inherit, 0) == FALSE) {
-
-                pproc->last_err = GetLastError();
-                pproc->lerrno = E_SCALL;
-                return((HANDLE)pproc);
-        }
-
-        //
-        // Mark the parent sides of the pipes as non-inheritable
-        //
-        if (SetHandleInformation(stdin_pipes[0],
-                                HANDLE_FLAG_INHERIT, 0) == FALSE ||
-                SetHandleInformation(stdout_pipes[0],
-                                HANDLE_FLAG_INHERIT, 0) == FALSE ||
-                SetHandleInformation(stderr_pipes[0],
-                                HANDLE_FLAG_INHERIT, 0) == FALSE) {
-
-                pproc->last_err = GetLastError();
-                pproc->lerrno = E_SCALL;
-                return((HANDLE)pproc);
-        }
-        pproc->sv_stdin[0]  = (intptr_t) stdin_pipes[0];
-        pproc->sv_stdin[1]  = (intptr_t) stdin_pipes[1];
-        pproc->sv_stdout[0] = (intptr_t) stdout_pipes[0];
-        pproc->sv_stdout[1] = (intptr_t) stdout_pipes[1];
-        pproc->sv_stderr[0] = (intptr_t) stderr_pipes[0];
-        pproc->sv_stderr[1] = (intptr_t) stderr_pipes[1];
-
-        pproc->using_pipes = 1;
-
-        pproc->lerrno = 0;
-
-        return((HANDLE)pproc);
-}
-
-
-        HANDLE
-process_init_fd(HANDLE stdinh, HANDLE stdouth, HANDLE stderrh)
-{
-        sub_process *pproc;
-
-        pproc = malloc(sizeof(*pproc));
-        if (pproc) {
-                memset(pproc, 0, sizeof(*pproc));
-
-                /*
-                 * Just pass the provided file handles to the 'child
-                 * side' of the pipe, bypassing pipes altogether.
-                 */
-                pproc->sv_stdin[1]  = (intptr_t) stdinh;
-                pproc->sv_stdout[1] = (intptr_t) stdouth;
-                pproc->sv_stderr[1] = (intptr_t) stderrh;
-
-                pproc->last_err = pproc->lerrno = 0;
-        }
-
-        return((HANDLE)pproc);
-}
-
-
-static HANDLE
-find_file(const char *exec_path, const char *path_var,
-          char *full_fname, DWORD full_len)
-{
-        HANDLE exec_handle;
-        char *fname;
-        char *ext;
-        DWORD req_len;
-        int i;
-        static const char *extensions[] =
-          /* Should .com come before no-extension case?  */
-          { ".exe", ".cmd", ".bat", "", ".com", NULL };
-
-        fname = xmalloc(strlen(exec_path) + 5);
-        strcpy(fname, exec_path);
-        ext = fname + strlen(fname);
-
-        for (i = 0; extensions[i]; i++) {
-                strcpy(ext, extensions[i]);
-                if (((req_len = SearchPath (path_var, fname, NULL, full_len,
-                                            full_fname, NULL)) > 0
-                     /* For compatibility with previous code, which
-                        used OpenFile, and with Windows operation in
-                        general, also look in various default
-                        locations, such as Windows directory and
-                        Windows System directory.  Warning: this also
-                        searches PATH in the Make's environment, which
-                        might not be what the Makefile wants, but it
-                        seems to be OK as a fallback, after the
-                        previous SearchPath failed to find on child's
-                        PATH.  */
-                     || (req_len = SearchPath (NULL, fname, NULL, full_len,
-                                               full_fname, NULL)) > 0)
-                    && req_len <= full_len
-                    && (exec_handle =
-                                CreateFile(full_fname,
-                                           GENERIC_READ,
-                                           FILE_SHARE_READ | FILE_SHARE_WRITE,
-                                           NULL,
-                                           OPEN_EXISTING,
-                                           FILE_ATTRIBUTE_NORMAL,
-                                           NULL)) != INVALID_HANDLE_VALUE) {
-                        free(fname);
-                        return(exec_handle);
-                }
-        }
-
-        free(fname);
-        return INVALID_HANDLE_VALUE;
-}
-
-/*
- * Return non-zero of FNAME specifies a batch file and its name
- * includes embedded whitespace.
- */
-
-static int
-batch_file_with_spaces(const char *fname)
-{
-        size_t fnlen = strlen(fname);
-
-        return (fnlen > 4
-                && (_strnicmp(fname + fnlen - 4, ".bat", 4) == 0
-                    || _strnicmp(fname + fnlen - 4, ".cmd", 4) == 0)
-                /* The set of characters in the 2nd arg to strpbrk
-                   should be the same one used by make_command_line
-                   below to decide whether an argv[] element needs
-                   quoting.  */
-                && strpbrk(fname, " \t") != NULL);
-}
-
-
-/*
- * Description:   Create the child process to be helped
- *
- * Returns: success <=> 0
- *
- * Notes/Dependencies:
- */
-long
-process_begin(
-        HANDLE proc,
-        char **argv,
-        char **envp,
-        char *exec_path,
-        char *as_user)
-{
-        sub_process *pproc = (sub_process *)proc;
-        char *shell_name = 0;
-        int file_not_found=0;
-        HANDLE exec_handle;
-        char exec_fname[MAX_PATH];
-        const char *path_var = NULL;
-        char **ep;
-        char buf[MAX_PATH];
-        DWORD bytes_returned;
-        DWORD flags;
-        char *command_line;
-        STARTUPINFO startInfo;
-        PROCESS_INFORMATION procInfo;
-        char *envblk=NULL;
-        int envsize_needed = 0;
-        int pass_null_exec_path = 0;
-
-        /*
-         *  Shell script detection...  if the exec_path starts with #! then
-         *  we want to exec shell-script-name exec-path, not just exec-path
-         *  NT doesn't recognize #!/bin/sh or #!/etc/Tivoli/bin/perl.  We do not
-         *  hard-code the path to the shell or perl or whatever:  Instead, we
-         *  assume it's in the path somewhere (generally, the NT tools
-         *  bin directory)
-         */
-
-        /* Use the Makefile's value of PATH to look for the program to
-           execute, because it could be different from Make's PATH
-           (e.g., if the target sets its own value.  */
-        if (envp)
-                for (ep = envp; *ep; ep++) {
-                        if (strncmp (*ep, "PATH=", 5) == 0
-                            || strncmp (*ep, "Path=", 5) == 0) {
-                                path_var = *ep + 5;
-                                break;
-                        }
-                }
-        exec_handle = find_file(exec_path, path_var,
-                                exec_fname, sizeof(exec_fname));
-
-        /*
-         * If we couldn't open the file, just assume that Windows will be
-         * somehow able to find and execute it.  If the first character
-         * of the command is '/', assume they set SHELL to a Unixy shell
-         * that have some magic mounts known only to it, and run the whole
-         * command via $SHELL -c "COMMAND" instead.
-         */
-        if (exec_handle == INVALID_HANDLE_VALUE) {
-                if (exec_path[0] == '/') {
-                        char *new_argv0;
-                        char **argvi = argv;
-                        int arglen = 0;
-
-                        strcpy(buf, variable_expand ("$(SHELL)"));
-                        shell_name = &buf[0];
-                        strcpy(exec_fname, "-c");
-                        /* Construct a single command string in argv[0].  */
-                        while (*argvi) {
-                                arglen += strlen(*argvi) + 1;
-                                argvi++;
-                        }
-                        new_argv0 = xmalloc(arglen + 1);
-                        new_argv0[0] = '\0';
-                        for (argvi = argv; *argvi; argvi++) {
-                                strcat(new_argv0, *argvi);
-                                strcat(new_argv0, " ");
-                        }
-                        /* Remove the extra blank at the end.  */
-                        new_argv0[arglen-1] = '\0';
-                        free(argv[0]);
-                        argv[0] = new_argv0;
-                        argv[1] = NULL;
-                }
-                else
-                        file_not_found++;
-        }
-        else {
-                /* Attempt to read the first line of the file */
-                if (ReadFile( exec_handle,
-                                buf, sizeof(buf) - 1, /* leave room for trailing NULL */
-                                &bytes_returned, 0) == FALSE || bytes_returned < 2) {
-
-                        pproc->last_err = GetLastError();
-                        pproc->lerrno = E_IO;
-                        CloseHandle(exec_handle);
-                        return(-1);
-                }
-                if (buf[0] == '#' && buf[1] == '!') {
-                        /*
-                         *  This is a shell script...  Change the command line from
-                         *      exec_path args to shell_name exec_path args
-                         */
-                        char *p;
-
-                        /*  Make sure buf is NULL terminated */
-                        buf[bytes_returned] = 0;
-                        /*
-                         * Depending on the file system type, etc. the first line
-                         * of the shell script may end with newline or newline-carriage-return
-                         * Whatever it ends with, cut it off.
-                         */
-                        p= strchr(buf, '\n');
-                        if (p)
-                                *p = 0;
-                        p = strchr(buf, '\r');
-                        if (p)
-                                *p = 0;
-
-                        /*
-                         *  Find base name of shell
-                         */
-                        shell_name = strrchr( buf, '/');
-                        if (shell_name) {
-                                shell_name++;
-                        } else {
-                                shell_name = &buf[2];/* skipping "#!" */
-                        }
-
-                }
-                CloseHandle(exec_handle);
-        }
-
-        flags = 0;
-
-        if (file_not_found)
-                command_line = make_command_line( shell_name, exec_path, argv);
-        else {
-                /* If exec_fname includes whitespace, CreateProcess
-                   behaves erratically and unreliably, and often fails
-                   if argv[0] also includes whitespace (and thus will
-                   be quoted by make_command_line below).  So in that
-                   case, we don't pass exec_fname as the 1st arg to
-                   CreateProcess, but instead replace argv[0] with
-                   exec_fname (to keep its leading directories and
-                   extension as found by find_file), and pass NULL to
-                   CreateProcess as its 1st arg.  This works around
-                   the bugs in CreateProcess, which are probably
-                   caused by its passing the command to cmd.exe with
-                   some incorrect quoting.  */
-                if (!shell_name
-                    && batch_file_with_spaces(exec_fname)
-                    && _stricmp(exec_path, argv[0]) == 0) {
-                        char *new_argv, *p;
-                        char **argvi;
-                        int arglen, i;
-                        pass_null_exec_path = 1;
-                        /* Rewrite argv[] replacing argv[0] with exec_fname.  */
-                        for (argvi = argv + 1, arglen = strlen(exec_fname) + 1;
-                             *argvi;
-                             argvi++) {
-                                arglen += strlen(*argvi) + 1;
-                        }
-                        new_argv = xmalloc(arglen);
-                        p = strcpy(new_argv, exec_fname) + strlen(exec_fname) + 1;
-                        for (argvi = argv + 1, i = 1; *argvi; argvi++, i++) {
-                                strcpy(p, *argvi);
-                                argv[i] = p;
-                                p += strlen(*argvi) + 1;
-                        }
-                        argv[i] = NULL;
-                        free (argv[0]);
-                        argv[0] = new_argv;
-                }
-                command_line = make_command_line( shell_name, exec_fname, argv);
-        }
-
-        if ( command_line == NULL ) {
-                pproc->last_err = 0;
-                pproc->lerrno = E_NO_MEM;
-                return(-1);
-        }
-
-        if (envp) {
-                if (arr2envblk(envp, &envblk, &envsize_needed) == FALSE) {
-                        pproc->lerrno = E_NO_MEM;
-                        free( command_line );
-                        if ((pproc->last_err == ERROR_INVALID_PARAMETER
-                             || pproc->last_err == ERROR_MORE_DATA)
-                            && envsize_needed > 32*1024) {
-                                fprintf (stderr, "CreateProcess failed, probably because environment is too large (%d bytes).\n",
-                                         envsize_needed);
-                        }
-                        pproc->last_err = 0;
-                        return(-1);
-                }
-        }
-
-        if (shell_name || file_not_found || pass_null_exec_path) {
-                exec_path = 0;  /* Search for the program in %Path% */
-        } else {
-                exec_path = exec_fname;
-        }
-
-        /*
-         *  Set up inherited stdin, stdout, stderr for child
-         */
-        memset(&startInfo, '\0', sizeof(startInfo));
-        GetStartupInfo(&startInfo);
-        startInfo.dwFlags = STARTF_USESTDHANDLES;
-        startInfo.lpReserved = 0;
-        startInfo.cbReserved2 = 0;
-        startInfo.lpReserved2 = 0;
-        startInfo.hStdInput = (HANDLE)pproc->sv_stdin[1];
-        startInfo.hStdOutput = (HANDLE)pproc->sv_stdout[1];
-        startInfo.hStdError = (HANDLE)pproc->sv_stderr[1];
-
-        if (as_user) {
-                free(envblk);
-                return -1;
-        } else {
-                DB (DB_JOBS, ("CreateProcess(%s,%s,...)\n",
-                        exec_path ? exec_path : "NULL",
-                        command_line ? command_line : "NULL"));
-                if (CreateProcess(
-                        exec_path,
-                        command_line,
-                        NULL,
-                        0, /* default security attributes for thread */
-                        TRUE, /* inherit handles (e.g. helper pipes, oserv socket) */
-                        flags,
-                        envblk,
-                        0, /* default starting directory */
-                        &startInfo,
-                        &procInfo) == FALSE) {
-
-                        pproc->last_err = GetLastError();
-                        pproc->lerrno = E_FORK;
-                        fprintf(stderr, "process_begin: CreateProcess(%s, %s, ...) failed.\n",
-                                exec_path ? exec_path : "NULL", command_line);
-                        free(envblk);
-                        free( command_line );
-                        return(-1);
-                }
-        }
-
-        pproc->pid = (pid_t)procInfo.hProcess;
-        /* Close the thread handle -- we'll just watch the process */
-        CloseHandle(procInfo.hThread);
-
-        /* Close the halves of the pipes we don't need */
-        if ((HANDLE)pproc->sv_stdin[1] != INVALID_HANDLE_VALUE)
-          CloseHandle((HANDLE)pproc->sv_stdin[1]);
-        if ((HANDLE)pproc->sv_stdout[1] != INVALID_HANDLE_VALUE)
-          CloseHandle((HANDLE)pproc->sv_stdout[1]);
-        if ((HANDLE)pproc->sv_stderr[1] != INVALID_HANDLE_VALUE)
-          CloseHandle((HANDLE)pproc->sv_stderr[1]);
-        pproc->sv_stdin[1] = 0;
-        pproc->sv_stdout[1] = 0;
-        pproc->sv_stderr[1] = 0;
-
-        free( command_line );
-        free(envblk);
-        pproc->lerrno=0;
-        return 0;
-}
-
-
-
-#if 0   /* unused */
-static DWORD
-proc_stdin_thread(sub_process *pproc)
-{
-        DWORD in_done;
-        for (;;) {
-                if (WriteFile( (HANDLE) pproc->sv_stdin[0], pproc->inp, pproc->incnt,
-                                         &in_done, NULL) == FALSE)
-                        _endthreadex(0);
-                // This if should never be true for anonymous pipes, but gives
-                // us a chance to change I/O mechanisms later
-                if (in_done < pproc->incnt) {
-                        pproc->incnt -= in_done;
-                        pproc->inp += in_done;
-                } else {
-                        _endthreadex(0);
-                }
-        }
-        return 0; // for compiler warnings only.. not reached
-}
-
-static DWORD
-proc_stdout_thread(sub_process *pproc)
-{
-        DWORD bufsize = 1024;
-        char c;
-        DWORD nread;
-        pproc->outp = malloc(bufsize);
-        if (pproc->outp == NULL)
-                _endthreadex(0);
-        pproc->outcnt = 0;
-
-        for (;;) {
-                if (ReadFile( (HANDLE)pproc->sv_stdout[0], &c, 1, &nread, NULL)
-                                        == FALSE) {
-/*                      map_windows32_error_to_string(GetLastError());*/
-                        _endthreadex(0);
-                }
-                if (nread == 0)
-                        _endthreadex(0);
-                if (pproc->outcnt + nread > bufsize) {
-                        bufsize += nread + 512;
-                        pproc->outp = realloc(pproc->outp, bufsize);
-                        if (pproc->outp == NULL) {
-                                pproc->outcnt = 0;
-                                _endthreadex(0);
-                        }
-                }
-                pproc->outp[pproc->outcnt++] = c;
-        }
-        return 0;
-}
-
-static DWORD
-proc_stderr_thread(sub_process *pproc)
-{
-        DWORD bufsize = 1024;
-        char c;
-        DWORD nread;
-        pproc->errp = malloc(bufsize);
-        if (pproc->errp == NULL)
-                _endthreadex(0);
-        pproc->errcnt = 0;
-
-        for (;;) {
-                if (ReadFile( (HANDLE)pproc->sv_stderr[0], &c, 1, &nread, NULL) == FALSE) {
-                        map_windows32_error_to_string(GetLastError());
-                        _endthreadex(0);
-                }
-                if (nread == 0)
-                        _endthreadex(0);
-                if (pproc->errcnt + nread > bufsize) {
-                        bufsize += nread + 512;
-                        pproc->errp = realloc(pproc->errp, bufsize);
-                        if (pproc->errp == NULL) {
-                                pproc->errcnt = 0;
-                                _endthreadex(0);
-                        }
-                }
-                pproc->errp[pproc->errcnt++] = c;
-        }
-        return 0;
-}
-
-
-/*
- * Purpose: collects output from child process and returns results
- *
- * Description:
- *
- * Returns:
- *
- * Notes/Dependencies:
- */
-        long
-process_pipe_io(
-        HANDLE proc,
-        char *stdin_data,
-        int stdin_data_len)
-{
-        sub_process *pproc = (sub_process *)proc;
-        bool_t stdin_eof = FALSE, stdout_eof = FALSE, stderr_eof = FALSE;
-        HANDLE childhand = (HANDLE) pproc->pid;
-        HANDLE tStdin = NULL, tStdout = NULL, tStderr = NULL;
-        unsigned int dwStdin, dwStdout, dwStderr;
-        HANDLE wait_list[4];
-        DWORD wait_count;
-        DWORD wait_return;
-        HANDLE ready_hand;
-        bool_t child_dead = FALSE;
-        BOOL GetExitCodeResult;
-
-        /*
-         *  Create stdin thread, if needed
-         */
-        pproc->inp = stdin_data;
-        pproc->incnt = stdin_data_len;
-        if (!pproc->inp) {
-                stdin_eof = TRUE;
-                CloseHandle((HANDLE)pproc->sv_stdin[0]);
-                pproc->sv_stdin[0] = 0;
-        } else {
-                tStdin = (HANDLE) _beginthreadex( 0, 1024,
-                        (unsigned (__stdcall *) (void *))proc_stdin_thread,
-                                                  pproc, 0, &dwStdin);
-                if (tStdin == 0) {
-                        pproc->last_err = GetLastError();
-                        pproc->lerrno = E_SCALL;
-                        goto done;
-                }
-        }
-
-        /*
-         *   Assume child will produce stdout and stderr
-         */
-        tStdout = (HANDLE) _beginthreadex( 0, 1024,
-                (unsigned (__stdcall *) (void *))proc_stdout_thread, pproc, 0,
-                &dwStdout);
-        tStderr = (HANDLE) _beginthreadex( 0, 1024,
-                (unsigned (__stdcall *) (void *))proc_stderr_thread, pproc, 0,
-                &dwStderr);
-
-        if (tStdout == 0 || tStderr == 0) {
-
-                pproc->last_err = GetLastError();
-                pproc->lerrno = E_SCALL;
-                goto done;
-        }
-
-
-        /*
-         *  Wait for all I/O to finish and for the child process to exit
-         */
-
-        while (!stdin_eof || !stdout_eof || !stderr_eof || !child_dead) {
-                wait_count = 0;
-                if (!stdin_eof) {
-                        wait_list[wait_count++] = tStdin;
-                }
-                if (!stdout_eof) {
-                        wait_list[wait_count++] = tStdout;
-                }
-                if (!stderr_eof) {
-                        wait_list[wait_count++] = tStderr;
-                }
-                if (!child_dead) {
-                        wait_list[wait_count++] = childhand;
-                }
-
-                wait_return = WaitForMultipleObjects(wait_count, wait_list,
-                         FALSE, /* don't wait for all: one ready will do */
-                         child_dead? 1000 :INFINITE); /* after the child dies, subthreads have
-                                one second to collect all remaining output */
-
-                if (wait_return == WAIT_FAILED) {
-/*                      map_windows32_error_to_string(GetLastError());*/
-                        pproc->last_err = GetLastError();
-                        pproc->lerrno = E_SCALL;
-                        goto done;
-                }
-
-                ready_hand = wait_list[wait_return - WAIT_OBJECT_0];
-
-                if (ready_hand == tStdin) {
-                        CloseHandle((HANDLE)pproc->sv_stdin[0]);
-                        pproc->sv_stdin[0] = 0;
-                        CloseHandle(tStdin);
-                        tStdin = 0;
-                        stdin_eof = TRUE;
-
-                } else if (ready_hand == tStdout) {
-
-                        CloseHandle((HANDLE)pproc->sv_stdout[0]);
-                        pproc->sv_stdout[0] = 0;
-                        CloseHandle(tStdout);
-                        tStdout = 0;
-                        stdout_eof = TRUE;
-
-                } else if (ready_hand == tStderr) {
-
-                        CloseHandle((HANDLE)pproc->sv_stderr[0]);
-                        pproc->sv_stderr[0] = 0;
-                        CloseHandle(tStderr);
-                        tStderr = 0;
-                        stderr_eof = TRUE;
-
-                } else if (ready_hand == childhand) {
-
-                        DWORD ierr;
-                        GetExitCodeResult = GetExitCodeProcess(childhand, &ierr);
-                        if (ierr == CONTROL_C_EXIT) {
-                                pproc->signal = SIGINT;
-                        } else {
-                                pproc->exit_code = ierr;
-                        }
-                        if (GetExitCodeResult == FALSE) {
-                                pproc->last_err = GetLastError();
-                                pproc->lerrno = E_SCALL;
-                                goto done;
-                        }
-                        child_dead = TRUE;
-
-                } else {
-
-                        /* ?? Got back a handle we didn't query ?? */
-                        pproc->last_err = 0;
-                        pproc->lerrno = E_FAIL;
-                        goto done;
-                }
-        }
-
- done:
-        if (tStdin != 0)
-                CloseHandle(tStdin);
-        if (tStdout != 0)
-                CloseHandle(tStdout);
-        if (tStderr != 0)
-                CloseHandle(tStderr);
-
-        if (pproc->lerrno)
-                return(-1);
-        else
-                return(0);
-
-}
-#endif  /* unused */
-
-/*
- * Purpose: collects output from child process and returns results
- *
- * Description:
- *
- * Returns:
- *
- * Notes/Dependencies:
- */
-        long
-process_file_io(
-        HANDLE proc)
-{
-        sub_process *pproc;
-        HANDLE childhand;
-        DWORD wait_return;
-        BOOL GetExitCodeResult;
-        DWORD ierr;
-
-        if (proc == NULL)
-                pproc = process_wait_for_any_private(1, 0);
-        else
-                pproc = (sub_process *)proc;
-
-        /* some sort of internal error */
-        if (!pproc)
-                return -1;
-
-        childhand = (HANDLE) pproc->pid;
-
-        /*
-         * This function is poorly named, and could also be used just to wait
-         * for child death if you're doing your own pipe I/O.  If that is
-         * the case, close the pipe handles here.
-         */
-        if (pproc->sv_stdin[0]) {
-                CloseHandle((HANDLE)pproc->sv_stdin[0]);
-                pproc->sv_stdin[0] = 0;
-        }
-        if (pproc->sv_stdout[0]) {
-                CloseHandle((HANDLE)pproc->sv_stdout[0]);
-                pproc->sv_stdout[0] = 0;
-        }
-        if (pproc->sv_stderr[0]) {
-                CloseHandle((HANDLE)pproc->sv_stderr[0]);
-                pproc->sv_stderr[0] = 0;
-        }
-
-        /*
-         *  Wait for the child process to exit
-         */
-
-        wait_return = WaitForSingleObject(childhand, INFINITE);
-
-        if (wait_return != WAIT_OBJECT_0) {
-/*              map_windows32_error_to_string(GetLastError());*/
-                pproc->last_err = GetLastError();
-                pproc->lerrno = E_SCALL;
-                goto done2;
-        }
-
-        GetExitCodeResult = GetExitCodeProcess(childhand, &ierr);
-        if (ierr == CONTROL_C_EXIT) {
-                pproc->signal = SIGINT;
-        } else {
-                pproc->exit_code = ierr;
-        }
-        if (GetExitCodeResult == FALSE) {
-                pproc->last_err = GetLastError();
-                pproc->lerrno = E_SCALL;
-        }
-
-done2:
-        if (pproc->lerrno)
-                return(-1);
-        else
-                return(0);
-
-}
-
-/*
- * Description:  Clean up any leftover handles, etc.  It is up to the
- * caller to manage and free the input, output, and stderr buffers.
- */
-        void
-process_cleanup(
-        HANDLE proc)
-{
-        sub_process *pproc = (sub_process *)proc;
-        int i;
-
-        if (pproc->using_pipes) {
-                for (i= 0; i <= 1; i++) {
-                        if ((HANDLE)pproc->sv_stdin[i]
-                            && (HANDLE)pproc->sv_stdin[i] != INVALID_HANDLE_VALUE)
-                                CloseHandle((HANDLE)pproc->sv_stdin[i]);
-                        if ((HANDLE)pproc->sv_stdout[i]
-                            && (HANDLE)pproc->sv_stdout[i] != INVALID_HANDLE_VALUE)
-                                CloseHandle((HANDLE)pproc->sv_stdout[i]);
-                        if ((HANDLE)pproc->sv_stderr[i]
-                            && (HANDLE)pproc->sv_stderr[i] != INVALID_HANDLE_VALUE)
-                                CloseHandle((HANDLE)pproc->sv_stderr[i]);
-                }
-        }
-        if ((HANDLE)pproc->pid)
-                CloseHandle((HANDLE)pproc->pid);
-
-        free(pproc);
-}
-
-
-/*
- * Description:
- *       Create a command line buffer to pass to CreateProcess
- *
- * Returns:  the buffer or NULL for failure
- *      Shell case:  sh_name a:/full/path/to/script argv[1] argv[2] ...
- *  Otherwise:   argv[0] argv[1] argv[2] ...
- *
- * Notes/Dependencies:
- *   CreateProcess does not take an argv, so this command creates a
- *   command line for the executable.
- */
-
-static char *
-make_command_line( char *shell_name, char *full_exec_path, char **argv)
-{
-        int             argc = 0;
-        char**          argvi;
-        int*            enclose_in_quotes = NULL;
-        int*            enclose_in_quotes_i;
-        unsigned int    bytes_required = 0;
-        char*           command_line;
-        char*           command_line_i;
-        int  cygwin_mode = 0; /* HAVE_CYGWIN_SHELL */
-        int have_sh = 0; /* HAVE_CYGWIN_SHELL */
-
-#ifdef HAVE_CYGWIN_SHELL
-        have_sh = (shell_name != NULL || strstr(full_exec_path, "sh.exe"));
-        cygwin_mode = 1;
-#endif
-
-        if (shell_name && full_exec_path) {
-                bytes_required
-                  = strlen(shell_name) + 1 + strlen(full_exec_path);
-                /*
-                 * Skip argv[0] if any, when shell_name is given.
-                 * The special case of "-c" in full_exec_path means
-                 * argv[0] is not the shell name, but the command string
-                 * to pass to the shell.
-                 */
-                if (*argv && strcmp(full_exec_path, "-c")) argv++;
-                /*
-                 * Add one for the intervening space.
-                 */
-                if (*argv) bytes_required++;
-        }
-
-        argvi = argv;
-        while (*(argvi++)) argc++;
-
-        if (argc) {
-                enclose_in_quotes = (int*) calloc(1, argc * sizeof(int));
-
-                if (!enclose_in_quotes) {
-                        return NULL;
-                }
-        }
-
-        /* We have to make one pass through each argv[i] to see if we need
-         * to enclose it in ", so we might as well figure out how much
-         * memory we'll need on the same pass.
-         */
-
-        argvi = argv;
-        enclose_in_quotes_i = enclose_in_quotes;
-        while(*argvi) {
-                char* p = *argvi;
-                unsigned int backslash_count = 0;
-
-                /*
-                 * We have to enclose empty arguments in ".
-                 */
-                if (!(*p)) *enclose_in_quotes_i = 1;
-
-                while(*p) {
-                        switch (*p) {
-                        case '\"':
-                                /*
-                                 * We have to insert a backslash for each "
-                                 * and each \ that precedes the ".
-                                 */
-                                bytes_required += (backslash_count + 1);
-                                backslash_count = 0;
-                                break;
-
-#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL)
-                        case '\\':
-                                backslash_count++;
-                                break;
-#endif
-        /*
-         * At one time we set *enclose_in_quotes_i for '*' or '?' to suppress
-         * wildcard expansion in programs linked with MSVC's SETARGV.OBJ so
-         * that argv in always equals argv out. This was removed.  Say you have
-         * such a program named glob.exe.  You enter
-         * glob '*'
-         * at the sh command prompt.  Obviously the intent is to make glob do the
-         * wildcarding instead of sh.  If we set *enclose_in_quotes_i for '*' or '?',
-         * then the command line that glob would see would be
-         * glob "*"
-         * and the _setargv in SETARGV.OBJ would _not_ expand the *.
-         */
-                        case ' ':
-                        case '\t':
-                                *enclose_in_quotes_i = 1;
-                                /* fall through */
-
-                        default:
-                                backslash_count = 0;
-                                break;
-                        }
-
-                        /*
-                         * Add one for each character in argv[i].
-                         */
-                        bytes_required++;
-
-                        p++;
-                }
-
-                if (*enclose_in_quotes_i) {
-                        /*
-                         * Add one for each enclosing ",
-                         * and one for each \ that precedes the
-                         * closing ".
-                         */
-                        bytes_required += (backslash_count + 2);
-                }
-
-                /*
-                 * Add one for the intervening space.
-                 */
-                if (*(++argvi)) bytes_required++;
-                enclose_in_quotes_i++;
-        }
-
-        /*
-         * Add one for the terminating NULL.
-         */
-        bytes_required++;
-
-        command_line = (char*) malloc(bytes_required);
-
-        if (!command_line) {
-                free(enclose_in_quotes);
-                return NULL;
-        }
-
-        command_line_i = command_line;
-
-        if (shell_name && full_exec_path) {
-                while(*shell_name) {
-                        *(command_line_i++) = *(shell_name++);
-                }
-
-                *(command_line_i++) = ' ';
-
-                while(*full_exec_path) {
-                        *(command_line_i++) = *(full_exec_path++);
-                }
-
-                if (*argv) {
-                        *(command_line_i++) = ' ';
-                }
-        }
-
-        argvi = argv;
-        enclose_in_quotes_i = enclose_in_quotes;
-
-        while(*argvi) {
-                char* p = *argvi;
-                unsigned int backslash_count = 0;
-
-                if (*enclose_in_quotes_i) {
-                        *(command_line_i++) = '\"';
-                }
-
-                while(*p) {
-                        if (*p == '\"') {
-                                if (cygwin_mode && have_sh) { /* HAVE_CYGWIN_SHELL */
-                                        /* instead of a \", cygwin likes "" */
-                                        *(command_line_i++) = '\"';
-                                } else {
-
-                                /*
-                                 * We have to insert a backslash for the "
-                                 * and each \ that precedes the ".
-                                 */
-                                backslash_count++;
-
-                                while(backslash_count) {
-                                        *(command_line_i++) = '\\';
-                                        backslash_count--;
-                                };
-                                }
-#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL)
-                        } else if (*p == '\\') {
-                                backslash_count++;
-                        } else {
-                                backslash_count = 0;
-#endif
-                        }
-
-                        /*
-                         * Copy the character.
-                         */
-                        *(command_line_i++) = *(p++);
-                }
-
-                if (*enclose_in_quotes_i) {
-#if !defined(HAVE_MKS_SHELL) && !defined(HAVE_CYGWIN_SHELL)
-                        /*
-                         * Add one \ for each \ that precedes the
-                         * closing ".
-                         */
-                        while(backslash_count--) {
-                                *(command_line_i++) = '\\';
-                        };
-#endif
-                        *(command_line_i++) = '\"';
-                }
-
-                /*
-                 * Append an intervening space.
-                 */
-                if (*(++argvi)) {
-                        *(command_line_i++) = ' ';
-                }
-
-                enclose_in_quotes_i++;
-        }
-
-        /*
-         * Append the terminating NULL.
-         */
-        *command_line_i = '\0';
-
-        free(enclose_in_quotes);
-        return command_line;
-}
-
-/*
- * Description: Given an argv and optional envp, launch the process
- *              using the default stdin, stdout, and stderr handles.
- *              Also, register process so that process_wait_for_any_private()
- *              can be used via process_file_io(NULL) or
- *              process_wait_for_any().
- *
- * Returns:
- *
- * Notes/Dependencies:
- */
-HANDLE
-process_easy(
-        char **argv,
-        char **envp,
-        int outfd,
-        int errfd)
-{
-  HANDLE hIn = INVALID_HANDLE_VALUE;
-  HANDLE hOut = INVALID_HANDLE_VALUE;
-  HANDLE hErr = INVALID_HANDLE_VALUE;
-  HANDLE hProcess, tmpIn, tmpOut, tmpErr;
-  DWORD e;
-
-  if (proc_index >= MAXIMUM_WAIT_OBJECTS) {
-        DB (DB_JOBS, ("process_easy: All process slots used up\n"));
-        return INVALID_HANDLE_VALUE;
-  }
-  /* Standard handles returned by GetStdHandle can be NULL or
-     INVALID_HANDLE_VALUE if the parent process closed them.  If that
-     happens, we open the null device and pass its handle to
-     CreateProcess as the corresponding handle to inherit.  */
-  tmpIn = GetStdHandle(STD_INPUT_HANDLE);
-  if (DuplicateHandle(GetCurrentProcess(),
-                      tmpIn,
-                      GetCurrentProcess(),
-                      &hIn,
-                      0,
-                      TRUE,
-                      DUPLICATE_SAME_ACCESS) == FALSE) {
-    if ((e = GetLastError()) == ERROR_INVALID_HANDLE) {
-      tmpIn = CreateFile("NUL", GENERIC_READ,
-                         FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
-                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-      if (tmpIn != INVALID_HANDLE_VALUE
-          && DuplicateHandle(GetCurrentProcess(),
-                             tmpIn,
-                             GetCurrentProcess(),
-                             &hIn,
-                             0,
-                             TRUE,
-                             DUPLICATE_SAME_ACCESS) == FALSE)
-        CloseHandle(tmpIn);
-    }
-    if (hIn == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "process_easy: DuplicateHandle(In) failed (e=%ld)\n", e);
-      return INVALID_HANDLE_VALUE;
-    }
-  }
-  if (outfd >= 0)
-    tmpOut = (HANDLE)_get_osfhandle (outfd);
-  else
-    tmpOut = GetStdHandle (STD_OUTPUT_HANDLE);
-  if (DuplicateHandle(GetCurrentProcess(),
-                      tmpOut,
-                      GetCurrentProcess(),
-                      &hOut,
-                      0,
-                      TRUE,
-                      DUPLICATE_SAME_ACCESS) == FALSE) {
-    if ((e = GetLastError()) == ERROR_INVALID_HANDLE) {
-      tmpOut = CreateFile("NUL", GENERIC_WRITE,
-                          FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
-                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-      if (tmpOut != INVALID_HANDLE_VALUE
-          && DuplicateHandle(GetCurrentProcess(),
-                             tmpOut,
-                             GetCurrentProcess(),
-                             &hOut,
-                             0,
-                             TRUE,
-                             DUPLICATE_SAME_ACCESS) == FALSE)
-        CloseHandle(tmpOut);
-    }
-    if (hOut == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "process_easy: DuplicateHandle(Out) failed (e=%ld)\n", e);
-      return INVALID_HANDLE_VALUE;
-    }
-  }
-  if (errfd >= 0)
-    tmpErr = (HANDLE)_get_osfhandle (errfd);
-  else
-    tmpErr = GetStdHandle(STD_ERROR_HANDLE);
-  if (DuplicateHandle(GetCurrentProcess(),
-                      tmpErr,
-                      GetCurrentProcess(),
-                      &hErr,
-                      0,
-                      TRUE,
-                      DUPLICATE_SAME_ACCESS) == FALSE) {
-    if ((e = GetLastError()) == ERROR_INVALID_HANDLE) {
-      tmpErr = CreateFile("NUL", GENERIC_WRITE,
-                          FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
-                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-      if (tmpErr != INVALID_HANDLE_VALUE
-          && DuplicateHandle(GetCurrentProcess(),
-                             tmpErr,
-                             GetCurrentProcess(),
-                             &hErr,
-                             0,
-                             TRUE,
-                             DUPLICATE_SAME_ACCESS) == FALSE)
-        CloseHandle(tmpErr);
-    }
-    if (hErr == INVALID_HANDLE_VALUE) {
-      fprintf(stderr, "process_easy: DuplicateHandle(Err) failed (e=%ld)\n", e);
-      return INVALID_HANDLE_VALUE;
-    }
-  }
-
-  hProcess = process_init_fd(hIn, hOut, hErr);
-
-  if (process_begin(hProcess, argv, envp, argv[0], NULL)) {
-    fake_exits_pending++;
-    /* process_begin() failed: make a note of that.  */
-    if (!((sub_process*) hProcess)->last_err)
-      ((sub_process*) hProcess)->last_err = -1;
-    ((sub_process*) hProcess)->exit_code = process_last_err(hProcess);
-
-    /* close up unused handles */
-    if (hIn != INVALID_HANDLE_VALUE)
-      CloseHandle(hIn);
-    if (hOut != INVALID_HANDLE_VALUE)
-      CloseHandle(hOut);
-    if (hErr != INVALID_HANDLE_VALUE)
-      CloseHandle(hErr);
-  }
-
-  process_register(hProcess);
-
-  return hProcess;
-}
diff --git a/w32/subproc/w32err.c b/w32/subproc/w32err.c
deleted file mode 100644 (file)
index 14eebed..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Error handling for Windows
-Copyright (C) 1996-2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include <stdlib.h>
-#include <windows.h>
-#include "makeint.h"
-#include "w32err.h"
-
-/*
- * Description: the windows32 version of perror()
- *
- * Returns:  a pointer to a static error
- *
- * Notes/Dependencies:  I got this from
- *      comp.os.ms-windows.programmer.win32
- */
-const char *
-map_windows32_error_to_string (DWORD ercode) {
-/*
- * We used to have an MSVC-specific '__declspec (thread)' qualifier
- * here, with the following comment:
- *
- * __declspec (thread) necessary if you will use multiple threads on MSVC
- *
- * However, Make was never multithreaded on Windows (except when
- * Ctrl-C is hit, in which case the main thread is stopped
- * immediately, so it doesn't matter in this context).  The functions
- * on sub_proc.c that started and stopped additional threads were
- * never used, and are now #ifdef'ed away.  Until we need more than
- * one thread, we have no problems with the following buffer being
- * static.  (If and when we do need it to be in thread-local storage,
- * the corresponding GCC qualifier is '__thread'.)
- */
-    static char szMessageBuffer[128];
-        /* Fill message buffer with a default message in
-         * case FormatMessage fails
-         */
-    wsprintf (szMessageBuffer, "Error %ld\n", ercode);
-
-        /*
-         *  Special code for winsock error handling.
-         */
-        if (ercode > WSABASEERR) {
-#if 0
-                HMODULE hModule = GetModuleHandle("wsock32");
-                if (hModule != NULL) {
-                        FormatMessage(FORMAT_MESSAGE_FROM_HMODULE,
-                                hModule,
-                                ercode,
-                                LANG_NEUTRAL,
-                                szMessageBuffer,
-                                sizeof(szMessageBuffer),
-                                NULL);
-                        FreeLibrary(hModule);
-                }
-#else
-                O (fatal, NILF, szMessageBuffer);
-#endif
-        } else {
-                /*
-                 *  Default system message handling
-                 */
-                FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
-                        NULL,
-                        ercode,
-                        LANG_NEUTRAL,
-                        szMessageBuffer,
-                        sizeof(szMessageBuffer),
-                        NULL);
-        }
-    return szMessageBuffer;
-}
diff --git a/w32/w32os.c b/w32/w32os.c
deleted file mode 100644 (file)
index 533b910..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-/* Windows32-based operating system interface for GNU Make.
-Copyright (C) 2016 Free Software Foundation, Inc.
-This file is part of GNU Make.
-
-GNU Make is free software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the Free Software
-Foundation; either version 3 of the License, or (at your option) any later
-version.
-
-GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with
-this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-#include "makeint.h"
-
-#include <stdio.h>
-#include <string.h>
-
-#include <windows.h>
-#include <process.h>
-#include <io.h>
-#include "pathstuff.h"
-#include "sub_proc.h"
-#include "w32err.h"
-#include "os.h"
-#include "debug.h"
-
-/* This section provides OS-specific functions to support the jobserver.  */
-
-static char jobserver_semaphore_name[MAX_PATH + 1];
-static HANDLE jobserver_semaphore = NULL;
-
-unsigned int
-jobserver_setup (int slots)
-{
-  /* sub_proc.c cannot wait for more than MAXIMUM_WAIT_OBJECTS objects
-   * and one of them is the job-server semaphore object.  Limit the
-   * number of available job slots to (MAXIMUM_WAIT_OBJECTS - 1). */
-
-  if (slots >= MAXIMUM_WAIT_OBJECTS)
-    {
-      slots = MAXIMUM_WAIT_OBJECTS - 1;
-      DB (DB_JOBS, (_("Jobserver slots limited to %d\n"), slots));
-    }
-
-  sprintf (jobserver_semaphore_name, "gmake_semaphore_%d", _getpid ());
-
-  jobserver_semaphore = CreateSemaphore (
-      NULL,                           /* Use default security descriptor */
-      slots,                          /* Initial count */
-      slots,                          /* Maximum count */
-      jobserver_semaphore_name);      /* Semaphore name */
-
-  if (jobserver_semaphore == NULL)
-    {
-      DWORD err = GetLastError ();
-      const char *estr = map_windows32_error_to_string (err);
-      ONS (fatal, NILF,
-           _("creating jobserver semaphore: (Error %ld: %s)"), err, estr);
-    }
-
-  return 1;
-}
-
-unsigned int
-jobserver_parse_auth (const char *auth)
-{
-  jobserver_semaphore = OpenSemaphore (
-      SEMAPHORE_ALL_ACCESS,   /* Semaphore access setting */
-      FALSE,                  /* Child processes DON'T inherit */
-      auth);                  /* Semaphore name */
-
-  if (jobserver_semaphore == NULL)
-    {
-      DWORD err = GetLastError ();
-      const char *estr = map_windows32_error_to_string (err);
-      fatal (NILF, strlen (auth) + INTSTR_LENGTH + strlen (estr),
-             _("internal error: unable to open jobserver semaphore '%s': (Error %ld: %s)"),
-             auth, err, estr);
-    }
-  DB (DB_JOBS, (_("Jobserver client (semaphore %s)\n"), auth));
-
-  return 1;
-}
-
-char *
-jobserver_get_auth ()
-{
-  return xstrdup (jobserver_semaphore_name);
-}
-
-unsigned int
-jobserver_enabled ()
-{
-  return jobserver_semaphore != NULL;
-}
-
-/* Close jobserver semaphore */
-void
-jobserver_clear ()
-{
-  if (jobserver_semaphore != NULL)
-    {
-      CloseHandle (jobserver_semaphore);
-      jobserver_semaphore = NULL;
-    }
-}
-
-void
-jobserver_release (int is_fatal)
-{
-  if (! ReleaseSemaphore (
-          jobserver_semaphore,    /* handle to semaphore */
-          1,                      /* increase count by one */
-          NULL))                  /* not interested in previous count */
-    {
-      if (is_fatal)
-        {
-          DWORD err = GetLastError ();
-          const char *estr = map_windows32_error_to_string (err);
-          ONS (fatal, NILF,
-               _("release jobserver semaphore: (Error %ld: %s)"), err, estr);
-        }
-      perror_with_name ("release_jobserver_semaphore", "");
-    }
-}
-
-unsigned int
-jobserver_acquire_all ()
-{
-  unsigned int tokens = 0;
-  while (1)
-    {
-      DWORD dwEvent = WaitForSingleObject (
-          jobserver_semaphore,    /* Handle to semaphore */
-          0);                     /* DON'T wait on semaphore */
-
-      if (dwEvent != WAIT_OBJECT_0)
-        return tokens;
-
-      ++tokens;
-    }
-}
-
-void
-jobserver_signal ()
-{
-}
-
-void jobserver_pre_child (int recursive)
-{
-}
-
-void jobserver_post_child (int recursive)
-{
-}
-
-void
-jobserver_pre_acquire ()
-{
-}
-
-/* Returns 1 if we got a token, or 0 if a child has completed.
-   The Windows implementation doesn't support load detection.  */
-unsigned int
-jobserver_acquire (int timeout)
-{
-    HANDLE handles[MAXIMUM_WAIT_OBJECTS];
-    DWORD dwHandleCount;
-    DWORD dwEvent;
-
-    /* Add jobserver semaphore to first slot. */
-    handles[0] = jobserver_semaphore;
-
-    /* Build array of handles to wait for.  */
-    dwHandleCount = 1 + process_set_handles (&handles[1]);
-
-    dwEvent = WaitForMultipleObjects (
-        dwHandleCount,  /* number of objects in array */
-        handles,        /* array of objects */
-        FALSE,          /* wait for any object */
-        INFINITE);      /* wait until object is signalled */
-
-    if (dwEvent == WAIT_FAILED)
-      {
-        DWORD err = GetLastError ();
-        const char *estr = map_windows32_error_to_string (err);
-        ONS (fatal, NILF,
-             _("semaphore or child process wait: (Error %ld: %s)"),
-             err, estr);
-      }
-
-    /* WAIT_OBJECT_0 indicates that the semaphore was signalled.  */
-    return dwEvent == WAIT_OBJECT_0;
-}